Index: dialin/common/msg_defs.py =================================================================== diff -u -r96006d22aa13f0287e2697a7cac7604201633263 -r84bc297f6f9b0c6594b73ac1045ad64f8f6e347d --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 96006d22aa13f0287e2697a7cac7604201633263) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 84bc297f6f9b0c6594b73ac1045ad64f8f6e347d) @@ -78,8 +78,8 @@ MSG_ID_HD_START_TREATMENT_RESPONSE = 0x39 # HD response to user request to initiate a treatment MSG_ID_HD_VALVES_DATA = 0x3A # HD broadcast of valves data MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3B # UI user confirmation of treatment parameters - MSG_ID_UI_TREATMENT_END_REQUEST = 0x3C # UI user treatment end request - MSG_ID_HD_TREATMENT_END_RESPONSE = 0x3D # HD response to user request to end treatment + MSG_ID_UI_START_PRIME_REQUEST = 0x3C # UI user has requested to start priming + MSG_ID_HD_START_PRIME_RESPONSE = 0x3D # HD response to user request to start priming MSG_ID_HD_AIR_TRAP_DATA = 0x003E # HD broadcast of air trap data MSG_ID_ALARM_CONDITION_CLEARED = 0x3F # Broadcast that the alarm condition has been cleared MSG_ID_UI_ALARM_USER_ACTION = 0x40 # UI user has requested an alarm action @@ -106,6 +106,18 @@ MSG_ID_HD_BLOOD_PRIME_PROGRESS = 0x59 # HD broadcast of blood prime progress MSG_ID_UI_TX_END_CMD = 0x57 # UI end treatment sub-mode user request MSG_ID_HD_TX_END_CMD_RESPONSE = 0x58 # HD end treatment sub-mode user request response + MSG_ID_PRE_TREATMENT_STATE = 0x5C # HD broadcast of pre-treatment state + MSG_ID_UI_SAMPLE_WATER_CMD = 0x5D # UI sample water sub-mode user request + MSG_ID_HD_SAMPLE_WATER_CMD_RESPONSE = 0x5E # HD sample water sub-mode request response + MSG_ID_UI_SAMPLE_WATER_RESULT = 0x5F # UI sample water result message + MSG_ID_DG_FILTER_FLUSH_PROGRESS = 0x60 # DG broadcast of filter flush progress + MSG_ID_HD_NO_CART_SELF_TEST_PROGRESS = 0x61 # HD broadcast of no cartridge self-tests progress + MSG_ID_UI_INSTALLATION_CONFIRM = 0x62 # UI disposable installation user confirmation + MSG_ID_HD_DRY_SELF_TEST_PROGRESS = 0x63 # HD broadcast of dry self-tests progress + MSG_ID_UI_CONTINUE_TO_TREATMENT_REQUEST = 0x64 # UI user has requested to continue to treatment + MSG_ID_HD_CONTINUE_TO_TREATMENT_RESPONSE = 0x65 # HD response to user request to continue to treatment + MSG_ID_UI_PATIENT_CONNECTION_CONFIRM = 0x66 # UI user has confirmed patient connection completed + MSG_ID_HD_PATIENT_CONNECTION_CONFIRM_RESPONSE = 0x67 # HD response to user confirmation of patient connection MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing Index: dialin/hd/pretreatment.py =================================================================== diff -u --- dialin/hd/pretreatment.py (revision 0) +++ dialin/hd/pretreatment.py (revision 84bc297f6f9b0c6594b73ac1045ad64f8f6e347d) @@ -0,0 +1,156 @@ +########################################################################### +# +# Copyright (c) 2019-2021 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 pretreatment.py +# +# @author (last) Quang Nguyen +# @date (last) 28-Feb-2021 +# @author (original) Quang Nguyen +# @date (original) 28-Feb-2021 +# +############################################################################ +import struct +from ..protocols.CAN import (DenaliMessage, + DenaliChannels) +from ..utils.base import _AbstractSubSystem, _publish +from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..common.msg_defs import MsgIds, MsgFieldPositions +from logging import Logger + +class HDPreTreatment(_AbstractSubSystem): + """ + + Hemodialysis Delivery (HD) Dialin API sub-class for pretreatment related commands. + + """ + + + def __init__(self, can_interface, logger: Logger): + """ + HDPreTreatment constructor + """ + + super().__init__() + self.can_interface = can_interface + self.logger = logger + + if self.can_interface is not None: + channel_id = DenaliChannels.hd_sync_broadcast_ch_id + + msg_id = MsgIds.MSG_ID_PRE_TREATMENT_STATE.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, + self._handler_pre_treatment_state_sync) + + self.pre_treatment_submode = 0 + self.pre_treatment_sample_water_state = 0 + self.pre_treatment_no_cart_self_test_state = 0 + self.pre_treatment_installation_state = 0 + self.pre_treatment_dry_self_test_state = 0 + self.pre_treatment_prime_state = 0 + self.pre_treatment_recirc_state = 0 + self.pre_treatment_patient_connection_state = 0 + + def get_pre_treatment_submode(self): + """ + Gets the pre-treatment state + + @return: The pre-treatment state + """ + return self.pre_treatment_submode + + def get_pre_treatment_sample_water_state(self): + """ + Gets the pre-treatment sample water state + + @return: The pre-treatment sample water state + """ + return self.pre_treatment_sample_water_state + + def get_pre_treatment_no_cart_self_test_state(self): + """ + Gets the pre-treatment no cartridge self-test state + + @return: The pre-treatment no cartridge self-test state + """ + return self.pre_treatment_no_cart_self_test_state + + def get_pre_treatment_installation_state(self): + """ + Gets the pre-treatment installation state + + @return: The pre-treatment installation state + """ + return self.pre_treatment_installation_state + + def get_pre_treatment_dry_self_test_state(self): + """ + Gets the pre-treatment dry self-test state + + @return: The pre-treatment dry self-test state + """ + return self.pre_treatment_dry_self_test_state + + def get_pre_treatment_prime_state(self): + """ + Gets the pre-treatment primt state + + @return: The pre-treatment prime state + """ + return self.pre_treatment_prime_state + + def get_pre_treatment_recirc_state(self): + """ + Gets the pre-treatment re-circulate state + + @return: The pre-treatment re-circulate state + """ + return self.pre_treatment_recirc_state + + def get_pre_treatment_patient_connection_state(self): + """ + Gets the pre-treatment patient connection state + + @return: The pre-treatment patient connection state + """ + return self.pre_treatment_patient_connection_state + + + @_publish([ + "pre_treatment_submode", + "pre_treatment_sample_water_state", + "pre_treatment_no_cart_self_test_state", + "pre_treatment_installation_state", + "pre_treatment_dry_self_test_state", + "pre_treatment_prime_state", + "pre_treatment_recirc_state", + "pre_treatment_patient_connection_state", + ]) + def _handler_pre_treatment_state_sync(self, message): + """ + Handles published pre-treatment state data messages. Pre-treatment state data are captured + for reference. + + @param message: published pre-treatment state data message + @return: none + """ + + self.pre_treatment_submode = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + self.pre_treatment_sample_water_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + self.pre_treatment_no_cart_self_test_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + self.pre_treatment_installation_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + self.pre_treatment_dry_self_test_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + self.pre_treatment_prime_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + self.pre_treatment_recirc_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + self.pre_treatment_patient_connection_state = struct.unpack('i', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] Index: dialin/hd/ui_proxy.py =================================================================== diff -u -rd922d27ee14ce09dfc93844c2244ba7abb6181cf -r84bc297f6f9b0c6594b73ac1045ad64f8f6e347d --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision d922d27ee14ce09dfc93844c2244ba7abb6181cf) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 84bc297f6f9b0c6594b73ac1045ad64f8f6e347d) @@ -1509,3 +1509,93 @@ self.logger.debug("Sending user alarm response option " + str(toggle) + " to HD.") self.can_interface.send(message, 0) + + def cmd_ui_sample_water(self, cmd=0): + """ + Constructs and sends a ui water sample request message + + @param cmd: (U32) sample water cmd \n + 0-Stop sample water \n + 1-Start sample water + + @return: none + """ + + payload = integer_to_bytearray(cmd) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_SAMPLE_WATER_CMD.value, + payload=payload) + + self.logger.debug("Sending user sample water command " + str(cmd) + " to HD.") + self.can_interface.send(message, 0) + + def cmd_ui_send_sample_water_result(self, result=1): + """ + Constructs and sends a ui water sample result message + + @param result: (U32) sample water result \n + 0-Fail \n + 1-Pass + + @return: none + """ + + payload = integer_to_bytearray(result) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_SAMPLE_WATER_RESULT.value, + payload=payload) + + self.logger.debug("Sending user sample water result " + str(result) + " to HD.") + self.can_interface.send(message, 0) + + def cmd_ui_installation_confirm(self): + """ + Constructs and sends a ui installation confirm message + + @return: none + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_INSTALLATION_CONFIRM.value) + + self.logger.debug("Sending user installation confirm to HD.") + self.can_interface.send(message, 0) + + def cmd_ui_start_prime_request(self): + """ + Constructs and sends a ui start prime request message + + @return: none + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_START_PRIME_REQUEST.value) + + self.logger.debug("Sending user start prime request to HD.") + self.can_interface.send(message, 0) + + def cmd_ui_continue_to_treatment_request(self): + """ + Constructs and sends a ui continue to treatment request message + + @return: none + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_CONTINUE_TO_TREATMENT_REQUEST.value) + + self.logger.debug("Sending user continue to treatment request to HD.") + self.can_interface.send(message, 0) + + def cmd_ui_patient_connection_confirm(self): + """ + Constructs and sends a ui patient connection confirm message + + @return: none + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_UI_PATIENT_CONNECTION_CONFIRM.value) + + self.logger.debug("Sending user continue to treatment request to HD.") + self.can_interface.send(message, 0)