Index: dialin/common/msg_ids.py =================================================================== diff -u -rfa8f8660695b75332b9d0280ad1f38e834b660e2 -r6f587d8ddaff7a18f75ce72485e18a73838f0b88 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision fa8f8660695b75332b9d0280ad1f38e834b660e2) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 6f587d8ddaff7a18f75ce72485e18a73838f0b88) @@ -274,6 +274,16 @@ MSG_ID_HD_BLOOD_PRIME_VOLUME_OVERRIDE = 0X805F MSG_ID_HD_BUBBLE_SELF_TEST_REQUEST = 0X8060 MSG_ID_HD_BLOOD_PRIME_SAFETY_VOLUME_OVERRIDE = 0X8061 + MSG_ID_HD_SWITCHES_STATUS_OVERRIDE = 0x8062 + MSG_ID_HD_SWITCHES_PUBLISH_INTERVAL_OVERRIDE = 0x8063 + MSG_ID_HD_BATTERY_REMAINING_PERCENT_OVERRIDE = 0x8064 + MSG_ID_HD_TEMPERATURES_VALUE_OVERRIDE = 0x8065 + MSG_ID_HD_TEMPERATURES_PUBLISH_INTERVAL_OVERRIDE = 0x8066 + MSG_ID_HD_FANS_PUBLISH_INTERVAL_OVERRIDE = 0x8067 + MSG_ID_HD_FANS_RPM_OVERRIDE = 0x8068 + MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE = 0x8069 + MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE = 0x806A + MSG_ID_DG_TESTER_LOGIN_REQUEST = 0XA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0XA001 MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0XA002 Index: dialin/hd/treatment.py =================================================================== diff -u -rf225e4d9faea2663d40fa78aa8a1345656008ec8 -r6f587d8ddaff7a18f75ce72485e18a73838f0b88 --- dialin/hd/treatment.py (.../treatment.py) (revision f225e4d9faea2663d40fa78aa8a1345656008ec8) +++ dialin/hd/treatment.py (.../treatment.py) (revision 6f587d8ddaff7a18f75ce72485e18a73838f0b88) @@ -134,6 +134,7 @@ self.rinseback_cur_rate = 0 self.rinseback_timeout_secs = 0 self.rinseback_countdown_secs = 0 + self.rinseback_safety_cum_vol = 0.0 # re-circulation status self.recirc_timeout_secs = 0 self.recirc_countdown_secs = 0 @@ -290,6 +291,46 @@ """ return self.blood_prime_ind_cum_vol + def get_rinseback_target_volume(self): + """ + Returns rinseback target volume (in mL) + + @return: The rinseback target volume + """ + return self.rinseback_tgt_vol + + def get_rinseback_volume_delivered(self): + """ + Returns rinseback volume (in mL) delivered + + @return: The rinseback volume delivered + """ + return self.rinseback_cum_vol + + def get_rinseback_safety_volume_delivered(self): + """ + Returns rinseback safety volume (in mL) delivered + + @return: The rinseback safety volume delivered + """ + return self.rinseback_safety_cum_vol + + def get_rinseback_timeout(self): + """ + Returns rinseback timeout period (in seconds) + + @return: The rinseback timeout period + """ + return self.rinseback_timeout_secs + + def get_rinseback_timeout_countdown(self): + """ + Returns rinseback timeout countdown (in seconds) + + @return: The rinseback timeout countdown + """ + return self.rinseback_countdown_secs + @_publish([ "treatment_time_prescribed", "treatment_time_elapsed", @@ -419,12 +460,15 @@ message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4])) cdn = struct.unpack('i', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5])) + rsv = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6])) self.rinseback_tgt_vol = tgt[0] self.rinseback_cum_vol = cum[0] self.rinseback_cur_rate = rat[0] self.rinseback_timeout_secs = tmo[0] self.rinseback_countdown_secs = cdn[0] + self.rinseback_safety_cum_vol = rsv[0] @_publish([ "blood_prime_tgt_vol", @@ -1230,3 +1274,71 @@ self.logger.debug("Timeout!!!!") return False + def cmd_rinseback_volume_delivered_override(self, volume: float, reset: int =NO_RESET) -> int: + """ + Constructs and sends the rinseback volume delivered override command + Constraints: + Must be logged into HD. + + @param volume: float - volume (in mL) of blood returned during rinseback (must be positive) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + vol = float_to_bytearray(volume) + payload = rst + vol + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_RINSEBACK_VOLUME_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD rinseback volume delivered (in mL).") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Rinseback volume delivered overridden to " + str(volume) + " mL. " + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_rinseback_safety_volume_delivered_override(self, volume: float, reset: int =NO_RESET) -> int: + """ + Constructs and sends the rinseback safety volume delivered override command + Constraints: + Must be logged into HD. + + @param volume: float - safety volume (in mL) of blood returned during rinseback (must be positive) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + vol = float_to_bytearray(volume) + payload = rst + vol + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_RINSEBACK_SAFETY_VOLUME_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD rinseback safety volume delivered (in mL).") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Rinseback safety volume delivered overridden to " + str(volume) + " mL. " + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False +