Skip to content

Commit

Permalink
Merge pull request #63 from dustin/commonalrm
Browse files Browse the repository at this point in the history
Refactor alarm stringing for reuse.
  • Loading branch information
mlyle committed Dec 7, 2015
2 parents 0d597f7 + 608c8d1 commit c3e8728
Show file tree
Hide file tree
Showing 4 changed files with 196 additions and 188 deletions.
151 changes: 151 additions & 0 deletions flight/Libraries/alarms.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,157 @@ static int32_t hasSeverity(SystemAlarmsAlarmOptions severity)
return 0;
}

static const char alarm_names[][9] = {
[SYSTEMALARMS_ALARM_OUTOFMEMORY] = "MEMORY",
[SYSTEMALARMS_ALARM_CPUOVERLOAD] = "CPU",
[SYSTEMALARMS_ALARM_STACKOVERFLOW] = "STACK",
[SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION] = "CONFIG",
[SYSTEMALARMS_ALARM_EVENTSYSTEM] = "EVENT",
[SYSTEMALARMS_ALARM_TELEMETRY] = {0}, // ignored
[SYSTEMALARMS_ALARM_MANUALCONTROL] = "MANUAL",
[SYSTEMALARMS_ALARM_ACTUATOR] = "ACTUATOR",
[SYSTEMALARMS_ALARM_ATTITUDE] = "ATTITUDE",
[SYSTEMALARMS_ALARM_SENSORS] = "SENSORS",
[SYSTEMALARMS_ALARM_STABILIZATION] = "STAB",
[SYSTEMALARMS_ALARM_PATHFOLLOWER] = "PATH-F",
[SYSTEMALARMS_ALARM_PATHPLANNER] = "PATH-P",
[SYSTEMALARMS_ALARM_BATTERY] = "BATTERY",
[SYSTEMALARMS_ALARM_FLIGHTTIME] = "TIME",
[SYSTEMALARMS_ALARM_I2C] = "I2C",
[SYSTEMALARMS_ALARM_GPS] = "GPS",
[SYSTEMALARMS_ALARM_ALTITUDEHOLD] = "A-HOLD",
[SYSTEMALARMS_ALARM_BOOTFAULT] = "BOOT",
[SYSTEMALARMS_ALARM_GEOFENCE] = "GEOFENCE",
[SYSTEMALARMS_ALARM_TEMPBARO] = "TEMPBARO",
[SYSTEMALARMS_ALARM_GYROBIAS] = "GYROBIAS",
[SYSTEMALARMS_ALARM_ADC] = "ADC",
};

// If someone adds a new alarm, we'd like it added to the array above.
DONT_BUILD_IF(NELEMENTS(alarm_names) != SYSTEMALARMS_ALARM_NUMELEM, AlarmArrayMismatch);

static const char config_error_names[][15] = {
[SYSTEMALARMS_CONFIGERROR_STABILIZATION] = "CFG:STAB",
[SYSTEMALARMS_CONFIGERROR_MULTIROTOR] = "CFG:MULTIROTOR",
[SYSTEMALARMS_CONFIGERROR_AUTOTUNE] = "CFG:AUTOTUNE",
[SYSTEMALARMS_CONFIGERROR_ALTITUDEHOLD] = "CFG:AH1",
[SYSTEMALARMS_CONFIGERROR_POSITIONHOLD] = "CFG:POS-HOLD",
[SYSTEMALARMS_CONFIGERROR_PATHPLANNER] = "CFG:PATHPLAN",
[SYSTEMALARMS_CONFIGERROR_DUPLICATEPORTCFG] = "CFG:DUP PORT",
[SYSTEMALARMS_CONFIGERROR_NAVFILTER] = "CFG:NAVFILTER",
[SYSTEMALARMS_CONFIGERROR_UNSAFETOARM] = "CFG:UNSAFE",
[SYSTEMALARMS_CONFIGERROR_UNDEFINED] = "CFG:UNDEF",
[SYSTEMALARMS_CONFIGERROR_NONE] = {0},
};

// DONT_BUILD_IF(NELEMENTS(CONFIG_ERROR_NAMES) != SYSTEMALARMS_CONFIGERROR_NUMELEM, AlarmArrayMismatch);

static const char manual_control_names[][13] = {
[SYSTEMALARMS_MANUALCONTROL_SETTINGS] = "MAN:SETTINGS",
[SYSTEMALARMS_MANUALCONTROL_NORX] = "MAN:NO RX",
[SYSTEMALARMS_MANUALCONTROL_ACCESSORY] = "MAN:ACC",
[SYSTEMALARMS_MANUALCONTROL_ALTITUDEHOLD] = "MAN:A-HOLD",
[SYSTEMALARMS_MANUALCONTROL_PATHFOLLOWER] = "MAN:PATH-F",
[SYSTEMALARMS_MANUALCONTROL_UNDEFINED] = "MAN:UNDEF",
[SYSTEMALARMS_MANUALCONTROL_NONE] = {0},
};

