Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rcc4f8440e8ad7fa8f2ced2467d922be7422c344c -r9944e4f766d9eb4cdf7a5ca7587e3ceca556e106 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision cc4f8440e8ad7fa8f2ced2467d922be7422c344c) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 9944e4f766d9eb4cdf7a5ca7587e3ceca556e106) @@ -7,8 +7,8 @@ * * @file SelfTests.c * -* @author (last) Sean Nash -* @date (last) 02-Mar-2022 +* @author (last) Darren Cox +* @date (last) 13-May-2022 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -46,20 +46,20 @@ #define BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ( 5 * MS_PER_SECOND ) ///< Pressure self-test time to run blood pump in ms. #define NORMALIZED_PRESSURE_SELF_TEST_TIME ( 4 * MS_PER_SECOND ) ///< Time to wait for pressure to normalize in ms. -#define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG -50.0 ///< Arterial pressure low limit after running blood pump. +#define ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG -50.0F ///< Arterial pressure low limit after running blood pump. #define VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG 400 ///< Venous pressure high limit after running blood pump. -#define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 10.0 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). +#define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 10.0F ///< Difference in pressure readings after return to normal state tolerance (in mmHg). #define DIP_FLOW_RATE_SETUP_ML_MIN 150 ///< Dialysate inlet pump flow rate during the setup for wet self-test. #define DIP_FLOW_RATE_FIRST_DISPLACEMENT_ML_MIN 100 ///< Dialysate inlet pump flow rate during the first displacement in wet self-test. #define DIP_FLOW_RATE_SECOND_DISPLACEMENT_ML_MIN 600 ///< Dialysate inlet pump flow rate during the second displacement in wet self-test. -#define WET_SELF_TEST_RESERVOIR_ONE_SETUP_VOLUME_ML 1200.0 ///< Setup volume for reservoir one before wet self-test in ml. -#define WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML 100.0 ///< Target of first displacement volume in ml. -#define WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML 600.0 ///< Target of second displacement volume in ml. -#define WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE 5.0 ///< Tolerance on integrated volume in percentage. -#define WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G 12.0 ///< Tolerance in the load cell readings of the displacement in grams (2%). +#define WET_SELF_TEST_RESERVOIR_ONE_SETUP_VOLUME_ML 1200.0F ///< Setup volume for reservoir one before wet self-test in ml. +#define WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML 100.0F ///< Target of first displacement volume in ml. +#define WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML 600.0F ///< Target of second displacement volume in ml. +#define WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE 15.0F ///< Tolerance on integrated volume in percentage. +#define WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G 60.0F ///< Tolerance in the load cell readings of the displacement in grams (2%). #define WET_SELF_TEST_DISPLACEMENT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms. #define RESERVOIR_SETTLE_TIME_MS ( 4 * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. @@ -70,27 +70,8 @@ #define SELF_TEST_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND ) ///< Interval (ms/task time) at which self-test time data is published on the CAN bus. /// Multiplier to conver flow (mL/min) into volume (mL) for period of general task interval. -static const F32 SELF_TEST_FLOW_INTEGRATOR = ( ( 1.0 * TASK_GENERAL_INTERVAL ) / ( SEC_PER_MIN * MS_PER_SECOND ) ); +static const F32 SELF_TEST_FLOW_INTEGRATOR = ( ( 1.0F * TASK_GENERAL_INTERVAL ) / ( SEC_PER_MIN * MS_PER_SECOND ) ); -/// Wet self-tests state machine. -typedef enum Wet_Self_Tests_State -{ - WET_SELF_TESTS_START_STATE = 0, ///< Wet self-tests starting state. - WET_SELF_TESTS_SETUP_STATE, ///< Setup reservoirs for wet self-tests. - WET_SELF_TESTS_BUBBLES_STATE, ///< Wet self-test air bubble detectors state. - WET_SELF_TESTS_PRIME_CHECK_STATE, ///< Prime check wet self-tests state, checks for primed patient lines. - WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE, ///< Blood leak detector self-test state. - WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE, ///< Setup valve and start dialysate pump for first displacement. - WET_SELF_TESTS_FIRST_DISPLACEMENT_STATE, ///< Fill reservoir 2 with 100 mL of dialysate from reservoir 1 state. - WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE, ///< After first displacement completed verify state. - WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE, ///< Setup valve and start dialysate pump for second displacement. - WET_SELF_TESTS_SECOND_DISPLACEMENT_STATE, ///< Fill reservoir 1 with 300 mL of dialysate from reservoir 2 state. - WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE, ///< After first displacement completed verify state. - WET_SELF_TESTS_STOPPED_STATE, ///< Wet self-test stopped state. - WET_SELF_TESTS_COMPLETE_STATE, ///< Wet self-test complete state. - NUM_OF_WET_SELF_TESTS_STATES ///< Number of wet self-tests states. -} WET_SELF_TESTS_STATE_T; - // ********** private data ********** static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; ///< Current state of the no cartridge self-tests state machine. @@ -135,23 +116,23 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsSetupState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpPrimeState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestSyringePumpOcclusionDetectionState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestStoppedState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestStartState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestSetupState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestBubblesState( void ); -static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( SELF_TEST_STATUS_T *result ); +static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestBloodLeakDetectorState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementSetupState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementState( void ); -static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementVerifyState( SELF_TEST_STATUS_T *result ); +static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementVerifyState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementSetupState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementState( void ); -static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementVerifyState( SELF_TEST_STATUS_T *result ); +static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementVerifyState( void ); static WET_SELF_TESTS_STATE_T handleWetSelfTestStoppedState( void ); /*********************************************************************//** @@ -235,11 +216,13 @@ F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SYRINGE_PUMP ) != SW_CONFIG_ENABLE_VALUE ) { useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ? TRUE : FALSE ); } else +#endif { useHeparin = FALSE; } @@ -250,6 +233,19 @@ selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); + // Pumps should be off + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + stopSyringePump(); + + // Set valves to default positions + setValveAirTrap( STATE_CLOSED ); + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VDO, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBA, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); + resetSelfTestsFlags(); } @@ -274,23 +270,8 @@ currentNoCartSelfTestsState = handleNoCartSelfTestsWaitForClosedDoor(); break; - case NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE: + case NO_CART_SELF_TESTS_PRESSURE_CHECKS_STATE: execPresOcclTest(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE; - break; - - case NO_CART_SELF_TESTS_BLOOD_FLOW_METERS_STATE: - execBloodFlowTest(); - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE; - break; - - case NO_CART_SELF_TESTS_DIALYSATE_FLOW_METERS_STATE: - // TODO as of now, the dialysate flow self test only gets the calibration record so it is only called in POST - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE; - break; - - case NO_CART_SELF_TESTS_BOARD_TEMPERATURE_STATE: - // TODO: Implement self tests currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_STATE; break; @@ -378,6 +359,19 @@ selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); + // Pumps should be off + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + stopSyringePump(); + + // Set valves to default positions + setValveAirTrap( STATE_CLOSED ); + setValvePosition( VDI, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VDO, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBA, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( VBV, VALVE_POSITION_A_INSERT_EJECT ); + resetSelfTestsFlags(); } @@ -400,11 +394,13 @@ if ( TRUE == didTimeout( selfTestStartTime, CARTRIDGE_INSERT_PRESSURE_SETTLE_TIME_MS ) ) { setOcclusionInstallLevel(); // Record occlusion pressure level after a new cartridge is installed +#ifndef _RELEASE_ if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_DRY_SELF_TESTS ) ) { currentDrySelfTestsState = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; } else +#endif { currentDrySelfTestsState = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; } @@ -436,11 +432,11 @@ break; case DRY_SELF_TESTS_PRESSURE_SENSORS_STATE: - currentDrySelfTestsState = handleDrySelfTestPressureSensorsState( &result ); + currentDrySelfTestsState = handleDrySelfTestPressureSensorsState(); break; case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE: - currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalState( &result ); + currentDrySelfTestsState = handleDrySelfTestPressureSensorsNormalState(); break; case DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE: @@ -468,7 +464,7 @@ if ( SELF_TEST_STATUS_FAILED == result ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_DRY_SELF_TEST_FAILURE, currentDrySelfTestsState ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, currentDrySelfTestsState ); } // Publish current self-test time data @@ -515,7 +511,6 @@ *************************************************************************/ void transitionToWetSelfTests() { - signalDialInPumpHardStop(); // turn off DPi that was on in previous dialysate bypass state wetSelfTestsResult = FALSE; currentWetSelfTestsState = WET_SELF_TESTS_START_STATE; settleStartTime = 0; @@ -525,6 +520,19 @@ selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); + // Pumps should be off + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + stopSyringePump(); + + // Set valves to default positions + 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 ); + resetSelfTestsFlags(); } @@ -539,6 +547,13 @@ { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_PASSED; +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) == SW_CONFIG_ENABLE_VALUE ) + { + currentWetSelfTestsState = WET_SELF_TESTS_COMPLETE_STATE; + } +#endif + // execute wet self-tests state machine switch ( currentWetSelfTestsState ) { @@ -555,7 +570,7 @@ break; case WET_SELF_TESTS_PRIME_CHECK_STATE: - currentWetSelfTestsState = handleWetSelfTestPrimeCheckState( &result ); + currentWetSelfTestsState = handleWetSelfTestPrimeCheckState(); break; case WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE: @@ -571,7 +586,7 @@ break; case WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE: - currentWetSelfTestsState = handleWetSelfTestFirstDisplacementVerifyState( &result ); + currentWetSelfTestsState = handleWetSelfTestFirstDisplacementVerifyState(); break; case WET_SELF_TESTS_SECOND_DISPLACEMENT_SETUP_STATE: @@ -583,7 +598,7 @@ break; case WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE: - currentWetSelfTestsState = handleWetSelfTestSecondDisplacementVerifyState( &result ); + currentWetSelfTestsState = handleWetSelfTestSecondDisplacementVerifyState(); break; case WET_SELF_TESTS_STOPPED_STATE: @@ -604,7 +619,7 @@ if ( SELF_TEST_STATUS_FAILED == result ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_WET_SELF_TEST_FAILURE, currentWetSelfTestsState ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRE_TREATMENT_WET_LC_TEST_FAILURE, currentWetSelfTestsState ); } } @@ -622,6 +637,18 @@ /*********************************************************************//** * @brief + * The getWetSelfTestState function returns the state of wet self-tests. + * @details Inputs: none + * @details Outputs: none + * @return state of the wet self test + *************************************************************************/ +U32 getWetSelfTestState( void ) +{ + return (U32)currentWetSelfTestsState; +} + +/*********************************************************************//** + * @brief * The handleNoCartridgeWaitForClosedDoor function executes the wait for * door to be closed state of no cartridge self-tests state machine. * @details Inputs: none @@ -631,16 +658,26 @@ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ) { NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + OPN_CLS_STATE_T frontDoor = getSwitchStatus( FRONT_DOOR ); + OPN_CLS_STATE_T pumpTrack = getSwitchStatus( PUMP_TRACK_SWITCH ); signalBloodPumpHardStop(); signalDialInPumpHardStop(); signalDialOutPumpHardStop(); selfTestStartTime = getMSTimerCount(); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) ) + { + frontDoor = STATE_CLOSED; + pumpTrack = STATE_CLOSED; + } +#endif + // TODO: Use appropriate sensor driver - if ( STATE_CLOSED == getFPGADoorState() ) + if ( ( STATE_CLOSED == frontDoor ) && ( STATE_CLOSED == pumpTrack ) ) { - state = NO_CART_SELF_TESTS_OCCLUSION_SENSORS_STATE; + state = NO_CART_SELF_TESTS_PRESSURE_CHECKS_STATE; } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -817,12 +854,22 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + OPN_CLS_STATE_T frontDoor = getSwitchStatus( FRONT_DOOR ); + OPN_CLS_STATE_T pumpTrack = getSwitchStatus( PUMP_TRACK_SWITCH ); // Restart self-test start time selfTestStartTime = getMSTimerCount(); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_SWITCHES_MONITOR ) ) + { + frontDoor = STATE_CLOSED; + pumpTrack = STATE_CLOSED; + } +#endif + // TODO: Use appropriate sensor driver - if ( STATE_CLOSED == getFPGADoorState() ) + if (( STATE_CLOSED == frontDoor ) && (STATE_CLOSED == pumpTrack ) ) { state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); @@ -891,7 +938,7 @@ setupForSelfTestsStop(); } else - { + { // TODO - wait 1 sec before taking pressure readings and beginning pressure check previousNormalArterialPressure = getFilteredArterialPressure(); previousNormalVenousPressure = getFilteredVenousPressure(); @@ -913,10 +960,9 @@ * pressure sensors and verify they are in correct range. * @details Inputs: none * @details Outputs: none - * @param result self-test result * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( SELF_TEST_STATUS_T *result ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_STATE; F32 const arterialPressure = getFilteredArterialPressure(); @@ -926,18 +972,18 @@ if ( ( TRUE == didTimeout( pressureSelfTestBloodPumpRunStartTime, BLOOD_PUMP_RUN_TIME_PRESSURE_SELF_TEST ) ) || ( ARTERIAL_PRESSURE_SELF_TEST_LOW_LIMIT_MMHG >= arterialPressure ) || ( VENOUS_PRESSURE_SELF_TEST_HIGH_LIMIT_MMHG <= venousPressure ) ) { + signalBloodPumpHardStop(); // Test pass when reading positive arterial pressure and negative venous pressure if ( ( arterialPressure < 0) && ( venousPressure > 0 ) ) { - signalBloodPumpHardStop(); setValvePosition( VBV, VALVE_POSITION_B_OPEN ); setValveAirTrap( STATE_OPEN ); pressureSelfTestNormalizedStartTime = getMSTimerCount(); state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; } else { - *result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_TEST_FAILURE, arterialPressure, venousPressure ); } } @@ -956,10 +1002,9 @@ * pressure sensors after returning to normal state. * @details Inputs: none * @details Outputs: none - * @param result self-test result * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( SELF_TEST_STATUS_T *result ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_STATE; @@ -974,7 +1019,7 @@ } else { - *result = SELF_TEST_STATUS_FAILED; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_DRY_PRESSURE_NORMAL_TEST_FAILURE, arterialPressureDiff, venousPressureDiff ); } } @@ -1052,8 +1097,12 @@ if ( TRUE == didTimeout( syringeOcclusionDelayStartTime, SYRINGE_PUMP_OCCLUSION_CHECK_DELAY ) ) { - checkForPrimeOcclusion(); - state = DRY_SELF_TESTS_COMPLETE_STATE; + if ( FALSE == checkForPrimeOcclusion() ) // 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; + } } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -1083,11 +1132,13 @@ if ( TRUE == selfTestsResumeRequested ) { selfTestsResumeRequested = FALSE; +#ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DRY_SELF_TESTS ) != SW_CONFIG_ENABLE_VALUE ) { state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; } else +#endif { state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; } @@ -1172,7 +1223,7 @@ setupDisplacementVolume -= ( SELF_TEST_FLOW_INTEGRATOR * getMeasuredDialInFlowRate() ); - if ( setupDisplacementVolume <= 0 ) + if ( setupDisplacementVolume <= 0.0 ) { signalDialInPumpHardStop(); selfTestBubble( ADV ); @@ -1220,13 +1271,11 @@ * lines to make sure they are primed. * @details Inputs: Arterial and venous bubble detectors status * @details Outputs: Test pass/fail - * @param result self-test result * @return the next state of wet self-tests state machine *************************************************************************/ -static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( SELF_TEST_STATUS_T *result ) +static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( void ) { WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_PRIME_CHECK_STATE; - *result = SELF_TEST_STATUS_FAILED; BUBBLE_STATUS_T const ADVBubbleStatus = getBubbleStatus( ADV ); @@ -1243,8 +1292,11 @@ } state = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; - *result = SELF_TEST_STATUS_PASSED; } + else + { + activateAlarmNoData( ALARM_ID_PRE_TREATMENT_WET_PRIME_TEST_FAILURE ); + } if ( TRUE == doesAlarmStatusIndicateStop() ) { @@ -1267,8 +1319,7 @@ { WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_BLOOD_LEAK_DETECTOR_STATE; - if ( ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_BLOOD_LEAK_SELF_TEST ) != SW_CONFIG_ENABLE_VALUE ) || - ( SELF_TEST_STATUS_PASSED == getBloodLeakSelfTestStatus() ) ) + if ( SELF_TEST_STATUS_PASSED == getBloodLeakSelfTestStatus() ) { settleStartTime = getMSTimerCount(); state = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; @@ -1370,15 +1421,16 @@ * @details Outputs: verify correctness of dialysate flow meter and load cell * @return the next state of wet self-tests state machine *************************************************************************/ -static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementVerifyState( SELF_TEST_STATUS_T *result ) +static WET_SELF_TESTS_STATE_T handleWetSelfTestFirstDisplacementVerifyState( void ) { WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_FIRST_DISPLACEMENT_VERIFY_STATE; if ( TRUE == didTimeout( settleStartTime, RESERVOIR_SETTLE_TIME_MS ) ) { - F32 const resOneDiffAfterDisplacement = reservoirVolume[ DG_RESERVOIR_1 ] - getReservoirWeightLargeFilter( DG_RESERVOIR_1 ); - F32 const resTwoDiffAfterDisplacement = getReservoirWeightLargeFilter( DG_RESERVOIR_2 ) - reservoirVolume[ DG_RESERVOIR_2 ]; - F32 const integratedVolumeToTargetPercent = fabs( 1.0 - ( fmdIntegratedVolume / WET_SELF_TEST_FIRST_DISPLACEMENT_TARGET_VOLUME_ML ) ); + F32 resOneDiffAfterDisplacement = reservoirVolume[ DG_RESERVOIR_1 ] - getReservoirWeightLargeFilter( DG_RESERVOIR_1 ); + F32 resTwoDiffAfterDisplacement = getReservoirWeightLargeFilter( DG_RESERVOIR_2 ) - reservoirVolume[ DG_RESERVOIR_2 ]; + F32 averageDisp = ( resOneDiffAfterDisplacement + resTwoDiffAfterDisplacement ) / 2.0; + F32 integratedVolumeToTargetPercent = fabs( 1.0 - ( fmdIntegratedVolume / averageDisp ) ); if ( ( fabs( resOneDiffAfterDisplacement - resTwoDiffAfterDisplacement) <= WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G ) && ( integratedVolumeToTargetPercent <= WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE ) ) @@ -1387,7 +1439,14 @@ } else { - *result = SELF_TEST_STATUS_FAILED; + 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 ); + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_WET_FLOW_TEST_FAILURE, averageDisp, fmdIntegratedVolume ); + } } } @@ -1488,15 +1547,16 @@ * @details Outputs: verify correctness of dialysate flow meter and load cell * @return the next state of wet self-tests state machine *************************************************************************/ -static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementVerifyState( SELF_TEST_STATUS_T *result ) +static WET_SELF_TESTS_STATE_T handleWetSelfTestSecondDisplacementVerifyState( void ) { WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_SECOND_DISPLACEMENT_VERIFY_STATE; if ( TRUE == didTimeout( settleStartTime, RESERVOIR_SETTLE_TIME_MS ) ) { - F32 const resOneDiffAfterDisplacement = getReservoirWeightLargeFilter( DG_RESERVOIR_1 ) - reservoirVolume[ DG_RESERVOIR_1 ]; - F32 const resTwoDiffAfterDisplacement = reservoirVolume[ DG_RESERVOIR_2 ] - getReservoirWeightLargeFilter( DG_RESERVOIR_2 ); - F32 const integratedVolumeToTargetPercent = fabs( 1.0 - ( fmdIntegratedVolume / WET_SELF_TEST_SECOND_DISPLACEMENT_TARGET_VOLUME_ML ) ); + F32 resOneDiffAfterDisplacement = reservoirVolume[ DG_RESERVOIR_1 ] - getReservoirWeightLargeFilter( DG_RESERVOIR_1 ); + F32 resTwoDiffAfterDisplacement = getReservoirWeightLargeFilter( DG_RESERVOIR_2 ) - reservoirVolume[ DG_RESERVOIR_2 ]; + F32 avgDisp = ( resOneDiffAfterDisplacement + resTwoDiffAfterDisplacement ) / 2.0; + F32 integratedVolumeToTargetPercent = fabs( 1.0 - ( fmdIntegratedVolume / avgDisp ) ); if ( ( fabs( resOneDiffAfterDisplacement - resTwoDiffAfterDisplacement) <= WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G ) && ( integratedVolumeToTargetPercent <= WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE ) ) @@ -1505,7 +1565,14 @@ } else { - *result = SELF_TEST_STATUS_FAILED; + 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 ); + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_PRE_TREATMENT_WET_FLOW_TEST_FAILURE, avgDisp, fmdIntegratedVolume ); + } } }