Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r0589a145e2830f5e3b853489911a6ce7306ffdd9 -r765a17e8b525704386d48df1431688b07b785b40 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 0589a145e2830f5e3b853489911a6ce7306ffdd9) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 765a17e8b525704386d48df1431688b07b785b40) @@ -22,6 +22,7 @@ #include "ModePreTreat.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" +#include "PresOccl.h" #include "PreTreatmentRecirc.h" #include "Prime.h" #include "SelfTests.h" @@ -44,6 +45,7 @@ #define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 100 ///< 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. @@ -81,6 +83,7 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current pre-treatment reservoir management state. static BOOL fillReservoirOneStartRequested; ///< Flag indicates fill reservoir one has been requested. static BOOL reservoirFilledStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag indicates a reservoir has been filled. +static BOOL reservoirFlushedStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Flag indicates a reservoir has been flushed. // ********** private function prototypes ********** @@ -144,13 +147,17 @@ *************************************************************************/ void transitionToPreTreatmentMode( void ) { + F32 const trimmerHeaterTemp = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); + F32 const primaryHeaterTemp = trimmerHeaterTemp + PRIMARY_HEATER_TARGET_TEMP_OFFSET; + + initPreTreatmentMode(); + cmdSetDGDialysateTargetTemps( primaryHeaterTemp, trimmerHeaterTemp ); + cmdStopDGTrimmerHeater(); + // Set user alarm recovery actions allowed in this mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); - - initPreTreatmentMode(); - cmdStopDGTrimmerHeater(); } /*********************************************************************//** @@ -212,7 +219,6 @@ break; default: - currentPreTreatmentState = HD_PRE_TREATMENT_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTreatmentState ); break; } @@ -235,7 +241,7 @@ * disposable installation. * @details Inputs: none * @details Outputs: confirmInstallRequested - * @return TRUE if signal accepted, FALSE if not + * @return none *************************************************************************/ void signalUserConfirmInstallation( void ) { @@ -323,9 +329,11 @@ BOOL accepted = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NO_PATIENT_CONNECTION_CONFIRM; -#ifndef SKIP_UI_INTERACTION - if ( TRUE == patientConnectionConfirm ) +#ifdef SKIP_UI_INTERACTION + patientConnectionConfirm = TRUE; #endif + + if ( TRUE == patientConnectionConfirm ) { if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) ) { @@ -516,11 +524,7 @@ if ( ( DG_MODE_STAN == dgOpMode ) && ( DG_STANDBY_MODE_STATE_IDLE == dgSubMode ) ) { state = HD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE; - F32 const trimmerHeaterTemp = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); - F32 const primaryHeaterTemp = trimmerHeaterTemp + PRIMARY_HEATER_TARGET_TEMP_OFFSET; - cmdStartDG(); - cmdSetDGDialysateTargetTemps( primaryHeaterTemp, trimmerHeaterTemp ); transitionToConsumableSelfTest(); } else @@ -614,9 +618,11 @@ { HD_PRE_TREATMENT_MODE_STATE_T state = HD_PRE_TREATMENT_CART_INSTALL_STATE; -#ifndef SKIP_UI_INTERACTION - if ( TRUE == confirmInstallRequested ) +#ifdef SKIP_UI_INTERACTION + confirmInstallRequested = TRUE; #endif + + if ( TRUE == confirmInstallRequested ) { confirmInstallRequested = FALSE; state = HD_PRE_TREATMENT_SELF_TEST_DRY_STATE; @@ -654,6 +660,7 @@ { if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) { + setOcclusionInstallLevels(); // Record occlusion pressure levels after a new cartridge is installed. submodeCompleteTransitionTimeCounter = 0; state = HD_PRE_TREATMENT_PRIME_STATE; transitionToPrime(); @@ -727,9 +734,11 @@ execPreTreatmentRecirc(); -#ifndef SKIP_UI_INTERACTION - if ( TRUE == continueToTreatmentRequested ) +#ifdef SKIP_UI_INTERACTION + continueToTreatmentRequested = TRUE; #endif + + if ( TRUE == continueToTreatmentRequested ) { continueToTreatmentRequested = FALSE; state = HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE; @@ -805,7 +814,7 @@ default: currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRIME_RESERVOIR_MGMT_INVALID_STATE, (U32)currentReservoirMgmtState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, currentReservoirMgmtState ); break; } } @@ -878,20 +887,21 @@ 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.rejectCode ) ) + if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + } + else + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } } - if ( DG_MODE_DRAI == dgOpMode ) - { - state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; - } - return state; } - /*********************************************************************//** * @brief * The handlePreTreatmentReservoirMgmtFillCmdState function sends fill @@ -910,13 +920,20 @@ { state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; - if ( DG_RESERVOIR_1 == getDGInactiveReservoir() ) + if ( ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) && ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_2 ] ) ) { - cmdStartDGFill( PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML ); + if ( DG_RESERVOIR_1 == getDGInactiveReservoir() ) + { + cmdStartDGFill( PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML ); + } + else + { + cmdStartDGFill( PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML ); + } } else { - cmdStartDGFill( PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML ); + cmdStartDGFill( PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML ); } } @@ -968,22 +985,43 @@ if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) { - if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) + if ( ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) && ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_2 ] ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; - reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; + if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; + } + else if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) + { + reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; + state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + } } - else if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) + else { - reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; - state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + + if ( FALSE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) + { +#ifdef SKIP_PRIMING + reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; +#else + reservoirFlushedStatus[ DG_RESERVOIR_1 ] = TRUE; + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); +#endif + } + else if ( ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFlushedStatus[ DG_RESERVOIR_2 ] ) ) + { + reservoirFlushedStatus[ DG_RESERVOIR_2 ] = TRUE; + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + } } } return state; } - /*********************************************************************//** * @brief * The handlePreTreatmentReservoirMgmtWaitReservoirSwitchState function waits @@ -996,10 +1034,20 @@ { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; - if ( DG_RESERVOIR_2 == getDGInactiveReservoir() ) + if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + if ( DG_RESERVOIR_2 == getDGInactiveReservoir() ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } } + else + { + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + } return state; }