// DONT_BUILD_IF(NELEMENTS(MANUAL_CONTROL_NAMES) != SYSTEMALARMS_MANUALCONTROL_NUMELEM, AlarmArrayMismatch);

static const char boot_reason_names[][16] = {
[SYSTEMALARMS_REBOOTCAUSE_BROWNOUT] = "BOOT:BROWNOUT",
[SYSTEMALARMS_REBOOTCAUSE_PINRESET] = "BOOT:PIN RESET",
[SYSTEMALARMS_REBOOTCAUSE_POWERONRESET] = "BOOT:PWR ON RST",
[SYSTEMALARMS_REBOOTCAUSE_SOFTWARERESET] = "BOOT:SW RESET",
[SYSTEMALARMS_REBOOTCAUSE_INDEPENDENTWATCHDOG] "BOOT:INDY WDOG",
[SYSTEMALARMS_REBOOTCAUSE_WINDOWWATCHDOG] = "BOOT:WIN WDOG",
[SYSTEMALARMS_REBOOTCAUSE_LOWPOWER] = "BOOT:LOW POWER",
[SYSTEMALARMS_REBOOTCAUSE_UNDEFINED] = "BOOT:UNDEFINED",
};

#define LONGEST_MESSAGE 17

DONT_BUILD_IF((LONGEST_MESSAGE <= sizeof(*config_error_names)
|| LONGEST_MESSAGE <= sizeof(*manual_control_names)
|| LONGEST_MESSAGE <= sizeof(*boot_reason_names)),
InsufficientBufferage);

const char *AlarmBootReason(uint8_t reason) {
if (reason >= NELEMENTS(boot_reason_names)) {
return (const char*)&boot_reason_names[SYSTEMALARMS_REBOOTCAUSE_UNDEFINED];
}
return (const char*)&boot_reason_names[reason];
}

int32_t AlarmString(SystemAlarmsData *alarm, char *buf, size_t buflen, bool blink, uint8_t *state) {
*state = SYSTEMALARMS_ALARM_OK;
buf[0] = '\0';
int pos = 0;

// TODO(dustin): sort the alarms by severity. Alarm messages
// will get truncated. We want the most urgent stuff to show
// up first, having warnings show up only if there's space.
for (int i = 0; i < SYSTEMALARMS_ALARM_NUMELEM; i++) {
if (((alarm->Alarm[i] == SYSTEMALARMS_ALARM_WARNING) ||
(alarm->Alarm[i] == SYSTEMALARMS_ALARM_ERROR) ||
(alarm->Alarm[i] == SYSTEMALARMS_ALARM_CRITICAL))) {

if (!alarm_names[i][0]) {
// zero-length alarm names indicate the alarm is
// explicitly ignored
continue;
}

// Returned state is the worst state.
if (alarm->Alarm[i] > *state) {
*state = alarm->Alarm[i];
}

char current_msg[LONGEST_MESSAGE+1] = {0};
switch (i) {
case SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION:
strncpy(current_msg,
(const char*)config_error_names[alarm->ConfigError],
sizeof(*config_error_names));
current_msg[sizeof(*config_error_names)] = '\0';
break;
case SYSTEMALARMS_ALARM_MANUALCONTROL:
strncpy(current_msg,
(const char*)manual_control_names[alarm->ManualControl],
sizeof(*manual_control_names));
current_msg[sizeof(*manual_control_names)] = '\0';
break;
default:
strncpy(current_msg, (const char*)alarm_names[i], sizeof(*alarm_names));
current_msg[sizeof(*alarm_names)] = '\0';
}

int this_len = strlen(current_msg);

if (pos + this_len + 2 >= buflen) {
break;
}

if ((alarm->Alarm[i] != SYSTEMALARMS_ALARM_WARNING) && !blink) {
this_len += 1;
while (this_len > 0) {
buf[pos++] = ' ';
this_len--;
}
continue;
}

memcpy(&buf[pos], current_msg, this_len);
pos += this_len;
buf[pos++] = ' ';

}
}

buf[pos] = '\0';
return pos;
}

/**
* @}
*/
Expand Down
13 changes: 13 additions & 0 deletions flight/Libraries/inc/alarms.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,19 @@ void AlarmsClearAll();
int32_t AlarmsHasWarnings();
int32_t AlarmsHasErrors();
int32_t AlarmsHasCritical();
/** Produce a string indicating what alarms are currently firing.
* @param[alarm] the current alarm state (from SystemAlarmsGet).
* @param[buf] where the alarm string should be written.
* @param[buflen] how many bytes may be safely written into buf.
* @param[blink] if true, alarms are replaced with spaces.
* @param[state] output variable indicating the most severe alarm found.
* The output variable 'state' is a value from the SystemAlarms alarm enum
* (e.g., SYSTEMALARMS_ALARM_WARNING).
* @returns The number of bytes written to the buffer.
*/
int32_t AlarmString(SystemAlarmsData *alarm, char *buf, size_t buflen,
bool blink, uint8_t *state);
const char *AlarmBootReason(uint8_t reason);

