Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rd9cc76524777a12ba77b58ce95416dddfb032997 -r620104f4a9e3148575703981a3063b9605b6e9b8 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision d9cc76524777a12ba77b58ce95416dddfb032997) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 620104f4a9e3148575703981a3063b9605b6e9b8) @@ -58,7 +58,7 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE } // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK }; -const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_U32, 0 }; +const ALARM_DATA_T blankAlarmData = { ALARM_DATA_TYPE_NONE, 0 }; // ********** private data ********** @@ -177,14 +177,18 @@ // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - // if alarm is a fault and not already triggered, request transition to fault mode - if ( ( FALSE == getAlarmActive(alarm) ) && ( TRUE == alarmTable[alarm].alarmIsFault ) ) + // no need to do anything if alarm is already active + if ( FALSE == getAlarmActive( alarm ) ) { - requestNewOperationMode( MODE_FAUL ); + // if alarm is a fault, request transition to fault mode + if ( TRUE == alarmTable[alarm].alarmIsFault ) + { + requestNewOperationMode( MODE_FAUL ); + } + // activate alarm + alarmIsActive[alarm].data = TRUE; + alarmStartedAt[alarm].data = getMSTimerCount(); } - // activate alarm - alarmIsActive[alarm].data = TRUE; - alarmStartedAt[alarm].data = getMSTimerCount(); } else { @@ -277,18 +281,18 @@ // verify alarm can be cleared if ( FALSE == alarmTable[alarm].alarmNoClear ) { - // broadcast alarm clear if not already cleared + // clear alarm and broadcast alarm clear if not already cleared if ( TRUE == alarmIsActive[alarm].data ) { broadcastAlarmCleared( alarm ); + alarmIsActive[alarm].data = FALSE; + alarmStartedAt[alarm].data = 0; + // clear FIFO if this alarm was in it + if ( alarmPriorityFIFO[alarmTable[alarm].alarmPriority] == alarm ) + { + resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); + } } - alarmIsActive[alarm].data = FALSE; - alarmStartedAt[alarm].data = 0; - // clear FIFO if this alarm was in it - if ( alarmPriorityFIFO[alarmTable[alarm].alarmPriority] == alarm ) - { - resetAlarmPriorityFIFO( alarmTable[alarm].alarmPriority ); - } } } else @@ -348,25 +352,32 @@ *************************************************************************/ static void updateAlarmsState( void ) { - ALARM_PRIORITY_T tempState = ALARM_PRIORITY_NONE; + ALARM_PRIORITY_T highestPriority = ALARM_PRIORITY_NONE; ALARM_ID_T a; + BOOL faultsActive = FALSE; // update FIFOs per alarm status table for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) { if ( TRUE == getAlarmActive(a) ) { - tempState = alarmTable[a].alarmPriority; - if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[tempState] ) + ALARM_PRIORITY_T almPriority = alarmTable[a].alarmPriority; + if ( ALARM_ID_NO_ALARM == alarmPriorityFIFO[almPriority] ) { - alarmPriorityFIFO[tempState] = a; + alarmPriorityFIFO[almPriority] = a; } + highestPriority = MAX( almPriority, highestPriority ); + if ( TRUE == alarmTable[a].alarmIsFault ) + { + faultsActive = TRUE; + } } } // update alarm to display per highest priority FIFO - alarmStatus.alarmsState = tempState; - alarmStatus.alarmTop = alarmPriorityFIFO[tempState]; + alarmStatus.alarmsState = highestPriority; + alarmStatus.alarmTop = alarmPriorityFIFO[highestPriority]; + alarmStatus.systemFault = faultsActive; } /************************************************************************* @@ -476,6 +487,10 @@ { alarmPriorityFIFO[priority] = ALARM_ID_NO_ALARM; } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, priority ) + } } /*************************************************************************