Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -ra3960210792d0811093a6913e505d43eda1918ea -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision a3960210792d0811093a6913e505d43eda1918ea) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -87,20 +87,21 @@ /// Heaters data structure typedef struct { - F32 targetTemp; ///< Heater target temperature. + F32 targetTemp; ///< Heater target temperature. HEATERS_STATE_T state; ///< Heater state. BOOL startHeaterSignal; ///< Heater start indication flag. BOOL isHeaterOn; ///< Heater on/off status flag. - F32 dutycycle; ///< Heater duty cycle. - F32 targetROFlow; ///< Heater target flow. - U32 heaterOnWithNoFlowTimer; // TODO remove ///< Heater on with no flow timer. + F32 dutycycle; ///< Heater duty cycle. + F32 targetROFlow; ///< Heater target flow. + U32 heaterOnWithNoFlowTimer; // TODO remove ///< Heater on with no flow timer. BOOL isFlowBelowMin; ///< Heater flow below minimum flag indicator. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. - F32 heaterEfficiency; ///< Heater efficiency during the run. + F32 heaterEfficiency; ///< Heater efficiency during the run. BOOL hasTargetBeenReached; ///< Heater flag to indicate whether the target temperature has been reached. U32 tempOutOfRangeTimer; ///< Heater temperature out of range timer TODO remove once the mechanical thermal cutoff was implemented BOOL isHeaterTempOutOfRange; ///< Heater temperature out of range flag indicator TODO remove once the mechanical thermal cutoff was implemented + F32 temporaryInterimTemperature; ///< TODO remove } HEATER_STATUS_T; static HEATER_STATUS_T heatersStatus[ NUM_OF_DG_HEATERS ]; ///< Heaters status. @@ -327,8 +328,8 @@ { cmdResponse.rejected = FALSE; #ifndef DISABLE_HEATERS_AND_TEMPS - heatersStatus[ DG_TRIMMER_HEATER ].targetTemp = heaterCmdPtr->targetTemp; - heatersStatus[ DG_TRIMMER_HEATER ].startHeaterSignal = TRUE; + //heatersStatus[ DG_TRIMMER_HEATER ].targetTemp = heaterCmdPtr->targetTemp; DEBUG_DENALI + //heatersStatus[ DG_TRIMMER_HEATER ].startHeaterSignal = TRUE; #endif } else @@ -464,23 +465,24 @@ F32 targetFlow = 0.0; F32 dutyCycle = 0.0; F32 targetTemperature = heatersStatus[ heater ].targetTemp; + DG_OP_MODE_T opMode = getCurrentOperationMode(); - if ( DG_MODE_FILL == getCurrentOperationMode() ) + if ( DG_MODE_FILL == opMode ) { // If the previous average fill flow rate is 0, use the nominal target RO flow from the RO pump targetFlow = ( getAvgFillFlowRate() - 0.0 > NEARLY_ZERO ? getAvgFillFlowRate() : getTargetROPumpFlowRate() ); dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, TRUE ); state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; } - else if ( ( DG_MODE_GENE == getCurrentOperationMode() ) || ( DG_MODE_DRAI == getCurrentOperationMode() ) ) + else if ( ( DG_MODE_GENE == opMode ) || ( DG_MODE_DRAI == opMode ) ) { targetTemperature += DELTA_TEMPERATURE_TIME_COSNTANT_C; // Use target flow rate during Idle and drain targetFlow = getTargetROPumpFlowRate(); dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, FALSE ); state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; } - else if ( ( DG_MODE_HEAT == getCurrentOperationMode() ) || ( DG_MODE_CHEM == getCurrentOperationMode() ) ) + else if ( ( DG_MODE_HEAT == opMode ) || ( DG_MODE_CHEM == opMode ) ) { // If the mode is any of the disinfects, especially heat, use the target flow rate instead of the avg. flow // Most of the times the heater should be running at 100% duty cycle since the target temperature is 81 C @@ -489,6 +491,10 @@ state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; } + // TODO remove + heatersStatus[ DG_PRIMARY_HEATER ].temporaryInterimTemperature = targetTemperature; + // TODO remove + setHeaterDutyCycle( heater, dutyCycle ); return state; @@ -571,32 +577,25 @@ HEATERS_STATE_T state = HEATER_EXEC_STATE_TRIMMER_RAMP_TO_TARGET; DG_HEATERS_T heater = DG_TRIMMER_HEATER; F32 currentTemperature = 0.0; - F32 targetFlow = 0.35; // TODO get target dialysate flow from HD + F32 targetFlow = getTargetDialysateFlowLPM(); F32 dutyCycle = 0.0; F32 targetTemperature = heatersStatus[ heater ].targetTemp; + DG_OP_MODE_T opMode = getCurrentOperationMode(); - if ( DG_MODE_FILL == getCurrentOperationMode() ) + if ( ( DG_MODE_FILL == opMode ) || ( DG_MODE_GENE == opMode ) || ( DG_MODE_DRAI == opMode ) ) { currentTemperature = getReservoirActualTemperature(); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, currentTemperature, targetFlow, TRUE ); + dutyCycle = calculateTrimmerHeaterDutyCycle( targetTemperature, currentTemperature, targetFlow, TRUE ); state = HEATER_EXEC_STATE_TRIMMER_CONTROL_TO_TARGET; } - /*else if ( ( DG_MODE_GENE == getCurrentOperationMode() ) || ( DG_MODE_DRAI == getCurrentOperationMode() ) ) + else if ( DG_MODE_HEAT == opMode ) { - targetTemperature += DELTA_TEMPERATURE_TIME_COSNTANT_C; - // Use target flow rate during Idle and drain - targetFlow = getTargetROPumpFlowRate(); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlow, FALSE ); - state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; - }*/ // TODO do we need this else if for the trimmer heater - else if ( DG_MODE_HEAT == getCurrentOperationMode() ) - { // If the mode is heat disinfect, use the target flow rate instead of the avg. flow // Most of the times the heater should be running at 100% duty cycle since the target temperature is 81 C and // it is far from the inlet temperature. currentTemperature = getTemperatureValue( (U32)TEMPSENSORS_HEAT_DISINFECT ); targetFlow = getTargetROPumpFlowRate(); - dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, currentTemperature, targetFlow, FALSE ); + dutyCycle = calculateTrimmerHeaterDutyCycle( targetTemperature, currentTemperature, targetFlow, FALSE ); state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; } @@ -667,7 +666,7 @@ // Get the primary heater's efficiency and the last fill temperature from the ModeFill F32 heaterEfficiency = heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency; - if ( TRUE == checkEfficiency ) + /*if ( TRUE == checkEfficiency ) { F32 lastFillTemperature = getLastFillTemperature(); @@ -685,7 +684,7 @@ // Update the heaters efficiency heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency = heaterEfficiency; - } + }*/ // TODO bring this part back // Duty cycle = ( 69.73 * flow rate * deltaT / primary heater maximum power ) ^ 1/2 // Multiply the duty cycle to the heater efficiency @@ -699,18 +698,32 @@ return dutyCycle; } +/*********************************************************************//** + * @brief + * The calculateTrimmerHeaterDutyCycle function calculates the trimmer + * heater's duty cycle. + * @details Inputs: none + * @details Outputs: none + * @param targetTemperature target temperature of the heater + * @oaram currentTemperature current inlet temperature of the heater + * @param flow current flow + * @param check efficiency flag to indicate whether to consider heater's + * efficiency + * @return calculated duty cycle + *************************************************************************/ static F32 calculateTrimmerHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ) { // Get the primary heater's efficiency and the last fill temperature from the ModeFill F32 heaterEfficiency = heatersStatus[ DG_TRIMMER_HEATER ].heaterEfficiency; + F32 dutyCycle = 0.0; if ( TRUE == checkEfficiency ) { // TODO add the trimmer efficiency } - F32 dutyCycle = flow * WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * ( targetTemperature - currentTemperature ) * heaterEfficiency; + dutyCycle = flow * WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * ( targetTemperature - currentTemperature ) * heaterEfficiency; // Check the boundaries of the calculated duty cycle dutyCycle = ( dutyCycle > HEATERS_MAX_DUTY_CYCLE ? HEATERS_MAX_DUTY_CYCLE : dutyCycle ); @@ -732,7 +745,7 @@ static BOOL haveHeaterControlConditionsChanged( DG_HEATERS_T heater ) { BOOL status = FALSE; - F32 targetFlow = getTargetROPumpFlowRate(); + F32 targetFlow = getTargetROPumpFlowRate(); BOOL hasFlowChanged = ( fabs( targetFlow - heatersStatus[ heater ].targetROFlow ) > NEARLY_ZERO ? TRUE : FALSE ); // Check if the target flow has changed or the target temperature has changed. @@ -812,6 +825,11 @@ data.trimmerHeaterState = heatersStatus[ DG_TRIMMER_HEATER ].state; data.primaryEfficiency = heatersStatus[ DG_PRIMARY_HEATER ].heaterEfficiency * 100; + data.dialysateTargetLPM = getTargetDialysateFlowLPM(); + data.interimTargetTemp = heatersStatus[ DG_PRIMARY_HEATER ].temporaryInterimTemperature; + data.targetHeaterFlowLPM = heatersStatus[ DG_PRIMARY_HEATER ].targetROFlow; + + broadcastData( MSG_ID_DG_HEATERS_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( HEATERS_DATA_T ) ); dataPublicationTimerCounter = 0; Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -ra3960210792d0811093a6913e505d43eda1918ea -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision a3960210792d0811093a6913e505d43eda1918ea) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -42,7 +42,7 @@ NUM_OF_DG_HEATERS, ///< Number of the heaters } DG_HEATERS_T; -/// Trimmer heater command data structure.2 +/// Trimmer heater command data structure typedef struct { BOOL startHeater; ///< Flag indicates start or stop heater @@ -60,6 +60,9 @@ U32 primaryHeaterState; ///< Primary heater state U32 trimmerHeaterState; ///< Trimmer heater state F32 primaryEfficiency; ///< Primary heater efficiency + F32 dialysateTargetLPM; ///< TODO remove this variable later + F32 interimTargetTemp; ///< TODO remove this variable later + F32 targetHeaterFlowLPM ///< TODO remove this variable later } HEATERS_DATA_T; // ********** Public function prototypes ********** Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -117,6 +117,7 @@ #ifndef DISABLE_FLOW_CONTROL_TREATMENT setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); #endif + setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); return drainState; Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -ra3960210792d0811093a6913e505d43eda1918ea -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision a3960210792d0811093a6913e505d43eda1918ea) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -130,16 +130,14 @@ concentratePumpPrimeCount = 0; // Get the heaters info form the NV data management - DG_HEATERS_RECORD_T heaterInfo = getHeatersInfoReocrd(); + /*DG_HEATERS_RECORD_T heaterInfo = getHeatersInfoReocrd(); // If the data in the NV data management was not initialized properly, set it to 0 otherwise, set the average flow rate fillStatus.fillFlowRateAverage = ( heaterInfo.averageFillFlow < NEARLY_ZERO ? 0.0 : heaterInfo.averageFillFlow ); fillStatus.fillFlowRateRunningSum = 0.0; fillStatus.fillSampleCounter = 0; fillStatus.fillTemperatureRunningSum = 0.0; fillStatus.fillTemperatureAverage = 0.0; - // The last fill temperature is initialized to TPo because this value is used for heater calculations prior to filling the - // reservoirs. The first actual value will be updated at the end of the fill cycle. - fillStatus.fillLastTemperature = getTemperatureValue( (U32)TEMPSENSORS_INLET_PRIMARY_HEATER ); + fillStatus.fillLastTemperature = 0.0;*/ // TODO take this out of here. This only should be initialized once at the beginning of the treatment initPersistentAlarm( ALARM_ID_ACID_CONDUCTIVITY_OUT_OF_RANGE, 0, EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ); initPersistentAlarm( ALARM_ID_BICARB_CONDUCTIVITY_OUT_OF_RANGE, 0, EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ); @@ -173,6 +171,7 @@ #ifndef DISABLE_FLOW_CONTROL_TREATMENT setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); #endif + setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); return fillState; Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -25,6 +25,7 @@ #include "NVDataMgmt.h" #include "OperationModes.h" #include "Pressures.h" +#include "Reservoirs.h" #include "ROPump.h" #include "SystemComm.h" #include "TaskGeneral.h" @@ -108,7 +109,7 @@ // the new PWMs for the main and small primary heaters #ifndef DISABLE_FLOW_CONTROL_TREATMENT setROPumpTargetFlowRateLPM( TARGET_FLUSH_LINES_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); - setHeaterTargetTemperature( DG_PRIMARY_HEATER, 39.0 ); // TODO remove this line. It comes form HD this for testing only + setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); #endif 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; Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -ra3960210792d0811093a6913e505d43eda1918ea -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision a3960210792d0811093a6913e505d43eda1918ea) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -81,8 +81,11 @@ U32 timeReservoirFill2SwitchMS; F32 timeUFDecayMS; F32 tempUFFill; - F32 tempReservoirStartFill; + F32 tempReservoirUseActual; F32 tempReservoirEndFill; + F32 tempAvgFill; + F32 tempLastFill; + F32 timereservoirFill; } RESERVOIR_DATA_T; // ********** public function prototypes ********** @@ -106,10 +109,12 @@ F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId ); // Heaters target temperature function prototype -void setHeatersTargetTemperature( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ); +void setDialysateHeatingParameters( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ); U32 getTargetFillVolumeML( void ); F32 getTargetFillFlowRateLPM( void ); F32 getReservoirActualTemperature( void ); +F32 getPrimaryHeaterTargetTemperature( void ); +F32 getTargetDialysateFlowLPM( void ); DG_RESERVOIR_VOLUME_RECORD_T getReservoirsCalRecord( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ra3960210792d0811093a6913e505d43eda1918ea -r8a553b10a224c745cb4bd6d963c867391905ba8c --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a3960210792d0811093a6913e505d43eda1918ea) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8a553b10a224c745cb4bd6d963c867391905ba8c) @@ -419,7 +419,7 @@ result = TRUE; memcpy( &payload, message->payload, sizeof( DG_CMD_DIALYSATE_HEATING_PARAMS_T ) ); - setHeatersTargetTemperature( payload ); + setDialysateHeatingParameters( payload ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result );