Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r1bff8e530735be63ba557b77557a0bc2ac4b37b2 -raed14ca8e1c47f2a821ae279103bfe0bbd346bee --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 1bff8e530735be63ba557b77557a0bc2ac4b37b2) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision aed14ca8e1c47f2a821ae279103bfe0bbd346bee) @@ -48,14 +48,16 @@ #define PRE_TREATMENT_FLUSH_FILL_TARGET_TEMP_C 45.0F ///< Pre treatment flush fill target temperature in C. #define PRE_TREATMENT_NORMAL_FILL_TARGET_TEMP_C ( 37.0F + 2.0F ) ///< Pre treatment normal fill target temperature in C. -#define PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume minimum to prep volume during development. -#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 600 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. -#define PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML 1500 ///< Fill reservoir to this volume minimum to prep volume during development. +#define PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume minimum to prep volume during development. +#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 600 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. +#define PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML 1500 ///< Fill reservoir to this volume minimum to prep volume during development. #define PRE_TREATMENT_FLUSH_COUNT 2 ///< Number of flush cycles for each reservoir. +#define PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML 1400 + typedef struct { BOOL initialDrain; ///< Flags indicate whether a reservoir has been requested to initially drain. @@ -128,6 +130,7 @@ static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4UserConfirmState( void ); static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4TreatmentStartState( void ); +static void execPreTreatmentTestConfigReservoirMgmt( void ); static void execPreTreatmentReservoirMgmt( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtStartState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtDrainCmdState( void ); @@ -236,8 +239,16 @@ doorClosedRequired( FALSE, FALSE ); - // Start pre-treatment mode in sample water state - transitionToSampleWater(); + if ( getTestConfigStatus( TEST_CONFIG_EXPEDITE_PRE_TREATMENT ) != TRUE ) + { + // Start pre-treatment mode in sample water state + transitionToSampleWater(); + } + else + { + cmdStartDG(); + transitionToPatientConnection(); + } return currentPreTreatmentState; } @@ -298,8 +309,15 @@ break; } - // Execute reservoir management for pre-treatment mode - execPreTreatmentReservoirMgmt(); + if ( getTestConfigStatus( TEST_CONFIG_EXPEDITE_PRE_TREATMENT ) != TRUE ) + { + // Execute reservoir management for pre-treatment mode + execPreTreatmentReservoirMgmt(); + } + else + { + execPreTreatmentTestConfigReservoirMgmt(); + } // Alarm response request flags should be handled at this point, reset in case not handled in current state resetSignalFlags(); @@ -1067,11 +1085,18 @@ static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4TreatmentStartState( void ) { HD_PRE_TREATMENT_PAT_CONN_STATE_T nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_TREATMENT_START_STATE; + BOOL startTreatment = TRUE; - if ( TRUE == treatmentStartRequested ) + if ( ( TRUE == getTestConfigStatus( TEST_CONFIG_EXPEDITE_PRE_TREATMENT ) ) && + ( currentReservoirMgmtState != PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE ) ) { - DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + startTreatment = FALSE; + } + if ( ( TRUE == treatmentStartRequested ) && ( TRUE == startTreatment ) ) + { + DG_RESERVOIR_ID_T activeRes = getDGActiveReservoir(); + setStartReservoirVolume( activeRes ); requestNewOperationMode( MODE_TREA ); } @@ -1081,6 +1106,168 @@ /*********************************************************************//** * @brief + * The execPreTreatmentTestConfigReservoirMgmt function executes the state + * machine for reservoir management during pre-treatment mode when a test + * configuration (expedite pre-treatment test config for now) is enabled. + * @details Inputs: currentReservoirMgmtState + * @details Outputs: currentReservoirMgmtState + * @return none + *************************************************************************/ +static void execPreTreatmentTestConfigReservoirMgmt( void ) +{ + switch( currentReservoirMgmtState ) + { + case PRE_TREATMENT_RESERVOIR_MGMT_START_STATE: + { + F32 reservoir1Level = getReservoirWeight( DG_RESERVOIR_1 ); + F32 reservoir2Level = getReservoirWeight( DG_RESERVOIR_2 ); + + if ( ( reservoir1Level >= PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML ) && ( reservoir1Level < PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + + if ( DG_RESERVOIR_2 == getDGActiveReservoir() ) + { + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + } + } + else if ( reservoir1Level >= PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) + { + if ( DG_RESERVOIR_1 == getDGActiveReservoir() ) + { + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + } + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + else if ( ( reservoir2Level >= PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML ) && ( reservoir2Level < PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + + if ( DG_RESERVOIR_1 == getDGActiveReservoir() ) + { + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + } + } + else if ( reservoir2Level >= PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) + { + if ( DG_RESERVOIR_2 == getDGActiveReservoir() ) + { + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + } + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE: + { + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + // If DG has not started yet, start DG + if ( DG_MODE_STAN == dgOpMode ) + { + 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 ) ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; + cmdStartDGDrain( PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML, FALSE, FALSE, TRUE ); + } + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE: + { + DG_CMD_RESPONSE_T dgCmdResp; + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + // Check DG response to drain command + if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) + { + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + if ( DG_MODE_DRAI == dgOpMode ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; + } + } + else + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE: + { + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) + { + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = ( DG_RESERVOIR_1 == inactiveReservoir ? (U32)DG_RESERVOIR_1 : (U32)DG_RESERVOIR_2 ); + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE: + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE: + // Done with test configuration reservoir management. Do nothing. + break; + } +} + +/*********************************************************************//** + * @brief * The execPreTreatmentReservoirMgmt function executes the state machine for * reservoir management during pre-treatment mode. * @details Inputs: currentReservoirMgmtState @@ -1185,8 +1372,8 @@ { if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); } }