Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r0c1f66a170a3a0a4324fa1a3c3bfb4c7f77139b5 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 0c1f66a170a3a0a4324fa1a3c3bfb4c7f77139b5) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -152,9 +152,9 @@ calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2, getFPGACP2HallSensePulseWidth() ); - data.cp1CurrentSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed; + data.cp1CurrentSetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed; data.cp1MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1 ); - data.cp2CurrentSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2 ].currentPumpSpeed; + data.cp2CurrentSetSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2 ].currentPumpSpeed; data.cp2MeasuredSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2 ); F32 const cp1Error = fabs( getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1 ) - concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed ) / concentratePumps[ CONCENTRATEPUMPS_CP1 ].currentPumpSpeed; Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r2fea76e972a450a97c74b2a9f627095032a3b586 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 2fea76e972a450a97c74b2a9f627095032a3b586) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -41,9 +41,9 @@ /// Concentrate pump data struct. typedef struct { - F32 cp1CurrentSpeed; ///< Concentrate pump CP1 current set speed + F32 cp1CurrentSetSpeed; ///< Concentrate pump CP1 current set speed F32 cp1MeasuredSpeed; ///< Concentrate pump CP1 measured speed - F32 cp2CurrentSpeed; ///< Concentrate pump CP2 current set speed + F32 cp2CurrentSetSpeed; ///< Concentrate pump CP2 current set speed F32 cp2MeasuredSpeed; ///< Concentrate pump CP2 measured speed } CONCENTRATE_PUMP_DATA_T; Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r5c967dc311b485769e50e5e4f122be21079b5ae9 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 5c967dc311b485769e50e5e4f122be21079b5ae9) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -268,20 +268,20 @@ // Check if RPM is out of range. Using fabs since the read RPM can be above or below the target. BOOL isRPMOutOfRange = fabs( targetRPM - currentDrainPumpRPM ) > threshold; - //checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, currentDrainPumpRPM, threshold ); + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, currentDrainPumpRPM, threshold ); } // Check if the pump is in off state and the RPM is greater than the minimum RPM if ( drainPumpState == DRAIN_PUMP_OFF_STATE ) { BOOL isRPMTooHigh = currentDrainPumpRPM > MIN_DRAIN_PUMP_RPM; - //checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, currentDrainPumpRPM, MIN_DRAIN_PUMP_RPM ); + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, currentDrainPumpRPM, MIN_DRAIN_PUMP_RPM ); // If the off fault alarm has become active, trigger the safety shutdown if ( isAlarmActive( ALARM_ID_DRAIN_PUMP_OFF_FAULT ) ) { - //activateSafetyShutdown(); + activateSafetyShutdown(); BOOL test = FALSE; } } @@ -589,7 +589,7 @@ if ( TRUE == isTestingActivated() ) { - if ( value >= MIN_DRAIN_PUMP_RPM && value <= MAX_DRAIN_PUMP_RPM ) + if ( ( 0 == value ) || ( value >= MIN_DRAIN_PUMP_RPM ) && ( value <= MAX_DRAIN_PUMP_RPM ) ) { result = setDrainPumpTargetRPM( value ); } Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r94b2082ddcec6ccb947e67714dc85ae005a2c7b6 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 94b2082ddcec6ccb947e67714dc85ae005a2c7b6) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -479,11 +479,11 @@ { convertTogglePeriod2RPM(); - /*for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) { BOOL const fanRpmOutOfRange = ( fansStatus.rpm[ fan ] >= FANS_MAX_ALLOWED_RPM ) || ( fansStatus.rpm[ fan ] <= FANS_MIN_ALLOWED_RPM ); checkPersistentAlarm( ALARM_ID_DG_FAN_RPM_OUT_OF_RANGE, fanRpmOutOfRange, fansStatus.rpm[ fan ], FANS_MAX_ALLOWED_RPM ); - }*/ + } fansMonitorCounter = 0; } Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r5c967dc311b485769e50e5e4f122be21079b5ae9 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 5c967dc311b485769e50e5e4f122be21079b5ae9) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -26,6 +26,7 @@ #include "OperationModes.h" #include "PIControllers.h" #include "ROPump.h" +#include "SafetyShutdown.h" #include "SystemCommMessages.h" #include "TaskPriority.h" #include "TemperatureSensors.h" @@ -62,8 +63,10 @@ #define MINIMUM_TARGET_TEMPERATURE 10U ///< Minimum allowed target temperature for the heaters. #define MAXIMUM_TARGET_TEMPERATURE 90U ///< Maximum allowed target temperature for the heaters. - #define HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ( ( 3 * MS_PER_SECOND ) / TASK_PRIORITY_INTERVAL ) ///< Heaters are on but there is no sufficient flow timeout in counts. +#define HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C 120.0 ///< Heaters max allowed internal temperature in degrees C. TODO figure out the max temperature value +#define HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heaters max allowed internal temperature timeout in milliseconds. +#define HEATERS_ON_NO_FLOW_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heaters on with no flow time out in milliseconds. /// Heaters self-test enums typedef enum heaters_self_test_states @@ -106,9 +109,6 @@ static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecState; ///< Primary heaters exec state. static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecState; ///< Trimmer heater exec state. -static PRIMARY_HEATERS_EXEC_STATES_T primaryHeatersExecPrevState; ///< Primary heaters exec previous state. -static TRIMMER_HEATER_EXEC_STATES_T trimmerHeaterExecPrevState; ///< Trimmer heater exec previous state. - static F32 primaryHeaterTargetTemperature; ///< Primary heaters target temperature. static F32 trimmerHeaterTargetTemperature; ///< Trimmer heater target temperature. @@ -126,10 +126,16 @@ static U32 selfTestElapsedTime; ///< Self-test elapsed time variable. static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. -static U32 heatersOnWithNoFlowTimeOut; ///< Heaters are on but there is no sufficient flow. +static U32 heatersOnWithNoFlowTimer; ///< Heaters are on but there is no sufficient flow. static TEMPERATURE_SENSORS_T primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_PRIMARY_HEATER; ///< Primary heaters feedback temperature sensors. -static TEMPERATURE_SENSORS_T trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; ///< Trimmer heater feedback temperature sensor. +static TEMPERATURE_SENSORS_T trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; ///< Trimmer heater feedback temperature sensors. +static U32 primaryHeatersInternalTempOutTimer = 0; ///< Primary heaters internal temperature out of range timer. +static U32 trimmerHeaterInternalTempOutTimer = 0; ///< Trimmer heater internal temperature out of range timer. +static BOOL isPrimaryHeatersTempOutOfRange = FALSE; ///< Boolean flag to indicate if the primary heaters internal temperature out of range. +static BOOL isTrimmerHeaterTempOutOfRange = FALSE; ///< Boolean flag to indicate if the trimmer heater internal temperature out of range. +static BOOL isFlowBelowMin = FALSE; ///< Boolean flag to indicate if the flow is below the minimum. + // ********** private function prototypes ********** static HEATERS_SELF_TEST_STATES_T handleHeatersSelfTestStart( void ); @@ -159,19 +165,24 @@ *************************************************************************/ void initHeaters( void ) { - heatersSelfTestState = HEATERS_SELF_TEST_START; - primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; - trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; - primaryHeaterTargetTemperature = 0.0; - trimmerHeaterTargetTemperature = 0.0; - primaryHeaterTimerCounter = 0; - trimmerHeaterTimerCounter = 5; - dataPublicationTimerCounter = 0; - isPrimaryHeaterOn = FALSE; - isTrimmerHeaterOn = FALSE; - selfTestElapsedTime = 0; - primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_PRIMARY_HEATER; - trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; + heatersSelfTestState = HEATERS_SELF_TEST_START; + primaryHeatersExecState = PRIMARY_HEATERS_EXEC_STATE_OFF; + trimmerHeaterExecState = TRIMMER_HEATER_EXEC_STATE_OFF; + primaryHeaterTargetTemperature = 0.0; + trimmerHeaterTargetTemperature = 0.0; + primaryHeaterTimerCounter = 0; + trimmerHeaterTimerCounter = 5; + dataPublicationTimerCounter = 0; + isPrimaryHeaterOn = FALSE; + isTrimmerHeaterOn = FALSE; + selfTestElapsedTime = 0; + primaryHeatersFeedbackTempSensor = TEMPSENSORS_OUTLET_PRIMARY_HEATER; + trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; + primaryHeatersInternalTempOutTimer = 0; + trimmerHeaterInternalTempOutTimer = 0; + isPrimaryHeatersTempOutOfRange = FALSE; + isTrimmerHeaterTempOutOfRange = FALSE; + isFlowBelowMin = FALSE; // Initialize the PI controller for the primary heaters initializePIController( PI_CONTROLLER_ID_PRIMARY_HEATER, HEATERS_MIN_DUTY_CYCLE, PRIMARY_HEATERS_P_COEFFICIENT, PRIMARY_HEATERS_I_COEFFICIENT, @@ -326,43 +337,90 @@ /*********************************************************************//** * @brief - * The execHeatersMonitor function turns off the heaters when RO pump is not on. + * The execHeatersMonitor function turns off the heaters when RO pump is + * not on. * @details Inputs: none * @details Outputs: Turns off the heaters when RO pump is not on * @return none *************************************************************************/ void execHeatersMonitor( void ) { - /*if ( isPrimaryHeaterOn || isTrimmerHeaterOn ) +#ifndef IGNORE_HEATERS_MONITOR + F32 primaryHeatersInternalTemp = getTemperatureValue( TEMPSENSORS_PRIMARY_HEATER_INTERNAL ); + F32 trimmerHeaterInternalTemp = getTemperatureValue( TEMPSENSORS_TRIMMER_HEATER_INTERNAL ); + + // Check if the primary heaters' internal temperature is above the limit + if ( primaryHeatersInternalTemp > HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C ) { - // If the RO pump is not on, turn off the heaters - if ( ( getMeasuredROFlowRate() < MIN_RO_FLOWRATE_LPM ) && ( ++heatersOnWithNoFlowTimeOut > HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ) ) + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_PRIMARY_HEATERS_INTERNAL_TEMP_OUT_OF_RANGE, primaryHeatersInternalTemp ); + + // If it is above the range for the first time, stop the primary heaters + // and set the variables + if ( FALSE == isPrimaryHeatersTempOutOfRange ) { - stopPrimaryHeater(); // TODO - this is so immediate - if other module requests RO pump on and start heater, this monitor may stop the heater request before RO pump has a chance to start - stopTrimmerHeater(); + stopPrimaryHeater(); + isPrimaryHeatersTempOutOfRange = TRUE; + primaryHeatersInternalTempOutTimer = getMSTimerCount(); + } + // If the primary heaters internal temperature was out for more than the define period, activate the safety shutdown + else if ( TRUE == didTimeout( primaryHeatersInternalTempOutTimer, HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ) ) + { + activateSafetyShutdown(); + } + } - primaryHeatersExecPrevState = primaryHeatersExecState; - trimmerHeaterExecPrevState = trimmerHeaterExecState; + // Check if the trimmer heater internal temperature is above the limit + if ( trimmerHeaterInternalTemp > HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_C ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_TRIMMER_HEATER_INTERNAL_TEMP_OUT_OF_RANGE, trimmerHeaterInternalTemp ); - heatersOnWithNoFlowTimeOut = 0; + // If it is above the range for the first time, stop the trimmer heater + // and set the variables + if ( FALSE == isTrimmerHeaterTempOutOfRange ) + { + stopTrimmerHeater(); + isTrimmerHeaterTempOutOfRange = TRUE; + trimmerHeaterInternalTempOutTimer = getMSTimerCount(); } + // If the trimmer heater internal temperature was out for more than the define period, activate the safety shutdown + else if ( TRUE == didTimeout( trimmerHeaterInternalTempOutTimer, HEATERS_MAX_ALLOWED_INTERNAL_TEMPERATURE_TIMEOUT_MS ) ) + { + activateSafetyShutdown(); + } } - else + + /* + * If any of the heaters are on, check if the flow is below than the minimum value + * If the flow is below minimum for the first time, set the variables + * If the flow is below minimum for more than the defined time, stop the heaters and raise the alarm + * If the flow is in range, reset the variables + */ + if ( ( TRUE == isPrimaryHeaterOn ) || ( TRUE == isTrimmerHeaterOn ) ) { - if ( getMeasuredROFlowRate() > MIN_RO_FLOWRATE_LPM ) + F32 measuredFlow = getMeasuredROFlowRate(); + + if ( measuredFlow < MIN_RO_FLOWRATE_LPM ) { - if ( primaryHeatersExecPrevState != PRIMARY_HEATERS_EXEC_STATE_OFF ) + if ( FALSE == isFlowBelowMin ) { - setPrimaryHeaterTargetTemperature( primaryHeaterTargetTemperature ); - startPrimaryHeater(); + isFlowBelowMin = TRUE; + heatersOnWithNoFlowTimer = getMSTimerCount(); } - if ( trimmerHeaterExecPrevState != TRIMMER_HEATER_EXEC_STATE_OFF ) + else if ( TRUE == didTimeout( heatersOnWithNoFlowTimer, HEATERS_ON_NO_FLOW_TIMEOUT_MS ) ) { - setTrimmerHeaterTargetTemperature( trimmerHeaterTargetTemperature ); - startTrimmerHeater(); + stopPrimaryHeater(); + stopTrimmerHeater(); + + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DG_HEATERS_ON_WITH_NO_FLOW_TIMEOUT, measuredFlow ); } } - }*/ + else + { + isFlowBelowMin = FALSE; + heatersOnWithNoFlowTimer = getMSTimerCount(); + } + } +#endif // Check for data publication publishHeatersData(); @@ -607,25 +665,38 @@ if ( ++primaryHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { - F32 outletTemp = getTemperatureValue( primaryHeatersFeedbackTempSensor ); - mainPrimaryHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); - - if ( mainPrimaryHeaterDutyCycle >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + // Check if the flow is not below minimum required first + // If the flow is below minimum, send 0.00 to the PWM until the flow comes back to range + // If the flow is within range, run the PI controller to control the heaters normally + if ( FALSE == isFlowBelowMin ) { - // The duty cycle from the PI controller was greater than max duty cycle of the main primary - // heater. So subtract the remaining from the max main primary heater duty cycle and set - // the rest to the small primary heater - smallPrimaryHeaterDutyCycle = mainPrimaryHeaterDutyCycle - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; - mainPrimaryHeaterDutyCycle = MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; - setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); - setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + F32 outletTemp = getTemperatureValue( primaryHeatersFeedbackTempSensor ); + mainPrimaryHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_PRIMARY_HEATER, primaryHeaterTargetTemperature, outletTemp ); + + if ( mainPrimaryHeaterDutyCycle >= MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE ) + { + // The duty cycle from the PI controller was greater than max duty cycle of the main primary + // heater. So subtract the remaining from the max main primary heater duty cycle and set + // the rest to the small primary heater + smallPrimaryHeaterDutyCycle = mainPrimaryHeaterDutyCycle - MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + mainPrimaryHeaterDutyCycle = MAIN_PRIMARY_HEATER_MAX_DUTY_CYCLE; + setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); + setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + } + else + { + setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); + smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; + setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + } } + // Flow is below the minimum required flow to run the primary heaters else { - setMainPrimaryHeaterPWM( mainPrimaryHeaterDutyCycle ); - smallPrimaryHeaterDutyCycle = HEATERS_MIN_DUTY_CYCLE; - setSmallPrimaryHeaterPWM( smallPrimaryHeaterDutyCycle ); + setMainPrimaryHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); + setSmallPrimaryHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); } + primaryHeaterTimerCounter = 0; } @@ -678,7 +749,8 @@ * The handleTrimmerHeaterControlToTarget function handles the trimmer * heater at control state when the heater is active. * @details Inputs: trimmerHeaterTimerCounter, trimmerHeaterDutyCycle - * @details Outputs: trimmerHeaterTimerCounter, trimmerHeaterDutyCycle, isTrimmerHeaterOn + * @details Outputs: trimmerHeaterTimerCounter, trimmerHeaterDutyCycle, + * isTrimmerHeaterOn * @return state (TRIMMER_HEATER_EXEC_STATES_T) *************************************************************************/ static TRIMMER_HEATER_EXEC_STATES_T handleTrimmerHeaterControlToTarget( void ) @@ -687,9 +759,20 @@ if ( ++trimmerHeaterTimerCounter >= CONTROLLER_CHECK_INTERVAL_COUNT ) { - F32 outletTemp = getTemperatureValue( trimmerHeaterFeedbackTempSensor ); - trimmerHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); - setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + // Check if the flow is not below minimum required first + // If the flow is below minimum, send 0.00 to the PWM until the flow comes back to range + // If the flow is within range, run the PI controller to control the heaters normally + if ( FALSE == isFlowBelowMin ) + { + F32 outletTemp = getTemperatureValue( trimmerHeaterFeedbackTempSensor ); + trimmerHeaterDutyCycle = runPIController( PI_CONTROLLER_ID_TRIMMER_HEATER, trimmerHeaterTargetTemperature, outletTemp ); + setTrimmerHeaterPWM( trimmerHeaterDutyCycle ); + } + else + { + setTrimmerHeaterPWM( HEATERS_MIN_DUTY_CYCLE ); + } + trimmerHeaterTimerCounter = 0; } Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r5c967dc311b485769e50e5e4f122be21079b5ae9 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 5c967dc311b485769e50e5e4f122be21079b5ae9) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -34,9 +34,6 @@ #ifdef EMC_TEST_BUILD #include "Heaters.h" #endif -#ifdef ENABLE_DIP_SWITCHES -#include "Valves.h" -#endif /** * @addtogroup ROPump @@ -115,7 +112,7 @@ static F32 roPumpPWMDutyCyclePct = 0.0; ///< Initial RO pump PWM duty cycle. static F32 roPumpDutyCyclePctSet = 0.0; ///< Currently set RO pump PWM duty cycle. static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Requested RO pump control mode. -static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set RO pump control mode. +static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< Currently set RO pump control mode. TODO do we need this? static F32 targetROPumpFlowRate = 0.0; ///< Target RO flow rate (in L/min). static F32 targetROPumpMaxPressure = 0.0; ///< Target RO max allowed pressure (in PSI). @@ -315,12 +312,15 @@ flowFilterCounter = 0; } - // To monitor the flow, the control mode must be in closed loop and the pump should be control to target state, - // meaning, it is controlling to a certain pressure - /*if ( roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP && roPumpState == RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE ) +#ifndef IGNORE_RO_PUMP_MONITOR + // To monitor the flow, the control mode must be in closed loop mode and the pump should be control to flow state + // If the pump is controlled to the maximum pressure, the flow might be different from the target flow for more than 10% + // but the pump is not able to achieve the flow. + if ( ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) && ( RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE == roPumpState ) ) { F32 const currentFlow = getMeasuredROFlowRate(); F32 const targetFlow = getTargetROPumpFlowRate(); + // The flow cannot be out of range for than 10% of the target flow BOOL const isFlowOutOfRange = fabs( 1.0 - ( currentFlow / targetFlow ) ) > MAX_ALLOWED_FLOW_DEVIATION; // Figure out whether flow is out of range from which side BOOL const isFlowOutOfUpperRange = isFlowOutOfRange && ( currentFlow > targetFlow ); @@ -343,8 +343,8 @@ { activateSafetyShutdown(); } - }*/ - + } +#endif // Publish RO pump data on interval publishROPumpData(); } Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r07c30fa0dd429227ad93942a0db115998dc03b6c -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 07c30fa0dd429227ad93942a0db115998dc03b6c) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -158,7 +158,7 @@ static void getHeaterInternalTemp( U32 TCIndex, U32 CJIndex ); static void processTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); -static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ); +static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U16 adc, U32 fpgaError, U32 fpgaCount ); static BOOL isADCReadValid( U32 sensorIndex, U32 fpgaError, U32 fpgaCount ); static void processADCRead( U32 sensorIndex, S32 adc ); static void publishTemperatureSensorsData( void ); @@ -464,7 +464,7 @@ } // Check which heater's internal temperature is being calculated - if ( TCIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ) + if ( TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE == TCIndex ) { tempSensors[ TEMPSENSORS_PRIMARY_HEATER_INTERNAL ].temperatureValues.data = temperature; } @@ -492,7 +492,7 @@ { S32 convertedADC = (S32)( adc & MASK_OFF_U32_MSB ); - if ( isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) + if ( TRUE == isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) { processADCRead( sensorIndex, convertedADC ); } @@ -513,32 +513,12 @@ * @param fpgaCount reported read count by FPGA * @return none *************************************************************************/ -static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U32 adc, U32 fpgaError, U32 fpgaCount ) +static void processHtrsTempSnsrsADCRead( U32 sensorIndex, U16 adc, U32 fpgaError, U32 fpgaCount ) { - U16 adcConv = 0; - S16 convertedADC = 0; - - if ( ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_THERMO_COUPLE ) || ( sensorIndex == TEMPSENSORS_TRIMMER_HEATER_THERMO_COUPLE ) ) + if ( TRUE == isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) { - // Cast the adc from U32 to U16 and shift it to left by 2 - adcConv = ( (U16)adc ) << SHIFT_BITS_BY_2; - // Cast from U16 to S16 and shift the bits to right by 2 - // so if the sign bit is 1, the sign bit is extended - convertedADC = ( (S32)adcConv ) >> SHIFT_BITS_BY_2; + processADCRead( sensorIndex, (S32)adc ); } - else if ( ( sensorIndex == TEMPSENSORS_PRIMARY_HEATER_COLD_JUNCTION ) || ( sensorIndex == TEMPSENSORS_TRIMMER_HEATER_COLD_JUNCTION ) ) - { - // Cast the adc from U32 to U16 and shift it by 4 - adcConv = ( (U16)adc ) << SHIFT_BITS_BY_4; - // Cast from U16 to S16 and shift the bits to right by 4 - // so if the sign bit is 1, the sign bit is extended - convertedADC = ( (S32)adcConv ) >> SHIFT_BITS_BY_4; - } - - if ( isADCReadValid( sensorIndex, fpgaError, fpgaCount ) ) - { - processADCRead( sensorIndex, (S32)convertedADC ); - } } /*********************************************************************//** Index: firmware/App/Controllers/Thermistors.c =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Controllers/Thermistors.c (.../Thermistors.c) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Controllers/Thermistors.c (.../Thermistors.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -102,8 +102,7 @@ thermistorsStatus[ THERMISTOR_POWER_SUPPLY_2 ].betaValue = POWER_SUPPLY_THERMISTOR_BETA_VALUE; // Initialize a persistent alarm for thermistors temeprature out of range - //initPersistentAlarm( PERSISTENT_ALARM_THERMISTOR_TEMPERATURE_OUT_OF_RANGE, ALARM_ID_DG_THERMISOTRS_TEMPERATURE_OUT_OF_RANGE, - // TRUE, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_THERMISTORS_TEMPERATURE_OUT_OF_RANGE, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD, MAX_ALLOWED_TEMP_OUT_OF_RANGE_PERIOD ); } /*********************************************************************//** Index: firmware/App/DGCommon.h =================================================================== diff -u -r5c967dc311b485769e50e5e4f122be21079b5ae9 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 5c967dc311b485769e50e5e4f122be21079b5ae9) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -45,6 +45,9 @@ // #define PRESSURES_DEBUG 1 #define DISABLE_DIALYSATE_CHECK 1 #define IGNORE_DRAIN_PUMP_MONITOR 1 + #define IGNORE_HEATERS_MONITOR 1 +// #define IGNORE_RO_PUMP_MONITOR 1 + #define IGNORE_HEAT_DISINFECT_RSRVR_TIMEOUT 1 #include #include #endif Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r5c967dc311b485769e50e5e4f122be21079b5ae9 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 5c967dc311b485769e50e5e4f122be21079b5ae9) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -82,7 +82,7 @@ #define HEAT_DISINFECT_TIME_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. TODO original time was 10 minutes #define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. TODO figure out this timeout #define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disinfect. TODO change this to 5 seconds -#define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 500.0 ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. TODO original value is 100 mL +#define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 600.0 ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. TODO original value is 100 mL #define POST_HEAT_DISINFECT_WAIT_TIME_MS ( 3 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect final wait time before flushing the system in milliseconds. // Mix drain R1 and R2 @@ -407,7 +407,7 @@ // If the inlet pressure is less than the threshold and TDi and TRo difference is greater than 1 C, the cycle // should be canceled - if ( ppiPressure < MIN_INLET_PRESSURE_PSI && fabs( TDiTemp - TRoTemp ) > MAX_START_STATE_TEMP_SENSORS_DIFF_C ) + if ( ( ppiPressure < MIN_INLET_PRESSURE_PSI ) && ( fabs( TDiTemp - TRoTemp ) > MAX_START_STATE_TEMP_SENSORS_DIFF_C ) ) { prevHeatDisinfectState = state; alarm = ALARM_ID_DG_HEAT_DISINFECT_INLET_PRES_AND_TEMP_SNSRS_OUT; @@ -488,6 +488,11 @@ // Start the timer stateTimer = getMSTimerCount(); } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } return state; } @@ -528,6 +533,11 @@ state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN; } } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } return state; } @@ -606,6 +616,8 @@ F32 TD2Temp = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); F32 avgTemp = ( ThdTemp + TPoTemp + TD1Temp + TD2Temp ) / NUM_OF_TEMP_SENSORS_TO_AVG; + // Check if any of the temperature sensors deviate for more than the defined value from the average of all + // of the temperature sensors BOOL isThdOut = ( fabs( ThdTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C ? TRUE : FALSE ); BOOL isTPoOut = ( fabs( TPoTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C ? TRUE : FALSE ); BOOL isTD1Out = ( fabs( TD1Temp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C ? TRUE : FALSE ); @@ -698,8 +710,13 @@ rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; state = DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } } - else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status || DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevHeatDisinfectState = state; state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; @@ -735,6 +752,11 @@ // Done with draining R1 signalDrainPumpHardStop(); } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } // First reservoir 2 must be completely full if ( DG_RESERVOIR_BELOW_TARGET == rsrvr2Status ) @@ -764,7 +786,17 @@ rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R2; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } return state; } @@ -797,6 +829,11 @@ rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } return state; } @@ -849,6 +886,11 @@ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } return state; } @@ -904,14 +946,24 @@ // Get the current volumes of R1 & R2. These values will be used to make sure the reservoirs' // volume does not change more than a certain amount during the actual heat disinfect cycle - R1HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); + R1HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ); //TODO change this back to primary R2HeatDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); stateTimer = getMSTimerCount(); rsrvrsVolMonitorTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } return state; } @@ -957,7 +1009,7 @@ break; default: - // Do nothing, heat disinfect in progress + // Do nothing, heat disinfect is in progress break; } @@ -1000,7 +1052,21 @@ state = DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1; } +#ifdef IGNORE_HEAT_DISINFECT_RSRVR_TIMEOUT + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } +#endif } +#ifdef IGNORE_HEAT_DISINFECT_RSRVR_TIMEOUT + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } +#endif return state; } @@ -1148,6 +1214,11 @@ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } } return state; @@ -1193,6 +1264,11 @@ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } return state; } @@ -1233,7 +1309,17 @@ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } return state; } @@ -1264,6 +1350,11 @@ // Done with draining R1 signalDrainPumpHardStop(); } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } // First reservoir 2 must be completely full if ( DG_RESERVOIR_BELOW_TARGET == rsrvr2Status ) @@ -1299,7 +1390,17 @@ rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; state = DG_HEAT_DISINFECT_STATE_DRAIN_R2; } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + } return state; } @@ -1377,7 +1478,7 @@ F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); // The two sensors must be less than a threshold to decide if mix drain is needed to normal drain - if ( TDi < MIX_DRAIN_TEMPERATURE_THRESHOLD_C && TRo < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) + if ( ( TDi < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) && ( TRo < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) ) { targetRPM = DRAIN_PUMP_TARGET_RPM; cancellationMode = CANCELLATION_MODE_COLD; @@ -1415,6 +1516,11 @@ setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); } } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } // If reservoir 2 has already been drained and reservoir 1 is empty, reset and switch to complete if ( ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) && ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) ) @@ -1426,6 +1532,11 @@ { failHeatDisinfect(); } + else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) + { + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + } } return state; @@ -1516,12 +1627,16 @@ if ( r == DG_RESERVOIR_1 ) { - volume = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); + volume = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ); //TODO change back to primary } else if ( r == DG_RESERVOIR_2 ) { volume = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_DG_RESERVOIR_SELECTED, r ) + } // Check the volume of the reservoir against the target volume if ( volume >= targetVol ) @@ -1601,7 +1716,7 @@ F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); F32 ThdTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); //TODO change this to actual TPm sensor later - BOOL isR1OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) - R1HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; + BOOL isR1OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ) - R1HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; //TODo change this to primary when the stupid load cell was fixed BOOL isR2OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ) - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; // Check if either reservoir 1 or reservoir 2 are losing volume more than allowed volume Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -r9f3943dcab5881216ef0119e7de3a36668dea3bc -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -39,8 +39,8 @@ U32 stateElapsedTime; ///< Current heat disinfect elapsed time. U32 heatDisinfectElapsedTime; ///< Elapsed time in just heat disinfecting. U32 cancellationMode; ///< Heat disinfect cancellation mode. - F32 R1FillLevel; - F32 R2FillLevel; + F32 R1FillLevel; ///< Reservoir 1 level upon starting the heat disinfect. + F32 R2FillLevel; ///< Reservoir 2 level upon starting the heat disinfect. } MODE_HEAT_DISINFECT_DATA_T; // ********** public function prototypes ********** Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r9ce06772b2f651c57144327e6cbf886e2bc22dee -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 9ce06772b2f651c57144327e6cbf886e2bc22dee) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -165,6 +165,7 @@ SW_FAULT_ID_DRAIN_PUMP_INVALID_RPM_SELECTED, SW_FAULT_ID_ALARM_MGMT_INVALID_ALARM_ID, SW_FAULT_ID_HEAT_DISINFECT_INVALID_EXEC_STATE, // 75 + SW_FAULT_ID_INVALID_DG_RESERVOIR_SELECTED, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r304797ba69ef356e1e9436f81a624c01126d6cd1 -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 304797ba69ef356e1e9436f81a624c01126d6cd1) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -435,7 +435,21 @@ BOOL hasTargetDrainVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId, U32 timeout ) { BOOL result = FALSE; - F32 const loadcellWeight = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); + + F32 loadcellWeight = 0.0; + + // TODO remove this code once the load cell is repaired + if ( DG_RESERVOIR_1 == reservoirId ) + { + loadcellWeight = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ); + } + else + { + loadcellWeight = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); + } + // TODO remove the above code the load cell is repaired + + //F32 const loadcellWeight = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); U32 const targetDrainVolume = getReservoirDrainVolumeTargetMl(); if ( loadcellWeight < reservoirLowestWeight[ reservoirId ] ) Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r9f3943dcab5881216ef0119e7de3a36668dea3bc -rfba89d67dd2bef913e85a13563e2aa49f0e2e2f5 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9f3943dcab5881216ef0119e7de3a36668dea3bc) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision fba89d67dd2bef913e85a13563e2aa49f0e2e2f5) @@ -26,7 +26,6 @@ #include "FPGA.h" #include "Heaters.h" #include "LoadCell.h" -#include "MessagePayloads.h" #include "ModeStandby.h" #include "ModeRecirculate.h" #include "MsgQueues.h"