Index: leahi_dialin/common/td_defs.py =================================================================== diff -u -r4064308ce07e6e48ad62e9dececd4964af2288f9 -r655be738c7bb307fcf3baa139acba0fb6c62ec4b --- leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 4064308ce07e6e48ad62e9dececd4964af2288f9) +++ leahi_dialin/common/td_defs.py (.../td_defs.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) @@ -855,6 +855,38 @@ @unique +class TDBatteryRegisterNames(DialinEnum): + REMAINING_CAPACITY = 0 # Remaining capacity in mAh + BATTERY_STATUS = 1 # Battery pack status + BATTERY_CHARGE_STATUS = 2 # Battery charge status + BATTERY_I2C_STATUS = 3 # Battery I2C status + FAULT_STATUS = 4 # Charger fault status + THERMISTOR_PCT = 5 # Thermistor percentage + BATTERY_VOLTAGE = 6 # Battery voltage in mV + SYSTEM_VOLTAGE = 7 # System voltage in mV + BATTERY_CURRENT = 8 # Battery current in mAh + RELATIVE_STATE_OF_CHARGE = 9 # Relative state of charge + FULL_CHARGE_CAPACITY = 10 # Full charge capacity in mAh + NUM_OF_BATTERIES = 11 # Number of Batteries + +TDBatteryRegisterNames._str_list = { + # Official Name : Accepted strings + 'REMAINING_CAPACITY': [], + 'BATTERY_STATUS': [], + 'BATTERY_CHARGE_STATUS': [], + 'BATTERY_I2C_STATUS': [], + 'FAULT_STATUS': [], + 'THERMISTOR_PCT': [], + 'BATTERY_VOLTAGE': [], + 'SYSTEM_VOLTAGE': [], + 'BATTERY_CURRENT': [], + 'RELATIVE_STATE_OF_CHARGE': [], + 'FULL_CHARGE_CAPACITY': [], + 'NUM_OF_BATTERIES': [], +} + + +@unique class TDEjectorNames(DialinEnum): H5_MOTOR = 0 # TD Ejector Motor NUM_OF_EJECTOR_MOTORS = 1 # Number of Ejector Motors @@ -977,7 +1009,20 @@ 'NUM_OF_AIR_PUMP_ATTRIBUTES': [], } +class TDAirPumpStates(DialinEnum): + AIR_PUMP_STATE_INIT = 0 # Air Pump Initialize state + AIR_PUMP_STATE_OFF = 1 # Air Pump Off state + AIR_PUMP_STATE_ON = 2 # Air Pump On state + NUM_OF_AIR_PUMP_STATES = 3 # Number of air pump states +TDAirPumpStates._str_list = { + 'AIR_PUMP_STATE_INIT': ['init'], + 'AIR_PUMP_STATE_OFF': ['off'], + 'AIR_PUMP_STATE_ON': ['on'], + 'NUM_OF_AIR_PUMP_STATES ': [] +} + + @unique class TDAirTrapLevelSensorAttributes(DialinEnum): LEVEL = 0 # Level attribute for Air Trap Level Sensor @@ -1138,47 +1183,37 @@ @unique class TDValvePositions(DialinEnum): - VALVE_POSITION_NOT_IN_POSITION = 0 # Valve not in Position - VALVE_POSITION_A_INSERT_LOAD = 1 # Insert/Eject Valve Position - VALVE_POSITION_B_OPEN_BLOOD = 2 # Open Valve Position - VALVE_POSITION_C_CLOSE_SALINE = 3 # Closed Valve Position - VALVE_POSITION_C_PARTIAL_CLOSE = 4 # Partial Close Valve Position - NUM_OF_VALVE_POSITIONS = 5 # Partial Close Valve Position + NOT_IN_POSITION = 0 # Valve not in Position + A_INSERT_INSERT_EJECT = 1 # Insert/Eject Valve Position + B_OPEN_BLOOD = 2 # Open Valve Position + C_CLOSE = 3 # Closed Valve Position + NUM_OF_VALVE_POSITIONS = 4 # Number of valve positions TDValvePositions._str_list = { # Official Name : Accepted strings - 'VALVE_POSITION_NOT_IN_POSITION': ['not in position'], - 'VALVE_POSITION_A_INSERT_LOAD': ['a', 'insert/eject', 'insert', 'eject', 'load'], - 'VALVE_POSITION_B_OPEN_BLOOD': ['b', 'open', 'blood'], - 'VALVE_POSITION_C_CLOSE_SALINE': ['c', 'close', 'closed', 'saline'], - 'VALVE_POSITION_C_PARTIAL_CLOSE': [], + 'NOT_IN_POSITION': ['not in position'], + 'A_INSERT_INSERT_EJECT': ['a', 'insert/eject', 'insert', 'eject', 'load'], + 'B_OPEN_BLOOD': ['b', 'open', 'blood'], + 'C_CLOSE': ['c', 'close', 'closed', 'saline'], 'NUM_OF_VALVE_POSITIONS': [], } @unique class TDValveStates(DialinEnum): - VALVE_STATE_WAIT_FOR_POST = 0 # Waiting for POST Valve State - VALVE_STATE_RESET_VALVE = 1 # Valve state reset valve. - VALVE_STATE_RESET_ENCODER = 2 # Valve state reset encoder. - VALVE_STATE_ENABLE_VALVE = 3 # Valve state enable valve. - VALVE_STATE_HOMING_NOT_STARTED = 4 # Valve state homing not started. - VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE = 5 # Valve state homing find energized edge. - VALVE_STATE_HOMING_FIND_DEENERGIZED_EDGE = 6 # Valve state homing find. - VALVE_STATE_IDLE = 7 # Idle Valve State. - VALVE_STATE_IN_TRANSITION = 8 # Valve state in transition. + WAIT_FOR_POST = 0 # Waiting for POST Valve State + HOMING_NOT_HOMED = 1 # Valve state homing not homed. + IDLE = 2 # Idle Valve State. + IN_TRANSITION = 3 # Valve state in transition. + NUM_OF_VALVE_STATES = 4 # Number of valve states. TDValveStates._str_list = { # Official Name : Accepted strings - 'VALVE_STATE_WAIT_FOR_POST': ['wait', 'wait for post'], - 'VALVE_STATE_RESET_VALVE': ['reset valve'], - 'VALVE_STATE_RESET_ENCODER': ['reset encoder'], - 'VALVE_STATE_ENABLE_VALVE': ['enable', 'enable valve'], - 'VALVE_STATE_HOMING_NOT_STARTED': ['homing not started', 'not started'], - 'VALVE_STATE_HOMING_FIND_ENERGIZED_EDGE': ['homing find energized edge'], - 'VALVE_STATE_HOMING_FIND_DEENERGIZED_EDGE': ['homing find deenergized edge'], - 'VALVE_STATE_IDLE': ['idle'], - 'VALVE_STATE_IN_TRANSITION': [], + 'WAIT_FOR_POST': ['wait', 'wait for post'], + 'HOMING_NOT_HOMED': ['homing not started', 'not started'], + 'IDLE': ['idle'], + 'IN_TRANSITION': [], + 'NUM_OF_VALVE_STATES': [], } Index: leahi_dialin/td/modules/alarms.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r655be738c7bb307fcf3baa139acba0fb6c62ec4b --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) @@ -164,6 +164,16 @@ self.handler_prop_execution_times = [] + def get_active_alarms(self): + """ + Get the currently active alarms + """ + result = [] + for alarm in AlarmList: + if self.alarm_states[alarm.value]: + result.append(alarm) + return result + def clear_dialin_alarms(self): """ Clears the alarms states in Dialin. Index: leahi_dialin/td/modules/buttons.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r655be738c7bb307fcf3baa139acba0fb6c62ec4b --- leahi_dialin/td/modules/buttons.py (.../buttons.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/buttons.py (.../buttons.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) @@ -78,11 +78,14 @@ self.logger.debug("Poweroff message id detected, but was the wrong length.") return - mode = struct.unpack(DataTypes.U16.unpack_attrib(), bytearray( - message["message"][MsgFieldPositions.START_POS_FIELD_1: MsgFieldPositions.START_POS_FIELD_1 + 2])) + msg_list = [] + msg_list.append(('mode', DataTypes.U16)) - if len(mode) > 0: - self.poweroff_timeout_expired = bool(mode[0]) + result = self.process_into_vars(decoder_list = msg_list, + message = message) + + if len(result['mode']) > 0: + self.poweroff_timeout_expired = bool(result['mode'][0]) self.td_power_off_timestamp = timestamp self.handler_execution_times.append((timestamp, message, time.perf_counter() - start)) Index: leahi_dialin/td/modules/events.py =================================================================== diff -u -r5c1132f5aadff6082afa56588ad1f4a64f828cd9 -r655be738c7bb307fcf3baa139acba0fb6c62ec4b --- leahi_dialin/td/modules/events.py (.../events.py) (revision 5c1132f5aadff6082afa56588ad1f4a64f828cd9) +++ leahi_dialin/td/modules/events.py (.../events.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) @@ -46,11 +46,11 @@ self.logger = logger if self.can_interface is not None: - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_to_ui_ch_id, message_id = MsgIds.MSG_ID_TD_EVENT.value, function = self._handler_events_sync) - self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_to_ui_ch_id, message_id = MsgIds.MSG_ID_TD_OP_MODE_DATA.value, function = self._handler_td_op_mode_sync) Index: leahi_dialin/td/proxies/ui_proxy.py =================================================================== diff -u -r25ee6bec8d46d9e9cc70ce152edbaf15abe84d39 -r655be738c7bb307fcf3baa139acba0fb6c62ec4b --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 25ee6bec8d46d9e9cc70ce152edbaf15abe84d39) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) @@ -448,3 +448,35 @@ override_text = 'N/A', logger = self.logger, can_interface = self.can_interface) + + + def cmd_send_ui_cartridge_install_confirm_response (self) -> None: + """ + Constructs and sends a UI response for confirming cartridge installation. + + :return: none + """ + cmd_generic_override(payload = None, + reset = None, + channel_id = CanChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST, + entity_name = 'UI Confirm Cartridge Installation response', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_send_ui_cartridge_removal_confirm_response (self) -> None: + """ + Constructs and sends a UI response for confirming cartridge removal. + + :return: none + """ + cmd_generic_override(payload = None, + reset = None, + channel_id = CanChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_REQUEST, + entity_name = 'UI Confirm Cartridge Removal response', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/treatment_delivery.py =================================================================== diff -u -r5da4d355d70170b4a8bb2a99893667c629a8946e -r655be738c7bb307fcf3baa139acba0fb6c62ec4b --- leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 5da4d355d70170b4a8bb2a99893667c629a8946e) +++ leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 655be738c7bb307fcf3baa139acba0fb6c62ec4b) @@ -22,13 +22,16 @@ from .modules.air_pump import TDAirPump from .modules.air_trap import TDAirTrap from .modules.alarms import TDAlarms +from .modules.battery import TDBattery from .modules.blood_flow import TDBloodFlow +from .modules.blood_pressure import TDBloodPressure from .modules.bubble_detector import TDBubbleDetector from .modules.buttons import TDButtons from .modules.dry_self_test import TDDrySelfTest from .modules.ejector import TDEjector from .modules.events import TDEvents from .modules.pressure_sensors import TDPressureSensors +from .modules.records import TDRecords from .modules.switches import TDSwitches from .modules.syringe_pump import TDSyringePump from .modules.temperature_sensors import TDTemperatureSensors @@ -41,7 +44,8 @@ from .proxies.ui_proxy import UIProxy from ..common.constants import NO_RESET -from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..common.msg_defs import MsgFieldPositions +from ..common.msg_ids import MsgIds from ..common import td_enum_repository from ..common.generic_defs import DataTypes from ..common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override @@ -129,13 +133,16 @@ self.air_pump = TDAirPump(self.can_interface, self.logger) #: The Air Pump module self.air_trap = TDAirTrap(self.can_interface, self.logger) #: The Air Trap module self.alarms = TDAlarms(self.can_interface, self.logger) #: The Alarms module + self.battery = TDBattery(self.can_interface, self.logger) #: The Battery module self.blood_flow = TDBloodFlow(self.can_interface, self.logger) #: The Blood Flow module + self.blood_pressure = TDBloodPressure(self.can_interface, self.logger) #: The Blood Pressure module self.bubbles = TDBubbleDetector(self.can_interface, self.logger) #: The Bubble Detector module self.buttons = TDButtons(self.can_interface, self.logger) #: The Buttons module self.dry_self_test = TDDrySelfTest(self.can_interface, self.logger) #: The Dry Self Test module self.ejector = TDEjector(self.can_interface, self.logger) #: The Ejector module self.events = TDEvents(self.can_interface, self.logger) #: The Events module self.pressure_sensors = TDPressureSensors(self.can_interface, self.logger) #: The Pressure Sensors module + self.records = TDRecords(self.can_interface, self.logger) #: The Records module self.switches = TDSwitches(self.can_interface, self.logger) #: The Switches module self.syringe_pump = TDSyringePump(self.can_interface, self.logger) #: The Syringe Pump module self.temperature_sensors = TDTemperatureSensors(self.can_interface, self.logger) #: The Temperature Sensors module