Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r0a4dcd288d4347b85baaa0b07da568b6add5eac7 -r75e1ae332d1446dddf9b8d4ce6e8317449c57d67 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 0a4dcd288d4347b85baaa0b07da568b6add5eac7) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 75e1ae332d1446dddf9b8d4ce6e8317449c57d67) @@ -7,8 +7,8 @@ * * @file AlarmMgmt.c * -* @author (last) Sean Nash -* @date (last) 22-Dec-2022 +* @author (last) Dara Navaei +* @date (last) 18-Jan-2023 * * @author (original) Sean Nash * @date (original) 07-Nov-2019 @@ -66,8 +66,8 @@ #define ALARM_AUDIO_CURRENT_HG_MIN_MA 20.0F ///< Minimum audio current (high gain) during test tone self-test (in mA). // TODO - Why is HG so low? S/B same as LG I think. #define ALARM_AUDIO_CURRENT_LG_MIN_MA 60.0F ///< Minimum audio current (low gain) during test tone self-test (in mA). #define ALARM_AUDIO_MAX_TEST_TIME_MS 1000 ///< Maximum time for audio current to reach threshold in test. -#define MAX_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for maximum alarm audio volume. -#define MIN_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for minimum alarm audio volume. +#define MAX_ALARM_AUDIO_VOLUME_INDEX 0 ///< Index for maximum alarm audio volume. +#define MIN_ALARM_AUDIO_VOLUME_INDEX (MAX_ALARM_VOLUME_LEVEL - 1 ) ///< Index for minimum alarm audio volume. /// Alarm priority ranking record. typedef struct @@ -115,6 +115,7 @@ static OVERRIDE_U32_T alarmStatusPublishInterval = { ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, 0 }; /// Interval (in task intervals) at which to publish alarm information to CAN bus. static OVERRIDE_U32_T alarmInfoPublishInterval = { ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, ALARM_INFO_PUB_INTERVAL, 0 }; +/// Alarm audio attenuation level (0..4 where 0 = max volume and 4 = min volume). static OVERRIDE_U32_T alarmAudioVolumeLevel = { MAX_ALARM_VOLUME_ATTENUATION, MAX_ALARM_VOLUME_ATTENUATION, MAX_ALARM_VOLUME_ATTENUATION, 0 }; static OVERRIDE_F32_T alarmPrimaryAudioCurrentHG = { 0.0, 0.0, 0.0, 0 }; /// Alarm audio current (high gain) measured at ADC. @@ -250,8 +251,7 @@ { // No need to do anything if alarm is already active, but if condition was cleared then re-trigger alarm if ( ( FALSE == alarmIsActive[ alarm ] ) || - ( ( FALSE == alarmIsDetected[ alarm ] ) && - ( FALSE == ALARM_TABLE[ alarm ].alarmConditionClearImmed ) ) ) + ( ( FALSE == alarmIsDetected[ alarm ] ) && ( FALSE == ALARM_TABLE[ alarm ].alarmConditionClearImmed ) ) ) { // If alarm status was that no alarms currently active, set this alarm as top alarm until status formally updated later if ( ALARM_ID_NO_ALARM == alarmStatus.alarmTop ) @@ -411,13 +411,7 @@ broadcastData( MSG_ID_ALARM_CLEARED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_ID_DATA_PUBLISH_T ) ); alarmIsActive[ alarm ] = FALSE; clearAlarmCondition( alarm ); - alarmStartedAt[ alarm ].data = 0; - // Clear FIFO if this alarm was in it - if ( alarmPriorityFIFO[ ALARM_TABLE[ alarm ].alarmPriority ].alarmID == alarm ) - { - resetAlarmPriorityFIFO( ALARM_TABLE[ alarm ].alarmPriority ); - } } } } @@ -552,13 +546,50 @@ *************************************************************************/ BOOL isAlarmActive( ALARM_ID_T alarm ) { - BOOL result = alarmIsActive[ alarm ]; + BOOL result = FALSE; + + if ( alarm < NUM_OF_ALARM_IDS ) + { + result = alarmIsActive[ alarm ]; + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_ALARM_ID_REFERENCED, (U32)alarm ); + } return result; } /*********************************************************************//** * @brief + * The isAlarmConditionDetected function determines whether a given alarm + * condition is currently detected. + * @details Inputs: alarmIsDetected[] + * @details Outputs: none + * @param alarm ID of alarm to check + * @return TRUE if given alarm is active, FALSE if not + *************************************************************************/ +BOOL isAlarmConditionDetected( ALARM_ID_T alarm ) +{ + BOOL result = FALSE; + + if ( alarm < NUM_OF_ALARM_IDS ) + { + if ( ( TRUE == alarmIsActive[ alarm ] ) && ( TRUE == alarmIsDetected[ alarm ] ) ) + { + result = TRUE; + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_ALARM_ID_REFERENCED, (U32)alarm ); + } + + return result; +} + +/*********************************************************************//** + * @brief * The isAnyAlarmActive function determines whether any alarm is currently * active. * @details Inputs: alarmStatus @@ -685,11 +716,13 @@ U32 index; U32 activeAlarmListIndex = 0; + // Blank alarm list initially for ( index = 0; index < MAX_ALARM_LIST_SIZE; index++ ) { activeAlarmList[ index ] = ALARM_ID_NO_ALARM; } + // Fill alarm list from (up to) 10 highest priority active alarms if ( TRUE == isAnyAlarmActive() ) { for ( index = 0; index < NUM_OF_ALARM_IDS; index++ ) @@ -799,11 +832,17 @@ *************************************************************************/ static void updateAlarmsState( void ) { - ALARM_PRIORITY_T highestPriority = ALARM_PRIORITY_NONE; + ALARM_PRIORITY_T highestPriority = ALARM_PRIORITY_NONE, p; ALARM_ID_T a; BOOL faultsActive = FALSE; BOOL dialysateRecircBlocked = FALSE; BOOL bloodRecircBlocked = FALSE; + + // Reset priority FIFOs so we can re-determine them below + for ( p = ALARM_PRIORITY_NONE; p < NUM_OF_ALARM_PRIORITIES; p++ ) + { + resetAlarmPriorityFIFO( p ); + } // Update FIFOs and sub-ranks per active alarms table - for alarm ranking purposes to determine "top" alarm for ( a = ALARM_ID_NO_ALARM; a < NUM_OF_ALARM_IDS; a++ ) @@ -814,7 +853,7 @@ U32 subRank = ALARM_TABLE[ a ].alarmSubRank; U32 msSinceTriggered = calcTimeSince( getAlarmStartTime( a ) ); - // See if this alarm is higher rank than highest active alarm in this priority category so far + // See if this alarm is higher rank than highest active alarm in this priority category so far (lower rank # = higher rank) if ( subRank <= alarmPriorityFIFO[ almPriority ].subRank ) { // If sub-rank is a tie, see which alarm was triggered first @@ -939,8 +978,8 @@ if ( TRUE == alarmAudioTestToneRequested ) { // Play test tone at min volume setAlarmAudioState( ALARM_AUDIO_TEST_TONE, - ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MIN_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_GAIN], - ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MIN_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_DIVIDER] ); + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MAX_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_GAIN], + ALARM_AUDIO_DIVIDER_LOOKUP_TABLE[MAX_ALARM_AUDIO_VOLUME_INDEX][ALARM_AUDIO_VOLUME_DIVIDER] ); // If we're in Fault mode, ensure audio test tone request is cancelled. if ( MODE_FAUL == getCurrentOperationMode() ) { @@ -1406,12 +1445,24 @@ break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_ALARM_AUDIO_STATE, (U32)alarmAudioSelfTestState ) break; } return result; } + +/*********************************************************************//** + * @brief + * The resetAlarmAudioPOSTState function resets the alarm audio POST state. + * @details Inputs: none + * @details Outputs: alarmAudioSelfTestState + * @return none + *************************************************************************/ +void resetAlarmAudioPOSTState( void ) +{ + alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; +} /*************************************************************************