Index: leahi_dialin/common/dd_defs.py =================================================================== diff -u -r134ce79ed68aed5a981c07fef3bca314a9fb9b8e -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 134ce79ed68aed5a981c07fef3bca314a9fb9b8e) +++ leahi_dialin/common/dd_defs.py (.../dd_defs.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -22,642 +22,370 @@ from ..utils.base import DialinEnum -class DD_Defs: +@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 - # 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 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 - DDConcentratePumpNames:DialinEnum - DDConductivitySensorNames:DialinEnum - DDDialysatePumpNames:DialinEnum - DDHeaterNames:DialinEnum - DDLevelSensorNames:DialinEnum - DDPistonPumpNames:DialinEnum - DDPressureSensorNames:DialinEnum - DDTemperatureSensorNames: DialinEnum - DDValveNames: DialinEnum - DDMonitoredVoltages: 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 - 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 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 - _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 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 - # Event enums - 'DDEventList': '_create_dd_event_list', - 'DDEventDataTypes': '_create_dd_event_data_types', +@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 - # 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 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 - # 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 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 - def __init__(self): - self.update_enums() +@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 +@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 - 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 DDServiceModesStates(DialinEnum): + DD_SERVICE_STATE_START = 0 # Start service mode state + NUM_OF_DD_SERVICE_STATES = 1 # Number of service mode states +@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 - 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 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 +@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 - # ================================================== 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 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 +@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 - 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 DDConductivitySensorsEnum(DialinEnum): + D17_COND = 0 # Closed Loop Control of Dosing for D74 Conductivity Sensor + D27_COND = 1 # Closed Loop Control of Dosing for D29 Conductivity Sensor + D29_COND = 2 # Water, Bicarbonate, and Acid Collective Conductivity Sensor + D43_COND = 3 # Self Test Conductivity Sensor (not used for dialysate conductivity) + D74_COND = 4 # Water and Bicarbonate Collective Conductivity Sensor + NUM_OF_CONDUCTIVITY_SENSORS = 5 # Number of Conductivity Sensors +@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 - 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 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 +@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 - 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 DDHeatersStartStop(DialinEnum): + STOP = 0 + START = 1 +@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 - 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 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 +@unique +class DDHeatersNames(DialinEnum): + D5_HEAT = 0 # Primary heater + D45_HEAT = 1 # Trimmer heater + NUM_OF_DD_HEATERS = 2 # Number of Heaters - 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 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 +@unique +class DDHeatersCoolingStates(DialinEnum): + NUM_OF_DD_HEAT_COOL_STATES = 0 # TODO: populate with heater cooling states - 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 DDLevelSensorEnum(DialinEnum): + D6_LEVEL = 0 # floater switch low, medium and high status + D63_LEVEL = 1 # bicarb level low or high status + D46_LEVEL = 2 # Spent dialysate air separation chamber level low or high status + NUM_OF_LEVELS = 3 # Number of Level Sensors - return unique(DialinEnum('DDPreGenDialysateStates', members)) +@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 +@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 - 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 DDPressureNames(DialinEnum): + # Pressure Sensor IDs + D9_PRES = 0 # Hydraulics outlet pressure (PHo/Pn) + D66_PRES = 1 # Dry Bicarb pressure (PDB/PCb) + D51_PRES = 2 # Spent Dialysate pressure (PDs) + D18_PRES = 3 # Fresh Dialysate pressure (PDf) + D41_PRES = 4 # Transmembrane pressure (Ptm) + NUM_OF_PRESSURE_SENSORS = 5 # Number of pressure sensors - return unique(DialinEnum('DDGenDialysateModeStates', members)) +COND_SENSOR_INDEX_OFFSET = 6 # Conductivity Sensor Index Offset for the Temperature Readings +PRES_SENSOR_INDEX_OFFSET = 15 # Pressure Sensors Offset for Temperature Readings +@unique +class DDROPermeateStates(DialinEnum): + NUM_OF_RO_PERMEATE_STATES = 0 # TODO: populate with RO Permeate states - 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 DDTemperaturesNames(DialinEnum): + D1_TEMP = 0 # Heat exchanger Inlet temperature sensor + D78_TEMP = 1 # Heat exchanger Outlet temperature sensor + D4_TEMP = 2 # Hydraulics primary heater temperature sensor + D50_TEMP = 3 # Trimmer heater temperature sensor + BRD_TEMP = 4 # Barometric temperature sensor + D16_TEMP = 5 # D16 Conductivity sensor temperature value + D28_TEMP = 6 # D28 Conductivity sensor temperature value + D30_TEMP = 7 # D30 Conductivity sensor temperature value + D44_TEMP = 8 # D44 Conductivity sensor temperature value + D75_TEMP = 9 # D75 Conductivity sensor temperature value + D4_AVG_TEMP = 10 # D4 Filtered value + D50_AVG_TEMP = 11 # D50 Filtered value + D28_AVG_TEMP = 12 # D28 Filtered value + D30_AVG_TEMP = 13 # D30 Filtered value + D9_TEMP = 14 # D9 Pressure sensor temperature value + D66_TEMP = 15 # D66 Pressure sensor temperature value + D51_TEMP = 16 # D51 Pressure sensor temperature value + D18_TEMP = 17 # D18 Pressure sensor temperature value + D41_TEMP = 18 # D41 Pressure sensor temperature value + NUM_OF_TEMP_SENSORS = 19 # Number of Temperature Sensors - return unique(DialinEnum('DDPostGenDialysateStates', members)) +@unique +class DDValveStates(DialinEnum): + VALVE_STATE_CLOSED = 0 # Valve Closed State + VALVE_STATE_OPEN = 1 # Valve Open State +@unique +class DDValveNames(DialinEnum): + D14_VALV = 0 # Valve Hydraulics Outlet (D14) + D52_VALV = 1 # Valve Thermal Disinfect (D52) + D8_VALV = 2 # Valve Hydraulics Bypass (D8) + D54_VALV = 3 # Valve Rinse Port (D54) + D53_VALV = 4 # Valve Drain (D53) + D34_VALV = 5 # Valve Dialyzer Bypass (D34) + D64_VALV = 6 # Valve Purge 1 (D64) + D31_VALV = 7 # Valve Pressure Test (D31) + D65_VALV = 8 # Valve DryBcarb Inlet (D65) + D35_VALV = 9 # Valve Dialyzer Inlet (D35) + D40_VALV = 10 # Valve Dialyzer Outlet (D40) + D47_VALV = 11 # Valve Dialysate Out Purge 2 (D47) + D3_VALV = 12 # Valve Hydraulics Inlet (D3) + D80_VALV = 13 # Valve Dry Bicarb (D80) + D81_VALV = 14 # Valve De-scaler (D81) + RSRVD_SPACE1 = 15 # This space has been reserved + D23_VALV = 16 # Balancing chamber Valve 1 (D23) + D19_VALV = 17 # Balancing chamber Valve 2 (D19) + D25_VALV = 18 # Balancing chamber Valve 3 (D25) + D21_VALV = 19 # Balancing chamber Valve 4 (D21) + D24_VALV = 20 # Balancing chamber Valve 5 (D24) + D20_VALV = 21 # Balancing chamber Valve 6 (D20) + D26_VALV = 22 # Balancing chamber Valve 7 (D26) + D22_VALV = 23 # Balancing chamber Valve 8 (D22) + D79_PMP_VALV = 24 # D79 pump mapped to spare valve 0 + SPARE1_VALV = 25 # Spare Valve 1 + SPARE2_VALV = 26 # Spare Valve 2 + SPARE3_VALV = 27 # Spare Valve 3 + SPARE4_VALV = 28 # Spare Valve 4 + SPARE5_VALV = 29 # Spare Valve 5 + SPARE6_VALV = 30 # Spare Valve 6 + SPARE7_VALV = 31 # Spare Valve 7 + M4_VALV = 32 # First IO valve (M4) + M12_VALV = 33 # Last IO valve IO valve (M12) + P11_VALV = 34 # First FP Valve (P11) + P33_VALV = 35 # FP Valve (P33) + P34_VALV = 36 # FP Valve (P34) + P37_VALV = 37 # FP Valve (P37) + P39_VALV = 38 # FP Valve (P39) + P6_VALV = 39 # Last FP Valve (P6) + NUM_OF_DD_VALVES = 40 # Number of Valves for the DD - 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)) +@unique +class DDNotLegalStates(DialinEnum): + NUM_OF_NOT_LEGAL_STATES = 0 # TODO: populate with Not Legal states - - 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): - 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) +@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 Index: leahi_dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -re9a1b8796610fd165c45a0a2c9c2034e00a77546 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision e9a1b8796610fd165c45a0a2c9c2034e00a77546) +++ leahi_dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -17,9 +17,10 @@ import struct from logging import Logger -from leahi_dialin.common.constants import RESET, NO_RESET +from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.common.dd_defs import DDConductivitySensorsEnum +from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -50,12 +51,14 @@ self._handler_conductivity_sensors_sync) self.dd_conductivity = { - DDConductivitySensorsEnum.D17_COND.name: 0.0, - DDConductivitySensorsEnum.D27_COND.name: 0.0, - DDConductivitySensorsEnum.D29_COND.name: 0.0, - DDConductivitySensorsEnum.D43_COND.name: 0.0, - DDConductivitySensorsEnum.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 @@ @return: None """ - self.dd_conductivity[DDConductivitySensorsEnum.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[DDConductivitySensorsEnum.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[DDConductivitySensorsEnum.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[DDConductivitySensorsEnum.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[DDConductivitySensorsEnum.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 def cmd_conductivity_sensor_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: @@ -134,7 +143,7 @@ str_res = "reset back to normal" else: str_res = str(conductivity) + " microsiemens/cm" - self.logger.debug("override conductivity sensor value for sensor " + DDConductivitySensorsEnum(sensor_index).name + self.logger.debug("override conductivity sensor value for sensor " + dd_enum_repository.DDConductivitySensorNames(sensor_index).name + ": " + str_res) # Send message @@ -175,7 +184,7 @@ str_res = "reset back to normal" else: str_res = str(counter) - self.logger.debug("override conductivity sensor value for sensor " + DDConductivitySensorsEnum[str(sensor_index)].name + self.logger.debug("override conductivity sensor value for sensor " + dd_enum_repository.DDConductivitySensorNames[str(sensor_index)].name + ": " + str_res) # Send message @@ -213,7 +222,7 @@ str_res = "reset back to normal" else: str_res = str(counter) - self.logger.debug("override conductivity sensor value for sensor " + DDConductivitySensorsEnum[str(sensor_index)].name + self.logger.debug("override conductivity sensor value for sensor " + dd_enum_repository.DDConductivitySensorNames[str(sensor_index)].name + ": " + str_res) # Send message Index: leahi_dialin/dd/modules/levels.py =================================================================== diff -u -r809b92241a33a60e8b04968b2484deed871f6f69 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 809b92241a33a60e8b04968b2484deed871f6f69) +++ leahi_dialin/dd/modules/levels.py (.../levels.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -19,7 +19,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.common.dd_defs import DDLevelSensorEnum +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -49,10 +49,10 @@ 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.DDLevelSensorEnum.D98_LEVEL.name: 0, + dd_enum_repository.DDLevelSensorNames.D46_LEVEL.name: 0 } self.dd_bicarb_level = 0 self.dd_levels_timestamp = 0 @@ -66,15 +66,15 @@ @param message: published levels data message @returns none """ - self.dd_level_sensors[DDLevelSensorEnum.D6_LEVEL.name] = struct.unpack('i', bytearray( + self.dd_level_sensors[dd_enum_repository.DDLevelSensorNames.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( + self.dd_level_sensors[dd_enum_repository.DDLevelSensorNames.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( + self.dd_level_sensors[dd_enum_repository.DDLevelSensorNames.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( + self.dd_level_sensors[dd_enum_repository.DDLevelSensorEnum.D46_LEVEL.name] = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] self.dd_levels_timestamp = timestamp Index: leahi_dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -r40186f183b0331f4c76c24c1e5385539ce603402 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 40186f183b0331f4c76c24c1e5385539ce603402) +++ leahi_dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -13,17 +13,17 @@ # @date (original) 14-Apr-2020 # ############################################################################ + import struct -from enum import unique from logging import Logger -from .constants import NO_RESET, RESET +from leahi_dialin.common.constants import NO_RESET, RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.global_vars import GlobalVariables +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels -from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum -from leahi_dialin.utils.checks import check_broadcast_interval_override_ms +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -103,30 +103,15 @@ """ - if not check_broadcast_interval_override_ms(ms): - return False + cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_PRESSURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'DD pressure sensors', + logger = self.logger, + can_interface = self.can_interface) - rst = integer_to_bytearray(reset) - ivl = integer_to_bytearray(ms) - payload = rst + ivl - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override pressure 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.debug("Timeout!!!!") - return False - def cmd_pressure_readings_override(self, sensor: int, pressure: float, reset: int = NO_RESET) -> int: """ Constructs and sends the pressure readings override command. @@ -161,45 +146,6 @@ self.logger.debug("Timeout!!!!") return False - def cmd_pressure_sensor_read_counter_override(self, sensor: int, counter: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the pressure sensor read counter override command - Constraints: - Must be logged into DD. - - @param sensor: unsigned int - sensor ID - @param counter: integer - read count to override sensor with - @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) - read_byte_array = integer_to_bytearray(counter) - sensor_byte_array = integer_to_bytearray(sensor) - payload = reset_byte_array + read_byte_array + sensor_byte_array - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_READ_COUNTER_OVERRIDE_REQUEST.value, - payload=payload) - - if reset == RESET: - str_res = "reset back to normal" - else: - str_res = str(sensor) + " psi" - self.logger.debug("override read counter value for pressure sensor " + str(sensor) + ": " + 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_pressure_sensor_error_counter_override(self, sensor: int, counter: int, reset: int = NO_RESET) -> int: """ Constructs and sends the pressure sensor error counter override command. Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r5681154cdaaf629c997dc05472657bf40c94d6e1 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 5681154cdaaf629c997dc05472657bf40c94d6e1) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -18,7 +18,8 @@ from leahi_dialin.common.constants import NO_RESET, RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.common.dd_defs import COND_SENSOR_INDEX_OFFSET, PRES_SENSOR_INDEX_OFFSET, DDTemperaturesNames +from leahi_dialin.common.dd_defs import dd_enum_repository +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -38,29 +39,29 @@ # 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 +77,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')) + 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.D28_AVG_TEMP, 'f')) + sensor_list.append((dd_enum_repository.DDTemperatureSensorNames.D30_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 def cmd_temperatures_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: @@ -183,16 +157,16 @@ value = float_to_bytearray(sensor_value) # DD Conductivity Sensors' Temperature Reading Override - if DDTemperaturesNames.D16_TEMP.value <= sensor_index <= DDTemperaturesNames.D99_TEMP.value: - index = integer_to_bytearray((sensor_index - COND_SENSOR_INDEX_OFFSET)) + if dd_enum_repository.DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value <= sensor_index <= dd_enum_repository.DDTemperatureSensorNames.LAST_CONDUCTIVITY_SENSOR.value: + index = integer_to_bytearray((sensor_index - dd_enum_repository.DDTemperatureSensorNames.FIRST_CONDUCTIVITY_SENSOR.value)) payload = rst + value + index message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_TEMPERATURE_OVERRIDE_REQUEST.value, payload=payload) # DD Pressure Sensors' Temperature Reading Override - elif DDTemperaturesNames.D9_TEMP.value <= sensor_index < DDTemperaturesNames.NUM_OF_TEMP_SENSORS.value: - index = integer_to_bytearray((sensor_index - PRES_SENSOR_INDEX_OFFSET)) + elif dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value <= sensor_index <= dd_enum_repository.DDTemperatureSensorNames.LAST_PRESSURE_SENSOR.value: + index = integer_to_bytearray((sensor_index - dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value)) payload = rst + value + index message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_TEMPERATURE_OVERRIDE_REQUEST.value, @@ -206,7 +180,7 @@ message_id=MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_MEASURED_TEMPERATURE_OVERRIDE_REQUEST.value, payload=payload) - self.logger.debug("Setting sensor {} to {} C".format(DDTemperaturesNames(sensor_index).name, sensor_value)) + self.logger.debug("Setting sensor {} to {} C".format(dd_enum_repository.DDTemperatureSensorNames(sensor_index).name, sensor_value)) # Send message received_message = self.can_interface.send(message) @@ -326,15 +300,15 @@ 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 - PRES_SENSOR_INDEX_OFFSET) + idx = integer_to_bytearray(sensor - dd_enum_repository.DDTemperatureSensorNames.FIRST_PRESSURE_SENSOR.value) payload = rst + tmp + idx message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -ra5b82c620e6a54f2b8559c54ffaa1a84e831d88e -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision a5b82c620e6a54f2b8559c54ffaa1a84e831d88e) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -20,7 +20,7 @@ from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds -from leahi_dialin.common.dd_defs import DDValveNames +from leahi_dialin.common.dd_defs import dd_enum_repository from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -64,46 +64,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] = '' def get_valve_states(self): @@ -207,11 +207,11 @@ "d22_valv", "d79_pmp_valv", "D83_valv", - "D91_valv", + "d91_valv", "spare3_valv", "spare4_valv", "spare5_valv", - "D100_valv", + "d100_valv", "spare7_valv", "valve_states_enum", "valves_sensed_states", @@ -258,20 +258,20 @@ self.d22_valv["state"] = self._binary_to_valve_state(bcv[0] & 128) spv = struct.unpack('B', bytearray(message['message'][self.START_POS_SPARE_VALVES_STATES:self.END_POS_SPARE_VALVES_STATES])) - self.d79_pmp_valv["state"] = self._binary_to_valve_state(spv[0] & 1) - self.d83_valv["state"] = self._binary_to_valve_state(spv[0] & 2) - self.d91_valv["state"] = self._binary_to_valve_state(spv[0] & 4) - self.spare3_valv["state"] = self._binary_to_valve_state(spv[0] & 8) - self.spare4_valv["state"] = self._binary_to_valve_state(spv[0] & 16) - self.spare5_valv["state"] = self._binary_to_valve_state(spv[0] & 32) - self.d100_valv["state"] = self._binary_to_valve_state(spv[0] & 64) - self.spare7_valv["state"] = self._binary_to_valve_state(spv[0] & 128) + self.d79_pmp_valv["state"] = self._binary_to_valve_state(bcv[0] & 1) + self.d83_valv["state"] = self._binary_to_valve_state(bcv[0] & 2) + self.d91_valv["state"] = self._binary_to_valve_state(bcv[0] & 4) + self.spare3_valv["state"] = self._binary_to_valve_state(bcv[0] & 8) + self.spare4_valv["state"] = self._binary_to_valve_state(bcv[0] & 16) + self.spare5_valv["state"] = self._binary_to_valve_state(bcv[0] & 32) + self.d100_valv["state"] = self._binary_to_valve_state(bcv[0] & 64) + self.spare7_valv["state"] = self._binary_to_valve_state(bcv[0] & 128) start = self.END_POS_SPARE_VALVES_STATES 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 Index: leahi_dialin/fp/modules/fp_test_configs.py =================================================================== diff -u -re27f157082335696e336c9d9952392bc62e3c8c8 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision e27f157082335696e336c9d9952392bc62e3c8c8) +++ leahi_dialin/fp/modules/fp_test_configs.py (.../fp_test_configs.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -16,6 +16,8 @@ from logging import Logger +from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.global_vars import GlobalVariables from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.common.test_config_defs import DDFPTestConfigOptions from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels @@ -60,6 +62,27 @@ return self.fp_test_configs[DDFPTestConfigOptions(config).name] + @publish(['msg_id_fp_send_test_config', 'fp_test_configs', 'fp_test_configs_response_timestamp']) + def _handler_fp_test_config_sync(self, message, timestamp=0.0): + """ + Handles published test configuration status messages. + + @param message: published FP test configurations message + @return: None + """ + payload = message['message'] + index = MsgFieldPositions.START_POS_FIELD_1 + + for config in DDFPTestConfigOptions.__members__: + config_value, index = bytearray_to_integer(payload, index, False) + if 'NUM_OF_TEST_CONFIGS' not in config: + self.fp_test_configs[config] = config_value + if DDFPTestConfigOptions.TEST_CONFIG_ENABLE_BETA_1_9_HW.name in config: + GlobalVariables().HW_BETA_1_9 = config_value == 1 + + self.fp_test_configs_response_timestamp = timestamp + + def cmd_set_test_config(self, config: int, reset: int = NO_RESET): """ Constructs and sends the FP test config @@ -146,24 +169,6 @@ self.logger.debug("Timeout!!!!") return False - @publish(['msg_id_fp_send_test_config', 'fp_test_configs', 'fp_test_configs_response_timestamp']) - def _handler_fp_test_config_sync(self, message, timestamp=0.0): - """ - Handles published test configuration status messages. - - @param message: published FP test configurations message - @return: None - """ - payload = message['message'] - index = MsgFieldPositions.START_POS_FIELD_1 - - for config in DDFPTestConfigOptions.__members__: - if 'NUM_OF_TEST_CONFIGS' not in config: - config_value, index = bytearray_to_integer(payload, index, False) - self.fp_test_configs[config] = config_value - - self.fp_test_configs_response_timestamp = timestamp - def _reset_test_configs_record(self): """ Resets the test configuration dictionary Index: leahi_dialin/fp/modules/levels.py =================================================================== diff -u -re60ad12bcc58d5905d7268bbeaae139d8233e023 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/fp/modules/levels.py (.../levels.py) (revision e60ad12bcc58d5905d7268bbeaae139d8233e023) +++ leahi_dialin/fp/modules/levels.py (.../levels.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -24,7 +24,7 @@ from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum from leahi_dialin.utils.checks import check_broadcast_interval_override_ms -from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray +from leahi_dialin.utils.conversions import integer_to_bytearray class FPLevels(AbstractSubSystem): Index: leahi_dialin/fp/modules/valves.py =================================================================== diff -u -re60ad12bcc58d5905d7268bbeaae139d8233e023 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/fp/modules/valves.py (.../valves.py) (revision e60ad12bcc58d5905d7268bbeaae139d8233e023) +++ leahi_dialin/fp/modules/valves.py (.../valves.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -173,6 +173,50 @@ else: return DEENERGIZED + @publish([ + "msg_id_fp_valves_states_data", + "valve_states_all", + "m4_valv", + "m12_valv", + "p11_valv", + "p33_valv", + "p34_valv", + "p37_valv", + "p39_valv", + "p6_valv", + "valve_states_enum", + "fp_valves_states_timestamp" + ]) + def _handler_valves_sync(self, message, timestamp=0.0): + """ + Handles published FP valves states message. + + @param message: published FP valves states message + @return: none + """ + + vst = struct.unpack('H', bytearray(message['message'][self.START_POS_VALVES_STATES:self.END_POS_VALVES_STATES])) + self.valve_states_all = vst[0] + # Extract each valve state from U16 valves states using bit-masking + self.m4_valv["state"] = self._binary_to_valve_state(vst[0] & 1) + self.m12_valv["state"] = self._binary_to_valve_state(vst[0] & 2) + self.p11_valv["state"] = self._binary_to_valve_state(vst[0] & 4) + self.p33_valv["state"] = self._binary_to_valve_state(vst[0] & 8) + self.p34_valv["state"] = self._binary_to_valve_state(vst[0] & 16) + self.p37_valv["state"] = self._binary_to_valve_state(vst[0] & 32) + self.p39_valv["state"] = self._binary_to_valve_state(vst[0] & 64) + self.p6_valv["state"] = self._binary_to_valve_state(vst[0] & 128) + + start = self.END_POS_VALVES_STATES + 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] = FPValveStates(valve_state_number).name + start = end + end += 1 + + self.fp_valves_states_timestamp = timestamp + def cmd_valve_sensed_state_override(self, valve: int, state: bool, reset: int = NO_RESET) -> int: """ Constructs and sends the valve sensed state override command. @@ -216,7 +260,7 @@ Given valve ID must be one of the valve IDs listed below. @param valve: unsigned int - valve ID - @param state: int - valve state + @param state: int - valve state (0=de-energized/closed, 1=energized/open) @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ Index: leahi_dialin/td/modules/ejector.py =================================================================== diff -u -r6944f314294da17334cb50aea33b044c83daa95d -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 6944f314294da17334cb50aea33b044c83daa95d) +++ leahi_dialin/td/modules/ejector.py (.../ejector.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -19,7 +19,7 @@ from .constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -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 DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.checks import check_broadcast_interval_override_ms @@ -49,11 +49,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/pressure_sensors.py =================================================================== diff -u -r4b63107021e34fd1968e02f9d72bbb31f38fefd7 -r71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0 --- leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 4b63107021e34fd1968e02f9d72bbb31f38fefd7) +++ leahi_dialin/td/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 71975b0c600fd9bd4b2a43cc707e6b0a2012f8b0) @@ -18,7 +18,7 @@ from leahi_dialin.common.constants import RESET, NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.common.td_defs import TDPressureSensorNames, TDPressureSensorAttributes +from leahi_dialin.common.td_defs import td_enum_repository from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.protocols.CAN import DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish @@ -46,20 +46,20 @@ self._handler_pressure_sync) self.td_pressure_timestamp = 0.0 self.td_pressure_sensors = { - TDPressureSensorNames.H2_PRES.name: { - TDPressureSensorAttributes.PRES.name: 0.0, - TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name: 0.0, - TDPressureSensorAttributes.PRES_LIMIT_MIN.name: 0, - TDPressureSensorAttributes.PRES_LIMIT_MAX.name: 0 + td_enum_repository.TDPressureSensorNames.H2_PRES.name: { + td_enum_repository.TDPressureSensorAttributes.PRES.name: 0.0, + td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name: 0.0, + td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name: 0, + td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name: 0 }, - TDPressureSensorNames.H14_PRES.name: { - TDPressureSensorAttributes.PRES.name: 0.0, - TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name: 0.0, - TDPressureSensorAttributes.PRES_LIMIT_MIN.name: 0, - TDPressureSensorAttributes.PRES_LIMIT_MAX.name: 0 + td_enum_repository.TDPressureSensorNames.H14_PRES.name: { + td_enum_repository.TDPressureSensorAttributes.PRES.name: 0.0, + td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name: 0.0, + td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name: 0, + td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name: 0 }, - TDPressureSensorNames.H23_PRES.name: { - TDPressureSensorAttributes.PRES.name : 0.0 + td_enum_repository.TDPressureSensorNames.H23_PRES.name: { + td_enum_repository.TDPressureSensorAttributes.PRES.name : 0.0 } } self.pressure_limits_state = 0 @@ -113,22 +113,44 @@ baro = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13])) - self.td_pressure_sensors[TDPressureSensorNames.H2_PRES.name][TDPressureSensorAttributes.PRES.name] = art[0] - self.td_pressure_sensors[TDPressureSensorNames.H14_PRES.name][TDPressureSensorAttributes.PRES.name] = ven[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H2_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES.name] = art[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H14_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES.name] = ven[0] self.pressure_limits_state = pls[0] - self.td_pressure_sensors[TDPressureSensorNames.H2_PRES.name][TDPressureSensorAttributes.PRES_LIMIT_MIN.name] = apl[0] - self.td_pressure_sensors[TDPressureSensorNames.H2_PRES.name][TDPressureSensorAttributes.PRES_LIMIT_MAX.name] = apu[0] - self.td_pressure_sensors[TDPressureSensorNames.H14_PRES.name][TDPressureSensorAttributes.PRES_LIMIT_MIN.name] = vpl[0] - self.td_pressure_sensors[TDPressureSensorNames.H14_PRES.name][TDPressureSensorAttributes.PRES_LIMIT_MAX.name] = vpu[0] - self.td_pressure_sensors[TDPressureSensorNames.H2_PRES.name][TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name] = lfa[0] - self.td_pressure_sensors[TDPressureSensorNames.H14_PRES.name][TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name] = lfv[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H2_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name] = apl[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H2_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name] = apu[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H14_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MIN.name] = vpl[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H14_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES_LIMIT_MAX.name] = vpu[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H2_PRES.name][td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name] = lfa[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H14_PRES.name][td_enum_repository.TDPressureSensorAttributes.LONG_FILTERED_PRESSURE.name] = lfv[0] self.tmp_pressure = tps[0] self.tmp_min_limit = tmin[0] self.tmp_max_limit = tmax[0] - self.td_pressure_sensors[TDPressureSensorNames.H23_PRES.name][TDPressureSensorAttributes.PRES.name] = baro[0] + self.td_pressure_sensors[td_enum_repository.TDPressureSensorNames.H23_PRES.name][td_enum_repository.TDPressureSensorAttributes.PRES.name] = baro[0] self.td_pressure_timestamp = timestamp + def cmd_pressure_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the measured pressure sensors broadcast interval override command + Constraints: + Must be logged into TD. + Given interval must be non-zero and a multiple of the TD general task interval (50 ms). + + @param ms: integer - interval (in ms) to override with + @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_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'TD pressure sensors', + logger = self.logger, + can_interface = self.can_interface) + + def cmd_pressure_sensor_override(self, sensor: int, pressure: float, reset: int = NO_RESET) -> int: """ Constructs and sends the measured pressure sensor override command @@ -187,25 +209,3 @@ logger = self.logger, can_interface = self.can_interface ) - - - def cmd_pressure_sensors_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: - """ - Constructs and sends the measured pressure sensors broadcast interval override command - Constraints: - Must be logged into TD. - Given interval must be non-zero and a multiple of the TD general task interval (50 ms). - - @param ms: integer - interval (in ms) to override with - @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_td_ch_id, - msg_id = MsgIds.MSG_ID_TD_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, - module_name = 'TD pressure sensors', - logger = self.logger, - can_interface = self.can_interface)