Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rbac52336ea9e23fc2dfb4a802afe49401dfb7057 -r00ff72e0b1cf3002e660d850346e26e1209e2b24 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision bac52336ea9e23fc2dfb4a802afe49401dfb7057) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 00ff72e0b1cf3002e660d850346e26e1209e2b24) @@ -71,6 +71,7 @@ F32 DPiToBLDFlushedVolML; ///< Dialysate inlet pump to blood leak flushed volume in milliliters. BOOL hasBloodLeakZeroingBeenRequested; ///< Flag to indicate blood leak zeroing has been requested. BOOL isZeroingRequestedFromTreatmentStop; ///< Flag to indicate blood leak zeroing has been requested from treatment stop. + BOOL isZeroingNeededAfterRsrvrSwitch; ///< Flag to indicate blood leak zeroing is needed after reservoir switch. BLOOD_LEAK_ZEROING_STATE_T bloodLeakZeroingState; ///< Blood leak zeroing state. } BLOOD_LEAK_ZEROING_T ; @@ -694,13 +695,23 @@ // Check ultrafiltration control during dialysis (even when ultrafiltration is paused). checkUFControl(); - if ( ( TRUE == isBloodLeakZeroingNeeded() ) && ( DIALYSIS_UF_STATE == currentDialysisState ) ) + if ( TRUE == isBloodLeakZeroingNeeded() ) { - // Reset the blood leak zeroing variables - resetBloodLeakZeroing(); - requestBloodLeakZeroing( FALSE ); + bloodLeakZeroingStatus.isZeroingNeededAfterRsrvrSwitch = TRUE; } + if ( ( TRUE == bloodLeakZeroingStatus.isZeroingNeededAfterRsrvrSwitch ) && ( DIALYSIS_UF_STATE == currentDialysisState ) ) + { + if ( TRUE == checkReservoirHasBeenSwitched() ) + { + // Reset the blood leak zeroing variables + resetBloodLeakZeroing(); + requestBloodLeakZeroing( FALSE ); + } + } + + resetReservoirSwitchFlag(); + // Dialysis state machine switch ( currentDialysisState ) { @@ -1545,6 +1556,7 @@ bloodLeakZeroingStatus.bloodLeakZeroingState = BLD_ZEROING_IDLE_STATE; bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested = FALSE; bloodLeakZeroingStatus.isZeroingRequestedFromTreatmentStop = FALSE; + bloodLeakZeroingStatus.isZeroingNeededAfterRsrvrSwitch = FALSE; } /*********************************************************************//** Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rbac52336ea9e23fc2dfb4a802afe49401dfb7057 -r00ff72e0b1cf3002e660d850346e26e1209e2b24 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision bac52336ea9e23fc2dfb4a802afe49401dfb7057) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 00ff72e0b1cf3002e660d850346e26e1209e2b24) @@ -1178,6 +1178,7 @@ if ( TRUE == isBloodLeakZeroingNeeded() ) { + // If the sensor has drifted request a zero prior to transitioning to treatment zeroBloodLeak(); } Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -ra36a3feca5d35137f1db0293882af0f49ebb9f03 -r00ff72e0b1cf3002e660d850346e26e1209e2b24 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a36a3feca5d35137f1db0293882af0f49ebb9f03) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 00ff72e0b1cf3002e660d850346e26e1209e2b24) @@ -96,6 +96,7 @@ static F32 previousUFFlowMLP; ///< Previous ultrafiltration flow rate in mL/min. static DG_MIXING_RATIOS_T ratios; ///< Mixing ratios and fill prep time in milliseconds structure. static U32 prevTargetFillVolumeML[ NUM_OF_DG_RESERVOIRS ]; ///< Previous target fill volume in milliliters. +static BOOL hasReservoirBeenSwitched; ///< Flag to indicate reservoir has been recently switched. static const F32 RESERVOIR_DILUTION_RATIO = MAX_RESERVOIR_DILUTION / ( 1.0 - MAX_RESERVOIR_DILUTION ); ///< Reservoir dilution ratio. @@ -127,7 +128,7 @@ * volSpentMl, reservoirsPublicationCounter, dilutionLevelPct, dgOpMode, dgSubMode, * timeReservoirInUse, volSpentUFML, activeReservoir, recirculationLevelPct, * reservoirSwitchStartTimeMS, timeWaitToFillMS, targetFillFlowLPM, ratios - * previousDialysateFlowRate, prevTargetFillVolumeML + * previousDialysateFlowRate, prevTargetFillVolumeML, hasReservoirBeenSwitched * @return none *************************************************************************/ void initReservoirs( void ) @@ -155,6 +156,7 @@ ratios.acidMixingRatio = 0.0F; ratios.bicarbMixingRatio = 0.0F; ratios.timeFillPrepMS = 0; + hasReservoirBeenSwitched = FALSE; // Initialize the previous reservoir fill volume prevTargetFillVolumeML[ DG_RESERVOIR_1 ] = FILL_RESERVOIR_TO_VOLUME_ML; @@ -270,6 +272,32 @@ timeReservoirInUF += TASK_GENERAL_INTERVAL; } +/*********************************************************************//** + * @brief + * The checkReservoirHasBeenSwitched function returns the reservoir has been + * switched flag. + * @details Inputs: none + * @details Outputs: hasReservoirBeenSwitched + * @return reservoir has been switched flag + *************************************************************************/ +BOOL checkReservoirHasBeenSwitched( void ) +{ + return hasReservoirBeenSwitched; +} + +/*********************************************************************//** + * @brief + * The resetReservoirSwitchFlag function resets the reservoir has been + * switched flag. + * @details Inputs: none + * @details Outputs: hasReservoirBeenSwitched + * @return none + *************************************************************************/ +void resetReservoirSwitchFlag( void ) +{ + hasReservoirBeenSwitched = FALSE; +} + // ********** private functions ********** /*********************************************************************//** @@ -675,7 +703,8 @@ * The handleReservoirMgmtWaitForSwitchSettleState function executes the reservoir * management wait for switch to settle state. * @details Inputs: reservoirSwitchStartTimeMS - * @details Outputs: timeReservoirInUse + * @details Outputs: timeReservoirInUse, lastTimeReservoirInUF, timeReservoirInUF + * hasReservoirBeenSwitched * @return next reservoir management state of the state machine *************************************************************************/ static TREATMENT_RESERVOIR_MGMT_STATE_T handleReservoirMgmtWaitForSwitchSettleState( void ) @@ -685,9 +714,10 @@ if ( TRUE == didTimeout( reservoirSwitchStartTimeMS, RESERVOIR_USED_SETTLE_TIME_MS ) ) { // Switching the active reservoir so reset the reservoir in use timer - lastTimeReservoirInUF = timeReservoirInUF; - timeReservoirInUF = 0; - timeReservoirInUse = 0; + lastTimeReservoirInUF = timeReservoirInUF; + timeReservoirInUF = 0; + timeReservoirInUse = 0; + hasReservoirBeenSwitched = TRUE; // Signal dialysis sub-mode to capture final volume of prior reservoir after settling. setFinalReservoirVolume(); Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r20d0c02f453b6dae1884fb1b5ba542053852ffc1 -r00ff72e0b1cf3002e660d850346e26e1209e2b24 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 20d0c02f453b6dae1884fb1b5ba542053852ffc1) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 00ff72e0b1cf3002e660d850346e26e1209e2b24) @@ -56,6 +56,9 @@ void updateReservoirUFTime( void ); // Update time spent doing ultrafiltration for currently active reservoir U32 getLastReservoirUFTimeInMs( void ); // Get the time spent doing ultrafiltration on the previously active reservoir +BOOL checkReservoirHasBeenSwitched( void ); +void resetReservoirSwitchFlag( void ); + BOOL testSetRecirculationLevelPctOverride( F32 value ); // Set override for reciruclation percentage BOOL testResetRecirculationLevelPctOverride( void ); // Reset override for recirulation percentage /**@}*/