Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f -r1644c24b0b51661ceaba579e5ebee0d1d5bad85f --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 1644c24b0b51661ceaba579e5ebee0d1d5bad85f) @@ -41,12 +41,16 @@ #define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_SLOW_MLPM 1.0F ///< Concentrate pump speed out of range tolerance when slow in mL/min. #define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 10.0F ///< Concentrate pump low speed threshold in mL/min. #define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFF ///< Pulse width value when zero flow rate or pump is off. -#ifndef __PUMPTEST__ -#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). -#else + +#ifdef __DIENER_CONC_PUMP__ +#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.4F ///< Volume output every revolution (mL). +#elif __PUMPTEST__ #define PISTON_PUMP_STEPS_PER_ML 342.0F ///< Revolution count for 1ml volume delivery. #define CONCENTRATE_PUMP_VOLUME_PER_REV ( CONCENTRATE_PUMP_STEP_PER_REV / PISTON_PUMP_STEPS_PER_ML ) ///< Volume output every revolution (mL). +#else +#define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). #endif + #define CONCENTRATE_PUMP_PULSE_PER_REV 2.0F ///< Number of pulses generate for every revolution. #define CONCENTRATE_PUMP_STEP_PER_REV 200.0F ///< Number of steps for every revolution. #define CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION 100.0F ///< Hall sense period resolution in microseconds. @@ -66,7 +70,7 @@ #define CONCENTRATE_PUMP_VOLUME_PER_PULSE ( CONCENTRATE_PUMP_VOLUME_PER_REV / CONCENTRATE_PUMP_PULSE_PER_REV ) #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. -#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. +#define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 100 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. #define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. #define NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. @@ -125,17 +129,17 @@ /// Payload record structure for concentrate pump start/stop request typedef struct { - U32 pumpID; ///< Concentrate pump ID (0:Acid ,1:Bicarb) + U32 pumpID; ///< Concentrate pump ID (0:Acid ,1:Bicarb, 2:UF) U32 startStop; ///< Concentrate pump start:1,stop :0. - F32 speed; ///< Speed range from 0.1 ml/min to 48.0 ml/min. + F32 speed; ///< Speed in ml/min F32 volume; ///< Target volume in ml } CONC_PUMP_START_STOP_CMD_PAYLOAD_T; // ********** private data ********** static U32 concentratePumpMonitorTimerCounter; ///< Timer counter to perform monitor on concentrate pump. static BOOL acidConcentratePumpParkPersistenceClear; ///< Boolean acid park persistence clearing. -static BOOL bicarbConcentratePumpParkPersistenceClear; ///< Boolean for bicard park persistence clearing. +static BOOL bicarbConcentratePumpParkPersistenceClear; ///< Boolean for bicarb park persistence clearing. /// Concentrate pump data publish interval. static OVERRIDE_U32_T concentratePumpDataPublishInterval = { CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL, 0, 0 }; @@ -151,6 +155,7 @@ //static DD_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. //static DD_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. +//static DD_UF_PUMP_RECORD_T ultrafilterationPumpCalRecord; ///< Ultrafilteration pump calibration record. //static DD_CONC_PUMPS_CAL_RECORD_T concentratePumpsCalRecord; ///< Concentrate pumps calibration record. // ********** private function prototypes ********** @@ -222,6 +227,7 @@ initPersistentAlarm( ALARM_ID_DD_D11_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DD_D10_PUMP_SPEED_CONTROL_ERROR, 0, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + //TODO: UF pump park bits to be defined in HDD and then will handle UF pump alarm later initPersistentAlarm( ALARM_ID_DD_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ); initPersistentAlarm( ALARM_ID_DD_CONCENTRATE_PUMP_FAULT, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_FAULT_PERSISTENCE_PERIOD ); } @@ -256,6 +262,7 @@ // Update rev count status pumpMesauredRevCnt[ D11_PUMP ].data = (U32)getFPGAD11PumpRevolutionCountStatus(); pumpMesauredRevCnt[ D10_PUMP ].data = (U32)getFPGAD10PumpRevolutionCountStatus(); + pumpMesauredRevCnt[ D76_PUMP ].data = (U32)getFPGAD76PumpRevolutionCountStatus(); //Monitor Pump Park status monitorPumpParkStatus(); @@ -285,6 +292,7 @@ parked[ D10_PUMP ].data = (U32)getFPGAD10PumpIsParked(); parkFaulted[ D11_PUMP ].data = (U32)getFPGAD11PumpParkFault(); parkFaulted[ D10_PUMP ].data = (U32)getFPGAD10PumpParkFault(); + // TODO : Handle UF Pump Park alarms once HDD updated with the details. if ( ( TRUE == getConcPumpIsParked( D11_PUMP ) ) || ( TRUE == getConcPumpParkIsFaulted( D11_PUMP ) ) ) { @@ -429,12 +437,14 @@ // pumps should be not ON and DD operation mode is not in fault mode if ( ( concentratePumps[D11_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && ( concentratePumps[D10_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && + ( concentratePumps[D76_PUMP].execState == CONCENTRATE_PUMP_OFF_STATE ) && //( DD_MODE_FILL != opMode ) && ( DD_MODE_FAUL != opMode ) ) { // Park concentrate pump requestConcentratePumpOff( D11_PUMP, PARK_CONC_PUMPS ); requestConcentratePumpOff( D10_PUMP, PARK_CONC_PUMPS ); + requestConcentratePumpOff( D76_PUMP, PARK_CONC_PUMPS ); result = TRUE; } @@ -531,10 +541,14 @@ { setFPGAD11PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); } + else + { + setFPGAD76PumpRevolutionCount( getConcPumpTargetRevolutionCount( pumpId ) ); + } } /* @@ -821,10 +835,14 @@ { setFPGAD11PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); } + else + { + setFPGAD76PumpSetStepSpeed( CONCENTRATE_PUMP_ZERO_FLOW_RATE ); + } #ifndef __PUMPTEST__ // Park concentrate pump too if requested if ( TRUE == parkPump ) @@ -834,11 +852,16 @@ setFPGAD11PumpParkCmd(); acidConcentratePumpParkPersistenceClear = TRUE; } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpParkCmd(); bicarbConcentratePumpParkPersistenceClear = TRUE; } + else + { + //TODO: Need to evaluate park support in the new pump. + setFPGAD76PumpParkCmd(); + } concentratePumps[ pumpId ].isConcPumpParkInProgress = TRUE; } #endif @@ -865,10 +888,14 @@ { setFPGAD11PumpControl( controlSet ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpControl( controlSet ); } + else + { + setFPGAD76PumpControl( controlSet ); + } state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } @@ -1016,10 +1043,14 @@ { setFPGAD11PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } - else + else if ( D10_PUMP == pumpId ) { setFPGAD10PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); } + else + { + setFPGAD76PumpSetStepSpeed( concentratePumps[ pumpId ].togglePeriodCount ); + } return hasTgtBeenReached; } @@ -1051,10 +1082,14 @@ { pulseWidthCount = getFPGAD11PumpHallSensePulseWidth(); } - else + else if ( D10_PUMP == pumpId ) { pulseWidthCount = getFPGAD10PumpHallSensePulseWidth(); } + else + { + pulseWidthCount = getFPGAD76PumpHallSensePulseWidth(); + } pulseWidthInMicroSeconds = pulseWidthCount * CONCENTRATE_PUMP_HALL_SENSE_PERIOD_RESOLUTION; concentratePumps[ pumpId ].pulseWidthUS = pulseWidthInMicroSeconds; @@ -1140,7 +1175,7 @@ setFPGAD11PumpControl( concentratePumps[ pumpId ].controlSet ); } } - else + else if ( D10_PUMP == pumpId ) { controlSetBits = getFPGAD10PumpControlStatus(); @@ -1149,6 +1184,15 @@ setFPGAD10PumpControl( concentratePumps[ pumpId ].controlSet ); } } + else + { + controlSetBits = getFPGAD76PumpControlStatus(); + + if ( controlSetBits != concentratePumps[ pumpId ].controlSet ) + { + setFPGAD76PumpControl( concentratePumps[ pumpId ].controlSet ); + } + } } /*********************************************************************//** @@ -1172,6 +1216,9 @@ U08 d10_PumpDirection = concentratePumps[ D10_PUMP ].direction; F32 d10_PumpSetSpeed = concentratePumps[ D10_PUMP ].currentPumpSpeed; F32 d10_PumpTgtSpeed = getPumpTargetSpeed( D10_PUMP ); + U08 d76_PumpDirection = concentratePumps[ D76_PUMP ].direction; + F32 d76_PumpSetSpeed = concentratePumps[ D76_PUMP ].currentPumpSpeed; + F32 d76_PumpTgtSpeed = getPumpTargetSpeed( D76_PUMP ); // Use the above values to prepare the broadcast data data.d11_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d11_PumpDirection ? d11_PumpSetSpeed * -1.0F : d11_PumpSetSpeed ); @@ -1192,6 +1239,13 @@ data.d10_PumpParked = getConcPumpIsParked( D10_PUMP ); data.d11_PumpParkFault = getConcPumpParkIsFaulted( D11_PUMP ); data.d10_PumpParkFault = getConcPumpParkIsFaulted( D10_PUMP ); + data.d76_PumpTargetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d76_PumpDirection ? d76_PumpTgtSpeed * -1.0F : d76_PumpTgtSpeed ); + data.d76_PumpCurrentSetSpeed = ( CONCENTRATE_PUMP_REVERSE_DIR == d76_PumpDirection ? d76_PumpSetSpeed * -1.0F : d76_PumpSetSpeed ); + data.d76_PumpMeasuredSpeed = getMeasuredPumpSpeedMLPM( D76_PUMP ); + data.d76_PumpTargetRevCount = (U32)getConcPumpTargetRevolutionCount( D76_PUMP ); + data.d76_PumpMeasuredRevCount= (U32)getConcPumpCurrentMeasuredRevolutionCount( D76_PUMP ); + data.d76_PumpState = concentratePumps[ D76_PUMP ].execState; + data.d76_PumpPulseUS = concentratePumps[ D76_PUMP ].pulseWidthUS; concentratePumpMonitorTimerCounter = 0; broadcastData( MSG_ID_DD_CONCENTRATE_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( CONCENTRATE_PUMP_DATA_T ) ); Index: firmware/App/Controllers/DialysatePumps.c =================================================================== diff -u -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f -r1644c24b0b51661ceaba579e5ebee0d1d5bad85f --- firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) +++ firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision 1644c24b0b51661ceaba579e5ebee0d1d5bad85f) @@ -60,10 +60,8 @@ #define MAX_FPGA_DIALYSATE_PUMP_DIRECTION_FAULT_WINDOW_MS ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< FPGA dialysate pump direction fault window #define MAX_FPGA_DIALYSATE_PUMP_DIRECTION_FAULT_FAILURES 10 ///< FPGA dialysate pump direction fault failures per MAX_FPGA_DIALYSATE_PUMP_DIRECTION_FAULT_WINDOW_MS -#define FRESH_DIALYSATE_TARGET_PRESSURE_PSI 25.0F ///< Fresh dialysate pump recommended pressure(D18) in psi. -#define FRESH_DIALYSATE_MAX_PRESSURE_PSI 26.0F ///< Fresh dialysate pump maximum allowed (D18) pressure in psi. -#define SPENT_DIALYSATE_TARGET_PRESSURE_PSI 29.0F ///< Spent dialysate pump recommended pressure(PDs) in psi. -#define SPENT_DIALYSATE_MAX_PRESSURE_PSI 30.0F ///< Spent dialysate pump maximum allowed (PDs) pressure in psi. +#define DEFAULT_FRESH_DIALYSATE_TARGET_PRESSURE_PSI -12.79F ///< Default degas pump(D18) target pressure (at zero sea level)in psi. +#define DEFAULT_SPENT_DIALYSATE_TARGET_PRESSURE_PSI 30.0F ///< Default spent dialysate pump target pressure(D48) in psi. #define FRESH_DIAL_OPEN_LOOP_SPEED_RPM 2000.0F ///< fresh dialysate pump open loop speed to meet target pressure. #define SPENT_DIAL_OPEN_LOOP_SPEED_RPM 2500.0F ///< spent dialysate pump open loop speed to meet target pressure. #define DIALYSATE_PUMP_SPEED_ZERO_RPM 0 ///< Dialysate pump zero RPM speed. @@ -75,6 +73,8 @@ #define D48_PUMP_P_COEFFICIENT 20.0F ///< P term for spent dialysate pump delta pressure control. #define D48_PUMP_I_COEFFICIENT 60.0F ///< I term for spent dialysate pump delta pressure control. #define DIAL_PUMP_NO_FEED_FORWARD 0.0F ///< Feedforward term for dialysate pump control +#define DEGAS_PUMP_SLOPE_FACTOR -0.0156F ///< Dialysate pump target pressure multiply factor ( m factor in 'y = mx + b' equation) +#define DEGAS_PUMP_INTERCEPT_FACTOR 0.1153F ///< Dialysate pump target pressure addition factor ( b factor in 'y = mx + b' equation) #define MAX_ALLOWED_RPM_OUT_OF_RANGE 300 ///< Maximum allowed RPM out of range from target RPM in open loop. #define PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD 20.0F ///< Speed change that alters the state to ramp during control state. @@ -152,6 +152,7 @@ static DIALYSATE_PUMP_STATE_T handleDialysatePumpRampToTargetState( DIALYSATE_PUMPS_T pumpId ); static DIALYSATE_PUMP_STATE_T handleDialysatePumpOffState( DIALYSATE_PUMPS_T pumpId ); static void monitorPumpDirectionErrorCount( DIALYSATE_PUMPS_T pumpId ); +static void calculateDegasPumpTargetPressure( void ); /*********************************************************************//** * @brief @@ -201,13 +202,13 @@ signalDialysatePumpHardStop( pumpId ); } - pumpTargetPressure[D12_PUMP].data = FRESH_DIALYSATE_TARGET_PRESSURE_PSI; - pumpTargetPressure[D12_PUMP].ovInitData = FRESH_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D12_PUMP].data = DEFAULT_FRESH_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D12_PUMP].ovInitData = DEFAULT_FRESH_DIALYSATE_TARGET_PRESSURE_PSI; pumpTargetPressure[D12_PUMP].ovData = 0.0F; pumpTargetPressure[D12_PUMP].override = OVERRIDE_RESET; - pumpTargetPressure[D48_PUMP].data = SPENT_DIALYSATE_TARGET_PRESSURE_PSI; - pumpTargetPressure[D48_PUMP].ovInitData = SPENT_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D48_PUMP].data = DEFAULT_SPENT_DIALYSATE_TARGET_PRESSURE_PSI; + pumpTargetPressure[D48_PUMP].ovInitData = DEFAULT_SPENT_DIALYSATE_TARGET_PRESSURE_PSI; pumpTargetPressure[D48_PUMP].ovData = 0.0F; pumpTargetPressure[D48_PUMP].override = OVERRIDE_RESET; @@ -261,6 +262,23 @@ /*********************************************************************//** * @brief + * The calculateDegasPumpTargetPressure function gets the barometric pressure + * sensor reading to calcualte degassing pump(D12) target control pressure for closed + * loop control. + * @details \b Inputs: none + * @details \b Outputs: pumpTargetSpeed. + * @return none + *************************************************************************/ +static void calculateDegasPumpTargetPressure( void ) +{ + F32 pressureInmmHg = getFilteredPressure( BARO_PRES ); + + //Get the degassing target pressure + pumpTargetPressure[D12_PUMP].data = ( ( DEGAS_PUMP_SLOPE_FACTOR * pressureInmmHg ) + DEGAS_PUMP_INTERCEPT_FACTOR ) + DEGAS_PUMP_TARGET_PRES_ADJ_THRESHOLD; +} + +/*********************************************************************//** + * @brief * The setDialysatePumpTargetSpeed function sets a new target RPM for the * dialysate pump. * @details \b Inputs: none @@ -291,9 +309,13 @@ pumpTargetSpeed[ pumpId ].data = MAX_DIALYSATE_PUMP_RPM; } - // Open loop or close loop control + // Assign Open loop or close loop control isDialPumpOpenLoopEnabled[ pumpId ] = isOpenLoopControlEnabled; +#ifdef __BARO_PRES_SENSOR__ + //Update Degas pump target speed + calculateDegasPumpTargetPressure(); +#endif //handle target speed update when pump is running if ( DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE == dialysatePumps[ pumpId ].dialysatePumpState ) { Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f -r1644c24b0b51661ceaba579e5ebee0d1d5bad85f --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 1644c24b0b51661ceaba579e5ebee0d1d5bad85f) @@ -373,10 +373,18 @@ heatersStatus[ heater ].heaterOnState = FALSE; control[ heater ].data = HEATERS_MIN_DUTY_CYCLE; heatersStatus[ heater ].state = HEATER_EXEC_STATE_OFF; - heatersStatus[ D5_HEAT ].controlIntervalCounter = D5_HEAT_CONTROL_INTERVAL_START_COUNT; - heatersStatus[ D45_HEAT ].controlIntervalCounter = 0; startupHeaterControl = TRUE; + //Update control interval counter + if ( D5_HEAT == heater ) + { + heatersStatus[ D5_HEAT ].controlIntervalCounter = D5_HEAT_CONTROL_INTERVAL_START_COUNT; + } + else + { + heatersStatus[ D45_HEAT ].controlIntervalCounter = 0; + } + // update duty cycle setHeaterControl( heater ); } @@ -608,7 +616,7 @@ F32 measuredTemperature = 0.0F; F32 ctrl = 0.0F; - if( ++heatersStatus[ heater ].controlIntervalCounter > controlInterval[ heater ] ) + if ( ++heatersStatus[ heater ].controlIntervalCounter >= controlInterval[ heater ] ) { if ( D5_HEAT == heater ) { @@ -619,9 +627,9 @@ if ( TRUE == startupHeaterControl ) { startupHeaterControl = FALSE; + F32 deltaTempC = targetTemperature - inletTemperature; //TODO : testing - //F32 deltaTempC = targetTemperature - inletTemperature; - F32 deltaTempC = 10.0F; // Hard code for testing, later remove it. + //F32 deltaTempC = 10.0F; // Hard code for testing, later remove it. F32 capDeltaTempC = MAX( deltaTempC, HEATERS_ZERO_DELTA_TEMP_C ); F32 flowrate = getTDDialysateFlowrate() / LITER_IN_ML ; F32 feedforward = calculateDutyCycle( flowrate, capDeltaTempC, PRIMARY_HEATER_MAX_PWR_WATTS, AC_HEATER_EFFICIENCY, Index: firmware/App/DDCommon.h =================================================================== diff -u -re12eefac42a3806a34f3ddac6df30bbb5ca51f6f -r1644c24b0b51661ceaba579e5ebee0d1d5bad85f --- firmware/App/DDCommon.h (.../DDCommon.h) (revision e12eefac42a3806a34f3ddac6df30bbb5ca51f6f) +++ firmware/App/DDCommon.h (.../DDCommon.h) (revision 1644c24b0b51661ceaba579e5ebee0d1d5bad85f) @@ -25,7 +25,7 @@ #define DD_VERSION_MAJOR 0 #define DD_VERSION_MINOR 0 #define DD_VERSION_MICRO 0 -#define DD_VERSION_BUILD 1 +#define DD_VERSION_BUILD 3 //Uncomment the below line for new dosing pump testing //#define __PUMPTEST__ 1 @@ -51,6 +51,12 @@ //Uncomment below for dialysate pump PI testing //#define __PITEST__ 1 +//Uncomment below if diener concentrate pump used +#define __DIENER_CONC_PUMP__ 1 + +//Uncomment below if barometric pressure sensor reading available +//#define __BARO_PRES_SENSOR__ 1 + //Uncomment below to disable heaters debug message #define __HEATERS_DEBUG__ 1