Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r2a03f6c87706478406a4962d70f5bae2ccb57728 -rb417657e41722236b0bb084a07e9096ac113ab81 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 2a03f6c87706478406a4962d70f5bae2ccb57728) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision b417657e41722236b0bb084a07e9096ac113ab81) @@ -40,12 +40,16 @@ #define ALARM_STATUS_PUBLISH_INTERVAL ( ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS / TASK_GENERAL_INTERVAL ) /// Interval (ms/task time) at which the alarm information is published on the CAN bus. #define ALARM_INFO_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) + +/// Interval (ms/task time) Alarms are blocked after the return of AC power. +#define ALARM_BLOCKED_COUNT_AFTER_AC_RETURN ( 10*MS_PER_SECOND / TASK_GENERAL_INTERVAL ) -#define ALARM_SILENCE_EXPIRES_IN_SECS (60) ///< Alarm silence expiration time in seconds. +#define ALARM_SILENCE_EXPIRES_IN_SECS (60) ///< Alarm silence expiration time in seconds. -#define SUPERVISOR_ALARM_KEY 0xD2C3B4A5 ///< 32-bit key required for clear all alarms request. +#define SUPERVISOR_ALARM_KEY 0xD2C3B4A5 ///< 32-bit key required for clear all alarms request. -#define LOWEST_ALARM_SUB_RANK 999 ///< Lowest alarm sub-rank that can be set. +#define LOWEST_ALARM_SUB_RANK 999 ///< Lowest alarm sub-rank that can be set. +#define ALARM_NOT_BLOCKED 0 ///< Alarm blocked timer value that indicates no alarm block // *** This declaration will cause a compiler error if ALARM_TABLE does not have same # of alarms as the Alarm_List enumeration. U08 alarmTableSizeAssertion[ ( ( sizeof( ALARM_TABLE ) / sizeof( ALARM_T ) ) == NUM_OF_ALARM_IDS ? 1 : -1 ) ]; @@ -112,6 +116,7 @@ static U32 alarmStatusPublicationTimerCounter = 0; ///< Used to schedule alarm status publication to CAN bus. static U32 alarmInfoPublicationTimerCounter = 0; ///< Used to schedule alarm information publication to CAN bus. static U32 audioTestStartTime; ///< Start time of audio alarm current self-test. +static U32 alarmsBlockedTimer = 0; ///< Countdown timer used to temporarily block new alarms from being initiated /// Interval (in task intervals) at which to publish alarm status to CAN bus. static OVERRIDE_U32_T alarmStatusPublishInterval = { ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, ALARM_STATUS_PUBLISH_INTERVAL, 0 }; @@ -198,7 +203,7 @@ alarmStatus.alarmsState = ALARM_PRIORITY_NONE; alarmStatus.alarmsSilenced = FALSE; alarmStatus.alarmsSilenceStart = 0; - alarmStatus.alarmsSilenceExpiresIn = 0; + alarmStatus.alarmsSilenceExpiresIn = 0; alarmStatus.alarmsEscalatesIn = 0; alarmStatus.alarmsToEscalate = FALSE; alarmStatus.alarmTop = ALARM_ID_NO_ALARM; @@ -214,6 +219,7 @@ alarmStatus.noDialRecirc = FALSE; alarmStatus.ok = FALSE; + alarmsBlockedTimer = 0; alarmAudioTestToneRequested = FALSE; resumeBlockedByAlarmProperty = FALSE; alarmAudioSelfTestState = ALARM_AUDIO_SELF_TEST_STATE_START; @@ -236,24 +242,30 @@ updateAlarmsSilenceStatus(); // Publish alarm status and information at interval publishAlarmInfo(); + + // Block new machine alarms during power fail recovery + if ( alarmsBlockedTimer > 0 ) + { + alarmsBlockedTimer--; + } } - -/*********************************************************************//** - * @brief - * The activateAlarm function activates a given alarm. - * @details Inputs: none - * @details Outputs: alarmIsActive[], alarmStartedAt[] - * @param alarm ID of alarm to activate - * @return none - *************************************************************************/ -static void activateAlarm( ALARM_ID_T alarm ) -{ - // Verify given alarm - if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) - { + +/*********************************************************************//** + * @brief + * The activateAlarm function activates a given alarm. + * @details Inputs: none + * @details Outputs: alarmIsActive[], alarmStartedAt[], alarmStatus is updated + * @param alarm ID of alarm to activate + * @return none + *************************************************************************/ +static void activateAlarm( ALARM_ID_T alarm ) +{ + // Verify valid alarm index + if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + { // 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 ) @@ -276,6 +288,7 @@ alarmIsActive[ alarm ] = TRUE; alarmStartedAt[ alarm ].data = getMSTimerCount(); alarmIsDetected[ alarm ] = TRUE; + // If alarm has clear condition immediately property, clear condition now if ( TRUE == ALARM_TABLE[ alarm ].alarmConditionClearImmed ) { @@ -291,7 +304,7 @@ else { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) - } + } } /*********************************************************************//** @@ -330,7 +343,7 @@ * The activateAlarm2Data function activates a given alarm. Also, an alarm * message is broadcast to the rest of the system. This function will * include two given data in the broadcast message for logging. - * @details Inputs: none + * @details Inputs: alarmsBlockedTimer, determines blocked alarm conditions * @details Outputs: alarm triggered message sent, alarm activated * @param alarm ID of alarm to activate * @param alarmData1 supporting data to include in alarm msg @@ -339,28 +352,47 @@ *************************************************************************/ void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ) { - // Broadcast alarm and data if alarm not already active - if ( FALSE == alarmIsActive[ alarm ] ) + // Block if new alarms are occur during loss of AC power + if ( ( TRUE == getCPLDACPowerLossDetected() ) ) { - ALARM_TRIGGERED_PAYLOAD_T data; + alarmsBlockedTimer = ALARM_BLOCKED_COUNT_AFTER_AC_RETURN; + } + // Sanity check, verify valid alarm index + if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) + { + // if the block timer is 0 OR we have an unblockable alarm + if ( ( ALARM_NOT_BLOCKED == alarmsBlockedTimer ) + || ( ALARM_ID_HD_AC_POWER_LOST == alarm ) + || ( ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT == alarm ) ) + { + // Broadcast alarm and data if alarm not already active + if ( FALSE == alarmIsActive[ alarm ] ) + { + ALARM_TRIGGERED_PAYLOAD_T data; - data.alarm = (U32)alarm; - data.almDataType1 = (U32)alarmData1.dataType; - data.almData1 = alarmData1.data.uInt.data; - data.almDataType2 = (U32)alarmData2.dataType; - data.almData2 = alarmData2.data.uInt.data; - data.almPriority = ALARM_TABLE[ alarm ].alarmPriority; - data.almRank = ALARM_TABLE[ alarm ].alarmSubRank; - data.almClrTopOnly = ALARM_TABLE[ alarm ].alarmClearOnly; + data.alarm = (U32)alarm; + data.almDataType1 = (U32)alarmData1.dataType; + data.almData1 = alarmData1.data.uInt.data; + data.almDataType2 = (U32)alarmData2.dataType; + data.almData2 = alarmData2.data.uInt.data; + data.almPriority = ALARM_TABLE[ alarm ].alarmPriority; + data.almRank = ALARM_TABLE[ alarm ].alarmSubRank; + data.almClrTopOnly = ALARM_TABLE[ alarm ].alarmClearOnly; - broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); - // Send information for UI to log to treatment log - if ( ( TRUE == ALARM_TABLE[ alarm ].alarmTreatmentLog ) && ( MODE_TREA == getCurrentOperationMode() ) ) - { - sendTreatmentLogAlarmEventData( alarm, alarmData1, alarmData2 ); - } + broadcastData( MSG_ID_ALARM_TRIGGERED, COMM_BUFFER_OUT_CAN_HD_ALARM, (U08*)&data, sizeof( ALARM_TRIGGERED_PAYLOAD_T ) ); + // Send information for UI to log to treatment log + if ( ( TRUE == ALARM_TABLE[ alarm ].alarmTreatmentLog ) && ( MODE_TREA == getCurrentOperationMode() ) ) + { + sendTreatmentLogAlarmEventData( alarm, alarmData1, alarmData2 ); + } + } + activateAlarm( alarm ); + } + } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, alarm ) } - activateAlarm( alarm ); } /*********************************************************************//**