Index: dialin/common/hd_defs.py =================================================================== diff -u -r26ac950a2bd0804093abf79b9dd0fc477da8148e -r965b384855cf17d6b975f9989f13a26248e2d919 --- dialin/common/hd_defs.py (.../hd_defs.py) (revision 26ac950a2bd0804093abf79b9dd0fc477da8148e) +++ dialin/common/hd_defs.py (.../hd_defs.py) (revision 965b384855cf17d6b975f9989f13a26248e2d919) @@ -161,9 +161,10 @@ @unique class PostTreatmentStates(DialinEnum): - HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE = 0 - HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE = 1 - HD_POST_TREATMENT_VERIFY_STATE = 2 + HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE = 0 + HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE = 1 + HD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE = 2 + HD_POST_TREATMENT_VERIFY_STATE = 3 @unique Index: dialin/common/msg_ids.py =================================================================== diff -u -recfaee3ad071edb368488eb750692f16a91ddbad -r965b384855cf17d6b975f9989f13a26248e2d919 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision ecfaee3ad071edb368488eb750692f16a91ddbad) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 965b384855cf17d6b975f9989f13a26248e2d919) @@ -302,6 +302,7 @@ MSG_ID_HD_PRE_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE = 0x8073 MSG_ID_HD_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE = 0x8074 MSG_ID_HD_POST_TREATMENT_DATA_PUBLISH_INTERVAL_OVERRIDE = 0x8075 + MSG_ID_HD_BLOCK_MESSAGE_TRANSMISSION = 0x8076 MSG_ID_DG_TESTER_LOGIN_REQUEST = 0XA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0XA001 @@ -333,7 +334,7 @@ MSG_ID_DG_SWITCHES_STATUS_OVERRIDE = 0XA01D MSG_ID_DG_SWITCHES_PUBLISH_INTERVAL_OVERRIDE = 0XA01E MSG_ID_DG_OP_MODE_PUBLISH_INTERVAL_OVERRIDE = 0XA01F - MSG_ID___AVAILABLE_15 = 0XA020 + MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION = 0XA020 MSG_ID___AVAILABLE_16 = 0XA021 MSG_ID_DG_SOFTWARE_RESET_REQUEST = 0XA022 MSG_ID_DG_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE = 0XA023 Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -recfaee3ad071edb368488eb750692f16a91ddbad -r965b384855cf17d6b975f9989f13a26248e2d919 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision ecfaee3ad071edb368488eb750692f16a91ddbad) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 965b384855cf17d6b975f9989f13a26248e2d919) @@ -49,6 +49,7 @@ from ..protocols.CAN import DenaliCanMessenger, DenaliMessage, DenaliChannels from ..utils import * from ..utils.base import AbstractSubSystem, publish, LogManager, DialinEnum +from ..utils.conversions import integer_to_bytearray, unsigned_short_to_bytearray @unique @@ -148,6 +149,7 @@ self.dg_operation_sub_mode = 0 self.dg_logged_in = False self.dg_set_logged_in_status(False) + self.dg_no_transmit_msg_list = [0,0,0,0,0,0,0,0] # Create command groups self.accel = DGAccelerometer(self.can_interface, self.logger) @@ -219,6 +221,14 @@ """ return self.dg_logged_in + def get_dg_blocked_msg_list(self): + """ + Gets the current list of message IDs that HD will prevent transmission of. + + @return: List of message IDs blocked from transmission + """ + return self.dg_no_transmit_msg_list + @publish(["dg_logged_in"]) def dg_set_logged_in_status(self, logged_in: bool = False): """ @@ -408,3 +418,59 @@ else: self.logger.debug("Timeout!!!!") return False + + def cmd_block_dg_message_transmissions(self, msg1: int = 0, msg2: int = 0, msg3: int = 0, msg4: int = 0, + msg5: int = 0, msg6: int = 0, msg7: int = 0, msg8: int = 0): + """ + Constructs and sends a block dg message transmission request + Constraints: + Must be logged into DG. + + @param msg1: integer - 1st message ID to block DG from transmitting + @param msg2: integer - 2nd message ID to block DG from transmitting + @param msg3: integer - 3rd message ID to block DG from transmitting + @param msg4: integer - 4th message ID to block DG from transmitting + @param msg5: integer - 5th message ID to block DG from transmitting + @param msg6: integer - 6th message ID to block DG from transmitting + @param msg7: integer - 7th message ID to block DG from transmitting + @param msg8: integer - 8th message ID to block DG from transmitting + @return: 1 if successful, zero otherwise + """ + # Save blocked message(s) list + self.dg_no_transmit_msg_list[0] = msg1 + self.dg_no_transmit_msg_list[1] = msg2 + self.dg_no_transmit_msg_list[2] = msg3 + self.dg_no_transmit_msg_list[3] = msg4 + self.dg_no_transmit_msg_list[4] = msg5 + self.dg_no_transmit_msg_list[5] = msg6 + self.dg_no_transmit_msg_list[6] = msg7 + self.dg_no_transmit_msg_list[7] = msg8 + # Build message payload + m1 = unsigned_short_to_bytearray(msg1) + m2 = unsigned_short_to_bytearray(msg2) + m3 = unsigned_short_to_bytearray(msg3) + m4 = unsigned_short_to_bytearray(msg4) + m5 = unsigned_short_to_bytearray(msg5) + m6 = unsigned_short_to_bytearray(msg6) + m7 = unsigned_short_to_bytearray(msg7) + m8 = unsigned_short_to_bytearray(msg8) + payload = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION.value, + payload=payload) + + self.logger.debug("request DG block transmission of message(s)") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Given messages blocked." + + 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 Index: dialin/hd/hemodialysis_device.py =================================================================== diff -u -recfaee3ad071edb368488eb750692f16a91ddbad -r965b384855cf17d6b975f9989f13a26248e2d919 --- dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision ecfaee3ad071edb368488eb750692f16a91ddbad) +++ dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 965b384855cf17d6b975f9989f13a26248e2d919) @@ -23,7 +23,7 @@ from .blood_leak import HDBloodLeak from .buttons import HDButtons from .calibration_record import HDCalibrationNVRecord -from .constants import NO_RESET +from .constants import NO_RESET, RESET from .dialysate_inlet_flow import HDDialysateInletFlow from .dialysate_outlet_flow import HDDialysateOutletFlow from .fluid_leak import HDFluidLeak @@ -44,7 +44,7 @@ from ..protocols.CAN import DenaliMessage, DenaliCanMessenger, DenaliChannels from ..utils.base import AbstractSubSystem, publish, LogManager from ..utils.checks import check_broadcast_interval_override_ms -from ..utils.conversions import integer_to_bytearray +from ..utils.conversions import integer_to_bytearray, unsigned_short_to_bytearray class HD(AbstractSubSystem): @@ -92,6 +92,7 @@ self.hd_operation_sub_mode = 0 self.hd_logged_in = False self.hd_set_logged_in_status(False) + self.hd_no_transmit_msg_list = [0,0,0,0,0,0,0,0] # Create command groups self.accel = HDAccelerometer(self.can_interface, self.logger) @@ -134,6 +135,14 @@ """ return self.hd_logged_in + def get_hd_blocked_msg_list(self): + """ + Gets the current list of message IDs that HD will prevent transmission of. + + @return: List of message IDs blocked from transmission + """ + return self.hd_no_transmit_msg_list + @publish(["hd_logged_in"]) def hd_set_logged_in_status(self, logged_in: bool = False): """ @@ -530,3 +539,58 @@ self.logger.debug("Timeout!!!!") return False + def cmd_block_hd_message_transmissions(self, msg1: int = 0, msg2: int = 0, msg3: int = 0, msg4: int = 0, + msg5: int = 0, msg6: int = 0, msg7: int = 0, msg8: int = 0): + """ + Constructs and sends a block hd message transmission request + Constraints: + Must be logged into HD. + + @param msg1: integer - 1st message ID to block HD from transmitting + @param msg2: integer - 2nd message ID to block HD from transmitting + @param msg3: integer - 3rd message ID to block HD from transmitting + @param msg4: integer - 4th message ID to block HD from transmitting + @param msg5: integer - 5th message ID to block HD from transmitting + @param msg6: integer - 6th message ID to block HD from transmitting + @param msg7: integer - 7th message ID to block HD from transmitting + @param msg8: integer - 8th message ID to block HD from transmitting + @return: 1 if successful, zero otherwise + """ + # Save blocked message(s) list + self.hd_no_transmit_msg_list[0] = msg1 + self.hd_no_transmit_msg_list[1] = msg2 + self.hd_no_transmit_msg_list[2] = msg3 + self.hd_no_transmit_msg_list[3] = msg4 + self.hd_no_transmit_msg_list[4] = msg5 + self.hd_no_transmit_msg_list[5] = msg6 + self.hd_no_transmit_msg_list[6] = msg7 + self.hd_no_transmit_msg_list[7] = msg8 + # Build message payload + m1 = unsigned_short_to_bytearray(msg1) + m2 = unsigned_short_to_bytearray(msg2) + m3 = unsigned_short_to_bytearray(msg3) + m4 = unsigned_short_to_bytearray(msg4) + m5 = unsigned_short_to_bytearray(msg5) + m6 = unsigned_short_to_bytearray(msg6) + m7 = unsigned_short_to_bytearray(msg7) + m8 = unsigned_short_to_bytearray(msg8) + payload = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BLOCK_MESSAGE_TRANSMISSION.value, + payload=payload) + + self.logger.debug("request HD block transmission of message(s)") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + self.logger.debug("Given messages blocked." + + 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 Index: dialin/utils/conversions.py =================================================================== diff -u -rf0487ded330dd831fede0982e53d40467fa33dde -r965b384855cf17d6b975f9989f13a26248e2d919 --- dialin/utils/conversions.py (.../conversions.py) (revision f0487ded330dd831fede0982e53d40467fa33dde) +++ dialin/utils/conversions.py (.../conversions.py) (revision 965b384855cf17d6b975f9989f13a26248e2d919) @@ -41,6 +41,18 @@ return struct.pack(" bytes: + """ + Converts an unsigned short integer (2 bytes) value into a byte array (little endian) + + @param val: (int) integer to convert to byte array + @return: byte array + """ + if type(val) != int or val < 0: + raise ValueError("Expected unsigned integer but received {0} with type {1}".format(val, type(val))) + return struct.pack(" bytes: """ Converts an integer value into a byte array (little endian)