Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -rfb714597ad515d3774d69b94808f065788504724 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision fb714597ad515d3774d69b94808f065788504724) @@ -19,6 +19,7 @@ #include "AirTrap.h" #include "BloodFlow.h" +#include "BloodLeak.h" #include "Buttons.h" #include "Dialysis.h" #include "DialInFlow.h" @@ -51,16 +52,40 @@ #define MAX_ACTIVE_LOAD_CELL_CHANGE_G 50.0F ///< Maximum delta between new and previous measured UF volume. +// 3.07 + 12.28 has been received from the mechanical team and extra volume as margin has been added for safety +#define DPI_2_BLD_VOLUME_ML ( 3.07F + 12.28F + 8.0F ) ///< Dialysate inlet pump to blood detect sensor volume in milliliters. +#define RSRVR_2_DPI_VOLUME_ML ( 70.0 + 5.0F ) ///< Reservoir to dialysate inlet pump volume in milliliters. + /// Defined states for the Load Cell cycles. typedef enum Reservoir_Steady_Cycle { - RESERVOIR_STEADY_CYCLE_START = 0, ///< Reservoir steady cycle load cell reading at Start - RESERVOIR_STEADY_CYCLE_FINAL, ///< Reservoir steady cycle load cell reading at Final - NUM_OF_RESERVOIR_STEADY_CYCLES ///< Number of Reservoir steady cycle load cell readings + RESERVOIR_STEADY_CYCLE_START = 0, ///< Reservoir steady cycle load cell reading at Start. + RESERVOIR_STEADY_CYCLE_FINAL, ///< Reservoir steady cycle load cell reading at Final. + NUM_OF_RESERVOIR_STEADY_CYCLES ///< Number of Reservoir steady cycle load cell readings. } RESERVOIR_STEADY_CYCLE_T; +/// Blood leak zeroing request status +typedef enum BLD_Zeroing_Request_Status +{ + BLOOD_LEAK_ZEROING_RQST_READY = 0, ///< Blood leak zeroing request ready. + BLOOD_LEAK_ZEROING_RQST_REQUESTED, ///< Blood leak zeroing request requested. + BLOOD_LEAK_ZEROING_RQST_IN_PROGRESS, ///< Blood leak zeroing request in progress. + NUM_OF_BLOOD_LEAK_ZEROING_RQST ///< Number of blood leak zeroing request. +} BLOOD_LEAK_ZEROING_RQST_T; + // ********** private data ********** +/// Blood leak treatment zeroing data structure +typedef struct +{ + F32 DPi2BLDFlushedVolML; ///< Dialysate inlet pump to blood leak flushed volume in milliliters. + F32 rsrvr2DPiFlushedVolML; ///< Active reservoir to dialysate inlet pump 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. + BLOOD_LEAK_ZEROING_RQST_T zeroingRequestState; ///< Blood leak zeroing request state. + BLOOD_LEAK_ZEROING_STATE_T bloodLeakZeroingState; ///< Blood leak zeroing state. +} BLOOD_LEAK_ZEROING_T ; + static DIALYSIS_STATE_T currentDialysisState; ///< Current state of the dialysis sub-mode state machine. static UF_STATE_T currentUFState; ///< Current state of the ultrafiltration state machine. static SALINE_BOLUS_STATE_T currentSalineBolusState; ///< Current state of the saline bolus state machine. @@ -90,11 +115,13 @@ static F32 totalSalineVolumeDelivered_mL; ///< Volume (mL) in total of saline delivered so far (cumulative for all boluses including current one). static F32 bolusSalineVolumeDelivered_mL; ///< Volume (mL) of current bolus delivered so far (calculated from measured blood flow rate). static U32 bolusSalineLastVolumeTimeStamp; ///< Time stamp for last saline volume update. +static BLOOD_LEAK_ZEROING_T bloodLeakZeroingStatus; ///< Blood leak zeroing status. // ********** private function prototypes ********** static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ); static DIALYSIS_STATE_T handleDialysisSalineBolusState( void ); +static DIALYSIS_STATE_T handleDialysisBloodLeakZeroingState( void ); static UF_STATE_T handleUFPausedState( DIALYSIS_STATE_T *dialysisState ); static UF_STATE_T handleUFRunningState( DIALYSIS_STATE_T *dialysisState ); @@ -104,6 +131,13 @@ static SALINE_BOLUS_STATE_T handleSalineBolusInProgressState( DIALYSIS_STATE_T *dialysisState ); static SALINE_BOLUS_STATE_T handleSalineBolusMaxDeliveredState( DIALYSIS_STATE_T *dialysisState ); +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingIdleState( void ); +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingFlushReservoir2DPiState( void ); +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingFlushDPi2BLDState( void ); +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingZeroState( void ); +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingVerifyZeroingState( void ); +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingCompleteState( DIALYSIS_STATE_T *dialysisState ); + static void checkUFControl( void ); static void updateUFVolumes( void ); @@ -160,10 +194,10 @@ resFinalRefVolume[ i ] = 0.0F; resCurrVolume[ i ] = 0.0F; resLastVolume[ i ] = 0.0F; - } resetSalineBolus(); + resetBloodLeakZeroingVariables(); } /*********************************************************************//** @@ -218,6 +252,9 @@ resetReservoirsVariables(); + // Reset the blood leak zeroing variables + resetBloodLeakZeroingVariables(); + // Set valves for dialysis setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); @@ -502,6 +539,19 @@ /*********************************************************************//** * @brief + * The getBloodLeakZeroingState function gets the current blood leak zeroing + * state of the state machine. + * @details Inputs: bloodLeakZeroingStatus + * @details Outputs: none + * @return Current state of the blood leak zeroing state machine + *************************************************************************/ +BLOOD_LEAK_ZEROING_STATE_T getBloodLeakZeroingState( void ) +{ + return bloodLeakZeroingStatus.bloodLeakZeroingState; +} + +/*********************************************************************//** + * @brief * The getUltrafiltrationVolumeCollected function gets the current ultrafiltration * volume collected so far for current treatment. * @details Inputs: measUFVolume @@ -659,6 +709,23 @@ // Check ultrafiltration control during dialysis (even when ultrafiltration is paused). checkUFControl(); + if ( ( TRUE == isBloodLeakZeroingNeeded() ) && ( BLOOD_LEAK_ZEROING_RQST_READY == bloodLeakZeroingStatus.zeroingRequestState ) ) + { + bloodLeakZeroingStatus.zeroingRequestState = BLOOD_LEAK_ZEROING_RQST_REQUESTED; + } + + if ( ( BLOOD_LEAK_ZEROING_RQST_REQUESTED == bloodLeakZeroingStatus.zeroingRequestState ) && ( DIALYSIS_UF_STATE == currentDialysisState ) ) + { + if ( TRUE == checkHasReservoirBeenSwitched() ) + { + requestBloodLeakZeroing( FALSE ); + } + } + + // NOTE: do not move this function this function needs to be after the check for blood leak zeroing logic above. + // If the blood leak logic is no longer needed, the reset function below can be removed. + resetReservoirSwitchFlag(); + // Dialysis state machine switch ( currentDialysisState ) { @@ -670,6 +737,10 @@ currentDialysisState = handleDialysisSalineBolusState(); break; + case DIALYSIS_BLOOD_LEAK_ZEROING_STATE: + currentDialysisState = handleDialysisBloodLeakZeroingState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_DIALYSIS_INVALID_STATE, currentDialysisState ) break; @@ -785,6 +856,23 @@ /*********************************************************************//** * @brief + * The handleDialysisBloodLeakZeroingState function handles the blood leak + * zeroing sub state of the state machine. + * @details Inputs: none + * @details Outputs: none + * @return next Dialysis state. + *************************************************************************/ +static DIALYSIS_STATE_T handleDialysisBloodLeakZeroingState( void ) +{ + DIALYSIS_STATE_T result = DIALYSIS_BLOOD_LEAK_ZEROING_STATE; + + result = execBloodLeakZeroing(); + + return result; +} + +/*********************************************************************//** + * @brief * The handleUFPausedState function handles the Paused state of the * ultrafiltration state machine. * @details Inputs: salineBolusStartRequested @@ -811,6 +899,19 @@ salineBolusStartRequested = FALSE; } } + else if ( TRUE == bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested ) + { + autoResumeUF = FALSE; + if ( BLD_ZEROING_IDLE_STATE == bloodLeakZeroingStatus.bloodLeakZeroingState ) + { + *dialysisState = DIALYSIS_BLOOD_LEAK_ZEROING_STATE; + setCurrent4thLevelState( (U32)bloodLeakZeroingStatus.bloodLeakZeroingState ); + } + else + { + bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested = FALSE; + } + } return result; } @@ -863,6 +964,20 @@ salineBolusStartRequested = FALSE; } } + else if ( TRUE == bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested ) + { + if ( BLD_ZEROING_IDLE_STATE == bloodLeakZeroingStatus.bloodLeakZeroingState ) + { + autoResumeUF = TRUE; + result = UF_PAUSED_STATE; + *dialysisState = DIALYSIS_BLOOD_LEAK_ZEROING_STATE; + setCurrent4thLevelState( (U32)bloodLeakZeroingStatus.bloodLeakZeroingState ); + } + else + { + bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested = FALSE; + } + } return result; } @@ -1008,7 +1123,6 @@ setCurrentSubState( (U32)DIALYSIS_UF_STATE ); setCurrent4thLevelState( (U32)currentUFState ); sendOperationStatusEvent(); - } signalInitiatePressureStabilization( USE_NORMAL_STABILIZATION_PERIOD ); // Resume dialysis @@ -1041,6 +1155,183 @@ /*********************************************************************//** * @brief + * The handleBloodLeakZeroingIdleState function handles the blood leak zeroing + * idle state. In this state the actuators and parameters are set to run + * the blood leak zeroing state machine. + * @details Inputs: bloodLeakZeroingStatus + * @details Outputs: bloodLeakZeroingStatus + * @return next state of the blood leak zeroing state + *************************************************************************/ +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingIdleState( void ) +{ + BLOOD_LEAK_ZEROING_STATE_T state = BLD_ZEROING_IDLE_STATE; + + if ( TRUE == bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested ) + { + bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested = FALSE; + state = BLD_ZEROING_FLUSH_RSRVR_2_DPI_STATE; + + if ( TRUE == bloodLeakZeroingStatus.isZeroingRequestedFromTreatmentStop ) + { + // Cmd DPo to stop + setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + + state = BLD_ZEROING_ZERO_STATE; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakZeroingFlushReservoir2DPiState function handles the + * blood leak zeroing flush reservoir to dialysate inlet pump state. + * @details Inputs: bloodLeakZeroingStatus + * @details Outputs: bloodLeakZeroingStatus + * @return next state of the blood leak zeroing state + *************************************************************************/ +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingFlushReservoir2DPiState( void ) +{ + BLOOD_LEAK_ZEROING_STATE_T state = BLD_ZEROING_FLUSH_RSRVR_2_DPI_STATE; + F32 measuredDPiMLPM = getMeasuredDialInFlowRate(); + + bloodLeakZeroingStatus.rsrvr2DPiFlushedVolML += ( (F32)( measuredDPiMLPM * TASK_GENERAL_INTERVAL ) / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); + + if ( bloodLeakZeroingStatus.rsrvr2DPiFlushedVolML > RSRVR_2_DPI_VOLUME_ML ) + { + // Cmd DPo to stop + setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + stopSyringePump(); + + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + + state = BLD_ZEROING_FLUSH_DPI_2_BLD_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakZeroingFlushDPi2BLDState function handles the blood + * leak zeroing + * flush state. In this state, the line in between the dialysate inlet pump + * to blood leak detector is flushed with new dialysate. + * @details Inputs: bloodLeakZeroingStatus + * @details Outputs: bloodLeakZeroingStatus + * @return next state of the blood leak zeroing state + *************************************************************************/ +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingFlushDPi2BLDState( void ) +{ + BLOOD_LEAK_ZEROING_STATE_T state = BLD_ZEROING_FLUSH_DPI_2_BLD_STATE; + F32 measuredDPiMLPM = getMeasuredDialInFlowRate(); + + bloodLeakZeroingStatus.DPi2BLDFlushedVolML += ( (F32)( measuredDPiMLPM * TASK_GENERAL_INTERVAL ) / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); + + if ( bloodLeakZeroingStatus.DPi2BLDFlushedVolML > DPI_2_BLD_VOLUME_ML ) + { + state = BLD_ZEROING_ZERO_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakZeroingZeroState function handles the blood leak zeroing + * zero state. In this state, the zero blood leak command is issued. + * @details Inputs: none + * @details Outputs: none + * @return next state of the blood leak zeroing state + *************************************************************************/ +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingZeroState( void ) +{ + BLOOD_LEAK_ZEROING_STATE_T state = BLD_ZEROING_ZERO_STATE; + + if ( TRUE == zeroBloodLeak() ) + { + state = BLD_ZEROING_VERIFY_ZEROING_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakZeroingVerifyZeroingState function handles the blood + * leak verifying whether zeroing was successful or not. Based on the pass + * or fail status of the blood leak zeroing the state transition occurs. + * @details Inputs: none + * @details Outputs: none + * @return next state of the blood leak zeroing state + *************************************************************************/ +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingVerifyZeroingState( void ) +{ + BLOOD_LEAK_ZEROING_STATE_T state = BLD_ZEROING_VERIFY_ZEROING_STATE; + SELF_TEST_STATUS_T zeroSelfTestStatus = getBloodLeakSelfTestStatus(); + + if ( SELF_TEST_STATUS_PASSED == zeroSelfTestStatus ) + { + state = BLD_ZEROING_COMPLETE_STATE; + } + else if ( SELF_TEST_STATUS_FAILED == zeroSelfTestStatus ) + { + if ( TRUE == hasBloodLeakZeroSequenceFailed() ) + { + activateAlarmNoData( ALARM_ID_HD_BLOOD_LEAK_SENSOR_ZERO_SEQUENCE_FAILED ); + } + else + { + state = BLD_ZEROING_ZERO_STATE; + } + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleBloodLeakZeroingCompleteState function handles the blood + * leak complete state. The state requests a transition back to dialysis + * if the request to zero the blood leak was issued from the dialysis sub-mode. + * @details Inputs: bloodLeakZeroingStatus, autoResumeUF + * @details Outputs: bloodLeakZeroingStatus, autoResumeUF, currentUFState + * @param pointer to the local dialysis state + * @return next state of the blood leak zeroing state + *************************************************************************/ +static BLOOD_LEAK_ZEROING_STATE_T handleBloodLeakZeroingCompleteState( DIALYSIS_STATE_T *dialysisState ) +{ + BLOOD_LEAK_ZEROING_STATE_T state = BLD_ZEROING_COMPLETE_STATE; + + if ( FALSE == bloodLeakZeroingStatus.isZeroingRequestedFromTreatmentStop ) + { + *dialysisState = DIALYSIS_UF_STATE; + + // Resume UF if appropriate + if ( TRUE == autoResumeUF ) + { + autoResumeUF = FALSE; + currentUFState = UF_RUNNING_STATE; + //Set substate for event + setCurrentSubState( (U32)DIALYSIS_UF_STATE ); + setCurrent4thLevelState( (U32)currentUFState ); + sendOperationStatusEvent(); + } + + signalInitiatePressureStabilization( USE_NORMAL_STABILIZATION_PERIOD ); + // Resume dialysis + transitionToDialysis(); + } + + return state; +} + +/*********************************************************************//** + * @brief * The publishSalineBolusData function handles the max saline delivered * state of the saline bolus state machine. This is a terminal state. * @details Inputs: none @@ -1054,9 +1345,13 @@ { SALINE_BOLUS_DATA_PAYLOAD_T data; - data.tgtSalineVolumeMl = getTreatmentParameterU32( TREATMENT_PARAM_SALINE_BOLUS_VOLUME ); - data.cumSalineVolumeMl = totalSalineVolumeDelivered_mL; - data.bolSalineVolumeMl = bolusSalineVolumeDelivered_mL; + data.tgtSalineVolumeMl = getTreatmentParameterU32( TREATMENT_PARAM_SALINE_BOLUS_VOLUME ); + data.cumSalineVolumeMl = totalSalineVolumeDelivered_mL; + data.bolSalineVolumeMl = bolusSalineVolumeDelivered_mL; + data.bloodLeakZeroingDPi2BLDFlushVolumeML = bloodLeakZeroingStatus.DPi2BLDFlushedVolML; + data.bloodLeakZeroingRsrvr2DPiFlushVolumeML = bloodLeakZeroingStatus.rsrvr2DPiFlushedVolML; + data.bloodLeakZeroingNeededAfterRsrvrSwitch = (U32)bloodLeakZeroingStatus.zeroingRequestState; + broadcastData( MSG_ID_SALINE_BOLUS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SALINE_BOLUS_DATA_PAYLOAD_T ) ); salineBolusBroadcastTimerCtr = 0; } @@ -1233,6 +1528,100 @@ /*********************************************************************//** * @brief + * The execBloodLeakZeroing function handles the blood leak zeroing sequence + * @details Inputs: bloodLeakZeroing + * @details Outputs: bloodLeakZeroing + * @return next state of the dialysis state machine + *************************************************************************/ +DIALYSIS_STATE_T execBloodLeakZeroing( void ) +{ + BLOOD_LEAK_ZEROING_STATE_T prevState = bloodLeakZeroingStatus.bloodLeakZeroingState; + DIALYSIS_STATE_T dialysisState = currentDialysisState; + + switch( bloodLeakZeroingStatus.bloodLeakZeroingState ) + { + case BLD_ZEROING_IDLE_STATE: + bloodLeakZeroingStatus.bloodLeakZeroingState = handleBloodLeakZeroingIdleState(); + break; + + case BLD_ZEROING_FLUSH_RSRVR_2_DPI_STATE: + bloodLeakZeroingStatus.bloodLeakZeroingState = handleBloodLeakZeroingFlushReservoir2DPiState(); + break; + + case BLD_ZEROING_FLUSH_DPI_2_BLD_STATE: + bloodLeakZeroingStatus.bloodLeakZeroingState = handleBloodLeakZeroingFlushDPi2BLDState(); + break; + + case BLD_ZEROING_ZERO_STATE: + bloodLeakZeroingStatus.bloodLeakZeroingState = handleBloodLeakZeroingZeroState(); + break; + + case BLD_ZEROING_VERIFY_ZEROING_STATE: + bloodLeakZeroingStatus.bloodLeakZeroingState = handleBloodLeakZeroingVerifyZeroingState(); + break; + + case BLD_ZEROING_COMPLETE_STATE: + bloodLeakZeroingStatus.bloodLeakZeroingState = handleBloodLeakZeroingCompleteState( &dialysisState ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_TREATMENT_INVALID_BLOOD_LEAK_ZEROING_STATE, + bloodLeakZeroingStatus.bloodLeakZeroingState ) + break; + } + + if ( prevState != bloodLeakZeroingStatus.bloodLeakZeroingState ) + { + setCurrent4thLevelState( (U32)bloodLeakZeroingStatus.bloodLeakZeroingState ); + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, prevState, bloodLeakZeroingStatus.bloodLeakZeroingState ) + } + + return dialysisState; +} + +/*********************************************************************//** + * @brief + * The requestBloodLeakZeroing function sets the flag the requests the + * blood leak zeroing. + * @details Inputs: none + * @details Outputs: bloodLeakZeroing + * @return none + *************************************************************************/ +void requestBloodLeakZeroing( BOOL isRequestFromTreatmentStop ) +{ + bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested = TRUE; + bloodLeakZeroingStatus.isZeroingRequestedFromTreatmentStop = isRequestFromTreatmentStop; + bloodLeakZeroingStatus.zeroingRequestState = BLOOD_LEAK_ZEROING_RQST_IN_PROGRESS; + bloodLeakZeroingStatus.bloodLeakZeroingState = BLD_ZEROING_IDLE_STATE; + + if ( FALSE == isRequestFromTreatmentStop ) + { + signalInitiatePressureStabilization( USE_NORMAL_STABILIZATION_PERIOD ); + } + + SEND_EVENT_WITH_2_F32_DATA( HD_EVENT_BLOOD_LEAK_ZEROING_REQUIRED, 0, 0 ) +} + +/*********************************************************************//** + * @brief + * The resetBloodLeakZeroingVariables function resets the blood leak zeroing + * variables. + * @details Inputs: none + * @details Outputs: bloodLeakZeroing + * @return none + *************************************************************************/ +void resetBloodLeakZeroingVariables( void ) +{ + bloodLeakZeroingStatus.DPi2BLDFlushedVolML = 0.0F; + bloodLeakZeroingStatus.rsrvr2DPiFlushedVolML = 0.0F; + bloodLeakZeroingStatus.bloodLeakZeroingState = BLD_ZEROING_IDLE_STATE; + bloodLeakZeroingStatus.hasBloodLeakZeroingBeenRequested = FALSE; + bloodLeakZeroingStatus.isZeroingRequestedFromTreatmentStop = FALSE; + bloodLeakZeroingStatus.zeroingRequestState = BLOOD_LEAK_ZEROING_RQST_READY; +} + +/*********************************************************************//** + * @brief * The checkLoadCellsStablePrimaryBackupDriftOutOfRange function checks the * load cells' primary and backup drift when the reservoir level has been stable * for greater than large filter time.