########################################################################### # # Copyright (c) 2021-2024 Diality Inc. - All Rights Reserved. # # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file fp_defs.py # # @author (last) Zoltan Miskolci # @date (last) 29-Jan-2026 # @author (original) Peter Lucia # @date (original) 22-Jun-2021 # ############################################################################ from enum import unique from .dd_defs import dd_enum_repository from ..utils.base import DialinEnum # ================================================== Constants ================================================== BETA_IOFP_COND_SENSOR_OFFSET = dd_enum_repository.DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware DD Conductivity Sensors enum BETA_IOFP_PRES_SENSOR_OFFSET = dd_enum_repository.DDPressureSensorNames.NUM_OF_PRESSURE_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware DD Pressure Sensors enum BETA_IOFP_VALVE_OFFSET = dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value # Offset to translate Dialin FPValveNames to DD firmware DD_Valves # ================================================== Enum Creators: Operations ================================================== @unique class FPOpModes(DialinEnum): MODE_FAUL = 0 # Fault mode MODE_SERV = 1 # Service mode MODE_INIT = 2 # Initialization & POST mode MODE_STAN = 3 # Standby mode MODE_PRE_GENP = 4 # Pre Generate Permeate mode MODE_GENP = 5 # Generate Permeate mode MODE_DPGP = 6 # Defeatured Pre-Generate Permeate mode MODE_DEGP = 7 # Defeatured Generate Permeate mode MODE_NLEG = 8 # Not legal - an illegal mode transition occurred NUM_OF_FP_MODES = 9 # Number of TD operation modes FPOpModes._str_list = { # Official Name : Accepted strings 'MODE_FAUL': ['fault'], 'MODE_SERV': ['service'], 'MODE_INIT': ['initialization'], 'MODE_STAN': ['standby'], 'MODE_PRE_GENP': ['pre-gen', 'pre-generate', 'pre-generate permeate'], 'MODE_GENP': ['generate permeate'], 'MODE_DPGP': ['defeatured pre-generate permeate', 'defeatured pre-gen'], 'MODE_DEGP': ['defeatured generate permeate'], 'MODE_NLEG': ['not legal'], 'NUM_OF_FP_MODES': [] } @unique class FPFaultStates(DialinEnum): FP_FAULT_STATE_START = 0 # FP Fault Start State FP_FAULT_DEENERGIZED_STATE = 1 # FP Fault De-energized State FP_FAULT_ENERGIZED_STATE = 2 # FP Fault Energized State NUM_OF_FP_FAULT_STATES = 3 # Number of Fault Mode State FPFaultStates._str_list = { # Official Name : Accepted strings 'FP_FAULT_STATE_START': ['fault start'], 'FP_FAULT_DEENERGIZED_STATE': ['fault deenergized', 'deenergized'], 'FP_FAULT_ENERGIZED_STATE': ['fault energized', 'energized'], 'NUM_OF_FP_FAULT_STATES': [], } @unique class FPServiceStates(DialinEnum): NUM_OF_FP_SERV_STATES = 0 # Number of FP service states FPServiceStates._str_list = { # Official Name : Accepted strings 'NUM_OF_FP_SERV_STATES': [], } @unique class FPPostStates(DialinEnum): FP_POST_STATE_START = 0 # Start initialize & POST mode state FP_POST_STATE_FW_INTEGRITY = 1 # Run firmware integrity test state FP_POST_STATE_NVDATAMGMT = 2 # Run NV Data Mgmt. test state FP_POST_STATE_WATCHDOG = 3 # Run watchdog test state FP_POST_STATE_SAFETY_SHUTDOWN = 4 # Run safety shutdown test state FP_POST_STATE_TEMPERATURES = 5 # Run temperatures POST state FP_POST_STATE_FW_COMPATIBILITY = 6 # Run firmware compatibility test state FP_POST_STATE_FPGA = 7 # Run FPGA test state FP_POST_STATE_COMPLETED = 8 # POST self-tests completed state FP_POST_STATE_FAILED = 9 # POST self-tests failed state NUM_OF_FP_POST_STATES = 10 # Number of initialize & POST mode states FPPostStates._str_list = { # Official Name : Accepted strings 'FP_POST_STATE_START': ['start'], 'FP_POST_STATE_FW_INTEGRITY': ['fw integrity'], 'FP_POST_STATE_NVDATAMGMT': ['nv data management', 'data management'], 'FP_POST_STATE_WATCHDOG': ['watchdog'], 'FP_POST_STATE_SAFETY_SHUTDOWN': ['safety shutdown'], 'FP_POST_STATE_TEMPERATURES': ['temperatures', 'temperatures check'], 'FP_POST_STATE_FW_COMPATIBILITY': ['fw compatibility'], 'FP_POST_STATE_FPGA': ['fpga'], 'FP_POST_STATE_COMPLETED': ['completed'], 'FP_POST_STATE_FAILED': ['failed'], 'NUM_OF_FP_POST_STATES': [] } @unique class FPStandbyStates(DialinEnum): FP_STANDBY_MODE_STATE_IDLE = 0 # Idle standby mode state NUM_OF_FP_STANDBY_MODE_STATES = 1 # Number of standby mode states FPStandbyStates._str_list = { # Official Name : Accepted strings 'FP_STANDBY_MODE_STATE_IDLE': ['idle'], 'NUM_OF_FP_STANDBY_MODE_STATES': [], } @unique class FPPreGenPermeateStates(DialinEnum): FP_PRE_GENP_INLET_PRES_CHECK = 0 # FP Pre Gen Permeate Inlet Pressure Check State FP_PRE_GENP_FILTER_FLUSH = 1 # FP Pre Gen Permeate Filter Flush State FP_PRE_GENP_PERMEATE_FLUSH = 2 # FP Pre Gen Permeate Permeate Flush State FP_PRE_GENP_CONCENTRATE_FLUSH = 3 # FP Pre Gen Permeate Concentrate Flush State FP_PRE_GENP_VERIFY_WATER = 4 # FP Pre Gen Permeate Verify Water State FP_PRE_GENP_PAUSED = 5 # FP Pre Gen Permeate Paused State NUM_OF_FP_PRE_GENP_MODE_STATES = 7 # Number of Pre-Gen Permeate mode states FPPreGenPermeateStates._str_list = { # Official Name : Accepted strings 'FP_PRE_GENP_INLET_PRES_CHECK': ['inlet pressure check', 'pressure check'], 'FP_PRE_GENP_FILTER_FLUSH': ['filter flush'], 'FP_PRE_GENP_PERMEATE_FLUSH': ['permeate flush'], 'FP_PRE_GENP_CONCENTRATE_FLUSH': ['concentrate flush'], 'FP_PRE_GENP_VERIFY_WATER': ['verify water'], 'FP_PRE_GENP_PAUSED': ['paused'], 'NUM_OF_FP_PRE_GENP_MODE_STATES': [], } @unique class FPPreGenPDefStates(DialinEnum): FP_PRE_GENP_DEF_FLUSH = 0 # Pre Gen Permeate Defeatured Flush state FP_PRE_GENP_DEF_INLET_WATER_CHECK = 1 # Pre Gen Permeate Defeatured Inlet Water Check state FP_PRE_GENP_DEF_PAUSED = 2 # Defeatured Pre Gen Permeate Paused state NUM_OF_FP_PRE_GENP_DEF_MODE_STATES = 3 # Number of Defeatured Pre Gen Permeate states FPPreGenPDefStates._str_list = { # Official Name : Accepted strings 'FP_PRE_GENP_DEF_FLUSH': ['flush', 'defeatured flush', 'def flush'], 'FP_PRE_GENP_DEF_INLET_WATER_CHECK': ['inlet water check', 'def inlet water check', 'defeatured inlet water check'], 'FP_PRE_GENP_DEF_PAUSED': ['paused', 'defeatured paused', 'def paused'], 'NUM_OF_FP_PRE_GENP_DEF_MODE_STATES': [], } @unique class FPGenPermeateStates(DialinEnum): FP_GENP_TANK_FILL_STATE = 0 # Gen Permeate Tank Fill low state FP_GENP_TANK_FULL_STATE = 1 # Gen Permeate Tank Full state NUM_OF_FP_GENP_MODE_STATES = 2 # Number of Gen permeate states FPGenPermeateStates._str_list = { # Official Name : Accepted strings 'FP_GENP_TANK_FILL_STATE': ['fill', 'tank fill'], 'FP_GENP_TANK_FULL_STATE': ['full', 'tank full'], 'NUM_OF_FP_GENP_MODE_STATES': [], } @unique class FPGenPermeateDefStates(DialinEnum): FP_GENP_DEF_SUPPLY_WATER = 0 # Gen Permeate Defeatured Supply Water statee FP_GENP_DEF_PAUSED = 1 # Gen Permeate Defeatured Paused state NUM_OF_FP_GENP_DEF_MODE_STATES = 2 # Number of Defeatured Gen permeate states FPGenPermeateDefStates._str_list = { # Official Name : Accepted strings 'FP_GENP_DEF_SUPPLY_WATER': ['supply water', 'def supply water', 'defeatured supply water'], 'FP_GENP_DEF_PAUSED': ['paused', 'def paused', 'defeatured paused'], 'NUM_OF_FP_GENP_DEF_MODE_STATES': [], } @unique class FPNotLegalStates(DialinEnum): NUM_OF_NOT_LEGAL_STATES = 0 # Number of Not Legal states FPNotLegalStates._str_list = { # Official Name : Accepted strings 'NUM_OF_NOT_LEGAL_STATES': [], } # ================================================== Enum Creators: Events ================================================== @unique class FPEventList(DialinEnum): FP_EVENT_STARTUP = 0 # FP startup event FP_EVENT_OP_MODE_CHANGE = 1 # FP Op mode change event FP_EVENT_SUB_MODE_CHANGE = 2 # FP Op sub-mode change event FP_EVENT_PRE_GEN_RO_SET_PWM = 3 # FP gen permeate ro set pwm event FP_EVENT_GENP_BOOST_SET_PWM = 4 # FP gen permeate boost set pwm event FP_EVENT_GENP_CHANGE = 5 # FP gen permeate state change FP_EVENT_PRE_GEN_CHANGE = 6 # FP pre gen state change FP_EVENT_PRE_GEN_DEF_CHANGE = 7 # FP defeatured pre gen state change FP_EVENT_GENP_DEF_CHANGE = 8 # FP defeatured gen permeate state change FP_EVENT_FAULT_ALARM_TRIGGER = 9 # FP event for alarms that would trigger NUM_OF_FP_EVENT_IDS = 10 # Number of FP events FPEventList._str_list = { # Official Name : Accepted strings 'FP_EVENT_STARTUP': ['startup'], 'FP_EVENT_OP_MODE_CHANGE': ['op mode change'], 'FP_EVENT_SUB_MODE_CHANGE': ['sub mode change'], 'FP_EVENT_PRE_GEN_RO_SET_PWM': ['ro pump set pwm'], 'FP_EVENT_GENP_BOOST_SET_PWM': ['boost pump set pwm'], 'FP_EVENT_GENP_CHANGE': ['generate permeate change', 'genp change'], 'FP_EVENT_PRE_GEN_CHANGE': ['pre-generate permeate change', 'pre-genp change'], 'FP_EVENT_PRE_GEN_DEF_CHANGE': ['defeatured pre-generate permeate change', 'def pre-genp change'], 'FP_EVENT_GENP_DEF_CHANGE': ['defeatured generate permeate change', 'def genp change'], 'FP_EVENT_FAULT_ALARM_TRIGGER': ['alarm', 'alarm trigger', 'fault alarm trigger'], 'NUM_OF_FP_EVENT_IDS': [], } @unique class FPEventDataTypes(DialinEnum): EVENT_DATA_TYPE_NONE = 0 # No Event Data Type EVENT_DATA_TYPE_U32 = 1 # Unsigned 32bit Event Data Type EVENT_DATA_TYPE_S32 = 2 # Signed 32bit Event Data Type EVENT_DATA_TYPE_F32 = 3 # Float 32bit Event Data Type EVENT_DATA_TYPE_BOOL = 4 # Boolean Event Data Type NUM_OF_EVENT_DATA_TYPES = 5 # Number of Event Data Types FPEventDataTypes._str_list = { # Official Name : Accepted strings 'EVENT_DATA_TYPE_NONE': ['none'], 'EVENT_DATA_TYPE_U32': ['u32'], 'EVENT_DATA_TYPE_S32': ['s32'], 'EVENT_DATA_TYPE_F32': ['f32'], 'EVENT_DATA_TYPE_BOOL': ['bool', 'boolean'], 'NUM_OF_EVENT_DATA_TYPES': [], } # ================================================== Enum Creators: Names ================================================== @unique class FPBoostPumpNames(DialinEnum): P40_PUMP = 0 # FP Boost Pump NUM_OF_BOOST_PUMPS = 1 # Number of FP Boost Pumps FPBoostPumpNames._str_list = { # Official Name : Accepted strings 'P40_PUMP': ['p40'], 'NUM_OF_BOOST_PUMPS': [], } @unique class FPConductivitySensorNames(DialinEnum): P9_COND = 0 # CPi (P9) conductivity sensor value P18_COND = 1 # CPo (P18) conductivity sensor value NUM_OF_FP_CONDUCTIVITY_SENSRORS = 2 # Number of Conductivity sensors FPConductivitySensorNames._str_list = { # Official Name : Accepted strings 'P9_COND': ['p9'], 'P18_COND': ['p18'], 'NUM_OF_FP_CONDUCTIVITY_SENSRORS': [], } @unique class FPRORejectionRatioNames(DialinEnum): RAW_RO_REJECTION_RATIO = 0 # Raw RO Rejection Ratio value RAW_RO_REJECTION_RATIO_TANK_FILL = 1 # Raw RO Rejection Ratio Tank Fill value AVG_RO_REJECTION_RATIO = 2 # Average RO Rejection Ratio value AVG_RO_REJECTION_RATIO_TANK_FILL = 3 # Average RO Rejection Ratio Tank Fill value GEN_PERMEATE_STATE = 4 # Generate Permeate State value NUM_OF_FP_RO_REJECTION_RATIO = 5 # Number of RO Rejection Ratio items FPRORejectionRatioNames._str_list = { # Official Name : Accepted strings 'RAW_RO_REJECTION_RATIO': ['raw ro rejection ratio'], 'RAW_RO_REJECTION_RATIO_TANK_FILL': ['raw ro tank fill rejection ratio'], 'AVG_RO_REJECTION_RATIO': ['avg ro rejection ratio', 'average ro rejection ratio'], 'AVG_RO_REJECTION_RATIO_TANK_FILL': ['avg ro tank fill rejection ratio', 'average ro tank fill rejection ratio'], 'GEN_PERMEATE_STATE': ['generate permeate state', 'generate permeate'], 'NUM_OF_FP_RO_REJECTION_RATIO': [], } @unique class FPFlowSensorNames(DialinEnum): P7_FLOW = 0 # Water inlet flow sensor (FMS P7) P16_FLOW = 1 # RO outlet flow sensor (FMP P16) NUM_OF_FP_FLOW_SENSORS = 2 # Number of FP Flow Sensors FPFlowSensorNames._str_list = { # Official Name : Accepted strings 'P7_FLOW': ['p7'], 'P16_FLOW': ['p16'], 'NUM_OF_FP_FLOW_SENSORS': [], } @unique class FPFloaterLevelSensorNames(DialinEnum): P25_LEVEL = 0 # P25 Level sensor NUM_OF_FP_LEVEL_SENSORS = 1 # Number of Level Sensors FPFloaterLevelSensorNames._str_list = { # Official Name : Accepted strings 'P25_LEVEL': ['p25'], 'NUM_OF_FP_LEVEL_SENSORS': [], } @unique class FPPressureSensorNames(DialinEnum): M3_PRES = 0 # Water inlet pressure before regulator P8_PRES = 1 # Water inlet pressure after regulator P13_PRES = 2 # Water inlet pressure before the conductivity sensor P17_PRES = 3 # Pressure before the RO filter P46_PRES = 4 # Pressure after the RO filter NUM_OF_FP_PRES_SENSORS = 5 # Number of Pressure Sensors FPPressureSensorNames._str_list = { # Official Name : Accepted strings 'M3_PRES': ['m3'], 'P8_PRES': ['p8'], 'P13_PRES': ['p13'], 'P17_PRES': ['p17'], 'P46_PRES': ['p46'], 'NUM_OF_FP_PRES_SENSORS': [], } @unique class FPROPumpNames(DialinEnum): P12_PUMP = 0 # P12 RO Pump NUM_OF_RO_PUMPS = 1 # Number of RO Pumps FPROPumpNames._str_list = { # Official Name : Accepted strings 'P12_PUMP': ['p12'], 'NUM_OF_RO_PUMPS': [], } class FPTemperatureSensorNames(DialinEnum): M3_TEMP = 0 # Temperature after pressure regulator (M3) P8_TEMP = 1 # Temperature before inlet conductivity sensor (P8) P13_TEMP = 2 # Temperature before RO filter (P13) P17_TEMP = 3 # Temperature after RO filter (P17) P46_TEMP = 4 # Temperature after sediment filter (P46) P10_TEMP = 5 # P10 temperature from inlet conductivity sensor. P19_TEMP = 6 # P19 temperature from outlet conductivity sensor. P7_TEMP = 7 # Temperature at p7 flow meter P16_TEMP = 8 # Temperature at p16 flow meter P7_INTERNAL_TEMP = 9 # Interal Temperature at p7 flow meter P16_INTERNAL_TEMP = 10 # Interal Temperature at p16 flow meter NUM_OF_TEMPERATURE_SENSORS = 11 # Number of Temperature Sensors # Aliases FIRST_PRESSURE_SENSOR = M3_TEMP LAST_PRESSURE_SENSOR = P46_TEMP FIRST_CONDUCTIVITY_SENSOR = P10_TEMP LAST_CONDUCTIVITY_SENSOR = P19_TEMP FIRST_FLOW_SENSOR = P7_TEMP LAST_FLOW_SENSOR = P16_TEMP FPTemperatureSensorNames._str_list = { # Official Name : Accepted strings 'M3_TEMP': ['m3'], 'P8_TEMP': ['p8'], 'P13_TEMP': ['p13'], 'P17_TEMP': ['p17'], 'P46_TEMP': ['p46'], 'P10_TEMP': ['p10'], 'P19_TEMP': ['p19'], 'P7_TEMP': ['p7'], 'P16_TEMP': ['p16'], 'P7_INTERNAL_TEMP': ['p7 internal'], 'P16_INTERNAL_TEMP': ['p16 internal'], 'NUM_OF_TEMPERATURE_SENSORS': [], } @unique class FPValveNames(DialinEnum): M4_VALV = 0 # Valve (M4 VWi) M12_VALV = 1 # Valve (M12) P11_VALV = 2 # Valve (P11 VPi) P33_VALV = 3 # Valve (P33 VCr) P34_VALV = 4 # Valve (P34 VCb) P37_VALV = 5 # Valve (P37 VCd) P39_VALV = 6 # Valve (P39 VROd) P6_VALV = 7 # Valve (P6 VFF) NUM_OF_FP_VALVES = 8 # Number of valves FPValveNames._str_list = { # Official Name : Accepted strings 'M4_VALV': ['m4'], 'M12_VALV': ['m12'], 'P11_VALV': ['p11'], 'P33_VALV': ['p33'], 'P34_VALV': ['p34'], 'P37_VALV': ['p37'], 'P39_VALV': ['p39'], 'P6_VALV': ['p6'], 'NUM_OF_FP_VALVES': [], } @unique class FPAllPumpNames(DialinEnum): P12_PUMP_RO = 0 # P12 RO Pump P40_PUMP_BOOSTER = 1 # P40 Boost Pump NUM_OF_PUMPS = 2 # Number of pumps FPAllPumpNames._str_list = { # Official Name : Accepted strings 'P12_PUMP_RO': ['p12', 'ro pump'], 'P40_PUMP_BOOSTER': ['p40', 'boost pump'], 'NUM_OF_PUMPS': [], } # ================================================== Enum Creators: Support ================================================== @unique class FPFloaterLevels(DialinEnum): LEVEL_STATE_EMPTY = 0 # Empty level for the FP Floater Level Sensors LEVEL_STATE_LOW = 1 # Low level for the FP Floater Level Sensors LEVEL_STATE_MEDIUM = 2 # Medium level for the FP Floater Level Sensors LEVEL_STATE_HIGH = 3 # High level for the FP Floater Level Sensors LEVEL_STATE_ILLEGAL = 4 # Illegal level for FP Floater Level Sensor (indicates investigation) NUM_OF_LEVEL_STATES = 5 # Number of Level States FPFloaterLevels._str_list = { # Official Name : Accepted strings 'LEVEL_STATE_EMPTY': ['empty'], 'LEVEL_STATE_LOW': ['low'], 'LEVEL_STATE_MEDIUM': ['medium'], 'LEVEL_STATE_HIGH': ['high'], 'LEVEL_STATE_ILLEGAL': ['illegal'], 'NUM_OF_LEVEL_STATES': [], } @unique class FPPumpAttributes(DialinEnum): STATE = 0 # State to command attribute for Pumps DUTY_CYCLE = 1 # Duty Cycle attribute for Pumps FB_DUTY_CYCLE = 2 # Feedback Duty Cycle attribute for Pumps SPEED = 3 # Current Speed attribute for pumps TARGET_PRES = 4 # Target Pressure attribute for pumps TARGET_FLOW = 5 # Target Flow attribute for pumps TARGET_DUTY_CYCLE = 6 # Target Duty Cycle attribute for pumps DUTY_CYCLE_PCT = 7 # Duty Cycle Percentage attribute for pumps FB_DUTY_CYCLE_PCT = 8 # Feedback Duty Cycle Percentage attribute for pumps NUM_OF_RO_PUMP_ATTRIBUTES = 9 # Number of pump attributes FPPumpAttributes._str_list = { # Official Name : Accepted strings 'STATE': [], 'DUTY_CYCLE': [], 'FB_DUTY_CYCLE': ['feedback duty cycle'], 'SPEED': [], 'TARGET_PRES': ['target pressure'], 'TARGET_FLOW': [], 'TARGET_DUTY_CYCLE': [], 'DUTY_CYCLE_PCT': ['duty cycle percentage'], 'FB_DUTY_CYCLE_PCT': ['feedback duty cycle percentage'], 'NUM_OF_RO_PUMP_ATTRIBUTES': [], } @unique class FPValveStates(DialinEnum): VALVE_STATE_CLOSED = 0 # Valve Closed State VALVE_STATE_OPEN = 1 # Valve Open State NUM_OF_VALVE_STATES = 2 # Valve Open State FPValveStates._str_list = { # Official Name : Accepted strings 'VALVE_STATE_CLOSED': ['closed'], 'VALVE_STATE_OPEN': ['open'], 'NUM_OF_VALVE_STATES': [], } # ================================================== Creates a singleton ================================================== class FP_Defs(): FPOpModes = FPOpModes FPFaultStates = FPFaultStates FPServiceStates = FPServiceStates FPPostStates = FPPostStates FPStandbyStates = FPStandbyStates FPPreGenPermeateStates = FPPreGenPermeateStates FPPreGenPDefStates = FPPreGenPDefStates FPGenPermeateStates = FPGenPermeateStates FPGenPermeateDefStates = FPGenPermeateDefStates FPNotLegalStates = FPNotLegalStates FPEventList= FPEventList FPEventDataTypes= FPEventDataTypes FPBoostPumpNames = FPBoostPumpNames FPConductivitySensorNames = FPConductivitySensorNames FPRORejectionRatioNames = FPRORejectionRatioNames FPFlowSensorNames = FPFlowSensorNames FPFloaterLevelSensorNames = FPFloaterLevelSensorNames FPPressureSensorNames = FPPressureSensorNames FPROPumpNames = FPROPumpNames FPTemperatureSensorNames = FPTemperatureSensorNames FPValveNames = FPValveNames FPAllPumpNames = FPAllPumpNames FPFloaterLevels = FPFloaterLevels FPPumpAttributes = FPPumpAttributes FPValveStates = FPValveStates fp_enum_repository = FP_Defs()