Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r5c430c3ac17fc8ad836fd70b8a3b8a12af44319e -re47489aaf3c818c6f438434ff6b2cf1cafc4210c --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 5c430c3ac17fc8ad836fd70b8a3b8a12af44319e) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision e47489aaf3c818c6f438434ff6b2cf1cafc4210c) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file AlarmMgmt.c * * @author (last) Dara Navaei -* @date (last) 21-Dec-2022 +* @date (last) 09-May-2024 * * @author (original) Sean * @date (original) 04-Feb-2020 @@ -20,7 +20,8 @@ #include "AlarmMgmt.h" #include "CPLD.h" #include "OperationModes.h" -#include "PersistentAlarm.h" +#include "PersistentAlarm.h" +#include "Reservoirs.h" #include "SafetyShutdown.h" #include "SystemComm.h" #include "SystemCommMessages.h" @@ -46,7 +47,7 @@ // *** This declaration will cause a compiler error if ALARM_RANK_TABLE does not have same # of alarms as the Alarm_List enumeration. U08 alarmRankTableSizeAssertion[ ( ( sizeof( ALARM_RANK_TABLE ) / sizeof( ALARM_RANK_T ) ) == NUM_OF_ALARM_IDS ? 1 : -1 ) ]; -U32 alarmLEDTimer; +U32 alarmLEDTimer; ///< Alarm LED timer const ALARM_DATA_T BLANK_ALARM_DATA = { ALARM_DATA_TYPE_NONE, 0 }; ///< A blank alarm data record for alarms that do not include alarm data when triggered. @@ -57,6 +58,7 @@ static BOOL alarmIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of current state of each alarm static BOOL alarmConditionIsActive[ NUM_OF_ALARM_IDS ]; ///< Array of flag indicates if an alarm condition is active static U32 alarmInfoPublicationTimerCounter; ///< Used to schedule alarm information publication to CAN bus. +static BOOL isAFaultAlarmActive; ///< Boolean flag to indicate whether a DG fault alarm is active. /// 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 }; @@ -71,20 +73,22 @@ * @brief * The initAlarmMgmt function initializes the AlarmMgmt module. * @details Inputs: none - * @details Outputs: AlarmMgmt module initialized. + * @details Outputs: alarmInfoPublicationTimerCounter, alarmLEDTimer, + * isAFaultAlarmActive, alarmIsActive, alarmConditionIsActive * @return none *************************************************************************/ void initAlarmMgmt( void ) { ALARM_ID_T alrm; alarmInfoPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - alarmLEDTimer = 0; + alarmLEDTimer = 0; + isAFaultAlarmActive = FALSE; // initialize alarm states and start time stamps for ( alrm = ALARM_ID_NO_ALARM; alrm < NUM_OF_ALARM_IDS; alrm++ ) { - alarmIsActive[ alrm ] = FALSE; + alarmIsActive[ alrm ] = FALSE; alarmConditionIsActive[ alrm ] = FALSE; } } @@ -109,7 +113,7 @@ * @brief * The activateAlarm function activates a given alarm. * @details Inputs: none - * @details Outputs: alarmIsActive[] + * @details Outputs: alarmIsActive[], isAFaultAlarmActive * @param alarm ID of alarm to activate * @return none *************************************************************************/ @@ -122,13 +126,19 @@ if ( FALSE == alarmIsActive[ alarm ] ) { // activate alarm - alarmIsActive[ alarm ] = TRUE; + alarmIsActive[ alarm ] = TRUE; alarmConditionIsActive[ alarm ] = TRUE; - // If alarm is a DG fault, request transition to fault mode - if ( ( TRUE == ALARM_TABLE[ alarm ].alarmIsDGFault ) && ( TRUE == isTransitionToFaultRequired() ) ) + if ( TRUE == ALARM_TABLE[ alarm ].alarmIsDGFault ) { - requestNewOperationMode( DG_MODE_FAUL ); + // There is a DG fault alarm. + isAFaultAlarmActive = TRUE; + + if ( TRUE == isTransitionToFaultRequired() ) + { + // If alarm is a DG fault and the alarm manager can transition to fault immediately, go to fault mode + requestNewOperationMode( DG_MODE_FAUL ); + } } // If alarm has clear condition immediately property, clear condition now if ( TRUE == ALARM_TABLE[ alarm ].alarmConditionClearImmed ) @@ -154,7 +164,7 @@ *************************************************************************/ void activateAlarmNoData( ALARM_ID_T alarm ) { - activateAlarm2Data( alarm, BLANK_ALARM_DATA, BLANK_ALARM_DATA ); + activateAlarm2Data( alarm, BLANK_ALARM_DATA, BLANK_ALARM_DATA, FALSE ); } /*********************************************************************//** @@ -170,7 +180,7 @@ *************************************************************************/ void activateAlarm1Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData ) { - activateAlarm2Data( alarm, alarmData, BLANK_ALARM_DATA ); + activateAlarm2Data( alarm, alarmData, BLANK_ALARM_DATA, FALSE ); } /*********************************************************************//** @@ -183,16 +193,26 @@ * @param alarm ID of alarm to activate * @param alarmData1 supporting data to include in alarm message * @param alarmData2 supporting data to include in alarm message + * @param outside flag indicates whether alarm is originating from outside HD f/w * @return none *************************************************************************/ -void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ) +void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2, BOOL outside ) { - // broadcast alarm and data if alarm not already active - if ( ( FALSE == alarmIsActive[ alarm ] ) && ( TRUE == isHDCommunicating() ) ) - { - broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); + HD_MODE_SUB_MODE_T hdModes; + + getHDOperationMode( &hdModes ); + + // prevent alarm trigger if property blocks in current mode/state + if ( ( ( ALARM_TABLE[ alarm ].alarmBlockRinseback != TRUE ) || ( hdModes.hdMode != MODE_TREA ) || ( hdModes.hdSubMode != TREATMENT_RINSEBACK_STATE ) ) && + ( ( ALARM_TABLE[ alarm ].alarmBlockEndTx != TRUE ) || ( hdModes.hdMode != MODE_POST ) ) ) + { + // broadcast alarm and data if alarm not already active + if ( ( FALSE == alarmIsActive[ alarm ] ) && ( TRUE == isHDCommunicating() ) ) + { + broadcastAlarmTriggered( alarm, alarmData1, alarmData2 ); + } + activateAlarm( alarm ); } - activateAlarm( alarm ); } /*********************************************************************//** @@ -209,8 +229,8 @@ // verify given alarm if ( ( alarm > ALARM_ID_NO_ALARM ) && ( alarm < NUM_OF_ALARM_IDS ) ) { - // clear alarm and broadcast alarm clear if not already cleared - if ( TRUE == alarmIsActive[ alarm ] ) + // clear alarm and broadcast alarm clear if not already cleared (and not a DG fault which should not be cleared) + if ( ( TRUE == alarmIsActive[ alarm ] ) && ( ALARM_TABLE[ alarm ].alarmIsDGFault != TRUE ) ) { if ( TRUE == isHDCommunicating() ) { @@ -267,6 +287,33 @@ BOOL isAlarmActive( ALARM_ID_T alarm ) { return alarmIsActive[ alarm ]; +} + +/*********************************************************************//** + * @brief + * The isDGFaultAlarmActive function determines whether a fault alarm is currently + * active. + * @details Inputs: alarmStatus + * @details Outputs: none + * @return TRUE if any alarm is active, FALSE if not + *************************************************************************/ +BOOL isDGFaultAlarmActive( void ) +{ + return isAFaultAlarmActive; +} + +/*********************************************************************//** + * @brief + * The isAlarmConditionActive function determines whether the condition of + * a given alarm is currently active. + * @details Inputs: alarmConditionIsActive[] + * @details Outputs: none + * @param alarm ID of alarm to check + * @return TRUE if given alarm condition is active, FALSE if not + *************************************************************************/ +BOOL isAlarmConditionActive( ALARM_ID_T alarm ) +{ + return alarmConditionIsActive[ alarm ]; } /*********************************************************************//** @@ -286,7 +333,7 @@ data.safetyShutdownStatus = (U32)isSafetyShutdownActivated(); - broadcastData( MSG_ID_DG_ALARM_INFO, COMM_BUFFER_OUT_CAN_DG_ALARM, (U08*)&data, sizeof( SAFETY_SHUTDOWN_ACTIVATION_DATA_T ) ); + broadcastData( MSG_ID_DG_ALARM_INFO_DATA, COMM_BUFFER_OUT_CAN_DG_ALARM, (U08*)&data, sizeof( SAFETY_SHUTDOWN_ACTIVATION_DATA_T ) ); broadcastCPLDStatus(); alarmInfoPublicationTimerCounter = 0; } @@ -313,12 +360,34 @@ } } -/************************************************************************* +/*********************************************************************//** * @brief +* The isAnyCleaningModeInletWaterConditionActive function returns the status +* of any of the inlet water conditions is active or not in a cleaning mode +* @details Inputs: none +* @details Outputs: none +* @return TRUE if any of the inlet water conditions is active otherwise, FALSE +*************************************************************************/ +BOOL isAnyCleaningModeInletWaterConditionActive( void ) +{ + BOOL status = FALSE; + + // Check all the inlet water conditions + status |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_TEMP_TOO_HIGH ); + status |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_TEMP_TOO_LOW ); + status |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_HIGH ); + status |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_LOW ); + status |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_PRESSURE_TOO_HIGH ); + status |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_PRESSURE_TOO_LOW ); + + return status; +} + +/*********************************************************************//** + * @brief * The alarmUserNotify function activates Fault LED and Audio if FAULT exists. * @details Inputs: none * @details Outputs: LED and Audio control - * @param none * @return none *************************************************************************/ static void alarmUserNotify( void ) @@ -358,13 +427,12 @@ } } -/************************************************************************* +/*********************************************************************//** * @brief * The isTransitionToFaultRequired function checks whether the alarm management * should request a transition to fault mode immediately or it should be deferred * @details Inputs: none * @details Outputs: none - * @param none * @return TRUE if transition to fault is required otherwise, FALSE *************************************************************************/ static BOOL isTransitionToFaultRequired( void ) @@ -380,6 +448,7 @@ case DG_MODE_SERV: case DG_MODE_CHFL: case DG_MODE_HCOL: + case DG_MODE_ROPS: status = FALSE; break;