Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -r02eb470cf6682c89062c8a62eaf0a08a2728b18a -r55d97b27c73f8e08994328881d3f56cbc7f00e29 --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 02eb470cf6682c89062c8a62eaf0a08a2728b18a) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 55d97b27c73f8e08994328881d3f56cbc7f00e29) @@ -7,380 +7,653 @@ # # @file dd_defs.py # -# @author (last) Dara Navaei -# @date (last) 08-Feb-2024 +# @author (last) Zoltan Miskolci +# @date (last) 13-Jan-2026 # @author (original) Peter Lucia # @date (original) 22-Jun-2021 # ############################################################################ -from enum import unique + +from aenum import extend_enum +from typing import TYPE_CHECKING + +from .global_vars import GlobalVariables, test_config_change from ..utils.base import DialinEnum -@unique -class DDOpModes(DialinEnum): - MODE_FAUL = 0 # Fault Mode - MODE_SERV = 1 # Service Mode - MODE_INIT = 2 # Initialization & POST Mode - MODE_STAN = 3 # Standby Mode - MODE_PREG = 4 # Pre-generate Dialysate Mode - MODE_GEND = 5 # Generate Dialysate Mode - MODE_POSG = 6 # Post-generate Dialysate Mode - MODE_HEAT = 7 # Heat Mode - MODE_HCOL = 8 # Cooling Mode - MODE_ROPS = 9 # RO Permeate Sample Mode - MODE_NLEG = 10 # Non-legal Mode - an illegitimate mode transition has occurred - NUM_OF_DD_MODES = 11 # Number of Modes for the DD +class DD_Defs: -@unique -class DDInitStates(DialinEnum): - DD_POST_STATE_START = 0 # Post Generate Dialysate Start State - DD_POST_STATE_FW_COMPATIBILITY = 1 # Firmware Compatibility State - DD_POST_STATE_FW_INTEGRITY = 2 # Firmware Integrity State - DD_POST_STATE_FPGA = 3 # FPGA State - DD_POST_STATE_NVDATAMGMT = 4 # Non-volatile Data Management State - DD_POST_STATE_TEMPERATURE_SENSORS = 5 # Temperature Sensors State - DD_POST_STATE_PRESSURES = 6 # Pressure Sensors State - DD_POST_STATE_DIALYSATE_PUMPS = 7 # Dialysate Pumps State - DD_POST_STATE_CONCENTRATE_PUMPS = 8 # Concentrate Pumps State - DD_POST_STATE_CONDUCTIVITY_SENSORS = 9 # Conductivity Sensors State - DD_POST_STATE_WATCHDOG = 10 # Watchdog State - DD_POST_STATE_SAFETY_SHUTDOWN = 11 # Safety Shutdown State - DD_POST_STATE_COMPLETED = 12 # Post Generate Dialysate Completed State - DD_POST_STATE_FAILED = 13 # Post Generate Dialysate Fail State - NUM_OF_DD_POST_STATES = 14 # Number of Post Generate Dialysate States + # IDE autocomplete support + if TYPE_CHECKING: + DDOpModes: DialinEnum + DDFaultStates: DialinEnum + DDFaultNVDataStates: DialinEnum + DDServiceStates: DialinEnum + DDInitStates: DialinEnum + DDStandbyStates: DialinEnum + DDPreGenDialysateStates: DialinEnum + DDGenDialysateModeStates: DialinEnum + DDPostGenDialysateStates: DialinEnum + DDHeatDisinfectState: DialinEnum + DDHeaterCoolingStates: DialinEnum + DDROPermeateStates: DialinEnum + DDNotLegalStates: DialinEnum + DDEventList: DialinEnum + DDEventDataTypes: DialinEnum -@unique -class DDFaultStates(DialinEnum): - DD_FAULT_STATE_START = 0 # DD fault start state - DD_FAULT_DEENERGIZED_STATE = 1 # DD fault de-energized state - DD_FAULT_ENERGIZED_STATE_ = 2 # DD fault energized state - NUM_OF_DD_FAULT_STATES = 3 # Number of fault mode states + DDConcentratePumpNames:DialinEnum + DDConductivitySensorNames:DialinEnum + DDDialysatePumpNames:DialinEnum + DDHeaterNames:DialinEnum + DDLevelSensorNames:DialinEnum + DDPistonPumpNames:DialinEnum + DDPressureSensorNames:DialinEnum + DDTemperatureSensorNames: DialinEnum + DDValveNames: DialinEnum + DDMonitoredVoltages: DialinEnum -@unique -class DDFaultNVDataStates(DialinEnum): - DD_FAULT_STATE_START = 0 # DD fault start state - DD_FAULT_STATE_RUN_NV_POSTS = 1 # DD fault run RTC and NV data management post - DD_FAULT_STATE_COMPLETE = 2 # DD fault complete - NUM_OF_DD_FAULT_NVDATA_STATES = 3 # Number of fault mode NV Data management states + DDBalancingChamberStates:DialinEnum + DDBalancingChamberSwitchStates:DialinEnum + DDBloodLeakStates:DialinEnum + DDConcentratePumpAttributes:DialinEnum + DDConcentratePumpStates:DialinEnum + DDDialysatePumpAttributes:DialinEnum + DDDialysatePumpsStates:DialinEnum + DDHeaterStartStop:DialinEnum + DDHeaterAttributes:DialinEnum + DDHeaterExecState:DialinEnum + DDPistonPumpAttributes:DialinEnum + DDValveStates: DialinEnum -@unique -class DDStandByModeStates(DialinEnum): - DD_STANDBY_MODE_STATE_IDLE = 0 # Idle standby mode state - DD_STANDBY_MODE_STATE_PAUSE = 1 # Pause state - NUM_OF_DD_STANDBY_MODE_STATES = 2 # Number of standby mode states + _properties = { + # Operation / State enums + 'DDOpModes': '_create_dd_operation_modes', + 'DDFaultStates': '_create_dd_fault_states', + 'DDFaultNVDataStates': '_create_dd_fault_nvdata_states', + 'DDServiceStates': '_create_dd_service_states', + 'DDInitStates': '_create_dd_init_states', + 'DDStandbyStates': '_create_dd_standby_states', + 'DDPreGenDialysateStates': '_create_dd_pregen_states', + 'DDGenDialysateModeStates': '_create_dd_gen_states', + 'DDPostGenDialysateStates': '_create_dd_postgen_states', + 'DDHeatDisinfectState': '_create_dd_heat_disinfect_states', + 'DDHeaterCoolingStates': '_create_dd_heater_cooling_states', + 'DDROPermeateStates': '_create_dd_ro_permeate_states', + 'DDNotLegalStates': '_create_dd_not_legal_states', -@unique -class DDPreGenDialysateStates(DialinEnum): - DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK = 0, # DD Pre-Gen Dialysate hyrochamber fill check - DD_PRE_GEN_WET_SELF_TEST = 1 # DD Pre-Gen Wet Self Test - DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND = 2 # DD Pre-Gen Dialysate Wait for Gen Dialysate state transition - NUM_OF_DD_PRE_GEN_DIALYSATE_STATES = 3 # Number of Pre-Gen Dialysate mode states + # Event enums + 'DDEventList': '_create_dd_event_list', + 'DDEventDataTypes': '_create_dd_event_data_types', -@unique -class DDGenDialysateModeStates(DialinEnum): - DD_GEND_STATE_START = 0 # Gen dialysate start state - DD_GEND_DIALYSATE_BYPASS_STATE = 1 # Gen dialysate - Bypass dialysate state - DD_GEND_DIALYSATE_DELIVERY_STATE = 2 # Gen dialysate - deliver dialysate state - DD_GEND_ISOLATED_UF_STATE = 3 # Gen dialysate - Isolated ultrafiltration state - DD_GEND_SPENT_CHAMBER_FILL_STATE = 4 # Gen dialysate - spent chamber fill state - DD_GEND_BICARB_CHAMBER_FILL_STATE = 5 # Gen dialysate - bicarb chamber fill state - DD_GEND_DIALYSATE_DELIVERY_PAUSE = 6 # Gen dialysate - dialysate delivery pause state - NUM_OF_DD_GEND_MODE_STATES = 7 # Number of gen dialysate states + # Module Names enums + 'DDConcentratePumpNames': '_create_dd_concentrate_pump_names', + 'DDConductivitySensorNames': '_create_dd_conductivity_sensor_names', + 'DDDialysatePumpNames': '_create_dd_dialysate_pump_names', + 'DDHeaterNames': '_create_dd_heater_names', + 'DDLevelSensorNames': '_create_dd_level_sensor_names', + 'DDPistonPumpNames': '_create_dd_piston_pump_names', + 'DDPressureSensorNames': '_create_dd_pressure_sensor_names', + 'DDTemperatureSensorNames': '_create_dd_temperature_sensor_names', + 'DDValveNames': '_create_dd_valve_names', + 'DDMonitoredVoltages': '_create_dd_monitored_voltages', -@unique -class DDPostGenDialysateState(DialinEnum): - DD_POST_GEN_DIALYSATE_STATE_START = 0 # DD Post-Gen Dialysate state start - DD_POST_GEN_DIALYSATE_STATE_COMPLETE = 1 # DD Post-Gen Dialysate complete state - NUM_OF_DD_POST_GEN_DIALYSATE_STATES = 2 # Number of Post-Gen Dialysate mode states + # Support enums + 'DDBalancingChamberStates': '_create_dd_balancing_chamber_states', + 'DDBalancingChamberSwitchStates': '_create_dd_balancing_chamber_switch_states', + 'DDBloodLeakStates': '_create_dd_blood_leak_states', + 'DDConcentratePumpAttributes': '_create_dd_concentrate_pump_attributes', + 'DDConcentratePumpStates': '_create_dd_concentrate_pump_states', + 'DDDialysatePumpAttributes': '_create_dd_dialysate_pump_attributes', + 'DDDialysatePumpsStates': '_create_dd_dialysate_pump_states', + 'DDHeaterStartStop': '_create_dd_heater_start_stop', + 'DDHeaterAttributes': '_create_dd_heater_attributes', + 'DDHeaterExecState': '_create_dd_heater_exec_states', + 'DDPistonPumpAttributes': '_create_dd_piston_pump_attributes', + 'DDValveStates': '_create_dd_valve_states', + } -@unique -class DDEventList(DialinEnum): - DD_EVENT_STARTUP = 0 # DD startup event - DD_EVENT_OP_MODE_CHANGE = 1 # DD Op mode change event - DD_EVENT_SUB_MODE_CHANGE = 2 # DD Op sub-mode change event - DD_EVENT_OPERATION_STATUS = 3 # DD operation status event - DD_EVENT_D6_LEVL_CHANGE = 4 # DD floater level change event - DD_EVENT_D63_LEVL_CHANGE = 5 # DD bicarb level change event - DD_EVENT_D46_LEVL_CHANGE = 6 # DD spent dialysate air seperation level change event - DD_EVENT_TD_COMMUNICATION_LOSS = 7 # DD TD communication loss - DD_EVENT_TEMPERATURE_DRIFT = 8 # DD dialysate temperature drift - DD_EVENT_BLOOD_LEAK_ZEROING_REQUEST = 9 # DD blood leak zeroing request - DD_EVENT_BLOOD_LEAK_ZEROING_REQUIRED = 10 # DD blood leak zeroing required - DD_EVENT_BLOOD_LEAK_NUM_OF_SET_POINT_CHECK_FAILURES = 11 # DD blood leak number of setpoint check failures - DD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT = 12 # DD blood leak self test result - NUM_OF_DD_EVENT_IDS = 13 # Total number of DD events + def __init__(self): + self.update_enums() -@unique -class DDEventDataType(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 DDServiceModesStates(DialinEnum): - DD_SERVICE_STATE_START = 0 # Start service mode state - NUM_OF_DD_SERVICE_STATES = 1 # Number of service mode states + def __getattr__(self, name) -> DialinEnum: + if name in self._properties: + enum = getattr(self, self._properties[name])() + setattr(self, name, enum) + return enum + raise AttributeError(name) -@unique -class DDBalancingChamberStates(DialinEnum): - BAL_CHAMBER_STATE_START = 0, # Initial state of balancing chamber - BAL_CHAMBER_STATE1_FILL_START = 1 # Balancing chamber state 1 fill start state - BAL_CHAMBER_STATE1_BICARB_ACID_DOSING_CNTRL = 2 # Balancing Chamber state 1 Bicarb and acid dosing control state - BAL_CHAMBER_STATE1_FILL_END = 3 # Balancing Chamber state 1 fill end state - BAL_CHAMBER_STATE2_FILL_START = 4 # Balancing chamber state 2 fill start state - BAL_CHAMBER_STATE2_BICARB_ACID_DOSING_CNTRL = 5 # Balancing Chamber state 2 Bicarb and acid dosing control state - BAL_CHAMBER_STATE2_FILL_END = 6 # Balancing Chamber state 2 fill end state - NUM_OF_BAL_CHAMBER_EXEC_STATES = 7 # Number of balancing chamber states -@unique -class DDBalancingChamberSwitchStates(DialinEnum): - BAL_CHAMBER_SW_STATE1 = 0 # Balancing chamber switching state 1 (V2,V5 and V3, V8 open, rest closed) - BAL_CHAMBER_SW_STATE2 = 1 # Balancing chamber switching state 2 ( V1,V6 and V4, V7 open, rest closed) - NUM_OF_BAL_CHAMBER_SW = 2 # Number of balancing chamber states + def update_enums(self) -> None: + for prop in self._properties: + self.__dict__.pop(prop, None) + self.__getattr__(prop) -@unique -class DDBloodLeakStates(DialinEnum): - """ - DD blood leak embedded mode state machine states - """ - BLOOD_LEAK_WAIT_FOR_POST_STATE = 0 - BLOOD_LEAK_CHECK_SET_POINT_STATE = 1 - BLOOD_LEAK_INIT_STATE = 2 - BLOOD_LEAK_CHECK_ZERO_AND_SELF_TEST_STATE = 3 - BLOOD_LEAK_VERIFY_INTENSITY_AFTER_ZEROING_STATE = 4 - BLOOD_LEAK_NORMAL_STATE = 5 - BLOOD_LEAK_RECOVER_BLOOD_DETECT_STATE = 6 - NUM_OF_BLOOD_LEAK_STATES = 7 -@unique -class DDConcentratePumpsEnum(DialinEnum): - D11_CP1_ACID = 0 # Acid Concentrate Pump - D10_CP2_BICARB = 1 # Bicarbonate Concentrate Pump - D76_UF = 2 # Ultrafiltration Concentrate Pump - NUM_OF_CONCENTRATE_PUMPS = 3 # Number of Concentrate Pumps -@unique -class DDConcentratePumpsStates(DialinEnum): - CONCENTRATE_PUMP_OFF_STATE = 0 # Concentrate Pump Off State - CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE = 1 # Ramp to Target Speed Concentrate Pump State - CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE = 2 # Control Target Speed Concentrate Pump State - NUM_OF_CONCENTRATE_PUMP_STATES = 3 # Number of Concentrate Pump States + # ================================================== Enum Creators: Operations ================================================== + def _create_dd_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_PREG': 4, # Pre-generate Dialysate Mode + 'MODE_GEND': 5, # Generate Dialysate Mode + 'MODE_POSG': 6, # Post-generate Dialysate Mode + 'MODE_HEAT': 7, # Heat Disinfect Mode + 'MODE_HCOL': 8, # Cooling Mode + 'MODE_ROPS': 9, # RO Permeate Sample Mode + 'MODE_NLEG': 10, # Non-legal Mode - an illegitimate mode transition has occurred + 'NUM_OF_DD_MODES': 11, # Number of Modes for the DD + } + return DialinEnum('DDOpModes', members) -@unique -class DDConcentratePumpAttributesEnum(DialinEnum): - CURRENT_STATE = 0 # Current State Concentrate Pump Attribute - CURRENT_SET_SPEED = 1 # Current Set Speed Concentrate Pump Attribute - MEASURED_SPEED = 2 # Measured Speed Concentrate Pump Attribute - TARGET_SPEED = 3 # Target Speed Concentrate Pump Attribute - PULSE_US = 4 # Hall Sensor Pulse Width (in micro seconds) Concentrate Pump Attribute - TARGET_REV_COUNT = 5 # Target Revolutions Concentrate Pump Attribute - MEASURED_REV_COUNT = 6 # Measured Revolutions Concentrate Pump Attribute - PARKED = 7 # Parked Concentrate Pump Attribute - PARK_FAULT = 8 # Park Fault Concentrate Pump Attribute - NUM_OF_D10_D11_CONCENTRATE_PUMP_ATTRIBUTES = 9 # Number of Acid (D11) and Bicarbonate (D10) Concentrate Pump Attributes -@unique -class DDConductivitySensorsEnum(DialinEnum): - D17_COND = 0 # Closed Loop Control of Dosing for D74 Conductivity Sensor - D27_COND = 1 # Closed Loop Control of Dosing for D29 Conductivity Sensor - D29_COND = 2 # Water, Bicarbonate, and Acid Collective Conductivity Sensor - D43_COND = 3 # Self Test Conductivity Sensor (not used for dialysate conductivity) - D74_COND = 4 # Water and Bicarbonate Collective Conductivity Sensor - NUM_OF_CONDUCTIVITY_SENSORS = 5 # Number of Conductivity Sensors + def _create_dd_fault_states(self): + members = { + 'DD_FAULT_STATE_START': 0, # DD fault start state + 'DD_FAULT_DEENERGIZED_STATE': 1, # DD fault de-energized state + 'DD_FAULT_ENERGIZED_STATE': 2, # DD fault energized state + 'NUM_OF_DD_FAULT_STATES': 3, # Number of fault mode states + } + return DialinEnum('DDFaultStates', members) -@unique -class DDDialysatePumpsEnum(DialinEnum): - D12_PUMP = 0 # Fresh Dialysate Pump - D48_PUMP = 1 # Spent Dialysate Pump - NUM_OF_DIALYSATE_PUMPS = 2 # Number of Dialysate Pumps -@unique -class DDDialysatePumpAttributesEnum(DialinEnum): - TARGET_RPM = 0 # Target RPM Dialysate Pump Attribute - MEASURED_SPEED = 1 # Measured Speed Dialysate Pump Attribute - CURRENT_SPEED = 2 # Current Speed Dialysate Pump Attribute - STATE = 3 # State to command Dialysate Pump Attribute - TARGET_PRESSURE = 4 # Target Pressure Dialysate Pump Attribute - MEASURED_PRESSURE = 5 # Measured Pressure Dialysate Pump Attribute - MEASURED_CURRENT = 6 # Measured Current Dialysate Pump Attribute - CONTROL = 7 # Pump Run/Stop Control Pump Attribute - DIRECTION_ERROR_COUNT = 8 # Direction Error Count Dialysate Pump Attribute - MEASURED_DIRECTION = 9 # Measured Direction Dialysate Pump Attribute - NUM_OF_DIALYSATE_PUMP_ATTRIBUTES = 10 # Number of Dialysate Pump Attributes + def _create_dd_fault_nvdata_states(self): + members = { + 'DD_FAULT_STATE_START': 0, # DD fault start state + 'DD_FAULT_STATE_RUN_NV_POSTS': 1, # DD fault run RTC and NV data management post + 'DD_FAULT_STATE_COMPLETE': 2, # DD fault complete + 'NUM_OF_DD_FAULT_NVDATA_STATES': 3, # Number of fault mode NV Data management states + } + return DialinEnum('DDFaultNVDataStates', members) -@unique -class DDDialysatePumpsStates(DialinEnum): - DIALYSATE_PUMP_OFF_STATE = 0 # Dialysate Pump Off State - DIALYSATE_PUMP_RAMP_UP_STATE = 1 # Dialysate Pump Ramp Up State - DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE = 2 # Dialysate Pump Control to Target State - NUM_OF_DIALYSATE_PUMP_STATES = 3 # Number of Dialysate Pump States -@unique -class DDHeatersStartStop(DialinEnum): - STOP = 0 - START = 1 + def _create_dd_service_states(self): + members = { + 'DD_SERVICE_STATE_START': 0, # Start service mode state + 'NUM_OF_DD_SERVICE_STATES': 1, # Number of service mode states + } + return DialinEnum('DDServiceStates', members) -@unique -class DDHeatersState(DialinEnum): - DD_HEAT_DISINFECT_STATE_START = 0 # Heat disinfect, start mode state - DD_HEAT_DISINFECT_STATE_COMPLETE = 1 # Heat disinfect, complete state - NUM_OF_DD_HEAT_DISINFECT_STATES = 2 # Number of heat disinfect mode states -@unique -class DDHeatersExecState(DialinEnum): - HEATER_EXEC_STATE_OFF = 0 # Heater Execution Off State - HEATER_EXEC_STATE_RAMP_TO_TARGET = 1 # Heater Execution Ramp to Target State - HEATER_EXEC_STATE_CONTROL_TO_TARGET = 2 # Heater Execution Control to Target State - HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET = 3 # Heater Execution Control to Disinfection State - NUM_OF_HEATERS_EXEC_STATE = 4 + def _create_dd_init_states(self): + members = { + 'DD_POST_STATE_START': 0, # Post Generate Dialysate Start State + 'DD_POST_STATE_FW_COMPATIBILITY': 1, # Firmware Compatibility State + 'DD_POST_STATE_FW_INTEGRITY': 2, # Firmware Integrity State + 'DD_POST_STATE_FPGA': 3, # FPGA State + 'DD_POST_STATE_NVDATAMGMT': 4, # Non-volatile Data Management State + 'DD_POST_STATE_TEMPERATURE_SENSORS': 5, # Temperature Sensors State + 'DD_POST_STATE_PRESSURES': 6, # Pressure Sensors State + 'DD_POST_STATE_DIALYSATE_PUMPS': 7, # Dialysate Pumps State + 'DD_POST_STATE_CONCENTRATE_PUMPS': 8, # Concentrate Pumps State + 'DD_POST_STATE_CONDUCTIVITY_SENSORS': 9, # Conductivity Sensors State + 'DD_POST_STATE_WATCHDOG': 10, # Watchdog State + 'DD_POST_STATE_SAFETY_SHUTDOWN': 11, # Safety Shutdown State + 'DD_POST_STATE_COMPLETED': 12, # Post Generate Dialysate Completed State + 'DD_POST_STATE_FAILED': 13, # Post Generate Dialysate Fail State + 'NUM_OF_DD_POST_STATES': 14, # Number of Post Generate Dialysate States + } + return DialinEnum('DDInitStates', members) -@unique -class DDHeatersNames(DialinEnum): - D5_HEAT = 0 # Primary heater - D45_HEAT = 1 # Trimmer heater - NUM_OF_DD_HEATERS = 2 # Number of Heaters -@unique -class DDHeatersAttributesEnum(DialinEnum): - HEAT_DUTY_CYCLE = 0 # Heat Duty Cycle Attribute for Heaters - HEAT_TARGET_TEMP = 1 # Target Temperature Attribute for Heaters - HEAT_STATE = 2 # State to command Attribute for Heaters - DUTY_CYCLE_COUNT = 3 # Duty Cycle Count Attribute for Heaters - PWM_PERIOD = 4 # Pulse Width Modulation Attribute for Heaters - ADJUSTED_TARGET_TEMP = 5 # Adjusted Target Temperature Attribute for Heaters - TARGET_TEMP_TD = 6 # Target Temperature Attribute for Heaters - NUM_OF_DD_HEATER_ATTRIBUTES = 7 # Number of Heater Attributes + def _create_dd_standby_states(self): + members = { + 'DD_STANDBY_MODE_STATE_IDLE': 0, # Idle standby mode state + 'DD_STANDBY_MODE_STATE_PAUSE': 1, # Pause state + 'NUM_OF_DD_STANDBY_MODE_STATES': 2, # Number of standby mode states + } + return DialinEnum('DDStandbyStates', members) -@unique -class DDHeatersCoolingStates(DialinEnum): - NUM_OF_DD_HEAT_COOL_STATES = 0 # TODO: populate with heater cooling states -@unique -class DDLevelSensorEnum(DialinEnum): - D6_LEVEL = 0 # floater switch low, medium and high status - D63_LEVEL = 1 # bicarb level low or high status - D46_LEVEL = 2 # Spent dialysate air separation chamber level low or high status - NUM_OF_LEVELS = 3 # Number of Level Sensors + def _create_dd_pregen_states(self): + members = { + 'DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK': 0, # DD Pre-Gen Dialysate hyrochamber fill check + 'DD_PRE_GEN_WET_SELF_TEST': 1, # DD Pre-Gen Wet Self Test + 'DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND': 2, # DD Pre-Gen Dialysate Wait for Gen Dialysate state transition + 'NUM_OF_DD_PRE_GEN_DIALYSATE_STATES': 3, # Number of Pre-Gen Dialysate mode states + } -@unique -class DDPistonPumpsEnum(DialinEnum): - ACID = 0 # Acid piston pump - BICARB = 1 # Bicarbonate piston pump - UF = 2 # Ultrafiltration piston pump - NUM_OF_PISTON_PUMPS = 3 # Number of piston pumps + return DialinEnum('DDPreGenDialysateStates', members) -@unique -class DDPistonPumpAttributesEnum(DialinEnum): - CONTROL_STATE = 0 # Control State for the Piston Pumps - SW_COUNTER = 1 # Software counter attribute for the Piston Pumps - CYCLE_COUNTER = 2 # Cycle Counter for the Piston Pumps - NUM_OF_PISTON_PUMP_ATTRIBUTES = 3 # Number of Piston Pump Attributes -@unique -class DDPressureNames(DialinEnum): - # Pressure Sensor IDs - D9_PRES = 0 # Hydraulics outlet pressure (PHo/Pn) - D66_PRES = 1 # Dry Bicarb pressure (PDB/PCb) - D51_PRES = 2 # Spent Dialysate pressure (PDs) - D18_PRES = 3 # Fresh Dialysate pressure (PDf) - D41_PRES = 4 # Transmembrane pressure (Ptm) - NUM_OF_PRESSURE_SENSORS = 5 # Number of pressure sensors + def _create_dd_gen_states(self): + members = { + 'DD_GEND_STATE_START': 0, # Gen dialysate start state + 'DD_GEND_DIALYSATE_BYPASS_STATE': 1, # Gen dialysate - Bypass dialysate state + 'DD_GEND_DIALYSATE_DELIVERY_STATE': 2, # Gen dialysate - deliver dialysate state + 'DD_GEND_ISOLATED_UF_STATE': 3, # Gen dialysate - Isolated ultrafiltration state + 'DD_GEND_SPENT_CHAMBER_FILL_STATE': 4, # Gen dialysate - spent chamber fill state + 'DD_GEND_BICARB_CHAMBER_FILL_STATE': 5, # Gen dialysate - bicarb chamber fill state + 'DD_GEND_DIALYSATE_DELIVERY_PAUSE': 6, # Gen dialysate - dialysate delivery pause state + 'NUM_OF_DD_GEND_MODE_STATES': 7, # Number of gen dialysate states + } -COND_SENSOR_INDEX_OFFSET = 6 # Conductivity Sensor Index Offset for the Temperature Readings -PRES_SENSOR_INDEX_OFFSET = 15 # Pressure Sensors Offset for Temperature Readings + return DialinEnum('DDGenDialysateModeStates', members) -@unique -class DDROPermeateStates(DialinEnum): - NUM_OF_RO_PERMEATE_STATES = 0 # TODO: populate with RO Permeate states -@unique -class DDTemperaturesNames(DialinEnum): - D1_TEMP = 0 # Heat exchanger Inlet temperature sensor - D78_TEMP = 1 # Heat exchanger Outlet temperature sensor - D4_TEMP = 2 # Hydraulics primary heater temperature sensor - D50_TEMP = 3 # Trimmer heater temperature sensor - BRD_TEMP = 4 # Barometric temperature sensor - D16_TEMP = 5 # D16 Conductivity sensor temperature value - D28_TEMP = 6 # D28 Conductivity sensor temperature value - D30_TEMP = 7 # D30 Conductivity sensor temperature value - D44_TEMP = 8 # D44 Conductivity sensor temperature value - D75_TEMP = 9 # D75 Conductivity sensor temperature value - D4_AVG_TEMP = 10 # D4 Filtered value - D50_AVG_TEMP = 11 # D50 Filtered value - D28_AVG_TEMP = 12 # D28 Filtered value - D30_AVG_TEMP = 13 # D30 Filtered value - D9_TEMP = 14 # D9 Pressure sensor temperature value - D66_TEMP = 15 # D66 Pressure sensor temperature value - D51_TEMP = 16 # D51 Pressure sensor temperature value - D18_TEMP = 17 # D18 Pressure sensor temperature value - D41_TEMP = 18 # D41 Pressure sensor temperature value - NUM_OF_TEMP_SENSORS = 19 # Number of Temperature Sensors + def _create_dd_postgen_states(self): + members = { + 'DD_POST_GEN_DIALYSATE_STATE_START': 0, # DD Post-Gen Dialysate state start + 'DD_POST_GEN_DIALYSATE_STATE_COMPLETE': 1, # DD Post-Gen Dialysate complete state + 'NUM_OF_DD_POST_GEN_DIALYSATE_STATES': 2, # Number of Post-Gen Dialysate mode states + } -@unique -class DDValveStates(DialinEnum): - VALVE_STATE_CLOSED = 0 # Valve Closed State - VALVE_STATE_OPEN = 1 # Valve Open State + return DialinEnum('DDPostGenDialysateState', members) -@unique -class DDValveNames(DialinEnum): - D14_VALV = 0 # Valve Hydraulics Outlet (D14) - D52_VALV = 1 # Valve Thermal Disinfect (D52) - D8_VALV = 2 # Valve Hydraulics Bypass (D8) - D54_VALV = 3 # Valve Rinse Port (D54) - D53_VALV = 4 # Valve Drain (D53) - D34_VALV = 5 # Valve Dialyzer Bypass (D34) - D64_VALV = 6 # Valve Purge 1 (D64) - D31_VALV = 7 # Valve Pressure Test (D31) - D65_VALV = 8 # Valve DryBcarb Inlet (D65) - D35_VALV = 9 # Valve Dialyzer Inlet (D35) - D40_VALV = 10 # Valve Dialyzer Outlet (D40) - D47_VALV = 11 # Valve Dialysate Out Purge 2 (D47) - D3_VALV = 12 # Valve Hydraulics Inlet (D3) - D80_VALV = 13 # Valve Dry Bicarb (D80) - D81_VALV = 14 # Valve De-scaler (D81) - RSRVD_SPACE1 = 15 # This space has been reserved - D23_VALV = 16 # Balancing chamber Valve 1 (D23) - D19_VALV = 17 # Balancing chamber Valve 2 (D19) - D25_VALV = 18 # Balancing chamber Valve 3 (D25) - D21_VALV = 19 # Balancing chamber Valve 4 (D21) - D24_VALV = 20 # Balancing chamber Valve 5 (D24) - D20_VALV = 21 # Balancing chamber Valve 6 (D20) - D26_VALV = 22 # Balancing chamber Valve 7 (D26) - D22_VALV = 23 # Balancing chamber Valve 8 (D22) - D79_PMP_VALV = 24 # D79 pump mapped to spare valve 0 - SPARE1_VALV = 25 # Spare Valve 1 - SPARE2_VALV = 26 # Spare Valve 2 - SPARE3_VALV = 27 # Spare Valve 3 - SPARE4_VALV = 28 # Spare Valve 4 - SPARE5_VALV = 29 # Spare Valve 5 - SPARE6_VALV = 30 # Spare Valve 6 - SPARE7_VALV = 31 # Spare Valve 7 - M4_VALV = 32 # First IO valve (M4) - M12_VALV = 33 # Last IO valve IO valve (M12) - P11_VALV = 34 # First FP Valve (P11) - P33_VALV = 35 # FP Valve (P33) - P34_VALV = 36 # FP Valve (P34) - P37_VALV = 37 # FP Valve (P37) - P39_VALV = 38 # FP Valve (P39) - P6_VALV = 39 # Last FP Valve (P6) - NUM_OF_DD_VALVES = 40 # Number of Valves for the DD -@unique -class DDNotLegalStates(DialinEnum): - NUM_OF_NOT_LEGAL_STATES = 0 # TODO: populate with Not Legal states + def _create_dd_heat_disinfect_states(self): + members = { + 'DD_HEAT_DISINFECT_STATE_START': 0, # Heat disinfect, start mode state + 'DD_HEAT_DISINFECT_STATE_COMPLETE': 1, # Heat disinfect, complete state + 'NUM_OF_DD_HEAT_DISINFECT_STATES': 2 # Number of heat disinfect mode states + } + return DialinEnum('DDHeatDisinfectState', members) -@unique -class DDMonitoredVoltages(DialinEnum): - MONITORED_LINE_1_2V = 0 # Processor voltage (1.2V) - MONITORED_LINE_3_3V = 1 # Logic voltage (3.3V) - MONITORED_LINE_5V_LOGIC = 2 # Logic voltage (5V) - MONITORED_LINE_24V_1 = 3 # Actuators voltage (24V) - MONITORED_LINE_24V_2 = 4 # Actuators regen voltage (24V) - MONITORED_LINE_FPGA_VCC_V = 5 # FPGA Vcc (3V) - MONITORED_LINE_FPGA_AUX_V = 6 # FPGA Vaux (3V) - MONITORED_LINE_FPGA_PVN_V = 7 # FPGA Vpvn (1V) - NUM_OF_MONITORED_VOLTAGE_LINES = 8 # Number of TD operation modes \ No newline at end of file + + def _create_dd_heater_cooling_states(self): + members = { + 'NUM_OF_DD_HEAT_COOL_STATES': 0, # Number of Heater Cooling states + } + return DialinEnum('DDHeaterCoolingStates', members) + + + def _create_dd_ro_permeate_states(self): + members = { + 'NUM_OF_RO_PERMEATE_STATES': 0, # Number of RO Permeate states + } + return DialinEnum('DDROPermeateStates', members) + + + def _create_dd_not_legal_states(self): + members = { + 'NUM_OF_NOT_LEGAL_STATES': 0, # Number of Not Legal states + } + return DialinEnum('DDNotLegalStates', members) + + + def _create_dd_event_list(self): + members = { + 'DD_EVENT_STARTUP': 0, # DD startup event + 'DD_EVENT_OP_MODE_CHANGE': 1, # DD Op mode change event + 'DD_EVENT_SUB_MODE_CHANGE': 2, # DD Op sub-mode change event + 'DD_EVENT_OPERATION_STATUS': 3, # DD operation status event + 'DD_EVENT_D6_LEVL_CHANGE': 4, # DD floater level change event + 'DD_EVENT_D63_LEVL_CHANGE': 5, # DD bicarb level change event + 'DD_EVENT_D46_LEVL_CHANGE': 6, # DD spent dialysate air seperation level change event + 'DD_EVENT_TD_COMMUNICATION_LOSS': 7, # DD TD communication loss + 'DD_EVENT_TEMPERATURE_DRIFT': 8, # DD dialysate temperature drift + 'DD_EVENT_BLOOD_LEAK_ZEROING_REQUEST': 9, # DD blood leak zeroing request + 'DD_EVENT_BLOOD_LEAK_ZEROING_REQUIRED': 10, # DD blood leak zeroing required + 'DD_EVENT_BLOOD_LEAK_NUM_OF_SET_POINT_CHECK_FAILURES': 11, # DD blood leak number of setpoint check failures + 'DD_EVENT_BLOOD_LEAK_SELF_TEST_RESULT': 12, # DD blood leak self test result + 'NUM_OF_DD_EVENT_IDS': 13, # Total number of DD events + } + return DialinEnum('DDEventList', members) + + + def _create_dd_event_data_types(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 + } + return DialinEnum('DDEventDataTypes', members) + + + + # ================================================== Enum Creators: Names ================================================== + def _create_dd_concentrate_pump_names(self): + members = { + 'D11_CP1_ACID': 0, # Acid Concentrate Pump + 'D10_CP2_BICARB': 1, # Bicarbonate Concentrate Pump + 'D76_UF': 2, # Ultrafiltration Concentrate Pump + 'NUM_OF_CONCENTRATE_PUMPS': 3, # Number of Concentrate Pumps + } + return DialinEnum('DDConcentratePumpNames', members) + + + def _create_dd_conductivity_sensor_names(self): + members = { + 'D17_COND': 0, # Closed Loop Control of Dosing for D74 Conductivity Sensor + 'D27_COND': 1, # Closed Loop Control of Dosing for D29 Conductivity Sensor + 'D29_COND': 2, # Water, Bicarbonate, and Acid Collective Conductivity Sensor + 'D43_COND': 3, # Self Test Conductivity Sensor (not used for dialysate conductivity) + 'D74_COND': 4, # Water and Bicarbonate Collective Conductivity Sensor + 'NUM_OF_CONDUCTIVITY_SENSORS': 5 # Number of Conductivity Sensors + } + return DialinEnum('DDConductivitySensorNames', members) + + + def _create_dd_dialysate_pump_names(self): + members = { + 'D12_PUMP': 0, # Fresh Dialysate Pump + 'D48_PUMP': 1, # Spent Dialysate Pump + 'NUM_OF_DIALYSATE_PUMPS': 2, # Number of Dialysate Pumps + } + return DialinEnum('DDDialysatePumpNames', members) + + + def _create_dd_heater_names(self): + members = { + 'D5_HEAT': 0, # Primary heater + 'D45_HEAT': 1, # Trimmer heater + 'NUM_OF_DD_HEATERS': 2, # Number of Heaters + } + return DialinEnum('DDHeaterNames', members) + + + def _create_dd_level_sensor_names(self): + members = { + 'D6_LEVEL': 0, # floater switch low, medium and high status + 'D63_LEVEL': 1, # bicarb level low or high status + 'D46_LEVEL': 2, # Spent dialysate air separation chamber level low or high status + 'NUM_OF_LEVELS': 3, # Number of Level Sensors + } + return DialinEnum('DDLevelSensorNames', members) + + + def _create_dd_piston_pump_names(self): + members = { + 'ACID': 0, # Acid piston pump + 'BICARB': 1, # Bicarbonate piston pump + 'UF': 2, # Ultrafiltration piston pump + 'NUM_OF_PISTON_PUMPS': 3, # Number of piston pumps + } + return DialinEnum('DDPistonPumpNames', members) + + + def _create_dd_pressure_sensor_names(self): + if GlobalVariables().NEXT_GEN_HW == True: + members = { + 'D9_PRES': 0, # Hydraulics outlet pressure (PHo/Pn) + 'D66_PRES': 1, # Dry Bicarb pressure (PDB/PCb) + 'D51_PRES': 2, # Spent Dialysate pressure (PDs) + 'D18_PRES': 3, # Fresh Dialysate pressure (PDf) + 'D41_PRES': 4, # Transmembrane pressure (Ptm) + 'D87_PRES': 5, # D87 Pressure Sensor + 'NUM_OF_PRESSURE_SENSORS': 6, # Number of pressure sensors + } + else: + members = { + 'D9_PRES': 0, # Hydraulics outlet pressure (PHo/Pn) + 'D66_PRES': 1, # Dry Bicarb pressure (PDB/PCb) + 'D51_PRES': 2, # Spent Dialysate pressure (PDs) + 'D18_PRES': 3, # Fresh Dialysate pressure (PDf) + 'D41_PRES': 4, # Transmembrane pressure (Ptm) + 'NUM_OF_PRESSURE_SENSORS': 5, # Number of pressure sensors + } + return DialinEnum('DDPressureSensorNames', members) + + + def _create_dd_temperature_sensor_names(self): + if GlobalVariables().NEXT_GEN_HW == True: + members = { + 'D1_TEMP': 0, # Heat exchanger Inlet temperature sensor + 'D78_TEMP': 1, # Heat exchanger Outlet temperature sensor + 'D4_TEMP': 2, # Hydraulics primary heater temperature sensor + 'D50_TEMP': 3, # Trimmer heater temperature sensor + 'BRD_TEMP': 4, # Barometric temperature sensor + 'D16_TEMP': 5, # D16(D17) Conductivity sensor temperature value + 'D28_TEMP': 6, # D28(D27) Conductivity sensor temperature value + 'D30_TEMP': 7, # D30(D29) Conductivity sensor temperature value + 'D44_TEMP': 8, # D44(D43) Conductivity sensor temperature value + 'D75_TEMP': 9, # D75(D74) Conductivity sensor temperature value + 'D99_TEMP': 10, # D98(D99) Conductivity sensor temperature value + 'D4_AVG_TEMP': 11, # D4 Filtered value + 'D50_AVG_TEMP': 12, # D50 Filtered value + 'D28_AVG_TEMP': 13, # D28 Filtered value + 'D30_AVG_TEMP': 14, # D30 Filtered value + 'D99_AVG_TEMP': 15, # D99 Filtered value + 'D9_TEMP': 16, # D9 Pressure sensor temperature value + 'D66_TEMP': 17, # D66 Pressure sensor temperature value + 'D51_TEMP': 18, # D51 Pressure sensor temperature value + 'D18_TEMP': 19, # D18 Pressure sensor temperature value + 'D41_TEMP': 20, # D41 Pressure sensor temperature value + 'D87_TEMP': 21, # D87 Pressure sensor temperature value + 'NUM_OF_TEMP_SENSORS': 22, # Number of Temperature Sensors + } + else: + members = { + 'D1_TEMP': 0, # Heat exchanger Inlet temperature sensor + 'D78_TEMP': 1, # Heat exchanger Outlet temperature sensor + 'D4_TEMP': 2, # Hydraulics primary heater temperature sensor + 'D50_TEMP': 3, # Trimmer heater temperature sensor + 'BRD_TEMP': 4, # Barometric temperature sensor + 'D16_TEMP': 5, # D16(D17) Conductivity sensor temperature value + 'D28_TEMP': 6, # D28(D27) Conductivity sensor temperature value + 'D30_TEMP': 7, # D30(D29) Conductivity sensor temperature value + 'D44_TEMP': 8, # D44(D43) Conductivity sensor temperature value + 'D75_TEMP': 9, # D75(D74) Conductivity sensor temperature value + 'D4_AVG_TEMP': 10, # D4 Filtered value + 'D50_AVG_TEMP': 11, # D50 Filtered value + 'D28_AVG_TEMP': 12, # D28 Filtered value + 'D30_AVG_TEMP': 13, # D30 Filtered value + 'D9_TEMP': 14, # D9 Pressure sensor temperature value + 'D66_TEMP': 15, # D66 Pressure sensor temperature value + 'D51_TEMP': 16, # D51 Pressure sensor temperature value + 'D18_TEMP': 17, # D18 Pressure sensor temperature value + 'D41_TEMP': 18, # D41 Pressure sensor temperature value + 'NUM_OF_TEMP_SENSORS': 19, # Number of Temperature Sensors + } + created_enum = DialinEnum('DDTemperatureSensorNames', members) + + # Add aliases + extend_enum(created_enum, 'FIRST_PRESSURE_SENSOR', created_enum.D9_TEMP.value) + extend_enum(created_enum, 'LAST_PRESSURE_SENSOR', created_enum.D87_TEMP.value if GlobalVariables.NEXT_GEN_HW == True else created_enum.D41_TEMP.value) + extend_enum(created_enum, 'FIRST_CONDUCTIVITY_SENSOR', created_enum.D16_TEMP.value) + extend_enum(created_enum, 'LAST_CONDUCTIVITY_SENSOR', created_enum.D99_TEMP.value if GlobalVariables.NEXT_GEN_HW == True else created_enum.D75_TEMP.value) + + # Add aliases to be searchable (listed when pressed TAB) + created_enum._member_names_.append('FIRST_PRESSURE_SENSOR') + created_enum._member_names_.append('LAST_PRESSURE_SENSOR') + created_enum._member_names_.append('FIRST_CONDUCTIVITY_SENSOR') + created_enum._member_names_.append('LAST_CONDUCTIVITY_SENSOR') + + return created_enum + + + def _create_dd_valve_names(self): + members = { + 'D14_VALV': 0, # Valve Hydraulics Outlet (D14) + 'D52_VALV': 1, # Valve Thermal Disinfect (D52) + 'D8_VALV': 2, # Valve Hydraulics Bypass (D8) + 'D54_VALV': 3, # Valve Rinse Port (D54) + 'D53_VALV': 4, # Valve Drain (D53) + 'D34_VALV': 5, # Valve Dialyzer Bypass (D34) + 'D64_VALV': 6, # Valve Purge 1 (D64) + 'D31_VALV': 7, # Valve Pressure Test (D31) + 'D65_VALV': 8, # Valve DryBcarb Inlet (D65) + 'D35_VALV': 9, # Valve Dialyzer Inlet (D35) + 'D40_VALV': 10, # Valve Dialyzer Outlet (D40) + 'D47_VALV': 11, # Valve Dialysate Out Purge 2 (D47) + 'D3_VALV': 12, # Valve Hydraulics Inlet (D3) + 'D80_VALV': 13, # Valve Dry Bicarb (D80) + 'D81_VALV': 14, # Valve De-scaler (D81) + 'RSRVD_SPACE1': 15, # This space has been reserved + 'D23_VALV': 16, # Balancing chamber Valve 1 (D23) + 'D19_VALV': 17, # Balancing chamber Valve 2 (D19) + 'D25_VALV': 18, # Balancing chamber Valve 3 (D25) + 'D21_VALV': 19, # Balancing chamber Valve 4 (D21) + 'D24_VALV': 20, # Balancing chamber Valve 5 (D24) + 'D20_VALV': 21, # Balancing chamber Valve 6 (D20) + 'D26_VALV': 22, # Balancing chamber Valve 7 (D26) + 'D22_VALV': 23, # Balancing chamber Valve 8 (D22) + 'D79_PMP_VALV': 24, # D79 pump mapped to Spare Valve 0 + 'D83_VALV': 25, # D83 De-scaler Valve mapped to Spare Valve 1 + 'D91_VALV': 26, # D91 De-scaler Valve mapped to Spare Valve 2 + 'SPARE3_VALV': 27, # Spare Valve 3 + 'SPARE4_VALV': 28, # Spare Valve 4 + 'SPARE5_VALV': 29, # Spare Valve 5 + 'D100_VALV': 30, # D100 De-scaler Valve mapped to Spare Valve 6 + 'SPARE7_VALV': 31, # Spare Valve 7 + 'NUM_OF_DD_VALVES': 32, # Number of Valves for the DD + } + return DialinEnum('DDValveNames', members) + + + def _create_dd_monitored_voltages(self): + members = { + 'MONITORED_LINE_1_2V': 0, # Processor voltage (1.2V) + 'MONITORED_LINE_3_3V': 1, # Logic voltage (3.3V) + 'MONITORED_LINE_5V_LOGIC': 2, # Logic voltage (5V) + 'MONITORED_LINE_24V_1': 3, # Actuators voltage (24V) + 'MONITORED_LINE_24V_2': 4, # Actuators regen voltage (24V) + 'MONITORED_LINE_FPGA_VCC_V': 5, # FPGA Vcc (3V) + 'MONITORED_LINE_FPGA_AUX_V': 6, # FPGA Vaux (3V) + 'MONITORED_LINE_FPGA_PVN_V': 7, # FPGA Vpvn (1V) + 'NUM_OF_MONITORED_VOLTAGE_LINES': 8, # Number of TD operation modes + } + return DialinEnum('DDMonitoredVoltages', members) + + + + # ================================================== Enum Creators: Support ================================================== + def _create_dd_balancing_chamber_states(self): + members = { + 'BAL_CHAMBER_STATE_START': 0, # Initial state of balancing chamber + 'BAL_CHAMBER_STATE1_FILL_START': 1, # Balancing chamber state 1 fill start state + 'BAL_CHAMBER_STATE1_BICARB_ACID_DOSING_CNTRL': 2, # Balancing Chamber state 1 Bicarb and acid dosing control state + 'BAL_CHAMBER_STATE1_FILL_END': 3, # Balancing Chamber state 1 fill end state + 'BAL_CHAMBER_STATE2_FILL_START': 4, # Balancing chamber state 2 fill start state + 'BAL_CHAMBER_STATE2_BICARB_ACID_DOSING_CNTRL': 5, # Balancing Chamber state 2 Bicarb and acid dosing control state + 'BAL_CHAMBER_STATE2_FILL_END': 6, # Balancing Chamber state 2 fill end state + 'NUM_OF_BAL_CHAMBER_EXEC_STATES': 7, # Number of balancing chamber states + } + return DialinEnum('DDBalancingChamberStates', members) + + + def _create_dd_balancing_chamber_switch_states(self): + members = { + 'BAL_CHAMBER_SW_STATE1': 0, # Balancing chamber switching state 1 (V2,V5 and V3, V8 open, rest closed) + 'BAL_CHAMBER_SW_STATE2': 1, # Balancing chamber switching state 2 ( V1,V6 and V4, V7 open, rest closed) + 'NUM_OF_BAL_CHAMBER_SW': 2, # Number of balancing chamber states + } + return DialinEnum('DDBalancingChamberSwitchStates', members) + + + def _create_dd_blood_leak_states(self): + members = { + 'BLOOD_LEAK_WAIT_FOR_POST_STATE': 0, # + 'BLOOD_LEAK_CHECK_SET_POINT_STATE': 1, # + 'BLOOD_LEAK_INIT_STATE': 2, # + 'BLOOD_LEAK_CHECK_ZERO_AND_SELF_TEST_STATE': 3, # + 'BLOOD_LEAK_VERIFY_INTENSITY_AFTER_ZEROING_STATE': 4, # + 'BLOOD_LEAK_NORMAL_STATE': 5, # + 'BLOOD_LEAK_RECOVER_BLOOD_DETECT_STATE': 6, # + 'NUM_OF_BLOOD_LEAK_STATES': 7, # Number of blood leak states + } + return DialinEnum('DDBloodLeakStates', members) + + + def _create_dd_concentrate_pump_attributes(self): + members = { + 'CURRENT_STATE': 0, # Current State Concentrate Pump Attribute + 'CURRENT_SET_SPEED': 1, # Current Set Speed Concentrate Pump Attribute + 'MEASURED_SPEED': 2, # Measured Speed Concentrate Pump Attribute + 'TARGET_SPEED': 3, # Target Speed Concentrate Pump Attribute + 'PULSE_US': 4, # Hall Sensor Pulse Width (in micro seconds) Concentrate Pump Attribute + 'TARGET_REV_COUNT': 5, # Target Revolutions Concentrate Pump Attribute + 'MEASURED_REV_COUNT': 6, # Measured Revolutions Concentrate Pump Attribute + 'PARKED': 7, # Parked Concentrate Pump Attribute + 'PARK_FAULT': 8, # Park Fault Concentrate Pump Attribute + 'NUM_OF_D10_D11_CONCENTRATE_PUMP_ATTRIBUTES': 9, # Number of Acid (D11) and Bicarbonate (D10) Concentrate Pump Attributes + } + return DialinEnum('DDConcentratePumpAttributes', members) + + + def _create_dd_concentrate_pump_states(self): + members = { + 'CONCENTRATE_PUMP_OFF_STATE': 0, # Concentrate Pump Off State + 'CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE': 1, # Ramp to Target Speed Concentrate Pump State + 'CONCENTRATE_PUMP_CONTROL_TARGET_SPEED_STATE': 2, # Control Target Speed Concentrate Pump State + 'NUM_OF_CONCENTRATE_PUMP_STATES': 3, # Number of Concentrate Pump States + } + return DialinEnum('DDConcentratePumpStates', members) + + + def _create_dd_dialysate_pump_attributes(self): + members = { + 'TARGET_RPM': 0, # Target RPM Dialysate Pump Attribute + 'MEASURED_SPEED': 1, # Measured Speed Dialysate Pump Attribute + 'CURRENT_SPEED': 2, # Current Speed Dialysate Pump Attribute + 'STATE': 3, # State to command Dialysate Pump Attribute + 'TARGET_PRESSURE': 4, # Target Pressure Dialysate Pump Attribute + 'MEASURED_PRESSURE': 5, # Measured Pressure Dialysate Pump Attribute + 'MEASURED_CURRENT': 6, # Measured Current Dialysate Pump Attribute + 'CONTROL': 7, # Pump Run/Stop Control Pump Attribute + 'DIRECTION_ERROR_COUNT': 8, # Direction Error Count Dialysate Pump Attribute + 'MEASURED_DIRECTION': 9, # Measured Direction Dialysate Pump Attribute + 'NUM_OF_DIALYSATE_PUMP_ATTRIBUTES': 10, # Number of Dialysate Pump Attributes + } + return DialinEnum('DDDialysatePumpAttributes', members) + + + def _create_dd_dialysate_pump_states(self): + members = { + 'DIALYSATE_PUMP_OFF_STATE': 0, # Dialysate Pump Off State + 'DIALYSATE_PUMP_RAMP_UP_STATE': 1, # Dialysate Pump Ramp Up State + 'DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE': 2, # Dialysate Pump Control to Target State + 'NUM_OF_DIALYSATE_PUMP_STATES': 3, # Number of Dialysate Pump States + } + return DialinEnum('DDDialysatePumpsStates', members) + + + def _create_dd_heater_start_stop(self): + return DialinEnum('DDHeaterStartStop', {'STOP': 0, 'START': 1}) + + + def _create_dd_heater_attributes(self): + members = { + 'HEAT_DUTY_CYCLE': 0, # Heat Duty Cycle Attribute for Heaters + 'HEAT_TARGET_TEMP': 1, # Target Temperature Attribute for Heaters + 'HEAT_STATE': 2, # State to command Attribute for Heaters + 'DUTY_CYCLE_COUNT': 3, # Duty Cycle Count Attribute for Heaters + 'PWM_PERIOD': 4, # Pulse Width Modulation Attribute for Heaters + 'ADJUSTED_TARGET_TEMP': 5, # Adjusted Target Temperature Attribute for Heaters + 'TARGET_TEMP_TD': 6, # Target Temperature Attribute for Heaters + 'NUM_OF_DD_HEATER_ATTRIBUTES': 7, # Number of Heater Attributes + } + return DialinEnum('DDHeaterAttributes', members) + + + def _create_dd_heater_exec_states(self): + members = { + 'HEATER_EXEC_STATE_OFF': 0, # Heater Execution Off State + 'HEATER_EXEC_STATE_RAMP_TO_TARGET': 1, # Heater Execution Ramp to Target State + 'HEATER_EXEC_STATE_CONTROL_TO_TARGET': 2, # Heater Execution Control to Target State + 'HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET': 3, # Heater Execution Control to Disinfection State + 'NUM_OF_HEATERS_EXEC_STATE': 4, # Number of Heater Execution States + } + return DialinEnum('DDHeaterExecState', members) + + + def _create_dd_piston_pump_attributes(self): + members = { + 'CONTROL_STATE': 0, # Control State for the Piston Pumps + 'SW_COUNTER': 1, # Software counter attribute for the Piston Pumps + 'CYCLE_COUNTER': 2, # Cycle Counter for the Piston Pumps + 'NUM_OF_PISTON_PUMP_ATTRIBUTES': 3, # Number of Piston Pump Attributes + } + return DialinEnum('DDPistonPumpAttributes', members) + + + def _create_dd_valve_states(self): + members = { + 'VALVE_STATE_CLOSED': 0, # Valve Closed State + 'VALVE_STATE_OPEN': 1, # Valve Open State + } + return DialinEnum('DDValveStates', members) + + + +# ================================================== Creates a singleton ================================================== +dd_enum_repository = DD_Defs() + +# Attach listener to update function +test_config_change.add_listener(dd_enum_repository.update_enums) Index: leahi_dialin/common/fp_defs.py =================================================================== diff -u -re60ad12bcc58d5905d7268bbeaae139d8233e023 -r55d97b27c73f8e08994328881d3f56cbc7f00e29 --- leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision e60ad12bcc58d5905d7268bbeaae139d8233e023) +++ leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 55d97b27c73f8e08994328881d3f56cbc7f00e29) @@ -8,13 +8,12 @@ # @file fp_defs.py # # @author (last) Zoltan Miskolci -# @date (last) 04-Dec-2025 +# @date (last) 12-Jan-2026 # @author (original) Peter Lucia # @date (original) 22-Jun-2021 # ############################################################################ -from enum import unique from aenum import extend_enum from typing import TYPE_CHECKING @@ -25,12 +24,12 @@ class FP_Defs: - # This is for the editor to recognize the enums for autocomplete + # IDE autocomplete suppor if TYPE_CHECKING: FPOpModes: DialinEnum + FPFaultStates: DialinEnum FPServiceStates: DialinEnum FPPostStates: DialinEnum - FPFaultStates: DialinEnum FPStandbyStates: DialinEnum FPPreGenPermeateStates: DialinEnum FPPreGenPDefStates: DialinEnum @@ -39,6 +38,7 @@ FPNotLegalStates: DialinEnum FPEventList: DialinEnum FPEventDataTypes: DialinEnum + FPBoostPumpNames: DialinEnum FPConductivitySensorNames: DialinEnum FPRORejectionRatioNames: DialinEnum @@ -49,29 +49,30 @@ FPTemperatureSensorNames: DialinEnum FPValveNames: DialinEnum FPAllPumpNames: DialinEnum + FPFloaterLevels: DialinEnum FPPumpAttributes: DialinEnum FPValveStates: DialinEnum - - # A Dictionary storing which Property(Enum) should be created by which function _properties = { - # Operation related enums + # Operation / State enums 'FPOpModes': '_create_fp_operation_modes', + 'FPFaultStates': '_create_fp_fault_states', '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', + + # Event enums + 'FPEventList': '_create_fp_eventlist', + 'FPEventDataTypes': '_create_fp_event_data_types', - # Module Names related enums + # Module Names enums 'FPBoostPumpNames': '_create_fp_boost_pump_names', 'FPConductivitySensorNames': '_create_fp_conductivity_sensor_names', 'FPRORejectionRatioNames': '_create_fp_ro_rejection_ratio_names', @@ -83,7 +84,7 @@ 'FPAllPumpNames': '_create_fp_all_pump_names', 'FPTemperatureSensorNames': '_create_fp_temperature_sensor_names', - # Module Support enums + # Support enums 'FPFloaterLevels': '_create_fp_floater_levels', 'FPPumpAttributes': '_create_fp_pump_attributes', 'FPValveStates': '_create_fp_valve_states', @@ -127,25 +128,27 @@ 'MODE_NLEG': 8, # Not legal - an illegal mode transition occurred 'NUM_OF_FP_MODES': 9, # Number of FP operation modes } + return DialinEnum('FPOpModes', members) - # Create the enum - FPOpModes = DialinEnum('FPOpModes', members) - - return FPOpModes - + 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 + } + return DialinEnum('FPFaultStates', members) + + def _create_fp_service_states(self): members = { 'NUM_OF_FP_SERV_STATES': 0, # Number of FP service states } + return DialinEnum('FPServiceStates', members) - # Create the enum - FPServiceStates = DialinEnum('FPServiceStates', members) - - return FPServiceStates - - def _create_fp_post_states(self): + def _create_fp_init_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 @@ -159,39 +162,17 @@ 'FP_POST_STATE_FAILED': 9, # POST self-tests failed state 'NUM_OF_FP_POST_STATES': 10 # Number of initialize & POST mode states } + return DialinEnum('FPPostStates', members) - # Create the enum - FPPostStates = DialinEnum('FPPostStates', members) - - return FPPostStates - - 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 - } - - # Create the enum - FPFaultStates = DialinEnum('FPFaultStates', members) - - return FPFaultStates - - 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 } + return DialinEnum('FPStandbyStates', members) - # Create the enum - FPStandbyStates = DialinEnum('FPStandbyStates', members) - - return FPStandbyStates - def _create_fp_pregen_states(self): members = { 'FP_PRE_GENP_INLET_PRES_CHECK': 0, # FP Pre Gen Permeate Inlet Pressure Check State @@ -202,65 +183,45 @@ '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 } + return DialinEnum('FPPreGenPermeateStates', members) - # 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 } + return DialinEnum('FPPreGenPDefStates', members) - # 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 } + return DialinEnum('FPGenPermeateStates', members) - # 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 } + return DialinEnum('FPGenPermeateDefStates', members) - # 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 } + return DialinEnum('FPNotLegalStates', members) - # Create the enum - FPNotLegalStates = DialinEnum('FPNotLegalStates', members) - - return FPNotLegalStates - - def _create_fp_events_states(self): + def _create_fp_eventlist(self): members = { 'FP_EVENT_STARTUP': 0, # FP startup event 'FP_EVENT_OP_MODE_CHANGE': 1, # FP Op mode change event @@ -274,14 +235,10 @@ 'FP_EVENT_FAULT_ALARM_TRIGGER': 9, # FP event for alarms that would trigger 'NUM_OF_FP_EVENT_IDS': 10, # Number of FP events } + return DialinEnum('FPEventList', members) - # Create the enum - FPEventList = DialinEnum('FPEventList', members) - - return FPEventList - - def _create_fp_event_data_types_states(self): + def _create_fp_event_data_types(self): members = { 'EVENT_DATA_TYPE_NONE': 0, # No Event Data Type 'EVENT_DATA_TYPE_U32': 1, # Unsigned 32bit Event Data Type @@ -290,38 +247,27 @@ 'EVENT_DATA_TYPE_BOOL': 4, # Boolean Event Data Type 'NUM_OF_EVENT_DATA_TYPES': 5, # Number of Event Data Types } + return DialinEnum('FPEventDataTypes', members) - # 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 } + return DialinEnum('FPBoostPumpNames', members) - # 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 + return DialinEnum('FPConductivitySensorNames', members) def _create_fp_ro_rejection_ratio_names(self): @@ -333,38 +279,26 @@ 'GEN_PERMEATE_STATE': 4, # Generate Permeate State value 'NUM_OF_FP_RO_REJECTION_RATIO': 5, # Number of RO Rejection Ratio items } + return DialinEnum('FPRORejectionRatioNames', members) - # 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 } + return DialinEnum('FPFlowSensorNames', members) - # 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 } + return DialinEnum('FPFloaterLevelSensorNames', members) - # Create the enum - FPFloaterLevelSensorNames = DialinEnum('FPFloaterLevelSensorNames', members) - - return FPFloaterLevelSensorNames - def _create_fp_pressure_sensor_names(self): if GlobalVariables().NEXT_GEN_HW == True: members = { @@ -383,26 +317,17 @@ 'P17_PRES' : 3, # Pressure before the RO filter 'NUM_OF_FP_PRES_SENSORS' : 4, # Number of Pressure Sensors } + return DialinEnum('FPPressureSensorNames', members) - # 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 - } + return DialinEnum('FPROPumpNames', members) - # Create the enum - FPROPumpNames = DialinEnum('FPROPumpNames', members) - - return FPROPumpNames - def _create_fp_temperature_sensor_names(self): if GlobalVariables().NEXT_GEN_HW == True: members = { @@ -431,25 +356,25 @@ } # Create the enum - FPTemperatureSensorNames = DialinEnum('FPTemperatureSensorNames', members) + created_enum = 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) + extend_enum(created_enum, 'FIRST_PRESSURE_SENSOR', created_enum.M3_TEMP.value) + extend_enum(created_enum, 'LAST_PRESSURE_SENSOR', created_enum.P46_TEMP.value if GlobalVariables.NEXT_GEN_HW == True else created_enum.P17_TEMP.value) + extend_enum(created_enum, 'FIRST_CONDUCTIVITY_SENSOR', created_enum.P10_TEMP.value) + extend_enum(created_enum, 'LAST_CONDUCTIVITY_SENSOR', created_enum.P19_TEMP.value) + extend_enum(created_enum, 'FIRST_FLOW_SENSOR', created_enum.P7_TEMP.value) + extend_enum(created_enum, 'LAST_FLOW_SENSOR', created_enum.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') + created_enum._member_names_.append('FIRST_PRESSURE_SENSOR') + created_enum._member_names_.append('LAST_PRESSURE_SENSOR') + created_enum._member_names_.append('FIRST_CONDUCTIVITY_SENSOR') + created_enum._member_names_.append('LAST_CONDUCTIVITY_SENSOR') + created_enum._member_names_.append('FIRST_FLOW_SENSOR') + created_enum._member_names_.append('LAST_FLOW_SENSOR') - return FPTemperatureSensorNames + return created_enum def _create_fp_valve_names(self): @@ -464,26 +389,19 @@ 'P6_VALV': 7, # Valve (P6 VFF) 'NUM_OF_FP_VALVES': 8, # Number of valves } + return DialinEnum('FPValveNames', members) - # 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 } + return DialinEnum('FPAllPumpNames', members) - # Create the enum - FPAllPumpNames = DialinEnum('FPAllPumpNames', members) - - return FPAllPumpNames - # ================================================== Enum Creators: Support ================================================== def _create_fp_floater_levels(self): members = { @@ -494,13 +412,9 @@ 'LEVEL_STATE_ILLEGAL': 4, # Illegal level for FP Floater Level Sensor (indicates investigation) 'NUM_OF_LEVEL_STATES': 5, # Number of Level States } + return DialinEnum('FPFloaterLevels', members) - # Create the enum - FPFloaterLevels = DialinEnum('FPFloaterLevels', members) - - return FPFloaterLevels - def _create_fp_pump_attributes(self): members = { 'STATE': 0, # State to command attribute for Pumps @@ -514,26 +428,18 @@ 'FB_DUTY_CYCLE_PCT': 8, # Feedback Duty Cycle Percentage attribute for pumps 'NUM_OF_RO_PUMP_ATTRIBUTES': 9, # Number of pump attributes } + return DialinEnum('FPPumpAttributes', members) - # 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 } + return DialinEnum('FPValveStates', members) - # Create the enum - FPValveStates = DialinEnum('FPValveStates', members) - - return FPValveStates - # ================================================== Creates a singleton ================================================== fp_enum_repository = FP_Defs() Index: leahi_dialin/common/td_defs.py =================================================================== diff -u -r8bcac0e6e7960de5d9bdf925bbf5581cdc97df31 -r55d97b27c73f8e08994328881d3f56cbc7f00e29 --- leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 8bcac0e6e7960de5d9bdf925bbf5581cdc97df31) +++ leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 55d97b27c73f8e08994328881d3f56cbc7f00e29) @@ -7,343 +7,566 @@ # # @file td_defs.py # -# @author (last) Vinayakam Mani -# @date (last) 10-May-2024 +# @author (last) Zoltan Miskolci +# @date (last) 13-Jan-2026 # @author (original) Peter Lucia # @date (original) 04-Dec-2020 # ############################################################################ -from enum import unique -from numbers import Number +from aenum import extend_enum +from typing import TYPE_CHECKING + +from .global_vars import GlobalVariables, test_config_change from ..utils.base import DialinEnum -@unique -class TDOpModes(DialinEnum): - MODE_FAUL = 0 # Fault mode - MODE_SERV = 1 # Service mode - MODE_INIT = 2 # Initialization & POST mode - MODE_STAN = 3 # Standby mode - MODE_TPAR = 4 # Treatment Parameters mode - MODE_PRET = 5 # Pre-Treatment mode - MODE_TREA = 6 # Treatment mode - MODE_POST = 7 # Post-Treatment mode - MODE_NLEG = 8 # Not legal - an illegal mode transition occurred - NUM_OF_MODES = 9 # Number of TD operation modes +class TD_Defs: + # IDE autocomplete support + if TYPE_CHECKING: + TDOpModes: DialinEnum + TDFaultStates: DialinEnum + TDServiceStates: DialinEnum + TDInitStates: DialinEnum + TDStandbyStates: DialinEnum + TDTreatmentParamStates: DialinEnum + TDPreTreatmentModesStates: DialinEnum + TDTreatmentStates: DialinEnum + TDPostTreatmentStates: DialinEnum + TDNotLegalStates: DialinEnum + TDPreTreatmentPrimeStates: DialinEnum + TDDialysisStates: DialinEnum + TDTreatmentParameters: DialinEnum + TDEventList: DialinEnum + TDEventDataTypes: DialinEnum -@unique -class TDStandbyStates(DialinEnum): - STANDBY_START_STATE = 0 # Start standby (home actuators). - STANDBY_WAIT_FOR_TREATMENT_STATE = 1 # Wait for treatment. - STANDBY_WAIT_FOR_DISINFECT_STATE = 2 # Wait for UI to send disinfect option. - STANDBY_WAIT_FOR_DG_CLEANING_MODE_CMD_RESPONSE_STATE = 3 # Wait for DG cleaning mode command response state. - STANDBY_WAIT_FOR_DG_CLEANING_MODE_TO_START_STATE = 4 # Wait for DG cleaning mode to start state. - STANDBY_CLEANING_MODE_IN_PROGRESS_STATE = 5 # Cleaning mode in progress state. - NUM_OF_STANDBY_STATES = 6 # Number of standby states (sub-modes). + TDAirPumpNames:DialinEnum + TDAirTrapValveNames:DialinEnum + TDAirTrapLevelSensorNames:DialinEnum + TDAirBubbleDetectorNames:DialinEnum + TDEjectorNames:DialinEnum + TDPressureSensorNames:DialinEnum + TDTemperatureSensorNames: DialinEnum + TDSwitchNames:DialinEnum + TDValveNames: DialinEnum + TDMonitoredVoltages: DialinEnum -@unique -class TDInitStates(DialinEnum): - POST_STATE_START = 0 # Start initialize & POST mode state - POST_STATE_FW_INTEGRITY = 1 # Run firmware integrity test state - POST_STATE_NVDATAMGMT = 2 # Run NV Data Mgmt. test state - POST_STATE_WATCHDOG = 3 # Run watchdog test state - POST_STATE_SAFETY_SHUTDOWN = 4 # Run safety shutdown test state - POST_STATE_BLOOD_FLOW = 5 # Run blood flow test state - POST_STATE_VALVES = 6 # Run valves test state - POST_STATE_SYRINGE_PUMP = 7 # Run syringe pump test state - POST_STATE_PRES_OCCL = 8 # Run pressure occlusion state - POST_STATE_ALARM_AUDIO = 9 # Run alarm audio test state - POST_STATE_ALARM_LAMP = 10 # Run alarm lamp test state - POST_STATE_TEMPERATURES = 11 # Run temperatures POST state - POST_STATE_FANS = 12 # Run fans POST state - POST_STATE_STUCK_BUTTON = 13 # Run stuck button test state - POST_STATE_UI_POST = 14 # Check whether UI passed its POST tests - POST_STATE_FW_COMPATIBILITY = 15 # Run firmware compatibility test state - POST_STATE_FPGA = 16 # Run FPGA test state - POST_STATE_COMPLETED = 17 # POST self-tests completed state - POST_STATE_FAILED = 18 # POST self-tests failed state - NUM_OF_POST_STATES = 19 # Number of initialize & POST mode states + TDAirPumpAttributes: DialinEnum + TDAirTrapLevelSensorAttributes: DialinEnum + TDAirTrapState: DialinEnum + TDBloodFlowMotorAttributes: DialinEnum + TDAirBubbleDetectorAttributes: DialinEnum + TDEjectorAttributes: DialinEnum + TDPressureSensorAttributes: DialinEnum + TDSwitchStatus: DialinEnum + TDValvePositions: DialinEnum + TDValveStates: DialinEnum -@unique -class TDTreatmentParamStates(DialinEnum): - TD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND = 0 # Wait for UI to send treatment params mode state - TD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM = 1 # Wait for UI to confirm treatment params mode state - NUM_OF_TD_TREATMENT_PARAMS_MODE_STATES = 2 # Number of treatment params mode states + _properties = { + # Operation / State enums + 'TDOpModes': '_create_td_op_modes', + 'TDFaultStates': '_create_td_fault_states', + 'TDServiceStates': '_create_td_service_states', + 'TDInitStates': '_create_td_init_states', + 'TDStandbyStates': '_create_td_standby_states', + 'TDTreatmentParamStates': '_create_td_treatment_param_states', + 'TDPreTreatmentModesStates': '_create_td_pre_treatment_modes_states', + 'TDTreatmentStates': '_create_td_treatment_states', + 'TDPostTreatmentStates': '_create_td_post_treatment_states', + 'TDNotLegalStates': '_create_td_not_legal_states', + 'TDPreTreatmentPrimeStates': '_create_td_pre_treatment_prime_states', + 'TDDialysisStates': '_create_td_dialysis_states', + 'TDTreatmentParameters': '_create_td_treatment_parameters', -@unique -class TDPreTreatmentModesStates(DialinEnum): - TD_PRE_TREATMENT_WATER_SAMPLE_STATE = 0 # Water sample state - TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE = 1 # Consumable self-tests state - TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE = 2 # No cartridge self-tests state - TD_PRE_TREATMENT_CART_INSTALL_STATE = 3 # Consumable and cartridge installation state - TD_PRE_TREATMENT_SELF_TEST_DRY_STATE = 4 # Self-tests when the cartridge is dry state - TD_PRE_TREATMENT_PRIME_STATE = 5 # Prime blood and dialysate circuits and run wet self-tests state - TD_PRE_TREATMENT_RECIRCULATE_STATE = 6 # Re-circulate blood and dialysate circuits state - TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE = 7 # Patient connection state - NUM_OF_TD_PRE_TREATMENT_STATES = 8 # Number of pre-treatment mode states + # Event enums + 'TDEventList': '_create_td_event_list', + 'TDEventDataTypes': '_create_td_event_data_types', + # Module Names enums + 'TDAirPumpNames': '_create_td_air_pump_names', + 'TDAirTrapValveNames': '_create_td_air_trap_valve_names', + 'TDAirTrapLevelSensorNames': '_create_td_air_trap_level_sensor_names', + 'TDAirBubbleDetectorNames': '_create_td_air_bubble_detector_names', + 'TDEjectorNames': '_create_td_ejector_names', + 'TDPressureSensorNames': '_create_td_pressure_sensor_names', + 'TDTemperatureSensorNames': '_create_td_temperature_sensor_names', + 'TDSwitchNames': '_create_td_switch_names', + 'TDValveNames': '_create_td_valve_names', + 'TDMonitoredVoltages': '_create_dd_monitored_voltages', -@unique -class TDPostTreatmentStates(DialinEnum): - TD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE = 0 # Drain reservoirs state - TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE = 1 # Patient disconnection state - TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE = 2 # Disposable removal state - TD_POST_TREATMENT_VERIFY_STATE = 3 # Verify cartridge removed, syringe removed, and reservoirs drained state - NUM_OF_TD_POST_TREATMENT_STATES = 4 # Number of post-treatment mode states + # Support enums + 'TDAirPumpAttributes': '_create_td_air_pump_attributes', + 'TDAirTrapLevelSensorAttributes': '_create_td_air_trap_level_sensor_attributes', + 'TDAirTrapState': '_create_td_air_trap_state', + 'TDBloodFlowMotorAttributes': '_create_td_blood_flow_motor_attributes', + 'TDAirBubbleDetectorAttributes': '_create_td_air_bubble_detector_attributes', + 'TDEjectorAttributes': '_create_td_ejector_attributes', + 'TDPressureSensorAttributes': '_create_td_pressure_sensor_attributes', + 'TDSwitchStatus': '_create_td_switch_status', + 'TDValvePositions': '_create_td_valve_positions', + 'TDValveStates': '_create_td_valve_states', + } -@unique -class TDPreTreatmentPrimeStates(DialinEnum): - TD_PRIME_WAIT_FOR_USER_START_STATE = 0 # Wait for user to start prime state - TD_PRIME_SALINE_SETUP_STATE = 1 # Saline setup state - TD_PRIME_SALINE_PURGE_AIR_STATE = 2 # Saline purge air state - TD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE = 3 # Circulate blood circuit state - TD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE = 4 # Wait for reservoir 1 fill complete - TD_PRIME_DIALYSATE_DIALYZER_STATE = 5 # Dialysate dialyzer fluid path state - TD_PRIME_SALINE_DIALYZER_SETUP_STATE = 6 # Saline dialyzer setup state - TD_PRIME_SALINE_DIALYZER_STATE = 7 # Saline dialyzer fluid path state - TD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE = 8 # Wait for reservoir 2 fill complete - TD_PRIME_DIALYSATE_BYPASS_STATE = 9 # Dialysate bypass fluid path state - TD_PRIME_WET_SELF_TESTS_STATE = 10 # Perform wet self-tests after priming complete - TD_PRIME_PAUSE = 11 # Prime pause state, waits to be resumed - TD_PRIME_COMPLETE = 12 # Prime complete state - NUM_OF_TD_PRIME_STATES = 13 # Number of prime sub-mode states + def __init__(self): + self.update_enums() -@unique -class TDFaultStates(DialinEnum): - TD_FAULT_ENERGIZED_STATE = 0 # TD fault mode energized state - TD_FAULT_DEENERGIZED_STATE = 1 # TD fault mode deenergized state - NUM_OF_TD_FAULT_STATES = 2 # Number of fault mode states -@unique -class TDTreatmentStates(DialinEnum): - TREATMENT_START_STATE = 0 # Start treatment - initialize treatment and go to blood prime state - TREATMENT_BLOOD_PRIME_STATE = 1 # Prime blood-side of dialyzer with gradual ramp for 1 min. while dialyzer is bypassed. No dialysis or UF taking place. No treatment time. - TREATMENT_DIALYSIS_STATE = 2 # Perform dialysis. Deliver UF as prescribed. - TREATMENT_PAUSED_STATE = 3 # Treatment paused. All pumps off. Dializer bypassed - TREATMENT_RINSEBACK_STATE = 4 # Perform rinseback with saline. Dialyzer bypassed. Dialysate recirculating - TREATMENT_RECIRC_STATE = 5 # Recirculate saline and dialysate while patient disconnected. Blood lines open and shunted. Dialyzer is bypassed - TREATMENT_END_STATE = 6 # Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback - TREATMENT_ISO_UF_STATE = 7 # Isolated ultrafiltration. No dialysate flow. Ultrafiltration only. - TREATMENT_SALINE_BOLUS_STATE = 8 # Deliver a saline bolus. Blood pump draws from saline bag. Dialyzer bypassed. - TREATMENT_DIALYSATE_PAUSED_STATE = 9 # No dialysate flow. Dialyzer bypassed. - NUM_OF_TREATMENT_STATES = 10 # Number of treatment states (sub-modes) + def __getattr__(self, name) -> DialinEnum: + if name in self._properties: + enum = getattr(self, self._properties[name])() + setattr(self, name, enum) + return enum + raise AttributeError(name) -@unique -class TDDialysisStates(DialinEnum): - DIALYSIS_UF_STATE = 0 # Ultrafiltration state of the dialysis sub-mode state machine - DIALYSIS_UF_PAUSED_STATE = 1 # Ultrafiltration Paused state of the dialysis sub-mode state machine - NUM_OF_DIALYSIS_STATES = 2 # Number of dialysis sub-mode states -@unique -class TDServiceStates(DialinEnum): - TD_SERVICE_STATE_START = 0 # Start service mode state - NUM_OF_TD_SERVICE_STATES = 1 # Number of service mode states + def update_enums(self) -> None: + for prop in self._properties: + self.__dict__.pop(prop, None) + self.__getattr__(prop) -@unique -class TDNotLegalStates(DialinEnum): - NUM_OF_NOT_LEGAL_STATES = 0 # TODO: populate with Not Legal states -@unique -class TDEventList(DialinEnum): - TD_EVENT_STARTUP = 0 # TD startup event - TD_EVENT_OP_MODE_CHANGE = 1 # TD Op mode change event - TD_EVENT_SUB_MODE_CHANGE = 2 # TD Op sub-mode change event - TD_EVENT_DRY_SELF_TEST_CARTRIDGE_RESULT = 3 # TD dry self test cartridge result - TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT = 4 # TD dry self test pressure result - TD_EVENT_WET_SELF_TEST_DISPLACEMENT_RESULT = 5 # TD wet self test displacement result - TD_EVENT_CPU_RAM_ERROR_STATUS = 6 # TD CPU RAM error status - TD_EVENT_CAL_RECORD_UPDATE = 7 # TD new calibration record updated - TD_EVENT_SYSTEM_RECORD_UPDATE = 8 # TD new system record has been updated - TD_EVENT_SERVICE_UPDATE = 9 # TD new service record has been updated - TD_EVENT_USAGE_INFO_UPDATE = 10 # TD new usage information has been updated - TD_EVENT_SW_CONFIG_UPDATE = 11 # TD new software configuration has been updated - TD_EVENT_BUTTON = 12 # TD button pressed/released - TD_EVENT_SAFETY_LINE = 13 # TD safety line pulled/released - TD_EVENT_SUB_STATE_CHANGE = 14 # TD Op sub-state change event - TD_EVENT_RSRVR_UF_RATE = 15 # TD ultrafiltration measured and expected rates - TD_EVENT_OPERATION_STATUS = 16 # TD operation status event. - TD_EVENT_AIR_TRAP_FILL = 17 # TD initiated an air trap fill (opened VBT briefly). - TD_EVENT_AIR_TRAP_LOWER = 18 # TD started/stopped an air trap lower level operation - TD_EVENT_AIR_PUMP_ON_OFF = 19 # TD turned air pump on or off. - TD_EVENT_DRY_SELF_TEST_PRESSURE_DECAY_WAIT_PERIOD = 20 # TD dry self test pressure decay wait period - TD_EVENT_INSTIT_RECORD_UPDATE = 21 # TD new institutional record has been updated. - TD_EVENT_VALVE_POS_CHANGE = 22 # TD pinch valve position change - TD_EVENT_VALVE_HOMED_POS_SETTING = 23 # TD pinch valve homed encoder positions for A/B/C - NUM_OF_EVENT_IDS = 24 # Total number of TD events -@unique -class TDEventDataType(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 + # ================================================== Enum Creators: Operations ================================================== + def _create_td_op_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_TPAR': 4, # Treatment Parameters mode + 'MODE_PRET': 5, # Pre-Treatment mode + 'MODE_TREA': 6, # Treatment mode + 'MODE_POST': 7, # Post-Treatment mode + 'MODE_NLEG': 8, # Not legal - an illegal mode transition occurred + 'NUM_OF_MODES': 9, # Number of TD operation modes + } + return DialinEnum('TDOpModes', members) -@unique -class TDAirPumpNames(DialinEnum): - H12_AIR_PUMP = 0 # TD Air Pump - NUM_OF_AIR_PUMPS = 1 # Number of TD Air pumps -@unique -class TDAirPumpAttributes(DialinEnum): - STATE = 0 # TD Air Pump State to command attribute - POWER = 1 # TD Air Pump Power attribute - NUM_OF_AIR_PUMP_ATTRIBUTES = 2 # Number of Air Pump attributes + def _create_td_fault_states(self): + members = { + 'TD_FAULT_ENERGIZED_STATE': 0, # TD fault mode energized state + 'TD_FAULT_DEENERGIZED_STATE': 1, # TD fault mode deenergized state + 'NUM_OF_TD_FAULT_STATES': 2, # Number of fault mode states + } + return DialinEnum('TDFaultStates', members) -@unique -class TDAirTrapValves(DialinEnum): - H13_VALV = 0 # Air trap intake valve - H20_VALV = 1 # Air trap outlet valve - NUM_OF_AIR_TRAP_VALVES = 2 # Number of Air Trap Valves -@unique -class TDAirTrapLevelSensors(DialinEnum): - H17_LEVEL = 0 # Lower Level Sensor - H16_LEVEL = 1 # Upper Level Sensor - NUM_OF_AIR_TRAP_LEVEL_SENSORS = 2 # Number of TD Air Trap Level Sensors + def _create_td_service_states(self): + members = { + 'TD_SERVICE_STATE_START': 0, # Start service mode state + 'NUM_OF_TD_SERVICE_STATES': 1, # Number of service mode states + } + return DialinEnum('TDServiceStates', members) -@unique -class TDAirTrapLevelSensorsAttributes(DialinEnum): - LEVEL = 0 # Level attribute for Air Trap Level Sensor - RAW = 1 # Raw reading attribute for Air Trap Level Sensor - NUM_OF_AIR_TRAP_LEVEL_SENSOR_ATTRIBUTES = 2 # Number of Air Trap Level Sensor attributes -@unique -class TDAirTrapState(DialinEnum): - STATE_CLOSED = 0 # Closed state for Air Trap - STATE_OPEN = 1 # Open state for Air Trap + def _create_td_init_states(self): + members = { + 'POST_STATE_START': 0, # Start initialize & POST mode state + 'POST_STATE_FW_INTEGRITY': 1, # Run firmware integrity test state + 'POST_STATE_NVDATAMGMT': 2, # Run NV Data Mgmt. test state + 'POST_STATE_WATCHDOG': 3, # Run watchdog test state + 'POST_STATE_SAFETY_SHUTDOWN': 4, # Run safety shutdown test state + 'POST_STATE_BLOOD_FLOW': 5, # Run blood flow test state + 'POST_STATE_VALVES': 6, # Run valves test state + 'POST_STATE_SYRINGE_PUMP': 7, # Run syringe pump test state + 'POST_STATE_PRES_OCCL': 8, # Run pressure occlusion state + 'POST_STATE_ALARM_AUDIO': 9, # Run alarm audio test state + 'POST_STATE_ALARM_LAMP': 10, # Run alarm lamp test state + 'POST_STATE_TEMPERATURES': 11, # Run temperatures POST state + 'POST_STATE_FANS': 12, # Run fans POST state + 'POST_STATE_STUCK_BUTTON': 13, # Run stuck button test state + 'POST_STATE_UI_POST': 14, # Check whether UI passed its POST tests + 'POST_STATE_FW_COMPATIBILITY': 15, # Run firmware compatibility test state + 'POST_STATE_FPGA': 16, # Run FPGA test state + 'POST_STATE_COMPLETED': 17, # POST self-tests completed state + 'POST_STATE_FAILED': 18, # POST self-tests failed state + 'NUM_OF_POST_STATES': 19, # Number of initialize & POST mode states + } + return DialinEnum('TDInitStates', members) -@unique -class TDBloodFlowMotorAttributes(DialinEnum): - SET_BLOOD_FLOW_RATE = 0 # Set Blood Flow Rate for Blood Flow Motor - MEASURED_BLOOD_FLOW_RATE = 1 # Measured Blood Flow Rate for Blood Flow Motor - MEASURED_BLOOD_PUMP_ROTOR_SPEED = 2 # Measured Bloop Pump Rotor Speed for Blood Flow Motor - MEASURED_BLOOD_PUMP_SPEED = 3 # Measured Blood Pump Speed for Blood Flow Motor - MEASURED_BLOOD_PUMP_TORQUE = 4 # Measured Blood Pump torque - SET_RPM = 5 # Set Revolutions per minute for Blood Flow Motor - ROTOR_COUNT = 6 # Rotor Count for Blood Flow Motor - PRES_BLOOD_FLOW_RATE = 7 # Pressure Blood Flow Rate for Blood Flow Motor - ROTOR_HALL_STATE = 8 # Rotor Hall State for Blood Flow Motor - NUM_OF_BLOOD_FLOW_MOTOR_ATTRIBUTES = 9 # Number of Blood Flow Motor Attributes -@unique -class TDAirBubbleDetectorNames(DialinEnum): - H18_ADV = 0 # H18 Air Bubble Detector Venous - NUM_OF_AIR_BUBBLE_DETECTORS = 1 # Number of Air Bubble Detectors + def _create_td_standby_states(self): + members = { + 'STANDBY_START_STATE': 0, # Start standby (home actuators). + 'STANDBY_WAIT_FOR_TREATMENT_STATE': 1, # Wait for treatment. + 'STANDBY_WAIT_FOR_DISINFECT_STATE': 2, # Wait for UI to send disinfect option. + 'STANDBY_WAIT_FOR_DG_CLEANING_MODE_CMD_RESPONSE_STATE': 3, # Wait for DG cleaning mode command response state. + 'STANDBY_WAIT_FOR_DG_CLEANING_MODE_TO_START_STATE': 4, # Wait for DG cleaning mode to start state. + 'STANDBY_CLEANING_MODE_IN_PROGRESS_STATE': 5, # Cleaning mode in progress state. + 'NUM_OF_STANDBY_STATES': 6, # Number of standby states (sub-modes). + } + return DialinEnum('TDStandbyStates', members) -@unique -class TDAirBubbleDetectorAttributes(DialinEnum): - STATUS = 0 # Status of the Air Bubble Detector - STATE = 1 # State of the Air Bubble Detector - NUM_OF_AIR_BUBBLE_DETECTOR_ATTRIBUTES = 2 # Number of Air Bubble Detector Attributes -@unique -class TDEjectorNames(DialinEnum): - H5_MOTOR = 0 # TD Ejector Motor - NUM_OF_EJECTOR_MOTORS = 1 # Number of Ejector Motors + def _create_td_treatment_param_states(self): + members = { + 'TD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND': 0, # Wait for UI to send treatment params mode state + 'TD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM': 1, # Wait for UI to confirm treatment params mode state + 'NUM_OF_TD_TREATMENT_PARAMS_MODE_STATES': 2, # Number of treatment params mode states + } + return DialinEnum('TDTreatmentParamStates', members) -@unique -class TDEjectorAttributes(DialinEnum): - STATE = 0 # Ejector State to command - SET_SPEED = 1 # Ejector Set Speed - OPT_SNSR_RETRACT = 2 # Ejector optical sensor retract - OPT_SNSR_ENGAGE = 3 # Ejector optical sensor engage - NUM_OF_EJECTOR_ATTRIBUTES = 4 # Number of Ejector Attributes -@unique -class TDPressureSensorNames(DialinEnum): - H2_PRES = 0 # Arterial Pressure Sensor - H14_PRES = 1 # Venous Pressure Sensor - H23_PRES = 2 # Barometric Pressure Sensor - NUM_OF_PRESSURE_SENSORS = 3 # Number of Pressure Sensors + def _create_td_pre_treatment_modes_states(self): + members = { + 'TD_PRE_TREATMENT_WATER_SAMPLE_STATE': 0, # Water sample state + 'TD_PRE_TREATMENT_SELF_TEST_CONSUMABLE_STATE': 1, # Consumable self-tests state + 'TD_PRE_TREATMENT_SELF_TEST_NO_CART_STATE': 2, # No cartridge self-tests state + 'TD_PRE_TREATMENT_CART_INSTALL_STATE': 3, # Consumable and cartridge installation state + 'TD_PRE_TREATMENT_SELF_TEST_DRY_STATE': 4, # Self-tests when the cartridge is dry state + 'TD_PRE_TREATMENT_PRIME_STATE': 5, # Prime blood and dialysate circuits and run wet self-tests state + 'TD_PRE_TREATMENT_RECIRCULATE_STATE': 6, # Re-circulate blood and dialysate circuits state + 'TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE': 7, # Patient connection state + 'NUM_OF_TD_PRE_TREATMENT_STATES': 8, # Number of pre-treatment mode states + } + return DialinEnum('TDPreTreatmentModesStates', members) -@unique -class TDPressureSensorAttributes(DialinEnum): - PRES = 0 # Pressure attribute of pressure sensor - LONG_FILTERED_PRESSURE = 1 # Long Filtered Pressure attribute of pressure sensor - PRES_LIMIT_MIN = 2 # Pressure Minimum Limit attribute of pressure sensor - PRES_LIMIT_MAX = 3 # Pressure Maximum Limit attribute of pressure sensor - NUM_OF_PRESSURE_ATTRIBUTES = 4 # Number of Pressure Sensor Attributes -@unique -class TDTemperatureSensorNames(DialinEnum): - H23_TEMP = 0 # Barometric temperature Sensor - NUM_OF_TEMPERATURE_SENSORS = 1 # Number of temperature Sensors + def _create_td_treatment_states(self): + members = { + 'TREATMENT_START_STATE': 0, # Start treatment - initialize treatment and go to blood prime state + 'TREATMENT_BLOOD_PRIME_STATE': 1, # Prime blood-side of dialyzer with gradual ramp for 1 min. while dialyzer is bypassed. No dialysis or UF taking place. No treatment time. + 'TREATMENT_DIALYSIS_STATE': 2, # Perform dialysis. Deliver UF as prescribed. + 'TREATMENT_PAUSED_STATE': 3, # Treatment paused. All pumps off. Dializer bypassed + 'TREATMENT_RINSEBACK_STATE': 4, # Perform rinseback with saline. Dialyzer bypassed. Dialysate recirculating + 'TREATMENT_RECIRC_STATE': 5, # Recirculate saline and dialysate while patient disconnected. Blood lines open and shunted. Dialyzer is bypassed + 'TREATMENT_END_STATE': 6, # Dialysis has ended. Blood pump slowed. Dialyzer is bypassed. Dialysate is recirculated. User can rinseback + 'TREATMENT_ISO_UF_STATE': 7, # Isolated ultrafiltration. No dialysate flow. Ultrafiltration only. + 'TREATMENT_SALINE_BOLUS_STATE': 8, # Deliver a saline bolus. Blood pump draws from saline bag. Dialyzer bypassed. + 'TREATMENT_DIALYSATE_PAUSED_STATE': 9, # No dialysate flow. Dialyzer bypassed. + 'NUM_OF_TREATMENT_STATES': 10, # Number of treatment states (sub-modes) + } + return DialinEnum('TDTreatmentStates', members) -@unique -class TDSwitchStatus(DialinEnum): - CLOSED = 0 # Closed State of the TD Switch - OPEN = 1 # Open State of the TD Switch -@unique -class TDSwitchesNames(DialinEnum): - H9_FRONT_DOOR = 0 # Front Door Switch for TD - NUM_OF_DOORS_AND_SWITCHES = 1 # Number of Doors and Switches + def _create_td_post_treatment_states(self): + members = { + 'TD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE': 0, # Drain reservoirs state + 'TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE': 1, # Patient disconnection state + 'TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE': 2, # Disposable removal state + 'TD_POST_TREATMENT_VERIFY_STATE': 3, # Verify cartridge removed, syringe removed, and reservoirs drained state + 'NUM_OF_TD_POST_TREATMENT_STATES': 4, # Number of post-treatment mode states + } + return DialinEnum('TDPostTreatmentStates', members) -@unique -class TDTreatmentParameters(DialinEnum): - TREATMENT_PARAM_BLOOD_FLOW = 0 # Blood flow rate (in mL/min) - TREATMENT_PARAM_DIALYSATE_FLOW = 1 # Dialysate flow rate (in mL/min) - TREATMENT_PARAM_TREATMENT_DURATION = 2 # Treatment duration (in minutes) - TREATMENT_PARAM_SALINE_BOLUS_VOLUME = 3 # Saline bolus volume (in mL) - TREATMENT_PARAM_HEPARIN_STOP_TIME = 4 # Heparin stop time (in minutes) - TREATMENT_PARAM_HEPARIN_TYPE = 5 # Heparin type (enum) - TREATMENT_PARAM_ACID_CONCENTRATE = 6 # Acid concentrate type (enum) - TREATMENT_PARAM_BICARB_CONCENTRATE = 7 # Bicarbonate concentrate type (enum) - TREATMENT_PARAM_DIALYZER_TYPE = 8 # Dialysate type (enum) - TREATMENT_PARAM_BP_MEAS_INTERVAL = 9 # Blood pressure measurement interval (in minutes) - TREATMENT_PARAM_RINSEBACK_FLOW_RATE = 10 # Rinseback flow rate (in mL/min) - TREATMENT_PARAM_RINSEBACK_VOLUME = 11 # Rinseback volume (in mL) - TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW = 12 # Arterial pressure alarm limit window (in mmHg) - TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW = 13 # Venous pressure alarm limit window (in mmHg) - TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC = 14 # Venous pressure alarm limit asymmetric (in mmHg) - TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW = 15 # TMP alarm limit window (in mmHg) - TREATMENT_PARAM_DIALYSATE_TEMPERATURE = 16 # Dialysate temperature (in degC) - TREATMENT_PARAM_HEPARIN_DISPENSE_RATE = 17 # Heparin dispense rate (in mL/hr) - TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME = 18 # Heparin bolus volume (in mL) - TREATMENT_PARAM_UF_VOLUME = 19 # Ultrafiltration volume (in liters) - provided separately by UI - NUM_OF_TREATMENT_PARAMS = 20 # Total number of treatment parameters -@unique -class TDValvesEnum(DialinEnum): - H1_VALV = 0 # H1 Valve for TD - H19_VALV = 1 # H19 Valve for TD + def _create_td_not_legal_states(self): + members = { + 'NUM_OF_NOT_LEGAL_STATES': 0, # Number of Not Legal states + } + return DialinEnum('TDNotLegalStates', members) -@unique -class TDValvesPositions(DialinEnum): - VALVE_POSITION_NOT_IN_POSITION = 0 # Valve not in Position - VALVE_POSITION_A_INSERT_EJECT = 1 # Insert/Eject Valve Position - VALVE_POSITION_B_OPEN = 2 # Open Valve Position - VALVE_POSITION_C_CLOSE = 3 # Closed Valve Position - VALVE_POSITION_C_PARTIAL_CLOSE = 4 # Partial Close Valve Position -@unique -class TDValvesStates(DialinEnum): - VALVE_STATE_WAIT_FOR_POST = 0 # Waiting for POST Valve State - VALVE_STATE_RESET_VALVE = 1 # Valve state reset valve. - VALVE_STATE_RESET_ENCODER = 2 # Valve state reset encoder. - VALVE_STATE_ENABLE_VALVE = 3 # Valve state enable valve. - VALVE_STATE_HOMING_NOT_STARTED = 4 # Valve state homing not started. - VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE = 5 # Valve state homing find energized edge. - VALVE_STATE_HOMING_FIND_DEENERGIZED_EDGE = 6 # Valve state homing find. - VALVE_STATE_IDLE = 7 # Idle Valve State. - VALVE_STATE_IN_TRANSITION = 8 # Valve state in transition. + def _create_td_event_list(self): + members = { + 'TD_EVENT_STARTUP': 0, # TD startup event + 'TD_EVENT_OP_MODE_CHANGE': 1, # TD Op mode change event + 'TD_EVENT_SUB_MODE_CHANGE': 2, # TD Op sub-mode change event + 'TD_EVENT_DRY_SELF_TEST_CARTRIDGE_RESULT': 3, # TD dry self test cartridge result + 'TD_EVENT_DRY_SELF_TEST_PRESSURE_RESULT': 4, # TD dry self test pressure result + 'TD_EVENT_WET_SELF_TEST_DISPLACEMENT_RESULT': 5, # TD wet self test displacement result + 'TD_EVENT_CPU_RAM_ERROR_STATUS': 6, # TD CPU RAM error status + 'TD_EVENT_CAL_RECORD_UPDATE': 7, # TD new calibration record updated + 'TD_EVENT_SYSTEM_RECORD_UPDATE': 8, # TD new system record has been updated + 'TD_EVENT_SERVICE_UPDATE': 9, # TD new service record has been updated + 'TD_EVENT_USAGE_INFO_UPDATE': 10, # TD new usage information has been updated + 'TD_EVENT_SW_CONFIG_UPDATE': 11, # TD new software configuration has been updated + 'TD_EVENT_BUTTON': 12, # TD button pressed/released + 'TD_EVENT_SAFETY_LINE': 13, # TD safety line pulled/released + 'TD_EVENT_SUB_STATE_CHANGE': 14, # TD Op sub-state change event + 'TD_EVENT_RSRVR_UF_RATE': 15, # TD ultrafiltration measured and expected rates + 'TD_EVENT_OPERATION_STATUS': 16, # TD operation status event. + 'TD_EVENT_AIR_TRAP_FILL': 17, # TD initiated an air trap fill (opened VBT briefly). + 'TD_EVENT_AIR_TRAP_LOWER': 18, # TD started/stopped an air trap lower level operation + 'TD_EVENT_AIR_PUMP_ON_OFF': 19, # TD turned air pump on or off. + 'TD_EVENT_DRY_SELF_TEST_PRESSURE_DECAY_WAIT_PERIOD': 20, # TD dry self test pressure decay wait period + 'TD_EVENT_INSTIT_RECORD_UPDATE': 21, # TD new institutional record has been updated. + 'TD_EVENT_VALVE_POS_CHANGE': 22, # TD pinch valve position change + 'TD_EVENT_VALVE_HOMED_POS_SETTING': 23, # TD pinch valve homed encoder positions for A/B/C + 'NUM_OF_EVENT_IDS': 24, # Total number of TD events + } + return DialinEnum('TDEventList', members) -# Monitored voltages -@unique -class TDMonitoredVoltages(DialinEnum): - MONITORED_LINE_1_2V = 0 # Processor voltage (1.2V) - MONITORED_LINE_3_3V = 1 # Logic voltage (3.3V) - MONITORED_LINE_5V_LOGIC = 2 # Logic voltage (5V) - MONITORED_LINE_5V_SENSORS = 3 # Sensors voltage (5V) - MONITORED_LINE_24V = 4 # Actuators voltage (24V) - MONITORED_LINE_24V_REGEN = 5 # Actuators regen voltage (24V) - MONITORED_LINE_FPGA_REF_V = 6 # FPGA ADC reference voltage (1V) - MONITORED_LINE_PBA_REF_V = 7 # PBA ADC reference voltage (3V) - MONITORED_LINE_FPGA_VCC_V = 8 # FPGA Vcc (3V) - MONITORED_LINE_FPGA_AUX_V = 9 # FPGA Vaux (3V) - MONITORED_LINE_FPGA_PVN_V = 10 # FPGA Vpvn (1V) - NUM_OF_MONITORED_VOLTAGE_LINES = 11 # Number of TD operation modes \ No newline at end of file + + def _create_td_event_data_types(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 + } + return DialinEnum('TDEventDataTypes', members) + + + + # ================================================== Enum Creators: Operations Sub-Modes ================================================== + def _create_td_pre_treatment_prime_states(self): + members = { + 'TD_PRIME_WAIT_FOR_USER_START_STATE': 0, # Wait for user to start prime state + 'TD_PRIME_SALINE_SETUP_STATE': 1, # Saline setup state + 'TD_PRIME_SALINE_PURGE_AIR_STATE': 2, # Saline purge air state + 'TD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE': 3, # Circulate blood circuit state + 'TD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE': 4, # Wait for reservoir 1 fill complete + 'TD_PRIME_DIALYSATE_DIALYZER_STATE': 5, # Dialysate dialyzer fluid path state + 'TD_PRIME_SALINE_DIALYZER_SETUP_STATE': 6, # Saline dialyzer setup state + 'TD_PRIME_SALINE_DIALYZER_STATE': 7, # Saline dialyzer fluid path state + 'TD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE': 8, # Wait for reservoir 2 fill complete + 'TD_PRIME_DIALYSATE_BYPASS_STATE': 9, # Dialysate bypass fluid path state + 'TD_PRIME_WET_SELF_TESTS_STATE': 10, # Perform wet self-tests after priming complete + 'TD_PRIME_PAUSE': 11, # Prime pause state, waits to be resumed + 'TD_PRIME_COMPLETE': 12, # Prime complete state + 'NUM_OF_TD_PRIME_STATES': 13, # Number of prime sub-mode states + } + return DialinEnum('TDPreTreatmentPrimeStates', members) + + + def _create_td_dialysis_states(self): + members = { + 'DIALYSIS_UF_STATE': 0, # Ultrafiltration state of the dialysis sub-mode state machine + 'DIALYSIS_UF_PAUSED_STATE': 1, # Ultrafiltration Paused state of the dialysis sub-mode state machine + 'NUM_OF_DIALYSIS_STATES': 2, # Number of dialysis sub-mode states + } + return DialinEnum('TDDialysisStates', members) + + + def _create_td_treatment_parameters(self): + members = { + 'TREATMENT_PARAM_BLOOD_FLOW': 0, # Blood flow rate (in mL/min) + 'TREATMENT_PARAM_DIALYSATE_FLOW': 1, # Dialysate flow rate (in mL/min) + 'TREATMENT_PARAM_TREATMENT_DURATION': 2, # Treatment duration (in minutes) + 'TREATMENT_PARAM_SALINE_BOLUS_VOLUME': 3, # Saline bolus volume (in mL) + 'TREATMENT_PARAM_HEPARIN_STOP_TIME': 4, # Heparin stop time (in minutes) + 'TREATMENT_PARAM_HEPARIN_TYPE': 5, # Heparin type (enum) + 'TREATMENT_PARAM_ACID_CONCENTRATE': 6, # Acid concentrate type (enum) + 'TREATMENT_PARAM_BICARB_CONCENTRATE': 7, # Bicarbonate concentrate type (enum) + 'TREATMENT_PARAM_DIALYZER_TYPE': 8, # Dialysate type (enum) + 'TREATMENT_PARAM_BP_MEAS_INTERVAL': 9, # Blood pressure measurement interval (in minutes) + 'TREATMENT_PARAM_RINSEBACK_FLOW_RATE': 10, # Rinseback flow rate (in mL/min) + 'TREATMENT_PARAM_RINSEBACK_VOLUME': 11, # Rinseback volume (in mL) + 'TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW': 12, # Arterial pressure alarm limit window (in mmHg) + 'TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW': 13, # Venous pressure alarm limit window (in mmHg) + 'TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC': 14, # Venous pressure alarm limit asymmetric (in mmHg) + 'TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW': 15, # TMP alarm limit window (in mmHg) + 'TREATMENT_PARAM_DIALYSATE_TEMPERATURE': 16, # Dialysate temperature (in degC) + 'TREATMENT_PARAM_HEPARIN_DISPENSE_RATE': 17, # Heparin dispense rate (in mL/hr) + 'TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME': 18, # Heparin bolus volume (in mL) + 'TREATMENT_PARAM_UF_VOLUME': 19, # Ultrafiltration volume (in liters) - provided separately by UI + 'NUM_OF_TREATMENT_PARAMS': 20, # Total number of treatment parameters + } + return DialinEnum('TDTreatmentParameters', members) + + + + # ================================================== Enum Creators: Names ================================================== + def _create_td_air_pump_names(self): + members = { + 'H12_AIR_PUMP': 0, # TD Air Pump + 'NUM_OF_AIR_PUMPS': 1, # Number of TD Air pumps + } + return DialinEnum('TDAirPumpNames', members) + + + def _create_td_air_trap_valve_names(self): + members = { + 'H13_VALV': 0, # Air trap intake valve + 'H20_VALV': 1, # Air trap outlet valve + 'NUM_OF_AIR_TRAP_VALVES': 2, # Number of Air Trap Valves + } + return DialinEnum('TDAirTrapValveNames', members) + + + def _create_td_air_trap_level_sensor_names(self): + members = { + 'H17_LEVEL': 0, # Lower Level Sensor + 'H16_LEVEL': 1, # Upper Level Sensor + 'NUM_OF_AIR_TRAP_LEVEL_SENSORS': 2, # Number of TD Air Trap Level Sensors + } + return DialinEnum('TDAirTrapLevelSensorNames', members) + + + def _create_td_air_bubble_detector_names(self): + members = { + 'H18_ADV': 0, # H18 Air Bubble Detector Venous + 'NUM_OF_AIR_BUBBLE_DETECTORS': 1, # Number of Air Bubble Detectors + } + return DialinEnum('TDAirBubbleDetectorNames', members) + + + def _create_td_ejector_names(self): + members = { + 'H5_MOTOR': 0, # TD Ejector Motor + 'NUM_OF_EJECTOR_MOTORS': 1, # Number of Ejector Motors + } + return DialinEnum('TDEjectorNames', members) + + + def _create_td_pressure_sensor_names(self): + members = { + 'H2_PRES': 0, # Arterial Pressure Sensor + 'H14_PRES': 1, # Venous Pressure Sensor + 'H23_PRES': 2, # Barometric Pressure Sensor + 'NUM_OF_PRESSURE_SENSORS': 3, # Number of Pressure Sensors + } + return DialinEnum('TDPressureSensorNames', members) + + + def _create_td_temperature_sensor_names(self): + members = { + 'H23_TEMP': 0, # Barometric temperature Sensor + 'NUM_OF_TEMPERATURE_SENSORS': 1, # Number of temperature Sensors + } + return DialinEnum('TDTemperatureSensorNames', members) + + + def _create_td_switches_names(self): + members = { + 'H9_FRONT_DOOR': 0, # Front Door Switch for TD + 'NUM_OF_DOORS_AND_SWITCHES': 1, # Number of Doors and Switches + } + return DialinEnum('TDSwitchNames', members) + + def _create_td_valve_names(self): + members = { + 'H1_VALV': 0, # H1 Valve for TD + 'H19_VALV': 1, # H19 Valve for TD + 'NUM_OF_TD_VALVES': 2, # Number of Valves for the TD + } + return DialinEnum('TDValveNames', members) + + + def _create_td_monitored_voltages(self): + members = { + 'MONITORED_LINE_1_2V': 0, # Processor voltage (1.2V) + 'MONITORED_LINE_3_3V': 1, # Logic voltage (3.3V) + 'MONITORED_LINE_5V_LOGIC': 2, # Logic voltage (5V) + 'MONITORED_LINE_5V_SENSORS': 3, # Sensors voltage (5V) + 'MONITORED_LINE_24V': 4, # Actuators voltage (24V) + 'MONITORED_LINE_24V_REGEN': 5, # Actuators regen voltage (24V) + 'MONITORED_LINE_FPGA_REF_V': 6, # FPGA ADC reference voltage (1V) + 'MONITORED_LINE_PBA_REF_V': 7, # PBA ADC reference voltage (3V) + 'MONITORED_LINE_FPGA_VCC_V': 8, # FPGA Vcc (3V) + 'MONITORED_LINE_FPGA_AUX_V': 9, # FPGA Vaux (3V) + 'MONITORED_LINE_FPGA_PVN_V': 10, # FPGA Vpvn (1V) + 'NUM_OF_MONITORED_VOLTAGE_LINES': 11, # Number of TD operation modes + } + return DialinEnum('TDMonitoredVoltages', members) + + + + # ================================================== Enum Creators: Support ================================================== + def _create_td_air_pump_attributes(self): + members = { + 'STATE': 0, # TD Air Pump State to command attribute + 'POWER': 1, # TD Air Pump Power attribute + 'NUM_OF_AIR_PUMP_ATTRIBUTES': 2, # Number of Air Pump attributes + } + return DialinEnum('TDAirPumpAttributes', members) + + + def _create_td_air_trap_level_sensor_attributes(self): + members = { + 'LEVEL': 0, # Level attribute for Air Trap Level Sensor + 'RAW': 1, # Raw reading attribute for Air Trap Level Sensor + 'NUM_OF_AIR_TRAP_LEVEL_SENSOR_ATTRIBUTES': 2, # Number of Air Trap Level Sensor attributes + } + return DialinEnum('TDAirTrapLevelSensorAttributes', members) + + + def _create_td_air_trap_state(self): + members = { + 'STATE_CLOSED': 0, # Closed state for Air Trap + 'STATE_OPEN': 1, # Open state for Air Trap + } + return DialinEnum('TDAirTrapState', members) + + + def _create_td_blood_flow_motor_attributes(self): + members = { + 'SET_BLOOD_FLOW_RATE': 0, # Set Blood Flow Rate for Blood Flow Motor + 'MEASURED_BLOOD_FLOW_RATE': 1, # Measured Blood Flow Rate for Blood Flow Motor + 'MEASURED_BLOOD_PUMP_ROTOR_SPEED': 2, # Measured Bloop Pump Rotor Speed for Blood Flow Motor + 'MEASURED_BLOOD_PUMP_SPEED': 3, # Measured Blood Pump Speed for Blood Flow Motor + 'MEASURED_BLOOD_PUMP_TORQUE': 4, # Measured Blood Pump torque + 'SET_RPM': 5, # Set Revolutions per minute for Blood Flow Motor + 'ROTOR_COUNT': 6, # Rotor Count for Blood Flow Motor + 'PRES_BLOOD_FLOW_RATE': 7, # Pressure Blood Flow Rate for Blood Flow Motor + 'ROTOR_HALL_STATE': 8, # Rotor Hall State for Blood Flow Motor + 'NUM_OF_BLOOD_FLOW_MOTOR_ATTRIBUTES': 9, # Number of Blood Flow Motor Attributes + } + return DialinEnum('TDBloodFlowMotorAttributes', members) + + + def _create_td_air_bubble_detector_attributes(self): + members = { + 'STATUS': 0, # Status of the Air Bubble Detector + 'STATE': 1, # State of the Air Bubble Detector + 'NUM_OF_AIR_BUBBLE_DETECTOR_ATTRIBUTES': 2, # Number of Air Bubble Detector Attributes + } + return DialinEnum('TDAirBubbleDetectorAttributes', members) + + + def _create_td_ejector_attributes(self): + members = { + 'STATE': 0, # Ejector State to command + 'SET_SPEED': 1, # Ejector Set Speed + 'OPT_SNSR_RETRACT': 2, # Ejector optical sensor retract + 'OPT_SNSR_ENGAGE': 3, # Ejector optical sensor engage + 'NUM_OF_EJECTOR_ATTRIBUTES': 4, # Number of Ejector Attributes + } + return DialinEnum('TDEjectorAttributes', members) + + + def _create_td_pressure_sensor_attributes(self): + members = { + 'PRES': 0, # Pressure attribute of pressure sensor + 'LONG_FILTERED_PRESSURE': 1, # Long Filtered Pressure attribute of pressure sensor + 'PRES_LIMIT_MIN': 2, # Pressure Minimum Limit attribute of pressure sensor + 'PRES_LIMIT_MAX': 3, # Pressure Maximum Limit attribute of pressure sensor + 'NUM_OF_PRESSURE_ATTRIBUTES': 4, # Number of Pressure Sensor Attributes + } + return DialinEnum('TDPressureSensorAttributes', members) + + + def _create_td_switch_status(self): + members = { + 'CLOSED': 0, # Closed State of the TD Switch + 'OPEN': 1, # Open State of the TD Switch + } + return DialinEnum('TDSwitchStatus', members) + + + def _create_td_valve_positions(self): + members = { + 'VALVE_POSITION_NOT_IN_POSITION': 0, # Valve not in Position + 'VALVE_POSITION_A_INSERT_EJECT': 1, # Insert/Eject Valve Position + 'VALVE_POSITION_B_OPEN': 2, # Open Valve Position + 'VALVE_POSITION_C_CLOSE': 3, # Closed Valve Position + 'VALVE_POSITION_C_PARTIAL_CLOSE': 4, # Partial Close Valve Position + } + return DialinEnum('TDValvePositions', members) + + + def _create_td_valve_states(self): + members = { + 'VALVE_STATE_WAIT_FOR_POST': 0, # Waiting for POST Valve State + 'VALVE_STATE_RESET_VALVE': 1, # Valve state reset valve. + 'VALVE_STATE_RESET_ENCODER': 2, # Valve state reset encoder. + 'VALVE_STATE_ENABLE_VALVE': 3, # Valve state enable valve. + 'VALVE_STATE_HOMING_NOT_STARTED': 4, # Valve state homing not started. + 'VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE': 5, # Valve state homing find energized edge. + 'VALVE_STATE_HOMING_FIND_DEENERGIZED_EDGE': 6, # Valve state homing find. + 'VALVE_STATE_IDLE': 7, # Idle Valve State. + 'VALVE_STATE_IN_TRANSITION': 8, # Valve state in transition. + } + return DialinEnum('TDValveStates', members) + + +# ================================================== Creates a singleton ================================================== +td_enum_repository = TD_Defs() + +# Attach listener to update function +test_config_change.add_listener(td_enum_repository.update_enums) Index: leahi_dialin/fp/filtration_purification.py =================================================================== diff -u -r79697500614904bafb56f3d33e368b954ba78f7d -r55d97b27c73f8e08994328881d3f56cbc7f00e29 --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 79697500614904bafb56f3d33e368b954ba78f7d) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision 55d97b27c73f8e08994328881d3f56cbc7f00e29) @@ -33,7 +33,7 @@ from .proxies.dd_proxy import DDProxy from ..common.msg_defs import MsgIds, MsgFieldPositions, MsgFieldPositionsFWVersions -from ..common.fp_defs import FPOpModes +from ..common.fp_defs import fp_enum_repository from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from ..utils.base import AbstractSubSystem, publish, LogManager from ..utils.checks import check_broadcast_interval_override_ms @@ -97,7 +97,7 @@ self.fp_op_mode_timestamp = 0.0 self.fp_debug_events_timestamp = 0.0 self.fp_version_response_timestamp = 0.0 - self.fp_operation_mode = FPOpModes.MODE_INIT.value + self.fp_operation_mode = fp_enum_repository.FPOpModes.MODE_INIT.value self.fp_operation_sub_mode = 0 self.fp_logged_in = False self.fp_set_logged_in_status(False)