Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -r5f783280400baab74941d3fd4d3e3d5a97bd06ee -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 5f783280400baab74941d3fd4d3e3d5a97bd06ee) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -8,380 +8,665 @@ # @file dd_defs.py # # @author (last) Zoltan Miskolci -# @date (last) 09-Jan-2026 +# @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 + DDHeatDisinfectStates: 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', + 'DDHeatDisinfectStates': '_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_name in self._properties: + # Cleans the cached value + self.__dict__.pop(prop_name, None) + + # Reinitializing the enum as it's not in the cache + self.__getattr__(prop_name) -@unique -class 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 unique(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 DDConductivitySensorNames(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 unique(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 unique(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 unique(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 unique(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 unique(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 - D98_LEVEL = 3 # D98 Conductive Level Sensor - NUM_OF_LEVELS = 4 # 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 unique(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) - D87_PRES = 5 # D87 Pressure sensor - NUM_OF_PRESSURE_SENSORS = 6 # 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 + } -@unique -class DDROPermeateStates(DialinEnum): - NUM_OF_RO_PERMEATE_STATES = 0 # TODO: populate with RO Permeate states + return unique(DialinEnum('DDGenDialysateModeStates', members)) -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(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 # D99(D98) 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 - FIRST_PRESSURE_SENSOR = D9_TEMP # First Pressure Sensor - LAST_PRESSURE_SENSOR = D87_TEMP # Last Pressure Sensor - FIRST_CONDUCTIVITY_SENSOR = D16_TEMP # First Conductivity Sensor - LAST_CONDUCTIVITY_SENSOR = D99_TEMP # Last Conductivity Sensor - FIRST_TEMPERATURE_SENSOR = D1_TEMP # First Pre Sensor - LAST_TEMPERATURE_SENSOR = BRD_TEMP # Last Flow Sensor -@unique -class DDValveStates(DialinEnum): - VALVE_STATE_CLOSED = 0 # Valve Closed State - VALVE_STATE_OPEN = 1 # Valve Open State + 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 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 - D83_VALV = 25 # Valve De-scaler (D83) - D91_VALV = 26 # Valve De-scaler (D91) - SPARE3_VALV = 27 # Spare Valve 3 - SPARE4_VALV = 28 # Spare Valve 4 - SPARE5_VALV = 29 # Spare Valve 5 - D100_VALV = 30 # Valve De-scaler (D100) - SPARE7_VALV = 31 # Spare Valve 7 - FIRST_DD_VALVE = D14_VALV, # First DD valve - LAST_DD_VALVE = SPARE7_VALV, # Last DD valve - NUM_OF_DD_VALVES = 40 # Number of Valves for the DD + return unique(DialinEnum('DDPostGenDialysateStates', members)) -@unique -class DDNotLegalStates(DialinEnum): - NUM_OF_NOT_LEGAL_STATES = 0 # TODO: populate with Not Legal states -@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_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 unique(DialinEnum('DDHeatDisinfectStates', members)) + + + def _create_dd_heater_cooling_states(self): + members = { + 'NUM_OF_DD_HEAT_COOL_STATES': 0, # Number of Heater Cooling states + } + return unique(DialinEnum('DDHeaterCoolingStates', members)) + + + def _create_dd_ro_permeate_states(self): + members = { + 'NUM_OF_RO_PERMEATE_STATES': 0, # Number of RO Permeate states + } + return unique(DialinEnum('DDROPermeateStates', members)) + + + def _create_dd_not_legal_states(self): + members = { + 'NUM_OF_NOT_LEGAL_STATES': 0, # Number of Not Legal states + } + return unique(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 unique(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 unique(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 unique(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 unique(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 unique(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 unique(DialinEnum('DDHeaterNames', members)) + + + def _create_dd_level_sensor_names(self): + if GlobalVariables().HW_BETA_1_9 == True: + 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 + 'D98_LEVEL': 3, # D98 Conductivity Level Sensor + 'NUM_OF_LEVELS': 4, # Number of Level Sensors + } + else: + 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 unique(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 unique(DialinEnum('DDPistonPumpNames', members)) + + + def _create_dd_pressure_sensor_names(self): + if GlobalVariables().HW_BETA_1_9 == 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 unique(DialinEnum('DDPressureSensorNames', members)) + + + def _create_dd_temperature_sensor_names(self): + if GlobalVariables().HW_BETA_1_9 == 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().HW_BETA_1_9 == 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().HW_BETA_1_9 == 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 unique(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 unique(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 unique(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 unique(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 unique(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 unique(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 unique(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 unique(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 unique(DialinEnum('DDDialysatePumpsStates', members)) + + + def _create_dd_heater_start_stop(self): + return unique(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 unique(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 unique(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 unique(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 unique(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 -r914620537399ff9ecc4925fc56f8b8be567d184e -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision 914620537399ff9ecc4925fc56f8b8be567d184e) +++ leahi_dialin/common/fp_defs.py (.../fp_defs.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -8,227 +8,452 @@ # @file fp_defs.py # # @author (last) Zoltan Miskolci -# @date (last) 09-Jan-2026 +# @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 -from .dd_defs import DDConductivitySensorNames, DDPressureNames, DDValveNames +from .dd_defs import dd_enum_repository +from .global_vars import GlobalVariables, test_config_change from ..utils.base import DialinEnum -@unique -class FPOpModes(DialinEnum): - MODE_FAUL = 0 # Fault mode - MODE_SERV = 1 # Service mode - MODE_INIT = 2 # Initialization & POST mode - MODE_STAN = 3 # Standby mode - MODE_PRE_GENP = 4 # Pre Generate Permeate Mode - MODE_GENP = 5 # Generate Permeate Mode - MODE_DPGP = 6 # Defeatured Pre-Generate Permeate Mode - MODE_DEGP = 7 # Defeatured Generate Permeate Mode - MODE_NLEG = 8 # Not legal - an illegal mode transition occurred - NUM_OF_FP_MODES = 9 # Number of TD operation modes -@unique -class FPServiceStates(DialinEnum): - NUM_OF_FP_SERV_STATES = 0 # TODO populate with FP service states +class FP_Defs: -@unique -class FPPostStates(DialinEnum): - FP_POST_STATE_START = 0 # Start initialize & POST mode state - FP_POST_STATE_FW_INTEGRITY = 1 # Run firmware integrity test state - FP_POST_STATE_NVDATAMGMT = 2 # Run NV Data Mgmt. test state - FP_POST_STATE_WATCHDOG = 3 # Run watchdog test state - FP_POST_STATE_SAFETY_SHUTDOWN = 4 # Run safety shutdown test state - FP_POST_STATE_TEMPERATURES = 5 # Run temperatures POST state - FP_POST_STATE_FW_COMPATIBILITY = 6 # Run firmware compatibility test state - FP_POST_STATE_FPGA = 7 # Run FPGA test state - FP_POST_STATE_COMPLETED = 8 # POST self-tests completed state - FP_POST_STATE_FAILED = 9 # POST self-tests failed state - NUM_OF_FP_POST_STATES = 10 # Number of initialize & POST mode states + # IDE autocomplete suppor + if TYPE_CHECKING: + FPOpModes: DialinEnum + FPFaultStates: DialinEnum + FPServiceStates: DialinEnum + FPPostStates: DialinEnum + FPStandbyStates: DialinEnum + FPPreGenPermeateStates: DialinEnum + FPPreGenPDefStates: DialinEnum + FPGenPermeateStates: DialinEnum + FPGenPermeateDefStates: DialinEnum + FPNotLegalStates: DialinEnum + FPEventList: DialinEnum + FPEventDataTypes: DialinEnum -@unique -class FPFaultStates(DialinEnum): - FP_FAULT_STATE_START = 0 # FP Fault Start State - FP_FAULT_DEENERGIZED_STATE = 1 # FP Fault De-energized State - FP_FAULT_ENERGIZED_STATE = 2 # FP Fault Energized State - NUM_OF_FP_FAULT_STATES = 3 # Number of Fault Mode State + FPBoostPumpNames: DialinEnum + FPConductivitySensorNames: DialinEnum + FPRORejectionRatioNames: DialinEnum + FPFlowSensorNames: DialinEnum + FPFloaterLevelSensorNames: DialinEnum + FPPressureSensorNames: DialinEnum + FPROPumpNames: DialinEnum + FPTemperatureSensorNames: DialinEnum + FPValveNames: DialinEnum + FPAllPumpNames: DialinEnum + + FPFloaterLevels: DialinEnum + FPPumpAttributes: DialinEnum + FPValveStates: DialinEnum -@unique -class FPStandbyStates(DialinEnum): - FP_STANDBY_MODE_STATE_IDLE = 0 # Idle standby mode state - NUM_OF_FP_STANDBY_MODE_STATES = 1 # Number of standby mode states + # A Dictionary storing which Property(Enum) should be created by which function + _properties = { + # Operation / State enums + 'FPOpModes': '_create_fp_operation_modes', + 'FPFaultStates': '_create_fp_fault_states', + 'FPServiceStates': '_create_fp_service_states', + 'FPPostStates': '_create_fp_init_post_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', -@unique -class FPPreGenPermeateStates(DialinEnum): - FP_PRE_GENP_INLET_PRES_CHECK = 0 # FP Pre Gen Permeate Inlet Pressure Check State - FP_PRE_GENP_FILTER_FLUSH = 1 # FP Pre Gen Permeate Filter Flush State - FP_PRE_GENP_PERMEATE_FLUSH = 2 # FP Pre Gen Permeate Permeate Flush State - FP_PRE_GENP_CONCENTRATE_FLUSH = 3 # FP Pre Gen Permeate Concentrate Flush State - FP_PRE_GENP_VERIFY_WATER = 4 # FP Pre Gen Permeate Verify Water State - FP_PRE_GENP_PAUSED = 5 # FP Pre Gen Permeate Paused State - NUM_OF_FP_PRE_GENP_MODE_STATES = 6 # Number of Pre-Gen Permeate mode states + # Event enums + 'FPEventList': '_create_fp_eventlist', + 'FPEventDataTypes': '_create_fp_event_data_types', + + # Module Names enums + 'FPBoostPumpNames': '_create_fp_boost_pump_names', + 'FPConductivitySensorNames': '_create_fp_conductivity_sensor_names', + 'FPRORejectionRatioNames': '_create_fp_ro_rejection_ratio_names', + 'FPFlowSensorNames': '_create_fp_flow_sensor_names', + 'FPFloaterLevelSensorNames': '_create_fp_floater_sensor_names', + 'FPPressureSensorNames': '_create_fp_pressure_sensor_names', + 'FPROPumpNames': '_create_fp_ro_pump_names', + 'FPValveNames': '_create_fp_valve_names', + 'FPAllPumpNames': '_create_fp_all_pump_names', + 'FPTemperatureSensorNames': '_create_fp_temperature_sensor_names', -@unique -class FPPreGenPDefStates(DialinEnum): - FP_PRE_GENP_DEF_FLUSH = 0 # Pre Gen Permeate Defeatured Flush state - FP_PRE_GENP_DEF_INLET_WATER_CHECK = 1 # Pre Gen Permeate Defeatured Inlet Water Check state - FP_PRE_GENP_DEF_PAUSED = 2 # Defeatured Pre Gen Permeate Paused state - NUM_OF_FP_PRE_GENP_DEF_MODE_STATES = 3 # Number of Defeatured Pre Gen Permeate states + # Support enums + 'FPFloaterLevels': '_create_fp_floater_levels', + 'FPPumpAttributes': '_create_fp_pump_attributes', + 'FPValveStates': '_create_fp_valve_states', + } -@unique -class FPGenPermeateStates(DialinEnum): - FP_GENP_TANK_FILL_STATE = 0 # Gen Permeate Tank Fill low state - FP_GENP_TANK_FULL_STATE = 1 # Gen Permeate Tank Full state - NUM_OF_FP_GENP_MODE_STATES = 2 # Number of Gen permeate states + def __init__(self): + self.update_enums() -@unique -class FPGenPermeateDefStates(DialinEnum): - FP_GENP_DEF_SUPPLY_WATER = 0 # Gen Permeate Defeatured Supply Water state - FP_GENP_DEF_PAUSED = 1 # Gen Permeate Defeatured Paused state - NUM_OF_FP_GENP_DEF_MODE_STATES = 2 # Number of gen Permeate states -@unique -class FPNotLegalStates(DialinEnum): - NUM_OF_NOT_LEGAL_STATES = 0 # TODO: populate with Not Legal states + # Dynamically creates all the properties in runtime + def __getattr__(self, name) -> DialinEnum: + if name in self._properties: + value = getattr(self, self._properties[name])() + setattr(self, name, value) + return value + raise AttributeError(name) -@unique -class FPEventList(DialinEnum): - FP_EVENT_STARTUP = 0 # FP startup event - FP_EVENT_OP_MODE_CHANGE = 1 # FP Op mode change event - FP_EVENT_SUB_MODE_CHANGE = 2 # FP Op sub-mode change event - FP_EVENT_PRE_GEN_RO_SET_PWM = 3 # FP gen permeate ro set pwm event - FP_EVENT_GENP_BOOST_SET_PWM = 4 # FP gen permeate boost set pwm event - FP_EVENT_GENP_CHANGE = 5 # FP gen permeate state change - FP_EVENT_PRE_GEN_CHANGE = 6 # FP pre gen state change - FP_EVENT_PRE_GEN_DEF_CHANGE = 7 # FP defeatured pre gen state change - FP_EVENT_GENP_DEF_CHANGE = 8 # FP defeatured pre gen state change - FP_EVENT_FAULT_ALARM_TRIGGER = 9 # FP event for alarms that would trigger - NUM_OF_FP_EVENT_IDS = 10 # Total number of FP events -@unique -class FPEventDataType(DialinEnum): - EVENT_DATA_TYPE_NONE = 0 # No Event Data Type - EVENT_DATA_TYPE_U32 = 1 # Unsigned 32bit Event Data Type - EVENT_DATA_TYPE_S32 = 2 # Signed 32bit Event Data Type - EVENT_DATA_TYPE_F32 = 3 # Float 32bit Event Data Type - EVENT_DATA_TYPE_BOOL = 4 # Boolean Event Data Type - NUM_OF_EVENT_DATA_TYPES = 5 # Number of Event Data Types + # Attached to a listener to update the enums when the listener is triggered + def update_enums(self) -> None: + for prop_name in self._properties: + # Cleans the cached value + self.__dict__.pop(prop_name, None) + + # Reinitializing the enum as it's not in the cache + self.__getattr__(prop_name) -@unique -class FPBoostPumpNames(DialinEnum): - P40_PUMP = 0 # FP Boost Pump - NUM_OF_BOOST_PUMPS = 1 # Number of FP Boost Pumps -@unique -class FPConductivitySensorNames(DialinEnum): - P9_COND = 0 # CPi (P9) conductivity sensor value - P18_COND = 1 # CPo (P18) conductivity sensor value - NUM_OF_FP_CONDUCTIVITY = 2 # Number of Conductivity sensors -@unique -class FPRORejectionRatioEnum(DialinEnum): - RAW_RO_REJECTION_RATIO = 0 # Raw RO Rejection Ratio value - RAW_RO_REJECTION_RATIO_TANK_FILL = 1 # Raw RO Rejection Ratio Tank Fill value - AVG_RO_REJECTION_RATIO = 2 # Average RO Rejection Ratio value - AVG_RO_REJECTION_RATIO_TANK_FILL = 3 # Average RO Rejection Ratio Tank Fill value - GEN_PERMEATE_STATE = 4 # Generate Permeate State value - NUM_OF_FP_CONDUCTIVITY = 5 # Number of RO Rejection Ratio items + # ================================================== Enum Creators: Operations ================================================== + def _create_fp_operation_modes(self): + members = { + 'MODE_FAUL': 0, # Fault mode + 'MODE_SERV': 1, # Service mode + 'MODE_INIT': 2, # Initialization & POST mode + 'MODE_STAN': 3, # Standby mode + 'MODE_PRE_GENP': 4, # Pre Generate Permeate mode + 'MODE_GENP': 5, # Generate Permeate mode + 'MODE_DPGP': 6, # Defeatured Pre-Generate Permeate mode + 'MODE_DEGP': 7, # Defeatured Generate Permeate mode + 'MODE_NLEG': 8, # Not legal - an illegal mode transition occurred + 'NUM_OF_FP_MODES': 9, # Number of FP operation modes + } + return unique(DialinEnum('FPOpModes', members)) -@unique -class FPFlowSensorNames(DialinEnum): - P7_FLOW = 0 # Water inlet flow sensor (FMS P7) - P16_FLOW = 1 # RO outlet flow sensor (FMP P16) - NUM_OF_FP_FLOW_SENSORS = 2 # Number of FP Flow Sensors -@unique -class FPFloaterLevels(DialinEnum): - LEVEL_STATE_EMPTY = 0 # Empty level for the FP Floater Level Sensors - LEVEL_STATE_LOW = 1 # Low level for the FP Floater Level Sensors - LEVEL_STATE_MEDIUM = 2 # Medium level for the FP Floater Level Sensors - LEVEL_STATE_HIGH = 3 # High level for the FP Floater Level Sensors - LEVEL_STATE_ILLEGAL = 4 # Illegal level for FP Floater Level Sensor (indicates investigation) - NUM_OF_LEVEL_STATES = 5 # Number of Level States + 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 unique(DialinEnum('FPFaultStates', members)) -@unique -class FPFloaterLevelSensorNames(DialinEnum): - P25_LEVEL = 0 # P25 Level sensor - NUM_OF_FP_LEVEL_SENSORS = 1 # Number of FP Level Sensors -class FPPressureSensorNames(DialinEnum): - M3_PRES = 0 # Water inlet pressure before regulator - P8_PRES = 1 # Water inlet pressure after regulator - P13_PRES = 2 # Water inlet pressure before the conductivity sensor - P17_PRES = 3 # Pressure before the RO filter - P46_PRES = 4 # Pressure after the RO filter - NUM_OF_FP_PRES_SENSORS = 5 # Number of Pressure Sensors - FIRST_FP_SENSOR = P8_PRES # First FP Sensor - LAST_FP_SENSOR = P46_PRES # Last FP Sensor + def _create_fp_service_states(self): + members = { + 'NUM_OF_FP_SERV_STATES': 0, # Number of FP service states + } + return unique(DialinEnum('FPServiceStates', members)) -@unique -class ROPumpNames(DialinEnum): - P12_PUMP = 0 # P12 RO Pump - NUM_OF_RO_PUMPS = 1 # Number of RO Pumps -@unique -class FPPumpAttributes(DialinEnum): - STATE = 0 # State to command attribute for Pumps - DUTY_CYCLE = 1 # Duty Cycle attribute for Pumps - FB_DUTY_CYCLE = 2 # Feedback Duty Cycle attribute for Pumps - SPEED = 3 # Current Speed attribute for pumps - TARGET_PRES = 4 # Target Pressure attribute for pumps - TARGET_FLOW = 5 # Target Flow attribute for pumps - TARGET_DUTY_CYCLE = 6 # Target Duty Cycle attribute for pumps - DUTY_CYCLE_PCT = 7 # Duty Cycle Percentage attribute for pumps - FB_DUTY_CYCLE_PCT = 8 # Feedback Duty Cycle Percentage attribute for pumps - NUM_OF_RO_PUMP_ATTRIBUTES = 9 # Number of pump attributes + 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 + 'FP_POST_STATE_NVDATAMGMT': 2, # Run NV Data Mgmt. test state + 'FP_POST_STATE_WATCHDOG': 3, # Run watchdog test state + 'FP_POST_STATE_SAFETY_SHUTDOWN': 4, # Run safety shutdown test state + 'FP_POST_STATE_TEMPERATURES': 5, # Run temperatures POST state + 'FP_POST_STATE_FW_COMPATIBILITY': 6, # Run firmware compatibility test state + 'FP_POST_STATE_FPGA': 7, # Run FPGA test state + 'FP_POST_STATE_COMPLETED': 8, # POST self-tests completed state + 'FP_POST_STATE_FAILED': 9, # POST self-tests failed state + 'NUM_OF_FP_POST_STATES': 10 # Number of initialize & POST mode states + } + return unique(DialinEnum('FPPostStates', members)) -class FPTemperaturesNames(DialinEnum): - M3_TEMP = 0 # Temperature after pressure regulator (M3) - P8_TEMP = 1 # Temperature before inlet conductivity sensor (P8) - P13_TEMP = 2 # Temperature before RO filter (P13) - P17_TEMP = 3 # Temperature after RO filter (P17) - P46_TEMP = 4 # Temperature after sediment filter (P46) - P10_TEMP = 5 # P10 temperature from inlet conductivity sensor. - P19_TEMP = 6 # P19 temperature from outlet conductivity sensor. - P7_TEMP = 7 # Temperature at p7 flow meter - P16_TEMP = 8 # Temperature at p16 flow meter - NUM_OF_TEMPERATURE_SENSORS = 9 # Number of Temperature Sensors - FIRST_PRESSURE_SENSOR = M3_TEMP # First Pressure Sensor - LAST_PRESSURE_SENSOR = P46_TEMP # Last Pressure Sensor - FIRST_CONDUCTIVITY_SENSOR = P10_TEMP # First Conductivity Sensor - LAST_CONDUCTIVITY_SENSOR = P19_TEMP # Last Conductivity Sensor - FIRST_FLOW_SENSOR = P7_TEMP # First FLow Sensor - LAST_FLOW_SENSOR = P16_TEMP # Last Flow Sensor -@unique -class FPValveStates(DialinEnum): - VALVE_STATE_CLOSED = 0 # Valve Closed State - VALVE_STATE_OPEN = 1 # Valve Open State + 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 unique(DialinEnum('FPStandbyStates', members)) -@unique -class FPValveNames(DialinEnum): - M4_VALV = 0 # Valve (M4 VWi) - M12_VALV = 1 # Valve (M12) - P11_VALV = 2 # Valve (P11 VPi) - P33_VALV = 3 # Valve (P33 VCr) - P34_VALV = 4 # Valve (P34 VCb) - P37_VALV = 5 # Valve (P37 VCd) - P39_VALV = 6 # Valve (P39 VROd) - P6_VALV = 7 # Valve (P6 VFF) - NUM_OF_FP_VALVES = 8 # Number of valves -@unique -class FPPumpNames(DialinEnum): - P12_PUMP_RO = 0 # RO Pump - P40_PUMP_BOOSTER = 1 # Booster Pump + def _create_fp_pregen_states(self): + members = { + 'FP_PRE_GENP_INLET_PRES_CHECK': 0, # FP Pre Gen Permeate Inlet Pressure Check State + 'FP_PRE_GENP_FILTER_FLUSH': 1, # FP Pre Gen Permeate Filter Flush State + 'FP_PRE_GENP_PERMEATE_FLUSH': 2, # FP Pre Gen Permeate Permeate Flush State + 'FP_PRE_GENP_CONCENTRATE_FLUSH': 3, # FP Pre Gen Permeate Concentrate Flush State + 'FP_PRE_GENP_VERIFY_WATER': 4, # FP Pre Gen Permeate Verify Water State + 'FP_PRE_GENP_PAUSED': 5, # FP Pre Gen Permeate Paused State + 'NUM_OF_FP_PRE_GENP_MODE_STATES': 6, # Number of Pre-Gen Permeate mode states + } + return unique(DialinEnum('FPPreGenPermeateStates', members)) -# To offset the FP enums with the DD values, as they lsited after the DD in the FW -BETA_IOFP_COND_SENSOR_OFFSET = DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum -BETA_IOFP_PRES_SENSOR_OFFSET = DDPressureNames.NUM_OF_PRESSURE_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware PressureSensors enum -BETA_IOFP_VALVE_OFFSET = DDValveNames.NUM_OF_DD_VALVES.value # Offset to translate Dialin FPValveNames to DD firmware DD_Valves + 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 unique(DialinEnum('FPPreGenPDefStates', members)) + + + 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 unique(DialinEnum('FPGenPermeateStates', members)) + + + 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 unique(DialinEnum('FPGenPermeateDefStates', members)) + + + def _create_fp_not_legal_states(self): + members = { + 'NUM_OF_NOT_LEGAL_STATES': 0, # Number of Not Legal states + } + return unique(DialinEnum('FPNotLegalStates', members)) + + + def _create_fp_eventlist(self): + members = { + 'FP_EVENT_STARTUP': 0, # FP startup event + 'FP_EVENT_OP_MODE_CHANGE': 1, # FP Op mode change event + 'FP_EVENT_SUB_MODE_CHANGE': 2, # FP Op sub-mode change event + 'FP_EVENT_PRE_GEN_RO_SET_PWM': 3, # FP gen permeate ro set pwm event + 'FP_EVENT_GENP_BOOST_SET_PWM': 4, # FP gen permeate boost set pwm event + 'FP_EVENT_GENP_CHANGE': 5, # FP gen permeate state change + 'FP_EVENT_PRE_GEN_CHANGE': 6, # FP pre gen state change + 'FP_EVENT_PRE_GEN_DEF_CHANGE': 7, # FP defeatured pre gen state change + 'FP_EVENT_GENP_DEF_CHANGE': 8, # FP defeatured gen permeate state change + 'FP_EVENT_FAULT_ALARM_TRIGGER': 9, # FP event for alarms that would trigger + 'NUM_OF_FP_EVENT_IDS': 10, # Number of FP events + } + return unique(DialinEnum('FPEventList', members)) + + + 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 + '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 unique(DialinEnum('FPEventDataTypes', members)) + + + + # ================================================== 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 unique(DialinEnum('FPBoostPumpNames', members)) + + + 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 + } + + return unique(DialinEnum('FPConductivitySensorNames', members)) + + + def _create_fp_ro_rejection_ratio_names(self): + members = { + 'RAW_RO_REJECTION_RATIO': 0, # Raw RO Rejection Ratio value + 'RAW_RO_REJECTION_RATIO_TANK_FILL': 1, # Raw RO Rejection Ratio Tank Fill value + 'AVG_RO_REJECTION_RATIO': 2, # Average RO Rejection Ratio value + 'AVG_RO_REJECTION_RATIO_TANK_FILL': 3, # Average RO Rejection Ratio Tank Fill value + 'GEN_PERMEATE_STATE': 4, # Generate Permeate State value + 'NUM_OF_FP_RO_REJECTION_RATIO': 5, # Number of RO Rejection Ratio items + } + return unique(DialinEnum('FPRORejectionRatioNames', members)) + + + 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 unique(DialinEnum('FPFlowSensorNames', members)) + + + 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 unique(DialinEnum('FPFloaterLevelSensorNames', members)) + + + def _create_fp_pressure_sensor_names(self): + if GlobalVariables().HW_BETA_1_9 == True: + members = { + 'M3_PRES' : 0, # Water inlet pressure before regulator + 'P8_PRES' : 1, # Water inlet pressure after regulator + 'P13_PRES' : 2, # Water inlet pressure before the conductivity sensor + 'P17_PRES' : 3, # Pressure before the RO filter + 'P46_PRES' : 4, # Pressure after the RO filter + 'NUM_OF_FP_PRES_SENSORS' : 5, # Number of Pressure Sensors + } + else: + members = { + 'M3_PRES' : 0, # Water inlet pressure before regulator + 'P8_PRES' : 1, # Water inlet pressure after regulator + 'P13_PRES' : 2, # Water inlet pressure before the conductivity sensor + 'P17_PRES' : 3, # Pressure before the RO filter + 'NUM_OF_FP_PRES_SENSORS' : 4, # Number of Pressure Sensors + } + return unique(DialinEnum('FPPressureSensorNames', members)) + + + def _create_fp_ro_pump_names(self): + members = { + 'P12_PUMP': 0, # P12 RO Pump + 'NUM_OF_RO_PUMPS': 1, # Number of RO Pumps + } + return unique(DialinEnum('FPROPumpNames', members)) + + + def _create_fp_temperature_sensor_names(self): + if GlobalVariables().HW_BETA_1_9 == True: + members = { + 'M3_TEMP' : 0, # Temperature after pressure regulator (M3) + 'P8_TEMP' : 1, # Temperature before inlet conductivity sensor (P8) + 'P13_TEMP' : 2, # Temperature before RO filter (P13) + 'P17_TEMP' : 3, # Temperature after RO filter (P17) + 'P46_TEMP' : 4, # Temperature after sediment filter (P46) + 'P10_TEMP' : 5, # P10 temperature from inlet conductivity sensor. + 'P19_TEMP' : 6, # P19 temperature from outlet conductivity sensor. + 'P7_TEMP' : 7, # Temperature at p7 flow meter + 'P16_TEMP' : 8, # Temperature at p16 flow meter + 'P7_INTERNAL_TEMP' : 9, # Interal Temperature at p7 flow meter + 'P16_INTERNAL_TEMP' : 10, # Interal Temperature at p16 flow meter + 'NUM_OF_TEMPERATURE_SENSORS' : 11, # Number of Temperature Sensors + } + else: + members = { + 'M3_TEMP' : 0, # Temperature after pressure regulator (M3) + 'P8_TEMP' : 1, # Temperature before inlet conductivity sensor (P8) + 'P13_TEMP' : 2, # Temperature before RO filter (P13) + 'P17_TEMP' : 3, # Temperature after RO filter (P17) + 'P10_TEMP' : 4, # P10 temperature from inlet conductivity sensor. + 'P19_TEMP' : 5, # P19 temperature from outlet conductivity sensor. + 'P7_TEMP' : 6, # Temperature at p7 flow meter + 'P16_TEMP' : 7, # Temperature at p16 flow meter + 'P7_INTERNAL_TEMP' : 8, # Interal Temperature at p7 flow meter + 'P16_INTERNAL_TEMP' : 9, # Interal Temperature at p16 flow meter + 'NUM_OF_TEMPERATURE_SENSORS' : 10, # Number of Temperature Sensors + } + + # Create the enum + created_enum = DialinEnum('FPTemperatureSensorNames', members) + + # Add aliases + 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().HW_BETA_1_9 == 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) + 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 created_enum + + + def _create_fp_valve_names(self): + members = { + 'M4_VALV': 0, # Valve (M4 VWi) + 'M12_VALV': 1, # Valve (M12) + 'P11_VALV': 2, # Valve (P11 VPi) + 'P33_VALV': 3, # Valve (P33 VCr) + 'P34_VALV': 4, # Valve (P34 VCb) + 'P37_VALV': 5, # Valve (P37 VCd) + 'P39_VALV': 6, # Valve (P39 VROd) + 'P6_VALV': 7, # Valve (P6 VFF) + 'NUM_OF_FP_VALVES': 8, # Number of valves + } + return unique(DialinEnum('FPValveNames', members)) + + + + def _create_fp_all_pump_names(self): + members = { + 'P12_PUMP_RO': 0, # P14 RO Pump + 'P40_PUMP_BOOSTER': 1, # P40 Boost Pump + } + return unique(DialinEnum('FPAllPumpNames', members)) + + + + # ================================================== Enum Creators: Support ================================================== + def _create_fp_floater_levels(self): + members = { + 'LEVEL_STATE_EMPTY': 0, # Empty level for the FP Floater Level Sensors + 'LEVEL_STATE_LOW': 1, # Low level for the FP Floater Level Sensors + 'LEVEL_STATE_MEDIUM': 2, # Medium level for the FP Floater Level Sensors + 'LEVEL_STATE_HIGH': 3, # High level for the FP Floater Level Sensors + 'LEVEL_STATE_ILLEGAL': 4, # Illegal level for FP Floater Level Sensor (indicates investigation) + 'NUM_OF_LEVEL_STATES': 5, # Number of Level States + } + return unique(DialinEnum('FPFloaterLevels', members)) + + + def _create_fp_pump_attributes(self): + members = { + 'STATE': 0, # State to command attribute for Pumps + 'DUTY_CYCLE': 1, # Duty Cycle attribute for Pumps + 'FB_DUTY_CYCLE': 2, # Feedback Duty Cycle attribute for Pumps + 'SPEED': 3, # Current Speed attribute for pumps + 'TARGET_PRES': 4, # Target Pressure attribute for pumps + 'TARGET_FLOW': 5, # Target Flow attribute for pumps + 'TARGET_DUTY_CYCLE': 6, # Target Duty Cycle attribute for pumps + 'DUTY_CYCLE_PCT': 7, # Duty Cycle Percentage attribute for pumps + 'FB_DUTY_CYCLE_PCT': 8, # Feedback Duty Cycle Percentage attribute for pumps + 'NUM_OF_RO_PUMP_ATTRIBUTES': 9, # Number of pump attributes + } + return unique(DialinEnum('FPPumpAttributes', members)) + + + def _create_fp_valve_states(self): + members = { + 'VALVE_STATE_CLOSED': 0, # Valve Closed State + 'VALVE_STATE_OPEN': 1, # Valve Open State + } + return unique(DialinEnum('FPValveStates', members)) + + + +# ================================================== Creates a singleton ================================================== +fp_enum_repository = FP_Defs() + +# Attach listener to update function +test_config_change.add_listener(fp_enum_repository.update_enums) + + +BETA_IOFP_COND_SENSOR_OFFSET = dd_enum_repository.DDConductivitySensorNames.NUM_OF_CONDUCTIVITY_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware DD Conductivity Sensors enum +BETA_IOFP_PRES_SENSOR_OFFSET = dd_enum_repository.DDPressureSensorNames.NUM_OF_PRESSURE_SENSORS.value # Offset to translate Dialin FPTemperaturesNames to DD firmware DD Pressure Sensors enum +BETA_IOFP_VALVE_OFFSET = dd_enum_repository.DDValveNames.NUM_OF_DD_VALVES.value # Offset to translate Dialin FPValveNames to DD firmware DD_Valves Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -r410054cfec7aee839266233249413b08b368fbd3 -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 410054cfec7aee839266233249413b08b368fbd3) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -132,6 +132,22 @@ MSG_ID_DD_DATE_AND_TIME_REQUEST = 0x6E MSG_ID_DD_DATE_AND_TIME_RESPONSE = 0x6F MSG_ID_FP_RO_REJECTION_RATIO_DATA = 0x71 + MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0x72 + MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0x73 + MSG_ID_UI_BOLUS_VOLUME_CHANGE_REQUEST = 0x74 + MSG_ID_TD_BOLUS_VOLUME_CHANGE_RESPONSE = 0x75 + MSG_ID_UI_DURATION_VALIDATE_REQUEST = 0x76 + MSG_ID_TD_DURATION_VALIDATE_RESPONSE = 0x77 + MSG_ID_UI_DURATION_CONFIRM_REQUEST = 0x78 + MSG_ID_TD_DURATION_CONFIRM_RESPONSE = 0x79 + MSG_ID_UI_TREATMENT_SET_POINTS_CHANGE_REQUEST = 0x7A + MSG_ID_TD_TREATMENT_SET_POINTS_CHANGE_RESPONSE = 0x7B + MSG_ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_REQUEST = 0x7C + MSG_ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESPONSE = 0x7D + MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_REQUEST = 0x7E + MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESPONSE = 0x7F + MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMPERATURE_CHANGE_REQUEST = 0x80 + MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMPERATURE_CHANGE_RESPONSE = 0x81 MSG_ID_TD_INSTITUTIONAL_RECORD_REQUEST = 0x82 MSG_ID_TD_INSTITUTIONAL_RECORD_RESPONSE = 0x83 MSG_ID_TD_ADJUST_INSTITUTIONAL_RECORD_REQUEST = 0x84 @@ -148,6 +164,11 @@ MSG_ID_DD_PISTON_PUMP_CONTROL_DATA = 0xF0 + MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST = 0X92 + MSG_ID_TD_ADJUST_DISPOSABLES_CONFIRM_RESPONSE = 0X93 + MSG_ID_UI_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_REQUEST = 0X94 + MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE = 0X95 + MSG_ID_TD_TESTER_LOGIN_REQUEST = 0x8000 MSG_ID_TD_SOFTWARE_RESET_REQUEST = 0x8001 MSG_ID_TD_SEND_TEST_CONFIGURATION = 0x8002 @@ -365,10 +386,12 @@ MSG_ID_FP_SET_START_STOP_OVERRIDE_REQUEST = 0xB033 MSG_ID_FP_RO_REJECTION_RATIO_PUBLISH_INTERVAL_OVERRIDE_REQUEST = 0xB034 MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST = 0xB035 + MSG_ID_FP_DEF_STATUS_REQUEST = 0xB049 + MSG_ID_FP_DEF_STATUS_RESPONSE = 0xB04A MSG_ID_TD_DEBUG_EVENT = 0xFFF1 MSG_ID_DD_DEBUG_EVENT = 0xFFF2 MSG_ID_FP_DEBUG_EVENT = 0xFFF3 - MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0xFFFF \ No newline at end of file + MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK = 0xFFFF Index: leahi_dialin/common/test_config_defs.py =================================================================== diff -u -re27f157082335696e336c9d9952392bc62e3c8c8 -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/common/test_config_defs.py (.../test_config_defs.py) (revision e27f157082335696e336c9d9952392bc62e3c8c8) +++ leahi_dialin/common/test_config_defs.py (.../test_config_defs.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -7,8 +7,8 @@ # # @file test_config_defs.py # -# @author (last) Dara Navaei -# @date (last) 16-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 21-Jan-2026 # @author (original) Dara Navaei # @date (original) 24-Apr-2023 # @@ -20,14 +20,13 @@ @unique class DDFPTestConfigOptions(DialinEnum): - TEST_CONFIG_DISABLE_BC_PRES_ALARM = 0 # (DD) Test configuration to disable Balancing Chamber pressure alarms - TEST_CONFIG_ENABLE_BETA_1_9_HW = 1 # (DD & FP) Test configuration to switch to HW in development - TEST_CONFIG_USE_DIENER_1000_PUMP = 2 # (DD) Test configuration to use Diener 1000 concentracte pump instead of Diener 2000 - TEST_CONFIG_DISABLE_CHAMBER_H_FILL = 3 # (DD) Test configuration to disable Chamber H fill in case if D46 sensor is disabled - TEST_CONFIG_DISABLE_CHAMBER_F_FILL = 4 # (DD) Test configuration to disable Chamber F fill in case if D63 and D98 sensor is disabled + TEST_CONFIG_DISABLE_BC_PRES_ALARM = 0 # (DD) Test configuration disabling BC pressure alarms + TEST_CONFIG_ENABLE_BETA_1_9_HW = 1 # (DD & FP) Test configuration using Beta Hardware + TEST_CONFIG_ENABLE_DRY_BICART_FILL = 2 # Test configuration disabling Dry Bicart fill check + TEST_CONFIG_ENABLE_4WIRE_RINSE_PUMP = 3 # Test configuration Enabling 4 wire rinse pump + TEST_CONFIG_SKIP_PRE_GEN_FLUSH = 4 # Test configuration to skip pre-gen flush NUM_OF_TEST_CONFIGS = 5 # Number of Test Configs - @unique class TDTestConfigOptions(DialinEnum): TEST_CONFIG_ENABLE_BETA_1_9_HW = 0 # Test configuration to switch to HW in development Index: leahi_dialin/dd/dialysate_delivery.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/dialysate_delivery.py (.../dialysate_delivery.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -41,7 +41,7 @@ from .proxies.td_proxy import TDProxy from ..common.constants import NO_RESET -from ..common.dd_defs import DDOpModes +from ..common.dd_defs import dd_enum_repository from ..common.msg_defs import MsgIds, MsgFieldPositions, MsgFieldPositionsFWVersions from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels @@ -104,7 +104,7 @@ self.dd_op_mode_timestamp = 0.0 self.dd_debug_events_timestamp = 0.0 self.dd_version_response_timestamp = 0.0 - self.dd_operation_mode = DDOpModes.MODE_INIT.value + self.dd_operation_mode = dd_enum_repository.DDOpModes.MODE_INIT.value self.dd_operation_sub_mode = 0 self.dd_logged_in = False self.dd_set_logged_in_status(False) @@ -302,7 +302,7 @@ channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_SET_OPERATION_MODE_OVERRIDE_REQUEST, entity_name = 'DD Operation Mode', - override_text = DDOpModes(new_mode).name, + override_text = dd_enum_repository.DDOpModes(new_mode).name, logger = self.logger, can_interface = self.can_interface) Index: leahi_dialin/dd/modules/alarms.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/alarms.py (.../alarms.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,7 +19,7 @@ from leahi_dialin.common.alarm_defs import AlarmList from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDEventDataType +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels @@ -75,8 +75,8 @@ self.alarm_data_type = dict() # Loop through the list of the event data type enum and update the dictionary - for data_type in DDEventDataType: - event_data_type = DDEventDataType(data_type).name + for data_type in dd_enum_repository.DDEventDataTypes: + event_data_type = dd_enum_repository.DDEventDataTypes(data_type).name struct_unpack_type = None # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is @@ -105,13 +105,13 @@ data_typ_1 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) # Get the corresponding structure format - struct_data_type_1 = self.alarm_data_type[DDEventDataType(data_typ_1[0]).name] + struct_data_type_1 = self.alarm_data_type[dd_enum_repository.DDEventDataTypes(data_typ_1[0]).name] # Get the data value by unpacking the data type data_1 = struct.unpack(struct_data_type_1, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])) data_typ_2 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) # Get the corresponding structure format - struct_data_type_2 = self.alarm_data_type[DDEventDataType(data_typ_2[0]).name] + struct_data_type_2 = self.alarm_data_type[dd_enum_repository.DDEventDataTypes(data_typ_2[0]).name] # Get the data value by unpacking the data type data_2 = struct.unpack(struct_data_type_2, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) Index: leahi_dialin/dd/modules/blood_leak.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/blood_leak.py (.../blood_leak.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,7 +19,7 @@ from enum import unique from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDBloodLeakStates +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -75,7 +75,7 @@ self.dd_blood_leak_status_timestamp = 0.0 self.dd_blood_leak_emb_mode_response_timestamp = 0.0 self.blood_leak_status = self.NO_BLOOD_LEAK_DETECTED - self.blood_leak_state = DDBloodLeakStates.BLOOD_LEAK_INIT_STATE.value + self.blood_leak_state = dd_enum_repository.DDBloodLeakStates.BLOOD_LEAK_INIT_STATE.value self.blood_leak_emb_mode_cmds = dict() self.blood_leak_error_persistent_ctr = 0 self.blood_leak_serial_comm_state = 0 Index: leahi_dialin/dd/modules/concentrate_pump.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDConcentratePumpsEnum, DDConcentratePumpAttributesEnum +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -47,38 +47,38 @@ self._handler_concentrate_pumps_sync) self.dd_concentrate_pumps = { - DDConcentratePumpsEnum.D10_CP2_BICARB.name: { - DDConcentratePumpAttributesEnum.CURRENT_STATE.name: 0, - DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.MEASURED_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.TARGET_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.PULSE_US.name: 0.0, - DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name: 0, - DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name: 0, - DDConcentratePumpAttributesEnum.PARKED.name: False, - DDConcentratePumpAttributesEnum.PARK_FAULT.name: False + dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name: { + dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.PARKED.name: False, + dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name: False }, - DDConcentratePumpsEnum.D11_CP1_ACID.name: { - DDConcentratePumpAttributesEnum.CURRENT_STATE.name: 0, - DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.MEASURED_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.TARGET_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.PULSE_US.name: 0.0, - DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name: 0, - DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name: 0, - DDConcentratePumpAttributesEnum.PARKED.name: False, - DDConcentratePumpAttributesEnum.PARK_FAULT.name: False + dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name: { + dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.PARKED.name: False, + dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name: False }, - DDConcentratePumpsEnum.D76_UF.name: { - DDConcentratePumpAttributesEnum.CURRENT_STATE.name: 0, - DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.MEASURED_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.TARGET_SPEED.name: 0.0, - DDConcentratePumpAttributesEnum.PULSE_US.name: 0.0, - DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name: 0, - DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name: 0, - DDConcentratePumpAttributesEnum.PARKED.name: None, # D76 doesn't utilize this attribute - DDConcentratePumpAttributesEnum.PARK_FAULT.name: None # D76 doesn't utilize this attribute + dd_enum_repository.DDConcentratePumpNames.D76_UF.name: { + dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name: 0.0, + dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name: 0, + dd_enum_repository.DDConcentratePumpAttributes.PARKED.name: None, # D76 doesn't utilize this attribute + dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name: None # D76 doesn't utilize this attribute } } @@ -94,55 +94,55 @@ @param message: published concentrate pumps' data message @return: None """ - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.MEASURED_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.MEASURED_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.CURRENT_STATE.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.CURRENT_STATE.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.PULSE_US.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.PULSE_US.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.TARGET_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.TARGET_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.PARKED.name] = \ + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.PARKED.name] = \ True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_15:MsgFieldPositions.END_POS_FIELD_15]))[0] == 1 else False - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.PARKED.name] = \ + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.PARKED.name] = \ True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_16:MsgFieldPositions.END_POS_FIELD_16]))[0] == 1 else False - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D11_CP1_ACID.name][DDConcentratePumpAttributesEnum.PARK_FAULT.name] = \ + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D11_CP1_ACID.name][dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name] = \ True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_17:MsgFieldPositions.END_POS_FIELD_17]))[0] == 1 else False - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D10_CP2_BICARB.name][DDConcentratePumpAttributesEnum.PARK_FAULT.name] = \ + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D10_CP2_BICARB.name][dd_enum_repository.DDConcentratePumpAttributes.PARK_FAULT.name] = \ True if struct.unpack('I', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_18:MsgFieldPositions.END_POS_FIELD_18]))[0] == 1 else False - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.TARGET_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.TARGET_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_19:MsgFieldPositions.END_POS_FIELD_19])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.CURRENT_SET_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_SET_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_20:MsgFieldPositions.END_POS_FIELD_20])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.MEASURED_SPEED.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.MEASURED_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_21:MsgFieldPositions.END_POS_FIELD_21])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.TARGET_REV_COUNT.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.TARGET_REV_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_22:MsgFieldPositions.END_POS_FIELD_22])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.MEASURED_REV_COUNT.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.MEASURED_REV_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_23:MsgFieldPositions.END_POS_FIELD_23])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.CURRENT_STATE.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.CURRENT_STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_24:MsgFieldPositions.END_POS_FIELD_24])))[0] - self.dd_concentrate_pumps[DDConcentratePumpsEnum.D76_UF.name][DDConcentratePumpAttributesEnum.PULSE_US.name] = ( + self.dd_concentrate_pumps[dd_enum_repository.DDConcentratePumpNames.D76_UF.name][dd_enum_repository.DDConcentratePumpAttributes.PULSE_US.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_25:MsgFieldPositions.END_POS_FIELD_25])))[0] self.dd_concentrate_pump_timestamp = timestamp @@ -187,7 +187,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE_REQUEST, - entity_name = f'DD {DDConcentratePumpsEnum(pump_id).name} Concentrate Pump target speed', + entity_name = f'DD {dd_enum_repository.DDConcentratePumpNames(pump_id).name} Concentrate Pump target speed', override_text = str(speed), logger = self.logger, can_interface = self.can_interface) @@ -212,7 +212,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE_REQUEST, - entity_name = f'DD {DDConcentratePumpsEnum(pump_id).name} Concentrate Pump measured speed', + entity_name = f'DD {dd_enum_repository.DDConcentratePumpNames(pump_id).name} Concentrate Pump measured speed', override_text = str(speed), logger = self.logger, can_interface = self.can_interface) @@ -237,7 +237,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_PARKED_OVERRIDE_REQUEST, - entity_name = f'DD {DDConcentratePumpsEnum(pump_id).name} Concentrate Pump parked status', + entity_name = f'DD {dd_enum_repository.DDConcentratePumpNames(pump_id).name} Concentrate Pump parked status', override_text = str(status), logger = self.logger, can_interface = self.can_interface) @@ -262,7 +262,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_PARK_FAULT_OVERRIDE_REQUEST, - entity_name = f'DD {DDConcentratePumpsEnum(pump_id).name} Concentrate Pump parked fault state', + entity_name = f'DD {dd_enum_repository.DDConcentratePumpNames(pump_id).name} Concentrate Pump parked fault state', override_text = str(status), logger = self.logger, can_interface = self.can_interface) @@ -282,7 +282,7 @@ reset = NO_RESET, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_PARK_REQUEST_OVERRIDE_REQUEST, - entity_name = f'DD {DDConcentratePumpsEnum(pump_id).name} Concentrate Pump to zeroing', + entity_name = f'DD {dd_enum_repository.DDConcentratePumpNames(pump_id).name} Concentrate Pump to zeroing', override_text = 'Active', logger = self.logger, can_interface = self.can_interface) @@ -309,7 +309,7 @@ reset = NO_RESET, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMPS_START_STOP_OVERRIDE_REQUEST, - entity_name = f'DD {DDConcentratePumpsEnum(pump_id).name} Concentrate Pump speed', + entity_name = f'DD {dd_enum_repository.DDConcentratePumpNames(pump_id).name} Concentrate Pump speed', override_text = str(spd), logger = self.logger, can_interface = self.can_interface) Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,7 +19,8 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDConductivitySensorNames +from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -50,12 +51,14 @@ self._handler_conductivity_sensors_sync) self.dd_conductivity = { - DDConductivitySensorNames.D17_COND.name: 0.0, - DDConductivitySensorNames.D27_COND.name: 0.0, - DDConductivitySensorNames.D29_COND.name: 0.0, - DDConductivitySensorNames.D43_COND.name: 0.0, - DDConductivitySensorNames.D74_COND.name: 0.0 + dd_enum_repository.DDConductivitySensorNames.D17_COND.name: 0.0, + dd_enum_repository.DDConductivitySensorNames.D27_COND.name: 0.0, + dd_enum_repository.DDConductivitySensorNames.D29_COND.name: 0.0, + dd_enum_repository.DDConductivitySensorNames.D43_COND.name: 0.0, + dd_enum_repository.DDConductivitySensorNames.D74_COND.name: 0.0 } + if GlobalVariables().HW_BETA_1_9: + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D98_COND.name] = 0.0 self.dd_conductivity_timestamp = 0.0 @@ -69,21 +72,27 @@ @param message: published DD conductivity sensor data message @return: None """ - self.dd_conductivity[DDConductivitySensorNames.D17_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D17_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.dd_conductivity[DDConductivitySensorNames.D27_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D27_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.dd_conductivity[DDConductivitySensorNames.D29_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D29_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.dd_conductivity[DDConductivitySensorNames.D43_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D43_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.dd_conductivity[DDConductivitySensorNames.D74_COND.name] = struct.unpack('f', bytearray( + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D74_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + if GlobalVariables().HW_BETA_1_9: + if dd_enum_repository.DDConductivitySensorNames.D98_COND.name not in self.dd_conductivity: + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D98_COND.name] = 0.0 + self.dd_conductivity[dd_enum_repository.DDConductivitySensorNames.D98_COND.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + self.dd_conductivity_timestamp = timestamp @@ -125,7 +134,7 @@ sensor_byte_array = integer_to_bytearray(sensor_index) payload = reset_byte_array + cond_byte_array + sensor_byte_array - sensor_name = DDConductivitySensorNames(sensor_index).name.split('_')[0] + sensor_name = dd_enum_repository.DDConductivitySensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -154,7 +163,7 @@ sensor_byte_array = integer_to_bytearray(sensor_index) payload = reset_byte_array + read_byte_array + sensor_byte_array - sensor_name = DDConductivitySensorNames(sensor_index).name.split('_')[0] + sensor_name = dd_enum_repository.DDConductivitySensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -180,7 +189,7 @@ sensor_byte_array = integer_to_bytearray(sensor_index) payload = reset_byte_array + error_byte_array + sensor_byte_array - sensor_name = DDConductivitySensorNames(sensor_index).name.split('_')[0] + sensor_name = dd_enum_repository.DDConductivitySensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/dd/modules/dialysate_pump.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDDialysatePumpsEnum, DDDialysatePumpAttributesEnum +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -49,29 +49,29 @@ self._handler_dialysate_pumps_sync) self.dd_dialysate_pumps = { - DDDialysatePumpsEnum.D12_PUMP.name: { - DDDialysatePumpAttributesEnum.TARGET_RPM.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_SPEED.name: 0.0, - DDDialysatePumpAttributesEnum.CURRENT_SPEED.name: 0.0, - DDDialysatePumpAttributesEnum.STATE.name: 0.0, - DDDialysatePumpAttributesEnum.TARGET_PRESSURE.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_PRESSURE.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_CURRENT.name: 0.0, - DDDialysatePumpAttributesEnum.CONTROL.name: 0.0, - DDDialysatePumpAttributesEnum.DIRECTION_ERROR_COUNT.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_DIRECTION.name: 0.0 + dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name: { + dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.STATE.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name: 0.0 }, - DDDialysatePumpsEnum.D48_PUMP.name: { - DDDialysatePumpAttributesEnum.TARGET_RPM.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_SPEED.name: 0.0, - DDDialysatePumpAttributesEnum.CURRENT_SPEED.name: 0.0, - DDDialysatePumpAttributesEnum.STATE.name: 0.0, - DDDialysatePumpAttributesEnum.TARGET_PRESSURE.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_PRESSURE.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_CURRENT.name: 0.0, - DDDialysatePumpAttributesEnum.CONTROL.name: 0.0, - DDDialysatePumpAttributesEnum.DIRECTION_ERROR_COUNT.name: 0.0, - DDDialysatePumpAttributesEnum.MEASURED_DIRECTION.name: 0.0 + dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name: { + dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.STATE.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name: 0.0, + dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name: 0.0 } } @@ -87,54 +87,54 @@ @param message: published dialysate pumps' data message @return: None """ - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.TARGET_RPM.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.TARGET_RPM.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.TARGET_RPM.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_SPEED.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_SPEED.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.CURRENT_SPEED.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.CURRENT_SPEED.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.CURRENT_SPEED.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.STATE.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.STATE.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.TARGET_PRESSURE.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.TARGET_PRESSURE.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.TARGET_PRESSURE.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_PRESSURE.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_PRESSURE.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_PRESSURE.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_CURRENT.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_CURRENT.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_CURRENT.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.CONTROL.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_15:MsgFieldPositions.END_POS_FIELD_15])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.CONTROL.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.CONTROL.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_16:MsgFieldPositions.END_POS_FIELD_16])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.DIRECTION_ERROR_COUNT.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_17:MsgFieldPositions.END_POS_FIELD_17])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.DIRECTION_ERROR_COUNT.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.DIRECTION_ERROR_COUNT.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_18:MsgFieldPositions.END_POS_FIELD_18])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D12_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_DIRECTION.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D12_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_19:MsgFieldPositions.END_POS_FIELD_19])))[0] - self.dd_dialysate_pumps[DDDialysatePumpsEnum.D48_PUMP.name][DDDialysatePumpAttributesEnum.MEASURED_DIRECTION.name] = ( + self.dd_dialysate_pumps[dd_enum_repository.DDDialysatePumpNames.D48_PUMP.name][dd_enum_repository.DDDialysatePumpAttributes.MEASURED_DIRECTION.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_20:MsgFieldPositions.END_POS_FIELD_20])))[0] self.dd_dialysate_pump_timestamp = timestamp @@ -180,7 +180,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_TARGET_SPEED_OVERRIDE_REQUEST, - entity_name = f'DD {DDDialysatePumpsEnum(pump_id).name} Dialysate Pump target speed', + entity_name = f'DD {dd_enum_repository.DDDialysatePumpNames(pump_id).name} Dialysate Pump target speed', override_text = str(speed), logger = self.logger, can_interface = self.can_interface) @@ -205,7 +205,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_SPEED_OVERRIDE_REQUEST, - entity_name = f'DD {DDDialysatePumpsEnum(pump_id).name} Dialysate Pump measured speed', + entity_name = f'DD {dd_enum_repository.DDDialysatePumpNames(pump_id).name} Dialysate Pump measured speed', override_text = str(speed), logger = self.logger, can_interface = self.can_interface) @@ -230,7 +230,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_TARGET_PRESSURE_OVERRIDE_REQUEST, - entity_name = f'DD {DDDialysatePumpsEnum(pump_id).name} Dialysate Pump target pressure', + entity_name = f'DD {dd_enum_repository.DDDialysatePumpNames(pump_id).name} Dialysate Pump target pressure', override_text = str(pressure), logger = self.logger, can_interface = self.can_interface) @@ -255,7 +255,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_CURRENT_OVERRIDE_REQUEST, - entity_name = f'DD {DDDialysatePumpsEnum(pump_id).name} Dialysate Pump measured current', + entity_name = f'DD {dd_enum_repository.DDDialysatePumpNames(pump_id).name} Dialysate Pump measured current', override_text = str(current), logger = self.logger, can_interface = self.can_interface) @@ -280,7 +280,7 @@ reset = reset, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_DIRECTION_OVERRIDE_REQUEST, - entity_name = f'DD {DDDialysatePumpsEnum(pump_id).name} Dialysate Pump measured direction', + entity_name = f'DD {dd_enum_repository.DDDialysatePumpNames(pump_id).name} Dialysate Pump measured direction', override_text = str(direction), logger = self.logger, can_interface = self.can_interface) @@ -306,7 +306,7 @@ reset = NO_RESET, channel_id = DenaliChannels.dialin_to_dd_ch_id, msg_id = MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_START_STOP_OVERRIDE_REQUEST, - entity_name = f'DD {DDDialysatePumpsEnum(pump_id).name} Dialysate Pump start & stop', + entity_name = f'DD {dd_enum_repository.DDDialysatePumpNames(pump_id).name} Dialysate Pump start & stop', override_text = str(cmd), logger = self.logger, can_interface = self.can_interface) Index: leahi_dialin/dd/modules/events.py =================================================================== diff -u -r410054cfec7aee839266233249413b08b368fbd3 -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/events.py (.../events.py) (revision 410054cfec7aee839266233249413b08b368fbd3) +++ leahi_dialin/dd/modules/events.py (.../events.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,10 +19,7 @@ from datetime import datetime from time import time -from leahi_dialin.common.dd_defs import DDEventList, DDEventDataType, DDOpModes, DDFaultStates, \ - DDServiceModesStates, DDInitStates, DDStandByModeStates, DDPreGenDialysateStates, \ - DDGenDialysateModeStates, DDPostGenDialysateState, DDHeatersState, DDHeatersCoolingStates, \ - DDROPermeateStates, DDNotLegalStates +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -64,26 +61,26 @@ self._dd_event_data_type = dict() # Dictionary of the mode as key and the sub mode states enum class as the value - self._dd_op_mode_2_sub_mode = {DDOpModes.MODE_FAUL.name: DDFaultStates, - DDOpModes.MODE_SERV.name: DDServiceModesStates, - DDOpModes.MODE_INIT.name: DDInitStates, - DDOpModes.MODE_STAN.name: DDStandByModeStates, - DDOpModes.MODE_PREG.name: DDPreGenDialysateStates, - DDOpModes.MODE_GEND.name: DDGenDialysateModeStates, - DDOpModes.MODE_POSG.name: DDPostGenDialysateState, - DDOpModes.MODE_HEAT.name: DDHeatersState, - DDOpModes.MODE_HCOL.name: DDHeatersCoolingStates, - DDOpModes.MODE_ROPS.name: DDROPermeateStates, - DDOpModes.MODE_NLEG.name: DDNotLegalStates} + self._dd_op_mode_2_sub_mode = {dd_enum_repository.DDOpModes.MODE_FAUL.name: dd_enum_repository.DDFaultStates, + dd_enum_repository.DDOpModes.MODE_SERV.name: dd_enum_repository.DDServiceStates, + dd_enum_repository.DDOpModes.MODE_INIT.name: dd_enum_repository.DDInitStates, + dd_enum_repository.DDOpModes.MODE_STAN.name: dd_enum_repository.DDStandbyStates, + dd_enum_repository.DDOpModes.MODE_PREG.name: dd_enum_repository.DDPreGenDialysateStates, + dd_enum_repository.DDOpModes.MODE_GEND.name: dd_enum_repository.DDGenDialysateModeStates, + dd_enum_repository.DDOpModes.MODE_POSG.name: dd_enum_repository.DDPostGenDialysateStates, + dd_enum_repository.DDOpModes.MODE_HEAT.name: dd_enum_repository.DDHeatDisinfectStates, + dd_enum_repository.DDOpModes.MODE_HCOL.name: dd_enum_repository.DDHeaterCoolingStates, + dd_enum_repository.DDOpModes.MODE_ROPS.name: dd_enum_repository.DDROPermeateStates, + dd_enum_repository.DDOpModes.MODE_NLEG.name: dd_enum_repository.DDNotLegalStates} # Loop through the list of the DD events enums and initial the event dictionary. Each event is a key in the # dictionary and the value is a list. - for event in DDEventList: - self._dd_event_dictionary[DDEventList(event).name] = [] + for event in dd_enum_repository.DDEventList: + self._dd_event_dictionary[dd_enum_repository.DDEventList(event).name] = [] # Loop through the list of the event data type enum and update the dictionary - for data_type in DDEventDataType: - event_data_type = DDEventDataType(data_type).name + for data_type in dd_enum_repository.DDEventDataTypes: + event_data_type = dd_enum_repository.DDEventDataTypes(data_type).name struct_unpack_type = None # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is @@ -107,14 +104,14 @@ @returns the requested DD event number """ - list_length = len(self._dd_event_dictionary[DDEventList(event_id).name]) + list_length = len(self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name]) if list_length == 0: event = [] elif event_number > list_length: - event = self._dd_event_dictionary[DDEventList(event_id).name][list_length - 1] + event = self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name][list_length - 1] else: - event = self._dd_event_dictionary[DDEventList(event_id).name][list_length - event_number - 1] + event = self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name][list_length - event_number - 1] return event @@ -141,18 +138,18 @@ list_of_events = [] # If there are not enough event lists send all the events that are available - if len(self._dd_event_dictionary[DDEventList(event_id).name]) <= number_of_events: - list_of_events = self._dd_event_dictionary[DDEventList(event_id).name] + if len(self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name]) <= number_of_events: + list_of_events = self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name] else: # Get the all the events - complete_list = self._dd_event_dictionary[DDEventList(event_id).name] + complete_list = self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name] # Since the last are located at the end of the list, iterate backwards for the defined # event messages for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): list_of_events.append(complete_list[i]) if number_of_events == 0: - list_of_events = self._dd_event_dictionary[DDEventList(event_id).name] + list_of_events = self._dd_event_dictionary[dd_enum_repository.DDEventList(event_id).name] return list_of_events @@ -175,11 +172,11 @@ event_id = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - if event_id == DDEventList.DD_EVENT_OPERATION_STATUS.value: + if event_id == dd_enum_repository.DDEventList.DD_EVENT_OPERATION_STATUS.value: # Get the data type event_data_type_1 = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - struct_data_type = self._dd_event_data_type[DDEventDataType(event_data_type_1).name] + struct_data_type = self._dd_event_data_type[dd_enum_repository.DDEventDataTypes(event_data_type_1).name] op_mode = struct.unpack(' int: """ Constructs and sends the gen dialysate data broadcast interval override command @@ -113,189 +94,125 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_GEND_MODE_DATA_PUBLISH_OVERRIDE_REQUEST, + module_name = 'DD Gen Dialysate', + logger = self.logger, + can_interface = self.can_interface) - if not check_broadcast_interval_override_ms(ms): - return False - reset_byte_array = integer_to_bytearray(reset) - ms_byte_array = integer_to_bytearray(ms) - payload = reset_byte_array + ms_byte_array - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_GEND_MODE_DATA_PUBLISH_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override DD Gen Dialysate data broadcast interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.error("Timeout!!!!") - return False - def cmd_dialysate_delivery_in_progress_override(self, in_progress: int, reset: int = NO_RESET) -> int: """ Constructs and sends the dialysate delivery in progress override command @param in_progress: int - value to override in progress status @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - """ - reset_byte_array = integer_to_bytearray(reset) inprog = integer_to_bytearray(in_progress) payload = reset_byte_array + inprog - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_DIAL_DELIVERY_IN_PROGRESS_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_DIAL_DELIVERY_IN_PROGRESS_OVERRIDE_REQUEST, + entity_name = f'DD Dialysate Delivery in progress', + override_text = str(in_progress), + logger = self.logger, + can_interface = self.can_interface) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(in_progress) - self.logger.debug("override dialysate delivery in progress to " + ": " + str_res) - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.error("Timeout!!!!") - return False - def cmd_dialysate_delivery_good_to_deliver_override(self, delivery: int, reset: int = NO_RESET) -> int: """ Constructs and sends the dialysate delivery good to deliver override command @param delivery: int - value to override in delivery status @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - """ - reset_byte_array = integer_to_bytearray(reset) dev = integer_to_bytearray(delivery) payload = reset_byte_array + dev - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_DIAL_DELIVERY_GOOD_TO_DELIVER_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_DIAL_DELIVERY_GOOD_TO_DELIVER_OVERRIDE_REQUEST, + entity_name = f'DD Dialysate Delivery is good to deliver', + override_text = str(delivery), + logger = self.logger, + can_interface = self.can_interface) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(delivery) - self.logger.debug("override dialysate good to delivery to " + ": " + str_res) - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.error("Timeout!!!!") - return False - def cmd_hydraulics_chamber_target_temperature_override(self, temperature: float, reset: int = NO_RESET) -> int: """ Constructs and sends the hydraulic fluid temperature override command @param temperature: float - value to override in fluid temperature. @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - """ - reset_byte_array = integer_to_bytearray(reset) tmp = float_to_bytearray(temperature) payload = reset_byte_array + tmp - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_HYD_CHAMBER_TARGET_TEMP_OVERRIDE_REQUEST.value, - payload=payload) + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_HYD_CHAMBER_TARGET_TEMP_OVERRIDE_REQUEST, + entity_name = f'DD Hydraulics Chamber target Temperature', + override_text = str(temperature), + logger = self.logger, + can_interface = self.can_interface) - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(temperature) - self.logger.debug("override hydraulic fluid temperature to " + ": " + str_res) - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.error("Timeout!!!!") - return False - def cmd_dialysate_delivery_set_state_override(self, state: int) -> int: """ Constructs and sends the set execution state override command @param state: int - value to override state @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - """ - sts = integer_to_bytearray(state) payload = sts - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_GEND_EXEC_STATE_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_GEND_EXEC_STATE_OVERRIDE_REQUEST, + entity_name = f'DD Dialysate Delivery set state', + override_text = str(state), + logger = self.logger, + can_interface = self.can_interface) - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.error("Timeout!!!!") - return False def cmd_stop_gen_mode_override(self, state: int, reset: int = NO_RESET) -> int: """ - Constructs and sends start pre gen mode override request + Constructs and sends stop gen mode override request @param state: int - value to override state @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise - """ - reset_value = integer_to_bytearray(reset) interval_value = integer_to_bytearray(state) payload = reset_value + interval_value - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_STOP_GEN_DIALYSATE_MODE_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Sending {} start pre gen mode override".format(state)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_STOP_GEN_DIALYSATE_MODE_OVERRIDE_REQUEST, + entity_name = f'DD Dialysate Delivery pre gen mode', + override_text = str(state), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/dd/modules/heaters.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/heaters.py (.../heaters.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDHeatersNames, DDHeatersAttributesEnum +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -41,23 +41,23 @@ self.logger = logger self.dd_heaters = { - DDHeatersNames.D5_HEAT.name: { - DDHeatersAttributesEnum.HEAT_DUTY_CYCLE.name: 0.0, - DDHeatersAttributesEnum.HEAT_TARGET_TEMP.name: 0.0, - DDHeatersAttributesEnum.HEAT_STATE.name: 0, - DDHeatersAttributesEnum.DUTY_CYCLE_COUNT.name: 0.0, - DDHeatersAttributesEnum.PWM_PERIOD.name: 0.0, - DDHeatersAttributesEnum.ADJUSTED_TARGET_TEMP.name: 0.0, - DDHeatersAttributesEnum.TARGET_TEMP_TD.name: 0.0 + dd_enum_repository.DDHeaterNames.D5_HEAT.name: { + dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name: 0.0, + dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name: 0.0, + dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name: 0, + dd_enum_repository.DDHeaterAttributes.DUTY_CYCLE_COUNT.name: 0.0, + dd_enum_repository.DDHeaterAttributes.PWM_PERIOD.name: 0.0, + dd_enum_repository.DDHeaterAttributes.ADJUSTED_TARGET_TEMP.name: 0.0, + dd_enum_repository.DDHeaterAttributes.TARGET_TEMP_TD.name: 0.0 }, - DDHeatersNames.D45_HEAT.name: { - DDHeatersAttributesEnum.HEAT_DUTY_CYCLE.name: 0.0, - DDHeatersAttributesEnum.HEAT_TARGET_TEMP.name: 0.0, - DDHeatersAttributesEnum.HEAT_STATE.name: 0, - DDHeatersAttributesEnum.DUTY_CYCLE_COUNT.name: None, # D45 Heater doesn't use this attribute - DDHeatersAttributesEnum.PWM_PERIOD.name: None, # D45 Heater doesn't use this attribute - DDHeatersAttributesEnum.ADJUSTED_TARGET_TEMP.name: None, # D45 Heater doesn't use this attribute - DDHeatersAttributesEnum.TARGET_TEMP_TD.name: None # D45 Heater doesn't use this attribute + dd_enum_repository.DDHeaterNames.D45_HEAT.name: { + dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name: 0.0, + dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name: 0.0, + dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name: 0, + dd_enum_repository.DDHeaterAttributes.DUTY_CYCLE_COUNT.name: None, # D45 Heater doesn't use this attribute + dd_enum_repository.DDHeaterAttributes.PWM_PERIOD.name: None, # D45 Heater doesn't use this attribute + dd_enum_repository.DDHeaterAttributes.ADJUSTED_TARGET_TEMP.name: None, # D45 Heater doesn't use this attribute + dd_enum_repository.DDHeaterAttributes.TARGET_TEMP_TD.name: None # D45 Heater doesn't use this attribute } } @@ -90,25 +90,25 @@ @param message: published DD heaters data message @returns none """ - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.HEAT_DUTY_CYCLE.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] - self.dd_heaters[DDHeatersNames.D45_HEAT.name][DDHeatersAttributesEnum.HEAT_DUTY_CYCLE.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D45_HEAT.name][dd_enum_repository.DDHeaterAttributes.HEAT_DUTY_CYCLE.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.HEAT_TARGET_TEMP.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])))[0] - self.dd_heaters[DDHeatersNames.D45_HEAT.name][DDHeatersAttributesEnum.HEAT_TARGET_TEMP.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D45_HEAT.name][dd_enum_repository.DDHeaterAttributes.HEAT_TARGET_TEMP.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])))[0] - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.HEAT_STATE.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])))[0] - self.dd_heaters[DDHeatersNames.D45_HEAT.name][DDHeatersAttributesEnum.HEAT_STATE.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D45_HEAT.name][dd_enum_repository.DDHeaterAttributes.HEAT_STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])))[0] - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.DUTY_CYCLE_COUNT.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.DUTY_CYCLE_COUNT.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])))[0] - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.PWM_PERIOD.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.PWM_PERIOD.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])))[0] - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.ADJUSTED_TARGET_TEMP.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.ADJUSTED_TARGET_TEMP.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9])))[0] - self.dd_heaters[DDHeatersNames.D5_HEAT.name][DDHeatersAttributesEnum.TARGET_TEMP_TD.name] = ( + self.dd_heaters[dd_enum_repository.DDHeaterNames.D5_HEAT.name][dd_enum_repository.DDHeaterAttributes.TARGET_TEMP_TD.name] = ( struct.unpack('f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10])))[0] self.dbg1 = struct.unpack('f', bytearray( @@ -169,7 +169,7 @@ duty = float_to_bytearray(duty_cycle/100) payload = rst + duty + htr - heater_name = DDHeatersNames(heater).name.split('_')[0] + heater_name = dd_enum_repository.DDHeaterNames(heater).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -196,7 +196,7 @@ tmp = float_to_bytearray(temperature) payload = htr + cmd + tmp - heater_name = DDHeatersNames(heater).name.split('_')[0] + heater_name = dd_enum_repository.DDHeaterNames(heater).name.split('_')[0] start_or_stop = 'Start' if command == 0 else 'Stop' return cmd_generic_override( payload = payload, @@ -223,7 +223,7 @@ rst = integer_to_bytearray(reset) payload = rst + tmp + htr - heater_name = DDHeatersNames(heater).name.split('_')[0] + heater_name = dd_enum_repository.DDHeaterNames(heater).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, @@ -249,7 +249,7 @@ rst = integer_to_bytearray(reset) payload = rst + prd + htr - heater_name = DDHeatersNames(heater).name.split('_')[0] + heater_name = dd_enum_repository.DDHeaterNames(heater).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, Index: leahi_dialin/dd/modules/levels.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/levels.py (.../levels.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,8 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDLevelSensorEnum +from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -46,11 +47,12 @@ self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_dd_level_data, self._handler_levels_sync) self.dd_level_sensors = { - DDLevelSensorEnum.D6_LEVEL.name: 0, - DDLevelSensorEnum.D63_LEVEL.name: 0, - DDLevelSensorEnum.D98_LEVEL.name: 0, - DDLevelSensorEnum.D46_LEVEL.name: 0 + dd_enum_repository.DDLevelSensorNames.D6_LEVEL.name: 0, + dd_enum_repository.DDLevelSensorNames.D63_LEVEL.name: 0, + dd_enum_repository.DDLevelSensorNames.D46_LEVEL.name: 0 } + if GlobalVariables().HW_BETA_1_9: + self.dd_level_sensors[dd_enum_repository.DDLevelSensorNames.D98_LEVEL.name] = 0.0 self.dd_bicarb_level = 0 self.dd_levels_timestamp = 0 @@ -63,20 +65,27 @@ @param message: published levels data message @returns none """ - self.dd_level_sensors[DDLevelSensorEnum.D6_LEVEL.name] = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.dd_level_sensors[DDLevelSensorEnum.D63_LEVEL.name] = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.dd_level_sensors[DDLevelSensorEnum.D98_LEVEL.name] = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.dd_bicarb_level = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.dd_level_sensors[DDLevelSensorEnum.D46_LEVEL.name] = struct.unpack('i', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + sensor_list =[] + sensor_list.append((dd_enum_repository.DDLevelSensorNames.D6_LEVEL, 'i')) + sensor_list.append((dd_enum_repository.DDLevelSensorNames.D63_LEVEL, 'i')) + if GlobalVariables().HW_BETA_1_9: + if dd_enum_repository.DDLevelSensorNames.D98_LEVEL.name not in self.dd_level_sensors: + self.dd_level_sensors[dd_enum_repository.DDTemperatureSensorNames.D98_LEVEL.name] = 0.0 + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D98_LEVEL, 'i')) + sensor_list.append((dd_enum_repository.DDLevelSensorNames.D46_LEVEL, 'i')) + i = 1 + for sensor in sensor_list: + start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') + end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') + if i == 4: + self.dd_bicarb_level = struct.unpack('i', bytearray(message['message'][start_pos:end_pos]))[0] + else: + self.dd_level_sensors[sensor[0].name] = struct.unpack(sensor[1], bytearray(message['message'][start_pos:end_pos]))[0] + i += 1 + self.dd_levels_timestamp = timestamp - def cmd_levels_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends dd levels broadcast time interval override. @@ -113,7 +122,7 @@ sts = integer_to_bytearray(status) payload = reset_value + sts + level_sensor - sensor_name = DDLevelSensorEnum(level_sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDLevelSensorNames(level_sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,7 +19,8 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDPressureNames +from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -47,13 +48,14 @@ self._handler_pressures_sync) self.dd_pressures = { - DDPressureNames.D9_PRES.name: 0.0, - DDPressureNames.D66_PRES.name: 0.0, - DDPressureNames.D51_PRES.name: 0.0, - DDPressureNames.D18_PRES.name: 0.0, - DDPressureNames.D41_PRES.name: 0.0, - DDPressureNames.D87_PRES.name: 0.0 + dd_enum_repository.DDPressureSensorNames.D9_PRES.name: 0.0, + dd_enum_repository.DDPressureSensorNames.D66_PRES.name: 0.0, + dd_enum_repository.DDPressureSensorNames.D51_PRES.name: 0.0, + dd_enum_repository.DDPressureSensorNames.D18_PRES.name: 0.0, + dd_enum_repository.DDPressureSensorNames.D41_PRES.name: 0.0 } + if GlobalVariables().HW_BETA_1_9: + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D87_PRES.name] = 0.0 self.dd_pressures_timestamp = 0 @@ -67,17 +69,22 @@ @param message: published DD pressure data message @return: none """ - self.dd_pressures[DDPressureNames.D9_PRES.name] = struct.unpack('f', bytearray( + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D9_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.dd_pressures[DDPressureNames.D66_PRES.name] = struct.unpack('f', bytearray( + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D66_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.dd_pressures[DDPressureNames.D51_PRES.name] = struct.unpack('f', bytearray( + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D51_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.dd_pressures[DDPressureNames.D18_PRES.name] = struct.unpack('f', bytearray( + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D18_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.dd_pressures[DDPressureNames.D41_PRES.name] = struct.unpack('f', bytearray( + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D41_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.dd_pressures[DDPressureNames.D87_PRES.name] = struct.unpack('f', bytearray( + + if GlobalVariables().HW_BETA_1_9: + if dd_enum_repository.DDPressureSensorNames.D87_PRES.name not in self.dd_pressures: + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D87_PRES.name] = 0.0 + + self.dd_pressures[dd_enum_repository.DDPressureSensorNames.D87_PRES.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] self.dd_pressures_timestamp = timestamp @@ -120,7 +127,7 @@ idx = integer_to_bytearray(sensor) payload = rst + prs + idx - sensor_name = DDPressureNames(sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDPressureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -148,7 +155,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + read_byte_array + sensor_byte_array - sensor_name = DDPressureNames(sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDPressureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -176,7 +183,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + error_byte_array + sensor_byte_array - sensor_name = DDPressureNames(sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDPressureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -204,7 +211,7 @@ idx = integer_to_bytearray(sensor) payload = rst + prs + idx - sensor_name = DDPressureNames(sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDPressureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r5f783280400baab74941d3fd4d3e3d5a97bd06ee -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 5f783280400baab74941d3fd4d3e3d5a97bd06ee) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,8 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDTemperaturesNames +from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -37,29 +38,30 @@ # Dictionary of the temperature sensors self.dd_temperatures_timestamp = 0.0 self.dd_temperatures = { - DDTemperaturesNames.D1_TEMP.name: 0.0, - DDTemperaturesNames.D78_TEMP.name: 0.0, - DDTemperaturesNames.D4_TEMP.name: 0.0, - DDTemperaturesNames.D50_TEMP.name: 0.0, - DDTemperaturesNames.D99_TEMP.name: 0.0, - DDTemperaturesNames.BRD_TEMP.name: 0.0, - DDTemperaturesNames.D16_TEMP.name: 0.0, - DDTemperaturesNames.D28_TEMP.name: 0.0, - DDTemperaturesNames.D30_TEMP.name: 0.0, - DDTemperaturesNames.D44_TEMP.name: 0.0, - DDTemperaturesNames.D75_TEMP.name: 0.0, - DDTemperaturesNames.D4_AVG_TEMP.name: 0.0, - DDTemperaturesNames.D50_AVG_TEMP.name: 0.0, - DDTemperaturesNames.D99_AVG_TEMP.name: 0.0, - DDTemperaturesNames.D28_AVG_TEMP.name: 0.0, - DDTemperaturesNames.D30_AVG_TEMP.name: 0.0, - DDTemperaturesNames.D66_TEMP.name: 0.0, - DDTemperaturesNames.D51_TEMP.name: 0.0, - DDTemperaturesNames.D18_TEMP.name: 0.0, - DDTemperaturesNames.D41_TEMP.name: 0.0, - DDTemperaturesNames.D87_TEMP.name: 0.0 + dd_enum_repository.DDTemperatureSensorNames.D1_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D78_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D4_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D50_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.BRD_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D16_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D28_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D30_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D44_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D75_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D4_AVG_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D50_AVG_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D28_AVG_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D30_AVG_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D66_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D51_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D18_TEMP.name: 0.0, + dd_enum_repository.DDTemperatureSensorNames.D41_TEMP.name: 0.0 } + if GlobalVariables().HW_BETA_1_9: + self.dd_temperatures[dd_enum_repository.DDTemperatureSensorNames.D99_TEMP.name] = 0.0 + self.dd_temperatures[dd_enum_repository.DDTemperatureSensorNames.D99_AVG_TEMP.name] = 0.0 + self.dd_temperatures[dd_enum_repository.DDTemperatureSensorNames.D87_TEMP.name] = 0.0 if self.can_interface is not None: channel_id = DenaliChannels.dd_sync_broadcast_ch_id @@ -76,73 +78,46 @@ @param message: published DD temperature sensors data message @returns none """ - self.dd_temperatures[DDTemperaturesNames.D1_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + sensor_list =[] + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D1_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D78_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D4_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D50_TEMP, 'f')) + if GlobalVariables().HW_BETA_1_9: + if dd_enum_repository.DDTemperatureSensorNames.D99_TEMP.name not in self.dd_temperatures: + self.dd_temperatures[dd_enum_repository.DDTemperatureSensorNames.D99_TEMP.name] = 0.0 + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D99_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.BRD_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D16_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D28_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D30_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D44_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D75_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D4_AVG_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D50_AVG_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D28_AVG_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D30_AVG_TEMP, 'f')) + if GlobalVariables().HW_BETA_1_9: + if dd_enum_repository.DDTemperatureSensorNames.D99_AVG_TEMP.name not in self.dd_temperatures: + self.dd_temperatures[dd_enum_repository.DDTemperatureSensorNames.D99_AVG_TEMP.name] = 0.0 + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D99_AVG_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D9_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D66_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D51_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D18_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D41_TEMP, 'f')) + if GlobalVariables().HW_BETA_1_9: + if dd_enum_repository.DDTemperatureSensorNames.D87_TEMP.name not in self.dd_temperatures: + self.dd_temperatures[dd_enum_repository.DDTemperatureSensorNames.D87_TEMP.name] = 0.0 + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D87_TEMP, 'f')) - self.dd_temperatures[DDTemperaturesNames.D78_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + i = 1 + for sensor in sensor_list: + start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') + end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') + self.dd_temperatures[sensor[0].name] = struct.unpack(sensor[1],bytearray(message['message'][start_pos:end_pos]))[0] + i += 1 - self.dd_temperatures[DDTemperaturesNames.D4_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - - self.dd_temperatures[DDTemperaturesNames.D50_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - - self.dd_temperatures[DDTemperaturesNames.D99_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - - self.dd_temperatures[DDTemperaturesNames.BRD_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - - self.dd_temperatures[DDTemperaturesNames.D16_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - - self.dd_temperatures[DDTemperaturesNames.D28_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - - self.dd_temperatures[DDTemperaturesNames.D30_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] - - self.dd_temperatures[DDTemperaturesNames.D44_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] - - self.dd_temperatures[DDTemperaturesNames.D75_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11]))[0] - - self.dd_temperatures[DDTemperaturesNames.D4_AVG_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12]))[0] - - self.dd_temperatures[DDTemperaturesNames.D50_AVG_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13]))[0] - - self.dd_temperatures[DDTemperaturesNames.D99_AVG_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14]))[0] - - self.dd_temperatures[DDTemperaturesNames.D28_AVG_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_15:MsgFieldPositions.END_POS_FIELD_15]))[0] - - self.dd_temperatures[DDTemperaturesNames.D30_AVG_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_16:MsgFieldPositions.END_POS_FIELD_16]))[0] - - self.dd_temperatures[DDTemperaturesNames.D9_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_17:MsgFieldPositions.END_POS_FIELD_17]))[0] - - self.dd_temperatures[DDTemperaturesNames.D66_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_18:MsgFieldPositions.END_POS_FIELD_18]))[0] - - self.dd_temperatures[DDTemperaturesNames.D51_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_19:MsgFieldPositions.END_POS_FIELD_19]))[0] - - self.dd_temperatures[DDTemperaturesNames.D18_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_20:MsgFieldPositions.END_POS_FIELD_20]))[0] - - self.dd_temperatures[DDTemperaturesNames.D41_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_21:MsgFieldPositions.END_POS_FIELD_21]))[0] - - self.dd_temperatures[DDTemperaturesNames.D87_TEMP.name] = struct.unpack('f', bytearray( - message['message'][MsgFieldPositions.START_POS_FIELD_22:MsgFieldPositions.END_POS_FIELD_22]))[0] - - self.dd_temperatures_timestamp = timestamp @@ -180,13 +155,13 @@ @returns 1 if successful, zero otherwise """ # DD Conductivity Sensors' Temperature Reading Override - if DDTemperaturesNames.FIRST_CONDUCTIVITY_SENSOR.value <= sensor_index <= DDTemperaturesNames.LAST_CONDUCTIVITY_SENSOR.value: - modified_index= sensor_index - DDTemperaturesNames.FIRST_CONDUCTIVITY_SENSOR.value + if dd_enum_repository.DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value <= sensor_index <= dd_enum_repository.DDTemperatureSensorNames.LAST_CONDUCTIVITY_SENSOR.value: + modified_index= sensor_index - dd_enum_repository.DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value message_id = MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_TEMPERATURE_OVERRIDE_REQUEST # DD Pressure Sensors' Temperature Reading Override - elif DDTemperaturesNames.FIRST_PRESSURE_SENSOR.value <= sensor_index <= DDTemperaturesNames.LAST_PRESSURE_SENSOR.value: - modified_index= sensor_index - DDTemperaturesNames.FIRST_PRESSURE_SENSOR.value + elif dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value <= sensor_index <= dd_enum_repository.DDTemperatureSensorNames.LAST_PRESSURE_SENSOR.value: + modified_index= sensor_index - dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value message_id = MsgIds.MSG_ID_DD_PRESSURE_SENSOR_TEMPERATURE_OVERRIDE_REQUEST # DD Temperature Sensors' Temperature Reading Override @@ -199,7 +174,7 @@ value = float_to_bytearray(sensor_value) payload = rst + value + index - sensor_name = DDTemperaturesNames(sensor_index).name.split('_')[0] + sensor_name = dd_enum_repository.DDTemperatureSensorNames(sensor_index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -225,7 +200,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + read_byte_array + sensor_byte_array - sensor_name = DDTemperaturesNames(sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDTemperatureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -289,17 +264,17 @@ Constraints: Must be logged into DD. - @param sensor: unsigned int - sensor ID, use the index of DDTemperaturesNames + @param sensor: unsigned int - sensor ID, use the index of dd_enum_repository.DDTemperatureSensorNames @param temperature: float - temperature to override the sensor with @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ rst = integer_to_bytearray(reset) tmp = float_to_bytearray(temperature) - idx = integer_to_bytearray(sensor - DDTemperaturesNames.FIRST_PRESSURE_SENSOR.value) + idx = integer_to_bytearray(sensor - dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value) payload = rst + tmp + idx - sensor_name = DDTemperaturesNames(sensor).name.split('_')[0] + sensor_name = dd_enum_repository.DDTemperatureSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,7 +19,7 @@ from collections import OrderedDict from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDValveNames +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels @@ -63,46 +63,46 @@ self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_dd_valves_states_data, self._handler_valves_sync) self.valve_states_all = 0x00000000 - self.d14_valv = {"id": DDValveNames.D14_VALV.value, "state": DEENERGIZED} - self.d52_valv = {"id": DDValveNames.D52_VALV.value, "state": DEENERGIZED} - self.d8_valv = {"id": DDValveNames.D8_VALV.value, "state": DEENERGIZED} - self.d54_valv = {"id": DDValveNames.D54_VALV.value, "state": DEENERGIZED} - self.d53_valv = {"id": DDValveNames.D53_VALV.value, "state": DEENERGIZED} - self.d34_valv = {"id": DDValveNames.D34_VALV.value, "state": DEENERGIZED} - self.d64_valv = {"id": DDValveNames.D64_VALV.value, "state": DEENERGIZED} - self.d31_valv = {"id": DDValveNames.D31_VALV.value, "state": DEENERGIZED} - self.d65_valv = {"id": DDValveNames.D65_VALV.value, "state": DEENERGIZED} - self.d35_valv = {"id": DDValveNames.D35_VALV.value, "state": DEENERGIZED} - self.d40_valv = {"id": DDValveNames.D40_VALV.value, "state": DEENERGIZED} - self.d47_valv = {"id": DDValveNames.D47_VALV.value, "state": DEENERGIZED} - self.d3_valv = {"id": DDValveNames.D3_VALV.value, "state": DEENERGIZED} - self.d80_valv = {"id": DDValveNames.D80_VALV.value, "state": DEENERGIZED} - self.d81_valv = {"id": DDValveNames.D81_VALV.value, "state": DEENERGIZED} - self.rsvrd1 = {"id": DDValveNames.RSRVD_SPACE1.value, "state": DEENERGIZED} + self.d14_valv = {"id": dd_enum_repository.DDValveNames.D14_VALV.value, "state": DEENERGIZED} + self.d52_valv = {"id": dd_enum_repository.DDValveNames.D52_VALV.value, "state": DEENERGIZED} + self.d8_valv = {"id": dd_enum_repository.DDValveNames.D8_VALV.value, "state": DEENERGIZED} + self.d54_valv = {"id": dd_enum_repository.DDValveNames.D54_VALV.value, "state": DEENERGIZED} + self.d53_valv = {"id": dd_enum_repository.DDValveNames.D53_VALV.value, "state": DEENERGIZED} + self.d34_valv = {"id": dd_enum_repository.DDValveNames.D34_VALV.value, "state": DEENERGIZED} + self.d64_valv = {"id": dd_enum_repository.DDValveNames.D64_VALV.value, "state": DEENERGIZED} + self.d31_valv = {"id": dd_enum_repository.DDValveNames.D31_VALV.value, "state": DEENERGIZED} + self.d65_valv = {"id": dd_enum_repository.DDValveNames.D65_VALV.value, "state": DEENERGIZED} + self.d35_valv = {"id": dd_enum_repository.DDValveNames.D35_VALV.value, "state": DEENERGIZED} + self.d40_valv = {"id": dd_enum_repository.DDValveNames.D40_VALV.value, "state": DEENERGIZED} + self.d47_valv = {"id": dd_enum_repository.DDValveNames.D47_VALV.value, "state": DEENERGIZED} + self.d3_valv = {"id": dd_enum_repository.DDValveNames.D3_VALV.value, "state": DEENERGIZED} + self.d80_valv = {"id": dd_enum_repository.DDValveNames.D80_VALV.value, "state": DEENERGIZED} + self.d81_valv = {"id": dd_enum_repository.DDValveNames.D81_VALV.value, "state": DEENERGIZED} + self.rsvrd1 = {"id": dd_enum_repository.DDValveNames.RSRVD_SPACE1.value, "state": DEENERGIZED} - self.d23_valv = {"id": DDValveNames.D23_VALV.value, "state": DEENERGIZED} - self.d19_valv = {"id": DDValveNames.D19_VALV.value, "state": DEENERGIZED} - self.d25_valv = {"id": DDValveNames.D25_VALV.value, "state": DEENERGIZED} - self.d21_valv = {"id": DDValveNames.D26_VALV.value, "state": DEENERGIZED} - self.d24_valv = {"id": DDValveNames.D24_VALV.value, "state": DEENERGIZED} - self.d20_valv = {"id": DDValveNames.D20_VALV.value, "state": DEENERGIZED} - self.d26_valv = {"id": DDValveNames.D21_VALV.value, "state": DEENERGIZED} - self.d22_valv = {"id": DDValveNames.D22_VALV.value, "state": DEENERGIZED} + self.d23_valv = {"id": dd_enum_repository.DDValveNames.D23_VALV.value, "state": DEENERGIZED} + self.d19_valv = {"id": dd_enum_repository.DDValveNames.D19_VALV.value, "state": DEENERGIZED} + self.d25_valv = {"id": dd_enum_repository.DDValveNames.D25_VALV.value, "state": DEENERGIZED} + self.d21_valv = {"id": dd_enum_repository.DDValveNames.D26_VALV.value, "state": DEENERGIZED} + self.d24_valv = {"id": dd_enum_repository.DDValveNames.D24_VALV.value, "state": DEENERGIZED} + self.d20_valv = {"id": dd_enum_repository.DDValveNames.D20_VALV.value, "state": DEENERGIZED} + self.d26_valv = {"id": dd_enum_repository.DDValveNames.D21_VALV.value, "state": DEENERGIZED} + self.d22_valv = {"id": dd_enum_repository.DDValveNames.D22_VALV.value, "state": DEENERGIZED} - self.d79_pmp_valv = {"id": DDValveNames.D79_PMP_VALV.value, "state": DEENERGIZED} - self.d83_valv = {"id": DDValveNames.D83_VALV.value, "state": DEENERGIZED} - self.d91_valv = {"id": DDValveNames.D91_VALV.value, "state": DEENERGIZED} - self.spare3_valv = {"id": DDValveNames.SPARE3_VALV.value, "state": DEENERGIZED} - self.spare4_valv = {"id": DDValveNames.SPARE4_VALV.value, "state": DEENERGIZED} - self.spare5_valv = {"id": DDValveNames.SPARE5_VALV.value, "state": DEENERGIZED} - self.d100_valv = {"id": DDValveNames.D100_VALV.value, "state": DEENERGIZED} - self.spare7_valv = {"id": DDValveNames.SPARE7_VALV.value, "state": DEENERGIZED} + self.d79_pmp_valv = {"id": dd_enum_repository.DDValveNames.D79_PMP_VALV.value, "state": DEENERGIZED} + self.d83_valv = {"id": dd_enum_repository.DDValveNames.D83_VALV.value, "state": DEENERGIZED} + self.d91_valv = {"id": dd_enum_repository.DDValveNames.D91_VALV.value, "state": DEENERGIZED} + self.spare3_valv = {"id": dd_enum_repository.DDValveNames.SPARE3_VALV.value, "state": DEENERGIZED} + self.spare4_valv = {"id": dd_enum_repository.DDValveNames.SPARE4_VALV.value, "state": DEENERGIZED} + self.spare5_valv = {"id": dd_enum_repository.DDValveNames.SPARE5_VALV.value, "state": DEENERGIZED} + self.d100_valv = {"id": dd_enum_repository.DDValveNames.D100_VALV.value, "state": DEENERGIZED} + self.spare7_valv = {"id": dd_enum_repository.DDValveNames.SPARE7_VALV.value, "state": DEENERGIZED} # NOTE: The len function counts the enums with the same number only once. This is not the case in the DD valves # class because each valve must have a unique ID. - self.valve_states_enum = [0 for _ in range(len(DDValveNames))] + self.valve_states_enum = [0 for _ in range(len(dd_enum_repository.DDValveNames))] - for valve in DDValveNames.__members__: + for valve in dd_enum_repository.DDValveNames.__members__: self.valves_sensed_states[valve] = '' @@ -271,7 +271,7 @@ end = start + 1 for valve_id in self.valves_sensed_states: valve_state_number = struct.unpack('B', bytearray(message['message'][start:end]))[0] - self.valves_sensed_states[valve_id] = DDValveNames(valve_state_number).name + self.valves_sensed_states[valve_id] = dd_enum_repository.DDValveNames(valve_state_number).name start = end end += 1 @@ -316,7 +316,7 @@ vlv = integer_to_bytearray(valve) payload = rst + ste + vlv - valve_name = DDValveNames(valve).name.split('_')[0] + valve_name = dd_enum_repository.DDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -345,7 +345,7 @@ vlv = integer_to_bytearray(valve) payload = rst + ste + vlv - valve_name = DDValveNames(valve).name.split('_')[0] + valve_name = dd_enum_repository.DDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -419,7 +419,7 @@ sts = integer_to_bytearray(state) payload = vlv + sts - valve_name = DDValveNames(valve).name.split('_')[0] + valve_name = dd_enum_repository.DDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, Index: leahi_dialin/dd/modules/voltages.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/modules/voltages.py (.../voltages.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.dd_defs import DDMonitoredVoltages +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -44,7 +44,7 @@ self.msg_id_dd_voltages_data = MsgIds.MSG_ID_DD_VOLTAGES_DATA.value self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_dd_voltages_data, self._handler_monitored_voltages_sync) - self.monitored_voltages = [0.0] * DDMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value + self.monitored_voltages = [0.0] * dd_enum_repository.DDMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value self.dd_voltages_timestamp = 0.0 @@ -74,14 +74,14 @@ vfp = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8])) - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_1_2V.value] = v12[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_3_3V.value] = v33[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.value] = v5l[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_24V_1.value] = v24_1[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_24V_2.value] = v24_2[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.value] = vfc[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.value] = vfa[0] - self.monitored_voltages[DDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.value] = vfp[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_1_2V.value] = v12[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_3_3V.value] = v33[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.value] = v5l[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_24V_1.value] = v24_1[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_24V_2.value] = v24_2[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.value] = vfc[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.value] = vfa[0] + self.monitored_voltages[dd_enum_repository.DDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.value] = vfp[0] self.dd_voltages_timestamp = timestamp @@ -124,7 +124,7 @@ idx = integer_to_bytearray(signal) payload = rst + vlt + idx - sensor_name = DDMonitoredVoltages(signal).name + sensor_name = dd_enum_repository.DDMonitoredVoltages(signal).name return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/fp/filtration_purification.py =================================================================== diff -u -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) +++ leahi_dialin/fp/filtration_purification.py (.../filtration_purification.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -33,7 +33,7 @@ from .proxies.dd_proxy import DDProxy from ..common.constants import NO_RESET -from ..common.fp_defs import FPOpModes +from ..common.fp_defs import fp_enum_repository from ..common.msg_defs import MsgIds, MsgFieldPositions, MsgFieldPositionsFWVersions from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels @@ -78,26 +78,30 @@ # register handler for FP operation mode broadcast messages if self.can_interface is not None: channel_id = DenaliChannels.fp_sync_broadcast_ch_id - self.msg_id_fp_op_mode_data = MsgIds.MSG_ID_FP_OP_MODE_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_fp_op_mode_data, + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_FP_OP_MODE_DATA.value, self._handler_fp_op_mode_sync) - self.msg_id_fp_version_response = MsgIds.MSG_ID_FP_VERSION_RESPONSE.value self.can_interface.register_receiving_publication_function(channel_id, - self.msg_id_fp_version_response, + MsgIds.MSG_ID_FP_VERSION_RESPONSE.value, self._handler_fp_version_response_sync) - self.msg_id_fp_debug_event = MsgIds.MSG_ID_FP_DEBUG_EVENT.value self.can_interface.register_receiving_publication_function(channel_id, - self.msg_id_fp_debug_event, + MsgIds.MSG_ID_FP_DEBUG_EVENT.value, self._handler_fp_debug_event_sync) + + self.can_interface.register_receiving_publication_function(channel_id, + MsgIds.MSG_ID_FP_DEF_STATUS_RESPONSE.value, + self._handler_fp_defeatured_response) # create properties + self.fp_defeatured_timestamp = 0.0 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_defeatured = None self.fp_logged_in = False self.fp_set_logged_in_status(False) self.fp_version = None @@ -219,6 +223,46 @@ self.fp_op_mode_timestamp = timestamp + @publish(["msg_id_fp_def_status_response", "is_fp_defeatured"]) + def _handler_fp_defeatured_response(self, message, timestamp = 0.0): + """ + Handler for response from FP regarding its defeatured status. + + @param message: defeatured respnse from FP + @return: None + """ + self.fp_defeatured = struct.unpack('?', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) + + self.fp_defeatured_timestamp = timestamp + + + def cmd_request_defeatured_status(self) -> int: + """ + Constructs and sends the FP defeatured status request + Constraints: + Must be logged into FP. + + @return: 1 if successful, zero otherwise + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, + message_id=MsgIds.MSG_ID_FP_DEF_STATUS_REQUEST.value) + + self.logger.debug('Getting FP defeatured status') + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Received FW ACK after requesting FP defeatured configuration record.") + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + + def cmd_op_mode_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends the measured op mode broadcast interval override command @@ -261,6 +305,7 @@ if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: self.logger.debug("Success: Logged In") self.fp_set_logged_in_status(True) + self.cmd_request_defeatured_status() #self._send_ro_checkin_message() # Timer starts interval first #self.can_interface.transmit_interval_dictionary[self.callback_id].start() else: @@ -290,7 +335,7 @@ channel_id = DenaliChannels.dialin_to_fp_ch_id, msg_id = MsgIds.MSG_ID_FP_SET_OP_MODE_REQUEST, entity_name = 'FP Operation Mode', - override_text = FPOpModes(new_mode).name, + override_text = fp_enum_repository.FPOpModes(new_mode).name, logger = self.logger, can_interface = self.can_interface) Index: leahi_dialin/fp/modules/alarms.py =================================================================== diff -u -r03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93 -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision 03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93) +++ leahi_dialin/fp/modules/alarms.py (.../alarms.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,7 +19,7 @@ from leahi_dialin.common.alarm_defs import AlarmList from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.fp_defs import FPEventDataType +from leahi_dialin.common.fp_defs import fp_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels @@ -70,8 +70,8 @@ self.alarm_data_type = dict() # Loop through the list of the event data type enum and update the dictionary - for data_type in FPEventDataType: - event_data_type = FPEventDataType(data_type).name + for data_type in fp_enum_repository.FPEventDataTypes: + event_data_type = fp_enum_repository.FPEventDataTypes(data_type).name struct_unpack_type = None # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is @@ -101,13 +101,13 @@ data_typ_1 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) # Get the corresponding structure format - struct_data_type_1 = self.alarm_data_type[FPEventDataType(data_typ_1[0]).name] + struct_data_type_1 = self.alarm_data_type[fp_enum_repository.FPEventDataTypes(data_typ_1[0]).name] # Get the data value by unpacking the data type data_1 = struct.unpack(struct_data_type_1, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])) data_typ_2 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) # Get the corresponding structure format - struct_data_type_2 = self.alarm_data_type[FPEventDataType(data_typ_2[0]).name] + struct_data_type_2 = self.alarm_data_type[fp_enum_repository.FPEventDataTypes(data_typ_2[0]).name] # Get the data value by unpacking the data type data_2 = struct.unpack(struct_data_type_2, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) Index: leahi_dialin/fp/modules/boost_pump.py =================================================================== diff -u -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) +++ leahi_dialin/fp/modules/boost_pump.py (.../boost_pump.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.fp_defs import FPBoostPumpNames, FPPumpAttributes +from leahi_dialin.common.fp_defs import fp_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -46,20 +46,21 @@ self._handler_pump_sync) self.boost_pump_timestamp = 0.0 self.boost_pump = { - FPBoostPumpNames.P40_PUMP.name: { - FPPumpAttributes.STATE.name: 0, - FPPumpAttributes.DUTY_CYCLE.name: 0, - FPPumpAttributes.FB_DUTY_CYCLE.name: 0, - FPPumpAttributes.SPEED.name: 0.0, - FPPumpAttributes.TARGET_PRES.name: 0.0, - FPPumpAttributes.TARGET_FLOW.name: 0.0, - FPPumpAttributes.TARGET_DUTY_CYCLE.name: 0.0, - FPPumpAttributes.DUTY_CYCLE_PCT.name: 0.0, - FPPumpAttributes.FB_DUTY_CYCLE_PCT.name: 0.0 + fp_enum_repository.FPBoostPumpNames.P40_PUMP.name: { + fp_enum_repository.FPPumpAttributes.STATE.name: 0, + fp_enum_repository.FPPumpAttributes.DUTY_CYCLE.name: 0, + fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE.name: 0, + fp_enum_repository.FPPumpAttributes.SPEED.name: 0.0, + fp_enum_repository.FPPumpAttributes.TARGET_PRES.name: 0.0, + fp_enum_repository.FPPumpAttributes.TARGET_FLOW.name: 0.0, + fp_enum_repository.FPPumpAttributes.TARGET_DUTY_CYCLE.name: 0.0, + fp_enum_repository.FPPumpAttributes.DUTY_CYCLE_PCT.name: 0.0, + fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE_PCT.name: 0.0 } } + @publish(["msg_id_fp_boost_pump_data", "boost_pump", "boost_pump_timestamp"]) def _handler_pump_sync(self, message, timestamp=0.0): """ @@ -69,23 +70,23 @@ @param message: published FP ro pump data message @return: none """ - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.STATE.name] = struct.unpack('i', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.STATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.DUTY_CYCLE.name] = struct.unpack('i', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.DUTY_CYCLE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.FB_DUTY_CYCLE.name] = struct.unpack('i', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.SPEED.name] = struct.unpack('f', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.SPEED.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.TARGET_PRESSURE.name] = struct.unpack('f', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.TARGET_PRESSURE.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.TARGET_FLOW.name] = struct.unpack('f', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.TARGET_FLOW.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.TARGET_DUTY_CYCLE.name] = struct.unpack('f', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.TARGET_DUTY_CYCLE.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.DUTY_CYCLE_PCT.name] = struct.unpack('f', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.DUTY_CYCLE_PCT.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.boost_pump[FPBoostPumpNames.P40_PUMP.name][FPPumpAttributes.FB_DUTY_CYCLE_PCT.name] = struct.unpack('f', bytearray( + self.boost_pump[fp_enum_repository.FPBoostPumpNames.P40_PUMP.name][fp_enum_repository.FPPumpAttributes.FB_DUTY_CYCLE_PCT.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] self.boost_pump_timestamp = timestamp Index: leahi_dialin/fp/modules/conductivity_sensors.py =================================================================== diff -u -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) +++ leahi_dialin/fp/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -18,7 +18,7 @@ from logging import Logger from leahi_dialin.common.constants import NO_RESET -from leahi_dialin.common.fp_defs import FPConductivitySensorNames, FPRORejectionRatioEnum +from leahi_dialin.common.fp_defs import fp_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels @@ -51,16 +51,16 @@ self.ro_rejection_ratio_timestamp = 0.0 self.fp_conductivity = { - FPConductivitySensorNames.P9_COND.name: 0.0, - FPConductivitySensorNames.P18_COND.name: 0.0 + fp_enum_repository.FPConductivitySensorNames.P9_COND.name: 0.0, + fp_enum_repository.FPConductivitySensorNames.P18_COND.name: 0.0 } self.ro_rejection_ratio = { - FPRORejectionRatioEnum.RAW_RO_REJECTION_RATIO.name: 0.0, - FPRORejectionRatioEnum.RAW_RO_REJECTION_RATIO_TANK_FILL.name: 0.0, - FPRORejectionRatioEnum.AVG_RO_REJECTION_RATIO.name: 0.0, - FPRORejectionRatioEnum.AVG_RO_REJECTION_RATIO_TANK_FILL.name: 0.0, - FPRORejectionRatioEnum.GEN_PERMEATE_STATE.name: 0 + fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO.name: 0.0, + fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO_TANK_FILL.name: 0.0, + fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO.name: 0.0, + fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO_TANK_FILL.name: 0.0, + fp_enum_repository.FPRORejectionRatioNames.GEN_PERMEATE_STATE.name: 0 } @@ -73,9 +73,9 @@ @param message: published conductivity sensor data message @return: None """ - self.fp_conductivity[FPConductivitySensorNames.P9_COND.name] = struct.unpack('f', bytearray( + self.fp_conductivity[fp_enum_repository.FPConductivitySensorNames.P9_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.fp_conductivity[FPConductivitySensorNames.P18_COND.name] = struct.unpack('f', bytearray( + self.fp_conductivity[fp_enum_repository.FPConductivitySensorNames.P18_COND.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] self.fp_conductivity_timestamp = timestamp @@ -90,15 +90,15 @@ @param message: Published RO Rejection Ratio data message @return: None """ - self.ro_rejection_ratio[FPRORejectionRatioEnum.RAW_RO_REJECTION_RATIO.name] = struct.unpack('f', bytearray( + self.ro_rejection_ratio[fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.ro_rejection_ratio[FPRORejectionRatioEnum.RAW_RO_REJECTION_RATIO_TANK_FILL.name] = struct.unpack('f', bytearray( + self.ro_rejection_ratio[fp_enum_repository.FPRORejectionRatioNames.RAW_RO_REJECTION_RATIO_TANK_FILL.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.ro_rejection_ratio[FPRORejectionRatioEnum.AVG_RO_REJECTION_RATIO.name] = struct.unpack('f', bytearray( + self.ro_rejection_ratio[fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.ro_rejection_ratio[FPRORejectionRatioEnum.AVG_RO_REJECTION_RATIO_TANK_FILL.name] = struct.unpack('f', bytearray( + self.ro_rejection_ratio[fp_enum_repository.FPRORejectionRatioNames.AVG_RO_REJECTION_RATIO_TANK_FILL.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.ro_rejection_ratio[FPRORejectionRatioEnum.GEN_PERMEATE_STATE.name] = struct.unpack('i', bytearray( + self.ro_rejection_ratio[fp_enum_repository.FPRORejectionRatioNames.GEN_PERMEATE_STATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] self.ro_rejection_ratio_timestamp = timestamp @@ -162,7 +162,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + cond_byte_array + sensor_byte_array - sensor_name = FPConductivitySensorNames(sensor).name.split('_')[0] + sensor_name = fp_enum_repository.FPConductivitySensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -188,7 +188,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + read_byte_array + sensor_byte_array - sensor_name = FPConductivitySensorNames(sensor).name.split('_')[0] + sensor_name = fp_enum_repository.FPConductivitySensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -214,7 +214,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + error_byte_array + sensor_byte_array - sensor_name = FPConductivitySensorNames(sensor).name.split('_')[0] + sensor_name = fp_enum_repository.FPConductivitySensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/fp/modules/events.py =================================================================== diff -u -ra291930ba38e329e2b373f6d2b2a7564a6b7a09a -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/fp/modules/events.py (.../events.py) (revision a291930ba38e329e2b373f6d2b2a7564a6b7a09a) +++ leahi_dialin/fp/modules/events.py (.../events.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,9 +19,7 @@ from datetime import datetime from time import time -from leahi_dialin.common.fp_defs import FPEventList, FPEventDataType, FPOpModes, FPFaultStates, \ - FPServiceStates, FPPostStates, FPStandbyStates, FPPreGenPermeateStates, FPGenPermeateStates, \ - FPPreGenPDefStates, FPGenPermeateDefStates, FPNotLegalStates +from leahi_dialin.common.fp_defs import fp_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -61,24 +59,24 @@ self._fp_event_data_type = dict() # Dictionary of the mode as key and the sub mode states enum class as the value - self._fp_op_mode_2_sub_mode = {FPOpModes.MODE_FAUL.name: FPFaultStates, - FPOpModes.MODE_SERV.name: FPServiceStates, - FPOpModes.MODE_INIT.name: FPPostStates, - FPOpModes.MODE_STAN.name: FPStandbyStates, - FPOpModes.MODE_PRE_GENP.name: FPPreGenPermeateStates, - FPOpModes.MODE_GENP.name: FPGenPermeateStates, - FPOpModes.MODE_DPGP.name: FPPreGenPDefStates, - FPOpModes.MODE_DEGP.name: FPGenPermeateDefStates, - FPOpModes.MODE_NLEG.name: FPNotLegalStates} + self._fp_op_mode_2_sub_mode = {fp_enum_repository.FPOpModes.MODE_FAUL.name: fp_enum_repository.FPFaultStates, + fp_enum_repository.FPOpModes.MODE_SERV.name: fp_enum_repository.FPServiceStates, + fp_enum_repository.FPOpModes.MODE_INIT.name: fp_enum_repository.FPPostStates, + fp_enum_repository.FPOpModes.MODE_STAN.name: fp_enum_repository.FPStandbyStates, + fp_enum_repository.FPOpModes.MODE_PRE_GENP.name: fp_enum_repository.FPPreGenPermeateStates, + fp_enum_repository.FPOpModes.MODE_GENP.name: fp_enum_repository.FPGenPermeateStates, + fp_enum_repository.FPOpModes.MODE_DPGP.name: fp_enum_repository.FPPreGenPDefStates, + fp_enum_repository.FPOpModes.MODE_DEGP.name: fp_enum_repository.FPGenPermeateDefStates, + fp_enum_repository.FPOpModes.MODE_NLEG.name: fp_enum_repository.FPNotLegalStates} # Loop through the list of the FP events enums and initial the event dictionary. Each event is a key in the # dictionary and the value is a list. - for event in FPEventList: - self._fp_event_dictionary[FPEventList(event).name] = [] + for event in fp_enum_repository.FPEventList: + self._fp_event_dictionary[fp_enum_repository.FPEventList(event).name] = [] # Loop through the list of the event data type enum and update the dictionary - for data_type in FPEventDataType: - event_data_type = FPEventDataType(data_type).name + for data_type in fp_enum_repository.FPEventDataTypes: + event_data_type = fp_enum_repository.FPEventDataTypes(data_type).name struct_unpack_type = None # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is @@ -102,14 +100,14 @@ @returns the requested FP event number """ - list_length = len(self._fp_event_dictionary[FPEventList(event_id).name]) + list_length = len(self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name]) if list_length == 0: event = [] elif event_number > list_length: - event = self._fp_event_dictionary[FPEventList(event_id).name][list_length - 1] + event = self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name][list_length - 1] else: - event = self._fp_event_dictionary[FPEventList(event_id).name][list_length - event_number - 1] + event = self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name][list_length - event_number - 1] return event @@ -136,18 +134,18 @@ list_of_events = [] # If there are not enough event lists send all the events that are available - if len(self._fp_event_dictionary[FPEventList(event_id).name]) <= number_of_events: - list_of_events = self._fp_event_dictionary[FPEventList(event_id).name] + if len(self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name]) <= number_of_events: + list_of_events = self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name] else: # Get the all the events - complete_list = self._fp_event_dictionary[FPEventList(event_id).name] + complete_list = self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name] # Since the last are located at the end of the list, iterate backwards for the defined # event messages for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): list_of_events.append(complete_list[i]) if number_of_events == 0: - list_of_events = self._fp_event_dictionary[FPEventList(event_id).name] + list_of_events = self._fp_event_dictionary[fp_enum_repository.FPEventList(event_id).name] return list_of_events @@ -170,11 +168,11 @@ event_id = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - if event_id == FPEventList.FP_EVENT_OPERATION_STATUS.value: + if event_id == fp_enum_repository.FPEventList.FP_EVENT_OPERATION_STATUS.value: # Get the data type event_data_type_1 = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - struct_data_type = self._fp_event_data_type[FPEventDataType(event_data_type_1).name] + struct_data_type = self._fp_event_data_type[fp_enum_repository.FPEventDataTypes(event_data_type_1).name] op_mode = struct.unpack(' int: """ Constructs and sends the boost pump set speed rate command @@ -54,29 +55,18 @@ pmp = integer_to_bytearray(pump) payload = rst + rpm + pmp - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLUID_PUMP_SPEED_OVERRIDE_REQUEST.value, - payload=payload) + pump_name = fp_enum_repository.FPAllPumpNames(pump).name + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLUID_PUMP_SPEED_OVERRIDE_REQUEST, + entity_name = f'FP {pump_name} Water Pump speed', + override_text = str(rpm), + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("override pump set speed rate point") - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(rpm) - - self.logger.debug("rpm overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_pump_set_pwm_request(self, pump: int, pwm: int) -> int: """ Constructs and sends set pwm request for FP pumps \n @@ -88,30 +78,22 @@ @param pwm: integer - counts to override the pwm ( 0 - 500 ) @return: 1 if successful, zero otherwise """ - spd = integer_to_bytearray(pwm) pmp = integer_to_bytearray(pump) payload = pmp + spd - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLUID_PUMP_SET_PWM_REQUEST.value, - payload=payload) + pump_name = fp_enum_repository.FPAllPumpNames(pump).name + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLUID_PUMP_SET_PWM_REQUEST, + entity_name = f'FP {pump_name} Water Pump PWM', + override_text = str(pwm), + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("setting pump {} to pwm count {}".format(pump,pwm)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - - self.logger.debug("pwm set to " + str(pwm)) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_pump_read_pwm_override(self, pump: int, pwm: float, reset: int = NO_RESET) -> int: """ Constructs and sends the read pwm override for the FP pumps \n @@ -123,31 +105,18 @@ @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - rst = integer_to_bytearray(reset) rpwm = float_to_bytearray(pwm) pmp = integer_to_bytearray(pump) payload = rst + rpwm + pmp - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_FP_FLUID_PUMP_READ_PWM_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override read pwm for pump".format(pump)) - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(rpwm) - - self.logger.debug("pwm overridden to " + str_res) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False \ No newline at end of file + pump_name = fp_enum_repository.FPAllPumpNames(pump).name + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_fp_ch_id, + msg_id = MsgIds.MSG_ID_FP_FLUID_PUMP_SET_PWM_REQUEST, + entity_name = f'FP {pump_name} Water Pump read PWM', + override_text = str(pwm), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/modules/air_pump.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/air_pump.py (.../air_pump.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDAirPumpNames, TDAirPumpAttributes +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -48,9 +48,9 @@ self._handler_air_pump_sync) self.td_air_pump = { - TDAirPumpNames.H12_AIR_PUMP.name: { - TDAirPumpAttributes.STATE.name: 0, - TDAirPumpAttributes.POWER.name: 0 + td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name: { + td_enum_repository.TDAirPumpAttributes.STATE.name: 0, + td_enum_repository.TDAirPumpAttributes.POWER.name: 0 } } @@ -70,8 +70,8 @@ app = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) - self.td_air_pump[TDAirPumpNames.H12_AIR_PUMP.name][TDAirPumpAttributes.STATE.name] = aps[0] - self.td_air_pump[TDAirPumpNames.H12_AIR_PUMP.name][TDAirPumpAttributes.POWER.name] = app[0] + self.td_air_pump[td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name][td_enum_repository.TDAirPumpAttributes.STATE.name] = aps[0] + self.td_air_pump[td_enum_repository.TDAirPumpNames.H12_AIR_PUMP.name][td_enum_repository.TDAirPumpAttributes.POWER.name] = app[0] self.td_air_pump_timestamp = timestamp Index: leahi_dialin/td/modules/air_trap.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/air_trap.py (.../air_trap.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDAirTrapValves, TDAirTrapLevelSensors, TDAirTrapLevelSensorsAttributes, TDAirTrapState +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -52,18 +52,18 @@ self._handler_air_trap_sync) self.air_trap_level_sensors = { - TDAirTrapLevelSensors.H17_LEVEL.name: { - TDAirTrapLevelSensorsAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, - TDAirTrapLevelSensorsAttributes.RAW.name: self.AIR_DETECTED_AT_LEVEL + td_enum_repository.TDAirTrapLevelSensorNames.H17_LEVEL.name: { + td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, + td_enum_repository.TDAirTrapLevelSensorAttributes.RAW.name: self.AIR_DETECTED_AT_LEVEL }, - TDAirTrapLevelSensors.H16_LEVEL.name: { - TDAirTrapLevelSensorsAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, - TDAirTrapLevelSensorsAttributes.RAW.name: self.AIR_DETECTED_AT_LEVEL + td_enum_repository.TDAirTrapLevelSensorNames.H16_LEVEL.name: { + td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name: self.AIR_DETECTED_AT_LEVEL, + td_enum_repository.TDAirTrapLevelSensorAttributes.RAW.name: self.AIR_DETECTED_AT_LEVEL } } self.air_trap_valve_states = { - TDAirTrapValves.H13_VALV.name: 0, - TDAirTrapValves.H20_VALV.name: 0 + td_enum_repository.TDAirTrapValveNames.H13_VALV.name: 0, + td_enum_repository.TDAirTrapValveNames.H20_VALV.name: 0 } self.air_control = 0 self.td_air_trap_timestamp = 0.0 @@ -97,12 +97,12 @@ controlling = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7])) - self.air_trap_level_sensors[TDAirTrapLevelSensors.H17_LEVEL.name][TDAirTrapLevelSensorsAttributes.LEVEL.name] = lower[0] - self.air_trap_level_sensors[TDAirTrapLevelSensors.H16_LEVEL.name][TDAirTrapLevelSensorsAttributes.LEVEL.name] = upper[0] - self.air_trap_level_sensors[TDAirTrapLevelSensors.H17_LEVEL.name][TDAirTrapLevelSensorsAttributes.RAW.name] = raw_lower[0] - self.air_trap_level_sensors[TDAirTrapLevelSensors.H16_LEVEL.name][TDAirTrapLevelSensorsAttributes.RAW.name] = raw_upper[0] - self.air_trap_valve_states[TDAirTrapValves.H13_VALV.name] = h13_vlv_st[0] - self.air_trap_valve_states[TDAirTrapValves.H20_VALV.name] = h20_vlv_st[0] + self.air_trap_level_sensors[td_enum_repository.TDAirTrapLevelSensorNames.H17_LEVEL.name][td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name] = lower[0] + self.air_trap_level_sensors[td_enum_repository.TDAirTrapLevelSensorNames.H16_LEVEL.name][td_enum_repository.TDAirTrapLevelSensorAttributes.LEVEL.name] = upper[0] + self.air_trap_level_sensors[td_enum_repository.TDAirTrapLevelSensorNames.H17_LEVEL.name][td_enum_repository.TDAirTrapLevelSensorAttributes.RAW.name] = raw_lower[0] + self.air_trap_level_sensors[td_enum_repository.TDAirTrapLevelSensorNames.H16_LEVEL.name][td_enum_repository.TDAirTrapLevelSensorAttributes.RAW.name] = raw_upper[0] + self.air_trap_valve_states[td_enum_repository.TDAirTrapValveNames.H13_VALV.name] = h13_vlv_st[0] + self.air_trap_valve_states[td_enum_repository.TDAirTrapValveNames.H20_VALV.name] = h20_vlv_st[0] self.air_control = controlling[0] self.td_air_trap_timestamp = timestamp @@ -144,7 +144,7 @@ idx = integer_to_bytearray(sensor) payload = rst + det + idx - sensor_name = TDAirTrapLevelSensors(sensor).name.split('_')[0] + sensor_name = td_enum_repository.TDAirTrapLevelSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -172,7 +172,7 @@ idx = integer_to_bytearray(sensor) payload = rst + det + idx - sensor_name = TDAirTrapLevelSensors(sensor).name.split('_')[0] + sensor_name = td_enum_repository.TDAirTrapLevelSensorNames(sensor).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, @@ -184,8 +184,8 @@ can_interface = self.can_interface) - def cmd_set_td_air_trap_valve(self, valve: int = TDAirTrapValves.H13_VALV.value, - valve_state: int = TDAirTrapState.STATE_CLOSED.value) -> int: + def cmd_set_td_air_trap_valve(self, valve: int = td_enum_repository.TDAirTrapValveNames.H13_VALV.value, + valve_state: int = td_enum_repository.TDAirTrapState.STATE_CLOSED.value) -> int: """ Constructs and sends an open/close command to the TD air trap valves. @@ -197,7 +197,7 @@ sts = integer_to_bytearray(valve_state) payload = vlv + sts - valve_name = TDAirTrapValves(valve).name.split('_')[0] + valve_name = td_enum_repository.TDAirTrapValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, Index: leahi_dialin/td/modules/alarms.py =================================================================== diff -u -r03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93 -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 03dc6c3ff80d7f76a5b6438ba067e02a37e2ce93) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -22,7 +22,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDEventDataType +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, DialinEnum, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -138,8 +138,8 @@ self.alarm_state_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_TD_ALARM_RESPONSE_BUTTONS.value # Loop through the list of the event data type enum and update the dictionary - for data_type in TDEventDataType: - event_data_type = TDEventDataType(data_type).name + for data_type in td_enum_repository.TDEventDataTypes: + event_data_type = td_enum_repository.TDEventDataTypes(data_type).name struct_unpack_type = None # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is @@ -199,13 +199,13 @@ data_typ_1 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])) # Get the corresponding structure format - struct_data_type_1 = self.alarm_data_type[TDEventDataType(data_typ_1[0]).name] + struct_data_type_1 = self.alarm_data_type[td_enum_repository.TDEventDataTypes(data_typ_1[0]).name] # Get the data value by unpacking the data type data_1 = struct.unpack(struct_data_type_1, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3])) data_typ_2 = struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) # Get the corresponding structure format - struct_data_type_2 = self.alarm_data_type[TDEventDataType(data_typ_2[0]).name] + struct_data_type_2 = self.alarm_data_type[td_enum_repository.TDEventDataTypes(data_typ_2[0]).name] # Get the data value by unpacking the data type data_2 = struct.unpack(struct_data_type_2, bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) Index: leahi_dialin/td/modules/blood_flow.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/blood_flow.py (.../blood_flow.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET, PUMP_CONTROL_MODE_CLOSED_LOOP from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDBloodFlowMotorAttributes +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -46,18 +46,19 @@ self._handler_blood_flow_sync) self.td_blood_flow_timestamp = 0.0 self.h4_motor = { - TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name: 0, - TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name: 0.0, - TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_ROTOR_SPEED.name: 0.0, - TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_SPEED.name: 0.0, - TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_TORQUE : 0.0, - TDBloodFlowMotorAttributes.SET_RPM.name: 0.0, - TDBloodFlowMotorAttributes.ROTOR_COUNT.name: 0, - TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name: 0, - TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name: 0, + td_enum_repository.TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name: 0, + td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name: 0.0, + td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_ROTOR_SPEED.name: 0.0, + td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_SPEED.name: 0.0, + td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_TORQUE : 0.0, + td_enum_repository.TDBloodFlowMotorAttributes.SET_RPM.name: 0.0, + td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_COUNT.name: 0, + td_enum_repository.TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name: 0, + td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name: 0, } + @publish(["msg_id_td_blood_pump_data", "h4_motor", "td_blood_flow_timestamp"]) def _handler_blood_flow_sync(self, message, timestamp=0.0): """ @@ -67,23 +68,23 @@ @param message: published blood flow data message @return: none """ - self.h4_motor[TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name] = struct.unpack('i', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.SET_BLOOD_FLOW_RATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name] = struct.unpack('f', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_FLOW_RATE.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_ROTOR_SPEED.name] = struct.unpack('f', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_ROTOR_SPEED.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_SPEED.name] = struct.unpack('f', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_SPEED.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_TORQUE.name] = struct.unpack('f', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.MEASURED_BLOOD_PUMP_TORQUE.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.SET_RPM.name] = struct.unpack('f', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.SET_RPM.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.ROTOR_COUNT.name] = struct.unpack('I', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_COUNT.name] = struct.unpack('I', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name] = struct.unpack('I', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.PRES_BLOOD_FLOW_RATE.name] = struct.unpack('I', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] - self.h4_motor[TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name] = struct.unpack('I', bytearray( + self.h4_motor[td_enum_repository.TDBloodFlowMotorAttributes.ROTOR_HALL_STATE.name] = struct.unpack('I', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] self.td_blood_flow_timestamp = timestamp Index: leahi_dialin/td/modules/bubble_detector.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/bubble_detector.py (.../bubble_detector.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDAirBubbleDetectorNames, TDAirBubbleDetectorAttributes +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -62,11 +62,11 @@ self.td_air_bubbles_timestamp = 0.0 self.h18_bubble_detector = { - TDAirBubbleDetectorNames.H18_ADV.name: { + td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name: { # Initialize status of ADV air bubble detectors to fluid (no air bubble) detected - TDAirBubbleDetectorAttributes.STATUS.name: self.FLUID_DETECTED_STATUS, + td_enum_repository.TDAirBubbleDetectorAttributes.STATUS.name: self.FLUID_DETECTED_STATUS, # Initialize state of ADV air bubble detectors state machine to normal - TDAirBubbleDetectorAttributes.STATE.name: self.AIR_BUBBLE_NORMAL_STATE + td_enum_repository.TDAirBubbleDetectorAttributes.STATE.name: self.AIR_BUBBLE_NORMAL_STATE } } @@ -79,9 +79,9 @@ @param message: published air bubbles data message as: h18 bubble status, h18 bubble state @return: None """ - self.h18_bubble_detector[TDAirBubbleDetectorNames.H18_ADV.name][TDAirBubbleDetectorAttributes.STATUS.name] = ( + self.h18_bubble_detector[td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name][td_enum_repository.TDAirBubbleDetectorAttributes.STATUS.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])))[0] - self.h18_bubble_detector[TDAirBubbleDetectorNames.H18_ADV.name][TDAirBubbleDetectorAttributes.STATE.name] = ( + self.h18_bubble_detector[td_enum_repository.TDAirBubbleDetectorNames.H18_ADV.name][td_enum_repository.TDAirBubbleDetectorAttributes.STATE.name] = ( struct.unpack('i', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2])))[0] self.td_air_bubbles_timestamp = timestamp @@ -125,7 +125,7 @@ stat = integer_to_bytearray(status) payload = rst + stat + i - sensor_name = TDAirBubbleDetectorNames(index).name.split('_')[0] + sensor_name = td_enum_repository.TDAirBubbleDetectorNames(index).name.split('_')[0] return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/td/modules/ejector.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDEjectorNames, TDEjectorAttributes +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -48,11 +48,11 @@ self._handler_ejector_sync) self.h5_motor = { - TDEjectorNames.H5_MOTOR.name: { - TDEjectorAttributes.STATE.name: 0, - TDEjectorAttributes.SET_SPEED.name: 0.0, - TDEjectorAttributes.OPT_SNSR_RETRACT: 0, # H25 Optical Sensor - TDEjectorAttributes.OPT_SNSR_ENGAGE: 0 # H24 Optical Sensor + td_enum_repository.TDEjectorNames.H5_MOTOR.name: { + td_enum_repository.TDEjectorAttributes.STATE.name: 0, + td_enum_repository.TDEjectorAttributes.SET_SPEED.name: 0.0, + td_enum_repository.TDEjectorAttributes.OPT_SNSR_RETRACT: 0, # H25 Optical Sensor + td_enum_repository.TDEjectorAttributes.OPT_SNSR_ENGAGE: 0 # H24 Optical Sensor } } self.td_ejector_timestamp = 0 @@ -66,13 +66,13 @@ @param message: published ejector data message as: ejector state @return: None """ - self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.STATE.name] = struct.unpack('i', bytearray( + self.h5_motor[td_enum_repository.TDEjectorNames.H5_MOTOR.name][td_enum_repository.TDEjectorAttributes.STATE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.SET_SPEED.name] = struct.unpack('f', bytearray( + self.h5_motor[td_enum_repository.TDEjectorNames.H5_MOTOR.name][td_enum_repository.TDEjectorAttributes.SET_SPEED.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.OPT_SNSR_RETRACT.name] = struct.unpack('i', bytearray( + self.h5_motor[td_enum_repository.TDEjectorNames.H5_MOTOR.name][td_enum_repository.TDEjectorAttributes.OPT_SNSR_RETRACT.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.h5_motor[TDEjectorNames.H5_MOTOR.name][TDEjectorAttributes.OPT_SNSR_ENGAGE.name] = struct.unpack('i', bytearray( + self.h5_motor[td_enum_repository.TDEjectorNames.H5_MOTOR.name][td_enum_repository.TDEjectorAttributes.OPT_SNSR_ENGAGE.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] self.td_ejector_timestamp = timestamp Index: leahi_dialin/td/modules/events.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/events.py (.../events.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/events.py (.../events.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -19,9 +19,7 @@ from datetime import datetime from time import time -from leahi_dialin.common.td_defs import TDEventList, TDEventDataType, TDOpModes, TDFaultStates, \ - TDServiceStates, TDInitStates, TDStandbyStates, TDTreatmentParamStates, TDPreTreatmentModesStates, \ - TDTreatmentStates, TDPostTreatmentStates, TDNotLegalStates +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -60,24 +58,24 @@ self._td_event_data_type = dict() # Dictionary of the mode as key and the sub mode states enum class as the value - self._td_op_mode_2_sub_mode = {TDOpModes.MODE_FAUL.name: TDFaultStates, - TDOpModes.MODE_SERV.name: TDServiceStates, - TDOpModes.MODE_INIT.name: TDInitStates, - TDOpModes.MODE_STAN.name: TDStandbyStates, - TDOpModes.MODE_TPAR.name: TDTreatmentParamStates, - TDOpModes.MODE_PRET.name: TDPreTreatmentModesStates, - TDOpModes.MODE_TREA.name: TDTreatmentStates, - TDOpModes.MODE_POST.name: TDPostTreatmentStates, - TDOpModes.MODE_NLEG.name: TDNotLegalStates} + self._td_op_mode_2_sub_mode = {td_enum_repository.TDOpModes.MODE_FAUL.name: td_enum_repository.TDFaultStates, + td_enum_repository.TDOpModes.MODE_SERV.name: td_enum_repository.TDServiceStates, + td_enum_repository.TDOpModes.MODE_INIT.name: td_enum_repository.TDInitStates, + td_enum_repository.TDOpModes.MODE_STAN.name: td_enum_repository.TDStandbyStates, + td_enum_repository.TDOpModes.MODE_TPAR.name: td_enum_repository.TDTreatmentParamStates, + td_enum_repository.TDOpModes.MODE_PRET.name: td_enum_repository.TDPreTreatmentModesStates, + td_enum_repository.TDOpModes.MODE_TREA.name: td_enum_repository.TDTreatmentStates, + td_enum_repository.TDOpModes.MODE_POST.name: td_enum_repository.TDPostTreatmentStates, + td_enum_repository.TDOpModes.MODE_NLEG.name: td_enum_repository.TDNotLegalStates} # Loop through the list of the TD events enums and initial the event dictionary. Each event is a key in the # dictionary and the value is a list. - for event in TDEventList: - self._td_event_dictionary[TDEventList(event).name] = [] + for event in td_enum_repository.TDEventList: + self._td_event_dictionary[td_enum_repository.TDEventList(event).name] = [] # Loop through the list of the event data type enum and update the dictionary - for data_type in TDEventDataType: - event_data_type = TDEventDataType(data_type).name + for data_type in td_enum_repository.TDEventDataTypes: + event_data_type = td_enum_repository.TDEventDataTypes(data_type).name struct_unpack_type = None # If U32 is in the data type enum (i.e. EVENT_DATA_TYPE_U32), then the key is the enum and the value is @@ -101,14 +99,14 @@ @returns the requested TD event number """ - list_length = len(self._td_event_dictionary[TDEventList(event_id).name]) + list_length = len(self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name]) if list_length == 0: event = [] elif event_number > list_length: - event = self._td_event_dictionary[TDEventList(event_id).name][list_length - 1] + event = self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name][list_length - 1] else: - event = self._td_event_dictionary[TDEventList(event_id).name][list_length - event_number - 1] + event = self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name][list_length - event_number - 1] return event @@ -135,18 +133,18 @@ list_of_events = [] # If there are not enough event lists send all the events that are available - if len(self._td_event_dictionary[TDEventList(event_id).name]) <= number_of_events: - list_of_events = self._td_event_dictionary[TDEventList(event_id).name] + if len(self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name]) <= number_of_events: + list_of_events = self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name] else: # Get the all the events - complete_list = self._td_event_dictionary[TDEventList(event_id).name] + complete_list = self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name] # Since the last are located at the end of the list, iterate backwards for the defined # event messages for i in range(len(complete_list) - 1, len(complete_list) - number_of_events - 1, -1): list_of_events.append(complete_list[i]) if number_of_events == 0: - list_of_events = self._td_event_dictionary[TDEventList(event_id).name] + list_of_events = self._td_event_dictionary[td_enum_repository.TDEventList(event_id).name] return list_of_events @@ -169,11 +167,11 @@ event_id = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - if event_id == TDEventList.TD_EVENT_OPERATION_STATUS.value: + if event_id == td_enum_repository.TDEventList.TD_EVENT_OPERATION_STATUS.value: # Get the data type event_data_type_1 = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - struct_data_type = self._td_event_data_type[TDEventDataType(event_data_type_1).name] + struct_data_type = self._td_event_data_type[td_enum_repository.TDEventDataTypes(event_data_type_1).name] op_mode = struct.unpack('= TDTreatmentParameters.TREATMENT_PARAM_DIALYSATE_TEMPERATURE.value: + elif tx_param_id >= td_enum_repository.TDTreatmentParameters.TREATMENT_PARAM_DIALYSATE_TEMPERATURE.value: tpv = float_to_bytearray(tx_param_value) else: @@ -318,7 +318,7 @@ idx = integer_to_bytearray(tx_param_id) payload = idx + tpv - param_name = TDTreatmentParameters(tx_param_id).name + param_name = td_enum_repository.TDTreatmentParameters(tx_param_id).name return cmd_generic_override( payload = payload, reset = NO_RESET, Index: leahi_dialin/td/modules/valves.py =================================================================== diff -u -r1813f6556e8a726a6e300caffe0bcafc40010aa9 -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision 1813f6556e8a726a6e300caffe0bcafc40010aa9) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDValvesEnum, TDValvesPositions, TDValvesStates +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray @@ -77,8 +77,8 @@ self.td_valves_timestamp = 0.0 # A dictionary of the valves with the status - self.valves_status = {TDValvesEnum.H1_VALV.name: {}, - TDValvesEnum.H19_VALV.name: {}} + self.valves_status = {td_enum_repository.TDValveNames.H1_VALV.name: {}, + td_enum_repository.TDValveNames.H19_VALV.name: {}} @publish(["msg_id_td_valves_data", "valves_status", "td_valves_timestamp"]) @@ -109,11 +109,11 @@ message['message'][self.START_MAX_HOMING_ENC:self.END_MAX_HOMING_ENC]))[0] # To make sure values of the enums are not out of range - if TDValvesEnum.has_value(vlv_id) and TDValvesPositions.has_value(pos_id) and TDValvesStates.has_value(pos_id): - vlv_name = TDValvesEnum(vlv_id).name + if td_enum_repository.TDValveNames.has_value(vlv_id) and td_enum_repository.TDValvePositions.has_value(pos_id) and td_enum_repository.TDValveStates.has_value(pos_id): + vlv_name = td_enum_repository.TDValveNames(vlv_id).name # Update the valves dictionary - self.valves_status[vlv_name] = {'Valve': vlv_name, 'PosID': TDValvesPositions(pos_id).name, 'PosCnt': pos_cnt, - 'Cmd': cmd_pos, 'State': TDValvesStates(state_id).name, 'PosA': pos_a, + self.valves_status[vlv_name] = {'Valve': vlv_name, 'PosID': td_enum_repository.TDValvePositions(pos_id).name, 'PosCnt': pos_cnt, + 'Cmd': cmd_pos, 'State': td_enum_repository.TDValveStates(state_id).name, 'PosA': pos_a, 'PosB': pos_b, 'PosC': pos_c, 'PosD': pos_d, 'Max_homing_enc': max_homing_enc} self.td_valves_timestamp = timestamp @@ -143,16 +143,16 @@ """ Constructs and sends the TD valves set position for a valve - @param valve: integer - Valve number. Defined in TDValvesEnum class - @param position: integer - Position number: Defined in TDValvesPositions class + @param valve: integer - Valve number. Defined in td_enum_repository.TDValveNames class + @param position: integer - Position number: Defined in td_enum_repository.TDValvePositions class @returns 1 if successful, zero otherwise """ vlv = integer_to_bytearray(valve) pos = integer_to_bytearray(position) payload = vlv + pos - valve_name = TDValvesEnum(valve).name.split('_')[0] + valve_name = td_enum_repository.TDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, @@ -168,7 +168,7 @@ """ Constructs and sends the TD valves home command - @param valve: integer - Valve number. Defined in TDValvesEnum class + @param valve: integer - Valve number. Defined in td_enum_repository.TDValveNames class @param force_home: integer - 1 to force valve to home position, 0 for normal homing @param cartridge: integer - 1 to use cartridge settings, 0 to use settings for system use without cartridge @returns 1 if successful, zero otherwise @@ -178,7 +178,7 @@ cart = integer_to_bytearray(cartridge) payload = vlv + frc + cart - valve_name = TDValvesEnum(valve).name.split('_')[0] + valve_name = td_enum_repository.TDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, @@ -194,7 +194,7 @@ """ Constructs and sends the TD valves set position for a valve - @@param valve: integer - Valve number. Defined in TDValvesEnum class + @@param valve: integer - Valve number. Defined in td_enum_repository.TDValveNames class @param position_count: integer value @param reset: integer - 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise @@ -204,7 +204,7 @@ pos = integer_to_bytearray(position_count) payload = reset_value + pos + vlv - valve_name = TDValvesEnum(valve).name.split('_')[0] + valve_name = td_enum_repository.TDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, @@ -220,7 +220,7 @@ """ Constructs and sends the TD valves set position for a valve - @@param valve: integer - Valve number. Defined in TDValvesEnum class + @@param valve: integer - Valve number. Defined in td_enum_repository.TDValveNames class @param status: integer value @param reset: integer - 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise @@ -230,7 +230,7 @@ sts = integer_to_bytearray(status) payload = reset_value + sts + vlv - valve_name = TDValvesEnum(valve).name.split('_')[0] + valve_name = td_enum_repository.TDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, @@ -247,15 +247,15 @@ Constructs and sends a given valve to change position by a given number of encoder counts. - @@param valve: integer - Valve number. Defined in TDValvesEnum class + @@param valve: integer - Valve number. Defined in td_enum_repository.TDValveNames class @param count: integer value @returns 1 if successful, zero otherwise """ vlv = integer_to_bytearray(valve) pos = integer_to_bytearray(counts) payload = pos + vlv - valve_name = TDValvesEnum(valve).name.split('_')[0] + valve_name = td_enum_repository.TDValveNames(valve).name.split('_')[0] return cmd_generic_override( payload = payload, reset = NO_RESET, Index: leahi_dialin/td/modules/voltages.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override -from leahi_dialin.common.td_defs import TDMonitoredVoltages +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -44,7 +44,7 @@ self.msg_id_td_voltages_data = MsgIds.MSG_ID_TD_VOLTAGES_DATA.value self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_voltages_data, self._handler_monitored_voltages_sync) - self.monitored_voltages = [0.0] * TDMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value + self.monitored_voltages = [0.0] * td_enum_repository.TDMonitoredVoltages.NUM_OF_MONITORED_VOLTAGE_LINES.value self.td_voltages_timestamp = 0.0 @@ -80,17 +80,17 @@ vfp = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11])) - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_1_2V.value] = v12[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_3_3V.value] = v33[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.value] = v5l[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_5V_SENSORS.value] = v5s[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_24V.value] = v24[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_24V_REGEN.value] = v24g[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_FPGA_REF_V.value] = vfr[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_PBA_REF_V.value] = vpr[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.value] = vfc[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.value] = vfa[0] - self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.value] = vfp[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_1_2V.value] = v12[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_3_3V.value] = v33[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_5V_LOGIC.value] = v5l[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_5V_SENSORS.value] = v5s[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_24V.value] = v24[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_24V_REGEN.value] = v24g[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_REF_V.value] = vfr[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_PBA_REF_V.value] = vpr[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_VCC_V.value] = vfc[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_AUX_V.value] = vfa[0] + self.monitored_voltages[td_enum_repository.TDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.value] = vfp[0] self.td_voltages_timestamp = timestamp @@ -132,7 +132,7 @@ idx = integer_to_bytearray(signal) payload = rst + vlt + idx - sensor_name = TDMonitoredVoltages(signal).name + sensor_name = td_enum_repository.TDMonitoredVoltages(signal).name return cmd_generic_override( payload = payload, reset = reset, Index: leahi_dialin/td/treatment_delivery.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -37,7 +37,7 @@ from ..common.constants import NO_RESET from ..common.msg_defs import MsgIds, MsgFieldPositions, MsgFieldPositionsFWVersions -from ..common.td_defs import TDOpModes +from ..common.td_defs import td_enum_repository from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from ..utils.base import AbstractSubSystem, publish, LogManager @@ -106,7 +106,7 @@ self.td_debug_events_timestamp = 0.0 self.ui_version_info_response_timestamp = 0.0 self.td_version_response_timestamp = 0.0 - self.td_operation_mode = TDOpModes.MODE_INIT.value + self.td_operation_mode = td_enum_repository.TDOpModes.MODE_INIT.value self.td_operation_sub_mode = 0 self.td_logged_in = False self.td_set_logged_in_status(False) @@ -346,7 +346,7 @@ channel_id = DenaliChannels.dialin_to_td_ch_id, msg_id = MsgIds.MSG_ID_TD_OP_MODE_OVERRIDE_REQUEST, entity_name = 'TD Operation Mode', - override_text = TDOpModes(new_mode).name, + override_text = td_enum_repository.TDOpModes(new_mode).name, logger = self.logger, can_interface = self.can_interface) Index: leahi_dialin/ui/td_messaging.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/ui/td_messaging.py (.../td_messaging.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/ui/td_messaging.py (.../td_messaging.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -662,6 +662,7 @@ self.can_interface.send(message, 0) + def td_vitals_adjustment_response(self,vRejectionReason: int): """ the vitals adjustment response message method(Msg ID: 0x64, 100) @@ -1186,6 +1187,63 @@ payload=payload) self.can_interface.send(message, 0) + def td_duration_validate_response(self, vRejectionReason: int, vDuration: int, vUFVolumeGoal: float, vUFRate: float): + """ + the duration validate response message method(Msg ID: 0x84, 132) + Args: + @param vRejectionReason (int) : response rejection reason, + if rejection reason is 0, then accepted (0) will be sent, + otherwise rejected (1) + @param vDuration (int) : treatment duration (min) + @param vUFVolumeGoal (float) : UF volume goal (mL) + @param vUFRate (float) : UF rate (L/hr) + @return: None + """ + payload = conversions.integer_to_bytearray(1 if vRejectionReason == 0 else 0 ) + payload += conversions.integer_to_bytearray(vRejectionReason ) + payload += conversions.integer_to_bytearray(vDuration ) + payload += conversions.float_to_bytearray(vUFVolumeGoal ) + payload += conversions.float_to_bytearray(vUFRate ) + + message = CAN.DenaliMessage.build_message( + channel_id=CAN.DenaliChannels.td_to_ui_ch_id, + message_id=msg_ids.MsgIds.MSG_ID_TD_DURATION_VALIDATE_RESPONSE .value, + payload=payload) + self.can_interface.send(message, 0) + + + def td_blood_set_auto_load_response(self,vRejectionReason: int): + """ + the blood set auto eject response message method(Msg ID: 0xXX, XXX) + Args: + None + @return: None + """ + payload = conversions.integer_to_bytearray(1 if vRejectionReason == 0 else 0) + payload += conversions.integer_to_bytearray(vRejectionReason) + + message = CAN.DenaliMessage.build_message( + channel_id=CAN.DenaliChannels.td_to_ui_ch_id, + message_id=msg_ids.MsgIds.MSG_ID_TD_ADJUST_DISPOSABLES_CONFIRM_RESPONSE.value, + payload=payload) + self.can_interface.send(message, 0) + + def td_blood_set_auto_eject_response(self,vRejectionReason: int): + """ + the heparin adjustment response message method(Msg ID: 0xXX, XXX) + Args: + None + @return: None + """ + payload = conversions.integer_to_bytearray(1 if vRejectionReason == 0 else 0) + payload += conversions.integer_to_bytearray(vRejectionReason) + + message = CAN.DenaliMessage.build_message( + channel_id=CAN.DenaliChannels.td_to_ui_ch_id, + message_id=msg_ids.MsgIds.MSG_ID_TD_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_RESPONSE.value, + payload=payload) + self.can_interface.send(message, 0) + def td_Treatment_Parameters_CreateRx(self, vRejectionReason: int): """ TD response to in initiate Treatment and enter Create Rx (Msg ID: 0x46, 70) @@ -1207,73 +1265,73 @@ def td_Treatment_Parameters_Validation( self, - vAccepted : int = 1, - vBloodFlowRateRejectReason : int = 0, - vDialysateFlowRateRejectReason : int = 0, - vTreatmentDurationRejectReason : int = 0, - vSalineBolusVolumeRejectReason : int = 0, - vHeparinStopTimeRejectReason : int = 0, - vHeparinTypeRejectReason : int = 0, - vAcidConcentrateRejectReason : int = 0, - vBicarbonateConcentrateRejectReason : int = 0, - vDialyzerTypeRejectReason : int = 0, - vBloodPressureMeasureIntervalRejectReason : int = 0, - vRinsebackFlowRateRejectReason : int = 0, - vRinsebackVolumeRejectReason : int = 0, - vArterialPressureLimitWindowRejectReason : int = 0, - vVenousPressureLimitWindowRejectReason : int = 0, - vVenousPressureLimitAsymtrcRejectReason : int = 0, - vTrancembrncPressureLimitWindowRejectReason : int = 0, - vDialysateTempRejectReason : int = 0, - vHeparinDispensingRateRejectReason : int = 0, - vHeparinBolusVolumeRejectReason : int = 0 + vAccepted : int = 1, + vBloodFlowRateRejectReason : int = 0, + vDialysateFlowRateRejectReason : int = 0, + vTreatmentDurationRejectReason : int = 0, + vSalineBolusVolumeRejectReason : int = 0, + vHeparinStopTimeRejectReason : int = 0, + vHeparinTypeRejectReason : int = 0, + vAcidConcentrateRejectReason : int = 0, + vBicarbonateConcentrateRejectReason : int = 0, + vDialyzerTypeRejectReason : int = 0, + vBloodPressureMeasureIntervalRejectReason : int = 0, + vRinsebackFlowRateRejectReason : int = 0, + vRinsebackVolumeRejectReason : int = 0, + vArterialPressureLimitWindowRejectReason : int = 0, + vVenousPressureLimitWindowRejectReason : int = 0, + vVenousPressureLimitAsymtrcRejectReason : int = 0, + vTransmembranePressureLimitWindowRejectReason : int = 0, + vDialysateTempRejectReason : int = 0, + vHeparinDispensingRateRejectReason : int = 0, + vHeparinBolusVolumeRejectReason : int = 0 ): """TD Treatment Parameter Validation Response to the SW validation request with sent values of the same parameters.(Msg ID: 0x40, 64) Args: - vAccepted (int, optional): Zero value if rejected. Defaults to 1. - vBloodFlowRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vDialysateFlowRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vTreatmentDurationRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vSalineBolusVolumeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vHeparinStopTimeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vHeparinTypeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vAcidConcentrateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vBicarbonateConcentrateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vDialyzerTypeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vBloodPressureMeasureIntervalRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vRinsebackFlowRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vRinsebackVolumeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vArterialPressureLimitWindowRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vVenousPressureLimitWindowRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vVenousPressureLimitAsymtrcRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vTrancembrncPressureLimitWindowRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vDialysateTempRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vHeparinDispensingRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. - vHeparinBolusVolumeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vAccepted (int, optional): Zero value if rejected. Defaults to 1. + vBloodFlowRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vDialysateFlowRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vTreatmentDurationRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vSalineBolusVolumeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vHeparinStopTimeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vHeparinTypeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vAcidConcentrateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vBicarbonateConcentrateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vDialyzerTypeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vBloodPressureMeasureIntervalRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vRinsebackFlowRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vRinsebackVolumeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vArterialPressureLimitWindowRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vVenousPressureLimitWindowRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vVenousPressureLimitAsymtrcRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vTransmembranePressureLimitWindowRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vDialysateTempRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vHeparinDispensingRateRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. + vHeparinBolusVolumeRejectReason (int, optional): None zero value of rejection reason. Defaults to 0. """ if not self.can_enabled: raise ValueError("CAN Interface is not enabled") - payload = conversions.integer_to_bytearray(vAccepted ) - payload += conversions.integer_to_bytearray(vBloodFlowRateRejectReason ) - payload += conversions.integer_to_bytearray(vDialysateFlowRateRejectReason ) - payload += conversions.integer_to_bytearray(vTreatmentDurationRejectReason ) - payload += conversions.integer_to_bytearray(vSalineBolusVolumeRejectReason ) - payload += conversions.integer_to_bytearray(vHeparinStopTimeRejectReason ) - payload += conversions.integer_to_bytearray(vHeparinTypeRejectReason ) - payload += conversions.integer_to_bytearray(vAcidConcentrateRejectReason ) - payload += conversions.integer_to_bytearray(vBicarbonateConcentrateRejectReason ) - payload += conversions.integer_to_bytearray(vDialyzerTypeRejectReason ) - payload += conversions.integer_to_bytearray(vBloodPressureMeasureIntervalRejectReason ) - payload += conversions.integer_to_bytearray(vRinsebackFlowRateRejectReason ) - payload += conversions.integer_to_bytearray(vRinsebackVolumeRejectReason ) - payload += conversions.integer_to_bytearray(vArterialPressureLimitWindowRejectReason ) - payload += conversions.integer_to_bytearray(vVenousPressureLimitWindowRejectReason ) - payload += conversions.integer_to_bytearray(vVenousPressureLimitAsymtrcRejectReason ) - payload += conversions.integer_to_bytearray(vTrancembrncPressureLimitWindowRejectReason ) - payload += conversions.integer_to_bytearray(vDialysateTempRejectReason ) - payload += conversions.integer_to_bytearray(vHeparinDispensingRateRejectReason ) - payload += conversions.integer_to_bytearray(vHeparinBolusVolumeRejectReason ) + payload = conversions.integer_to_bytearray(vAccepted ) + payload += conversions.integer_to_bytearray(vBloodFlowRateRejectReason ) + payload += conversions.integer_to_bytearray(vDialysateFlowRateRejectReason ) + payload += conversions.integer_to_bytearray(vTreatmentDurationRejectReason ) + payload += conversions.integer_to_bytearray(vSalineBolusVolumeRejectReason ) + payload += conversions.integer_to_bytearray(vHeparinStopTimeRejectReason ) + payload += conversions.integer_to_bytearray(vHeparinTypeRejectReason ) + payload += conversions.integer_to_bytearray(vAcidConcentrateRejectReason ) + payload += conversions.integer_to_bytearray(vBicarbonateConcentrateRejectReason ) + payload += conversions.integer_to_bytearray(vDialyzerTypeRejectReason ) + payload += conversions.integer_to_bytearray(vBloodPressureMeasureIntervalRejectReason ) + payload += conversions.integer_to_bytearray(vRinsebackFlowRateRejectReason ) + payload += conversions.integer_to_bytearray(vRinsebackVolumeRejectReason ) + payload += conversions.integer_to_bytearray(vArterialPressureLimitWindowRejectReason ) + payload += conversions.integer_to_bytearray(vVenousPressureLimitWindowRejectReason ) + payload += conversions.integer_to_bytearray(vVenousPressureLimitAsymtrcRejectReason ) + payload += conversions.integer_to_bytearray(vTransmembranePressureLimitWindowRejectReason ) + payload += conversions.integer_to_bytearray(vDialysateTempRejectReason ) + payload += conversions.integer_to_bytearray(vHeparinDispensingRateRejectReason ) + payload += conversions.integer_to_bytearray(vHeparinBolusVolumeRejectReason ) message = CAN.DenaliMessage.build_message( channel_id=CAN.DenaliChannels.td_to_ui_ch_id, Index: leahi_dialin/utils/base.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -rc5bfcf84ed942ca5841bf9de155aa0f495b4d28d --- leahi_dialin/utils/base.py (.../base.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/utils/base.py (.../base.py) (revision c5bfcf84ed942ca5841bf9de155aa0f495b4d28d) @@ -315,3 +315,16 @@ def stop(self): self._timer.cancel() self.is_running = False + + +class InternalEvent: + def __init__(self): + self._listeners = [] + + def add_listener(self, func): + self._listeners.append(func) + return func + + def trigger(self, *args, **kwargs): + for func in self._listeners: + func(*args, **kwargs)