Index: PersistentAlarm.c =================================================================== diff -u --- PersistentAlarm.c (revision 0) +++ PersistentAlarm.c (revision 5b5c205064a86f29dfe376922ff6331b8bfa07a6) @@ -0,0 +1,125 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 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 PersistentAlarm.c +* +* @author (last) Quang Nguyen +* @date (last) 12-Aug-2020 +* +* @author (original) Quang Nguyen +* @date (original) 12-Aug-2020 +* +***************************************************************************/ + +#include "AlarmMgmt.h" +#include "PersistentAlarm.h" + +/** + * @addtogroup PersistentAlarm + * @{ + */ + +// ********** private definitions ********** + +/// Persistent alarm structure +typedef struct +{ + ALARM_ID_T alarm; ///< Alarm id + + U32 persistentClearCount; ///< Persistent count limit before clear alarm + U32 persistentTriggerCount; ///< Persistent count limit before trigger alarm + + U32 inRangeCounter; ///< Data in range persistent counter + U32 outOfRangeCounter; ///< Data out of range persistent counter +} PERSISTENT_ALARM_DATA_T; + +// ********** private data ********** + +static PERSISTENT_ALARM_DATA_T persistentAlarms[ NUM_OF_PERSISTENT_ALARM ]; ///< Array of persistent alarm structure + +// ********** private function prototypes ********** + +/************************************************************************* + * @brief + * The initPersistentAlarm function initializes the PersistentAlarm module + * when the alarm count lower than maximum persistent alarm allowed. + * @details + * Inputs : none + * Outputs : PersistentAlarm module initialized + * @param alarmIndex Persistent alarm index + * @param alarm Alarm id + * @param persistentClearCount Persistent count limit before clear alarm + * @param persistentTriggerCount Persistent count limit before trigger alarm + * @return none + *************************************************************************/ +void initPersistentAlarm( PERSISTENT_ALARM_T alarmIndex, ALARM_ID_T alarm, F32 persistentClearCount, F32 persistentTriggerCount ) +{ + if ( alarmIndex < NUM_OF_PERSISTENT_ALARM ) + { + persistentAlarms[ alarmIndex ].alarm = alarm; + persistentAlarms[ alarmIndex ].persistentClearCount = persistentClearCount; + persistentAlarms[ alarmIndex ].persistentTriggerCount = persistentTriggerCount; + persistentAlarms[ alarmIndex ].inRangeCounter = 0U; + persistentAlarms[ alarmIndex ].outOfRangeCounter = 0U; + } + else + { +#ifdef _DG_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); +#else + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); +#endif + } +} + +/************************************************************************* + * @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 + * 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 + * @return none + *************************************************************************/ +void checkPersistentAlarm( PERSISTENT_ALARM_T const alarmIndex, BOOL const isOutOfRange, F32 const data ) +{ + if ( alarmIndex < NUM_OF_PERSISTENT_ALARM ) + { + if ( isOutOfRange ) + { + ++persistentAlarms[ alarmIndex ].outOfRangeCounter; + persistentAlarms[ alarmIndex ].inRangeCounter = 0; + if ( persistentAlarms[ alarmIndex ].outOfRangeCounter > persistentAlarms[ alarmIndex ].persistentTriggerCount ) + { + SET_ALARM_WITH_1_F32_DATA( persistentAlarms[ alarmIndex ].alarm, data ); + } + } + else + { + ++persistentAlarms[ alarmIndex ].inRangeCounter; + persistentAlarms[ alarmIndex ].outOfRangeCounter = 0; + if ( persistentAlarms[ alarmIndex ].inRangeCounter > persistentAlarms[ alarmIndex ].persistentClearCount ) + { + clearAlarm( persistentAlarms[ alarmIndex ].alarm ); + } + } + } + else + { +#ifdef _DG_ + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); +#else + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, alarmIndex ); +#endif + } +} + +/**@}*/ Index: PersistentAlarm.h =================================================================== diff -u --- PersistentAlarm.h (revision 0) +++ PersistentAlarm.h (revision 5b5c205064a86f29dfe376922ff6331b8bfa07a6) @@ -0,0 +1,55 @@ +/************************************************************************** +* +* Copyright (c) 2019-2020 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 PersistentAlarm.h +* +* @author (last) Quang Nguyen +* @date (last) 12-Aug-2020 +* +* @author (original) Quang Nguyen +* @date (original) 12-Aug-2020 +* +***************************************************************************/ + +#ifndef __PERSISTENTALARM_H__ +#define __PERSISTENTALARM_H__ + +#include "DGCommon.h" + +/** + * @defgroup PersistentAlarm PersistentAlarm + * @brief Persistent Alarm monitor module. + * Check for persistent error and throw appropriate alarm. + * + * @addtogroup PersistentAlarm + * @{ + */ + +// ********** public definitions ********** + +typedef enum PersistentAlarm +{ +#ifdef _HD_ +#endif +#ifdef _DG_ + PERSISTENT_ALARM_INLET_WATER_HIGH_TEMPERATURE, + PERSISTENT_ALARM_INLET_WATER_LOW_TEMPERATURE, + PERSISTENT_ALARM_INLET_WATER_HIGH_CONDUCTIVITY, + PERSISTENT_ALARM_INLET_WATER_LOW_CONDUCTIVITY, + PERSISTENT_ALARM_RO_REJECTION_RATIO_OUT_OF_RANGE, +#endif + NUM_OF_PERSISTENT_ALARM +} PERSISTENT_ALARM_T; + +// ********** public function prototypes ********** + +void initPersistentAlarm( PERSISTENT_ALARM_T alarmIndex, ALARM_ID_T alarm, F32 persistentClearCount, F32 persistentTriggerCount ); +void checkPersistentAlarm( PERSISTENT_ALARM_T const alarmIndex, BOOL const isOutOfRange, F32 const data ); + +/**@}*/ + +#endif