Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r45a4cb0693621b5dc1cf7b1ae237d916856b6c41 -r3efd50bef6d3618b9fed1727aa2bc234ededee2a --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 45a4cb0693621b5dc1cf7b1ae237d916856b6c41) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 3efd50bef6d3618b9fed1727aa2bc234ededee2a) @@ -71,7 +71,7 @@ #define TRIMMER_HEATER_CONTROL_INTERVAL_COUNT ( ( 30 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. #define TRIMMER_HEATER_MIN_DIALYSATE_FLOWRATE_LPM 0.00F ///< Trimmer heater minimum dialysate flow rate in L/min. -#define DELTA_TEMPERATURE_TIME_COSNTANT_C 8.6F ///< Delta temperature calculated from time constant. +#define DELTA_TEMPERATURE_TIME_CONSTANT_C 8.6F ///< Delta temperature calculated from time constant. #define PRIMARY_HEATER_DUTY_CYCLE_PER_TEMPERATURE_C 0.015F ///< Primary heaters duty cycle per temperature in C. #define DATA_PUBLISH_COUNTER_START_COUNT 70 ///< Data publish counter start count. #define MIN_RO_HEATER_FLOWRATE_LPM 0.2F ///< Minimum target RO heater flow rate in L/min. @@ -91,7 +91,7 @@ BOOL startHeaterSignal; ///< Heater start indication flag. BOOL isHeaterOn; ///< Heater on/off status flag. OVERRIDE_F32_T dutyCycle; ///< Heater duty cycle. - F32 targetFlowLPM; ///< Heater target flow in L/min. + F32 targetFlowLPM; ///< Heater target flow in L/min to calculate the duty cycle. F32 nomTargetFlowLPM; ///< Heater nominal target flow in L/min. BOOL hasTargetTempChanged; ///< Heater target temperature change flag indicator. F32 heaterEstGain; ///< Heater estimation gain during the run. @@ -526,13 +526,13 @@ if ( DG_MODE_FILL == opMode ) { // If the previous average fill flow rate is 0, use the nominal target RO flow from the RO pump - targetFlowLPM = ( getAvgFillFlowRateLPM() - 0.0F > NEARLY_ZERO ? getAvgFillFlowRateLPM() : getTargetROPumpFlowRateLPM() ); + targetFlowLPM = ( getAvgFillFlowRateLPM() > NEARLY_ZERO ? getAvgFillFlowRateLPM() : getTargetROPumpFlowRateLPM() ); dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlowLPM, TRUE ); state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; } else if ( ( DG_MODE_GENE == opMode ) || ( DG_MODE_DRAI == opMode ) ) { - targetTemperature += DELTA_TEMPERATURE_TIME_COSNTANT_C; + targetTemperature += DELTA_TEMPERATURE_TIME_CONSTANT_C; targetFlowLPM = getTargetROPumpFlowRateLPM(); dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, inletTemperature, targetFlowLPM, FALSE ); state = HEATER_EXEC_STATE_PRIMARY_CONTROL_TO_TARGET; @@ -783,7 +783,7 @@ * @details Inputs: none * @details Outputs: none * @param targetTemperature target temperature of the heater - * @oaram currentTemperature current inlet temperature of the heater + * @param currentTemperature current inlet temperature of the heater * @param flow current flow * @return calculated duty cycle *************************************************************************/ @@ -808,7 +808,7 @@ * @details Inputs: none * @details Outputs: none * @param targetTemperature target temperature of the heater - * @oaram currentTemperature current inlet temperature of the heater + * @param currentTemperature current inlet temperature of the heater * @param flow current flow * @param check efficiency flag to indicate whether to consider heater's * efficiency Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r9e5ee62245eb2a73b167eabd6c274a71a76a7b0e -r3efd50bef6d3618b9fed1727aa2bc234ededee2a --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 9e5ee62245eb2a73b167eabd6c274a71a76a7b0e) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 3efd50bef6d3618b9fed1727aa2bc234ededee2a) @@ -135,9 +135,13 @@ // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); - setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); - startHeater( DG_PRIMARY_HEATER ); + if ( FALSE == isHeaterOn( DG_PRIMARY_HEATER ) ) + { + setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); + startHeater( DG_PRIMARY_HEATER ); + } + setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); return drainState; Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -rb8f298547eb578000b3ff3cf55732fda7a689ce0 -r3efd50bef6d3618b9fed1727aa2bc234ededee2a --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision b8f298547eb578000b3ff3cf55732fda7a689ce0) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 3efd50bef6d3618b9fed1727aa2bc234ededee2a) @@ -127,9 +127,13 @@ // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); - setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); - startHeater( DG_PRIMARY_HEATER ); + if ( FALSE == isHeaterOn( DG_PRIMARY_HEATER ) ) + { + setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); + startHeater( DG_PRIMARY_HEATER ); + } + setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); return genIdleState; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r3012a339084bbb5fa796d41680bc0c48bdc9f691 -r3efd50bef6d3618b9fed1727aa2bc234ededee2a --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 3012a339084bbb5fa796d41680bc0c48bdc9f691) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 3efd50bef6d3618b9fed1727aa2bc234ededee2a) @@ -55,8 +55,6 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 5 ///< Data publish counter start count. #define NUM_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. -#define TARGET_TEMP_IN_FILLS_LESS_THAN_UF_VOL_C 45.0F ///< Target temperature in fill less than the ultrafilter's volume in C. - // ********** private data ********** /// Heaters temperature calculation data structure @@ -75,6 +73,7 @@ F32 tempRsrvr0ActualTrimmer; ///< Temperature actual reservoir in C. F32 tempFillMixAvgTrimmer; ///< Temperature fill mix average trimmer in C. F32 tempRsrvrEndFillTrimmer; ///< Temperature reservoir end fill trimmer in C. + BOOL usePriTargetTempEquation; ///< Use primary heater target temperature enquation flag. } HEATERS_TEMPERATURE_CALC_DATA_T; /// Reservoirs previous status @@ -626,6 +625,7 @@ heatersTempCalc.timeReservoirFillMS = params.timeReservoirFillMS; heatersTempCalc.tempTargetTrimmer = params.trimmerTargetTemperature; heatersTempCalc.flowTargetDialysateLPM = params.dialysateFlowLPM; + heatersTempCalc.usePriTargetTempEquation = params.usePriTargetTempEquation; // Check if this is the first time that the dialysate heating parameters are set in DG if ( TRUE == isThisTheFirstCycle ) @@ -645,7 +645,7 @@ *************************************************************************/ F32 getPrimaryHeaterTargetTemperature( void ) { - F32 tempTargetC = TARGET_TEMP_IN_FILLS_LESS_THAN_UF_VOL_C; + F32 tempTargetC = heatersTempCalc.tempTargetTrimmer; F32 priTargetTempC = 0.0F; F32 targetFillVolML = getTargetFillVolumeML(); F32 UFTimeConstant = 0.0F; @@ -657,7 +657,7 @@ F32 tgtBicarbFlowLPM = getConcentratePumpTargetFlowMLPM( CONCENTRATEPUMPS_CP2_BICARB ) / ML_PER_LITER; F32 tgtTotalFlowLPM = targetROFlowLPM + tgtAcidFlowLPM + tgtBicarbFlowLPM; - if ( targetFillVolML > heatingConstsCalRecord.ultrafilterVolmL ) + if ( TRUE == heatersTempCalc.usePriTargetTempEquation ) { if ( FALSE == isThisTheFirstFill() ) { Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r3012a339084bbb5fa796d41680bc0c48bdc9f691 -r3efd50bef6d3618b9fed1727aa2bc234ededee2a --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 3012a339084bbb5fa796d41680bc0c48bdc9f691) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 3efd50bef6d3618b9fed1727aa2bc234ededee2a) @@ -61,16 +61,6 @@ U32 rejectCode; ///< Reason code for rejecting the command } DG_CMD_RESPONSE_T; -/// Dialysate heating parameters -typedef struct -{ - F32 trimmerTargetTemperature; ///< Trimmer Target temperature - U32 timeReservoirCycleMS; ///< Reservoir cycle time in milliseconds - F32 timeReservoirFillMS; ///< Reservoir fill time in milliseconds - U32 timeReservoirWait2SwitchMS; ///< Wait to switch active reservoir time in milliseconds - F32 dialysateFlowLPM; ///< Dialysate flow rate in L/min -} DG_CMD_DIALYSATE_HEATING_PARAMS_T; - /// HD mode and HD submode typedef struct {