Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r9c3c817b09c3c7e0d9b23a397493f6fc16ca5d62 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 9c3c817b09c3c7e0d9b23a397493f6fc16ca5d62) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -113,12 +113,17 @@ { DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); - if ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT) != TRUE ) + if ( ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) || ( getPreviousOperationMode() != DG_MODE_FAUL ) ) { // re-initialize each time we transition to drain mode initDrainMode(); initDrainParameters( inactiveReservoir ); } + else + { + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); + } setCurrentSubState( NO_SUB_STATE ); Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r5109bb981cab2025fcb9de33e303d046085efa18 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 5109bb981cab2025fcb9de33e303d046085efa18) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -216,19 +216,84 @@ *************************************************************************/ U32 transitionToFillMode( void ) { - initFillMode(); - setCurrentSubState( NO_SUB_STATE ); - // Set initial actuator states - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + F32 targetFlowLPM = getTargetFillFlowRateLPM(); + if ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) + { + initFillMode(); + setCurrentSubState( NO_SUB_STATE ); + + // Set initial actuator states + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + } + else + { + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VPD, VALVE_STATE_OPEN_C_TO_NC ); + + switch( fillState ) + { + case DG_FILL_MODE_STATE_TEST_INLET_WATER: + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + break; + + case DG_FILL_MODE_STATE_PRIME_CONCENTRATE_LINES: + targetFlowLPM = RO_PUMP_800_ML_PER_MIN / MILLILITERS_PER_LITER; + concentratePrimingStartTime = getMSTimerCount(); + + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, CONCENTRATE_PUMP_MAX_SPEED ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONCENTRATE_PUMP_MAX_SPEED ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + break; + + case DG_FILL_MODE_STATE_FLUSH_BUBBLES: + case DG_FILL_MODE_STATE_TEST_BICARB_CONDUCTIVITY: + case DG_FILL_MODE_STATE_TEST_ACID_CONDUCTIVITY: + // For the above states, transition back to flush bubbles state + pumpSpeedIndex = 0; + targetFlowLPM = RO_PUMP_FLUSH_BUBBLES_FLOWS[ pumpSpeedIndex ] / MILLILITERS_PER_LITER; + flushBubblesStartTime = getMSTimerCount(); + fillState = DG_FILL_MODE_STATE_FLUSH_BUBBLES; + break; + + case DG_FILL_MODE_STATE_PRODUCE_DIALYSATE: + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + + // Do the necessary setup here before transition to Produce Dialysate State + fillStatus.isThisFirstFill = FALSE; + concentratePumpPrimeCount = 0; + break; + + case DG_FILL_MODE_STATE_DELIVER_DIALYSATE: + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); + + dialysateFillStartTime = getMSTimerCount(); + fillStatus.isThisFirstFill = FALSE; + break; + + case DG_FILL_MODE_STATE_PAUSED: + targetFlowLPM = TARGET_RO_FLOW_RATE_IN_PAUSE_L; + havePauseActuatorsBeenSet = FALSE; + break; + } + } + turnOnUVReactor( INLET_UV_REACTOR ); turnOnUVReactor( OUTLET_UV_REACTOR ); // NOTE: The target flow rate should be set prior to setting the start primary heater // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters - setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( targetFlowLPM, TARGET_RO_PRESSURE_PSI ); setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); @@ -853,7 +918,7 @@ DG_RESERVOIR_ID_T inactiveRsrvr = getInactiveReservoir(); F32 acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); - F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); + F32 inletTemperature = getTemperatureValue( TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); F32 cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); F32 cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); F32 rejRatio = RO_REJECTION_RATIO_OUT_OF_RANGE_VALUE; // default 1:1 before calculation in case can't divide by zero. Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r5109bb981cab2025fcb9de33e303d046085efa18 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 5109bb981cab2025fcb9de33e303d046085efa18) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -1370,6 +1370,7 @@ setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); // Turn on the drain pump to drain the reservoirs in open loop mode setDrainPumpTargetRPM( DRAIN_PUMP_RPM_IN_MIX_DRAIN ); + turnOnUVReactor( INLET_UV_REACTOR ); } else if ( TRUE == isDrainPumpInMixDrainOn ) { Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u -r5109bb981cab2025fcb9de33e303d046085efa18 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 5109bb981cab2025fcb9de33e303d046085efa18) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -1268,7 +1268,8 @@ } // Keep waiting until the TDi temperature is below the target temperature for the specified time - if ( TRUE == didTimeout( tempBelowTarget.tempBelowTargetStartTimeMS, RSRVR_ACTIVE_COOL_BELOW_TARGET_TEMP_TIMEOUT_MS ) ) + if ( ( TRUE == tempBelowTarget.hasTempTargetTimeBeenSet ) && + ( TRUE == didTimeout( tempBelowTarget.tempBelowTargetStartTimeMS, RSRVR_ACTIVE_COOL_BELOW_TARGET_TEMP_TIMEOUT_MS ) ) ) { stateStartTimeMS = getMSTimerCount(); tempBelowTarget.hasTempTargetTimeBeenSet = FALSE; Index: firmware/App/Modes/ModeROPermeateSample.c =================================================================== diff -u --- firmware/App/Modes/ModeROPermeateSample.c (revision 0) +++ firmware/App/Modes/ModeROPermeateSample.c (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -0,0 +1,191 @@ + +#include "ConcentratePumps.h" +#include "ConductivitySensors.h" +#include "CPLD.h" +#include "DrainPump.h" +#include "Heaters.h" +#include "LoadCell.h" +#include "MessageSupport.h" +#include "ModeFault.h" +#include "ModeHeatDisinfectActiveCool.h" +#include "ModeROPermeateSample.h" +#include "OperationModes.h" +#include "Pressures.h" +#include "Reservoirs.h" +#include "ROPump.h" +#include "RTC.h" +#include "Switches.h" +#include "TaskGeneral.h" +#include "TemperatureSensors.h" +#include "Timers.h" +#include "UVReactors.h" +#include "Valves.h" + + +/** + * @addtogroup DGROPermeateSampleMode + * @{ + */ + +// ********** private data ********** + +#define RO_PERMEATE_SAMPLE_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode RO permeate sample data publish interval in counts. +#define ACID_PUMP_SPEED_ML_PER_MIN 30.6F ///< Acid concentrate pump speed in mL/min. +// The acid pump is 2% faster than the acid pump to create a flow from acid to bicarb line during sampling +#define BICARB_PUMP_SPEED_ML_PER_MIN -30.0F ///< Bicarb concentrate pump speed in mL/min. +#define RSRVR_FILL_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoir fill timeout in milliseconds. +#define RSRVR_DRAIN_TIMEOUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoir drain timeout in milliseconds. +#define RSRVR_DRAIN_STEADY_TIMEOUT_MS ( 6 * MS_PER_SECOND ) ///< Reservoir drain steady timeout in milliseconds. +#define RSRVR_DRAIN_TARGET_RPM 2400 ///< Reservoir drain target RPM. +#define RSRVR_MIX_DRAIN_TIMEOUT_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 mix drain timeout in ms. + +static DG_RO_PERM_STATE_T roPermeateSampleState; ///< Mode RO permeate sample state. +static DG_RO_PERM_STATE_T roPermeateSamplePrevState; ///< Mode RO permeate sample previous state. +static U32 stateStartTimeMS; ///< Mode RO permeate sample state timer in milliseconds. +static U32 dataPublishCounter; ///< Mode RO permeate sample data publish counter. +static U32 overallROPermeateSampleTimer; ///< Mode RO permeate sample over mode timer. +static ALARM_ID_T alarmDetectedPendingTrigger; ///< Mode RO permeate sample pending alarm trigger. +static DIS_RSRVR_STATUS_T rsrvrsStatus; ///< Mode RO permeate sample reservoirs status. + +// ********** private function prototypes ********** + +/*********************************************************************//** + * @brief + * The initROPermeateSampleMode function initializes the RO permeate sample + * mode module. + * @details Inputs: none + * @details Outputs: TODO + * @return none + *************************************************************************/ +void initROPermeateSampleMode( void ) +{ + roPermeateSampleState = DG_RO_PERM_SAMPLE_STATE_START; + roPermeateSamplePrevState = DG_RO_PERM_SAMPLE_STATE_START; + stateStartTimeMS = getMSTimerCount(); + dataPublishCounter = 0; + overallROPermeateSampleTimer = getMSTimerCount(); + alarmDetectedPendingTrigger = ALARM_ID_NO_ALARM; + + // Initialize the reservoirs + rsrvrsStatus.rsrvrFillStableTime = 0; + rsrvrsStatus.rsrvrFillStableTimeoutMS = RSRVRS_FULL_STABLE_TIME_COUNT; + rsrvrsStatus.isThisInitialDrain = TRUE; + rsrvrsStatus.rsrvr[ DG_RESERVOIR_1 ].drainInit = FALSE; + rsrvrsStatus.rsrvr[ DG_RESERVOIR_1 ].loadCell = LOAD_CELL_RESERVOIR_1_PRIMARY; + rsrvrsStatus.rsrvr[ DG_RESERVOIR_1 ].rStatus = NUM_OF_DG_RESERVOIR_STATUS; + rsrvrsStatus.rsrvr[ DG_RESERVOIR_2 ].drainInit = FALSE; + rsrvrsStatus.rsrvr[ DG_RESERVOIR_2 ].loadCell = LOAD_CELL_RESERVOIR_2_PRIMARY; + rsrvrsStatus.rsrvr[ DG_RESERVOIR_2 ].rStatus = NUM_OF_DG_RESERVOIR_STATUS; +} + +/*********************************************************************//** + * @brief + * The transitionToROPermeateSampleMode function prepares for transition to + * RO permeate sample mode + * @details Inputs: none + * @details Outputs: none + * @return initial state + *************************************************************************/ +U32 transitionToROPermeateSampleMode( void ) +{ + deenergizeActuators( NO_PARK_CONC_PUMPS ); + + initROPermeateSampleMode(); + setCurrentSubState( NO_SUB_STATE ); + + return roPermeateSampleState; +} + +/*********************************************************************//** + * @brief + * The execROPermeateSampleMode function executes the RO permeate sample mode + * @details Inputs: roPermeateSampleState + * @details Outputs: roPermeateSampleState + * @return current state + *************************************************************************/ +U32 execROPermeateSampleMode( void ) +{ + switch ( roPermeateSampleState ) + { + case DG_RO_PERM_SAMPLE_STATE_START: + break; + + case DG_RO_PERM_SAMPLE_STATE_DRAIN_R1: + break; + + case DG_RO_PERM_SAMPLE_STATE_DRAIN_R2: + break; + + case DG_RO_PERM_SAMPLE_STATE_FLUSH_DRAIN: + break; + + case DG_RO_PERM_SAMPLE_STATE_FLUSH_DIALYSATE: + break; + + case DG_RO_PERM_SAMPLE_STATE_FLUSH_CONCENTRATE_STRAWS: + break; + + case DG_RO_PERM_SAMPLE_STATE_FLUSH_R2_TO_R1_AND_DRAIN_R1: + break; + + case DG_RO_PERM_SAMPLE_STATE_SAMPLE_COLLECTION: + break; + + case DG_RO_PERM_SAMPLE_STATE_CANCEL_BASIC_PATH: + break; + + case DG_RO_PERM_SAMPLE_STATE_CANCEL_WATER_PATH: + break; + + case DG_RO_PERM_SAMPLE_STATE_COMPLETE: + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_DG_RO_PERMEATE_SAMPLE_INVALID_EXEC_STATE, roPermeateSampleState ) + roPermeateSampleState = DG_RO_PERM_SAMPLE_STATE_START; + break; + } + + return roPermeateSampleState; +} + +/*********************************************************************//** + * @brief + * The getCurrentROPermeateSampleState function returns the current + * state of the RO permeate sample mode. + * @details Inputs: roPermeateSampleState + * @details Outputs: none + * @return the current state of RO permeate sample mode. + *************************************************************************/ +DG_RO_PERM_STATE_T getCurrentROPermeateSampleState( void ) +{ + return roPermeateSampleState; +} + +/*********************************************************************//** + * @brief + * The stopDGROPermeateSample function stops RO permeate sample mode + * @details Inputs: none + * @details Outputs: none + * @return TRUE if the mode was stopped successfully otherwise, FALSE + *************************************************************************/ +BOOL stopDGROPermeateSample( void ) +{ + BOOL status = FALSE; + + // Check if the current operation mode is RO permeate sample mode + if ( DG_MODE_ROPS == getCurrentOperationMode() ) + { + // Reset all the actuators + deenergizeActuators( PARK_CONC_PUMPS ); + + // Transition to mode standby + requestNewOperationMode( DG_MODE_STAN ); + + status = TRUE; + } + + return status; +} + +/**@}*/ Index: firmware/App/Modes/ModeROPermeateSample.h =================================================================== diff -u --- firmware/App/Modes/ModeROPermeateSample.h (revision 0) +++ firmware/App/Modes/ModeROPermeateSample.h (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -0,0 +1,29 @@ + + +#ifndef __MODE_ROPERMEATESAMPLE_H__ +#define __MODE_ROPERMEATESAMPLE_H__ + +#include "DGCommon.h" +#include "DGDefs.h" + +/** + * @defgroup DGROPermeateSampleMode DGROPermeateSampleMode + * @brief RO permeate sample mode module. Manages RO permeate sample mode function via a state machine. + * + * @addtogroup DGROPermeateSampleMode + * @{ + */ + +// ********** public definitions ********** + +void initROPermeateSampleMode( void ); +U32 transitionToROPermeateSampleMode( void ); +U32 execROPermeateSampleMode( void ); + +DG_RO_PERM_STATE_T getCurrentROPermeateSampleState( void ); + +BOOL stopDGROPermeateSample( void ); + +/**@}*/ + +#endif Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rc4f3105da2ed8a7c40950588b54b79067185a3ad -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision c4f3105da2ed8a7c40950588b54b79067185a3ad) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -66,6 +66,7 @@ static BOOL pendingStartDGChemicalDisinfectRequest; ///< Flag indicating HD has requested DG start chemical disinfect. static BOOL pendingStartDGHeatDisinfectActiveCoolRequest; ///< Flag indicating HD has requested DG start heat disinfect active cool. static BOOL pendingStartDGChemicalDisinfectFlushRequest; ///< Flag indicating HD has requested DG start chemical disinfect flush. +static BOOL pendingStartDGROPermeateSampleRequest; ///< Flag indicating HD has requested DG start RO permeate sample. static OVERRIDE_U32_T filterFlushTimePeriod = { FILTER_FLUSH_TIME_MS, FILTER_FLUSH_TIME_MS, 0, 0 }; ///< Filter flush time period in ms. @@ -87,7 +88,8 @@ * @details Outputs: standbyState, stopSampleWaterRequest, startSampleWaterRequest, * flushFilterRequest, endSampleWaterRequest, waterSampleStartTime, * filterFlushStartTime, filterFlushPublishTimerCounter, pendingStartDGRequest, - * pendingStartDGHeatDisinfectActiveCoolRequest + * pendingStartDGHeatDisinfectActiveCoolRequest, + * pendingStartDGROPermeateSampleRequest * @return none *************************************************************************/ void initStandbyMode( void ) @@ -105,6 +107,7 @@ pendingStartDGHeatDisinfectRequest = FALSE; pendingStartDGChemicalDisinfectRequest = FALSE; pendingStartDGHeatDisinfectActiveCoolRequest = FALSE; + pendingStartDGROPermeateSampleRequest = FALSE; // Reset the heaters efficiency for another treatment resetHeatersEstimationGain(); @@ -282,6 +285,11 @@ pendingStartDGChemicalDisinfectFlushRequest = FALSE; requestNewOperationMode( DG_MODE_CHFL ); } + else if ( TRUE == pendingStartDGROPermeateSampleRequest ) + { + pendingStartDGROPermeateSampleRequest = FALSE; + requestNewOperationMode( DG_MODE_ROPS ); + } return state; } @@ -768,6 +776,59 @@ /*********************************************************************//** * @brief + * The startDGROPermeateSample function starts RO permeate sample mode. + * @details Inputs: standbyState + * @details Outputs: pendingStartDGChemicalDisinfectFlushRequest + * @return: TRUE if the switch was successful + *************************************************************************/ +BOOL startDGROPermeateSample( void ) +{ + BOOL status = FALSE; + DG_CMD_RESPONSE_T cmdResponse; + + cmdResponse.commandID = DG_CMD_START_RO_PERMEATE_SAMPLE; + cmdResponse.rejected = FALSE; + cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; + + // If DG is in standby mode and the standby mode is in Idle, request RO permeate sample + if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) ) + { + OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); + OPN_CLS_STATE_T diaCap = getSwitchStatus( DIALYSATE_CAP ); + +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_CAPS_MONITOR ) ) + { + concCap = STATE_CLOSED; + diaCap = STATE_CLOSED; + } +#endif + + if ( ( STATE_OPEN == concCap ) || ( STATE_OPEN == diaCap ) ) + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : + REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); + } + else + { + pendingStartDGROPermeateSampleRequest = TRUE; + status = TRUE; + } + } + else + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_NOT_IN_STANDBY_IDLE_STATE; + } + + sendCommandResponseMsg( &cmdResponse ); + + return status; +} + +/*********************************************************************//** + * @brief * The getCurrentStandbyState function returns the current state of standby mode. * @details Inputs: standbyState * @details Outputs: none Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -rc230be1bd4296324bf5dfc288c212eb7c2ce5d2d -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision c230be1bd4296324bf5dfc288c212eb7c2ce5d2d) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -58,6 +58,8 @@ BOOL startDGChemicalDisinfect( void ); // HD start chemical disinfect mode BOOL startDGChemicalDisinfectFlush( void ); // HD start chemical disinfect flush mode +BOOL startDGROPermeateSample( void ); // HD start RO permeate sample + /**@}*/ #endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r9c3c817b09c3c7e0d9b23a397493f6fc16ca5d62 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 9c3c817b09c3c7e0d9b23a397493f6fc16ca5d62) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -28,6 +28,7 @@ #include "ModeHeatDisinfect.h" #include "ModeHeatDisinfectActiveCool.h" #include "ModeInitPOST.h" +#include "ModeROPermeateSample.h" #include "ModeService.h" #include "ModeSolo.h" #include "ModeStandby.h" @@ -62,20 +63,21 @@ /// This matrix determines legal transitions from one mode to another. static const DG_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_DG_MODES - 1 ][ NUM_OF_DG_MODES - 1 ] = { - // from to-> FAULT SERVICE INIT STANBY STBY-SOLO GEN-IDLE FILL DRAIN FLUSH HEAT DIS CHEM DIS CHEM_FLUSH HEAT_COOL - /* FAUL */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* SERV */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* INIT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* STAN */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_HCOL }, - /* SOLO */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL }, - /* GENE */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* FILL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* DRAI */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* FLUS */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* HEAT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL }, - /* CHEM */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_NLEG }, - /* CHFL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_NLEG }, - /* HCOL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL }, + // from to-> FAULT SERVICE INIT STANBY STBY-SOLO GEN-IDLE FILL DRAIN FLUSH HEAT DIS CHEM DIS CHEM_FLUSH HEAT_COOL RO_PER_SAMPLE + /* FAUL */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* SERV */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* INIT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* STAN */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_HCOL, DG_MODE_ROPS }, + /* SOLO */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL, DG_MODE_ROPS }, + /* GENE */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* FILL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* DRAI */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* FLUS */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* HEAT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL, DG_MODE_NLEG }, + /* CHEM */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_NLEG, DG_MODE_NLEG }, + /* CHFL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_NLEG, DG_MODE_NLEG }, + /* HCOL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL, DG_MODE_NLEG }, + /* ROPS */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_ROPS }, }; // ********** private function prototypes ********** @@ -127,6 +129,7 @@ initChemicalDisinfectMode(); initHeatDisinfectActiveCoolMode(); initChemicalDisinfectFlushMode(); + initROPermeateSampleMode(); } /*********************************************************************//** @@ -139,14 +142,20 @@ void execOperationModes( void ) { DG_OP_MODE_T newMode; - U32 priorSubMode = currentSubMode; - U32 priorOpMode = currentMode; + U32 priorSubMode = currentSubMode; + U32 priorOpMode = currentMode; U32 priorSubState = currentSubState; // any new mode requests? newMode = arbitrateModeRequest(); // will return current mode if no pending requests - newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; + if ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) + { + // If the test configuration is not enabled check for the legality of the transition request + newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; + } + // TODO a check to stop this transaction if we are not in treatment + // is requested new mode valid and legal at this time? if ( newMode >= DG_MODE_NLEG ) { @@ -218,6 +227,10 @@ currentSubMode = execChemicalDisinfectFlushMode(); break; + case DG_MODE_ROPS: + currentSubMode = execROPermeateSampleMode(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, (U32)currentMode ) currentMode = DG_MODE_FAUL; @@ -314,11 +327,6 @@ modeRequest[i] = FALSE; } - if ( TRUE == getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) ) - { - reqMode = currentMode; - } - // un-block requests _enable_IRQ(); @@ -382,6 +390,9 @@ case DG_MODE_CHFL: currentSubMode = transitionToChemicalDisinfectFlushMode(); break; + case DG_MODE_ROPS: + currentSubMode = transitionToROPermeateSampleMode(); + break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, (U32)newMode ) break; Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -rc4f3105da2ed8a7c40950588b54b79067185a3ad -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision c4f3105da2ed8a7c40950588b54b79067185a3ad) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -150,6 +150,7 @@ SW_FAULT_ID_DG_INVALID_RO_PUMP_DUTY_CYCLE_SELECTED, SW_FAULT_ID_DG_INVALID_TEST_CONFIG_SELECTED, // 120 SW_FAULT_ID_DG_INVALID_COND_SNSNR_CAL_TABLE_SELECTED, + SW_FAULT_ID_DG_RO_PERMEATE_SAMPLE_INVALID_EXEC_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -ref511196d29f6b0de6ade9ea113d91164d938c88 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision ef511196d29f6b0de6ade9ea113d91164d938c88) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -937,12 +937,16 @@ handleResendAllAlarmsCommand( message ); break; + case MSG_ID_UI_SET_DG_RO_MODE: + handleSetROOnlyMode( message ); + break; + case MSG_ID_HD_SEND_CHEM_FLUSH_SAMPLE_PASS_FAIL_TO_DG: handleReceiveChemFlushSampleResultsFromHD( message ); break; - case MSG_ID_UI_SET_DG_RO_MODE: - handleSetROOnlyMode( message ); + case MSG_ID_DG_START_STOP_RO_PERMEATE_SAMPLE_MODE_CMD_REQUEST: + handleStartStopDGROPermeateSample( message ); break; // NOTE: This case must be last Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ref511196d29f6b0de6ade9ea113d91164d938c88 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ef511196d29f6b0de6ade9ea113d91164d938c88) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -36,6 +36,7 @@ #include "ModeHeatDisinfect.h" #include "ModeHeatDisinfectActiveCool.h" #include "ModeInitPOST.h" +#include "ModeROPermeateSample.h" #include "ModeStandby.h" #include "MsgQueues.h" #include "NVDataMgmt.h" @@ -1606,7 +1607,7 @@ } // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer - serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_2_HD, ACK_REQUIRED ); + serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_REQUIRED ); } /*********************************************************************//** @@ -1789,7 +1790,39 @@ serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_2_UI, ACK_REQUIRED ); } +/************************************************************************* + * @brief + * The handleStartStopDGROPermeateSample function handles a request to + * start or stop DG RO permeate sample mode. + * @details Inputs: none + * @details Outputs: message handled + * @param message: a pointer to the message to handle + * @return result + *************************************************************************/ +void handleStartStopDGROPermeateSample( MESSAGE_T* message ) +{ + BOOL status = FALSE; + if ( message->hdr.payloadLen == sizeof(U32) ) + { + BOOL startingDGROPermeateSample; + + memcpy( &startingDGROPermeateSample, message->payload, sizeof(U32) ); + + if ( TRUE == startingDGROPermeateSample ) + { + status = startDGROPermeateSample(); + } + else + { + status = stopDGROPermeateSample(); + } + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, status ); +} + + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** @@ -4754,7 +4787,7 @@ { BOOL status = FALSE; - if ( 0 == sizeof( message->hdr.payloadLen ) ) + if ( 0 == message->hdr.payloadLen ) { status = TRUE; Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -ref511196d29f6b0de6ade9ea113d91164d938c88 -r992975fb3cd56ddd7567b5e27f8bebd9b9948e9d --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ef511196d29f6b0de6ade9ea113d91164d938c88) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 992975fb3cd56ddd7567b5e27f8bebd9b9948e9d) @@ -182,6 +182,9 @@ // MSG_ID_DG_REQUEST_RO_MODE_ONLY_STATUS void requestROOnlyModeStatusFromUI( void ); +// MSG_ID_DG_START_STOP_RO_PERMEATE_SAMPLE_MODE_CMD_REQUEST +void handleStartStopDGROPermeateSample( MESSAGE_T* message ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN