Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r37a8a58b766a496b39241dd7ae46dc10dbda35e4 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 37a8a58b766a496b39241dd7ae46dc10dbda35e4) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -17,7 +17,8 @@ #include "AirTrap.h" #include "AlarmMgmt.h" -#include "FPGA.h" +#include "FPGA.h" +#include "ModeTreatmentParams.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -31,7 +32,9 @@ // ********** private definitions ********** -#define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the air trap data is published on the CAN bus. +#define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the air trap data is published on the CAN bus. +#define AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE ( MS_PER_SECOND * 2 / TASK_PRIORITY_INTERVAL ) ///< persistence period for illegal level sensors fault. +#define VENOUS_LINE_VOLUME_ML ( 50.0 ) ///< TODO volume (in mL) of venous portion of blood circuit line. /// Defined states for the air trap controller state machine. typedef enum AirTrap_States @@ -65,7 +68,11 @@ static U32 airTrapSelfTestTimerCount = 0; ///< timer counter for air trap self-test. static BOOL pendingStartAirTrapController = FALSE; ///< flag indicates an air trap controller start request is pending. -static BOOL pendingStopAirTrapController = FALSE; ///< flag indicates an air trap controller stop request is pending. +static BOOL pendingStopAirTrapController = FALSE; ///< flag indicates an air trap controller stop request is pending. + +static U32 fillStartTime = 0; ///< time stamp for start of air trap fill. + +static U32 airTrapIllegalLevelSensorsCtr = 0; ///< timer counter for illegal level sensor fault. // ********** private function prototypes ********** @@ -86,6 +93,7 @@ { resetAirTrap(); airTrapSelfTestState = AIR_TRAP_SELF_TEST_STATE_START; + airTrapIllegalLevelSensorsCtr = 0; } /*********************************************************************//** @@ -157,8 +165,8 @@ /*********************************************************************//** * @brief * The execAirTrapMonitor function executes the air trap monitor. - * @details Inputs: TBD - * @details Outputs: airTrapLevels[] + * @details Inputs: FPGA air trap levels GPIO pin levels, airTrapIllegalLevelSensorsCtr + * @details Outputs: airTrapLevels[], airTrapIllegalLevelSensorsCtr * @return none *************************************************************************/ void execAirTrapMonitor( void ) @@ -173,20 +181,73 @@ // check level readings are valid if ( ( TRUE == lower ) && ( FALSE == upper ) ) { - // TODO - fault if illegal level readings persist - // TODO - close valve and end valve control + if ( ++airTrapIllegalLevelSensorsCtr >= AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE ) + { + activateAlarmNoData( ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS ); + } } + else + { + airTrapIllegalLevelSensorsCtr--; + } } /*********************************************************************//** * @brief + * The execAirTrapMonitorPriming function executes the air trap monitor + * for cartridge priming during pre-treatment mode. + * @details Inputs: airTrapLevels[], airTrapFillAlarmCtr + * @details Outputs: airTrapFillAlarmCtr + * @return none + *************************************************************************/ +void execAirTrapMonitorPriming( void ) +{ + // TODO - implement when priming sub-mode of pre-treatment mode is implemented. +} + +/*********************************************************************//** + * @brief + * The execAirTrapMonitorTreatment function executes the air trap monitor + * for treatment mode. + * @details Inputs: airTrapLevels[], airTrapFillAlarmCtr + * @details Outputs: airTrapFillAlarmCtr + * @return none + *************************************************************************/ +void execAirTrapMonitorTreatment( void ) +{ + // check air trap fill timeout during treatment + if ( airTrapControllerState > AIR_TRAP_MANUAL_CONTROL_STATE ) + { + if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) + { + F32 bldFlowRate = (F32)getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); // function will never return zero + F32 fillTimeoutMS = ( VENOUS_LINE_VOLUME_ML / bldFlowRate ) * (F32)SEC_PER_MIN * (F32)MS_PER_SECOND; + + if ( TRUE == didTimeout( fillStartTime, fillTimeoutMS ) ) + { + activateAlarmNoData( ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS ); + setValveAirTrap( STATE_CLOSED ); + } + } + } +} + +/*********************************************************************//** + * @brief * The execAirTrapController function executes the air trap control state machine. * @details Inputs: airTrapControllerState * @details Outputs: airTrapControllerState * @return none *************************************************************************/ void execAirTrapController( void ) { + // if we've faulted, close valve and go to manual control + if ( MODE_FAUL == getCurrentOperationMode() ) + { + airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; + pendingStartAirTrapController = FALSE; + } + // execute air trap state machine switch( airTrapControllerState ) { @@ -261,6 +322,7 @@ else if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) { setValveAirTrap( STATE_OPEN ); + fillStartTime = getMSTimerCount(); result = AIR_TRAP_VALVE_OPEN_STATE; } Index: firmware/App/Controllers/AirTrap.h =================================================================== diff -u -rd9d085cdca67200ecddbdfbc75c489e704b23081 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision d9d085cdca67200ecddbdfbc75c489e704b23081) +++ firmware/App/Controllers/AirTrap.h (.../AirTrap.h) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -53,7 +53,9 @@ void initAirTrap( void ); void resetAirTrap( void ); void execAirTrapController( void ); -void execAirTrapMonitor( void ); +void execAirTrapMonitor( void ); +void execAirTrapMonitorPriming( void ); +void execAirTrapMonitorTreatment( void ); void startAirTrapControl( void ); void endAirTrapControl( void ); Index: firmware/App/HDCommon.h =================================================================== diff -u -r61153247029a9a246ca1beadc66d772e3e583e4e -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 61153247029a9a246ca1beadc66d772e3e583e4e) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -31,9 +31,9 @@ #ifndef _RELEASE_ #define UF_TEST_ENABLED 1 // ultrafiltration test build (hard codes treatment params, re-purposes off/stop buttons) -//#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) +#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) #ifndef _VECTORCAST_ - #define DISABLE_UI_TREATMENT_WORKFLOW 1 // disable UI treatment workflow +// #define DISABLE_UI_TREATMENT_WORKFLOW 1 // disable UI treatment workflow // #define RM46_EVAL_BOARD_TARGET 1 // limited build runs on RM46 eval board // #define BREADBOARD_TARGET 1 // old breadboard system build - no longer used? // #define SIMULATE_UI 1 // build w/o requirement that UI be there @@ -54,7 +54,7 @@ // #define RAW_FLOW_SENSOR_DATA 1 // test build will not filter flow sensor data // #define READ_FPGA_ASYNC_DATA 1 // test build reads non-priority register page every other time // #define FLOW_DEBUG 1 // test build sends flow, signal strength, and occlusion readings to debug UART - #define EMC_TEST_BUILD 1 // EMC test build - HD/DG run separately but connected, HD pumps toggle on/off w/ stop button +// #define EMC_TEST_BUILD 1 // EMC test build - HD/DG run separately but connected, HD pumps toggle on/off w/ stop button #define ALARMS_DEBUG 1 // triggered alarms sent to debug UART #include Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r37a8a58b766a496b39241dd7ae46dc10dbda35e4 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 37a8a58b766a496b39241dd7ae46dc10dbda35e4) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -16,15 +16,15 @@ ***************************************************************************/ #include "AlarmLamp.h" -#ifdef EMC_TEST_BUILD // TODO - test code #include "BloodFlow.h" +#ifdef EMC_TEST_BUILD // TODO - test code #include "Buttons.h" +#endif #include "DialInFlow.h" #include "DialOutFlow.h" -#include "Valves.h" -#endif -#include "OperationModes.h" #include "ModeFault.h" +#include "OperationModes.h" +#include "Valves.h" /** * @addtogroup HDFaultMode @@ -44,6 +44,7 @@ *************************************************************************/ void initFaultMode( void ) { + // TODO - anything to do here? } /*********************************************************************//** @@ -55,6 +56,7 @@ *************************************************************************/ void transitionToFaultMode( void ) { + // TODO - anything to do here? } /*********************************************************************//** @@ -66,7 +68,19 @@ *************************************************************************/ U32 execFaultMode( void ) { -#ifdef EMC_TEST_BUILD // TODO - test code +#ifndef EMC_TEST_BUILD + // ensure all pumps are stopped + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + // ensure all valves are in safe position + setValveAirTrap( STATE_CLOSED ); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); +#else + // TODO - EMC test code - remove later static U32 toggle = 0; static BOOL button_state = FALSE; BOOL stop = isStopButtonPressed(); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r37a8a58b766a496b39241dd7ae46dc10dbda35e4 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 37a8a58b766a496b39241dd7ae46dc10dbda35e4) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -258,11 +258,13 @@ currentTreatmentState = TREATMENT_END_STATE; break; } - + // broadcast treatment data broadcastTreatmentTimeAndState(); broadcastTreatmentSettingsRanges(); + // call various execs for treatment mode execTreatmentReservoirMgmt(); + execAirTrapMonitorTreatment(); #endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 5 min Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r37a8a58b766a496b39241dd7ae46dc10dbda35e4 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 37a8a58b766a496b39241dd7ae46dc10dbda35e4) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -640,7 +640,7 @@ *************************************************************************/ U32 getTreatmentParameterU32( TREATMENT_PARAM_T param ) { - U32 result = 0; + U32 result = 1; // validate parameter if ( param <= TREATMENT_PARAM_LAST_UINT ) @@ -668,7 +668,7 @@ *************************************************************************/ S32 getTreatmentParameterS32( TREATMENT_PARAM_T param ) { - S32 result = 0; + S32 result = 1; // validate parameter if ( ( param >= TREATMENT_PARAM_FIRST_INT ) && ( param <= TREATMENT_PARAM_LAST_INT ) ) @@ -696,7 +696,7 @@ *************************************************************************/ F32 getTreatmentParameterF32( TREATMENT_PARAM_T param ) { - F32 result = 0.0; + F32 result = 1.0; // validate parameter if ( ( param >= TREATMENT_PARAM_FIRST_F32 ) && ( param < NUM_OF_TREATMENT_PARAMS ) ) Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -rf1afa4d29a1fe03f229d7c3ed303d71c2c607ff2 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision f1afa4d29a1fe03f229d7c3ed303d71c2c607ff2) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -66,36 +66,36 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_FPGA_POST_TEST_FAILED { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_WATCHDOG_POST_TEST_FAILED { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_UI_COMM_POST_FAILED - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_OFF_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_OFF_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK - { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_OFF_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_IN_PUMP_OFF_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK + { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_WATCHDOG_EXPIRED { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_RTC_COMM_ERROR { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_RTC_CONFIG_ERROR { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_DG_COMM_TIMEOUT { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_UI_COMM_TIMEOUT { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_COMM_TOO_MANY_BAD_CRCS - { ALARM_PRIORITY_LOW, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_TREATMENT_STOPPED_BY_USER - { ALARM_PRIORITY_MEDIUM, ALM_ESC_1_MIN, ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_SITTING_WARNING - { ALARM_PRIORITY_MEDIUM, ALM_ESC_5_MIN, ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK, FALSE, TRUE , FALSE, TRUE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME - { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK + { ALARM_PRIORITY_LOW, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_TREATMENT_STOPPED_BY_USER + { ALARM_PRIORITY_MEDIUM, ALM_ESC_1_MIN, ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_SITTING_WARNING + { ALARM_PRIORITY_MEDIUM, ALM_ESC_5_MIN, ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK, FALSE, TRUE , FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_CAN_MESSAGE_NOT_ACKED - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_OCCLUSION_BLOOD_PUMP - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_OCCLUSION_DIAL_IN_PUMP - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_OCCLUSION_DIAL_OUT_PUMP - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_ARTERIAL_PRESSURE_LOW - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_ARTERIAL_PRESSURE_HIGH - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_VENOUS_PRESSURE_LOW - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_VENOUS_PRESSURE_HIGH + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_OCCLUSION_BLOOD_PUMP + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_OCCLUSION_DIAL_IN_PUMP + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_OCCLUSION_DIAL_OUT_PUMP + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_ARTERIAL_PRESSURE_LOW + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_ARTERIAL_PRESSURE_HIGH + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_VENOUS_PRESSURE_LOW + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_VENOUS_PRESSURE_HIGH { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_UF_RATE_TOO_HIGH_ERROR { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_UF_VOLUME_ACCURACY_ERROR { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_RTC_BATTERY_LOW @@ -112,13 +112,13 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_HD_COMM_TIMEOUT { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE, TRUE , TRUE, TRUE, TRUE, TRUE, TRUE, FALSE }, // ALARM_ID_VALVE_CONTROL_FAILURE - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_FLOW_VS_MOTOR_SPEED_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_OUT_PUMP_FLOW_VS_MOTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY { ALARM_PRIORITY_MEDIUM, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_DG_SOFTWARE_FAULT @@ -130,8 +130,8 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_CRITICAL_DATA_ERROR { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_HD_ACCELEROMETER_SELF_TEST_FAILURE { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_DG_ACCELEROMETER_SELF_TEST_FAILURE - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_HD_EXCESSIVE_TILT - { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DG_EXCESSIVE_TILT + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_HD_EXCESSIVE_TILT + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_DG_EXCESSIVE_TILT { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_HD_SHOCK { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, // ALARM_ID_DG_SHOCK { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_HD_ACCELEROMETER_FAILURE @@ -144,7 +144,9 @@ { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_HD_VALVE_NOT_FUNCTIONAL { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_HD_VALVE_CURRENT_OUT_OF_RANGE { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_HD_VALVE_POSITION_OUT_OF_RANGE - { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_HD_VALVE_INVALID_AIR_TRAP_REQUEST + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , TRUE , FALSE }, // ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS + { ALARM_PRIORITY_HIGH, 0, ALARM_ID_NO_ALARM, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_AIR_TRAP_FILL_DURING_PRIME + { ALARM_PRIORITY_HIGH, ALM_ESC_4_MIN, ALARM_ID_BLOOD_SITTING_WARNING, FALSE, TRUE , FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, // ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT }; // *** This declaration will cause a compiler error if alarmTable does not have same # of alarms as the Alarm_List enumeration. @@ -456,6 +458,22 @@ BOOL result = alarmIsActive[ alarm ]; return result; +} + +/*********************************************************************//** + * @brief + * The isAlarmRecoverable function determines whether a given alarm is + * recoverable. + * @details Inputs: alarmTable[] + * @details Outputs: none + * @param alarm ID of alarm to check + * @return TRUE if given alarm is recoverable, FALSE if not + *************************************************************************/ +BOOL isAlarmRecoverable( ALARM_ID_T alarm ) +{ + BOOL result = ( TRUE == alarmTable[ alarm ].alarmNoClear ? FALSE : TRUE ); + + return result; } /*********************************************************************//** Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -rd9d085cdca67200ecddbdfbc75c489e704b23081 -raf2674758d7b9dbe05e348b318845975b423509f --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision d9d085cdca67200ecddbdfbc75c489e704b23081) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision af2674758d7b9dbe05e348b318845975b423509f) @@ -210,7 +210,8 @@ 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 isAlarmActive( ALARM_ID_T alarm ); +BOOL isAlarmRecoverable( ALARM_ID_T alarm ); BOOL testSetAlarmStatusPublishIntervalOverride( U32 value ); BOOL testResetAlarmStatusPublishIntervalOverride( void );