/************************************************************************** * * Copyright (c) 2019-2019 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.h * * @date 07-Nov-2019 * @author S. Nash * * @brief header file for Alarm Management service module. * **************************************************************************/ #ifndef __ALARM_MGMT_H__ #define __ALARM_MGMT_H__ // ********** public definitions ********** typedef enum Alarm_List { ALARM_ID_NO_ALARM = 0, ALARM_ID_SOFTWARE_FAULT, ALARM_ID_STUCK_BUTTON_TEST_FAILED, ALARM_ID_FPGA_POST_TEST_FAILED, ALARM_ID_WATCHDOG_POST_TEST_FAILED, ALARM_ID_UI_COMM_POST_FAILED, // 5 ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, ALARM_ID_BLOOD_PUMP_MC_SPEED_CHECK, ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK, ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK, // 10 ALARM_ID_DIAL_IN_PUMP_MC_SPEED_CHECK, ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK, ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK, ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK, ALARM_ID_DIAL_OUT_PUMP_MC_SPEED_CHECK, // 15 ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK, ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK, ALARM_ID_WATCHDOG_EXPIRED, NUM_OF_ALARM_IDS } ALARM_ID_T; typedef enum Alarm_Priorities { ALARM_PRIORITY_NONE = 0, ALARM_PRIORITY_LOW, ALARM_PRIORITY_MEDIUM, ALARM_PRIORITY_HIGH, NUM_OF_ALARM_PRIORITIES } ALARM_PRIORITY_T; typedef enum Alarm_Data_Types { ALARM_DATA_TYPE_NONE = 0, ALARM_DATA_TYPE_U32, ALARM_DATA_TYPE_S32, ALARM_DATA_TYPE_F32, ALARM_DATA_TYPE_BOOL, NUM_OF_ALARM_DATA_TYPES } ALARM_DATA_TYPES_T; #pragma pack(push,4) typedef struct { ALARM_PRIORITY_T alarmsState; // current alarm priority level BOOL alarmsSilenced; // alarms are currently silenced? U32 alarmsSilenceStart; // time stamp for when alarms were silenced (ms) U32 alarmsSilenceExpiresIn; // time until alarm silence expires (seconds) U32 alarmsEscalatesIn; // time until alarm will escalate (seconds) ALARM_ID_T alarmTop; // ID of current top alarm that will drive lamp/audio and UI should be displaying right now BOOL systemFault; // a system fault is active? BOOL stop; // we should be in controlled stop right now BOOL noClear; // no recovery will be possible BOOL noResume; // treatment may not be resumed at this time BOOL noRinseback; // rinseback may not be initiated at this time BOOL noEndTreatment; // ending the treatment is not an option at this time BOOL noNewTreatment; // no new treatments may be started even if current treatment is ended BOOL bypassDialyzer; // the dialyzer should be bypassed at this time } COMP_ALARM_STATUS_T; typedef struct { U32 data; } ALARM_DATA_U32_T; typedef struct { S32 data; } ALARM_DATA_S32_T; typedef struct { F32 data; } ALARM_DATA_F32_T; typedef struct { BOOL data; } ALARM_DATA_BOOL_T; typedef union { ALARM_DATA_U32_T uInt; ALARM_DATA_S32_T sInt; ALARM_DATA_F32_T flt; ALARM_DATA_BOOL_T bln; } ALARM_DATAS_T; typedef struct { ALARM_DATA_TYPES_T dataType; ALARM_DATAS_T data; } ALARM_DATA_T; #pragma pack(pop) typedef enum { SW_FAULT_ID_NONE = 0, SW_FAULT_ID_ALARM_LAMP_INVALID_PATTERN_REQUESTED, SW_FAULT_ID_ALARM_LAMP_INVALID_SELF_TEST_STATE, SW_FAULT_ID_BLOOD_FLOW_SET_TOO_HIGH, SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_STATE, SW_FAULT_ID_BLOOD_FLOW_INVALID_BLOOD_PUMP_DIRECTION, // 5 SW_FAULT_ID_BUTTONS_INVALID_SELF_TEST_STATE, SW_FAULT_ID_BUTTONS_STOP_BUTTON_NOT_CONSUMED, SW_FAULT_ID_INT_ADC_DATA_OVERRUN, SW_FAULT_ID_INT_ADC_INVALID_CHANNEL_REQUESTED, SW_FAULT_ID_MODE_INIT_POST_INVALID_POST_STATE, // 10 SW_FAULT_ID_OP_MODES_ILLEGAL_MODE_TRANSITION_REQUESTED, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, SW_FAULT_ID_OP_MODES_INVALID_MODE_REQUESTED, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_ACTIVATE, // 15 SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_TO_CLEAR, SW_FAULT_ID_ALARM_MGMT_LAMP_INVALID_ALARM_STATE, SW_FAULT_ID_COMM_BUFFERS_ADD_TOO_MUCH_DATA, SW_FAULT_ID_COMM_BUFFERS_ADD_INVALID_BUFFER, SW_FAULT_ID_COMM_BUFFERS_GET_TOO_MUCH_DATA, // 20 SW_FAULT_ID_COMM_BUFFERS_GET_INVALID_BUFFER, SW_FAULT_ID_COMM_BUFFERS_PEEK_TOO_MUCH_DATA, SW_FAULT_ID_COMM_BUFFERS_PEEK_INVALID_BUFFER, SW_FAULT_ID_COMM_BUFFERS_COUNT_INVALID_BUFFER, SW_FAULT_ID_FPGA_INVALID_IN_STATE, // 25 SW_FAULT_ID_FPGA_INVALID_OUT_STATE, SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, SW_FAULT_ID_FPGA_WRITE_RSP_TOO_MUCH_DATA, SW_FAULT_ID_FPGA_READ_CMD_TOO_MUCH_DATA, SW_FAULT_ID_FPGA_READ_RSP_TOO_MUCH_DATA, // 30 SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL, SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, SW_FAULT_ID_MSG_QUEUES_GET_INVALID_QUEUE, SW_FAULT_ID_MSG_QUEUES_IS_EMPTY_INVALID_QUEUE, SW_FAULT_ID_MSG_QUEUES_IS_FULL_INVALID_QUEUE, // 35 SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, SW_FAULT_ID_DIAL_IN_FLOW_INVALID_DIAL_IN_PUMP_DIRECTION, SW_FAULT_ID_DIAL_IN_FLOW_INVALID_DIAL_IN_PUMP_STATE, SW_FAULT_ID_DIAL_IN_FLOW_SET_TOO_HIGH, // 40 SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_DIRECTION, SW_FAULT_ID_DIAL_OUT_FLOW_INVALID_DIAL_OUT_PUMP_STATE, SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; // ********** public function prototypes ********** void initAlarmMgmt( void ); void execAlarmMgmt( void ); void activateAlarmNoData( ALARM_ID_T alarm ); void activateAlarm1Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData ); void activateAlarm2Data( ALARM_ID_T alarm, ALARM_DATA_T alarmData1, ALARM_DATA_T alarmData2 ); void clearAlarm( ALARM_ID_T alarm ); BOOL isAlarmActive( ALARM_ID_T alarm ); BOOL testSetAlarmStatusPublishIntervalOverride( U32 value ); BOOL testResetAlarmStatusPublishIntervalOverride( void ); BOOL testSetAlarmStateOverride( U32 alarmID, BOOL value ); BOOL testResetAlarmStateOverride( U32 alarmID ); BOOL testSetAlarmStartOverride( U32 alarmID, U32 value ); BOOL testResetAlarmStartOverride( U32 alarmID ); #endif