Index: PersistentAlarm.c =================================================================== diff -u -r87250a29e916894bc2ee2b6966e7df521a905bc6 -r47562f55e05738340cff996e9b579e90716204db --- PersistentAlarm.c (.../PersistentAlarm.c) (revision 87250a29e916894bc2ee2b6966e7df521a905bc6) +++ PersistentAlarm.c (.../PersistentAlarm.c) (revision 47562f55e05738340cff996e9b579e90716204db) @@ -30,18 +30,17 @@ typedef struct { ALARM_ID_T alarm; ///< Alarm id - BOOL isClearable; ///< Flag if alarm can be cleared U32 persistentClearPeriod; ///< Persistent count limit before clear alarm U32 persistentTriggerPeriod; ///< Persistent count limit before trigger alarm - U32 inRangeStartTime; ///< Data in range persistent counter - U32 outOfRangeStartTime; ///< Data out of range persistent counter + U32 errorClearedStartTime; ///< Error cleared start time + U32 errorOccuredStartTime; ///< Error occured start time } PERSISTENT_ALARM_DATA_T; // ********** private data ********** -static PERSISTENT_ALARM_DATA_T persistentAlarms[ NUM_OF_PERSISTENT_ALARM ]; ///< Array of persistent alarm structure +static PERSISTENT_ALARM_DATA_T persistentAlarms[ NUM_OF_ALARM_IDS ]; ///< Array of persistent alarm structure // ********** private function prototypes ********** @@ -51,86 +50,101 @@ * when the alarm count lower than maximum persistent alarm allowed. * @details Inputs: none * @details Outputs: PersistentAlarm module initialized - * @param alarmIndex Persistent alarm index - * @param alarm Alarm id - * @param isClearable Flag to indicate alarm is clearable or not + * @param alarmId Alarm id * @param persistentClearPeriod Persistent period limit before clear alarm (in ms) * @param persistentTriggerPeriod Persistent period limit before trigger alarm (in ms) * @return none *************************************************************************/ -void initPersistentAlarm( PERSISTENT_ALARM_T alarmIndex, ALARM_ID_T alarm, BOOL isClearable, - U32 persistentClearPeriod, U32 persistentTriggerPeriod ) +void initPersistentAlarm( ALARM_ID_T alarmId, U32 persistentClearPeriod, U32 persistentTriggerPeriod ) { - if ( alarmIndex < NUM_OF_PERSISTENT_ALARM ) + if ( alarmId < NUM_OF_ALARM_IDS ) + { + persistentAlarms[ alarmId ].persistentClearPeriod = persistentClearPeriod; + persistentAlarms[ alarmId ].persistentTriggerPeriod = persistentTriggerPeriod; + persistentAlarms[ alarmId ].errorClearedStartTime = 0U; + persistentAlarms[ alarmId ].errorOccuredStartTime = 0U; + } + else + { +#ifdef _DG_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmId ); +#else + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmId ); +#endif + } +} + +/*********************************************************************//** + * @brief + * The isPersistentAlarmTriggered function checks if the error condition has + * persisted for given time limit. + * @details Inputs: persistentAlarms[] + * @details Outputs: none + * @param alarmId Alarm id + * @param isErrorOccured Flag indicates error condition is occuring or not + * @return TRUE if error condition persisted over given time limit, FALSE if not + *************************************************************************/ +BOOL isPersistentAlarmTriggered( ALARM_ID_T alarmId, BOOL const isErrorOccured ) +{ + BOOL isAlarmTriggered = FALSE; + + if ( alarmId < NUM_OF_ALARM_IDS ) { - persistentAlarms[ alarmIndex ].alarm = alarm; - persistentAlarms[ alarmIndex ].isClearable = isClearable; - persistentAlarms[ alarmIndex ].persistentClearPeriod = persistentClearPeriod; - persistentAlarms[ alarmIndex ].persistentTriggerPeriod = persistentTriggerPeriod; - persistentAlarms[ alarmIndex ].inRangeStartTime = 0U; - persistentAlarms[ alarmIndex ].outOfRangeStartTime = 0U; + if ( ( TRUE == isErrorOccured ) && ( persistentAlarms[ alarmId ].errorOccuredStartTime != 0 ) ) + { + isAlarmTriggered = didTimeout( persistentAlarms[ alarmId ].errorOccuredStartTime, persistentAlarms[ alarmId ].persistentTriggerPeriod ); + } + else + { + persistentAlarms[ alarmId ].errorOccuredStartTime = getMSTimerCount(); + } } else { #ifdef _DG_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmId ); #else - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmId ); #endif } + + return isAlarmTriggered; } /*********************************************************************//** * @brief - * The checkPersistentAlarm function check whether data is out of range or - * not. Then the function set or clear alarm once the persistent counter - * exceeds the limit. - * @details Inputs: none - * @details Outputs: Checks for out of range data and set/clear alarm - * @param alarmIndex Persistent alarm index - * @param isOutOfRange Flag indicates data out of range - * @param data Data to be check for out of range - * @param limit Upper or lower limit that data exceeded - * @return none + * The isPersistentAlarmConditionCleared function checks if the error condition has + * been cleared for given time limit. + * @details Inputs: persistentAlarms[] + * @details Outputs: none + * @param alarmId Alarm id + * @param isErrorOccured Flag indicates error condition is occuring or not + * @return TRUE if error condition has been cleared over given time limit, FALSE if not *************************************************************************/ -void checkPersistentAlarm( PERSISTENT_ALARM_T const alarmIndex, BOOL const isOutOfRange, F32 const data, F32 const limit ) -{ - if ( alarmIndex < NUM_OF_PERSISTENT_ALARM ) +BOOL isPersistentAlarmConditionCleared( ALARM_ID_T alarmId, BOOL const isErrorOccured ) +{ BOOL isErrorConditionCleared = FALSE; + + if ( alarmId < NUM_OF_ALARM_IDS ) { - if ( isOutOfRange ) + if ( ( FALSE == isErrorOccured ) && ( persistentAlarms[ alarmId ].errorClearedStartTime != 0 ) ) { - persistentAlarms[ alarmIndex ].inRangeStartTime = 0; - if ( persistentAlarms[ alarmIndex ].outOfRangeStartTime == 0 ) - { - persistentAlarms[ alarmIndex ].outOfRangeStartTime = getMSTimerCount(); - } - if ( didTimeout( persistentAlarms[ alarmIndex ].outOfRangeStartTime, persistentAlarms[ alarmIndex ].persistentTriggerPeriod ) ) - { - SET_ALARM_WITH_2_F32_DATA( persistentAlarms[ alarmIndex ].alarm, data, limit ); - } + isErrorConditionCleared = didTimeout( persistentAlarms[ alarmId ].errorClearedStartTime, persistentAlarms[ alarmId ].persistentClearPeriod ); } else { - persistentAlarms[ alarmIndex ].outOfRangeStartTime = 0; - if ( persistentAlarms[ alarmIndex ].inRangeStartTime == 0 ) - { - persistentAlarms[ alarmIndex ].inRangeStartTime = getMSTimerCount(); - } - BOOL const isInRangePersistent = didTimeout( persistentAlarms[ alarmIndex ].inRangeStartTime, persistentAlarms[ alarmIndex ].persistentClearPeriod ); - if ( persistentAlarms[ alarmIndex ].isClearable && isInRangePersistent ) - { - clearAlarmCondition( persistentAlarms[ alarmIndex ].alarm ); - } + persistentAlarms[ alarmId ].errorClearedStartTime = getMSTimerCount(); } } else { #ifdef _DG_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmId ); #else - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmId ); #endif } + + return isErrorConditionCleared; } /**@}*/ Index: PersistentAlarm.h =================================================================== diff -u -ra78955f6cb6e7de3f9f7d9efc06b256cbe5f6c81 -r47562f55e05738340cff996e9b579e90716204db --- PersistentAlarm.h (.../PersistentAlarm.h) (revision a78955f6cb6e7de3f9f7d9efc06b256cbe5f6c81) +++ PersistentAlarm.h (.../PersistentAlarm.h) (revision 47562f55e05738340cff996e9b579e90716204db) @@ -23,58 +23,18 @@ /** * @defgroup PersistentAlarm PersistentAlarm * @brief Persistent alarm monitor module. - * Check for persistent error and throw appropriate alarm. + * Check for persistent error and return indication on whether alarm is triggered or alarm condition is cleared. * * @addtogroup PersistentAlarm * @{ */ -// ********** public definitions ********** - -typedef enum PersistentAlarm -{ -#ifdef _HD_ - PERSISTENT_ALARM_BLOOD_FLOW_SIGNAL_STRENGTH, ///< Blood flow signal strength too low - PERSISTENT_ALARM_DIALYSATE_FLOW_SIGNAL_STRENGTH, ///< Dialysate flow signal strength too low - PERSISTENT_ALARM_ARTERIAL_PRESSURE_LOW, ///< Arterial pressure too low during treatment - PERSISTENT_ALARM_ARTERIAL_PRESSURE_HIGH, ///< Arterial pressure too high during treatment - PERSISTENT_ALARM_VENOUS_PRESSURE_LOW, ///< Venous pressure too low during treatment - PERSISTENT_ALARM_VENOUS_PRESSURE_HIGH, ///< Venous pressure too high during treatment -#endif -#ifdef _DG_ - PERSISTENT_ALARM_INLET_WATER_HIGH_TEMPERATURE, ///< Inlet water high temperature persistent alarm - PERSISTENT_ALARM_INLET_WATER_LOW_TEMPERATURE, ///< Inlet water low temperature persistent alarm - PERSISTENT_ALARM_INLET_WATER_HIGH_CONDUCTIVITY, ///< Inlet water high conductivity persistent alarm - PERSISTENT_ALARM_INLET_WATER_LOW_CONDUCTIVITY, ///< Inlet water low conductivity persistent alarm - PERSISTENT_ALARM_RO_REJECTION_RATIO_OUT_OF_RANGE, ///< RO rejection ratio out of range persistent alarm - PERSISTENT_ALARM_INLET_WATER_LOW_PRESSURE, ///< Inlet water low pressure persistent alarm - PERSISTENT_ALARM_INLET_WATER_PRESSURE_FAULT, ///< Inlet water pressure fault persistent alarm - PERSISTENT_ALARM_POST_ACID_CONDUCTIVITY_OUT_OF_RANGE, ///< Post acid concentrate conductivity out of range - PERSISTENT_ALARM_POST_BICARB_CONDUCTIVITY_OUT_OF_RANGE, ///< Post bicarbonate concentrate conductivity out of range - PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_UPPER_RANGE, ///< RO pump flow rate out of upper range - PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_LOWER_RANGE, ///< RO pump flow rate out of lower range - PERSISTENT_ALARM_RO_PUMP_PRESSURE_OUT_OF_RANGE, ///< RO pump pressure out of range - PERSISTENT_ALARM_CP1_SPEED_CONTROL_ERROR, ///< Concentrate pump CP1 speed control error - PERSISTENT_ALARM_CP2_SPEED_CONTROL_ERROR, ///< Concentrate pump CP2 speed control error - PERSISTENT_ALARM_DRAIN_PUMP_RPM_OUT_OF_RANGE, ///< Drain pump RPM out of range - PERSISTENT_ALARM_THERMISTOR_TEMPERATURE_OUT_OF_RANGE, ///< Thermistor temperature out of range persistent alarm - PERSISTENT_ALARM_FANS_RPM_OUT_RANGE, ///< Fans RPM out of range persistent alarm - PERSISTENT_ALARM_TEMP_SENSORS_INTERNAL_ERROR, ///< Temperature sensors internal error alarm - PERSISTENT_ALARM_TEMP_SENSORS_FPGA_ERROR, ///< Temperature sensors FPGA error alarm - PERSISTENT_ALARM_UV_REACTOR_UNHEALTHY, ///< UV reactor unhealthy persistent alarm - PERSISTENT_ALARM_DRAIN_PUMP_OFF_ERROR, ///< Drain pump off error for safety shutdown - PERSISTENT_ALARM_RO_PUMP_RAMP_UP_TO_TARGET_FLOW_TIMEOUT, ///< RO pump ramp up to target flow timeout - PERSISTEMT_ALARM_RO_PUMP_OFF_ERROR, ///< RO pump off error -#endif - NUM_OF_PERSISTENT_ALARM ///< Number of persistent alarms -} PERSISTENT_ALARM_T; - // ********** public function prototypes ********** // Persistent period resolution is in ms -void initPersistentAlarm( PERSISTENT_ALARM_T alarmIndex, ALARM_ID_T alarm, BOOL isClearable, - U32 persistentClearPeriod, U32 persistentTriggerPeriod ); -void checkPersistentAlarm( PERSISTENT_ALARM_T const alarmIndex, BOOL const isOutOfRange, F32 const data, F32 const limit ); +void initPersistentAlarm( ALARM_ID_T alarmIndex, U32 persistentClearPeriod, U32 persistentTriggerPeriod ); +BOOL isPersistentAlarmTriggered( ALARM_ID_T alarmIndex, BOOL const isErrorOccured ); +BOOL isPersistentAlarmConditionCleared( ALARM_ID_T alarmIndex, BOOL const isOutOfRange ); /**@}*/