Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r89c6599d70e2d217019c28636386923d3726b508 -r12708a04ae3365e11180182fc52d005c229a7bc6 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 89c6599d70e2d217019c28636386923d3726b508) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 12708a04ae3365e11180182fc52d005c229a7bc6) @@ -7,8 +7,8 @@ * * @file SelfTests.c * -* @author (last) Michael Garthwaite -* @date (last) 08-Mar-2023 +* @author (last) Sean Nash +* @date (last) 04-May-2023 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -27,6 +27,7 @@ #include "ModeTreatmentParams.h" #include "PresOccl.h" #include "SelfTests.h" +#include "Switches.h" #include "SyringePump.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -133,6 +134,7 @@ static void resetSelfTestsFlags( void ); static void setupForSelfTestsStop( void ); +static void setAlarmResumePerDoorAndLatch( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesState( void ); @@ -222,6 +224,7 @@ signalBloodPumpHardStop(); signalDialInPumpHardStop(); signalDialOutPumpHardStop(); + cmdStopDGTrimmerHeater(); if ( TRUE == isAlarmActive( ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ) ) { @@ -240,6 +243,30 @@ /*********************************************************************//** * @brief + * The setAlarmResumePerDoorAndLatch function sets alarm resume enable for + * stop states based on whether door and pump track are closed. + * @details Inputs: state of front door and pump track + * @details Outputs: resume alarm enabled/disabled + * @return none + *************************************************************************/ +static void setAlarmResumePerDoorAndLatch( void ) +{ + BOOL doorClosed = ( STATE_CLOSED == getSwitchStatus( FRONT_DOOR ) ? TRUE : FALSE ); + BOOL latchClosed = ( STATE_CLOSED == getSwitchStatus( PUMP_TRACK_SWITCH ) ? TRUE : FALSE ); + + // require front door and pump track to be closed before allowing resume + if ( ( TRUE == doorClosed ) && ( TRUE == latchClosed ) ) + { + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); + } + else + { + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); + } +} + +/*********************************************************************//** + * @brief * The transitionToNoCartSelfTests function resets anything required before * the start of no cartridge self-tests. * @details Inputs: none @@ -516,7 +543,7 @@ selfTestPreviousPublishDataTime = getMSTimerCount(); data.timeout = MAX_DRY_SELF_TEST_TIME; - data.countdown = ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ); + data.countdown = ( elapsedSelfTestTimeInSecs <= MAX_DRY_SELF_TEST_TIME ? ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ) : 0 ); broadcastData( MSG_ID_HD_DRY_SELF_TEST_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); } } @@ -727,7 +754,7 @@ for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) { - homeValve( valve ); + homeValve( valve, VALVE_FORCE_HOME, VALVE_NO_CARTRIDGE_PRESENT ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -876,6 +903,7 @@ { NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_STOPPED_STATE; + setAlarmResumePerDoorAndLatch(); doorClosedRequired( FALSE, FALSE ); // Restart self-test start time @@ -1011,7 +1039,7 @@ if ( getSoftwareConfigStatus( SW_CONFIG_ENABLE_WORN_OUT_CARTRIDGE ) != SW_CONFIG_ENABLE_VALUE ) #endif { - activateAlarmNoData( ALARM_ID_INSTALL_NEW_CARTRIDGE ); + activateAlarmNoData( ALARM_ID_HD_INSTALL_NEW_CARTRIDGE ); } #ifndef _RELEASE_ else @@ -1097,7 +1125,7 @@ // Check to see if sensor is within normal ranges before we execute pressure sensor tests if ( ( fabs( previousNormalArterialPressure ) > PRESSURE_CHECK_START_PRESSURE_TOLERANCE_MMHG ) || ( fabs( previousNormalVenousPressure ) > PRESSURE_CHECK_START_PRESSURE_TOLERANCE_MMHG ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, previousNormalArterialPressure, previousNormalVenousPressure ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, previousNormalArterialPressure, previousNormalVenousPressure ); } } } @@ -1113,7 +1141,7 @@ // Check to see if sensor is within normal ranges before we execute pressure sensor tests if ( ( fabs( previousNormalArterialPressure ) > PRESSURE_CHECK_START_PRESSURE_TOLERANCE_MMHG ) || ( fabs( previousNormalVenousPressure ) > PRESSURE_CHECK_START_PRESSURE_TOLERANCE_MMHG ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, previousNormalArterialPressure, previousNormalVenousPressure ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, previousNormalArterialPressure, previousNormalVenousPressure ); } else { @@ -1213,12 +1241,13 @@ if ( TRUE == didTimeout( pressureSelfTestVenousTestStartTime, VENOUS_PRESSURE_SELF_TEST_MAX_TEST_TIME ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, VENOUS_PRESSURE_SELF_TEST_FIRST_PASS_LIMIT_MMHG ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, VENOUS_PRESSURE_SELF_TEST_FIRST_PASS_LIMIT_MMHG ); setAirPumpState( AIR_PUMP_STATE_OFF ); } if ( TRUE == doesAlarmStatusIndicateStop() ) { + setAirPumpState( AIR_PUMP_STATE_OFF ); state = DRY_SELF_TESTS_STOPPED_STATE; setupForSelfTestsStop(); } @@ -1286,7 +1315,7 @@ if ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, arterialPressure ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, venousPressure, arterialPressure ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -1345,7 +1374,7 @@ } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialDecayDiff, venousDecayDiff ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialDecayDiff, venousDecayDiff ); } } @@ -1388,7 +1417,7 @@ } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialStabilityDiff, venousStabilityDiff ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialStabilityDiff, venousStabilityDiff ); } } @@ -1451,7 +1480,7 @@ // If pressures do not normalize within max t/o, alarm if ( TRUE == didTimeout( pressureSelfTestNormalizedStartTime, NORMALIZED_PRESSURE_SELF_TEST_TIME ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_NORMAL_TEST_FAILURE, arterialPressureDiff, venousPressureDiff ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_DRY_PRESSURE_NORMAL_TEST_FAILURE, arterialPressureDiff, venousPressureDiff ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -1545,10 +1574,8 @@ if ( TRUE == didTimeout( syringeOcclusionDelayStartTime, SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ) ) { - if ( FALSE == checkForPrimeOcclusion() ) // transition to complete state only when occlusion is removed + if ( FALSE == checkForSyringeOcclusion() ) // transition to complete state only when occlusion is removed { - // clear the occlusion alarm condition to allow user to resume - clearAlarmCondition( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION ); // Resume option will appear state = DRY_SELF_TESTS_COMPLETE_STATE; } } @@ -1574,6 +1601,7 @@ { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_STOPPED_STATE; + setAlarmResumePerDoorAndLatch(); doorClosedRequired( FALSE, FALSE ); // if not enough heparin alarm, pre-load pusher after retract completes @@ -1728,7 +1756,7 @@ else { #ifndef _RELEASE_ - if ( ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_BLOOD_LEAK_SELF_TEST ) == SW_CONFIG_ENABLE_VALUE ) ) + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_BLOOD_LEAK_SELF_TEST ) ) ) { state = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; } @@ -1741,7 +1769,7 @@ } else { - activateAlarmNoData( ALARM_ID_PRE_TREATMENT_WET_PRIME_TEST_FAILURE ); + activateAlarmNoData( ALARM_ID_HD_PRE_TREATMENT_WET_PRIME_TEST_FAILURE ); } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -1811,6 +1839,7 @@ if ( DG_CMD_REQUEST_REJECT_REASON_NONE == cmdResp.rejectCode ) { setDialInPumpTargetFlowRate( DIP_FLOW_RATE_FIRST_DISPLACEMENT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + cmdStartDGTrimmerHeater(); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE; } @@ -1845,6 +1874,7 @@ if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_FIRST_DISPLACEMENT_TIME_MS ) ) { signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE; } @@ -1907,11 +1937,11 @@ { if ( fabs( resOneDiffAfterDisplacement - resTwoDiffAfterDisplacement) > WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_WET_LC_TEST_FAILURE, resOneDiffAfterDisplacement, resTwoDiffAfterDisplacement ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_WET_LC_TEST_FAILURE, resOneDiffAfterDisplacement, resTwoDiffAfterDisplacement ); } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_WET_FLOW_TEST_FAILURE, averageDisp, fmdIntegratedVolume ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_WET_FLOW_TEST_FAILURE, averageDisp, fmdIntegratedVolume ); } } @@ -1954,6 +1984,7 @@ if ( DG_CMD_REQUEST_REJECT_REASON_NONE == cmdResp.rejectCode ) { setDialInPumpTargetFlowRate( DIP_FLOW_RATE_SECOND_DISPLACEMENT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + cmdStartDGTrimmerHeater(); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_SECOND_DISPLACEMENT_STATE; } @@ -1996,6 +2027,7 @@ if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_SECOND_DISPLACEMENT_TIME_MS ) ) { signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE; } @@ -2048,11 +2080,11 @@ { if ( fabs( resOneDiffAfterDisplacement - resTwoDiffAfterDisplacement) > WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_WET_LC_TEST_FAILURE, resOneDiffAfterDisplacement, resTwoDiffAfterDisplacement ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_WET_LC_TEST_FAILURE, resOneDiffAfterDisplacement, resTwoDiffAfterDisplacement ); } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_WET_FLOW_TEST_FAILURE, avgDisp, fmdIntegratedVolume ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_PRE_TREATMENT_WET_FLOW_TEST_FAILURE, avgDisp, fmdIntegratedVolume ); } } @@ -2077,6 +2109,7 @@ { WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_STOPPED_STATE; + setAlarmResumePerDoorAndLatch(); doorClosedRequired( FALSE, FALSE ); if ( TRUE == selfTestsResumeRequested )