Index: leahi_dialin/common/fp_defs.py =================================================================== diff -u -r7ce778dc51b7dba5a7a7ca14244ed7eea7bf029d -r894abd4d8e62d20ba65ca78e443ffb5ea00c07ea --- leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 7ce778dc51b7dba5a7a7ca14244ed7eea7bf029d) +++ leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 894abd4d8e62d20ba65ca78e443ffb5ea00c07ea) @@ -13,212 +13,537 @@ # @date (original) 22-Jun-2021 # ############################################################################ + from enum import unique +from aenum import extend_enum +from typing import TYPE_CHECKING + +from .dd_defs import DDConductivitySensorsEnum, DDPressureNames, DDValveNames +from .global_vars import GlobalVariables, test_config_change from ..utils.base import DialinEnum -@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 -@unique -class FPServiceStates(DialinEnum): - NUM_OF_FP_SERV_STATES = 0 # TODO populate with FP service states +class FP_Defs: -@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 + # This is for the editor to recognize the enums for autocomplete + if TYPE_CHECKING: + FPOpModes: DialinEnum + FPServiceStates: DialinEnum + FPPostStates: DialinEnum + FPFaultStates: DialinEnum + FPStandbyStates: DialinEnum + FPPreGenPermeateStates: DialinEnum + FPPreGenPDefStates: DialinEnum + FPGenPermeateStates: DialinEnum + FPGenPermeateDefStates: DialinEnum + FPNotLegalStates: DialinEnum + FPEventList: DialinEnum + FPEventDataTypes: DialinEnum + FPBoostPumpNames: DialinEnum + FPConductivitySensorNames: DialinEnum + FPRORejectionRatioNames: DialinEnum + FPFlowSensorNames: DialinEnum + FPFloaterLevelSensorNames: DialinEnum + FPPressureSensorNames: DialinEnum + ROPumpNames: DialinEnum + ROPumpNames: DialinEnum + ROPumpNames: DialinEnum + ROPumpNames: DialinEnum + FPTemperatureSensorNames: DialinEnum + FPValveNames: DialinEnum + FPAllPumpNames: DialinEnum + FPFloaterLevels: DialinEnum + FPPumpAttributes: DialinEnum + FPValveStates: DialinEnum + -@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 -@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 + # A Dictionary storing which Property(Enum) should be created by which function + _properties = { + # Operation related enums + 'FPOpModes': '_create_fp_operation_modes', + 'FPServiceStates': '_create_fp_service_states', + 'FPPostStates': '_create_fp_post_states', + 'FPFaultStates': '_create_fp_fault_states', + 'FPStandbyStates': '_create_fp_standby_states', + 'FPPreGenPermeateStates': '_create_fp_pregen_states', + 'FPPreGenPDefStates': '_create_fp_pregen_defeatured_states', + 'FPGenPermeateStates': '_create_fp_gen_permeate_states', + 'FPGenPermeateDefStates': '_create_fp_gen_permeate_defeatured_states', + 'FPNotLegalStates': '_create_fp_not_legal_states', + 'FPEventList': '_create_fp_events_states', + 'FPEventDataTypes': '_create_fp_event_data_types_states', + + # Module Names related enums + 'FPBoostPumpNames': '_create_fp_boost_pump_names', + 'FPConductivitySensorNames': '_create_fp_conductivity_sensor_names', + 'FPRORejectionRatioNames': '_create_fp_ro_rejection_ratio_names', + 'FPFlowSensorNames': '_create_fp_flow_sensor_names', + 'FPFloaterLevelSensorNames': '_create_fp_floater_sensor_names', + 'FPPressureSensorNames': '_create_fp_pressure_sensor_names', + 'ROPumpNames': '_create_fp_ro_pump_names', + 'FPValveNames': '_create_fp_valve_names', + 'FPAllPumpNames': '_create_fp_all_pump_names', + 'FPTemperatureSensorNames': '_create_fp_temperature_sensor_names', -@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 = 6 # Number of Pre-Gen Permeate mode states + # Module Support enums + 'FPFloaterLevels': '_create_fp_floater_levels', + 'FPPumpAttributes': '_create_fp_pump_attributes', + 'FPValveStates': '_create_fp_valve_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 + def __init__(self): + self.update_enums() -@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 -@unique -class FPGenPermeateDefStates(DialinEnum): - FP_GENP_DEF_SUPPLY_WATER = 0 # Gen Permeate Defeatured Supply Water state - FP_GENP_DEF_PAUSED = 1 # Gen Permeate Defeatured Paused state - NUM_OF_FP_GENP_DEF_MODE_STATES = 2 # Number of gen Permeate states + # Dynamically creates all the properties in runtime + def __getattr__(self, name) -> DialinEnum: + if name in self._properties: + value = getattr(self, self._properties[name])() + setattr(self, name, value) + return value + raise AttributeError(name) -@unique -class FPNotLegalStates(DialinEnum): - NUM_OF_NOT_LEGAL_STATES = 0 # TODO: populate with Not Legal states -@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 pre gen state change - FP_EVENT_FAULT_ALARM_TRIGGER = 9 # FP event for alarms that would trigger - NUM_OF_FP_EVENT_IDS = 10 # Total number of FP events + # Attached to a listener to update the enums when the listener is triggered + def update_enums(self) -> None: + for prop_name in self._properties: + # Cleans the cached value + self.__dict__.pop(prop_name, None) + + # Reinitializing the enum as it's not in the cache + self.__getattr__(prop_name) -@unique -class FPEventDataType(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 -@unique -class FPBoostPumpNames(DialinEnum): - P40_PUMP = 0 # FP Boost Pump - NUM_OF_BOOST_PUMPS = 1 # Number of FP Boost Pumps -@unique -class FPConductivitySensorsEnum(DialinEnum): - P9_COND = 0 # CPi (P9) conductivity sensor value - P18_COND = 1 # CPo (P18) conductivity sensor value - NUM_OF_FP_CONDUCTIVITY = 2 # Number of Conductivity sensors + # ================================================== Enum Creators: Operations ================================================== + def _create_fp_operation_modes(self): + members = { + '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 FP operation modes + } -@unique -class FPRORejectionRatioEnum(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_CONDUCTIVITY = 5 # Number of RO Rejection Ratio items + # Create the enum + FPOpModes = DialinEnum('FPOpModes', members) + + return FPOpModes + -@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 + def _create_fp_service_states(self): + members = { + 'NUM_OF_FP_SERV_STATES': 0, # Number of FP service states + } -@unique -class FPFloaterLevels(DialinEnum): - LEVEL_STATE_LOW = 0 # Low level for the FP Floater Level Sensors - LEVEL_STATE_MEDIUM = 1 # Medium level for the FP Floater Level Sensors - LEVEL_STATE_HIGH = 2 # High level for the FP Floater Level Sensors - LEVEL_STATE_ILLEGAL = 3 # Illegal level for FP Floater Level Sensor (indicates investigation) - NUM_OF_LEVEL_STATES = 4 # Number of Level States + # Create the enum + FPServiceStates = DialinEnum('FPServiceStates', members) + + return FPServiceStates -@unique -class FPFloaterLevelSensorNames(DialinEnum): - P25_LEVEL = 0 # P25 Level sensor - NUM_OF_FP_LEVEL_SENSORS = 1 # Number 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 + def _create_fp_post_states(self): + members = { + '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 + } -@unique -class ROPumpNames(DialinEnum): - P12_PUMP = 0 # P12 RO Pump - NUM_OF_RO_PUMPS = 1 # Number of RO Pumps + # Create the enum + FPPostStates = DialinEnum('FPPostStates', members) + + return FPPostStates -@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 -BETA_CONDUCTIVITY_SENSOR_OFFSET = 3 # Offset to translate Dialin FPTemperaturesNames to DD firmware ConductivitySensors enum -BETA_FLOW_SENSOR_OFFSET = 7 # Offset to translate Dialin FPTemperaturesNames to DD firmware FlowSensors enum -BETA_IO_PRES_SENSOR_OFFSET = 5 # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum -BETA_FP_PRES_SENSOR_OFFSET = 3 # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum + def _create_fp_fault_states(self): + members = { + '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 + } -@unique -class FPTemperaturesNames(DialinEnum): - M3_TEMP = 0 # Temperature after pressure regulator (M3) - P10_TEMP = 1 # P10 temperature from inlet conductivity sensor. - P19_TEMP = 2 # P19 temperature from outlet conductivity sensor. - P8_TEMP = 3 # Temperature before inlet conductivity sensor (P8) - P13_TEMP = 4 # Temperature before RO filter (P13) - P17_TEMP = 5 # Temperature after RO filter (P17) - P7_TEMP = 6 # Temperature at p7 flow meter - P16_TEMP = 7 # Temperature at p16 flow meter - P46_TEMP = 8 # Temperature after sediment filter (P46) - NUM_OF_TEMPERATURE_SENSORS = 9 # Number of Temperature Sensors + # Create the enum + FPFaultStates = DialinEnum('FPFaultStates', members) + + return FPFaultStates -@unique -class FPValveStates(DialinEnum): - VALVE_STATE_CLOSED = 0 # Valve Closed State - VALVE_STATE_OPEN = 1 # Valve Open State -BETA_IOFP_VALVE_OFFSET = 32 # Offset to translate Dialin FPValveNames to DD firmware DD_Valves + def _create_fp_standby_states(self): + members = { + 'FP_STANDBY_MODE_STATE_IDLE': 0, # Idle standby mode state + 'NUM_OF_FP_STANDBY_MODE_STATES': 1, # Number of standby mode states + } -@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 + # Create the enum + FPStandbyStates = DialinEnum('FPStandbyStates', members) + + return FPStandbyStates -@unique -class FPPumpNames(DialinEnum): - P12_PUMP_RO = 0 # RO Pump - P40_PUMP_BOOSTER = 1 # Booster Pump \ No newline at end of file + + def _create_fp_pregen_states(self): + members = { + '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': 6, # Number of Pre-Gen Permeate mode states + } + + # Create the enum + FPPreGenPermeateStates = DialinEnum('FPPreGenPermeateStates', members) + + return FPPreGenPermeateStates + + + def _create_fp_pregen_defeatured_states(self): + members = { + '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 + } + + # Create the enum + FPPreGenPDefStates = DialinEnum('FPPreGenPDefStates', members) + + return FPPreGenPDefStates + + + def _create_fp_gen_permeate_states(self): + members = { + '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 + } + + # Create the enum + FPGenPermeateStates = DialinEnum('FPGenPermeateStates', members) + + return FPGenPermeateStates + + + def _create_fp_gen_permeate_defeatured_states(self): + members = { + '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 + } + + # Create the enum + FPGenPermeateDefStates = DialinEnum('FPGenPermeateDefStates', members) + + return FPGenPermeateDefStates + + + def _create_fp_not_legal_states(self): + members = { + 'NUM_OF_NOT_LEGAL_STATES': 0, # Number of Not Legal states + } + + # Create the enum + FPNotLegalStates = DialinEnum('FPNotLegalStates', members) + + return FPNotLegalStates + + + def _create_fp_events_states(self): + members = { + '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 + } + + # Create the enum + FPEventList = DialinEnum('FPEventList', members) + + return FPEventList + + + def _create_fp_event_data_types_states(self): + members = { + '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 + } + + # Create the enum + FPEventDataTypes = DialinEnum('FPEventDataTypes', members) + + return FPEventDataTypes + + + + # ================================================== Enum Creators: Names ================================================== + def _create_fp_boost_pump_names(self): + members = { + 'P40_PUMP': 0, # FP Boost Pump + 'NUM_OF_BOOST_PUMPS': 1, # Number of FP Boost Pumps + } + + # Create the enum + FPBoostPumpNames = DialinEnum('FPBoostPumpNames', members) + + return FPBoostPumpNames + + + def _create_fp_conductivity_sensor_names(self): + members = { + '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 + } + + # Create the enum + FPConductivitySensorNames = DialinEnum('FPConductivitySensorNames', members) + + return FPConductivitySensorNames + + + def _create_fp_ro_rejection_ratio_names(self): + members = { + '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 + } + + # Create the enum + FPRORejectionRatioNames = DialinEnum('FPRORejectionRatioNames', members) + + return FPRORejectionRatioNames + + + def _create_fp_flow_sensor_names(self): + members = { + '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 + } + + # Create the enum + FPFlowSensorNames = DialinEnum('FPFlowSensorNames', members) + + return FPFlowSensorNames + + + def _create_fp_floater_sensor_names(self): + members = { + 'P25_LEVEL': 0, # P25 Level sensor + 'NUM_OF_FP_LEVEL_SENSORS': 1, # Number of Level Sensors + } + + # Create the enum + FPFloaterLevelSensorNames = DialinEnum('FPFloaterLevelSensorNames', members) + + return FPFloaterLevelSensorNames + + + def _create_fp_pressure_sensor_names(self): + if GlobalVariables().NEXT_GEN_HW == True: + members = { + '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 + } + else: + members = { + '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 + 'NUM_OF_FP_PRES_SENSORS' : 4, # Number of Pressure Sensors + } + + # Create the enum + FPPressureSensorNames = DialinEnum('FPPressureSensorNames', members) + + return FPPressureSensorNames + + + def _create_fp_ro_pump_names(self): + members = { + 'P12_PUMP': 0, # P12 RO Pump + 'NUM_OF_RO_PUMPS': 1, # Number of RO Pumps + + } + + # Create the enum + ROPumpNames = DialinEnum('ROPumpNames', members) + + return ROPumpNames + + + def _create_fp_temperature_sensor_names(self): + if GlobalVariables().NEXT_GEN_HW == True: + members = { + '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 + 'NUM_OF_TEMPERATURE_SENSORS' : 9, # Number of Temperature Sensors + } + else: + members = { + '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) + 'P10_TEMP' : 4, # P10 temperature from inlet conductivity sensor. + 'P19_TEMP' : 5, # P19 temperature from outlet conductivity sensor. + 'P7_TEMP' : 6, # Temperature at p7 flow meter + 'P16_TEMP' : 7, # Temperature at p16 flow meter + 'NUM_OF_TEMPERATURE_SENSORS' : 8, # Number of Temperature Sensors + } + + # Create the enum + FPTemperatureSensorNames = DialinEnum('FPTemperatureSensorNames', members) + + # Add aliases + extend_enum(FPTemperatureSensorNames, 'FIRST_PRESSURE_SENSOR', FPTemperatureSensorNames.M3_TEMP.value) + extend_enum(FPTemperatureSensorNames, 'LAST_PRESSURE_SENSOR', FPTemperatureSensorNames.P46_TEMP.value if GlobalVariables.NEXT_GEN_HW == True else FPTemperatureSensorNames.P17_TEMP.value) + extend_enum(FPTemperatureSensorNames, 'FIRST_CONDUCTIVITY_SENSOR', FPTemperatureSensorNames.P10_TEMP.value) + extend_enum(FPTemperatureSensorNames, 'LAST_CONDUCTIVITY_SENSOR', FPTemperatureSensorNames.P19_TEMP.value) + extend_enum(FPTemperatureSensorNames, 'FIRST_FLOW_SENSOR', FPTemperatureSensorNames.P7_TEMP.value) + extend_enum(FPTemperatureSensorNames, 'LAST_FLOW_SENSOR', FPTemperatureSensorNames.P16_TEMP.value) + + # Add aliases to be searchable (listed when pressed TAB) + FPTemperatureSensorNames._member_names_.append('FIRST_PRESSURE_SENSOR') + FPTemperatureSensorNames._member_names_.append('LAST_PRESSURE_SENSOR') + FPTemperatureSensorNames._member_names_.append('FIRST_CONDUCTIVITY_SENSOR') + FPTemperatureSensorNames._member_names_.append('LAST_CONDUCTIVITY_SENSOR') + FPTemperatureSensorNames._member_names_.append('FIRST_FLOW_SENSOR') + FPTemperatureSensorNames._member_names_.append('LAST_FLOW_SENSOR') + + return FPTemperatureSensorNames + + + def _create_fp_valve_names(self): + members = { + '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 + } + + # Create the enum + FPValveNames = DialinEnum('FPValveNames', members) + + return FPValveNames + + + def _create_fp_all_pump_names(self): + members = { + 'P12_PUMP_RO': 0, # P14 RO Pump + 'P40_PUMP_BOOSTER': 1, # P40 Boost Pump + } + + # Create the enum + FPAllPumpNames = DialinEnum('FPAllPumpNames', members) + + return FPAllPumpNames + + + + # ================================================== Enum Creators: Support ================================================== + def _create_fp_floater_levels(self): + members = { + '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 + } + + # Create the enum + FPFloaterLevels = DialinEnum('FPFloaterLevels', members) + + return FPFloaterLevels + + + def _create_fp_pump_attributes(self): + members = { + '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 + } + + # Create the enum + FPPumpAttributes = DialinEnum('FPPumpAttributes', members) + + return FPPumpAttributes + + + def _create_fp_valve_states(self): + members = { + 'VALVE_STATE_CLOSED': 0, # Valve Closed State + 'VALVE_STATE_OPEN': 1, # Valve Open State + } + + # Create the enum + FPValveStates = DialinEnum('FPValveStates', members) + + return FPValveStates + + + +# ================================================== Creates a singleton ================================================== +fp_enum_repository = FP_Defs() + +# Attach listener to update function +test_config_change.add_listener(fp_enum_repository.update_enums) + + +BETA_IOFP_COND_SENSOR_OFFSET = DDConductivitySensorsEnum.NUM_OF_CONDUCTIVITY_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware DD Conductivity Sensors enum +BETA_IOFP_PRES_SENSOR_OFFSET = DDPressureNames.NUM_OF_PRESSURE_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware DD Pressure Sensors enum +BETA_IOFP_VALVE_OFFSET = DDValveNames.NUM_OF_DD_VALVES.value # Offset to translate Dialin FPValveNames to DD firmware DD_Valves