Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -re5fc9a1e8898da7bc6d26f1e333ee44f6544d214 -r32c1597a64fa261086ac3dec156c3d859ce30287 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision e5fc9a1e8898da7bc6d26f1e333ee44f6544d214) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 32c1597a64fa261086ac3dec156c3d859ce30287) @@ -7,8 +7,8 @@ * * @file AlarmMgmt.c * -* @author (last) Sean Nash -* @date (last) 13-Mar-2023 +* @author (last) Michael Garthwaite +* @date (last) 07-Apr-2023 * * @author (original) Sean Nash * @date (original) 07-Nov-2019 @@ -73,7 +73,7 @@ { ALARM_ID_T alarmID; ///< ID of highest priority alarm in this priority category U32 subRank; ///< Sub-rank of this alarm - U32 timeSinceTriggeredMS; ///< Time (in ms) since this alarm was triggered + S32 timeSinceTriggeredMS; ///< Time (in ms) since this alarm was triggered } ALARM_PRIORITY_RANKS_T; /// Enumeration of alarm audio self-test states. @@ -257,6 +257,11 @@ { alarmStatus.alarmTop = alarm; } + // If alarm stops, set that status immediately (don't wait for status update function) + if ( TRUE == ALARM_TABLE[ alarm ].alarmStops ) + { + alarmStatus.stop = TRUE; + } // If alarms silenced, end silence due to new alarm alarmStatus.alarmsSilenced = FALSE; // If alarm is a fault (and not in service mode), request transition to fault mode @@ -866,19 +871,19 @@ // If sub-rank is a tie, see which alarm was triggered first if ( subRank == alarmPriorityFIFO[ almPriority ].subRank ) { - if ( msSinceTriggered > alarmPriorityFIFO[ almPriority ].timeSinceTriggeredMS ) + if ( (S32)msSinceTriggered > alarmPriorityFIFO[ almPriority ].timeSinceTriggeredMS ) { alarmPriorityFIFO[ almPriority ].alarmID = a; alarmPriorityFIFO[ almPriority ].subRank = subRank; - alarmPriorityFIFO[ almPriority ].timeSinceTriggeredMS = msSinceTriggered; + alarmPriorityFIFO[ almPriority ].timeSinceTriggeredMS = (S32)msSinceTriggered; } } // Otherwise, this alarm simply outranks current candidate and wins outright else { alarmPriorityFIFO[ almPriority ].alarmID = a; alarmPriorityFIFO[ almPriority ].subRank = subRank; - alarmPriorityFIFO[ almPriority ].timeSinceTriggeredMS = msSinceTriggered; + alarmPriorityFIFO[ almPriority ].timeSinceTriggeredMS = (S32)msSinceTriggered; } } // Track highest priority alarm found so far of all priority categories @@ -1236,9 +1241,11 @@ *************************************************************************/ static void clearAllRecoverableAlarms( void ) { - ALARM_ID_T a = alarmStatus.alarmTop; + ALARM_ID_T a; - for ( a = ALARM_ID_HD_SOFTWARE_FAULT; a < NUM_OF_ALARM_IDS; a++ ) + // assigning to 1 in order to prevent ALARM_ID_NO_ALARM being cleared + // which will cause a fault + for ( a = ( ( ALARM_ID_T ) 1 ) ; a < NUM_OF_ALARM_IDS; a++ ) { // Is alarm recoverable? if ( FALSE == ALARM_TABLE[ a ].alarmNoClear ) @@ -1264,7 +1271,7 @@ { alarmPriorityFIFO[ priority ].alarmID = ALARM_ID_NO_ALARM; alarmPriorityFIFO[ priority ].subRank = LOWEST_ALARM_SUB_RANK; - alarmPriorityFIFO[ priority ].timeSinceTriggeredMS = 0; + alarmPriorityFIFO[ priority ].timeSinceTriggeredMS = -1; } else {