From 91a9c19e1f14ff3df8a1fba280bddee56c76ed72 Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Thu, 21 Apr 2016 13:22:03 +0200 Subject: [PATCH 1/7] LP-293 Implemented AlarmString() function to return human readable SystemAlarms data --- flight/libraries/alarms.c | 104 ++++++++++++++++++++++++++++++++++ flight/libraries/inc/alarms.h | 2 + 2 files changed, 106 insertions(+) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index db555ad8e..c4d8963be 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -37,6 +37,8 @@ #define PIOS_ALARM_GRACETIME 1000 #endif // PIOS_ALARM_GRACETIME +#define NELEM(x) ((sizeof(x) / sizeof((x)[0]))) + // Private types // Private variables @@ -281,6 +283,108 @@ SystemAlarmsAlarmOptions AlarmsGetHighestSeverity() return highest; } + +static const char *const systemalarms_severity_names[] = { + [SYSTEMALARMS_ALARM_UNINITIALISED] = "UNINITIALISED", + [SYSTEMALARMS_ALARM_OK] = "OK", + [SYSTEMALARMS_ALARM_WARNING] = "WARNING", + [SYSTEMALARMS_ALARM_CRITICAL] = "CRITICAL", + [SYSTEMALARMS_ALARM_ERROR] = "ERROR" +}; + +static const char *const systemalarms_alarm_names[] = { + [SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION] = "CONFIG", + [SYSTEMALARMS_ALARM_BOOTFAULT] = "BOOT", + [SYSTEMALARMS_ALARM_OUTOFMEMORY] = "MEMORY", + [SYSTEMALARMS_ALARM_STACKOVERFLOW] = "STACK", + [SYSTEMALARMS_ALARM_CPUOVERLOAD] = "CPU", + [SYSTEMALARMS_ALARM_EVENTSYSTEM] = "EVENTSYSTEM", + [SYSTEMALARMS_ALARM_TELEMETRY] = "TELEMETRY", + [SYSTEMALARMS_ALARM_RECEIVER] = "RECEIVER", + [SYSTEMALARMS_ALARM_MANUALCONTROL] = "MANUAL", + [SYSTEMALARMS_ALARM_ACTUATOR] = "ACTUATOR", + [SYSTEMALARMS_ALARM_ATTITUDE] = "ATTITUDE", + [SYSTEMALARMS_ALARM_SENSORS] = "SENSORS", + [SYSTEMALARMS_ALARM_MAGNETOMETER] = "MAG", + [SYSTEMALARMS_ALARM_AIRSPEED] = "AIRSPEED", + [SYSTEMALARMS_ALARM_STABILIZATION] = "STAB", + [SYSTEMALARMS_ALARM_GUIDANCE] = "GUIDANCE", + [SYSTEMALARMS_ALARM_PATHPLAN] = "PLAN", + [SYSTEMALARMS_ALARM_BATTERY] = "BATTERY", + [SYSTEMALARMS_ALARM_FLIGHTTIME] = "TIME", + [SYSTEMALARMS_ALARM_I2C] = "I2C", + [SYSTEMALARMS_ALARM_GPS] = "GPS", +}; + +static const char *const systemalarms_extendedalarmstatus_names[] = { + [SYSTEMALARMS_EXTENDEDALARMSTATUS_REBOOTREQUIRED] = "CFG:REBOOT", + [SYSTEMALARMS_EXTENDEDALARMSTATUS_FLIGHTMODE] = "CFG:FLIGHTMODE", + [SYSTEMALARMS_EXTENDEDALARMSTATUS_UNSUPPORTEDCONFIG_ONESHOT] = "CFG:ONESHOT", + [SYSTEMALARMS_EXTENDEDALARMSTATUS_BADTHROTTLEORCOLLECTIVEINPUTRANGE] = "CFG:THR-COL", +}; + +static const SystemAlarmsAlarmOptions severity_order[] = { + SYSTEMALARMS_ALARM_CRITICAL, SYSTEMALARMS_ALARM_WARNING, SYSTEMALARMS_ALARM_ERROR +}; + +size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size) +{ + size_t bytes_written = 0; + + PIOS_STATIC_ASSERT(NELEM(systemalarms_alarm_names) == SYSTEMALARMS_ALARM_NUMELEM); + + for (unsigned order = 0; order < NELEM(severity_order); ++order) { + // should we prepend severity level here? No, not for now. + + for (unsigned i = 0; i < SYSTEMALARMS_ALARM_NUMELEM; ++i) { + if ((SystemAlarmsAlarmToArray(alarm->Alarm)[i] == severity_order[order]) + && (systemalarms_alarm_names[i])) { + // in which case should we dig into extended alarm status? + // looks like SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION sets most of the extended alarms + // except SYSTEMALARMS_ALARM_BOOTFAULT which also sets SYSTEMALARMS_EXTENDEDALARMSTATUS_REBOOTREQUIRED + + const char *current_msg = systemalarms_alarm_names[i]; + + switch (i) { + case SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION: + if (alarm->ExtendedAlarmStatus.SystemConfiguration < NELEM(systemalarms_extendedalarmstatus_names)) { + current_msg = systemalarms_extendedalarmstatus_names[alarm->ExtendedAlarmStatus.SystemConfiguration]; + } + break; + + case SYSTEMALARMS_ALARM_BOOTFAULT: + if (alarm->ExtendedAlarmStatus.BootFault < NELEM(systemalarms_extendedalarmstatus_names)) { + current_msg = systemalarms_extendedalarmstatus_names[alarm->ExtendedAlarmStatus.BootFault]; + } + break; + + default:; + } + + int current_len = strlen(current_msg); + + if ((bytes_written + current_len + 2) >= buffer_size) { + break; + } + + memcpy(buffer + bytes_written, current_msg, current_len); + + bytes_written += current_len; + + buffer[bytes_written++] = ' '; + } + } + } + + if (bytes_written > 0) { + --bytes_written; // get rid of that trailing space. + } + + buffer[bytes_written] = 0; + + return bytes_written; +} + /** * @} * @} diff --git a/flight/libraries/inc/alarms.h b/flight/libraries/inc/alarms.h index 304916dbc..4492216b0 100644 --- a/flight/libraries/inc/alarms.h +++ b/flight/libraries/inc/alarms.h @@ -48,6 +48,8 @@ int32_t AlarmsHasErrors(); int32_t AlarmsHasCritical(); SystemAlarmsAlarmOptions AlarmsGetHighestSeverity(); +size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size); + #endif // ALARMS_H /** From e513db4b4da9741d129712afdd28279508621408 Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Thu, 21 Apr 2016 13:42:06 +0200 Subject: [PATCH 2/7] LP-293 Added state parameter to receive highest severity level. --- flight/libraries/alarms.c | 7 ++++++- flight/libraries/inc/alarms.h | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index c4d8963be..4aa9b1536 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -327,7 +327,7 @@ static const SystemAlarmsAlarmOptions severity_order[] = { SYSTEMALARMS_ALARM_CRITICAL, SYSTEMALARMS_ALARM_WARNING, SYSTEMALARMS_ALARM_ERROR }; -size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size) +size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions *state) { size_t bytes_written = 0; @@ -339,6 +339,11 @@ size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size) for (unsigned i = 0; i < SYSTEMALARMS_ALARM_NUMELEM; ++i) { if ((SystemAlarmsAlarmToArray(alarm->Alarm)[i] == severity_order[order]) && (systemalarms_alarm_names[i])) { + if (state) { // they are already sorted by severity as we are processing in specific order + *state = severity_order[order]; + state = 0; + } + // in which case should we dig into extended alarm status? // looks like SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION sets most of the extended alarms // except SYSTEMALARMS_ALARM_BOOTFAULT which also sets SYSTEMALARMS_EXTENDEDALARMSTATUS_REBOOTREQUIRED diff --git a/flight/libraries/inc/alarms.h b/flight/libraries/inc/alarms.h index 4492216b0..408861930 100644 --- a/flight/libraries/inc/alarms.h +++ b/flight/libraries/inc/alarms.h @@ -48,7 +48,7 @@ int32_t AlarmsHasErrors(); int32_t AlarmsHasCritical(); SystemAlarmsAlarmOptions AlarmsGetHighestSeverity(); -size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size); +size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions *state); #endif // ALARMS_H From 8f937e0508d7e57195f602849402c8c58fa33ade Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Thu, 21 Apr 2016 14:17:10 +0200 Subject: [PATCH 3/7] LP-293 Changed alarm strings to match GCS display --- flight/libraries/alarms.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index 4aa9b1536..b11a133f2 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -295,22 +295,22 @@ static const char *const systemalarms_severity_names[] = { static const char *const systemalarms_alarm_names[] = { [SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION] = "CONFIG", [SYSTEMALARMS_ALARM_BOOTFAULT] = "BOOT", - [SYSTEMALARMS_ALARM_OUTOFMEMORY] = "MEMORY", + [SYSTEMALARMS_ALARM_OUTOFMEMORY] = "MEM", [SYSTEMALARMS_ALARM_STACKOVERFLOW] = "STACK", [SYSTEMALARMS_ALARM_CPUOVERLOAD] = "CPU", - [SYSTEMALARMS_ALARM_EVENTSYSTEM] = "EVENTSYSTEM", + [SYSTEMALARMS_ALARM_EVENTSYSTEM] = "EVENT", [SYSTEMALARMS_ALARM_TELEMETRY] = "TELEMETRY", - [SYSTEMALARMS_ALARM_RECEIVER] = "RECEIVER", + [SYSTEMALARMS_ALARM_RECEIVER] = "INPUT", [SYSTEMALARMS_ALARM_MANUALCONTROL] = "MANUAL", [SYSTEMALARMS_ALARM_ACTUATOR] = "ACTUATOR", - [SYSTEMALARMS_ALARM_ATTITUDE] = "ATTITUDE", - [SYSTEMALARMS_ALARM_SENSORS] = "SENSORS", + [SYSTEMALARMS_ALARM_ATTITUDE] = "ATTI", + [SYSTEMALARMS_ALARM_SENSORS] = "SENSOR", [SYSTEMALARMS_ALARM_MAGNETOMETER] = "MAG", - [SYSTEMALARMS_ALARM_AIRSPEED] = "AIRSPEED", + [SYSTEMALARMS_ALARM_AIRSPEED] = "AIRSPD", [SYSTEMALARMS_ALARM_STABILIZATION] = "STAB", [SYSTEMALARMS_ALARM_GUIDANCE] = "GUIDANCE", [SYSTEMALARMS_ALARM_PATHPLAN] = "PLAN", - [SYSTEMALARMS_ALARM_BATTERY] = "BATTERY", + [SYSTEMALARMS_ALARM_BATTERY] = "BATT", [SYSTEMALARMS_ALARM_FLIGHTTIME] = "TIME", [SYSTEMALARMS_ALARM_I2C] = "I2C", [SYSTEMALARMS_ALARM_GPS] = "GPS", @@ -376,13 +376,13 @@ size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, Sy bytes_written += current_len; - buffer[bytes_written++] = ' '; + buffer[bytes_written++] = ','; } } } if (bytes_written > 0) { - --bytes_written; // get rid of that trailing space. + --bytes_written; // get rid of that trailing separator. } buffer[bytes_written] = 0; From 72582d1100c45aa1e784bf769902c5dd6f1685db Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Thu, 21 Apr 2016 23:59:23 +0200 Subject: [PATCH 4/7] LP-293 Added severity level parameter to AlarmString(). Reverted alarm sort order to natural severity levels (highest to lowest): ERROR, CRITICAL, WARNING, OK --- flight/libraries/alarms.c | 16 ++++++---------- flight/libraries/inc/alarms.h | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index b11a133f2..8ba2820a7 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -323,25 +323,21 @@ static const char *const systemalarms_extendedalarmstatus_names[] = { [SYSTEMALARMS_EXTENDEDALARMSTATUS_BADTHROTTLEORCOLLECTIVEINPUTRANGE] = "CFG:THR-COL", }; -static const SystemAlarmsAlarmOptions severity_order[] = { - SYSTEMALARMS_ALARM_CRITICAL, SYSTEMALARMS_ALARM_WARNING, SYSTEMALARMS_ALARM_ERROR -}; - -size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions *state) +size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions level, SystemAlarmsAlarmOptions *highestSeverity) { size_t bytes_written = 0; PIOS_STATIC_ASSERT(NELEM(systemalarms_alarm_names) == SYSTEMALARMS_ALARM_NUMELEM); - for (unsigned order = 0; order < NELEM(severity_order); ++order) { + for (unsigned severity = SYSTEMALARMS_ALARM_ERROR; severity >= level; --severity) { // should we prepend severity level here? No, not for now. for (unsigned i = 0; i < SYSTEMALARMS_ALARM_NUMELEM; ++i) { - if ((SystemAlarmsAlarmToArray(alarm->Alarm)[i] == severity_order[order]) + if ((SystemAlarmsAlarmToArray(alarm->Alarm)[i] == severity) && (systemalarms_alarm_names[i])) { - if (state) { // they are already sorted by severity as we are processing in specific order - *state = severity_order[order]; - state = 0; + if (highestSeverity) { // they are already sorted by severity as we are processing in specific order + *highestSeverity = severity; + highestSeverity = 0; } // in which case should we dig into extended alarm status? diff --git a/flight/libraries/inc/alarms.h b/flight/libraries/inc/alarms.h index 408861930..4afbc6146 100644 --- a/flight/libraries/inc/alarms.h +++ b/flight/libraries/inc/alarms.h @@ -48,7 +48,7 @@ int32_t AlarmsHasErrors(); int32_t AlarmsHasCritical(); SystemAlarmsAlarmOptions AlarmsGetHighestSeverity(); -size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions *state); +size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions level, SystemAlarmsAlarmOptions *highestSeverity); #endif // ALARMS_H From 96ce3db02d8f33fbc04a27e3e0ac7c5605e97e00 Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Fri, 22 Apr 2016 02:04:21 +0200 Subject: [PATCH 5/7] LP-293 Added LibrePilot to @author tag --- flight/libraries/alarms.c | 3 ++- flight/libraries/inc/alarms.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index 8ba2820a7..bd049a7a2 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -6,7 +6,8 @@ * @brief OpenPilot System libraries are available to all OP modules. * @{ * @file alarms.c - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2016. + * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @brief Library for setting and clearing system alarms * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/libraries/inc/alarms.h b/flight/libraries/inc/alarms.h index 4afbc6146..afcbfac24 100644 --- a/flight/libraries/inc/alarms.h +++ b/flight/libraries/inc/alarms.h @@ -5,7 +5,8 @@ * @addtogroup OpenPilotLibraries OpenPilot System Libraries * @{ * @file alarms.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2016. + * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @brief Include file of the alarm library * @see The GNU Public License (GPL) Version 3 * From 85fa65a514c7a8528345074f186812d9b943c0dc Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Fri, 22 Apr 2016 22:47:25 +0200 Subject: [PATCH 6/7] LP-293 Fixed remaining buffer space calculation. Changed name of position variable to less misleading. --- flight/libraries/alarms.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index bd049a7a2..772af3da0 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -326,7 +326,7 @@ static const char *const systemalarms_extendedalarmstatus_names[] = { size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, SystemAlarmsAlarmOptions level, SystemAlarmsAlarmOptions *highestSeverity) { - size_t bytes_written = 0; + size_t pos = 0; PIOS_STATIC_ASSERT(NELEM(systemalarms_alarm_names) == SYSTEMALARMS_ALARM_NUMELEM); @@ -359,32 +359,30 @@ size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, Sy current_msg = systemalarms_extendedalarmstatus_names[alarm->ExtendedAlarmStatus.BootFault]; } break; - - default:; } int current_len = strlen(current_msg); - - if ((bytes_written + current_len + 2) >= buffer_size) { + + if ((pos + current_len + 1) > buffer_size) { break; } - memcpy(buffer + bytes_written, current_msg, current_len); + memcpy(buffer + pos, current_msg, current_len); - bytes_written += current_len; + pos += current_len; - buffer[bytes_written++] = ','; + buffer[pos++] = ','; } } } - if (bytes_written > 0) { - --bytes_written; // get rid of that trailing separator. + if (pos > 0) { + --pos; // get rid of that trailing separator. } - buffer[bytes_written] = 0; + buffer[pos] = 0; - return bytes_written; + return pos; // return length of the string in buffer. Actual bytes written is +1 } /** From 1f0bf155ce8c2b3e1f7983d4ae85a5e5cd5687ce Mon Sep 17 00:00:00 2001 From: Vladimir Zidar Date: Sun, 24 Apr 2016 02:03:50 +0200 Subject: [PATCH 7/7] LP-293 make use of NELEMENTS() macro instead of defining own version NELEM() --- flight/libraries/alarms.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/flight/libraries/alarms.c b/flight/libraries/alarms.c index 772af3da0..506efc865 100644 --- a/flight/libraries/alarms.c +++ b/flight/libraries/alarms.c @@ -38,8 +38,6 @@ #define PIOS_ALARM_GRACETIME 1000 #endif // PIOS_ALARM_GRACETIME -#define NELEM(x) ((sizeof(x) / sizeof((x)[0]))) - // Private types // Private variables @@ -328,7 +326,7 @@ size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, Sy { size_t pos = 0; - PIOS_STATIC_ASSERT(NELEM(systemalarms_alarm_names) == SYSTEMALARMS_ALARM_NUMELEM); + PIOS_STATIC_ASSERT(NELEMENTS(systemalarms_alarm_names) == SYSTEMALARMS_ALARM_NUMELEM); for (unsigned severity = SYSTEMALARMS_ALARM_ERROR; severity >= level; --severity) { // should we prepend severity level here? No, not for now. @@ -349,13 +347,13 @@ size_t AlarmString(SystemAlarmsData *alarm, char *buffer, size_t buffer_size, Sy switch (i) { case SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION: - if (alarm->ExtendedAlarmStatus.SystemConfiguration < NELEM(systemalarms_extendedalarmstatus_names)) { + if (alarm->ExtendedAlarmStatus.SystemConfiguration < NELEMENTS(systemalarms_extendedalarmstatus_names)) { current_msg = systemalarms_extendedalarmstatus_names[alarm->ExtendedAlarmStatus.SystemConfiguration]; } break; case SYSTEMALARMS_ALARM_BOOTFAULT: - if (alarm->ExtendedAlarmStatus.BootFault < NELEM(systemalarms_extendedalarmstatus_names)) { + if (alarm->ExtendedAlarmStatus.BootFault < NELEMENTS(systemalarms_extendedalarmstatus_names)) { current_msg = systemalarms_extendedalarmstatus_names[alarm->ExtendedAlarmStatus.BootFault]; } break;