Index: PersistentAlarm.c =================================================================== diff -u -ref85d012a922ae5e8a43a160d80bb71c3af4aa4f -r2bd145db589fc7533cab20e3009addf58eef0dbc --- PersistentAlarm.c (.../PersistentAlarm.c) (revision ef85d012a922ae5e8a43a160d80bb71c3af4aa4f) +++ PersistentAlarm.c (.../PersistentAlarm.c) (revision 2bd145db589fc7533cab20e3009addf58eef0dbc) @@ -26,24 +26,47 @@ // ********** private definitions ********** +#define NUM_OF_FPGA_ALARMS_PER_GROUP 2 +#define FPGA_READ_ALARM_INDEX 0 +#define FPGA_ERROR_ALARM_INDEX 1 + /// Persistent alarm structure typedef struct { - ALARM_ID_T alarm; ///< Alarm id + ALARM_ID_T alarm; ///< Alarm id + U32 persistentClearPeriod; ///< Persistent count limit before clear alarm + U32 persistentTriggerPeriod; ///< Persistent count limit before trigger alarm + U32 errorClearedStartTime; ///< Error cleared start time + U32 errorOccurredStartTime; ///< Error occurred start time +} PERSISTENT_ALARM_DATA_T; - U32 persistentClearPeriod; ///< Persistent count limit before clear alarm - U32 persistentTriggerPeriod; ///< Persistent count limit before trigger alarm +/// FPGA persistent alarm data structure +typedef struct +{ + U32 fpgaPersistentClearPeriod; ///< FPGA persistent count limit before clear alarm + U32 fpgaPersistentTriggerPeriod; ///< FPGA persistent count limit before trigger alarm + U32 fpagErrorClearedStartTime; ///< FPGA error cleared start time + U32 fpgaErrorOccurredStartTime; ///< FPGA error occurred start time + U32 fpgaPreviousCount; ///< FPGA previous read count + BOOL fpgaIsConditionClear; ///< FPGA is persistent condition clear +} FPGA_ALARM_DATA_T; - U32 errorClearedStartTime; ///< Error cleared start time - U32 errorOccurredStartTime; ///< Error occurred start time -} PERSISTENT_ALARM_DATA_T; +/// FPGA persistent alarm structure +typedef struct +{ + ALARM_ID_T fpgaAlarm; ///< FPGA read alarm + FPGA_ALARM_DATA_T fpgaAlarmData[ NUM_OF_FPGA_ALARMS_PER_GROUP ]; +} FPGA_PERSISTENT_ALARM_GROUP_T; // ********** private data ********** static PERSISTENT_ALARM_DATA_T persistentAlarms[ NUM_OF_ALARM_IDS ]; ///< Array of persistent alarm structure +static FPGA_PERSISTENT_ALARM_GROUP_T fpgaPersistentAlarmGroup[ NUM_OF_FPGA_SENSOR_GROUPS ]; // ********** private function prototypes ********** +static BOOL isFPGAPersistentAlarmTriggered( FPGA_ALARM_DATA_T* data, U32 fpgaCount ); + /*********************************************************************//** * @brief * The initPersistentAlarm function initializes the PersistentAlarm module @@ -172,7 +195,84 @@ void resetPersistentAlarmTimer( ALARM_ID_T alarmId ) { persistentAlarms[ alarmId ].errorOccurredStartTime = 0; - persistentAlarms[ alarmId ].errorClearedStartTime = 0; + persistentAlarms[ alarmId ].errorClearedStartTime = 0; } +static BOOL isFPGAPersistentAlarmTriggered( FPGA_ALARM_DATA_T* data, U32 fpgaCount ) +{ + BOOL isPersistentTriggered = FALSE; + + if ( fpgaCount == data->fpgaPreviousCount ) + { + if ( TRUE == data->fpgaIsConditionClear ) + { + data->fpgaIsConditionClear = FALSE; + data->fpgaErrorOccurredStartTime = getMSTimerCount(); + } + else if ( TRUE == didTimeout( data->fpgaErrorOccurredStartTime, data->fpgaPersistentTriggerPeriod ) ) + { + isPersistentTriggered = TRUE; + } + } + else + { + data->fpgaIsConditionClear = TRUE; + } + + data->fpgaPreviousCount = fpgaCount; + + return isPersistentTriggered; +} + +void checkFPGAPersistentAlarms( FPGA_PERSISTENT_ALARMS_GROUP_T group, U32 errorCount, U32 readCount, U32 sensorIndex ) +{ + if ( group < NUM_OF_FPGA_SENSOR_GROUPS ) + { + FPGA_ALARM_DATA_T readData = fpgaPersistentAlarmGroup[ group ].fpgaAlarmData[ FPGA_READ_ALARM_INDEX ]; + FPGA_ALARM_DATA_T errorData = fpgaPersistentAlarmGroup[ group ].fpgaAlarmData[ FPGA_ERROR_ALARM_INDEX ]; + + if ( readCount == readData.fpgaPreviousCount ) + { + if ( TRUE == readData.fpgaIsConditionClear ) + { + readData.fpgaErrorOccurredStartTime = getMSTimerCount(); + readData.fpgaIsConditionClear = FALSE; + } + else if ( TRUE == didTimeout( readData.fpgaErrorOccurredStartTime, readData.fpgaPersistentTriggerPeriod ) ) + { + SET_ALARM_WITH_1_U32_DATA( fpgaPersistentAlarmGroup[ group ].fpgaAlarm, sensorIndex ); + } + } + else + { + readData.fpgaIsConditionClear = TRUE; + } + + if ( errorCount == errorData.fpgaPreviousCount ) + { + if ( TRUE == errorData.fpgaIsConditionClear ) + { + errorData.fpgaErrorOccurredStartTime = getMSTimerCount(); + errorData.fpgaIsConditionClear = FALSE; + } + else if ( TRUE == didTimeout( errorData.fpgaErrorOccurredStartTime, errorData.fpgaPersistentTriggerPeriod ) ) + { + SET_ALARM_WITH_1_U32_DATA( fpgaPersistentAlarmGroup[ group ].fpgaAlarm, sensorIndex ); + } + } + else + { + errorData.fpgaIsConditionClear = TRUE; + } + + readData.fpgaPreviousCount = readCount; + errorData.fpgaPreviousCount = errorCount; + + } + else + { + // TODO software fault + } +} + /**@}*/ Index: PersistentAlarm.h =================================================================== diff -u -r54a9bd09d6714d7faaa186959988a75ef3b83557 -r2bd145db589fc7533cab20e3009addf58eef0dbc --- PersistentAlarm.h (.../PersistentAlarm.h) (revision 54a9bd09d6714d7faaa186959988a75ef3b83557) +++ PersistentAlarm.h (.../PersistentAlarm.h) (revision 2bd145db589fc7533cab20e3009addf58eef0dbc) @@ -29,6 +29,30 @@ * @{ */ +// ********** public definitions ********** + +#ifdef _DG_ +typedef enum +{ + TWO_WIRE_ADC_TEMP_SENSORS = 0, + THD_ADC_TEMP_SENSORS, + TDI_ADC_TEMP_SENSORS, + TRO_ADC_TEMP_SENSORS, + CPI_COND_SENSOR, + CPO_COND_SENSOR, + PRESSURE_SENSORS, + FLOW_SENSORS, + NUM_OF_FPGA_SENSOR_GROUPS, +} FPGA_PERSISTENT_ALARMS_GROUP_T; +#endif + +#ifdef _HD_ +typedef enum +{ + +} FPGA_PERSISTENT_ALARMS_GROUP_T; +#endif + // ********** public function prototypes ********** // Persistent period resolution is in ms @@ -37,6 +61,8 @@ BOOL isPersistentAlarmConditionCleared( ALARM_ID_T alarmIndex, BOOL const isErrorOccurred ); void resetPersistentAlarmTimer( ALARM_ID_T alarmId ); +void checkFPGAPersistentAlarms( FPGA_PERSISTENT_ALARMS_GROUP_T group, U32 errorCount, U32 readCount, U32 sensorIndex ); + /**@}*/ #endif