Index: leahi_dialin/td/modules/treatment.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -r1813f6556e8a726a6e300caffe0bcafc40010aa9 --- leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 1813f6556e8a726a6e300caffe0bcafc40010aa9) @@ -7,21 +7,22 @@ # # @file treatment.py # -# @author (last) Michael Garthwaite -# @date (last) 22-Apr-2025 +# @author (last) Zoltan Miskolci +# @date (last) 08-Jan-2026 # @author (original) Michael Garthwaite # @date (original) 22-Apr-2025 # ############################################################################ + import struct from logging import Logger -from .constants import RESET, NO_RESET +from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common.td_defs import TDTreatmentParameters -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.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -123,6 +124,7 @@ self.uf_vol = 0.0 self.tx_param_req_timestamp = 0 + @publish(["msg_id_td_treatment_param_ranges", "min_tx_time","max_tx_time","min_uf_volume","max_uf_volume", "min_dial_rate","max_dial_rate","tx_params_timestamp"]) def _handler_treatment_param_ranges_sync(self, message, timestamp=0.0): @@ -132,7 +134,6 @@ @param message: published treatment parameter range data message @return: none """ - self.min_tx_time = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.max_tx_time = struct.unpack('i', bytearray( @@ -148,6 +149,7 @@ self.tx_params_timestamp = timestamp + @publish(["msg_id_td_saline_bolus_data", "tgt_saline_volume","cum_saline_volume","bol_saline_volume", "saline_bolus_state","saline_bolus_timestamp"]) def _handler_saline_bolus_sync(self, message, timestamp=0.0): @@ -157,7 +159,6 @@ @param message: published saline bolus data message @return: none """ - self.tgt_saline_volume = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.cum_saline_volume = struct.unpack('f', bytearray( @@ -169,6 +170,7 @@ self.saline_bolus_timestamp = timestamp + @publish(["msg_id_td_uf_data", "set_uf_volume","tgt_uf_rate","uf_volume_delivered", "uf_state","uf_timestamp"]) def _handler_uf_sync(self, message, timestamp=0.0): @@ -178,7 +180,6 @@ @param message: published ultrafiltration data message @return: none """ - self.set_uf_volume = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.tgt_uf_rate = struct.unpack('f', bytearray( @@ -190,6 +191,7 @@ self.uf_timestamp = timestamp + @publish(["msg_id_td_treatment_time_data", "tx_time_prescribed","tx_time_elapsed","tx_time_remaining", "tx_time_timestamp"]) def _handler_treatment_time_sync(self, message, timestamp=0.0): @@ -199,7 +201,6 @@ @param message: published treatment time data message @return: none """ - self.tx_time_prescribed = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.tx_time_elapsed = struct.unpack('i', bytearray( @@ -209,6 +210,7 @@ self.tx_time_timestamp = timestamp + @publish(["msg_id_td_treatment_state_data", "tx_sub_mode","blood_prime_state","dialysis_state","isolated_uf_state", "tx_stop_state","rinseback_state","tx_recirc_state","tx_end_state","tx_state_timestamp"]) def _handler_treatment_state_sync(self, message, timestamp=0.0): @@ -218,7 +220,6 @@ @param message: published treatment state data message @return: none """ - self.tx_sub_mode = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.blood_prime_state = struct.unpack('i', bytearray( @@ -238,6 +239,7 @@ self.tx_state_timestamp = timestamp + @publish(["msg_id_td_rsp_current_treatment_parameters", "blood_flow_rate", "dialysate_flow_rate", "tx_duration", "saline_bolus_volume", "hep_stop_time", "hep_time", "acid_con", "bicarb_con", "dialyzer_type", "bp_interval", "rb_flow_rate", "rb_volume", @@ -250,7 +252,6 @@ @param message: published treatment parameter response data message @return: none """ - self.blood_flow_rate = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] self.dialysate_flow_rate = struct.unpack('i', bytearray( @@ -294,6 +295,7 @@ self.tx_param_req_timestamp = timestamp + def cmd_set_treatment_parameter(self, tx_param_id: int = 0, tx_param_value = 0 ): """ Constructs and sends set treatment parameter command to the TD. @@ -305,8 +307,6 @@ @return: 1 if successful, zero otherwise """ - idx = integer_to_bytearray(tx_param_id) - if tx_param_id <= TDTreatmentParameters.TREATMENT_PARAM_RINSEBACK_VOLUME.value: tpv = integer_to_bytearray(tx_param_value) @@ -316,19 +316,16 @@ else: tpv = integer_to_bytearray(tx_param_value) + idx = integer_to_bytearray(tx_param_id) payload = idx + tpv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_SET_TREATMENT_PARAMETER.value, - payload=payload) - - # 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 \ No newline at end of file + param_name = TDTreatmentParameters(tx_param_id).name + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_SET_TREATMENT_PARAMETER, + entity_name = f'TD {param_name}', + override_text = str(tx_param_value), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/modules/valves.py =================================================================== diff -u -r175101bed0d998f3e0c6ff24d90603acb0106e4d -r1813f6556e8a726a6e300caffe0bcafc40010aa9 --- leahi_dialin/td/modules/valves.py (.../valves.py) (revision 175101bed0d998f3e0c6ff24d90603acb0106e4d) +++ leahi_dialin/td/modules/valves.py (.../valves.py) (revision 1813f6556e8a726a6e300caffe0bcafc40010aa9) @@ -7,30 +7,27 @@ # # @file valves.py # -# @author (last) James Walter Taylor -# @date (last) 03-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 08-Jan-2026 # @author (original) Dara Navaei # @date (original) 19-Aug-2020 # ############################################################################ - import struct -from enum import unique from logging import Logger -from .constants import NO_RESET -from leahi_dialin.common import MsgIds +from leahi_dialin.common.constants import NO_RESET +from leahi_dialin.common.msg_defs import MsgIds +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.common.td_defs import TDValvesEnum, TDValvesPositions, TDValvesStates from leahi_dialin.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, short_to_bytearray +from leahi_dialin.utils.base import AbstractSubSystem, publish +from leahi_dialin.utils.conversions import integer_to_bytearray class TDValves(AbstractSubSystem): """ - Treatment Delivery (TD) Dialin API sub-class for valves related commands. """ # Valves states publish message field positions @@ -83,6 +80,7 @@ self.valves_status = {TDValvesEnum.H1_VALV.name: {}, TDValvesEnum.H19_VALV.name: {}} + @publish(["msg_id_td_valves_data", "valves_status", "td_valves_timestamp"]) def _handler_valves_sync(self, message: dict, timestamp=0.0) -> None: """ @@ -119,6 +117,7 @@ 'PosB': pos_b, 'PosC': pos_c, 'PosD': pos_d, 'Max_homing_enc': max_homing_enc} self.td_valves_timestamp = timestamp + def cmd_valves_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval @@ -130,29 +129,16 @@ @param reset: integer - 1 to reset a previous override, 0 to override @returns 1 if successful, zero otherwise """ - if not check_broadcast_interval_override_ms(ms): - return False + return cmd_generic_broadcast_interval_override( + ms = ms, + reset = reset, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_VALVES_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'TD Valves', + logger = self.logger, + can_interface = self.can_interface) - reset_value = integer_to_bytearray(reset) - interval_value = integer_to_bytearray(ms) - payload = reset_value + interval_value - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_VALVES_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("Sending {} ms publish interval to the HD valves module".format(ms)) - # Send message - received_message = self.can_interface.send(message) - - # If there is content in message - if received_message is not None: - # Response payload is OK or not - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - def cmd_set_valve_position(self, valve: int, position: int) -> int: """ Constructs and sends the TD valves set position for a valve @@ -166,19 +152,17 @@ pos = integer_to_bytearray(position) payload = vlv + pos - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_PINCH_VALVE_SET_POSITION_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + valve_name = TDValvesEnum(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_PINCH_VALVE_SET_POSITION_REQUEST, + entity_name = f'TD {valve_name} Valve position', + override_text = str(position), + logger = self.logger, + can_interface = self.can_interface) - # If there is content... - if received_message is not None: - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("TD cmd_valve_override Timeout!!!") - return False def cmd_home_valve(self, valve: int, force_home: int, cartridge: int) -> int: """ @@ -193,20 +177,19 @@ frc = integer_to_bytearray(force_home) cart = integer_to_bytearray(cartridge) payload = vlv + frc + cart - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_PINCH_VALVE_HOME_REQUEST.value, - payload=payload) - # 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("TD Homing Valve Timeout!!!") - return False + valve_name = TDValvesEnum(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_PINCH_VALVE_SET_POSITION_REQUEST, + entity_name = f'TD {valve_name} Valve homing', + override_text = 'Forcefully' if force_home == 1 else 'Normally', + logger = self.logger, + can_interface = self.can_interface) + def cmd_valve_encoder_position_override(self, valve: int, position_count: int, reset: int = NO_RESET) -> int: """ Constructs and sends the TD valves set position for a valve @@ -221,23 +204,18 @@ pos = integer_to_bytearray(position_count) payload = reset_value + pos + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + valve_name = TDValvesEnum(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST, + entity_name = f'TD {valve_name} Valve position', + override_text = f'move by {str(position_count)}', + logger = self.logger, + can_interface = self.can_interface) - # If there is content... - if received_message is not None: - self.logger.debug("Setting {} position to {} ".format(str(TDValvesEnum(valve).name), position_count)) - - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("TD valve position override Timeout!!!") - return False - def cmd_valve_status_override(self, valve: int, status: int, reset: int = NO_RESET) -> int: """ Constructs and sends the TD valves set position for a valve @@ -252,23 +230,18 @@ sts = integer_to_bytearray(status) payload = reset_value + sts + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_STATUS_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) + valve_name = TDValvesEnum(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_STATUS_OVERRIDE_REQUEST, + entity_name = f'TD {valve_name} Valve status', + override_text = str(status), + logger = self.logger, + can_interface = self.can_interface) - # If there is content... - if received_message is not None: - self.logger.debug("Setting {} status to {} ".format(str(TDValvesEnum(valve).name), status)) - - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("TD valve status override Timeout!!!") - return False - def cmd_valve_modify_encoder_position_by_offset(self, valve: int, counts: int) -> int: """ Constructs and sends a given valve to change position by a @@ -282,20 +255,13 @@ pos = integer_to_bytearray(counts) payload = pos + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST.value, - payload=payload) - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - - self.logger.debug("Setting {} position by {} ".format(str(TDValvesEnum(valve).name), counts)) - - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("TD valve position override Timeout!!!") - return False - + valve_name = TDValvesEnum(valve).name.split('_')[0] + return cmd_generic_override( + payload = payload, + reset = NO_RESET, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_ROTARY_PINCH_VALVE_POSITION_OVERRIDE_REQUEST, + entity_name = f'TD {valve_name} Valve encoder position offset', + override_text = str(counts), + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/modules/voltages.py =================================================================== diff -u -rec8a2600b9e8cf6fe7e02c200a1c24221ca86863 -r1813f6556e8a726a6e300caffe0bcafc40010aa9 --- leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision ec8a2600b9e8cf6fe7e02c200a1c24221ca86863) +++ leahi_dialin/td/modules/voltages.py (.../voltages.py) (revision 1813f6556e8a726a6e300caffe0bcafc40010aa9) @@ -7,23 +7,23 @@ # # @file voltages.py # -# @author (last) Michael Garthwaite -# @date (last) 03-Mar-2023 +# @author (last) Zoltan Miskolci +# @date (last) 08-Jan-2026 # @author (original) Sean Nash # @date (original) 15-Apr-2021 # ############################################################################ + import struct -from enum import unique from logging import Logger -from .constants import RESET, NO_RESET -from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels -from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum -from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray -from leahi_dialin.utils.checks import check_broadcast_interval_override_ms +from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_broadcast_interval_override, cmd_generic_override from leahi_dialin.common.td_defs import TDMonitoredVoltages +from leahi_dialin.protocols.CAN import DenaliChannels +from leahi_dialin.utils.base import AbstractSubSystem, publish +from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray class TDVoltages(AbstractSubSystem): @@ -58,7 +58,6 @@ @param message: published monitored voltages data message @return: none """ - v12 = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1])) v33 = struct.unpack('f', bytearray( @@ -95,85 +94,53 @@ self.monitored_voltages[TDMonitoredVoltages.MONITORED_LINE_FPGA_PVN_V.value] = vfp[0] self.td_voltages_timestamp = timestamp - def cmd_monitored_voltage_override(self, signal: int = 0, volts: float = 0.0, reset: int = NO_RESET) -> int: + + def cmd_monitored_voltages_broadcast_interval_override(self, ms: int = 1000, reset: int = NO_RESET) -> int: """ - Constructs and sends the TD monitored voltage override command + Constructs and sends the monitored TD voltages broadcast interval override command Constraints: Must be logged into TD. - Given signal must be valid member of TDMonitoredVoltages enum + Given interval must be non-zero and a multiple of the TD general task interval (50 ms). - @param signal: integer - ID of signal to override - @param volts: float - value (in volts) to override signal with + @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_VOLTAGE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + module_name = 'TD Voltages', + logger = self.logger, + can_interface = self.can_interface) - rst = integer_to_bytearray(reset) - vlt = float_to_bytearray(volts) - idx = integer_to_bytearray(signal) - payload = rst + vlt + idx - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_VOLTAGE_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override monitored TD voltage for signal " + str(signal)) - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal. " - else: - str_res = str(volts) + " V. " - self.logger.debug("Monitored TD voltage overridden to " + str_res + - str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False - - def cmd_monitored_voltages_broadcast_interval_override(self, ms: int = 1000, reset: int = NO_RESET) -> int: + def cmd_monitored_voltage_override(self, signal: int = 0, volts: float = 0.0, reset: int = NO_RESET) -> int: """ - Constructs and sends the monitored TD voltages broadcast interval override command + Constructs and sends the TD monitored voltage 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). + Given signal must be valid member of TDMonitoredVoltages enum - @param ms: integer - interval (in ms) to override with + @param signal: integer - ID of signal to override + @param volts: float - value (in volts) to override signal with @param reset: integer - 1 to reset a previous override, 0 to override @return: 1 if successful, zero otherwise """ - if not check_broadcast_interval_override_ms(ms): - return False - rst = integer_to_bytearray(reset) - mis = integer_to_bytearray(ms) - payload = rst + mis + vlt = float_to_bytearray(volts) + idx = integer_to_bytearray(signal) + payload = rst + vlt + idx - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_td_ch_id, - message_id=MsgIds.MSG_ID_TD_VOLTAGE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, - payload=payload) - - self.logger.debug("override monitored TD voltages broadcast interval") - - # Send message - received_message = self.can_interface.send(message) - - # If there is content... - if received_message is not None: - if reset == RESET: - str_res = "reset back to normal: " - else: - str_res = str(ms) + " ms: " - self.logger.debug("TD monitored voltages broadcast interval overridden to " + str_res + - str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) - # response payload is OK or not OK - return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] - else: - self.logger.debug("Timeout!!!!") - return False + sensor_name = TDMonitoredVoltages(signal).name + return cmd_generic_override( + payload = payload, + reset = reset, + channel_id = DenaliChannels.dialin_to_td_ch_id, + msg_id = MsgIds.MSG_ID_TD_VOLTAGE_OVERRIDE_REQUEST, + entity_name = f'TD {sensor_name} voltage', + override_text = f'{str(volts)} V', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/proxies/dd_proxy.py =================================================================== diff -u -r2dab2b0329a56006e07cd36a3883ed099d7a367a -r1813f6556e8a726a6e300caffe0bcafc40010aa9 --- leahi_dialin/td/proxies/dd_proxy.py (.../dd_proxy.py) (revision 2dab2b0329a56006e07cd36a3883ed099d7a367a) +++ leahi_dialin/td/proxies/dd_proxy.py (.../dd_proxy.py) (revision 1813f6556e8a726a6e300caffe0bcafc40010aa9) @@ -7,18 +7,17 @@ # # @file buttons.py # -# @author (last) Micahel Garthwaite -# @date (last) 18-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 08-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ + from logging import Logger -from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels -from leahi_dialin.utils.base import AbstractSubSystem, publish -from leahi_dialin.utils.conversions import integer_to_bytearray, byte_to_bytearray, float_to_bytearray +from leahi_dialin.protocols.CAN import DenaliCanMessenger +from leahi_dialin.utils.base import AbstractSubSystem class DDProxy(AbstractSubSystem): @@ -32,7 +31,6 @@ @param can_interface: the Denali CAN interface object """ - super().__init__() self.can_interface = can_interface self.logger = logger Index: leahi_dialin/td/proxies/ui_proxy.py =================================================================== diff -u -rcfdfc19e474ebf53bc80809a9e6fc19171d6ada1 -r1813f6556e8a726a6e300caffe0bcafc40010aa9 --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision cfdfc19e474ebf53bc80809a9e6fc19171d6ada1) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 1813f6556e8a726a6e300caffe0bcafc40010aa9) @@ -7,19 +7,20 @@ # # @file ui_proxy.py # -# @author (last) Micahel Garthwaite -# @date (last) 18-Aug-2023 +# @author (last) Zoltan Miskolci +# @date (last) 08-Jan-2026 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ + import struct from logging import Logger -from leahi_dialin.td.modules.constants import ACCEPTED, REJECTED +from leahi_dialin.td.modules.constants import ACCEPTED from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions, RequestRejectReasons from leahi_dialin.protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels -from leahi_dialin.utils.base import AbstractSubSystem, publish +from leahi_dialin.utils.base import AbstractSubSystem from leahi_dialin.utils.conversions import integer_to_bytearray, unsigned_byte_to_bytearray, float_to_bytearray, \ short_to_bytearray @@ -98,6 +99,7 @@ self.uf_pause_resume_rr = 0 self.uf_pause_resume_timestamp = 0 + def _handler_tx_parameters_val_resp_sync(self, message: dict, timestamp=0.0) -> None: """ Handles treatment parameters validation response from the TD. Treatment parameters acceptance and rejection @@ -141,6 +143,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_16:MsgFieldPositions.END_POS_FIELD_16]))[0] self.tx_params_validate_timestamp = timestamp + def _handler_uf_val_resp_sync(self, message: dict, timestamp=0.0) -> None: """ Handles ultrafiltration volume validation response from the TD. Ultrafiltration volume acceptance and @@ -158,6 +161,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] self.uf_volume_timestamp = timestamp + def _handler_initiate_treatment_resp_sync(self, message: dict, timestamp=0.0) -> None: """ Handles inititate treatment response from the TD. Treatment acceptance and rejection @@ -173,6 +177,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] self.initiate_tx_timestamp = timestamp + def _handler_uf_pause_resp_sync(self, message: dict, timestamp=0.0) -> None: """ Handles ultrafiltration pause response from the TD. Ultrafiltration pause acceptance and rejection @@ -188,6 +193,7 @@ message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] self.uf_pause_resume_timestamp = timestamp + def cmd_send_ui_treatment_param_data(self, blood_flow_rate: int, dialysate_flow_rate: int, treatment_duration: int, @@ -233,7 +239,6 @@ :return: None """ - bld = integer_to_bytearray(blood_flow_rate) dia = integer_to_bytearray(dialysate_flow_rate) dur = integer_to_bytearray(treatment_duration) @@ -304,6 +309,7 @@ self.logger.debug("Sending UI Initiate Treatment Workflow.") self.can_interface.send(message, 0) + def cmd_send_ui_confirmed_treatment_parameters (self, accepted: int = ACCEPTED ) -> None: """ Constructs and sends a UI confirmation of treatment parameters message. @@ -322,6 +328,7 @@ self.logger.debug("Sending UI Confirm Treatment Parameters.") self.can_interface.send(message, 0) + def cmd_send_ui_pause_resume_uf(self, accepted:int = ACCEPTED, rejection_reason:int = RequestRejectReasons.REQUEST_REJECT_REASON_NONE.value ) -> None: """ Constructs and sends a UI pause/resume ultrafiltration message. @@ -342,6 +349,7 @@ self.logger.debug("Sending UI Pause Resume UF request.") self.can_interface.send(message, 0) + def cmd_send_ui_validate_uf_volume (self, uf_volume: float = 0.0 ) -> None: """ Constructs and sends a UI validate ultrafiltration message. @@ -358,4 +366,4 @@ payload=payload) self.logger.debug("Sending UI Ultrafiltration volume to validate.") - self.can_interface.send(message, 0) \ No newline at end of file + self.can_interface.send(message, 0)