Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -r9e5ee62245eb2a73b167eabd6c274a71a76a7b0e -r72bca5d2e489fa253f3bdfdb254261a32c7a0c19 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 9e5ee62245eb2a73b167eabd6c274a71a76a7b0e) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 72bca5d2e489fa253f3bdfdb254261a32c7a0c19) @@ -25,6 +25,7 @@ #include "MessageSupport.h" #include "ModeChemicalDisinfect.h" #include "ModeFault.h" +#include "ModeHeatDisinfect.h" #include "ModeStandby.h" #include "NVDataMgmt.h" #include "OperationModes.h" @@ -178,6 +179,10 @@ static DISINFECT_NV_OPS_T disinfectNVOps; ///< Disinfect non-volatile memory operations. static BOOL haveDrainParamsBeenInit[ NUM_OF_DG_RESERVOIRS ]; ///< Boolean flag to indicate whether the drain parameters have been reset or not. +#ifndef _RELEASE_ +static NELSON_SUPPORT_T nelsonSupport; ///< Nelson support. +#endif + // ********** private function prototypes ********** static DG_CHEM_DISINFECT_STATE_T handleChemicalDisinfectStartState( void ); @@ -207,6 +212,10 @@ static void monitorModeChemicalDisinfect( void ); static void writeDisinfectDataToNV( DG_USAGE_INFO_ITEMS_T info ); +#ifndef _RELEASE_ +static void setNelsonSupportConditions( void ); +#endif + /*********************************************************************//** * @brief * The initChemicalDisinfectMode function initializes the chemical @@ -268,6 +277,12 @@ R2FullVolume = 0.0F; disinfectantMixRatio = 0.0F; +#ifndef _RELEASE_ + nelsonSupport = NELSON_NONE; + + setNelsonSupportConditions(); +#endif + initPersistentAlarm( ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_OUT_OF_RANGE, DISINFECT_TEMP_OUT_OF_RANGE_TIMEOUT_MS, DISINFECT_TEMP_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DG_CHEM_DISINFECT_TARGET_COND_OUT_OF_RANGE, DISINFECT_COND_OUT_OF_RANGE_TIMEOUT_MS, DISINFECT_COND_OUT_OF_RANGE_TIMEOUT_MS ); } @@ -289,7 +304,12 @@ setCPLDCleanLEDColor( CPLD_CLEAN_LED_YELLOW ); - activateAlarmNoData( ALARM_ID_DG_CHEM_DISINFECT_INSERT_ACID ); +#ifndef _RELEASE_ + if ( nelsonSupport != NELSON_POS_CONTROL_CHEM_DISINFECT ) +#endif + { + activateAlarmNoData( ALARM_ID_DG_CHEM_DISINFECT_INSERT_ACID ); + } return chemDisinfectState; } @@ -726,7 +746,8 @@ handleDisinfectantMixing( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER, disinfectantMixRatio ); #ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DISINFECT_CONDUCTIVITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) + if ( ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DISINFECT_CONDUCTIVITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) || + ( nelsonSupport != NELSON_POS_CONTROL_CHEM_DISINFECT ) ) #endif { if ( cd2Conductivity < MIN_PRIME_ACID_CONDUCTIVITY_US_PER_CM ) @@ -1061,6 +1082,14 @@ chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_FLUSH_AFTER_DISINFECT; stateTimer = getMSTimerCount(); state = DG_CHEM_DISINFECT_STATE_DRAIN_R1; + +#ifndef _RELEASE_ + if ( ( NELSON_POS_CONTROL_CHEM_DISINFECT == nelsonSupport ) || ( NELSON_CHEM_DISINFECT == nelsonSupport ) ) + { + deenergizeActuators( NO_PARK_CONC_PUMPS ); + state = DG_CHEM_DISINFECT_STATE_COMPLETE; + } +#endif } else { @@ -1238,7 +1267,17 @@ chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_COMPLETE; - requestNewOperationMode( DG_MODE_CHFL ); +#ifndef _RELEASE_ + if ( nelsonSupport != NELSON_NONE ) + { + nelsonSupport = NELSON_NONE; + requestNewOperationMode( DG_MODE_STAN ); + } + else +#endif + { + requestNewOperationMode( DG_MODE_CHFL ); + } return state; } @@ -1259,6 +1298,11 @@ { SET_ALARM_WITH_1_U32_DATA( alarmDetectedPendingTrigger, prevChemDisinfectState ) } + +#ifndef _RELEASE_ + nelsonSupport = NELSON_NONE; +#endif + requestNewOperationMode( DG_MODE_FAUL ); } @@ -1558,6 +1602,7 @@ data.overallElapsedTime = calcTimeSince( overallChemDisinfectTimer ); data.stateElapsedTime = calcTimeSince( stateTimer ); data.cancellationMode = (U32)cancellationMode; + data.nelsonSupportMode = (U32)nelsonSupport; //If the mode is in the actual chemical disinfect states, publish the elapsed time, otherwise publish 0 to avoid confusion if ( chemDisinfectState > DG_CHEM_DISINFECT_STATE_FLUSH_DRAIN ) @@ -1569,9 +1614,9 @@ } else { - uiData.chemDisinfectCountdownTime = 0.0; - data.R1FillLevel = 0.0; - data.R2FillLevel = 0.0; + uiData.chemDisinfectCountdownTime = 0.0F; + data.R1FillLevel = 0.0F; + data.R2FillLevel = 0.0F; } data.chemDisinfectUIState = chemDisinfectUIState; @@ -1696,4 +1741,58 @@ } } +// ********** Nelson Support Functions ********** + +#ifndef _RELEASE_ +/*********************************************************************//** + * @brief + * The setNelsonSupportConditions function sets the disinfect variables for + * Nelson support. + * @details Inputs: nelsonSupport + * @details Outputs: chemDisinfectState, flushCircWaitTime, stateTimer + * @return: none + *************************************************************************/ +static void setNelsonSupportConditions( void ) +{ + F32 temperature = 0.0F; + + switch ( nelsonSupport ) + { + case NELSON_POS_CONTROL_CHEM_DISINFECT: + case NELSON_CHEM_DISINFECT: + // The target temperature is set to low so the heater will turn on but it will not heat because + // we are very close to the target. Set the stop temperature to a temperature lower by a couple degrees + // make sure the timer will continuously count against the disinfection time to inoculate. + // NOTE: this is not part of the commercial code so no #defines + temperature = 20.0F; + + // Set the valves to start flush circulation + setValveState( VPI, VALVE_STATE_CLOSED ); + setValveState( VBF, VALVE_STATE_CLOSED ); + setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRD1, VALVE_STATE_CLOSED ); + setValveState( VRD2, VALVE_STATE_CLOSED ); + setROPumpTargetFlowRateLPM( RO_PUMP_TARGET_FLUSH_FLOW_RATE_LPM, MAX_RO_PUMP_FLUSH_FILL_PRESSURE_PSI ); + setHeaterTargetTemperature( DG_PRIMARY_HEATER, temperature ); + startHeater( DG_PRIMARY_HEATER ); + turnOnUVReactor( INLET_UV_REACTOR ); + turnOnUVReactor( OUTLET_UV_REACTOR ); + flushCircWaitTime = FLUSH_CICRCULATION_INITIAL_WAIT_TIME_MS; + stateTimer = getMSTimerCount(); + chemDisinfectState = DG_CHEM_DISINFECT_STATE_FLUSH_CIRCULATION; + break; + + case NELSON_NONE: + default: + break; + } +} +#endif + /**@}*/