Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r94a190522ce398399c7b93c59f788d7666ec0060 -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 94a190522ce398399c7b93c59f788d7666ec0060) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -369,7 +369,7 @@ // Loop through the sensors and thermistors for ( thermistor = THERMISTOR_ONBOARD_NTC; thermistor < NUM_OF_THERMISTORS; thermistor++ ) { - temperature = getThermistorTemperatureValue( thermistor ); + temperature = getThermistorTemperatureValue( thermistor ); maxTemperature = ( temperature > maxTemperature ? temperature : maxTemperature ); } Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -27,7 +27,7 @@ #include "MessageSupport.h" #include "ModeFill.h" #include "OperationModes.h" -#include "PIControllers.h" +#include "Reservoirs.h" #include "ROPump.h" #include "SafetyShutdown.h" #include "SystemCommMessages.h" @@ -120,6 +120,7 @@ static void setHeaterDutyCycle( DG_HEATERS_T heater, F32 pwm ); static F32 calculatePrimaryHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); +static F32 calculateTrimmerHeaterDutyCycle( F32 targetTemperature, F32 currentTemperature, F32 flow, BOOL checkEfficiency ); static BOOL haveHeaterControlConditionsChanged( DG_HEATERS_T heater ); static void setMainPrimaryHeaterPWM( F32 pwm ); @@ -567,8 +568,40 @@ *************************************************************************/ static HEATERS_STATE_T handleHeaterStateTrimmerRampToTarget( void ) { - HEATERS_STATE_T state = HEATER_EXEC_STATE_TRIMMER_RAMP_TO_TARGET; + 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 dutyCycle = 0.0; + F32 targetTemperature = heatersStatus[ heater ].targetTemp; + if ( DG_MODE_FILL == getCurrentOperationMode() ) + { + currentTemperature = getReservoirActualTemperature(); + dutyCycle = calculatePrimaryHeaterDutyCycle( targetTemperature, currentTemperature, targetFlow, TRUE ); + state = HEATER_EXEC_STATE_TRIMMER_CONTROL_TO_TARGET; + } + /*else if ( ( DG_MODE_GENE == getCurrentOperationMode() ) || ( DG_MODE_DRAI == getCurrentOperationMode() ) ) + { + 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 ); + state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; + } + + setHeaterDutyCycle( heater, dutyCycle ); + return state; } @@ -583,8 +616,14 @@ static HEATERS_STATE_T handleHeaterStateTrimmerControlToTarget( void ) { HEATERS_STATE_T state = HEATER_EXEC_STATE_TRIMMER_CONTROL_TO_TARGET; + DG_HEATERS_T heater = DG_TRIMMER_HEATER; + //if ( TRUE == haveHeaterControlConditionsChanged( heater ) ) // TODO do we need this kind of check from trimmer?? + { + //state = HEATER_EXEC_STATE_TRIMMER_RAMP_TO_TARGET; + } + return state; } @@ -660,6 +699,26 @@ return dutyCycle; } +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; + + + if ( TRUE == checkEfficiency ) + { + // TODO add the trimmer efficiency + } + + F32 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 ); + dutyCycle = ( dutyCycle < HEATERS_MIN_DUTY_CYCLE ? HEATERS_MIN_DUTY_CYCLE : dutyCycle ); + + return dutyCycle; +} + /*********************************************************************//** * @brief * The haveHeaterControlConditionsChanged function checks whether the heater Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -42,17 +42,9 @@ NUM_OF_DG_HEATERS, ///< Number of the heaters } DG_HEATERS_T; -/// Target temperature data structure. +/// Trimmer heater command data structure.2 typedef struct { - F32 targetPrimaryHeaterTemp; ///< Primary heater set temperature target - F32 targetTrimmerHeaterTemp; ///< Trimmer heater set temperature target - U32 activeReservoirCycleTimeMS; ///< Active reservoir cycle time in milliseconds -} TARGET_TEMPS_AND_TIME_PAYLOAD_T; - -/// Trimmer heater command data structure. -typedef struct -{ BOOL startHeater; ///< Flag indicates start or stop heater F32 targetTemp; ///< Target temperature for heater } TRIMMER_HEATER_CMD_T; @@ -78,7 +70,7 @@ BOOL startHeater( DG_HEATERS_T heater ); -F32 getHeaterTargetTemperature( DG_HEATERS_T heater ); +F32 getHeaterTargetTemperature( DG_HEATERS_T heater ); void stopHeater( DG_HEATERS_T heater ); Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -119,15 +119,16 @@ *************************************************************************/ void initFillMode( void ) { - fillState = DG_FILL_MODE_STATE_START; - dialysateFillStartTime = 0; - reservoirBaseWeight = 0.0; - totalROFlowRate_mL_min = 0.0; - concentrateTestStartTime = 0; - acidConductivityTotal = 0.0; - dialysateConductivityTotal = 0.0; - conductivitySampleCount = 0; - concentratePumpPrimeCount = 0; + fillState = DG_FILL_MODE_STATE_START; + dialysateFillStartTime = 0; + reservoirBaseWeight = 0.0; + totalROFlowRate_mL_min = 0.0; + concentrateTestStartTime = 0; + acidConductivityTotal = 0.0; + dialysateConductivityTotal = 0.0; + conductivitySampleCount = 0; + concentratePumpPrimeCount = 0; + // Get the heaters info form the NV data management 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 @@ -136,6 +137,9 @@ 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 ); 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 ); @@ -545,10 +549,10 @@ // If we've reached our target fill to volume (by weight), we're done filling - go back to generation idle mode if ( TRUE == hasTargetFillVolumeBeenReached( inactiveReservoir ) ) { - F32 const filledVolume_mL = getReservoirWeight( inactiveReservoir ) - reservoirBaseWeight; - F32 const integratedVolumeToLoadCellReadingPercent = fabs( 1 - ( filledVolume_mL / integratedVolume_mL ) ); - F32 const avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; // TODO - should we be checking this below? - F32 const avgDialysateConductivity = dialysateConductivityTotal / conductivitySampleCount; + F32 filledVolume_mL = getReservoirWeight( inactiveReservoir ) - reservoirBaseWeight; + F32 integratedVolumeToLoadCellReadingPercent = fabs( 1 - ( filledVolume_mL / integratedVolume_mL ) ); + F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; // TODO - should we be checking this below? + F32 avgDialysateConductivity = dialysateConductivityTotal / conductivitySampleCount; if ( integratedVolumeToLoadCellReadingPercent > FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE ) { Index: firmware/App/Modes/ModeFill.h =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -34,7 +34,9 @@ // ********** public function prototypes ********** void initFillMode( void ); // initialize this module + U32 transitionToFillMode( void ); // prepares for transition to fill mode + U32 execFillMode( void ); // execute the fill mode state machine (call from OperationModes) F32 getAvgFillFlowRate( void ); // TODO do we need this? Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -52,23 +52,25 @@ #define MAX_REDUNDANT_LOAD_CELL_DIFF 50.0 ///< Maximum difference in redundant load cells when determing if fill completed. -// TODO add doxygen comments +// TODO add doxygen comments yes for all of the new variables and align them #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 - // ********** private data ********** // TODO yes we should add all the doxygen comments soon // TODO add doxygen comments typedef struct { U32 timeReservoirCycleMS; + U32 timeReservoirFill2SwitchMS; F32 timeUFDecayMS; + F32 timeReservoirFillMS; F32 tempUFFill; - F32 tempRerservoirStartFill; - + F32 tempReservoirStartFill; + F32 tempReservoirEndFill; + F32 tempTargetTrimmer; } HEATERS_TEMPERATURE_CALC_DATA_T; static HEATERS_TEMPERATURE_CALC_DATA_T heatersTempCalc; @@ -91,14 +93,14 @@ static DG_RESERVOIR_VOLUME_RECORD_T reservoirsCalRecord; ///< DG reservoirs non-volatile record. static F32 targetFillFlowRateLPM; ///< Target fill flow rate in L/min. -static const F32 ULTRAFILTER_TAU_C_PER_MS = ULTRAFILTER_TEMPERATURE_TAU_C_PER_MIN * SEC_PER_MIN * MS_PER_SECOND; -static const F32 RESERVOIR_TAU_C_PER_MS = RESERVOIR_TEMPERATURE_TAU_C_PER_MIN * SEC_PER_MIN * MS_PER_SECOND; +// TODO add doxygen comments +static const F32 ULTRAFILTER_TAU_C_PER_MS = ULTRAFILTER_TEMPERATURE_TAU_C_PER_MIN / ( SEC_PER_MIN * MS_PER_SECOND ); +static const F32 RESERVOIR_TAU_C_PER_MS = RESERVOIR_TEMPERATURE_TAU_C_PER_MIN / ( SEC_PER_MIN * MS_PER_SECOND ); // ********** private function prototypes ********** static BOOL processCalibrationData( void ); static F32 getPrimaryHeaterTargetTemperature( void ); -static F32 getTrimmerHeaterTargetTemperature( void ); /*********************************************************************//** * @brief @@ -137,11 +139,17 @@ { RESERVOIR_DATA_T data; - data.activeReservoir = getU32OverrideValue( &activeReservoir ); - data.fillToVolumeMl = getU32OverrideValue( &fillVolumeTargetMl ); - data.drainToVolumeMl = getU32OverrideValue( &drainVolumeTargetMl ); + data.activeReservoir = getU32OverrideValue( &activeReservoir ); + data.fillToVolumeMl = getU32OverrideValue( &fillVolumeTargetMl ); + data.drainToVolumeMl = getU32OverrideValue( &drainVolumeTargetMl ); + data.timeReservoirCycleMS = heatersTempCalc.timeReservoirCycleMS; + data.timeReservoirFill2SwitchMS = heatersTempCalc.timeReservoirFill2SwitchMS; + data.timeUFDecayMS = heatersTempCalc.timeUFDecayMS; + data.tempUFFill = heatersTempCalc.tempUFFill; + data.tempReservoirStartFill = heatersTempCalc.tempReservoirStartFill; + data.tempReservoirEndFill = heatersTempCalc.tempReservoirEndFill; - broadcastData( MSG_ID_DG_RESERVOIR_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( RESERVOIR_DATA_T ) ); + broadcastData( MSG_ID_DG_RESERVOIRS_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( RESERVOIR_DATA_T ) ); reservoirDataPublicationTimerCounter = 0; } } @@ -463,6 +471,32 @@ /*********************************************************************//** * @brief + * The getReservoirActualTemperature function calculates the reservoir's + * actual temperature. + * @details Inputs: none + * @details Outputs: heatersTempCalc + * @return reservoir actual temperature + *************************************************************************/ +F32 getReservoirActualTemperature( 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; +} + +/*********************************************************************//** + * @brief * The getReservoirWeight function returns the small filtered weight * of the reservoir's associated load cell. * @details Inputs: none @@ -515,9 +549,12 @@ * @details Outputs: heatersTemperatureCalcData * @return none *************************************************************************/ -void setHeatersTargetTemperature( TARGET_TEMPS_AND_TIME_PAYLOAD_T targets ) +void setHeatersTargetTemperature( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ) { - heatersTempCalc.timeReservoirCycleMS = targets.activeReservoirCycleTimeMS; + heatersTempCalc.timeReservoirCycleMS = params.timeReservoirCycleMS; + heatersTempCalc.timeReservoirFill2SwitchMS = params.timeReservoirWait2SwitchMS; + heatersTempCalc.timeReservoirFillMS = params.timeReservoirFillMS; + heatersTempCalc.tempTargetTrimmer = params.trimmerTargetTemperature; setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); } @@ -546,10 +583,10 @@ *************************************************************************/ BOOL hasTargetFillVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId ) { - F32 const loadcellWeight1 = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); - F32 const loadcellWeight2 = getLoadCellSmallFilteredWeight( redundantLoadCell[ reservoirId ] ); - U32 const targetFillVolume = getU32OverrideValue( &fillVolumeTargetMl ); - BOOL const hasTargetReached = ( ( loadcellWeight1 >= targetFillVolume || loadcellWeight2 > ( targetFillVolume + MAX_REDUNDANT_LOAD_CELL_DIFF ) ) ? TRUE : FALSE ); + F32 loadcellWeight1 = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); + F32 loadcellWeight2 = getLoadCellSmallFilteredWeight( redundantLoadCell[ reservoirId ] ); + U32 targetFillVolume = getU32OverrideValue( &fillVolumeTargetMl ); + BOOL hasTargetReached = ( ( loadcellWeight1 >= targetFillVolume || loadcellWeight2 > ( targetFillVolume + MAX_REDUNDANT_LOAD_CELL_DIFF ) ) ? TRUE : FALSE ); // if redundant load cells too far apart at end of fill, alarm if ( loadcellWeight1 < targetFillVolume ) @@ -683,36 +720,34 @@ * heater target temperature and returns target temperature value. * @details Inputs: none * @details Outputs: heatersTempCalc - * @return TRUE if the calibration record is valid, otherwise FALSE + * @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 = ( getTargetFillFlowRateLPM() * ML_PER_LITER ) / targetFillVolML; // TODO target flow can come from RO pump too + 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; - heatersTempCalc.tempUFFill = getLastFillTemperature() + ( heatersTempCalc.timeUFDecayMS * ULTRAFILTER_TAU_C_PER_MS ); + 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 ) * getAvgFillTemperature() ); + F32 ultrafilterPart = ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * heatersTempCalc.tempUFFill; + F32 fillPart = ( ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ) * fillAvgTemp ); + heatersTempCalc.tempReservoirStartFill = ultrafilterPart + fillPart; - heatersTempCalc.tempRerservoirStartFill = ultrafilterPart + fillPart; + F32 targetTempNumerator = heatersTempCalc.tempReservoirStartFill - ( ( ULTRAFILTER_VOLUME_ML / targetFillVolML ) * UFTimeConstant ); + F32 targetTempDenominator = ( ( targetFillVolML - ULTRAFILTER_VOLUME_ML ) / targetFillVolML ); + targetTemp = targetTempNumerator / targetTempDenominator; return targetTemp; } -static F32 getTrimmerHeaterTargetTemperature( void ) -{ - F32 targetTemp = 0.0; - F32 targetFillVolML = getTargetFillVolumeML(); - F32 timeHalfFillMS = ( getTargetFillFlowRateLPM() * ML_PER_LITER * 0.5 ) / targetFillVolML; // TODO target flow can come from RO pump - - return targetTemp; -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -r353d01d31bc69d4d1901ff09097ee610bb1c9dbc -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 353d01d31bc69d4d1901ff09097ee610bb1c9dbc) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -35,7 +35,6 @@ #define MAX_RESERVOIR_VOLUME_ML 2000 ///< Maximum reservoir volume in mL. -#pragma pack(push,1) /// Fill command data structure. typedef struct { @@ -47,10 +46,10 @@ /// Drain command data structure. typedef struct { - U32 targetVolume; ///< Target volume to drain to (in mL) + U32 targetVolume; ///< Target volume to drain to (in mL) BOOL tareLoadCell; ///< Flag to tare load call BOOL rinseConcentrateLines; ///< Flag indicates to rinse concentrate lines or not - U32 cmd; ///< General command (start/stop) + U32 cmd; ///< General command (start/stop) } DRAIN_CMD_T; /// DG command response data record. @@ -61,15 +60,31 @@ U32 rejectCode; ///< Reason code for rejecting the command } DG_CMD_RESPONSE_T; +// TODO add doxygen comments +/// Dialysate heating parameters +typedef struct +{ + F32 trimmerTargetTemperature; + U32 timeReservoirCycleMS; + F32 timeReservoirFillMS; + U32 timeReservoirWait2SwitchMS; + F32 dialysateFlowLPM; +} DG_CMD_DIALYSATE_HEATING_PARAMS_T; + /// Reservoir data struct. typedef struct { U32 activeReservoir; ///< Active reservoir ID U32 fillToVolumeMl; ///< Volume target to fill to U32 drainToVolumeMl; ///< Volume target to drain to + U32 timeReservoirCycleMS; + U32 timeReservoirFill2SwitchMS; + F32 timeUFDecayMS; + F32 tempUFFill; + F32 tempReservoirStartFill; + F32 tempReservoirEndFill; } RESERVOIR_DATA_T; -#pragma pack(pop) - + // ********** public function prototypes ********** void initReservoirs( void ); @@ -91,9 +106,10 @@ F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId ); // Heaters target temperature function prototype -void setHeatersTargetTemperature( TARGET_TEMPS_AND_TIME_PAYLOAD_T targets ); +void setHeatersTargetTemperature( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ); U32 getTargetFillVolumeML( void ); F32 getTargetFillFlowRateLPM( void ); +F32 getReservoirActualTemperature( void ); DG_RESERVOIR_VOLUME_RECORD_T getReservoirsCalRecord( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r0fd3da87c657a807a0a2a6e1aae28b794241ed53 -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 0fd3da87c657a807a0a2a6e1aae28b794241ed53) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -413,17 +413,15 @@ { BOOL result = FALSE; - if ( message->hdr.payloadLen == sizeof( TARGET_TEMPS_AND_TIME_PAYLOAD_T ) ) + if ( message->hdr.payloadLen == sizeof( DG_CMD_DIALYSATE_HEATING_PARAMS_T ) ) { - TARGET_TEMPS_AND_TIME_PAYLOAD_T payload; + DG_CMD_DIALYSATE_HEATING_PARAMS_T payload; result = TRUE; - memcpy( &payload, message->payload, sizeof( TARGET_TEMPS_AND_TIME_PAYLOAD_T ) ); - // TOD - // - //setHeaterTargetTemperature( DG_TRIMMER_HEATER, payload.targetTrimmerHeaterTemp ); + memcpy( &payload, message->payload, sizeof( DG_CMD_DIALYSATE_HEATING_PARAMS_T ) ); setHeatersTargetTemperature( payload ); } + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r76679e197473ee3f88c82809037dcbb8477748ad -ra3960210792d0811093a6913e505d43eda1918ea --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 76679e197473ee3f88c82809037dcbb8477748ad) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision a3960210792d0811093a6913e505d43eda1918ea) @@ -72,10 +72,8 @@ // Monitor load cells execLoadCell(); -#ifndef DISABLE_HEATERS_AND_TEMPS // Temperature sensors read execTemperatureSensors(); -#endif // Conductivity sensors read execConductivitySensors();