Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -rdf70610b0fd07ef4757da8ab504ecc856e178fe1 -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision df70610b0fd07ef4757da8ab504ecc856e178fe1) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -255,7 +255,7 @@ // The RPM is only checked in open loop state that the pump is run at a fixed RPM. // The persistent alarm waits for a couple of seconds before raising an alarm, this is supposed to cover // when the pump is turned on and it takes a while to ramp up to target RPM. - if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) + /*if( drainPumpControlModeSet == PUMP_CONTROL_MODE_OPEN_LOOP ) { U32 targetRPM = getTargetDrainPumpRPM(); F32 threshold = OPEN_LOOP_RPM_OUT_OF_RANGE * targetRPM; @@ -279,7 +279,7 @@ //activateSafetyShutdown(); BOOL test = FALSE; } - } + }*/ // Publish drain pump data on interval publishDrainPumpData(); Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r87acb1655edbf974497e4300f2c18eea62f8acba -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 87acb1655edbf974497e4300f2c18eea62f8acba) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -105,6 +105,9 @@ 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. @@ -332,23 +335,37 @@ *************************************************************************/ void execHeatersMonitor( void ) { - if ( isPrimaryHeaterOn || isTrimmerHeaterOn ) + /*if ( isPrimaryHeaterOn || isTrimmerHeaterOn ) { // If the RO pump is not on, turn off the heaters - /*if ( !isReverseOsmosisPumpOn() || getMeasuredROFlowRate() < MIN_RO_FLOWRATE_LPM ) + if ( ( getMeasuredROFlowRate() < MIN_RO_FLOWRATE_LPM ) && ( ++heatersOnWithNoFlowTimeOut > HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ) ) { - if ( ++heatersOnWithNoFlowTimeOut > HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ) - { - 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(); // 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(); - heatersOnWithNoFlowTimeOut = 0; - } - }*/ + primaryHeatersExecPrevState = primaryHeatersExecState; + trimmerHeaterExecPrevState = trimmerHeaterExecState; + + heatersOnWithNoFlowTimeOut = 0; + } } + else + { + if ( getMeasuredROFlowRate() > MIN_RO_FLOWRATE_LPM ) + { + if ( primaryHeatersExecPrevState != PRIMARY_HEATERS_EXEC_STATE_OFF ) + { + setPrimaryHeaterTargetTemperature( primaryHeaterTargetTemperature ); + startPrimaryHeater(); + } + if ( trimmerHeaterExecPrevState != TRIMMER_HEATER_EXEC_STATE_OFF ) + { + setTrimmerHeaterTargetTemperature( trimmerHeaterTargetTemperature ); + startTrimmerHeater(); + } + } + }*/ - //TODO add code to remember the former state of the heaters and if they were on, turn them on again - // Check for data publication publishHeatersData(); } @@ -646,7 +663,7 @@ if ( DG_MODE_HEAT == getCurrentOperationMode() ) { // Set the feedback temperature sensor - trimmerHeaterFeedbackTempSensor = TEMPSENSORS_INLET_DIALYSATE; //TODO change this to Thd sensors once it is installed + trimmerHeaterFeedbackTempSensor = TEMPSENSORS_OUTLET_REDUNDANT; //TODO change this to Thd sensors once it is installed } state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r9047c6e1db73ac20849a63b8cbec33041c28b0d5 -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 9047c6e1db73ac20849a63b8cbec33041c28b0d5) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -272,7 +272,7 @@ roPumpOpenLoopTargetDutyCycle = 0.0; roControlTimerCounter = 0; isROPumpOn = FALSE; - targetROPumpMaxPressure = 0; + targetROPumpMaxPressure = 0; resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_PUMP_DUTY_CYCLE ); } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r28db3416e8183d1dfdbb047e269624a18d847a29 -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 28db3416e8183d1dfdbb047e269624a18d847a29) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -58,10 +58,11 @@ #define MAX_INLET_CONDUCTIVITY_US_PER_CM 2000.0 ///< Maximum water inlet conductivity in us/cm // Flush circulation path state defines -#define RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM 0.6 ///< RO pump target flow rate during flush/fill in L/min. TODO original flow was 0.8 +#define RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM 0.8 ///< RO pump target flow rate during flush/fill in L/min. TODO original flow was 0.8 #define MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI 130 ///< Maximum RO pump pressure during flush/fill states in psi. -#define FLUSH_CICRCULATION_WAIT_TIME_MS ( 30 * MS_PER_SECOND ) ///< Flush/rinse circulation path wait time in milliseconds. TODO original time was 30 seconds +#define FLUSH_CICRCULATION_WAIT_TIME_MS ( 1 * MS_PER_SECOND ) ///< Flush/rinse circulation path wait time in milliseconds. TODO original time was 30 seconds #define MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 3.0 ///< Maximum flush circulation temperature difference tolerance in C. +#define NUM_OF_TEMP_SENSORS_TO_AVG 4.0 ///< Number of temperature sensors to average to check the difference. // Flush and drain R1 and R2 #define RSRVRS_FULL_VOL_ML 1900.0 ///< Reservoirs 1 & 2 full volume in mL. @@ -71,15 +72,15 @@ #define RSRVRS_DRAIN_TIMEOUT_MS ( 2 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 drain timeout in ms. // Fill and heat water -#define HEAT_DISINFECT_TARGET_TEMPERATURE_C 55.0 ///< Heat disinfect target water temperature in C. TODO original temperature was 85.0 -#define HEAT_DISINFECT_START_TEMPERATURE_C 50.0 ///< Heat disinfect minimum acceptable temperature in C. TODO original temperature was 81.0 +#define HEAT_DISINFECT_TARGET_TEMPERATURE_C 60.0 ///< Heat disinfect target water temperature in C. TODO original temperature was 85.0 +#define HEAT_DISINFECT_START_TEMPERATURE_C 58.0 ///< Heat disinfect minimum acceptable temperature in C. TODO original temperature was 81.0 // R1 to R2 & R2 to R1 heat disinfect circulation #define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 0.6 ///< Heat disinfect target RO flow rate in L/min. TODO original value was 0.8 #define HEAT_DISINFECT_MAX_RO_PRESSURE_PSI 30 ///< Heat disinfect maximum RO pressure in psi. #define HEAT_DISINFECT_TARGET_DRAIN_PRES_PSI 1.0 ///< Heat disinfect target drain outlet pressure in psi. -#define HEAT_DISINFECT_TIME_MS ( 0.5 * 60 * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. TODO original time was 10 minutes -#define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 30 * 60 * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. +#define HEAT_DISINFECT_TIME_MS ( 3 * 60 * MS_PER_SECOND ) ///< Heat disinfect time for each section in milliseconds. TODO original time was 10 minutes +#define HEAT_DISINFECT_START_TEMP_TIMOUT_MS ( 3 * 60 * 60 * MS_PER_SECOND ) ///< Heat disinfect reaching to minimum temperature timeout in milliseconds. TODO figure out this timeout #define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 2 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during heat disnfect. #define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 100.0 ///< Reservoirs 1 & 2 maximum allowed volume change when full during heat disinfect. #define POST_HEAT_DISINFECT_WAIT_TIME_MS ( 1 * 60 * MS_PER_SECOND ) ///< Heat disinfect final wait time before flushing the system in milliseconds. @@ -103,12 +104,22 @@ /// Reservoirs status typedef enum Reservoirs_status { - RESERVOIR_EMPTY = 0, - RESERVOIR_FULL, - RESERVOIR_TIMEOUT, - NUM_OF_RESERVOIR_STATES -} TYPE_T ; + RESERVOIR_STATUS_EMPTY = 0, ///< Reservoir empty. + RESERVOIR_STATUS_FULL, ///< Reservoir full. + RESERVOIR_STATUS_UNKNOWN, ///< Reservoir timeout. + NUM_OF_RESERVOIR_STATUS ///< Number of reservoirs status. +} RESERVOIRS_STATUS_T; +/// Heat disinfect status +typedef enum Heat_disinfect_status +{ + HEAT_DISINFECT_IN_PROGRESS = 0, ///< Heat disinfect in progress. + HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT, ///< Heat disinfect reservoirs leak timeout. + HEAT_DISINFECT_HEAT_UP_TIMEOUT, ///< Heat disinfect heat up timeout. + HEAT_DISINFECT_COMPLETE, ///< Heat disinfect complete. + NUM_OF_HEAT_DISINFECT_STATUS ///< Number of heat disinfect status. +} HEAT_DISINFECT_STATUS_T; + // ********** private data ********** static DG_HEAT_DISINFECT_STATE_T heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; ///< Current active heat disinfect state. @@ -119,8 +130,10 @@ static BOOL areTempSensorsInRange = FALSE; ///< Heat disinfect temperature sensors in/out range flag. /// Boolean flag to check whether draining R1 and R2 is at the end of the heat disinfect cycle or in the beginning. So the drain states can be reused. static BOOL isThisLastDrain = FALSE; -static BOOL isR1Full = FALSE; ///< Reservoir 1 full/empty flag. -static BOOL isR2Full = FALSE; ///< Reservoir 2 full/empty flag. +static BOOL isR1Full = FALSE; ///< Reservoir 1 full/empty flag. TODO REMOVE +static BOOL isR2Full = FALSE; ///< Reservoir 2 full/empty flag. TODO REMOVE +static RESERVOIRS_STATUS_T rsrvr1Status = RESERVOIR_STATUS_UNKNOWN; ///< Reservoir 1 status. +static RESERVOIRS_STATUS_T rsrvr2Status = RESERVOIR_STATUS_UNKNOWN; ///< Reservoir 2 status. static U32 R1HeatDisinfectVol = 0; ///< Reservoir 1 full volume during heat disinfect. static U32 R2HeatDisinfectVol = 0; ///< Reservoir 2 full volume during heat disinfect. static U32 heatDisinfectTimer = 0; ///< Heat disinfect timer. @@ -159,7 +172,7 @@ static void setModeToFailed( DG_HEAT_DISINFECT_STATE_T state ); static BOOL isRsrvrFull( DG_RESERVOIR_ID_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T cancellationState ); static BOOL isRsrvrEmpty( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout, DG_HEAT_DISINFECT_STATE_T cancellationState ); -static BOOL isStateHeatDisinfectComplete( DG_HEAT_DISINFECT_STATE_T state ); +static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ); static void publishHeatDisinfectData( void ); /*********************************************************************//** @@ -168,7 +181,7 @@ * module. * @details Inputs: none * @details Outputs: heatDisinfectState, stateTimer, isThisLastDrain, - * stateTrialCounter, areTempSensorsInRange, isR1Full, isR2Full, + * stateTrialCounter, areTempSensorsInRange, rsrvr1Status, rsrvr2Status, * R1HeatDisinfectVol, R2HeatDisinfectVol, hasPostHeatDisinfectWaitStarted, * overallHeatDisinfectTimer TODO fill up as we go * @return none @@ -181,8 +194,8 @@ isThisLastDrain = FALSE; stateTrialCounter = 0; areTempSensorsInRange = FALSE; - isR1Full = FALSE; - isR2Full = FALSE; + rsrvr1Status = RESERVOIR_STATUS_UNKNOWN; + rsrvr2Status = RESERVOIR_STATUS_UNKNOWN; R1HeatDisinfectVol = 0; R2HeatDisinfectVol = 0; hasPostHeatDisinfectWaitStarted = FALSE; @@ -364,11 +377,14 @@ // Start overall heat disinfect timer overallHeatDisinfectTimer = getMSTimerCount(); - // Set all the actuators to reset and deenergized state + // Set all the actuators to reset and de-energized state resetActuators(); + // Reset the load cells lowest weight prior to starting the run + resetReservoirsLowestWeight(); + F32 ppiPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - F32 TDiTemp = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 TDiTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); //TODo change to TDi F32 TRoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); // If the inlet pressure is less than the threshold or TDi and TRo difference is greater than 1 C, the cycle @@ -538,11 +554,11 @@ if ( didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) && FALSE == areTempSensorsInRange ) { - F32 ThdTemp = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); // TODO add TPm later. This is the new temp sensor of the coldest spot. It is temporarily TDi. + F32 ThdTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); // TODO add TPm later. This is the new temp sensor of the coldest spot. It is temporarily TDi. F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); F32 TD1Temp = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_1 ); F32 TD2Temp = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); - F32 avgTemp = ( ThdTemp + TPoTemp + TD1Temp + TD2Temp ) / 4.0; + F32 avgTemp = ( ThdTemp + TPoTemp + TD1Temp + TD2Temp ) / NUM_OF_TEMP_SENSORS_TO_AVG; BOOL isThdOut = fabs( ThdTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; BOOL isTPoOut = fabs( TPoTemp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C; @@ -820,19 +836,28 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDisinfectR1ToR2State( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2; + HEAT_DISINFECT_STATUS_T status = getHeatDisinfectStatus(); - if ( isStateHeatDisinfectComplete( state ) ) + switch ( status ) { - //TODO turn off CP1 and CP2 + case HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT: + case HEAT_DISINFECT_HEAT_UP_TIMEOUT: + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + break; - // Set the valves to transfer hot water from R1 to R2 and fill up R2. - setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); - setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); - setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + case HEAT_DISINFECT_COMPLETE: - stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; + //TODO turn off CP1 and CP2 + + // Set the valves to transfer hot water from R1 to R2 and fill up R2. + setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER; + break; } return state; @@ -880,42 +905,52 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDisinfectR2ToR1State( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1; + HEAT_DISINFECT_STATUS_T status = getHeatDisinfectStatus(); - // Keep monitoring for the end of heat disinfect and while the post delay has not started - if ( isStateHeatDisinfectComplete( state ) && hasPostHeatDisinfectWaitStarted != TRUE ) + switch ( status ) { - // Turn off the pumps and heaters - //TODO turn off CP1 and CP2 - stopPrimaryHeater(); - stopTrimmerHeater(); + case HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT: + case HEAT_DISINFECT_HEAT_UP_TIMEOUT: + state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + break; - hasPostHeatDisinfectWaitStarted = TRUE; - stateTimer = getMSTimerCount(); - } - else if ( hasPostHeatDisinfectWaitStarted && didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) - { - // Stop the drain pump and the RO pump to exit the closed loop - signalDrainPumpHardStop(); - signalROPumpHardStop(); + case HEAT_DISINFECT_COMPLETE: + if ( hasPostHeatDisinfectWaitStarted != TRUE ) + { + // Turn off the pumps and heaters + //TODO turn off CP1 and CP2 + stopPrimaryHeater(); + stopTrimmerHeater(); - // De-energize all the valves that are not in the path anymore and set the other - // valves to drain the hot water - setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VBF, VALVE_STATE_CLOSED ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); + hasPostHeatDisinfectWaitStarted = TRUE; + stateTimer = getMSTimerCount(); + } + else if ( hasPostHeatDisinfectWaitStarted && didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) + { + // Stop the drain pump and the RO pump to exit the closed loop + signalDrainPumpHardStop(); + signalROPumpHardStop(); - // Turn on the drain pump to drain the reservoirs in open loop mode - setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + // De-energize all the valves that are not in the path anymore and set the other + // valves to drain the hot water + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); - stateTimer = getMSTimerCount(); - hasPostHeatDisinfectWaitStarted = FALSE; - state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; + // Turn on the drain pump to drain the reservoirs in open loop mode + setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + + stateTimer = getMSTimerCount(); + hasPostHeatDisinfectWaitStarted = FALSE; + state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; + } + break; } return state; @@ -985,7 +1020,7 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_COOL_DOWN_RO_FILTER; - F32 ThdTemp = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); //TODO change this to actual TPm sensor later + F32 ThdTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); //TODO change this to actual TPm sensor later // Check if the coldest spot temperature is less than 45 C so the RO filter // can safely run fluid through @@ -1163,28 +1198,28 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; - // Stop all the actuators first then decide who should run next - resetActuators(); - if ( cancellationMode == CANCELLATION_MODE_NONE ) { + // Stop all the actuators first then decide who should run next + resetActuators(); + // Check inlet dialysate and redundant outlet temperature sensors - F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 TDi = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); //TODO change to TDi 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 ) { // Set the reservoirs status to FALSE - isR1Full = FALSE; - isR2Full = FALSE; + isR1Full = TRUE; + isR2Full = TRUE; cancellationMode = CANCELLATION_MODE_COLD; } else { // Set the reservoirs status to FALSE - isR1Full = FALSE; - isR2Full = FALSE; + isR1Full = TRUE; + isR2Full = TRUE; // The fluid is hot so this is a mix drain. Set the VPd to direct the cold inlet fluid to drain setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); @@ -1208,13 +1243,17 @@ } // If reservoir 2 has already been drained and reservoir 1 is empty, reset and switch to complete - if ( ( isR2Full != TRUE ) && isRsrvrEmpty( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ) ) + if ( ( isR2Full != TRUE ) && ( isR1Full == TRUE ) ) { - // Done with heat disinfect mode - state = DG_HEAT_DISINFECT_STATE_COMPLETE; + if ( isRsrvrEmpty( DG_RESERVOIR_1, DRAIN_WEIGHT_UNCHANGE_TIMEOUT, RSRVRS_INITIAL_DRAIN_TIME_OUT_MS, state ) ) + { + isR1Full = FALSE; + // Done with heat disinfect mode + state = DG_HEAT_DISINFECT_STATE_COMPLETE; - // Pass the previous heat disinfect state for alarm report - setModeToFailed( prevHeatDisinfectState ); + // Pass the previous heat disinfect state for alarm report + setModeToFailed( prevHeatDisinfectState ); + } } return state; @@ -1349,19 +1388,18 @@ /*********************************************************************//** * @brief - * The isStateHeatDisinfectComplete function monitors and runs the current + * The getHeatDisinfectStatus function monitors and returns the current * stage of heat disinfect cycle. * @details Inputs: areRsrvrsLeaking, areRsrvrsLeaking * @details Outputs: areRsrvrsLeaking, areRsrvrsLeaking - * @param state is the state that called this function - * @return TRUE if this stage of heat disinfect cycle is done + * @return status of the heat disinfect (i.e in progress, complete) *************************************************************************/ -static BOOL isStateHeatDisinfectComplete( DG_HEAT_DISINFECT_STATE_T state ) +static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ) { - BOOL heatDisinfectStatus = FALSE; + HEAT_DISINFECT_STATUS_T status = HEAT_DISINFECT_IN_PROGRESS; F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); - F32 ThdTemp = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); //TODO change this to actual TPm sensor later + 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 isR2OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ) - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; @@ -1379,10 +1417,10 @@ else if ( didTimeout( rsrvrsVolMonitorTimer, RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ) ) { areRsrvrsLeaking = FALSE; - setModeToFailed( state ); + status = HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT; } } - // We are in range + // Reservoirs are in range else { areRsrvrsLeaking = FALSE; @@ -1400,7 +1438,7 @@ { // Heating up to minimum temperature for heat disinfect failed // TODO we need to know how long it takes to reach to temperature before turning on the timeout - //setModeToFailed( state ); + status = HEAT_DISINFECT_HEAT_UP_TIMEOUT; } } else if ( hasHeatDisinfectStarted != TRUE && ThdTemp > HEAT_DISINFECT_START_TEMPERATURE_C ) @@ -1416,12 +1454,12 @@ if ( didTimeout( heatDisinfectTimer, HEAT_DISINFECT_TIME_MS ) ) { // Done with this stage of heat disnfect. Reset the variables - heatDisinfectStatus = TRUE; + status = HEAT_DISINFECT_COMPLETE; hasHeatDisinfectStarted = FALSE; } } - return heatDisinfectStatus; + return status; } /*********************************************************************//** Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rdf70610b0fd07ef4757da8ab504ecc856e178fe1 -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision df70610b0fd07ef4757da8ab504ecc856e178fe1) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -347,7 +347,7 @@ /*********************************************************************//** * @brief - * The tareReservoir function set the tare load cell variable to TRUE. + * The tareReservoir function sets the tare load cell variable to TRUE. * @details Inputs: none * @details Outputs: none * @return none @@ -359,6 +359,20 @@ /*********************************************************************//** * @brief + * The resetReservoirsLowestWeight function resets the lowest load cell + * weight of the reservoirs. + * @details Inputs: reservoirLowestWeight + * @details Outputs: reservoirLowestWeight + * @return none + *************************************************************************/ +void resetReservoirsLowestWeight( void ) +{ + reservoirLowestWeight[ DG_RESERVOIR_1 ] = MAX_RESERVOIR_WEIGHT; + reservoirLowestWeight[ DG_RESERVOIR_2 ] = MAX_RESERVOIR_WEIGHT; +} + +/*********************************************************************//** + * @brief * The getInactiveReservoir function gets the inactive reservoir. * @details Inputs: activeReservoir * @details Outputs: none @@ -435,6 +449,13 @@ if ( hasTimeOut || hasTargetReached ) { + // TODO remove Test code + if ( reservoirId == DG_RESERVOIR_1 ) + { + BOOL test = TRUE; + } + // TODO remove test code + result = TRUE; reservoirLowestWeight[ reservoirId ] = MAX_RESERVOIR_WEIGHT; Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -rdf70610b0fd07ef4757da8ab504ecc856e178fe1 -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision df70610b0fd07ef4757da8ab504ecc856e178fe1) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -63,6 +63,8 @@ void stopDrainCmd( void ); // handle stop drain command from HD void tareReservoir( void ); + +void resetReservoirsLowestWeight( void ); DG_RESERVOIR_ID_T getInactiveReservoir( void ); F32 getReservoirWeight( DG_RESERVOIR_ID_T reservoirId ); Index: firmware/App/Services/WatchdogMgmt.c =================================================================== diff -u -rdf70610b0fd07ef4757da8ab504ecc856e178fe1 -ra8d919375cdb830f52e82e2d1c72c8153f5f58ca --- firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision df70610b0fd07ef4757da8ab504ecc856e178fe1) +++ firmware/App/Services/WatchdogMgmt.c (.../WatchdogMgmt.c) (revision a8d919375cdb830f52e82e2d1c72c8153f5f58ca) @@ -51,13 +51,6 @@ static SELF_TEST_STATUS_T watchdogSelfTestStatus; ///< Watchdog self-test status. static U32 watchdogSelfTestTimerCount = 0; ///< Watchdog self-test timer count. - -// Temporary variables -const U32 arrayLen = 40; -U32 testIndex = 0; -U32 petTime [ arrayLen ]; -// Temporary variables - // ********** private function prototypes ********** static void resetWDTaskCheckIns( void ); @@ -110,17 +103,6 @@ // if all monitored tasks checked in, pet watchdog and clear the slate if ( ( TRUE == allTasksCheckedIn ) && ( didTimeout( lastWatchdogPetTime, MIN_WATCHDOG_PET_INTERVAL_MS ) ) ) { - // Test code TODO remove - petTime [ testIndex ] = calcTimeSince( lastWatchdogPetTime ); - - if ( testIndex == arrayLen - 1 ) - { - BOOL test = FALSE; - } - testIndex = INC_WRAP( testIndex, 0, arrayLen - 1 ); - - // Test code TODO remove - petWatchdog(); resetWDTaskCheckIns(); }