Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -ra3960210792d0811093a6913e505d43eda1918ea -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a3960210792d0811093a6913e505d43eda1918ea) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -56,6 +56,7 @@ #define RESERVOIR_TEMPERATURE_TAU_C_PER_MIN -0.512 ///< Reservoir temperature time constant C/min. #define ULTRAFILTER_TEMPERATURE_TAU_C_PER_MIN -0.512 ///< Ultrafilter temperature time constant C/min. #define ULTRAFILTER_VOLUME_ML 700 +#define RESERVOIR_EXTRA_TEMPERATURE 1.0 // ********** private data ********** @@ -68,9 +69,11 @@ F32 timeUFDecayMS; F32 timeReservoirFillMS; F32 tempUFFill; - F32 tempReservoirStartFill; + F32 tempReservoirUseActual; + F32 tempReservoir0; F32 tempReservoirEndFill; F32 tempTargetTrimmer; + F32 flowTargetDialysateLPM; } HEATERS_TEMPERATURE_CALC_DATA_T; static HEATERS_TEMPERATURE_CALC_DATA_T heatersTempCalc; @@ -100,7 +103,6 @@ // ********** private function prototypes ********** static BOOL processCalibrationData( void ); -static F32 getPrimaryHeaterTargetTemperature( void ); /*********************************************************************//** * @brief @@ -146,8 +148,11 @@ data.timeReservoirFill2SwitchMS = heatersTempCalc.timeReservoirFill2SwitchMS; data.timeUFDecayMS = heatersTempCalc.timeUFDecayMS; data.tempUFFill = heatersTempCalc.tempUFFill; - data.tempReservoirStartFill = heatersTempCalc.tempReservoirStartFill; + data.tempReservoirUseActual = getReservoirActualTemperature(); data.tempReservoirEndFill = heatersTempCalc.tempReservoirEndFill; + data.tempAvgFill = getAvgFillTemperature(); + data.tempLastFill = getLastFillTemperature(); + data.timereservoirFill = heatersTempCalc.timeReservoirFillMS; broadcastData( MSG_ID_DG_RESERVOIRS_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( RESERVOIR_DATA_T ) ); reservoirDataPublicationTimerCounter = 0; @@ -471,28 +476,15 @@ /*********************************************************************//** * @brief - * The getReservoirActualTemperature function calculates the reservoir's - * actual temperature. + * The getTargetDialysateFlowLPM function returns the target dialysate flow + * rate in L/min. * @details Inputs: none * @details Outputs: heatersTempCalc - * @return reservoir actual temperature + * @return target dialysate flow rate in L/min *************************************************************************/ -F32 getReservoirActualTemperature( void ) +F32 getTargetDialysateFlowLPM( void ) { - F32 reservoirTemp = 0.0; - F32 targetFillVolML = getTargetFillVolumeML(); - F32 timeHalfFillMS = ( getTargetFillFlowRateLPM() * ML_PER_LITER * 0.5 ) / targetFillVolML; - F32 fillLastTemp = getLastFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getLastFillTemperature(); - F32 fillAvgTemp = getAvgFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getAvgFillTemperature(); - - F32 ultrafilterPart = ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * heatersTempCalc.tempUFFill; - F32 fillPart = ( ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ) * fillAvgTemp ); - heatersTempCalc.tempReservoirStartFill = ultrafilterPart + fillPart; - - heatersTempCalc.tempReservoirEndFill = heatersTempCalc.tempReservoirStartFill + ( timeHalfFillMS * RESERVOIR_TAU_C_PER_MS ); - reservoirTemp = heatersTempCalc.tempReservoirEndFill + ( heatersTempCalc.timeReservoirFill2SwitchMS * RESERVOIR_TAU_C_PER_MS ); - - return reservoirTemp; + return heatersTempCalc.flowTargetDialysateLPM; } /*********************************************************************//** @@ -543,24 +535,83 @@ /*********************************************************************//** * @brief - * The setActiveReservoirCycleTime function sets the active reservoir cycle - * time in milliseconds. + * The setDialysateHeatingParameters function sets the dialysate heating + * parameters. * @details Inputs: none - * @details Outputs: heatersTemperatureCalcData + * @details Outputs: heatersTempCalc * @return none *************************************************************************/ -void setHeatersTargetTemperature( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ) +void setDialysateHeatingParameters( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ) { heatersTempCalc.timeReservoirCycleMS = params.timeReservoirCycleMS; heatersTempCalc.timeReservoirFill2SwitchMS = params.timeReservoirWait2SwitchMS; heatersTempCalc.timeReservoirFillMS = params.timeReservoirFillMS; heatersTempCalc.tempTargetTrimmer = params.trimmerTargetTemperature; + heatersTempCalc.flowTargetDialysateLPM = params.dialysateFlowLPM; +} - setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); +/*********************************************************************//** + * @brief + * The getReservoirActualTemperature function calculates the reservoir's + * actual temperature. + * @details Inputs: none + * @details Outputs: heatersTempCalc + * @return reservoir actual temperature + *************************************************************************/ +F32 getReservoirActualTemperature( void ) +{ + F32 UFTimeConstant = 0.0; + F32 targetFillVolML = getTargetFillVolumeML(); + F32 tempLastFill = getLastFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getLastFillTemperature(); // TODO move to reset fill items function + F32 tempAvgFill = getAvgFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getAvgFillTemperature(); // TODO move this to the reset function + + heatersTempCalc.timeUFDecayMS = (F32)heatersTempCalc.timeReservoirCycleMS - heatersTempCalc.timeReservoirFillMS; + UFTimeConstant = heatersTempCalc.timeUFDecayMS * ULTRAFILTER_TAU_C_PER_MS; + heatersTempCalc.tempUFFill = tempLastFill + UFTimeConstant; + + F32 ultrafilterPart = ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * heatersTempCalc.tempUFFill; + F32 fillPart = ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ) * tempAvgFill; + F32 tempReservoir0Actual = ultrafilterPart + fillPart; + + F32 tempReservoirEndfillActual = tempReservoir0Actual + ( ( heatersTempCalc.timeReservoirFillMS * 0.5 ) * RESERVOIR_TAU_C_PER_MS ); + heatersTempCalc.tempReservoirUseActual = tempReservoirEndfillActual + ( heatersTempCalc.timeReservoirFill2SwitchMS * RESERVOIR_TAU_C_PER_MS ); + + return heatersTempCalc.tempReservoirUseActual; } /*********************************************************************//** * @brief + * The getPrimaryHeaterTargetTemperature function calculates the primary + * heater target temperature and returns target temperature value. + * @details Inputs: none + * @details Outputs: heatersTempCalc + * @return primary heater target temperature + *************************************************************************/ +F32 getPrimaryHeaterTargetTemperature( void ) +{ + // TODO once the equations are solidified, add the equations as comments to the lines + F32 tempTarget = 0.0; + F32 targetFillVolML = getTargetFillVolumeML(); + F32 UFTimeConstant = 0.0; + F32 tempLastFill = getLastFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getLastFillTemperature(); // TODO move this to the reset function + + F32 tempReservoirUse = heatersTempCalc.tempTargetTrimmer + RESERVOIR_EXTRA_TEMPERATURE; + heatersTempCalc.tempReservoirEndFill = tempReservoirUse - ( heatersTempCalc.timeReservoirFill2SwitchMS * RESERVOIR_TAU_C_PER_MS ); + heatersTempCalc.tempReservoir0 = heatersTempCalc.tempReservoirEndFill - ( ( heatersTempCalc.timeReservoirFillMS * 0.5 ) * RESERVOIR_TAU_C_PER_MS ); + + heatersTempCalc.timeUFDecayMS = (F32)heatersTempCalc.timeReservoirCycleMS - heatersTempCalc.timeReservoirFillMS; + UFTimeConstant = heatersTempCalc.timeUFDecayMS * ULTRAFILTER_TAU_C_PER_MS; + heatersTempCalc.tempUFFill = tempLastFill + UFTimeConstant; + + F32 tempTargetNumerator = heatersTempCalc.tempReservoir0 - ( ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * heatersTempCalc.tempUFFill ); + F32 targetTempDenominator = ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ); + tempTarget = tempTargetNumerator / targetTempDenominator; + + return tempTarget; +} + +/*********************************************************************//** + * @brief * The getReservoirsCalRecord function returns the reservoirs' calibration * record. * @details Inputs: reservoirsCalRecord @@ -714,40 +765,7 @@ return status; } -/*********************************************************************//** - * @brief - * The getPrimaryHeaterTargetTemperature function calculates the primary - * heater target temperature and returns target temperature value. - * @details Inputs: none - * @details Outputs: heatersTempCalc - * @return primary heater target temperature - *************************************************************************/ -static F32 getPrimaryHeaterTargetTemperature( void ) -{ - // TODO once the equations are solidified, add the equations as comments to the lines - F32 targetTemp = 0.0; - F32 targetFillVolML = getTargetFillVolumeML(); - F32 timeFillMS = heatersTempCalc.timeReservoirFillMS; - F32 UFTimeConstant = 0.0; - F32 fillLastTemp = getLastFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getLastFillTemperature(); - F32 fillAvgTemp = getAvgFillTemperature() < NEARLY_ZERO ? heatersTempCalc.tempTargetTrimmer : getAvgFillTemperature(); - heatersTempCalc.timeUFDecayMS = (F32)heatersTempCalc.timeReservoirCycleMS - timeFillMS + (F32)heatersTempCalc.timeReservoirFill2SwitchMS; - UFTimeConstant = heatersTempCalc.timeUFDecayMS * ULTRAFILTER_TAU_C_PER_MS; - heatersTempCalc.tempUFFill = fillLastTemp + UFTimeConstant; - - F32 ultrafilterPart = ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * heatersTempCalc.tempUFFill; - F32 fillPart = ( ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ) * fillAvgTemp ); - heatersTempCalc.tempReservoirStartFill = ultrafilterPart + fillPart; - - F32 targetTempNumerator = heatersTempCalc.tempReservoirStartFill - ( ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * UFTimeConstant ); - F32 targetTempDenominator = ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ); - targetTemp = targetTempNumerator / targetTempDenominator; - - return targetTemp; -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -767,8 +785,8 @@ if ( TRUE == isTestingActivated() ) { - result = TRUE; - activeReservoir.ovData = value; + result = TRUE; + activeReservoir.ovData = value; activeReservoir.override = OVERRIDE_KEY; } @@ -788,9 +806,9 @@ if ( TRUE == isTestingActivated() ) { - result = TRUE; + result = TRUE; activeReservoir.override = OVERRIDE_RESET; - activeReservoir.ovData = activeReservoir.ovInitData; + activeReservoir.ovData = activeReservoir.ovInitData; } return result;