From dbb814ff2465a1df93fb1c6eb7a96208a0be471c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Mon, 8 Aug 2022 09:51:08 +0200 Subject: [PATCH] HealthAndArmingChecks: CONSOLE_PRINT_ARMING_CHECK_EVENT & reduce flash usage - print list of events whenever they change if CONSOLE_PRINT_ARMING_CHECK_EVENT is set, instead of on each update call - reduce flash usage by moving out templated code into non-template method --- .../HealthAndArmingChecks/Common.cpp | 27 +++++++++++++++++-- .../HealthAndArmingChecks/Common.hpp | 27 +++++++++---------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/modules/commander/HealthAndArmingChecks/Common.cpp b/src/modules/commander/HealthAndArmingChecks/Common.cpp index 5a0aaceec5..d236020620 100644 --- a/src/modules/commander/HealthAndArmingChecks/Common.cpp +++ b/src/modules/commander/HealthAndArmingChecks/Common.cpp @@ -73,6 +73,20 @@ void Report::armingCheckFailure(NavModes required_modes, HealthComponentIndex co addEvent(event_id, log_levels, message, (uint32_t)reportedModes(required_modes), component.index); } +Report::EventBufferHeader *Report::addEventToBuffer(uint32_t event_id, const events::LogLevels &log_levels, + unsigned args_size) +{ + unsigned total_size = sizeof(EventBufferHeader) + args_size; + EventBufferHeader *header = (EventBufferHeader *)(_event_buffer + _next_buffer_idx); + memcpy(&header->id, &event_id, sizeof(event_id)); // header might be unaligned + header->log_levels = ((uint8_t)log_levels.internal << 4) | (uint8_t)log_levels.external; + header->size = args_size; + _next_buffer_idx += total_size; + ++_results[_current_result].num_events; + _results[_current_result].event_id_hash ^= event_id; // very simple hash + return header; +} + NavModes Report::reportedModes(NavModes required_modes) { // Make sure optional checks are still shown in the UI @@ -216,8 +230,12 @@ bool Report::report(bool is_armed, bool force) _last_report = now; _already_reported = true; _had_unreported_difference = false; - PX4_DEBUG("Sending Arming/Health report (num events: %i, can_arm: 0x%x)", _results[_current_result].num_events + 2, - (int)current_results.arming_checks.can_arm); + +#ifdef CONSOLE_PRINT_ARMING_CHECK_EVENT + PX4_INFO_RAW("Sending Arming/Health Report (num events: %i, can_arm: 0x%x, can_run: 0x%x)\n", + _results[_current_result].num_events + 2, + (int)current_results.arming_checks.can_arm, (int)current_results.arming_checks.can_run); +#endif // send arming summary navigation_mode_group_t can_arm_and_run; @@ -254,6 +272,11 @@ bool Report::report(bool is_armed, bool force) memset(event.arguments + header->size, 0, sizeof(event.arguments) - header->size); events::send(event); offset += sizeof(EventBufferHeader) + header->size; +#ifdef CONSOLE_PRINT_ARMING_CHECK_EVENT + const char *message; + memcpy(&message, &header->message, sizeof(header->message)); + PX4_INFO_RAW(" Event 0x%08" PRIx32 ": %s\n", event.id, message); +#endif } // send health summary diff --git a/src/modules/commander/HealthAndArmingChecks/Common.hpp b/src/modules/commander/HealthAndArmingChecks/Common.hpp index ccaef35bef..4207222ffb 100644 --- a/src/modules/commander/HealthAndArmingChecks/Common.hpp +++ b/src/modules/commander/HealthAndArmingChecks/Common.hpp @@ -44,12 +44,7 @@ #include #include -#if 0 // for debugging, prints event messages to console each time arming & health checks run (not necessarily change) -#include -#define CONSOLE_PRINT_ARMING_CHECK_EVENT(log_level, id, str) PX4_INFO_RAW("Health/Arming Event 0x%08x: %s\n", id, str) -#else -#define CONSOLE_PRINT_ARMING_CHECK_EVENT(log_level, id, str) -#endif +//#define CONSOLE_PRINT_ARMING_CHECK_EVENT // for debugging, print updated events whenever they change #ifndef FRIEND_TEST // for gtest #define FRIEND_TEST(a, b) @@ -285,6 +280,9 @@ private: uint8_t size; ///< arguments size uint32_t id; uint8_t log_levels; +#ifdef CONSOLE_PRINT_ARMING_CHECK_EVENT + const char *message; +#endif }; void healthFailure(NavModes required_modes, HealthComponentIndex component, events::Log log_level); @@ -292,6 +290,7 @@ private: template bool addEvent(uint32_t event_id, const events::LogLevels &log_levels, const char *message, Args... args); + Report::EventBufferHeader *addEventToBuffer(uint32_t event_id, const events::LogLevels &log_levels, unsigned args_size); NavModes reportedModes(NavModes required_modes); @@ -360,8 +359,6 @@ void Report::armingCheckFailure(NavModes required_modes, HealthComponentIndex co template bool Report::addEvent(uint32_t event_id, const events::LogLevels &log_levels, const char *message, Args... args) { - CONSOLE_PRINT_ARMING_CHECK_EVENT(log_level, event_id, message); - constexpr unsigned args_size = events::util::sizeofArguments(args...); static_assert(args_size <= sizeof(events::EventType::arguments), "Too many arguments"); unsigned total_size = sizeof(EventBufferHeader) + args_size; @@ -371,14 +368,14 @@ bool Report::addEvent(uint32_t event_id, const events::LogLevels &log_levels, co return false; } - EventBufferHeader *header = (EventBufferHeader *)(_event_buffer + _next_buffer_idx); - memcpy(&header->id, &event_id, sizeof(event_id)); // header might be unaligned - header->log_levels = ((uint8_t)log_levels.internal << 4) | (uint8_t)log_levels.external; - header->size = args_size; events::util::fillEventArguments(_event_buffer + _next_buffer_idx + sizeof(EventBufferHeader), args...); - _next_buffer_idx += total_size; - ++_results[_current_result].num_events; - _results[_current_result].event_id_hash ^= event_id; // very simple hash + // We split out the part of the code not requiring templating to reduce flash usage a bit + EventBufferHeader *header = addEventToBuffer(event_id, log_levels, args_size); +#ifdef CONSOLE_PRINT_ARMING_CHECK_EVENT + memcpy(&header->message, &message, sizeof(message)); +#else + (void)header; +#endif return true; }