Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -r2f2419f67d9d458837893fef5cc1b21870021026 -r6cb41faf89ea5500a378c2d845c1b9bb552b4b30 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 2f2419f67d9d458837893fef5cc1b21870021026) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision 6cb41faf89ea5500a378c2d845c1b9bb552b4b30) @@ -32,7 +32,7 @@ // ********** public definitions ********** -#define DRAIN_RESERVOIR_TO_VOLUME_ML 200 ///< Drain reservoir to this volume (in mL) during treatment. +#define DRAIN_RESERVOIR_TO_VOLUME_ML 0 ///< Drain reservoir to this volume (in mL) during treatment. #ifndef V1_5_SYSTEM #define FILL_RESERVOIR_TO_VOLUME_ML 1700 ///< Fill reservoir to this volume (in mL) during treatment. #else Index: firmware/App/HDCommon.h =================================================================== diff -u -r73634f08cd8701d835977d599a69710bb3e836c0 -r6cb41faf89ea5500a378c2d845c1b9bb552b4b30 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 73634f08cd8701d835977d599a69710bb3e836c0) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 6cb41faf89ea5500a378c2d845c1b9bb552b4b30) @@ -64,6 +64,7 @@ #define SKIP_CONSUMABLE_TESTS 1 // Skip pre-treatment consumable Self-tests #define SKIP_CALIBRATION_TESTS 1 // Skip pre-treatment self-tests involving calibration #define SKIP_DRY_SELF_TESTS 1 // Skip pre-treatment dry self-tests + #define SKIP_UI_INTERACTION 1 // Skip UI interaction. #include #include Index: firmware/App/Modes/ConsumableSelfTest.c =================================================================== diff -u -r6a43b24baa34ac9d842e2bdf8396aad333571d6b -r6cb41faf89ea5500a378c2d845c1b9bb552b4b30 --- firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 6a43b24baa34ac9d842e2bdf8396aad333571d6b) +++ firmware/App/Modes/ConsumableSelfTest.c (.../ConsumableSelfTest.c) (revision 6cb41faf89ea5500a378c2d845c1b9bb552b4b30) @@ -78,9 +78,6 @@ if ( TRUE == confirmConsumableInstallRequested ) #endif { - cmdStartDG(); - cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); consumableInstallConfirmed = FALSE; #ifdef SKIP_CONSUMABLE_TESTS currentConsumableSelfTestState = CONSUMABLE_SELF_TESTS_COMPLETE_STATE; Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r73634f08cd8701d835977d599a69710bb3e836c0 -r6cb41faf89ea5500a378c2d845c1b9bb552b4b30 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 73634f08cd8701d835977d599a69710bb3e836c0) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 6cb41faf89ea5500a378c2d845c1b9bb552b4b30) @@ -46,6 +46,8 @@ typedef enum PreTreatmentReservoirMgmt_States { PRE_TREATMENT_RESERVOIR_MGMT_START_STATE = 0, ///< Wait for signal to start drain and fill reservoirs. + PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE, ///< Command DG to switch active reservoir. + PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE, ///< Processing DG switch reservoir command response. PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE, ///< Command DG to start draining reservoir. PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE, ///< After sending drain command, process DG drain command response. PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir. @@ -89,6 +91,8 @@ static void execPreTreatmentReservoirMgmt( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtStartState( void ); +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirCmdState( void ); +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirRespState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtDrainCmdState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtDrainCmdRespState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdState( void ); @@ -152,7 +156,9 @@ switch ( currentPreTreatmentState ) { case HD_PRE_TREATMENT_START_STATE: +#ifndef SKIP_SAMPLE_WATER transitionToSampleWater(); +#endif currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; break; @@ -300,7 +306,9 @@ BOOL accepted = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM; +#ifndef SKIP_UI_INTERACTION if ( TRUE == patientConnectionConfirm ) +#endif { if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) { @@ -480,6 +488,8 @@ #endif { state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + cmdStartDG(); + cmdSetDGDialysateTargetTemps( 39.0, 37.0 ); transitionToConsumableSelfTest(); } @@ -554,7 +564,9 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; +#ifndef SKIP_UI_INTERACTION if ( TRUE == confirmInstallRequested ) +#endif { confirmInstallRequested = FALSE; state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; @@ -656,7 +668,9 @@ execPreTreatmentRecirc(); +#ifndef SKIP_UI_INTERACTION if ( TRUE == continueToTreatmentRequested ) +#endif { continueToTreatmentRequested = FALSE; state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; @@ -703,6 +717,14 @@ currentReservoirMgmtState = handlePreTreatmentReservoirMgmtStartState(); break; + case PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE: + currentReservoirMgmtState = handlePreTreatmentReservoirMgmtSwitchReservoirCmdState(); + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE: + currentReservoirMgmtState = handlePreTreatmentReservoirMgmtSwitchReservoirRespState(); + break; + case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE: currentReservoirMgmtState = handlePreTreatmentReservoirMgmtDrainCmdState(); break; @@ -745,14 +767,64 @@ if ( TRUE == fillReservoirOneStartRequested ) { fillReservoirOneStartRequested = FALSE; - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE; } return state; } /*********************************************************************//** * @brief + * The handlePreTreatmentReservoirMgmtSwitchReservoirRespState function sends + * switch reservoir command to DG. + * @details Inputs: reservoirFilledStatus[] + * @details Outputs: sent switch reservoir command to DG + * @return next state of pre-treatment reservoir management + *************************************************************************/ +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirCmdState( void ) +{ + if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) + { + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + } + else + { + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + } + + return PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE; +} + +/*********************************************************************//** + * @brief + * The handlePreTreatmentReservoirMgmtSwitchReservoirRespState function waits + * and processes DG switch reservoir command response. + * @details Inputs: DG switch reservoir command response + * @details Outputs: processed switch reservoir response + * @return next state of pre-treatment reservoir management + *************************************************************************/ +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirRespState( void ) +{ + PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE; + DG_CMD_RESPONSE_T dgCmdResp; + + if ( TRUE == getDGCommandResponse( DG_CMD_SWITCH_RESERVOIR, &dgCmdResp ) ) + { + if ( TRUE == dgCmdResp.rejected ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE; + } + else + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + } + + return state; +} + +/*********************************************************************//** + * @brief * The handlePreTreatmentReservoirMgmtDrainCmdState function sends drain * command to DG when DG is in re-circulate mode. * @details Inputs: fillReservoirOneStartRequested @@ -763,10 +835,11 @@ { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); if ( DG_MODE_CIRC == dgOpMode ) { - if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == getDGSubMode() ) + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) { state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); @@ -792,13 +865,14 @@ { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; DG_CMD_RESPONSE_T dgCmdResp; + DG_OP_MODE_T dgOpMode = getDGOpMode(); - if ( ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejected ) ) + if ( ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejectCode ) ) { state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; } - if ( DG_MODE_DRAI == getDGOpMode() ) + if ( DG_MODE_DRAI == dgOpMode ) { state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; } @@ -818,8 +892,10 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdState( void ) { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); - if ( ( DG_MODE_CIRC == getDGOpMode() ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == getDGSubMode() ) ) + if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) { state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; @@ -848,15 +924,17 @@ { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; DG_CMD_RESPONSE_T dgCmdResp; + DG_OP_MODE_T dgOpMode = getDGOpMode(); - if ( ( TRUE == getDGCommandResponse( DG_CMD_START_FILL, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejected ) ) + + if ( ( TRUE == getDGCommandResponse( DG_CMD_START_FILL, &dgCmdResp ) ) && ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejectCode ) ) { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; } - if ( DG_MODE_FILL == getDGOpMode() ) + if ( DG_MODE_FILL == dgOpMode ) { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE; } return state; @@ -874,14 +952,14 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCompleteState( void ) { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE; + DG_OP_MODE_T dgOpMode = getDGOpMode(); - if ( DG_MODE_CIRC == getDGOpMode() ) + if ( DG_MODE_CIRC == dgOpMode ) { if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE; reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); } else if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) { Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r5e0257ef85adb18a5c8837d9804304f405080266 -r6cb41faf89ea5500a378c2d845c1b9bb552b4b30 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 5e0257ef85adb18a5c8837d9804304f405080266) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 6cb41faf89ea5500a378c2d845c1b9bb552b4b30) @@ -375,7 +375,9 @@ { HD_PRE_TREATMENT_PRIME_STATE_T state = HD_PRIME_WAIT_FOR_USER_START_STATE; +#ifndef SKIP_UI_INTERACTION if ( TRUE == primeStartRequested ) +#endif { primeStartRequested = FALSE; state = HD_PRIME_SALINE_SETUP_STATE; @@ -476,8 +478,6 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); @@ -551,7 +551,6 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); signalDialOutPumpHardStop(); setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r6cd85442baebdeecec6fc9b5009011b8d961f45c -r6cb41faf89ea5500a378c2d845c1b9bb552b4b30 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 6cd85442baebdeecec6fc9b5009011b8d961f45c) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 6cb41faf89ea5500a378c2d845c1b9bb552b4b30) @@ -85,7 +85,6 @@ static NO_CART_SELF_TESTS_STATE_T currentNoCartSelfTestsState; ///< Current state of the no cartridge self-tests state machine. static U32 runPumpStartTime; ///< Beginning time when pumps start running static BOOL hasPumpsStarted; ///< Flag indicates pumps have started running for self-test. -static BOOL areValvesAndPumpsHomed; ///< Flag indicates valves and pumps have been homed. static BOOL drySelfTestsResult; ///< Result of dry self-tests. static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of the dry self-tests state machine. @@ -113,6 +112,7 @@ static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestsWaitForClosedDoor( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestPumpsState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestLeakDetectorsState( SELF_TEST_STATUS_T *result ); +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestDoorSwitchState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ); static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestStoppedState( void ); @@ -202,7 +202,6 @@ currentNoCartSelfTestsState = NO_CART_SELF_TESTS_START_STATE; runPumpStartTime = 0; hasPumpsStarted = FALSE; - areValvesAndPumpsHomed = FALSE; resetSelfTestsFlags(); } @@ -271,8 +270,7 @@ break; case NO_CART_SELF_TESTS_DOOR_SWITCH_STATE: - // TODO: Implement self tests - currentNoCartSelfTestsState = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; + currentNoCartSelfTestsState = handleNoCartSelfTestDoorSwitchState(); break; case NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE: @@ -665,32 +663,43 @@ /*********************************************************************//** * @brief - * The handleNoCartSelfTestHomeValvesAndPumpState function homes all valves - * and pumps. + * The handleNoCartSelfTestDoorSwitchState function executes door switch self-test. * @details Inputs: none * @details Outputs: none * @return the next state of no cartridge self-tests state machine *************************************************************************/ -static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ) +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestDoorSwitchState( void ) { - NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_DOOR_SWITCH_STATE; + VALVE_T valve; - if ( FALSE == areValvesAndPumpsHomed ) + // TODO implement door switch self-test + for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) { - VALVE_T valve; + homeValve( valve ); + } - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) - { - homeValve( valve ); - } + homeBloodPump(); + homeDialInPump(); + homeDialOutPump(); - homeBloodPump(); - homeDialInPump(); - homeDialOutPump(); + state = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; - areValvesAndPumpsHomed = TRUE; - } + return state; +} +/*********************************************************************//** + * @brief + * The handleNoCartSelfTestHomeValvesAndPumpState function homes all valves + * and pumps. + * @details Inputs: none + * @details Outputs: none + * @return the next state of no cartridge self-tests state machine + *************************************************************************/ +static NO_CART_SELF_TESTS_STATE_T handleNoCartSelfTestHomeValvesAndPumpState( void ) +{ + NO_CART_SELF_TESTS_STATE_T state = NO_CART_SELF_TESTS_HOME_VALVES_AND_PUMPS_STATE; + if ( ( FALSE == isDialInPumpRunning() ) && ( FALSE == isDialOutPumpRunning() ) && ( FALSE == isBloodPumpRunning() ) ) { state = NO_CART_SELF_TESTS_COMPLETE_STATE;