Index: leahi_dialin/common/override_templates.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -r47a803c6dd859a5bcc7a6c82e0cb160c350473ea --- leahi_dialin/common/override_templates.py (.../override_templates.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/common/override_templates.py (.../override_templates.py) (revision 47a803c6dd859a5bcc7a6c82e0cb160c350473ea) @@ -95,7 +95,7 @@ message_id=msg_id.value, payload=payload) - if payload is None: + if payload is None or reset is None: logger.debug(f'Call command: {entity_name}') else: logger.debug(f'Override {entity_name} value') @@ -105,8 +105,8 @@ # If there is content... if received_message is not None: - if payload is None: - str_res = f'not called' if reset == RESET else 'Called' + if payload is None or reset is None: + str_res = f'not called' if reset is not None and reset == RESET else 'Called' logger.debug(f'{entity_name} is {str_res} {str(received_message["message"][DenaliMessage.PAYLOAD_START_INDEX])}') else: str_res = f'its default value' if reset == RESET else override_text Index: leahi_dialin/dd/proxies/td_proxy.py =================================================================== diff -u -r18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df -r47a803c6dd859a5bcc7a6c82e0cb160c350473ea --- leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision 18c90a1b2b6c7339bdd192a2d2fac32f2b8a35df) +++ leahi_dialin/dd/proxies/td_proxy.py (.../td_proxy.py) (revision 47a803c6dd859a5bcc7a6c82e0cb160c350473ea) @@ -18,6 +18,7 @@ from logging import Logger from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions +from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray @@ -86,7 +87,7 @@ def cmd_td_send_dd_gen_dialysate_request(self, start: bool = 0, dial_rate: float = 0, uf_rate: float = 0, - dial_temp: float = 0, bypass: int = 0, acid: int = 0, bicarb: int = 0): + dial_temp: float = 0, bypass: int = 0, acid_conv_factor: float = 0.0, bicarb_conv_factor: float = 0.0, sodium: int = 0, bicarb_volume: int = 0): """ Constructs and sends a TD gen dialysate request to the DD. @@ -97,19 +98,24 @@ uf = float_to_bytearray(uf_rate) temp = float_to_bytearray(dial_temp) byp = integer_to_bytearray(bypass) - acd = integer_to_bytearray(acid) - bic = integer_to_bytearray(bicarb) - payload = stt + dial + uf + temp + byp + acd + bic - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA.value, - payload=payload) + acd = float_to_bytearray(acid_conv_factor) + bic = float_to_bytearray(bicarb_conv_factor) + sod = integer_to_bytearray(sodium) + bvl = integer_to_bytearray(bicarb_volume) + payload = stt + dial + uf + temp + byp + acd + bic + sod + bvl - self.logger.debug("Sending TD gen dialysate data request to DD.") - self.can_interface.send(message, 0) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, + entity_name = 'TD Gen Dialysate Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) def cmd_td_send_dd_start_pre_gen_request(self, start: bool = 0, dialysate_rate: float = 0.0, dialysate_temp: float = 0.0, - acid_type: int = 0, bicarb_type: int = 0 ): + acid_conv_factor: float = 0.0, bicarb_conv_factor: float = 0.0, sodium: int = 0, bicarb_volume: int = 0): """ Constructs and sends a TD start pre gen dialysate request to the DD. :param start: start and stop boolean @@ -122,13 +128,17 @@ stt = integer_to_bytearray(start) dial = float_to_bytearray(dialysate_rate) temp = float_to_bytearray(dialysate_temp) - acd = integer_to_bytearray(acid_type) - bic = integer_to_bytearray(bicarb_type) - payload = stt + dial + temp + acd + bic + acd = float_to_bytearray(acid_conv_factor) + bic = float_to_bytearray(bicarb_conv_factor) + sod = integer_to_bytearray(sodium) + bvl = integer_to_bytearray(bicarb_volume) + payload = stt + dial + temp + acd + bic + sod + bvl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, - message_id=MsgIds.MSG_ID_DD_PRE_GEN_DIALYSATE_REQUEST_DATA.value, - payload=payload) - - self.logger.debug("Sending TD start pre gen request to DD.") - self.can_interface.send(message, 0) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.dialin_to_dd_ch_id, + msg_id = MsgIds.MSG_ID_DD_PRE_GEN_DIALYSATE_REQUEST_DATA, + entity_name = 'TD Pre-Gen Dialysate Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) Index: leahi_dialin/td/modules/alarms.py =================================================================== diff -u -r20c821bd230fc7689a0275a2918981669ff5cc19 -r47a803c6dd859a5bcc7a6c82e0cb160c350473ea --- leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 20c821bd230fc7689a0275a2918981669ff5cc19) +++ leahi_dialin/td/modules/alarms.py (.../alarms.py) (revision 47a803c6dd859a5bcc7a6c82e0cb160c350473ea) @@ -78,26 +78,30 @@ self.logger = logger if self.can_interface is not None: - channel_id = DenaliChannels.td_alarm_broadcast_ch_id - self.msg_id_td_alarm_status_data = MsgIds.MSG_ID_ALARM_STATUS_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_alarm_status_data, - self._handler_alarms_status_sync) + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_alarm_broadcast_ch_id, + message_id = MsgIds.MSG_ID_ALARM_STATUS_DATA.value, + function = self._handler_alarms_status_sync) - channel_id = DenaliChannels.td_alarm_broadcast_ch_id - self.msg_id_td_alarm_triggered = MsgIds.MSG_ID_ALARM_TRIGGERED.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_alarm_triggered, - self._handler_alarm_trigger) - self.msg_id_td_alarm_cleared = MsgIds.MSG_ID_ALARM_CLEARED.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_alarm_cleared, - self._handler_alarm_clear) - self.msg_id_td_alarm_condition_cleared = MsgIds.MSG_ID_ALARM_CONDITION_CLEARED.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_alarm_condition_cleared, - self._handler_alarm_condition_clear) - channel_id = DenaliChannels.td_sync_broadcast_ch_id - self.msg_id_td_alarm_info_data = MsgIds.MSG_ID_TD_ALARM_INFORMATION_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_td_alarm_info_data, - self._handler_alarm_information_sync) + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_alarm_broadcast_ch_id, + message_id = MsgIds.MSG_ID_ALARM_TRIGGERED.value, + function = self._handler_alarm_trigger) + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_alarm_broadcast_ch_id, + message_id = MsgIds.MSG_ID_ALARM_CLEARED.value, + function = self._handler_alarm_clear) + + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_alarm_broadcast_ch_id, + message_id = MsgIds.MSG_ID_ALARM_CONDITION_CLEARED.value, + function = self._handler_alarm_condition_clear) + + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_TD_ALARM_INFORMATION_DATA.value, + function = self._handler_alarm_information_sync) + + self.can_interface.register_receiving_publication_function(channel_id = DenaliChannels.td_sync_broadcast_ch_id, + message_id = MsgIds.MSG_ID_TD_ACTIVE_ALARMS_LIST_REQUEST_RESPONSE.value, + function = self._handler_alarm_list_response) + self.td_alarm_status_timestamp = 0.0 #: The timestamp of the last Alarm Status message self.td_alarm_triggered_timestamp = 0.0 #: The timestamp of the last Alarm Triggered message self.td_alarm_cleared_timestamp = 0.0 #: The timestamp of the last Alarm Cleared message @@ -132,6 +136,12 @@ self.alarm_table_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_TD_ALARM_RESPONSE_BUTTONS.value #: The Alarm Table's Button blocker data self.alarm_state_button_blockers = [False] * self.AlarmResponseButtons.NUM_OF_TD_ALARM_RESPONSE_BUTTONS.value #: The Alarm State's Button blocker data + # Alarms list + self.ui_alarm_list_accepted = True #: The Alarm List request accepted + self.ui_alarm_list_reject_reason = 0 #: The Alarm List request reject reason + self.ui_alarm_list = [] #: The UI Alarm List content + self.ui_alarm_list_timestamp = 0.0 #: The timestamp of the last Alarm List + # Loop through the list of the event data type enum and update the dictionary for data_type in td_enum_repository.TDEventDataTypes: event_data_type = td_enum_repository.TDEventDataTypes(data_type).name @@ -299,6 +309,28 @@ self.td_alarm_information_timestamp = timestamp + @publish(["msg_id_td_active_alarms_list_request_response", "accepted", "rejection_reason", "active_alarm_list"]) + def _handler_alarm_list_response(self, message, timestamp=0.0): + """ + Handles published TD alarm clear alarm condition messages. + + @param message: published TD alarm clear alarm condition message + @return: none + """ + self.ui_alarm_list_accepted = struct.unpack('i',bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + self.ui_alarm_list_reject_reason = struct.unpack('i',bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + + i = 3 + for _ in range(0,10): + start_pos = eval(f'MsgFieldPositions.START_POS_FIELD_{i}') + end_pos = eval(f'MsgFieldPositions.END_POS_FIELD_{i}') + value = struct.unpack('i',bytearray(message['message'][start_pos:end_pos]))[0] + self.ui_alarm_list.append(value) + i += 1 + + self.ui_alarm_list_timestamp = timestamp + + def cmd_alarm_status_broadcast_interval_override(self, ms: int = 250, reset: int = NO_RESET): """ Constructs and sends the alarm status broadcast interval override command Index: leahi_dialin/td/proxies/ui_proxy.py =================================================================== diff -u -r914620537399ff9ecc4925fc56f8b8be567d184e -r47a803c6dd859a5bcc7a6c82e0cb160c350473ea --- leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 914620537399ff9ecc4925fc56f8b8be567d184e) +++ leahi_dialin/td/proxies/ui_proxy.py (.../ui_proxy.py) (revision 47a803c6dd859a5bcc7a6c82e0cb160c350473ea) @@ -19,6 +19,7 @@ from leahi_dialin.common.constants import ACCEPTED from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions, RequestRejectReasons +from leahi_dialin.common.override_templates import cmd_generic_override from leahi_dialin.protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem from leahi_dialin.utils.conversions import integer_to_bytearray, unsigned_byte_to_bytearray, float_to_bytearray, \ @@ -257,14 +258,16 @@ dtp = float_to_bytearray(dialysate_temp) hdr = float_to_bytearray(heparin_dispense_rate) hbv = float_to_bytearray(heparin_bolus_volume) - payload = bld + dia + dur + sal + hst + het + acc + bic + dzr + bpi + rbf + rbv + apw + vpw + vpa + tmp + dtp + hdr + hbv - message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_to_td_ch_id, - message_id=MsgIds.MSG_ID_UI_TREATMENT_PARAMS_TO_VALIDATE.value, - payload=payload) - self.logger.debug("Sending treatment parameters to TD.") - self.can_interface.send(message, 0) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_TREATMENT_PARAMS_TO_VALIDATE, + entity_name = 'Sneding UI Treatment Parameter to TD', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) def cmd_send_ui_version_request(self) -> None: @@ -279,17 +282,18 @@ micro = unsigned_byte_to_bytearray(0) build = short_to_bytearray(0) compatibility = integer_to_bytearray(self.SW_COMPATIBILITY_REV) - payload = major + minor + micro + build + compatibility - message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_sync_broadcast_ch_id, - message_id=MsgIds.MSG_ID_FW_VERSIONS_REQUEST.value, - payload=payload) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_sync_broadcast_ch_id, + msg_id = MsgIds.MSG_ID_FW_VERSIONS_REQUEST, + entity_name = 'UI Version Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("Sending UI Version Request.") - self.can_interface.send(message, 0) - def cmd_send_ui_initiate_treatment(self, accepted:int = ACCEPTED ) -> None: """ Constructs and sends a UI initiate treatment message. @@ -298,17 +302,18 @@ :return: none """ acc = integer_to_bytearray(accepted) - payload = acc - message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_to_td_ch_id, - message_id=MsgIds.MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW.value, - payload=payload) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW, + entity_name = 'UI Initiate Treatment Workflow', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("Sending UI Initiate Treatment Workflow.") - self.can_interface.send(message, 0) - def cmd_send_ui_confirmed_treatment_parameters (self, accepted: int = ACCEPTED ) -> None: """ Constructs and sends a UI confirmation of treatment parameters message. @@ -317,17 +322,18 @@ :return: none """ acc = integer_to_bytearray(accepted) - payload = acc - message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_to_td_ch_id, - message_id=MsgIds.MSG_ID_UI_TREATMENT_PARAMS_CONFIRMED.value, - payload=payload) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_TREATMENT_PARAMS_CONFIRMED, + entity_name = 'UI Confirm Treatment Parameters', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("Sending UI Confirm Treatment Parameters.") - self.can_interface.send(message, 0) - def cmd_send_ui_pause_resume_uf(self, accepted:int = ACCEPTED, rejection_reason:int = RequestRejectReasons.REQUEST_REJECT_REASON_NONE.value ) -> None: """ Constructs and sends a UI pause/resume ultrafiltration message. @@ -338,17 +344,18 @@ """ acc = integer_to_bytearray(accepted) rjr = integer_to_bytearray(rejection_reason) - payload = acc + rjr - message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_to_td_ch_id, - message_id=MsgIds.MSG_ID_UI_UF_PAUSE_RESUME_REQUEST.value, - payload=payload) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_UF_PAUSE_RESUME_REQUEST, + entity_name = 'UI Pause or Resume UF Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("Sending UI Pause Resume UF request.") - self.can_interface.send(message, 0) - def cmd_send_ui_validate_uf_volume (self, uf_volume: float = 0.0 ) -> None: """ Constructs and sends a UI validate ultrafiltration message. @@ -357,12 +364,49 @@ :return: none """ ufv = float_to_bytearray(uf_volume) - payload = ufv - message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_to_td_ch_id, - message_id=MsgIds.MSG_ID_UI_ULTRAFILTRATION_VOLUME_TO_VALIDATE.value, - payload=payload) + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_ULTRAFILTRATION_VOLUME_TO_VALIDATE, + entity_name = 'Validate UI Ultrafiltration Volume', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) - self.logger.debug("Sending UI Ultrafiltration volume to validate.") - self.can_interface.send(message, 0) + + def cmd_send_ui_alarm_list_request (self) -> None: + """ + Constructs and sends a UI request for the active alarm list. + + :return: none + """ + cmd_generic_override(payload = None, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_UI_ACTIVE_ALARMS_LIST_REQUEST, + entity_name = 'UI Active Alarm List Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface) + + + def cmd_send_ui_silence_alarm(self, silence: int = 1) -> None: + """ + Constructs and sends a UI request to silence the alarm sound. + + :param silence: (int) 1 to silence, 0 to de-silence + :return: none + """ + sil = float_to_bytearray(silence) + payload = sil + + cmd_generic_override(payload = payload, + reset = None, + channel_id = DenaliChannels.ui_to_td_ch_id, + msg_id = MsgIds.MSG_ID_USER_ALARM_SILENCE_REQUEST, + entity_name = 'UI Alarm Silence Request', + override_text = 'N/A', + logger = self.logger, + can_interface = self.can_interface)