########################################################################### # # Copyright (c) 2019-2020 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 treatment.py # # @date 31-Mar-2020 # @author P. Lucia # # @brief # # ############################################################################ from DialIn.CoreCANProtocol import (DenaliMessage, DenaliChannels) import struct class HDTreatment: """ \class HD_Treatment \brief Hemodialysis Device (HD) Dialin API sub-class for treatment related commands. """ # treatment message IDs MSG_ID_HD_TREATMENT_TIME_PUBLISHED_DATA = 0x000D MSG_ID_HD_TREATMENT_STATE_PUBLISHED_DATA = 0X000F # treatment time broadcast message field positions START_POS_TIME_PRES = DenaliMessage.PAYLOAD_START_INDEX END_POS_TIME_PRES = START_POS_TIME_PRES + 4 START_POS_TIME_ELAPSED = END_POS_TIME_PRES END_POS_TIME_ELAPSED = START_POS_TIME_ELAPSED + 4 START_POS_TIME_REMAINING = END_POS_TIME_ELAPSED END_POS_TIME_REMAINING = START_POS_TIME_REMAINING + 4 # treatment state broadcast message field positions START_POS_TREATMENT_STATE = DenaliMessage.PAYLOAD_START_INDEX END_POS_TREATMENT_STATE = START_POS_TREATMENT_STATE + 4 START_POS_UF_STATE = END_POS_TREATMENT_STATE END_POS_UF_STATE = START_POS_UF_STATE + 4 START_POS_SALINE_BOLUS_IN_PROGRESS = END_POS_UF_STATE END_POS_SALINE_BOLUS_IN_PROGRESS = START_POS_SALINE_BOLUS_IN_PROGRESS + 4 def __init__(self, can_interface=None): """ HD_Treatment constructor """ self.can_interface = can_interface if self.can_interface is not None: channel_id = DenaliChannels.hd_sync_broadcast_ch_id msg_id = self.MSG_ID_HD_TREATMENT_TIME_PUBLISHED_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self.handler_treatment_time_sync) msg_id = self.MSG_ID_HD_TREATMENT_STATE_PUBLISHED_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self.handler_treatment_state_sync) self.treatment_time_prescribed = 0 self.treatment_time_elapsed = 0 self.treatment_time_remaining = 0 self.treatment_state = 0 self.treatment_uf_state = 0 self.saline_bolus_in_progress = False def handler_treatment_time_sync(self, message): """ Handles published treatment time data messages. treatment time data are captured for reference. \param message: published treatment time data message \returns none """ tot = struct.unpack('i', bytearray( message['message'][self.START_POS_TIME_PRES:self.END_POS_TIME_PRES])) ela = struct.unpack('i', bytearray( message['message'][self.START_POS_TIME_ELAPSED:self.END_POS_TIME_ELAPSED])) rem = struct.unpack('i', bytearray( message['message'][self.START_POS_TIME_REMAINING:self.END_POS_TIME_REMAINING])) self.treatment_time_prescribed = tot[0] self.treatment_time_elapsed = ela[0] self.treatment_time_remaining = rem[0] def handler_treatment_state_sync(self, message): """ Handles published treatment state data messages. treatment state data are captured for reference. \param message: published treatment state data message \returns none """ tst = struct.unpack('i', bytearray( message['message'][self.START_POS_TREATMENT_STATE:self.END_POS_TREATMENT_STATE])) ufs = struct.unpack('i', bytearray( message['message'][self.START_POS_UF_STATE:self.END_POS_UF_STATE])) bol = struct.unpack('i', bytearray( message['message'][self.START_POS_SALINE_BOLUS_IN_PROGRESS:self.END_POS_SALINE_BOLUS_IN_PROGRESS])) self.treatment_state = tst[0] self.treatment_uf_state = ufs[0] if bol[0] == 1: self.saline_bolus_in_progress = True else: self.saline_bolus_in_progress = False