Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r6311eb9b65fdeec7a285d25e07f3932ac0fb6cf1 -rce48f926049a50239537917cda7eff06557a80bf --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 6311eb9b65fdeec7a285d25e07f3932ac0fb6cf1) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision ce48f926049a50239537917cda7eff06557a80bf) @@ -1,121 +1,147 @@ -/************************************************************************** - * - * 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. - * - **************************************************************************/ +/************************************************************************** +* +* 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 AlarmMgmt.h +* +* @author (last) Sean Nash +* @date (last) 14-Oct-2020 +* +* @author (original) Sean Nash +* @date (original) 07-Nov-2019 +* +***************************************************************************/ #ifndef __ALARM_MGMT_H__ #define __ALARM_MGMT_H__ -// ********** public definitions ********** +#include "HDCommon.h" -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; +/** + * @defgroup AlarmManagement AlarmManagement + * @brief Alarm Management service module. Provides general alarm management + * functionality including support functions for triggering and clearing + * specific alarms. + * + * @addtogroup AlarmManagement + * @{ + */ -typedef enum Alarm_Priorities -{ - ALARM_PRIORITY_NONE = 0, - ALARM_PRIORITY_LOW, - ALARM_PRIORITY_MEDIUM, - ALARM_PRIORITY_HIGH, - NUM_OF_ALARM_PRIORITIES -} ALARM_PRIORITY_T; +// ********** public definitions ********** +#include "AlarmDefs.h" + +/// Interval (in ms) at which alarm lamp and audio control will be executed. +#define ALARM_LAMP_AND_AUDIO_CONTROL_INTERVAL_MS 250 + +#define MAX_ALARM_VOLUME_LEVEL 5 +#define MAX_ALARM_VOLUME_ATTENUATION 4 +#define MIN_ALARM_VOLUME_ATTENUATION 0 + +/// Enumeration of alarm actions. +typedef enum Alarm_Actions +{ + ALARM_ACTION_STOP = 0, ///< Alarm state requests HD in safe state (pumps stopped, heater off, valves in safe state) + ALARM_ACTION_RESUME, ///< User selected resume from alarm recovery options + ALARM_ACTION_RINSEBACK, ///< User selected rinseback from alarm recovery options + ALARM_ACTION_END_TREATMENT, ///< User selected end treatment from alarm recovery options + ALARM_ACTION_ACK, ///< User selected Ack from alarm recovery options + NUMBER_OF_ALARM_ACTIONS ///< Number of alarm actions +} ALARM_ACTION_T; + +/// Alarm data types list. 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_TYPE_NONE = 0, ///< No data given. + ALARM_DATA_TYPE_U32 = 1, ///< Alarm data is unsigned 32-bit integer type. + ALARM_DATA_TYPE_S32 = 2, ///< Alarm data is signed 32-bit integer type. + ALARM_DATA_TYPE_F32 = 3, ///< Alarm data is 32-bit floating point type. + ALARM_DATA_TYPE_BOOL = 4, ///< Alarm data is 32-bit boolean type. + NUM_OF_ALARM_DATA_TYPES ///< Total number of alarm data types. } ALARM_DATA_TYPES_T; -#pragma pack(push,4) +#pragma pack(push, 4) +/// Record structure for detailing the properties of the current composite alarm status. 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 + 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) + BOOL alarmsToEscalate; ///< Are any active alarms due to escalate (should UI show count down timer?) + 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 topAlarmConditionnDetected; ///< Condition for top alarm is still being detected + 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 noDialRecirc; ///< No dialysate re-circulation allowed at this time + BOOL usrACKRequired; ///< The user must acknowledge top alarm + BOOL noMinimize; ///< Prevent user from minimizing the alarm window + BOOL lampOn; ///< The alarm lamp is on } COMP_ALARM_STATUS_T; +/// Record structure for unsigned integer alarm data. typedef struct { - U32 data; + U32 data; ///< Alarm data of unsigned integer type. } ALARM_DATA_U32_T; +/// Record structure for signed integer alarm data. typedef struct { - S32 data; + S32 data; ///< Alarm data of signed integer type. } ALARM_DATA_S32_T; +/// Record structure for floating point alarm data. typedef struct { - F32 data; + F32 data; ///< Alarm data of floating point type. } ALARM_DATA_F32_T; +/// Record structure for boolean alarm data. typedef struct { - BOOL data; + BOOL data; ///< Alarm data of boolean type. } ALARM_DATA_BOOL_T; +/// Record structure for alarm data of any supported type. typedef union { - ALARM_DATA_U32_T uInt; - ALARM_DATA_S32_T sInt; - ALARM_DATA_F32_T flt; - ALARM_DATA_BOOL_T bln; + ALARM_DATA_U32_T uInt; ///< Alarm data of unsigned integer type. + ALARM_DATA_S32_T sInt; ///< Alarm data of signed integer type. + ALARM_DATA_F32_T flt; ///< Alarm data of floating point type. + ALARM_DATA_BOOL_T bln; ///< Alarm data of boolean type. } ALARM_DATAS_T; +/// Record structure for alarm data including the data type to aid in interpretation. typedef struct { - ALARM_DATA_TYPES_T dataType; - ALARM_DATAS_T data; + ALARM_DATA_TYPES_T dataType; ///< The type of alarm data provided. + ALARM_DATAS_T data; ///< The alarm data of specified type. } ALARM_DATA_T; +#pragma pack(pop) + +#pragma pack(push, 2) +/// Payload record structure for an alarm status message. +typedef struct +{ + U32 alarmState; ///< Alarm state: 0 = no alarms, 1 = low priority, 2 = medium priority, 3 = high priority + U32 alarmTop; ///< ID of top active alarm + U32 escalatesIn; ///< Top active alarm escalates in this many seconds + U32 silenceExpiresIn; ///< Silencing of alarms expires in this many seconds + U16 alarmsFlags; ///< Bit flags: 1 = true, 0 = false for each bit flag +} ALARM_COMP_STATUS_PAYLOAD_T; #pragma pack(pop) +/// Listing of specific software faults for logging purposes. typedef enum { SW_FAULT_ID_NONE = 0, @@ -138,30 +164,100 @@ 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_GET_INVALID_BUFFER, // 20 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_IN_STATE, SW_FAULT_ID_FPGA_INVALID_OUT_STATE, - SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, + SW_FAULT_ID_FPGA_WRITE_CMD_TOO_MUCH_DATA, // 25 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_FPGA_READ_RSP_TOO_MUCH_DATA, SW_FAULT_ID_MSG_QUEUES_ADD_QUEUE_FULL, - SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, + SW_FAULT_ID_MSG_QUEUES_ADD_INVALID_QUEUE, // 30 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_MSG_QUEUES_IS_FULL_INVALID_QUEUE, SW_FAULT_ID_WATCHDOG_INVALID_SELF_TEST_STATE, - SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, + SW_FAULT_ID_ALARM_MGMT_INVALID_FIFO_TO_RESET, // 35 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_IN_FLOW_SET_TOO_HIGH, 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_INVALID_DIAL_OUT_PUMP_STATE, // 40 SW_FAULT_ID_DIAL_OUT_FLOW_SET_TOO_HIGH, + SW_FAULT_ID_ALARM_MGMT_AUDIO_INVALID_ALARM_STATE, + SW_FAULT_ID_FPGA_INVALID_ALARM_AUDIO_PARAM, + SW_FAULT_ID_RTC_EXEC_INVALID_STATE, + SW_FAULT_ID_RTC_SELF_TEST_INVALID_STATE, // 45 + SW_FAULT_ID_RTC_TRANSACTION_SERVICE_INVALID_STATE, + SW_FAULT_ID_PRES_OCCL_INVALID_STATE, + SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_SIGNAL_ACTION, + SW_FAULT_ID_ALARM_MGMT_INVALID_USER_ACTION, + SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL, // 50 + SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, + SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, + SW_FAULT_ID_MODE_TREATMENT_INVALID_ALARM_ACTION, + SW_FAULT_ID_MODE_PRIME_RESERVOIR_MGMT_INVALID_STATE, + SW_FAULT_ID_DIALYSIS_INVALID_STATE, // 55 + SW_FAULT_ID_DIALYSIS_INVALID_UF_STATE, + SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, + SW_FAULT_ID_MODE_TREATMENT_INVALID_STATE, + SW_FAULT_ID_INTERRUPTS_INVALID_EDGE_DETECTED, // 60 + SW_FAULT_ID_INVALID_DG_PRESSURE_ID, + SW_FAULT_ID_CAN_PARITY_ERROR, + SW_FAULT_ID_CAN_PASSIVE_WARNING, + SW_FAULT_ID_CAN_OFF_ERROR, + SW_FAULT_ID_FPGA_UART_FRAME_ERROR, // 65 + SW_FAULT_ID_FPGA_UART_OVERRUN_ERROR, + SW_FAULT_ID_UTIL_TIME_WINDOWED_COUNT_ERROR, + SW_FAULT_ID_ACCEL_INVALID_STATE, + SW_FAULT_ID_ACCEL_GET_INVALID_AXIS, + SW_FAULT_ID_ACCEL_GET_MAX_INVALID_AXIS, // 70 + SW_FAULT_ID_ACCEL_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_UTIL_INVALID_WIN_COUNT, + SW_FAULT_ID_UTIL_INVALID_WIN_MAX_COUNT, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_STATE, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_PARAM, // 75 + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_U32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_S32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_SET_F32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_U32_PARAM, + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_S32_PARAM, // 80 + SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_GET_F32_PARAM, + SW_FAULT_ID_PERSISTENT_ALARM_INVALID_INDEX, + SW_FAULT_ID_HD_VALVES_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_HD_VALVES_INVALID_EXEC_STATE, + SW_FAULT_ID_HD_VALVES_INVALID_VALVE_SELECTED, // 85 + SW_FAULT_ID_HD_VALVES_INVALID_AIR_TRAP_REQUEST, + SW_FAULT_ID_HD_VALVES_INVALID_CONTROL_MODE_SELECTED, + SW_FAULT_ID_HD_VAVLES_INVALID_POSITION_SELECTED, + SW_FAULT_ID_AIR_TRAP_INVALID_STATE, + SW_FAULT_ID_AIR_TRAP_INVALID_LEVEL_SENSOR, // 90 + SW_FAULT_ID_DIALYSIS_INVALID_SALINE_BOLUS_STATE, + SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, + SW_FAULT_ID_MODE_PRE_TREATMENT_PRIME_INVALID_STATE, + SW_FAULT_ID_SYSTEM_COMM_INVALID_FRAME_SIZE, + SW_FAULT_ID_SYSTEM_CMMM_CAN_TRANSMIT_REJECTED, // 95 + SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE, + SW_FAULT_ID_RINSEBACK_INVALID_STATE, + SW_FAULT_ID_TREATMENT_END_INVALID_STATE, + SW_FAULT_ID_TREATMENT_RECIRC_INVALID_STATE, + SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, // 100 + SW_FAULT_ID_MODE_PRIME_INVALID_ALARM_ACTION, + SW_FAULT_ID_INVALID_NVDATAMGMT_EXEC_CAL_STATE, + SW_FAULT_ID_HD_INVALID_NO_CARTRIDGE_SELF_TEST_STATE, + SW_FAULT_ID_HD_INVALID_DRY_SELF_TEST_STATE, + SW_FAULT_ID_HD_INVALID_WET_SELF_TEST_STATE, // 105 + SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_RECIRC_STATE, + SW_FAULT_ID_HD_INVALID_COMMAND_RESPONSE_ID, + SW_FAULT_ID_HD_INVALID_RESERVOIR_ID, + SW_FAULT_ID_HD_INVALID_VALVE_SETTING_ID, + SW_FAULT_ID_HD_SYRINGE_INVALID_BOLUS_CMD, // 110 + SW_FAULT_ID_HD_SYRINGE_INVALID_CONT_CMD, + SW_FAULT_ID_HD_SYRINGE_INVALID_VREF, + SW_FAULT_ID_HD_SYRINGE_INVALID_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; @@ -173,14 +269,25 @@ 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 ); +void clearAlarm( ALARM_ID_T alarm ); +void clearAlarmCondition( ALARM_ID_T alarm ); +void setAlarmUserActionEnabled( ALARM_USER_ACTION_T action, BOOL enabled ); +void signalAlarmSilence( ALARM_SILENCE_CMD_T cmd ); +void signalAlarmUserActionInitiated( ALARM_USER_ACTION_T action ); +BOOL isAlarmActive( ALARM_ID_T alarm ); +BOOL isAnyAlarmActive( void ); +BOOL isDialysateRecircBlocked( void ); +BOOL doesAlarmStatusIndicateStop( void ); +ALARM_PRIORITY_T getCurrentAlarmStatePriority( void ); +BOOL isAlarmRecoverable( ALARM_ID_T alarm ); +void setAlarmAudioVolume( U32 volumeLevel ); -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 ); +BOOL testResetAlarmStartOverride( U32 alarmID ); +BOOL testClearAllAlarms( U32 key ); +/**@}*/ + #endif