########################################################################### # # Copyright (c) 2020-2025 Diality Inc. - All Rights Reserved. # # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file pre_treatment.py # # @author (last) Zoltan Miskolci # @date (last) 21-Aug-2026 # @author (original) Zoltan Miskolci # @date (original) 21-Aug-2026 # ############################################################################ # Module imports from logging import Logger # Project imports from leahi_dialin.common.constants import NO_RESET from leahi_dialin.common.generic_defs import DataTypes from leahi_dialin.common.msg_ids import MsgIds from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.common import td_enum_repository from leahi_dialin.protocols.CAN import CanMessenger, CanChannels from leahi_dialin.utils.abstract_classes import AbstractSubSystem from leahi_dialin.utils.base import publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray class TDPreTreatment(AbstractSubSystem): """ Pre-Treatment Delivery (TD) Dialin API sub-class for treatment related commands. """ def __init__(self, can_interface: CanMessenger, logger: Logger): """ Constructor """ super().__init__() self.can_interface = can_interface 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, message_id = MsgIds.MSG_ID_TD_PRE_TREATMENT_STATES_DATA.value, function = self._handler_pre_treatment_state_sync) # Treatment State Data self.pre_tx_state_timestamp = 0 #: The timestamp of the latest Treatment State message self.pre_treatment_states = { 'sub_mode': 0, # The Pre-Treatment Operation Sub-Mode 'install_state': 0, # The Auto Load Operation State 'dry_self_test_state': 0, # The Dry Self Test Operation State 'prime_state': 0, # The Prime Operation State 'recirculate_state': 0, # The Recirculate Operation State 'confirm_rx_state': 0, # The Confirm Treatment Parameters Operation State 'heparin_state': 0, # The Heparin Operation State 'patient_connect_state': 0 # The Patient Connect Operation State } # ============================================================ Properties ============================================================ @property def pre_treatment_states(self) -> int: """ The Pre-Treatment states """ return self._pre_treatment_states @pre_treatment_states.setter def pre_treatment_states(self, value): self._pre_treatment_states = value # ============================================================ Handlers ============================================================ @publish([MsgIds.MSG_ID_TD_PRE_TREATMENT_STATES_DATA.name.lower(), "pre_treatment_states", "pre_tx_state_timestamp"]) def _handler_pre_treatment_state_sync(self, message, timestamp=0.0): """ Handles published treatment state data messages. @param message: published treatment state data message @return: none """ msg_list = [] msg_list.append((self.treatment_states, 'sub_mode', DataTypes.U32)) msg_list.append((self.treatment_states, 'install_state', DataTypes.U32)) msg_list.append((self.treatment_states, 'dry_self_test_state', DataTypes.U32)) msg_list.append((self.treatment_states, 'prime_state', DataTypes.U32)) msg_list.append((self.treatment_states, 'recirculate_state', DataTypes.U32)) msg_list.append((self.treatment_states, 'confirm_rx_state', DataTypes.U32)) msg_list.append((self.treatment_states, 'heparin_state', DataTypes.U32)) msg_list.append((self.treatment_states, 'patient_connect_state', DataTypes.U32)) self.process_into_vars(decoder_list = msg_list, message = message) self.tx_state_timestamp = timestamp # ============================================================ Overrides and Requests ============================================================