Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r8afac005a36a62d8d36e58a4c46d0225b3367204 -r50086215a9c8977c977f836dcd4c454dd4d7d712 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8afac005a36a62d8d36e58a4c46d0225b3367204) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 50086215a9c8977c977f836dcd4c454dd4d7d712) @@ -46,9 +46,9 @@ /// TODO: Restore to 100 when DPi flow control is fixed. #define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 250 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. -#define PRE_TREATMENT_MIN_RESERVOIR_VOLUME_ML 400 ///< Fill reservoir to this volume minimum to prep volume during development. +#define PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML 125 ///< 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 1200 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. +#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. @@ -97,11 +97,10 @@ static U32 submodeCompleteTransitionTimeCounter; ///< Sub-mode completed transition wait time counter. static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current pre-treatment reservoir management state. -static DG_RESERVOIR_ID_T activeReservoir = DG_RESERVOIR_2; static PRE_TREATMENT_RESERVOIR_VAR_T reservoirStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Detailed state of each reservoir. #ifndef _RELEASE_ -const PRE_TREATMENT_RESERVOIR_VAR_T reservoirPrimingDisabled = {FALSE,FALSE,FALSE,FALSE,FALSE,(0)}; +const PRE_TREATMENT_RESERVOIR_VAR_T reservoirPrimingDisabled = {FALSE,FALSE,FALSE,TRUE,FALSE,(0)}; #endif const PRE_TREATMENT_RESERVOIR_VAR_T reservoirPretreatmentInit = {FALSE,FALSE,FALSE,FALSE,FALSE,PRE_TREATMENT_FLUSH_COUNT}; @@ -141,7 +140,7 @@ *************************************************************************/ void initPreTreatmentMode( void ) { - int reservoirIndex = 0; + U32 reservoirIndex = 0; currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; @@ -505,25 +504,49 @@ /*********************************************************************//** * @brief - * The signalActionToResumeFill function sets the remaining reservior fill - * flags to resume filling while in PreTreatment Mode. + * The signalAllowDGFlushFills function sets the reservoir flush flags + * to allow reservoir flush fills to proceed when ready. * @details Inputs: none - * @details Outputs: reservoirFlags + * @details Outputs: reservoirStatus[] * @return none *************************************************************************/ -void signalActionToResumeFill( void ) +void signalAllowDGFlushFills( void ) { reservoirStatus[ DG_RESERVOIR_1 ].startFlushFill = TRUE; - reservoirStatus[ DG_RESERVOIR_1 ].startNormalFill = TRUE; reservoirStatus[ DG_RESERVOIR_2 ].startFlushFill = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalAllowDGFillRes1 function sets the reservoir 1 fill flag + * to allow reservoir 1 fill to proceed when ready. + * @details Inputs: none + * @details Outputs: reservoirStatus[] + * @return none + *************************************************************************/ +void signalAllowDGFillRes1( void ) +{ + reservoirStatus[ DG_RESERVOIR_1 ].startNormalFill = TRUE; +} + +/*********************************************************************//** + * @brief + * The signalAllowDGFillRes2 function sets the reservoir 2 fill flag + * to allow reservoir 2 fill to proceed when ready. + * @details Inputs: none + * @details Outputs: reservoirStatus[] + * @return none + *************************************************************************/ +void signalAllowDGFillRes2( void ) +{ reservoirStatus[ DG_RESERVOIR_2 ].startNormalFill = TRUE; } /*********************************************************************//** * @brief * The getReservoirFillStatus function returns the fill complete status for * given reservoir. - * @details Inputs: reservoirFilledStatus + * @details Inputs: reservoirStatus[] * @details Outputs: none * @return TRUE if reservoir has been filled, otherwise FALSE *************************************************************************/ @@ -714,7 +737,12 @@ fillReservoirOneStartRequested = TRUE; transitionToNoCartSelfTests(); } - signalActionToResumeFill(); +#ifndef _RELEASE_ + if ( SW_CONFIG_DISABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_AIR_PUMP ) ) // Allow reservoir flushes now if air pump not disabled +#endif + { + signalAllowDGFlushFills(); + } } return state; @@ -928,9 +956,6 @@ *************************************************************************/ static void execPreTreatmentReservoirMgmt( void ) { - // update the active reservoir. - activeReservoir = getDGActiveReservoir(); - // treatment reservoir mgmt. state machine switch ( currentReservoirMgmtState ) { @@ -1027,15 +1052,8 @@ { if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { - if ( FALSE == reservoirStatus[ activeReservoir ].flushComplete ) - { state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); - } - else - { - state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; - } } } @@ -1087,44 +1105,37 @@ static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdState( void ) { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE; + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - U32 volume = 0; if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { + U32 volume = 0; + // Drain both reservoirs and return to active res 2 before initial fills - if ( reservoirStatus[ activeReservoir ].initialDrain != TRUE ) + if ( reservoirStatus[ inactiveReservoir ].initialDrain != TRUE ) { - reservoirStatus[ activeReservoir ].initialDrain = TRUE; + reservoirStatus[ inactiveReservoir ].initialDrain = TRUE; state = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; } - // Once both reservoirs drained and returned to active res 2, wait for pre-tx workflow - // to get to point where fills are allowed, before starting fill - // not flushed and need to fill -OR- - // flushed and need to fill after entering dry self test state - else if ( ( TRUE == reservoirStatus[ activeReservoir ].startFlushFill ) || - ( ( TRUE == reservoirStatus[ activeReservoir ].startNormalFill ) && - ( currentPreTreatmentState >= HD_PRE_TREATMENT_SELF_TEST_DRY_STATE ) ) ) - { - // Start tracking flush cycles, flushComplete => don't drain again. - if ( FALSE == reservoirStatus[ activeReservoir ].flushComplete ) - { - if (0 < reservoirStatus[ activeReservoir ].flushCount) - { - reservoirStatus[ activeReservoir ].flushCount -= 1; - } - if ( 0 == reservoirStatus[ activeReservoir ].flushCount ) - { - reservoirStatus[ activeReservoir ].flushComplete = TRUE; - } - } + // Determine target fill volume for next fill + volume = getPreTreatmentFillVolume( inactiveReservoir ); - volume = getPreTreatmentFillVolume( activeReservoir ); + // Determine whether we can start next fill yet + if ( ( FALSE == reservoirStatus[ inactiveReservoir ].flushComplete ) && + ( TRUE == reservoirStatus[ inactiveReservoir ].startFlushFill ) ) + { cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; } + else if ( ( TRUE == reservoirStatus[ inactiveReservoir ].flushComplete ) && + ( TRUE == reservoirStatus[ inactiveReservoir ].startNormalFill ) ) + { + cmdStartDGFill( volume, DEFAULT_TARGET_FILL_FLOW_RATE_LPM ); + state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; + } } return state; @@ -1171,15 +1182,18 @@ * The handlePreTreatmentReservoirMgmtFillCompleteState function switches * reservoir after the first one fill is complete and restart reservoir management * state machine. - * @details Inputs: DG operation mode - * @details Outputs: switch active reservoir and signal prime fill complete status + * @details Inputs: DG operation mode, reservoirStatus[] + * @details Outputs: switch active reservoir and signal prime fill complete status, + * reservoirStatus[] * @return current state of pre-treatment reservoir management *************************************************************************/ 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(); U32 dgSubMode = getDGSubMode(); + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + DG_RESERVOIR_ID_T activeReservoir = getDGActiveReservoir(); if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { @@ -1188,13 +1202,23 @@ if ( ( TRUE == reservoirStatus[ DG_RESERVOIR_1 ].flushComplete ) && ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].flushComplete ) ) { - reservoirStatus[ activeReservoir ].fillComplete = TRUE; + reservoirStatus[ inactiveReservoir ].fillComplete = TRUE; } else { DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - rsrvrCmd.reservoirID = activeReservoir; + // Start tracking flush cycles, flushComplete => don't drain again, this completes the final fill. + if ( FALSE == reservoirStatus[ inactiveReservoir ].flushComplete ) + { + reservoirStatus[ inactiveReservoir ].flushCount--; + if ( 0 == reservoirStatus[ inactiveReservoir ].flushCount ) + { + reservoirStatus[ inactiveReservoir ].flushComplete = TRUE; + } + } + + rsrvrCmd.reservoirID = (U32)activeReservoir; rsrvrCmd.useLastTrimmerHeaterDC = FALSE; cmdSetDGActiveReservoir( &rsrvrCmd ); } @@ -1258,7 +1282,15 @@ } else { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + if ( ( TRUE == reservoirStatus[ DG_RESERVOIR_1 ].fillComplete ) && + ( TRUE == reservoirStatus[ DG_RESERVOIR_2 ].fillComplete ) ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + } + else + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } } } @@ -1269,7 +1301,7 @@ * @brief * The getPreTreatmentFillVolume function determines which volume to fill * the inactive reservoir. - * @details Inputs: reservoirStatus.flushedStatus + * @details Inputs: reservoirStatus[] * @details Outputs: none * @param DG inactive Reservoir * @return volume to fill @@ -1278,34 +1310,50 @@ { U32 volume = 0; - // Fill volumes after flushing - if ( TRUE == reservoirStatus[ inactiveRes ].flushComplete ) - { - if ( DG_RESERVOIR_1 == inactiveRes ) - { - volume = PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML; - } - // Reservoir 2 - else - { - volume = PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML; - } - } - // Flush fill volumes - else - { - volume = PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML; - } + // Fill volumes after flushing + if ( TRUE == reservoirStatus[ inactiveRes ].flushComplete ) + { + #ifndef _RELEASE_ + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) || + ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) ) ) + { + if ( DG_RESERVOIR_1 == inactiveRes ) + { + volume = PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML; + } + // Reservoir 2 + else + { + volume = PRE_TREATMENT_MIN_FILL_RESERVOIR_VOLUME_ML; + } + } + else + #endif + { + if ( DG_RESERVOIR_1 == inactiveRes ) + { + volume = PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML; + } + // Reservoir 2 + else + { + volume = PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML; + } + } + } + // Flush fill volumes + else + { + volume = PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML; + } - return volume; + return volume; } - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ - /*********************************************************************//** * @brief * The testSetPreTreatmentModePublishIntervalOverride function sets the override of the