Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r16cd633e1d18224face6f977120ccab3846e7671 -r945dcc1391faefe5f4ddb4f505361501d008e293 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 16cd633e1d18224face6f977120ccab3846e7671) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 945dcc1391faefe5f4ddb4f505361501d008e293) @@ -202,7 +202,7 @@ static DG_FILL_MODE_STATE_T handleDeliverDialysateState( void ) { DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; - LOAD_CELL_ID_T fillWeightLoadCell = LOAD_CELL_A1; + RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); handleDialysateMixing(); checkConcentrateConductivity(); @@ -220,14 +220,8 @@ result = DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION; } - // determine which load cell to use for fill volume - we want weight of inactive reservoir - if ( RESERVOIR_1 == getActiveReservoir() ) - { - fillWeightLoadCell = LOAD_CELL_B1; - } - // if we've reached our target fill to volume (by weight), we're done filling - go back to re-circ mode - if ( getReservoirFillVolumeTargetMl() <= getLoadCellFilteredWeight( fillWeightLoadCell ) ) + if ( hasTargetFillVolumeReached( inactiveReservoir ) ) { requestConcentratePumpOff(); requestNewOperationMode( DG_MODE_CIRC ); Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r87a22cbaa87daab0d7cedabc67452cead83d8630 -r945dcc1391faefe5f4ddb4f505361501d008e293 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 87a22cbaa87daab0d7cedabc67452cead83d8630) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 945dcc1391faefe5f4ddb4f505361501d008e293) @@ -64,6 +64,9 @@ static BOOL tareLoadCellRequest; ///< Flag indicates if load cell tare has been requested by HD. // ********** private function prototypes ********** + +static RESERVOIR_ID_T getActiveReservoir( void ); +static U32 getReservoirFillVolumeTargetMl( void ); static U32 getReservoirDrainVolumeTargetMl( void ); /*********************************************************************//** @@ -282,25 +285,6 @@ return result; } - -/*********************************************************************//** - * @brief - * The getActiveReservoir function gets the active reservoir. - * @details Inputs: activeReservoir - * @details Outputs: none - * @return the currently active reservoir. - *************************************************************************/ -RESERVOIR_ID_T getActiveReservoir( void ) -{ - RESERVOIR_ID_T result = (RESERVOIR_ID_T)activeReservoir.data; - - if ( OVERRIDE_KEY == activeReservoir.override ) - { - result = (RESERVOIR_ID_T)activeReservoir.ovData; - } - - return result; -} /*********************************************************************//** * @brief @@ -320,39 +304,24 @@ return inactiveReservoir; } - -/*********************************************************************//** - * @brief - * The getReservoirFillVolumeTargetMl function gets the reservoir fill volume (in mL). - * @details Inputs: fillVolumeTargetMl - * @details Outputs: none - * @return the current target reservoir fill volume (in mL). - *************************************************************************/ -U32 getReservoirFillVolumeTargetMl( void ) -{ - U32 result = fillVolumeTargetMl.data; - - if ( OVERRIDE_KEY == fillVolumeTargetMl.override ) - { - result = fillVolumeTargetMl.ovData; - } - - return result; -} /*********************************************************************//** * @brief - * The resetReservoirLoadCellsOffset function sets the reservoir's load cells - * offset to zero. - * @details Inputs: associateLoadCell[], redundantLoadCell[] - * @details Outputs: reset reservoir's associate load cells auto calibration offset + * The hasTargetFillVolumeReached function checks if the target fill volume + * for specific reservoir has been reached. + * @details Inputs: fillVolumeTargetMl + * @details Outputs: none * @param reservoirId reservoir id - * @return none + * @return TRUE if target fill volume has been reached, FALSE if not. *************************************************************************/ -void resetReservoirLoadCellsOffset( RESERVOIR_ID_T reservoirId ) +BOOL hasTargetFillVolumeReached( RESERVOIR_ID_T reservoirId ) { - resetLoadCellOffset( associateLoadCell[ reservoirId ] ); - resetLoadCellOffset( redundantLoadCell[ reservoirId ] ); + F32 const loadcellWeight = getLoadCellFilteredWeight( associateLoadCell[ reservoirId ] ); + F32 const redundantLoadcellWeight = getLoadCellFilteredWeight( redundantLoadCell[ reservoirId ] ); + U32 const targetFillVolume = getReservoirFillVolumeTargetMl(); + BOOL const hasTargetReached = ( loadcellWeight >= targetFillVolume ) || ( redundantLoadcellWeight >= targetFillVolume ); + + return hasTargetReached; } /*********************************************************************//** @@ -399,6 +368,59 @@ /*********************************************************************//** * @brief + * The resetReservoirLoadCellsOffset function sets the reservoir's load cells + * offset to zero. + * @details Inputs: associateLoadCell[], redundantLoadCell[] + * @details Outputs: reset reservoir's associate load cells auto calibration offset + * @param reservoirId reservoir id + * @return none + *************************************************************************/ +void resetReservoirLoadCellsOffset( RESERVOIR_ID_T reservoirId ) +{ + resetLoadCellOffset( associateLoadCell[ reservoirId ] ); + resetLoadCellOffset( redundantLoadCell[ reservoirId ] ); +} + +/*********************************************************************//** + * @brief + * The getActiveReservoir function gets the active reservoir. + * @details Inputs: activeReservoir + * @details Outputs: none + * @return the currently active reservoir. + *************************************************************************/ +static RESERVOIR_ID_T getActiveReservoir( void ) +{ + RESERVOIR_ID_T result = (RESERVOIR_ID_T)activeReservoir.data; + + if ( OVERRIDE_KEY == activeReservoir.override ) + { + result = (RESERVOIR_ID_T)activeReservoir.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The getReservoirFillVolumeTargetMl function gets the reservoir fill volume (in mL). + * @details Inputs: fillVolumeTargetMl + * @details Outputs: none + * @return the current target reservoir fill volume (in mL). + *************************************************************************/ +static U32 getReservoirFillVolumeTargetMl( void ) +{ + U32 result = fillVolumeTargetMl.data; + + if ( OVERRIDE_KEY == fillVolumeTargetMl.override ) + { + result = fillVolumeTargetMl.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getReservoirDrainVolumeTargetMl function gets the reservoir drain volume (in mL). * @details Inputs: drainVolumeTargetMl * @details Outputs: none Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r87a22cbaa87daab0d7cedabc67452cead83d8630 -r945dcc1391faefe5f4ddb4f505361501d008e293 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 87a22cbaa87daab0d7cedabc67452cead83d8630) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 945dcc1391faefe5f4ddb4f505361501d008e293) @@ -60,12 +60,11 @@ BOOL startTrimmerHeaterCmd( void ); // handle start trimmer heater control command from HD BOOL stopTrimmerHeaterCmd( void ); // handle stop trimmer heater control command from HD -RESERVOIR_ID_T getActiveReservoir( void ); RESERVOIR_ID_T getInactiveReservoir( void ); -U32 getReservoirFillVolumeTargetMl( void ); +BOOL hasTargetFillVolumeReached( RESERVOIR_ID_T reservoirId ); +BOOL hasTargetDrainVolumeReached( RESERVOIR_ID_T reservoirId , U32 timeout ); void resetReservoirLoadCellsOffset( RESERVOIR_ID_T reservoirId ); -BOOL hasTargetDrainVolumeReached( RESERVOIR_ID_T reservoirId , U32 timeout ); BOOL testSetDGActiveReservoirOverride( RESERVOIR_ID_T value ); BOOL testResetDGActiveReservoirOverride( void );