Index: leahi_dialin/common/msg_ids.py =================================================================== diff -u -rd333df6a3a1191f4107fbe1832e82665d923aa8b -r3e8c15745640db0568536912a36704a567bd73c2 --- leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision d333df6a3a1191f4107fbe1832e82665d923aa8b) +++ leahi_dialin/common/msg_ids.py (.../msg_ids.py) (revision 3e8c15745640db0568536912a36704a567bd73c2) @@ -119,8 +119,8 @@ MSG_ID_TD_SOLUTION_INFUSION_RESPONSE = 0x60 MSG_ID_DD_BLOOD_LEAK_DATA = 0x61 MSG_ID_DD_FP_INLET_PRESSURE_CHECK_DATA = 0x62 - MSG_ID_UI_BLOOD_PRESSURE_REQUEST = 0x63 - MSG_ID_TD_BLOOD_PRESSURE_RESPONSE = 0x64 + MSG_ID_UI_BLOOD_PRESSURE_REQUEST = 0x63 + MSG_ID_TD_BLOOD_PRESSURE_RESPONSE = 0x64 MSG_ID_TD_BLOOD_PRESSURE_DATA = 0x65 MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE_REQUEST = 0x66 MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE = 0x67 Index: leahi_dialin/td/modules/blood_pressure.py =================================================================== diff -u --- leahi_dialin/td/modules/blood_pressure.py (revision 0) +++ leahi_dialin/td/modules/blood_pressure.py (revision 3e8c15745640db0568536912a36704a567bd73c2) @@ -0,0 +1,102 @@ +########################################################################### +# +# Copyright (c) 2021-2024 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 blood_pressure.py +# +# @author (last) Zoltan Miskolci +# @date (last) 06-Jul-2026 +# @author (original) Zoltan Miskolci +# @date (original) 06-Jul-2026 +# +############################################################################ + +# Module imports +from logging import Logger + +# Project imports +from leahi_dialin.common.generic_defs import DataTypes +from leahi_dialin.common.msg_defs import MsgIds +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.td.proxies.ui_proxy import UIProxy + + +class TDBloodPressure(AbstractSubSystem): + """ + @brief Treatment Device (TD) Dialin API sub-class for TD patient vitals related commands. + """ + + def __init__(self, can_interface: CanMessenger, logger: Logger): + """ + TDBloodPressure 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_BLOOD_PRESSURE_DATA.value, + function = self._handler_bp_sync) + self.can_interface.register_receiving_publication_function(channel_id = CanChannels.td_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_TD_BLOOD_PRESSURE_RESPONSE.value, + function = self._handler_bp_rr_sync) + + self.blood_pressure_timestamp = 0.0 #: The timestamp of the latest message + self.rr_timestamp = 0.0 #: The timestamp of the latest reject reason message + + self.ack = 0 #: The Measure blood pressure requests acknowledgement response + self.reject_reason = 0 #: The Measure blood pressure requests reject reason + self.systolic = 0 #: The Patient's systolic blood pressure in mmHg + self.diastolic = 0 #: The Patient's diastolic blood pressure in mmHg + self.heart_rate = 0 #: The Patient's heart rate in PBM + + + @publish(["msg_id_td_blood_pressure_data", "systolic", "diastolic", "heart_rate", "blood_pressure_timestamp"]) + def _handler_bp_sync(self, message, timestamp=0.0): + """ + Handles published TD Blood Pressure data messages. Blood Pressure data are captured for reference. + + @param message: published data message + @return: none + """ + msg_list =[] + msg_list.append(('self.systolic', DataTypes.U32)) + msg_list.append(('self.diastolic', DataTypes.U32)) + msg_list.append(('self.heart_rate', DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, + message = message) + self.blood_pressure_timestamp = timestamp + + + @publish(["msg_id_td_blood_pressure_response", "ack", "reject_reason", "rr_timestamp"]) + def _handler_bp_rr_sync(self, message, timestamp=0.0): + """ + Handles published TD Blood Pressure Reject Reason data messages. Blood Pressure Reject Reason data are captured for reference. + + @param message: published data message + @return: none + """ + msg_list =[] + msg_list.append(('self.ack', DataTypes.U32)) + msg_list.append(('self.reject_reason', DataTypes.U32)) + + self.process_into_vars(decoder_list = msg_list, + message = message) + self.rr_timestamp = timestamp + + + def cmd_send_ui_blood_pressure_request(self) -> None: + """ + Constructs and sends a UI request to measure blood pressure. + + :return: none + """ + return UIProxy(can_interface = self.can_interface, logger = self.logger).cmd_send_ui_blood_pressure_request() Index: leahi_dialin/td/proxies/ui_proxy.py =================================================================== diff -u -r1f2bf6d939eb4033dbedb7d7005494cc12fccbc6 -r3e8c15745640db0568536912a36704a567bd73c2 --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 1f2bf6d939eb4033dbedb7d7005494cc12fccbc6) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 3e8c15745640db0568536912a36704a567bd73c2) @@ -431,3 +431,19 @@ override_text = 'N/A', logger = self.logger, can_interface = self.can_interface) + + + def cmd_send_ui_blood_pressure_request(self) -> None: + """ + Constructs and sends a UI request to measure blood pressure. + + :return: none + """ + cmd_generic_override(payload = None, + reset = None, + channel_id = CanChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_BLOOD_PRESSURE_REQUEST, + entity_name = 'UI Blood Pressure Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/treatment_delivery.py =================================================================== diff -u -r88eea899fa8d03596f944505285bf3049e64312b -r3e8c15745640db0568536912a36704a567bd73c2 --- leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 88eea899fa8d03596f944505285bf3049e64312b) +++ leahi_dialin/td/treatment_delivery.py (.../treatment_delivery.py) (revision 3e8c15745640db0568536912a36704a567bd73c2) @@ -23,6 +23,7 @@ from .modules.air_trap import TDAirTrap from .modules.alarms import TDAlarms 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.ejector import TDEjector @@ -129,6 +130,7 @@ 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.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.ejector = TDEjector(self.can_interface, self.logger) #: The Ejector module