Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -r95205b22fbcf8ce097fd7dba0a34156e5f9008a5 -r02dbda406f0e7c06773e3ac24765d3ee93b4ec35 --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 95205b22fbcf8ce097fd7dba0a34156e5f9008a5) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 02dbda406f0e7c06773e3ac24765d3ee93b4ec35) @@ -206,7 +206,7 @@ MSG_ID_FFU_SIGNAL_DD_UPDATE_AVAILABLE = 0xB4 # FFU signal DD update is available. MSG_ID_TD_UI_GENERIC_CONFIRMATION_REQUEST = 0xB5 # TD request for generic UI confirmation. MSG_ID_UI_GENERIC_CONFIRMATION_RESULT_RESPONSE = 0xB6 # UI generic confirmation result to TD. - MSG_ID_AVAILABLE_B7 = 0xB7 # Msg ID not used - available for use. + MSG_ID_TD_PRE_TREATMENT_STATES_DATA = 0xB7 # Msg ID not used - available for use. MSG_ID_UI_VITALS_ADJUSTMENT_REQUEST = 0xB8 # UI vitals adjustment request MSG_ID_TD_VITALS_ADJUSTMENT_RESPONSE = 0xB9 # TD vitals adjustment response MSG_ID_UI_ISO_UF_STATE_REQUEST = 0xBA Index: leahi_dialin/dd/modules/valves.py =================================================================== diff -u -r38da5065a6cbe169b433d7430bb5a3739517db0e -r02dbda406f0e7c06773e3ac24765d3ee93b4ec35 --- leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 38da5065a6cbe169b433d7430bb5a3739517db0e) +++ leahi_dialin/dd/modules/valves.py (.../valves.py) (revision 02dbda406f0e7c06773e3ac24765d3ee93b4ec35) @@ -104,7 +104,7 @@ The Valves data """ return {dd_enum_repository.DDValveNames.D14_VALV.name: self.d14_valv['state'], - dd_enum_repository.DDValveNames.D52_VALV.name: self.spare5_valv['state'], + dd_enum_repository.DDValveNames.D52_VALV.name: self.d52_valv['state'], dd_enum_repository.DDValveNames.D8_VALV.name: self.d8_valv['state'], dd_enum_repository.DDValveNames.D54_VALV.name: self.d54_valv['state'], dd_enum_repository.DDValveNames.D53_VALV.name: self.d53_valv['state'], Index: leahi_dialin/td/modules/pre_treatment.py =================================================================== diff -u --- leahi_dialin/td/modules/pre_treatment.py (revision 0) +++ leahi_dialin/td/modules/pre_treatment.py (revision 02dbda406f0e7c06773e3ac24765d3ee93b4ec35) @@ -0,0 +1,102 @@ +########################################################################### +# +# 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 ============================================================ Index: leahi_dialin/td/modules/treatment.py =================================================================== diff -u -r489ce5ef49041b863501b7fecd6e4716e7dcaa9f -r02dbda406f0e7c06773e3ac24765d3ee93b4ec35 --- leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 489ce5ef49041b863501b7fecd6e4716e7dcaa9f) +++ leahi_dialin/td/modules/treatment.py (.../treatment.py) (revision 02dbda406f0e7c06773e3ac24765d3ee93b4ec35) @@ -108,13 +108,13 @@ self.tx_state_timestamp = 0 #: The timestamp of the latest Treatment State message self.treatment_states = { 'tx_sub_mode': 0, # The Treatment Operation Sub-Mode - 'blood_prime_state': 0, # The Blood Prime Operation Sub-Mode - 'dialysis_state': 0, # The Dialysis Operation Sub-Mode - 'isolated_uf_state': 0, # The Isolated Ultrafiltration Operation Sub-Mode - 'tx_stop_state': 0, # The Treatment Stop Operation Sub-Mode - 'rinseback_state': 0, # The Rinsback Operation Sub-Mode - 'tx_recirc_state': 0, # The Recirculation Operation Sub-Mode - 'tx_end_state': 0 # The Treatment End Operation Sub-Mode + 'blood_prime_state': 0, # The Blood Prime Operation State + 'dialysis_state': 0, # The Dialysis Operation State + 'isolated_uf_state': 0, # The Isolated Ultrafiltration Operation State + 'tx_stop_state': 0, # The Treatment Stop Operation State + 'rinseback_state': 0, # The Rinsback Operation State + 'tx_recirc_state': 0, # The Recirculation Operation State + 'tx_end_state': 0 # The Treatment End Operation State } # Treatment Parameters Data. Most recent response. @@ -219,8 +219,7 @@ # ============================================================ Handlers ============================================================ - @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"]) + @publish([MsgIds.MSG_ID_TD_TREATMENT_PARAM_RANGES.name.lower(), "treatment_param_ranges", "tx_params_timestamp"]) def _handler_treatment_param_ranges_sync(self, message, timestamp=0.0): """ Handles published treatment parameter range data messages. @@ -240,8 +239,7 @@ self.tx_params_timestamp = timestamp - @publish(["MSG_ID_TD_FLUID_BOLUS_DATA", "tgt_saline_volume","cum_saline_volume","bol_saline_volume", - "saline_bolus_state","saline_bolus_timestamp"]) + @publish([MsgIds.MSG_ID_TD_FLUID_BOLUS_DATA.name.lower(), "saline_bolus", "saline_bolus_timestamp"]) def _handler_saline_bolus_sync(self, message, timestamp=0.0): """ Handles published saline bolus data messages. @@ -259,8 +257,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"]) + @publish([MsgIds.MSG_ID_TD_ULTRAFILTRATION_DATA.name.lower(), "ultrafiltration", "uf_timestamp"]) def _handler_uf_sync(self, message, timestamp=0.0): """ Handles published ultrafiltration data messages. @@ -278,8 +275,7 @@ self.uf_timestamp = timestamp - @publish(["msg_id_td_treatment_time_data", "tx_time_prescribed","tx_time_elapsed","tx_time_remaining", - "tx_time_timestamp"]) + @publish([MsgIds.MSG_ID_TD_TREATMENT_TIME_DATA.name.lower(), "treatment_times", "tx_time_timestamp"]) def _handler_treatment_time_sync(self, message, timestamp=0.0): """ Handles published treatment time data messages. @@ -296,8 +292,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"]) + @publish([MsgIds.MSG_ID_TD_TREATMENT_STATE_DATA.name.lower(), "treatment_states", "tx_state_timestamp"]) def _handler_treatment_state_sync(self, message, timestamp=0.0): """ Handles published treatment state data messages. @@ -319,11 +314,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", - "art_pressure_window","venous_pressure_window","venous_asymm_window","tmp_limit_window", - "dialysate_temp", "hep_dispense_rate", "hep_bolus_vol", "uf_vol","tx_param_req_timestamp"]) + @publish([MsgIds.MSG_ID_TD_RSP_CURRENT_TREATMENT_PARAMETERS.name.lower(), "treatment_paramters", "tx_param_req_timestamp"]) def _handler_resp_treatment_parameters_sync(self, message, timestamp=0.0): """ Handles published treatment parameter response data messages.