Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rb156b12139fea40401c94b512503a2ceced69e22 -r9f04920d50500b59778222eb7a1b082e56c171c6 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision b156b12139fea40401c94b512503a2ceced69e22) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 9f04920d50500b59778222eb7a1b082e56c171c6) @@ -8,7 +8,7 @@ * @file SelfTests.c * * @author (last) Sean Nash -* @date (last) 10-Feb-2023 +* @date (last) 08-Mar-2023 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -110,6 +110,7 @@ static F32 peakVenousPressure; ///< Holds the peak normal venous pressure reading. static F32 decayedArterialPressure; ///< Holds the decayed arterial pressure reading after blood pump is stopped. static F32 decayedVenousPressure; ///< Holds the decayed venous pressure reading after blood pump is stopped. +static BOOL dryPressureTestsCompleted; ///< Flag indicates dry cartridge pressure leak testing has been completed. static BOOL wetSelfTestsResult; ///< Result of wet self-tests. static WET_SELF_TESTS_STATE_T currentWetSelfTestsState; ///< Current state of the wet self-tests state machine. @@ -143,7 +144,7 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestStartState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeInstalledCheckState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeLoadedCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousState( void ); @@ -221,6 +222,7 @@ signalBloodPumpHardStop(); signalDialInPumpHardStop(); signalDialOutPumpHardStop(); + cmdStopDGTrimmerHeater(); if ( TRUE == isAlarmActive( ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ) ) { @@ -395,6 +397,7 @@ pressureSelfTestNormalizedStartTime = 0; previousNormalArterialPressure = 0.0; previousNormalVenousPressure = 0.0; + dryPressureTestsCompleted = FALSE; selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); selfTestCartridgeSettleTime = getMSTimerCount(); @@ -443,7 +446,7 @@ break; case DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE: - currentDrySelfTestsState = handleDrySelfTestCartridgeInstalledCheckState(); + currentDrySelfTestsState = handleDrySelfTestCartridgeLoadedCheckState(); break; case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE: @@ -509,21 +512,13 @@ if ( calcTimeSince( selfTestPreviousPublishDataTime ) >= SELF_TEST_TIME_DATA_PUB_INTERVAL ) { U32 const elapsedSelfTestTimeInSecs = calcTimeSince( selfTestStartTime ) / MS_PER_SECOND; + SELF_TEST_DRY_PAYLOAD_T data; selfTestPreviousPublishDataTime = getMSTimerCount(); - if ( elapsedSelfTestTimeInSecs <= MAX_DRY_SELF_TEST_TIME ) - { - SELF_TEST_DRY_PAYLOAD_T data; - - data.timeout = MAX_DRY_SELF_TEST_TIME; - data.countdown = ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ); - broadcastData( MSG_ID_HD_DRY_SELF_TEST_PROGRESS, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); - } - else - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DRY_SELF_TEST_TIMEOUT, currentDrySelfTestsState ); - } + data.timeout = MAX_DRY_SELF_TEST_TIME; + data.countdown = ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ); + broadcastData( MSG_ID_HD_DRY_SELF_TEST_PROGRESS, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); } } @@ -767,7 +762,15 @@ } else if ( ( TRUE == syringeHome ) && ( TRUE == syringeStopped ) && ( FALSE == syringePreloaded ) ) { - preloadSyringePlunger(); + // Is syringe loaded? + if ( TRUE == isSyringeDetected() ) + { + activateAlarmNoData( ALARM_ID_HD_SYRINGE_DETECTED ); + } + else + { + preloadSyringePlunger(); + } } else if ( TRUE == syringePreloaded ) { @@ -1027,13 +1030,13 @@ /*********************************************************************//** * @brief - * The handleDrySelfTestCartridgeInstalledCheckState function verifies that - * a cartridge has been installed by looking at the OB reading. + * The handleDrySelfTestCartridgeLoadedCheckState function verifies a cartridge + * is installed by checking sufficient pressure at OB sensor. * @details Inputs: none * @details Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeInstalledCheckState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeLoadedCheckState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; @@ -1439,6 +1442,7 @@ if ( ( STATE_OPEN == getValveAirTrapStatus() ) && ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) { + dryPressureTestsCompleted = TRUE; state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; } @@ -1501,15 +1505,16 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_HD_SYRINGE_NOT_PRELOADED ) + preloadSyringePlunger(); } } } } else { #ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) // if no air pump, now we can allow fills to start + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) || // if no air pump, now we can allow fills to start + ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_DRY_SELF_TESTS ) ) ) // OR if Dry tests disabled { signalAllowDGFlushFills(); signalAllowDGFillRes1(); @@ -1573,6 +1578,24 @@ doorClosedRequired( FALSE, FALSE ); + // if not enough heparin alarm, pre-load pusher after retract completes + if ( TRUE == isAlarmActive( ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ) ) + { // prevent resume until syringe is retracted and pre-loaded + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); + if ( isSyringePumpRunning() != TRUE ) + { + if ( TRUE == isSyringePumpHome() ) + { + preloadSyringePlunger(); + } + else if ( TRUE == isSyringePumpPreLoaded() ) + { + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); + } + } + } + + // if resume request, resume dry self-tests if ( TRUE == selfTestsResumeRequested ) { // Restart self-test start time @@ -1588,9 +1611,17 @@ } else #endif - { - doorClosedRequired( FALSE, TRUE ); - state = DRY_SELF_TESTS_START_STATE; + { // if we've completed pressure testing, resume to syringe pump prime state, otherwise go back to start of dry self-tests + if ( TRUE == dryPressureTestsCompleted ) + { + doorClosedRequired( TRUE, TRUE ); + state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; + } + else + { + doorClosedRequired( FALSE, TRUE ); + state = DRY_SELF_TESTS_START_STATE; + } } } @@ -1782,6 +1813,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; } @@ -1816,6 +1848,7 @@ if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_FIRST_DISPLACEMENT_TIME_MS ) ) { signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE; } @@ -1925,6 +1958,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; } @@ -1967,6 +2001,7 @@ if ( TRUE == didTimeout( displacementStartTime, WET_SELF_TEST_SECOND_DISPLACEMENT_TIME_MS ) ) { signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE; }