#endif // ALARMS_H

Expand Down
86 changes: 17 additions & 69 deletions flight/Modules/OnScreenDisplay/onscreendisplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ static void onScreenDisplayTask(void *parameters);
#define TASK_PRIORITY PIOS_THREAD_PRIO_LOW
#define UPDATE_PERIOD 100
#define BLINK_INTERVAL_FRAMES 12
#define BOOT_DISPLAY_TIME_MS (10*1000)

const char METRIC_DIST_UNIT_LONG[] = "km";
const char METRIC_DIST_UNIT_SHORT[] = "m";
Expand Down Expand Up @@ -700,83 +701,30 @@ void draw_flight_mode(int x, int y, int xs, int ys, int va, int ha, int flags, i
}
}

const uint8_t ALL_ALRARMS[] = {SYSTEMALARMS_ALARM_OUTOFMEMORY,
SYSTEMALARMS_ALARM_CPUOVERLOAD,
SYSTEMALARMS_ALARM_STACKOVERFLOW,
SYSTEMALARMS_ALARM_SYSTEMCONFIGURATION,
SYSTEMALARMS_ALARM_EVENTSYSTEM,
// SYSTEMALARMS_ALARM_TELEMETRY,
SYSTEMALARMS_ALARM_MANUALCONTROL,
SYSTEMALARMS_ALARM_ACTUATOR,
SYSTEMALARMS_ALARM_ATTITUDE,
SYSTEMALARMS_ALARM_SENSORS,
SYSTEMALARMS_ALARM_STABILIZATION,
SYSTEMALARMS_ALARM_PATHFOLLOWER,
SYSTEMALARMS_ALARM_PATHPLANNER,
SYSTEMALARMS_ALARM_BATTERY,
SYSTEMALARMS_ALARM_FLIGHTTIME,
SYSTEMALARMS_ALARM_I2C,
SYSTEMALARMS_ALARM_GPS,
SYSTEMALARMS_ALARM_ALTITUDEHOLD,
SYSTEMALARMS_ALARM_BOOTFAULT};

const char * ALL_ALRARM_NAMES[] = {"MEMORY",
"CPU",
"STACK",
"CONFIG",
"EVENT",
// "TELEMETRY",
"MANUAL",
"ACTUATOR",
"ATTITUDE",
"SENSORS",
"STAB",
"PATH-F",
"PATH-P",
"BATTERY",
"TIME",
"I2C",
"GPS",
"A-HOLD",
"BOOT"};

void draw_alarms(int x, int y, int xs, int ys, int va, int ha, int flags, int font)
{
uint8_t str_pos = 0;
uint8_t this_len;
char temp[100] = { 0 };
char buf[100] = { 0 };
SystemAlarmsData alarm;
int pos = 0;

SystemAlarmsGet(&alarm);

for (uint8_t pos = 0; pos < sizeof(ALL_ALRARMS); pos++)
{
if ((alarm.Alarm[ALL_ALRARMS[pos]] == SYSTEMALARMS_ALARM_WARNING) ||
(alarm.Alarm[ALL_ALRARMS[pos]] == SYSTEMALARMS_ALARM_ERROR) ||
(alarm.Alarm[ALL_ALRARMS[pos]] == SYSTEMALARMS_ALARM_CRITICAL)){
this_len = strlen(ALL_ALRARM_NAMES[pos]);
if (str_pos + this_len + 2 >= sizeof(temp))
break;
// Boot alarm for a bit.
if (PIOS_Thread_Systime() < BOOT_DISPLAY_TIME_MS) {
const char *boot_reason = AlarmBootReason(alarm.RebootCause);
strncpy((char*)buf, boot_reason, sizeof(buf));
buf[strlen(boot_reason)] = '\0';
pos = strlen(boot_reason);
buf[pos++] = ' ';
return;
}

if ((alarm.Alarm[ALL_ALRARMS[pos]] != SYSTEMALARMS_ALARM_WARNING) && !blink){
// for alarms, we blink
this_len += 1;
while (this_len > 0){
temp[str_pos++] = ' ';
this_len--;
}
continue;
}
uint8_t state;
int32_t len = AlarmString(&alarm, &buf[pos], sizeof(buf) - pos, blink, &state);

memcpy((void*)&temp[str_pos], (void*)ALL_ALRARM_NAMES[pos], this_len);
str_pos += this_len;
temp[str_pos] = ' ';
str_pos += 1;
}
}
if (str_pos > 0){
temp[str_pos] = '\0';
write_string(temp, x, y, xs, ys, va, ha, flags, font);
if (len > 0) {
buf[pos] = '\0';
write_string(buf, x, y, xs, ys, va, ha, flags, font);
}
}

Expand Down
Loading

0 comments on commit c3e8728

Please sign in to comment.