#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; } /**@}*/