Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -re0cdf49eb0f54239e5d765282e0952cea7ded1bd -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision e0cdf49eb0f54239e5d765282e0952cea7ded1bd) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -73,7 +73,7 @@ #define SET_DRAIN_PUMP_ENABLE() {mibspiREG3->PC3 |= DRAIN_PUMP_ENABLE_SPI3_PORT_MASK;} ///< Drain pump enable set macro. #define CLR_DRAIN_PUMP_ENABLE() {mibspiREG3->PC3 &= ~DRAIN_PUMP_ENABLE_SPI3_PORT_MASK;} ///< Drain pump enable clear macro. -#define SAFETY_SHUTDOWN_TIMEOUT MS_PER_SECOND ///< Drain pump safety shutdown activation timeout. +#define SAFETY_SHUTDOWN_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Drain pump safety shutdown activation timeout. #define DRAIN_PUMP_OFF_RPM_ADC_COUNT 0xFFFF ///< ADC count value when pump is off. #define DATA_PUBLISH_COUNTER_START_COUNT 60 ///< Data publish counter start count. @@ -361,10 +361,12 @@ BOOL isRPMOutOfRange = ( rpmDiff > MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, getDrainPumpMeasuredRPM(), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, FALSE, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); } else { checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, FALSE, getDrainPumpMeasuredRPM(), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, FALSE, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); } #endif Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -rf1f16445b3fe84ee68ba7176abf9b575b3d11256 -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision f1f16445b3fe84ee68ba7176abf9b575b3d11256) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -652,16 +652,16 @@ * time offset. * @details Inputs: none * @details Outputs: rpmAlarmStartTimeOffset - * @param seconds the seconds the time to be offset + * @param milliSeconds the milliseconds the time to be offset * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetFanRPMAlarmStartTimestamp( U32 seconds ) +BOOL testSetFanRPMAlarmStartTimestamp( U32 milliSeconds ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { - rpmAlarmStartTimeOffset = seconds * MS_PER_SECOND; + rpmAlarmStartTimeOffset = milliSeconds; } return result; Index: firmware/App/Controllers/Fans.h =================================================================== diff -u -r8ea2ea3096334f18a1bd38018bc4359e16374d83 -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Controllers/Fans.h (.../Fans.h) (revision 8ea2ea3096334f18a1bd38018bc4359e16374d83) +++ firmware/App/Controllers/Fans.h (.../Fans.h) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -62,7 +62,7 @@ F32 getMeasuredFanRPM( FAN_NAMES_T fan ); -BOOL testSetFanRPMAlarmStartTimestamp( U32 seconds ); +BOOL testSetFanRPMAlarmStartTimestamp( U32 milliSeconds ); BOOL testSetFanPublishIntervalOverride( U32 value ); BOOL testResetFanPublishIntervalOverride( void ); Index: firmware/App/Controllers/Switches.c =================================================================== diff -u -ra9315539f527b92523b1598ff91e47db4d71dae2 -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Controllers/Switches.c (.../Switches.c) (revision a9315539f527b92523b1598ff91e47db4d71dae2) +++ firmware/App/Controllers/Switches.c (.../Switches.c) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -46,7 +46,7 @@ static U32 switchesDataPublicationCounter; ///< Switches data publication counter. static OVERRIDE_U32_T switchesDataPublishInterval = { SWITCHES_DATA_PUB_INTERVAL, SWITCHES_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish switches data to CAN bus. -static SWITCH_STATUS_T switchesStatus[ NUM_OF_DOORS_AND_CAPS ]; ///< Switches status array. +static SWITCH_STATUS_T switchesStatus[ NUM_OF_CAPS ]; ///< Switches status array. // ********** private function prototypes ********** @@ -66,7 +66,7 @@ switchesDataPublicationCounter = DATA_PUBLISH_COUNTER_START_COUNT; // Initialize all the switches - for ( i = 0; i < NUM_OF_DOORS_AND_CAPS; i++ ) + for ( i = 0; i < NUM_OF_CAPS; i++ ) { switchesStatus[ i ].status.data = (U32)STATE_CLOSED; switchesStatus[ i ].status.ovData = (U32)STATE_CLOSED; @@ -89,7 +89,7 @@ U08 currentSwitchStatus = 0; - for ( i = 0; i < NUM_OF_DOORS_AND_CAPS; i++ ) + for ( i = 0; i < NUM_OF_CAPS; i++ ) { // Get the current switch status switch ( i ) @@ -102,10 +102,6 @@ currentSwitchStatus = ( getFPGADialysateCapStatus() != 0 ? STATE_OPEN : STATE_CLOSED ); break; - case FLUID_DOOR: - currentSwitchStatus = ( getFPGAGFluidDoorStatus() != 0 ? STATE_OPEN : STATE_CLOSED ); - break; - // NOTE: the default case was removed since this switch case is executed using a for loop so the default // case is never called. The default case is unreachable in development testing. } @@ -146,7 +142,7 @@ { U32 status = 0; - if ( switchId < NUM_OF_DOORS_AND_CAPS ) + if ( switchId < NUM_OF_CAPS ) { // Assume there is no override status = switchesStatus[ switchId ].status.data; @@ -182,7 +178,6 @@ data.concentrateCap = (U32)getSwitchStatus( CONCENTRATE_CAP ); data.dialysateCap = (U32)getSwitchStatus( DIALYSATE_CAP ); - data.fluidDoor = (U32)getSwitchStatus( FLUID_DOOR ); switchesDataPublicationCounter = 0; @@ -257,7 +252,7 @@ { BOOL result = FALSE; - if ( switchId < NUM_OF_DOORS_AND_CAPS ) + if ( switchId < NUM_OF_CAPS ) { if ( TRUE == isTestingActivated() ) { @@ -283,7 +278,7 @@ { BOOL result = FALSE; - if ( switchId < NUM_OF_DOORS_AND_CAPS ) + if ( switchId < NUM_OF_CAPS ) { if ( TRUE == isTestingActivated() ) { Index: firmware/App/Controllers/Switches.h =================================================================== diff -u -ra9315539f527b92523b1598ff91e47db4d71dae2 -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Controllers/Switches.h (.../Switches.h) (revision a9315539f527b92523b1598ff91e47db4d71dae2) +++ firmware/App/Controllers/Switches.h (.../Switches.h) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -37,16 +37,14 @@ { CONCENTRATE_CAP = 0, ///< Concentrate cap DIALYSATE_CAP, ///< Dialysate cap - FLUID_DOOR, ///< Fluid door - NUM_OF_DOORS_AND_CAPS ///< Number of doors and caps + NUM_OF_CAPS ///< Number of doors and caps } SWITCH_T; /// DG doors and caps data publish structure typedef struct { U32 concentrateCap; ///< Concentrate cap U32 dialysateCap; ///< Dialysate cap - U32 fluidDoor; ///< Fluid door } SWITCHES_DATA_T; // ********** public function prototypes ********** Index: firmware/App/DGCommon.h =================================================================== diff -u -rfbecceef31f59ffc46d960803b1123e2ea491c6c -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision fbecceef31f59ffc46d960803b1123e2ea491c6c) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -55,8 +55,9 @@ #define IGNORE_CONC_PUMP_IN_HEAT_DISINFECT 1 // Not needed // #define NEW_FMD_FLOW_SENSOR 1 // Not needed #define DISABLE_HEATERS_EFFICIENCY 1 - #define DISABLE_HEAT_DISINFECT_CONDUCTIVITY 1 // Implement - #define DISABLE_CONC_PUMPS 1 + #define DISABLE_DISINFECT_CONDUCTIVITY 1 // Implement + // #define DISABLE_CONC_PUMPS 1 + #define DISABLE_CAP_SWITCHES 1 // Implement // Turn these flags on to disable dialysate mixing #define DISABLE_DIALYSATE_CHECK 1 // Disabled for Tom // Implement Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -re0cdf49eb0f54239e5d765282e0952cea7ded1bd -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision e0cdf49eb0f54239e5d765282e0952cea7ded1bd) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -51,8 +51,8 @@ #define MAX_START_STATE_TEMP_SENSORS_DIFF_C 3.0F ///< Max start state TDi and TRo difference tolerance in C. // Drain R1 & R2 states defines -#define DRAIN_PUMP_TARGET_RPM 2100 ///< Drain pump target RPM during drain. -#define RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ( 2* SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 initial drain time out in milliseconds. +#define DRAIN_PUMP_TARGET_RPM 2400 ///< Drain pump target RPM during drain. +#define RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 initial drain time out in milliseconds. #define DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 6 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. // Flush drain path state defines @@ -61,26 +61,26 @@ #define MAX_INLET_CONDUCTIVITY_US_PER_CM 2000.0F ///< Maximum water inlet conductivity in us/cm // Flush circulation path state defines -#define RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM 0.8F ///< 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.8F ///< RO pump target flow rate during flush/fill in L/min. #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 MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 50.0F ///< Maximum flush circulation temperature difference tolerance in C. TODO original difference was 3.0 degrees +#define FLUSH_CICRCULATION_WAIT_TIME_MS ( 30 * MS_PER_SECOND ) ///< Flush/rinse circulation path wait time in milliseconds. +#define MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C 3.0F ///< Maximum flush circulation temperature difference tolerance in C. #define NUM_OF_TEMP_SENSORS_TO_AVG 4.0F ///< Number of temperature sensors to average to check the difference. // Flush and drain R1 and R2 #define RSRVRS_FULL_VOL_ML 1680.0F ///< Reservoirs 1 & 2 full volume in mL. TODo original value was 1900 #define RSRVRS_PARTIAL_FILL_VOL_ML 500.0F ///< Reservoirs 1 & 2 partial volume in mL. #define RSRVRS_FULL_STABLE_TIME_COUNT ( ( 4 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Reservoirs 1 & 2 full stable time in counts. -#define RSRVRS_FILL_UP_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 full fill up timeout in ms. TODO original value was 5 mins +#define RSRVRS_FILL_UP_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 full fill up timeout in ms. #define RSRVRS_500ML_FILL_UP_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 partial fill up timeout in ms. #define RSRVRS_DRAIN_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 drain timeout in ms. // R1 to R2 & R2 to R1 chemical disinfect circulation -#define CHEM_DISINFECT_TARGET_RO_FLOW_LPM 0.9F ///< Chemical disinfect target RO flow rate in L/min. TODO original value was 0.8 +#define CHEM_DISINFECT_TARGET_RO_FLOW_LPM 0.8F ///< Chemical disinfect target RO flow rate in L/min. #define CHEM_DISINFECT_MAX_RO_PRESSURE_PSI 130 ///< Chemical disinfect maximum RO pressure in psi. #define CHEM_DISINFECT_TARGET_DRAIN_PRES_PSI 10.0 ///< Chemical disinfect target drain outlet pressure in psi. -#define CHEM_DISINFECT_TIME_MS ( 20 * SEC_PER_MIN * MS_PER_SECOND ) ///< Chemical disinfect time for each section in milliseconds. TODO original time was 10 minutes -#define CHEM_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ///< Chemical disinfect reaching to minimum temperature timeout in milliseconds. TODO figure out this timeout +#define CHEM_DISINFECT_TIME_MS ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Chemical disinfect time for each section in milliseconds. TODO original time was 36 minutes +#define CHEM_DISINFECT_START_TEMP_TIMOUT_MS ( 4 * MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ///< Chemical disinfect reaching to minimum temperature timeout in milliseconds. #define RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ( 0.5F * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 maximum volume out of range timeout during chemical disinfect. TODO change this to 5 seconds #define RSRVRS_MAX_TARGET_VOL_CHANGE_ML 600.0F ///< Reservoirs 1 & 2 maximum allowed volume change when full during chemical disinfect. TODO original value is 100 mL #define POST_CHEM_DISINFECT_WAIT_TIME_MS ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Chemical disinfect final wait time before flushing the system in milliseconds. @@ -95,10 +95,10 @@ #define MIN_RO_FLOW_FOR_CONC_PUMP_MIXING_LPM 0.3F ///< Minimum RO flow rate that is need to be able to turn on the concentrate pump for mixing. // Fill heat up -#define CHEM_DISINFECT_TARGET_TEMPERATURE_C 21.0F ///< Chemical disinfect target water temperature in C. +#define CHEM_DISINFECT_TARGET_TEMPERATURE_C 21.0F ///< Chemical disinfect target water temperature in C. // TODO this used to 30.0 // Post disinfect rinses -#define NUM_OF_POST_DISINFECT_RINSES 1 ///< Number of rinses after a chemical disinfect. +#define NUM_OF_POST_DISINFECT_RINSES 3 ///< Number of rinses after a chemical disinfect. static const F32 ACID_TO_WATER_MIXING_RATIO = ( 1.0F / 70.0F ); ///< Acid to water mixing ratio for chemical disinfect. @@ -126,7 +126,7 @@ static DG_CHEM_DISINFECT_STATE_T chemDisinfectState = DG_CHEM_DISINFECT_STATE_START; ///< Currently active chemical disinfect state. static DG_CHEM_DISINFECT_STATE_T prevChemDisinfectState = DG_CHEM_DISINFECT_STATE_START; ///< Previous active heat disinfect state before alarm. -static DG_CHEM_DISINFECT_UI_STATE_T chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; ///< Currently active chemical disinfect UI state. +static DG_CHEM_DISINFECT_UI_STATE_T chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; ///< Currently active chemical disinfect UI state. static U32 overallChemDisinfectTimer = 0; ///< Chemical disinfect cycle total timer. static U32 stateTimer = 0; ///< Chemical disinfect state timer to be used in different states. static U32 stateTrialCounter = 0; ///< Chemical disinfect state trial counter to be used for retries in different states. @@ -145,7 +145,7 @@ static CANCELLATION_MODE_T cancellationMode = CANCELLATION_MODE_NONE; ///< Cancellation mode. static U32 rsrvrFillStableTimeCounter = 0; ///< Reservoirs fill stable time counter. static ALARM_ID_T alarmDetectedPendingTrigger; ///< Chemical disinfect alarm to raise. -static U32 numberOfPostDisinfectRinses = NUM_OF_POST_DISINFECT_RINSES; ///< Number of times to rinse the fluid path after chemical disinfect. +static U32 numberOfPostDisinfectRinses; ///< Number of times to rinse the fluid path after chemical disinfect. static U32 primeAcidSteadyStateCounter = 0; ///< Prime acid steady state counter. static BOOL haveDrainParamsBeenInit; ///< Boolean flag to indicate whether the drain parameters have been reset or not. @@ -212,7 +212,7 @@ cancellationMode = CANCELLATION_MODE_NONE; rsrvrFillStableTimeCounter = 0; isPartialDisinfectInProgress = FALSE; - numberOfPostDisinfectRinses = NUM_OF_POST_DISINFECT_RINSES; + numberOfPostDisinfectRinses = 0; primeAcidSteadyStateCounter = 0; chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; haveDrainParamsBeenInit = FALSE; @@ -439,9 +439,6 @@ // Close VPi to prevent wasting water setValveState( VPI, VALVE_STATE_CLOSED ); - // Request a tare for reservoir 1 - //tareReservoir(); // TODO update the drain here - // Set the actuators to drain R1 setValveState( VRD1, VALVE_STATE_OPEN ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); @@ -497,8 +494,6 @@ setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - // TODO turn on the concentrate pumps - // Set the RO pump to run at full pressure setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); @@ -511,8 +506,8 @@ // Assume reservoir 2 is full and drain it rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; - // Request a tare for reservoir 2 - //tareReservoir(); // TODO update the reservoir drain + tareLoadCell( LOAD_CELL_RESERVOIR_1_PRIMARY ); + tareLoadCell( LOAD_CELL_RESERVOIR_1_BACKUP ); // Done with draining R1 setValveState( VRD1, VALVE_STATE_CLOSED ); @@ -567,18 +562,22 @@ } else { + tareLoadCell( LOAD_CELL_RESERVOIR_2_PRIMARY ); + tareLoadCell( LOAD_CELL_RESERVOIR_2_BACKUP ); + signalDrainPumpHardStop(); setValveState( VRD2, VALVE_STATE_CLOSED ); setValveState( VPI, VALVE_STATE_OPEN ); + stateTrialCounter = 0; - stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN; + stateTimer = getMSTimerCount(); + state = DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -604,15 +603,20 @@ // Check if flush time has elapsed if ( TRUE == didTimeout( stateTimer, FLUSH_DRAIN_WAIT_TIME_MS ) ) { +#ifndef DISABLE_DISINFECT_CONDUCTIVITY // If the inlet temperature and conductivity are in range, move onto the next state if ( ( getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ) > MIN_INLET_TEMPERATURE_C ) && ( getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ) <= MAX_INLET_CONDUCTIVITY_US_PER_CM ) ) +#else + if ( TRUE ) +#endif { setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLUSH_FILL_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); - stateTimer = getMSTimerCount(); + + stateTimer = getMSTimerCount(); stateTrialCounter = 0; - state = DG_CHEM_DISINFECT_STATE_FLUSH_CIRCULATION; + state = DG_CHEM_DISINFECT_STATE_FLUSH_CIRCULATION; } // If the number of failures have not exceeded the limit, try again. else if ( stateTrialCounter < MAX_ALLOWED_STATE_TRIALS ) @@ -624,8 +628,8 @@ else { alarmDetectedPendingTrigger = ALARM_ID_DG_CHEM_DISINFECT_INLET_COND_AND_TEMP_OUT; - prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + prevChemDisinfectState = state; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } } @@ -678,34 +682,44 @@ else { alarmDetectedPendingTrigger = ALARM_ID_DG_TEMP_SENSORS_DIFF_OUT_OF_RANGE; - prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + prevChemDisinfectState = state; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } } else { areTempSensorsInRange = TRUE; - stateTimer = getMSTimerCount(); - // TODO Turn on the concentrate pumps and wait for 30 seconds + stateTimer = getMSTimerCount(); + + // Set the concentrate pump to run at a constant speed during priming in reverse + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, -1.0F * CONC_PUMP_PRIME_SPEED_ML_PER_MIN ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, -1.0F * CONC_PUMP_PRIME_SPEED_ML_PER_MIN ); + + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); } } // Only start the concentrate pumps if the temperature sensors are in range - if ( TRUE == areTempSensorsInRange ) + if ( ( TRUE == areTempSensorsInRange ) && ( TRUE == didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) ) ) { - // TODO: enable the timeout once the concentrate pumps are available. - //if ( TRUE == didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) ) - if ( TRUE ) - { - rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; - rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; + rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; - setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); - setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); - setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); - stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_FLUSH_R1_AND_R2; - } + // Turn off the concentrate pumps + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + + // Turn on the bicarb line with forward direction, to dispense the chemical and mix + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONC_PUMP_PRIME_SPEED_ML_PER_MIN ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + + stateTimer = getMSTimerCount(); + state = DG_CHEM_DISINFECT_STATE_FLUSH_R1_AND_R2; } return state; @@ -739,9 +753,9 @@ // until reservoir 2 is filled up and the tubing might expand or leak. if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { - prevChemDisinfectState = state; + prevChemDisinfectState = state; alarmDetectedPendingTrigger = ALARM_ID_DG_INVALID_LOAD_CELL_VALUE; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } // Once R1 is full, keep monitoring for R2 level and timeout @@ -763,18 +777,18 @@ // Set both reservoirs status rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; - state = DG_CHEM_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; + state = DG_CHEM_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -813,7 +827,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } // First reservoir 2 must be completely full @@ -831,9 +845,9 @@ // sure the extra volume that is read is not because of previous water that is being drained currently and it is above 500 mL if ( ( volume > RSRVRS_PARTIAL_FILL_VOL_ML ) && ( 0 == drainPumpRPM ) ) { - prevChemDisinfectState = state; + prevChemDisinfectState = state; alarmDetectedPendingTrigger = ALARM_ID_DG_INVALID_LOAD_CELL_VALUE; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } // Once R2 is full, R1 must be partially full @@ -855,20 +869,20 @@ setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); // Start the timer for drain timeout - stateTimer = getMSTimerCount(); + stateTimer = getMSTimerCount(); rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; - state = DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN_R2; + state = DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN_R2; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -900,14 +914,14 @@ setValveState( VRD1, VALVE_STATE_OPEN ); setValveState( VRD2, VALVE_STATE_CLOSED ); // Start the timer for drain timeout - stateTimer = getMSTimerCount(); + stateTimer = getMSTimerCount(); rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - state = DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN_R1; + state = DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN_R1; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -943,16 +957,16 @@ setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONC_PUMP_PRIME_SPEED_ML_PER_MIN ); // The bicarb line is used to inject the acid into the fluid path during chemical disinfect - requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); // TODO why do we need to turn off CP2 while we are going to turn it on immediately? // Start the timer for drain timeout stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_PRIME_ACID_LINE; + state = DG_CHEM_DISINFECT_STATE_PRIME_ACID_LINE; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -978,13 +992,15 @@ // Set the chemical disinfect that is published on the UI chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_MIX_WATER_AND_ACID; +#ifndef DISABLE_DISINFECT_CONDUCTIVITY F32 cd2Conductivity = getConductivityValue( (U32)CONDUCTIVITYSENSORS_CD2_SENSOR ); if ( cd2Conductivity <= MIN_ACID_CONDUCTIVITY_US_PER_CM ) { primeAcidSteadyStateCounter = 0; } else +#endif { // Check if the acid conductivity value has been if ( ++primeAcidSteadyStateCounter >= PRIME_ACID_STEADY_CONDUCTIVITY_TIME_MS ) @@ -1011,15 +1027,14 @@ rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; - - state = DG_CHEM_DISINFECT_STATE_FILL_WITH_WATER_AND_DISINFECTANT; + state = DG_CHEM_DISINFECT_STATE_FILL_WITH_WATER_AND_DISINFECTANT; } } if ( TRUE == didTimeout( stateTimer, PRIME_ACID_LINE_TIMEOUT_MS ) ) { - // TODO transition to cancellation path prevChemDisinfectState = state; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -1057,6 +1072,8 @@ F32 acidCP2PumpFlowRate = ACID_TO_WATER_MIXING_RATIO * measuredROFlowRate * ML_PER_LITER; setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, acidCP2PumpFlowRate ); + + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); } // First reservoir 1 must be full @@ -1093,20 +1110,20 @@ R1ChemDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); R2ChemDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); - stateTimer = getMSTimerCount(); + stateTimer = getMSTimerCount(); rsrvrsVolMonitorTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_REMOVE_ACID_BOTTLE_FROM_UI; + state = DG_CHEM_DISINFECT_STATE_REMOVE_ACID_BOTTLE_FROM_UI; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -1132,6 +1149,7 @@ chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_REMOVE_ACID; // TODO fill up. We should wait for the user until the acid bottle is removed and it is confirmed by the user + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, -1.0F * CONC_PUMP_PRIME_SPEED_ML_PER_MIN ); state = DG_CHEM_DISINFECT_STATE_DISINFECT_R1_TO_R2; return state; @@ -1166,7 +1184,10 @@ break; case CHEM_DISINFECT_COMPLETE: - //TODO turn off CP1 and CP2 + + // Turn off the concentrate pumps + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + // Set the valves to transfer hot water from R1 to R2 and fill up R2. setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); setValveState( VRD1, VALVE_STATE_OPEN ); @@ -1177,8 +1198,8 @@ // to begin the transition of disinfectant water from R1 to R2. rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; - stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_FILL_R2_WITH_DISINFECTANT; + stateTimer = getMSTimerCount(); + state = DG_CHEM_DISINFECT_STATE_FILL_R2_WITH_DISINFECTANT; break; default: @@ -1221,8 +1242,6 @@ R1ChemDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); R2ChemDisinfectVol = getLoadCellLargeFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); - //TODO turn on CP1 and CP2 - state = DG_CHEM_DISINFECT_STATE_DISINFECT_R2_TO_R1; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) @@ -1265,7 +1284,6 @@ case CHEM_DISINFECT_COMPLETE: // Turn off the heaters - // TODO turn off CP1 and CP2 stopHeater( DG_PRIMARY_HEATER ); stateTimer = getMSTimerCount(); state = DG_CHEM_DISINFECT_STATE_COOL_DOWN_HEATERS; @@ -1306,8 +1324,9 @@ setValveState( VRD1, VALVE_STATE_OPEN ); rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R1; + state = DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R1; } } @@ -1342,14 +1361,15 @@ setValveState( VRD1, VALVE_STATE_CLOSED ); // Set the drain valve to reservoir 2 setValveState( VRD2, VALVE_STATE_OPEN ); + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; - stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R2; + stateTimer = getMSTimerCount(); + state = DG_CHEM_DISINFECT_STATE_DISINFECTANT_DRAIN_R2; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -1394,12 +1414,12 @@ rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2; + state = DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -1431,9 +1451,9 @@ // until reservoir 2 is filled up and the tubing might expand or leak. if ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) { - prevChemDisinfectState = state; + prevChemDisinfectState = state; alarmDetectedPendingTrigger = ALARM_ID_DG_INVALID_LOAD_CELL_VALUE; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_REACHED_TARGET == rsrvr1Status ) @@ -1451,19 +1471,19 @@ rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; - stateTimer = getMSTimerCount(); - state = DG_CHEM_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; + stateTimer = getMSTimerCount(); + state = DG_CHEM_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -1500,7 +1520,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } // First reservoir 2 must be completely full @@ -1518,9 +1538,9 @@ // sure the extra volume that is read is not because of previous water that is being drained currently and it is above 500 mL if ( ( volume > RSRVRS_PARTIAL_FILL_VOL_ML ) && ( 0 == drainPumpRPM ) ) { - prevChemDisinfectState = state; + prevChemDisinfectState = state; alarmDetectedPendingTrigger = ALARM_ID_DG_INVALID_LOAD_CELL_VALUE; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } // Once reservoir 2 is completely full, monitor reservoir 1 @@ -1542,19 +1562,19 @@ // Set the reservoir status rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; - state = DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2_AND_DRAIN_R2; - stateTimer = getMSTimerCount(); + state = DG_CHEM_DISINFECT_STATE_RINSE_R1_TO_R2_AND_DRAIN_R2; + stateTimer = getMSTimerCount(); } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -1592,7 +1612,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } // First reservoir 1 must be completely full @@ -1610,9 +1630,9 @@ // sure the extra volume that is read is not because of previous water that is being drained currently and it is above 500 mL if ( ( volume > RSRVRS_PARTIAL_FILL_VOL_ML ) && ( 0 == drainPumpRPM ) ) { - prevChemDisinfectState = state; + prevChemDisinfectState = state; alarmDetectedPendingTrigger = ALARM_ID_DG_INVALID_LOAD_CELL_VALUE; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } // Once reservoir 1 is completely full, monitor reservoir 2 @@ -1631,13 +1651,13 @@ // If the number of post chemical disinfect rinses have finished, // transition to drain R1 state. Otherwise, start the next rinse. - if ( ++numberOfPostDisinfectRinses > NUM_OF_POST_DISINFECT_RINSES ) + if ( ++numberOfPostDisinfectRinses >= NUM_OF_POST_DISINFECT_RINSES ) { // Set the reservoir status - rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; // This is last drain isThisLastDrain = TRUE; - state = DG_CHEM_DISINFECT_STATE_DRAIN_R2; + state = DG_CHEM_DISINFECT_STATE_DRAIN_R2; } else { @@ -1650,21 +1670,21 @@ rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; - state = DG_CHEM_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; + state = DG_CHEM_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1; } stateTimer = getMSTimerCount(); } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; } return state; @@ -1738,8 +1758,8 @@ deenergizeActuators(); cancellationMode = CANCELLATION_MODE_WATER; - rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; // The drain is set to start from reservoir 2 setValveState( VRD2, VALVE_STATE_OPEN ); @@ -1766,7 +1786,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } // If reservoir 2 has already been drained and reservoir 1 is empty, reset and switch to complete @@ -1783,7 +1803,7 @@ else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr1Status ) { prevChemDisinfectState = state; - state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH; } } @@ -1893,7 +1913,6 @@ static DG_RESERVOIR_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ) { DG_RESERVOIR_STATUS_T status = DG_RESERVOIR_ABOVE_TARGET; - BOOL isDrainComplete = hasTargetDrainVolumeBeenReached( r, drainSteadyStateTimeout ); // If the drain parameters of the reservoir is not initialized, initialize them if ( FALSE == haveDrainParamsBeenInit ) @@ -1902,6 +1921,8 @@ haveDrainParamsBeenInit = TRUE; } + BOOL isDrainComplete = hasTargetDrainVolumeBeenReached( r, drainSteadyStateTimeout ); + if ( TRUE == isDrainComplete ) { // Set the state timer in case it needs to be used for another timeout check @@ -1953,9 +1974,9 @@ // If the volume is out of range and it has timed out, exit else if ( TRUE == didTimeout( rsrvrsVolMonitorTimer, RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ) ) { - areRsrvrsLeaking = FALSE; + areRsrvrsLeaking = FALSE; alarmDetectedPendingTrigger = ALARM_ID_DG_RESERVOIR_LEAK_TIMEOUT; - status = CHEM_DISINFECT_RSRVRS_LEAK_TIMEOUT; + status = CHEM_DISINFECT_RSRVRS_LEAK_TIMEOUT; } } // Reservoirs are in range @@ -1975,8 +1996,8 @@ if ( TRUE == didTimeout( stateTimer, CHEM_DISINFECT_START_TEMP_TIMOUT_MS ) ) { // Heating up to minimum temperature for chemical disinfect failed - alarmDetectedPendingTrigger = ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_TIMEOUT; - status = CHEM_DISINFECT_HEAT_UP_TIMEOUT; + alarmDetectedPendingTrigger = ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_TIMEOUT; + status = CHEM_DISINFECT_HEAT_UP_TIMEOUT; } } else if ( ( isPartialDisinfectInProgress != TRUE ) && ( ThdTemp > CHEM_DISINFECT_TARGET_TEMPERATURE_C ) ) @@ -1990,7 +2011,7 @@ if ( ( TRUE == isPartialDisinfectInProgress ) && ( TRUE == didTimeout( chemDisinfectTimer, CHEM_DISINFECT_TIME_MS ) ) ) { // Done with this stage of chemical disnfect. Reset the variables - status = CHEM_DISINFECT_COMPLETE; + status = CHEM_DISINFECT_COMPLETE; isPartialDisinfectInProgress = FALSE; } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -re0cdf49eb0f54239e5d765282e0952cea7ded1bd -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision e0cdf49eb0f54239e5d765282e0952cea7ded1bd) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -29,6 +29,7 @@ #include "Pressures.h" #include "Reservoirs.h" #include "ROPump.h" +#include "Switches.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TemperatureSensors.h" @@ -247,10 +248,28 @@ *************************************************************************/ U32 transitionToHeatDisinfectMode( void ) { + DG_CMD_RESPONSE_T cmdResponse; + + cmdResponse.commandID = MSG_ID_DG_START_STOP_HEAT_DISINFECT; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + deenergizeActuators(); initHeatDisinfectMode(); +#ifndef DISABLE_CAP_SWITCHES + if ( ( STATE_CLOSED == getSwitchStatus( CONCENTRATE_CAP ) ) && ( STATE_CLOSED == getSwitchStatus( DIALYSATE_CAP ) ) ) + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : + REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); + stopDGHeatDisinfect(); + } + + sendCommandResponseMsg( &cmdResponse ); +#endif + return heatDisinfectState; } Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -81,7 +81,6 @@ #define FPGA_FLUIDLEAK_STATE_MASK 0x0004 ///< Bit mask for fluid leak detector. -#define FLUID_DOOR_SWITCH_MASK 0x08 ///< Fluid door switch bit mask. #define CONCENTRATE_CAP_SWITCH_MASK 0x10 ///< Concentrate cap switch bit mask #define DIALYSATE_CAP_SWITCH_MASK 0x20 ///< Dialysate cap switch bit mask.. #define FPGA_POWER_OUT_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< FPGA power out timeout in milliseconds. @@ -1908,19 +1907,6 @@ /*********************************************************************//** * @brief - * The getFPGAGFluidDoorStatus function gets the FPGA fluid door status - * bit. - * @details Inputs: fpgaSensorReadings - * @details Outputs: none - * @return fluid door status bit - *************************************************************************/ -U08 getFPGAGFluidDoorStatus( void ) -{ - return ( fpgaSensorReadings.fpgaGPIO & FLUID_DOOR_SWITCH_MASK ); -} - -/*********************************************************************//** - * @brief * The getFPGADialysateCapStatus function gets the FPGA dialysate cap status * bit. * @details Inputs: fpgaSensorReadings Index: firmware/App/Services/FPGA.h =================================================================== diff -u -r025612ad77fe630889a364586de54bffe5262d56 -r264d5853c97ab9550878609c9302e87464078734 --- firmware/App/Services/FPGA.h (.../FPGA.h) (revision 025612ad77fe630889a364586de54bffe5262d56) +++ firmware/App/Services/FPGA.h (.../FPGA.h) (revision 264d5853c97ab9550878609c9302e87464078734) @@ -139,7 +139,6 @@ U16 getFPGATimerCount( void ); -U08 getFPGAGFluidDoorStatus( void ); U08 getFPGADialysateCapStatus( void ); U08 getFPGAConcentrateCapStatus( void );