Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -ra9368b25cce2a179c56b1609b735178b286bb03d -rf760ffc4b10556e5186e9ceb90294262063440ca --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision a9368b25cce2a179c56b1609b735178b286bb03d) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision f760ffc4b10556e5186e9ceb90294262063440ca) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModePreTreat.c * -* @author (last) Michael Garthwaite -* @date (last) 28-Oct-2022 +* @author (last) Sean Nash +* @date (last) 31-Jan-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -47,8 +47,8 @@ #define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 250 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. #define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume (in mL) to flush filter and lines. -#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 1300 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. -#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 700 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 900 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 1100 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. /// States of the pre-treatment reservoir management state machine. typedef enum PreTreatmentReservoirMgmt_States @@ -124,7 +124,7 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; + currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; setUFVolStatus = FALSE; patientConnectionConfirm = FALSE; @@ -196,6 +196,9 @@ doorClosedRequired( FALSE, FALSE ); + // Start pre-treatment mode in sample water state + transitionToSampleWater(); + return currentPreTreatmentState; } @@ -218,16 +221,6 @@ // execute mode state machine switch ( currentPreTreatmentState ) { - case HD_PRE_TREATMENT_START_STATE: -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_SAMPLE_WATER ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - transitionToSampleWater(); - } - currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; - break; - case HD_PRE_TREATMENT_WATER_SAMPLE_STATE: currentPreTreatmentState = handleWaterSampleState(); break; @@ -620,7 +613,7 @@ patientConnectionConfirm = FALSE; treatmentStartRequested = FALSE; - doorClosedRequired( FALSE, FALSE ); + doorClosedRequired( TRUE, TRUE ); for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) { @@ -652,27 +645,25 @@ if ( SAMPLE_WATER_COMPLETE_STATE == getSampleWaterState() ) { - { - cmdDGSampleWater( SAMPLE_WATER_CMD_END ); + cmdDGSampleWater( SAMPLE_WATER_CMD_END ); - if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) + if ( SELF_TEST_STATUS_PASSED == getSampleWaterResult() ) + { + if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) { - if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) - { - state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; - cmdStartDG(); - transitionToConsumableSelfTest(); - } - else - { - cmdStopDG(); - } + state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; + cmdStartDG(); + transitionToConsumableSelfTest(); } else { - requestNewOperationMode( MODE_STAN ); + cmdStopDG(); } } + else + { + requestNewOperationMode( MODE_STAN ); + } } return state; @@ -701,6 +692,12 @@ fillReservoirOneStartRequested = TRUE; transitionToNoCartSelfTests(); } +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) +#endif + { + signalActionToResumeFill(); + } } return state; @@ -874,7 +871,7 @@ * @brief * The handlePatientConnectionState function handles patient connection state * during pre-treatment mode. - * @details Inputs: none + * @details Inputs: alarmActionResumeReceived * @details Outputs: requested mode transition to treatment mode * @return current state (sub-mode) *************************************************************************/ @@ -888,6 +885,19 @@ requestNewOperationMode( MODE_TREA ); } + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + signalDialInPumpHardStop(); + cmdStopDGTrimmerHeater(); + } + else if ( TRUE == alarmActionResumeReceived ) + { + alarmActionResumeReceived = FALSE; + //setDialInPumpTargetFlowRate( DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( 250, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO remove this line once the new flow control is implemented + cmdStartDGTrimmerHeater(); + } + return HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; } @@ -993,6 +1003,7 @@ cmdStartDG(); } + // Ensure any pending reservoir switches are completed before sending drain command if ( TRUE == hasDGCompletedReservoirSwitch() ) { if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) @@ -1019,11 +1030,15 @@ DG_CMD_RESPONSE_T dgCmdResp; DG_OP_MODE_T dgOpMode = getDGOpMode(); + // Check DG response to drain command if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) { if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + if ( DG_MODE_DRAI == dgOpMode ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + } } else { @@ -1053,18 +1068,14 @@ if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - // if fills not yet enabled, check to see if we want to move on to drain the other reservoir - if ( reservoirFlags[ DG_RESERVOIR_1 ].startFlushFill != TRUE ) + // Drain both reservoirs and return to active res 2 before initial fills + if ( initialReservoirDrain[ inactiveReservoir ] != TRUE ) { - if ( ( initialReservoirDrain[ inactiveReservoir ] != TRUE ) || - ( inactiveReservoir != DG_RESERVOIR_1 ) ) - { - initialReservoirDrain[ inactiveReservoir ] = TRUE; - state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; - } + initialReservoirDrain[ inactiveReservoir ] = TRUE; + state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; } - - else + // Once both reservoirs drained and returned to active res 2, wait for pre-tx workflow to get to point where fills allowed before filling + else if ( TRUE == reservoirFlags[ DG_RESERVOIR_1 ].startFlushFill ) { volume = getPreTreatmentFillVolume( inactiveReservoir ); @@ -1160,7 +1171,7 @@ } else { - state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; if ( FALSE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) { @@ -1242,7 +1253,6 @@ { if ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejectCode ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; } else if ( dgCmdResp.rejectCode != DG_CMD_REQUEST_REJECT_REASON_NONE )