Index: dialin/common/alarm_defs.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -94,7 +94,18 @@ ALARM_ID_HD_ACCELEROMETER_FAILURE = 74 # HD accelerometer error (no readings or FPGA reports error) ALARM_ID_DG_ACCELEROMETER_FAILURE = 75 # DG accelerometer error (no readings or FPGA reports error) ALARM_ID_DG_CRITICAL_DATA_ERROR = 76 # DG critical data integrity check failed. - NUM_OF_ALARM_IDS = 77 # Total number of alarms + ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE = 77, # RO rejection ratio out of range + ALARM_ID_INLET_WATER_PRESSURE_FAULT = 78, # Inlet water pressure fault + ALARM_ID_HD_VALVE_HOMING_FAILED = 79, # HD valve homing failed + ALARM_ID_HD_VALVE_TRANSITION_TIMEOUT = 80, # HD valve transition time out + ALARM_ID_HD_VALVE_NOT_FUNCTIONAL = 81, # HD valve not functional + ALARM_ID_HD_VALVE_CURRENT_OUT_OF_RANGE = 82, # HD valve current out of range + ALARM_ID_HD_VALVE_POSITION_OUT_OF_RANGE = 83, # HD valve position out of target + ALARM_ID_AIR_TRAP_ILLEGAL_LEVELS = 84, # Air trap level sensors reporting illegal combination of air/fluid + ALARM_ID_AIR_TRAP_FILL_DURING_PRIME = 85, # Air trap fill timeout during priming + ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT = 86, # Air trap fill timeout during treatment + ALARM_ID_INVALID_VALVE_SELECTED = 87, # HD valve invalid valve selected + NUM_OF_ALARM_IDS = 88 # Total number of alarms class AlarmPriorities: ALARM_PRIORITY_NONE = 0 # Indicates not an alarm or no alarms active at this time Index: dialin/common/msg_defs.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/common/msg_defs.py (.../msg_defs.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -14,6 +14,7 @@ # ############################################################################ import enum +from ..protocols.CAN import DenaliMessage class MsgIds(enum.Enum): MSG_ID_UNUSED = 0 # Zero is an undefined (un-used) message ID) @@ -79,6 +80,7 @@ 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_HD_AIR_TRAP_DATA = 0x003E # HD broadcast of air trap data + MSG_ID_USER_UF_PAUSE_RESUME_RESPONSE = 0x3F # HD response to user request to pause or resume UF MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing @@ -200,4 +202,53 @@ REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS = 14 REQUEST_REJECT_REASON_UF_NOT_PAUSED = 15 REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS = 16 - NUM_OF_REQUEST_REJECT_REASONS = 17 + REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE = 17 + REQUEST_REJECT_REASON_HEPARIN_PRESTOP_EXCEEDS_DURATION = 18 + REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH = 19 + REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH = 20 + REQUEST_REJECT_REASON_SALINE_MAX_VOLUME_REACHED = 21 + REQUEST_REJECT_REASON_SALINE_BOLUS_NOT_IN_PROGRESS = 22 + NUM_OF_REQUEST_REJECT_REASONS = 23 + +class MsgFldPositions(): + # Generic response msg field byte positions (where 32-bit data fields are used) + START_POS_FIELD_1 = DenaliMessage.PAYLOAD_START_INDEX + END_POS_FIELD_1 = START_POS_FIELD_1 + 4 + START_POS_FIELD_2 = END_POS_FIELD_1 + END_POS_FIELD_2 = START_POS_FIELD_2 + 4 + START_POS_FIELD_3 = END_POS_FIELD_2 + END_POS_FIELD_3 = START_POS_FIELD_3 + 4 + START_POS_FIELD_4 = END_POS_FIELD_3 + END_POS_FIELD_4 = START_POS_FIELD_4 + 4 + START_POS_FIELD_5 = END_POS_FIELD_4 + END_POS_FIELD_5 = START_POS_FIELD_5 + 4 + START_POS_FIELD_6 = END_POS_FIELD_5 + END_POS_FIELD_6 = START_POS_FIELD_6 + 4 + START_POS_FIELD_7 = END_POS_FIELD_6 + END_POS_FIELD_7 = START_POS_FIELD_7 + 4 + START_POS_FIELD_8 = END_POS_FIELD_7 + END_POS_FIELD_8 = START_POS_FIELD_8 + 4 + START_POS_FIELD_9 = END_POS_FIELD_8 + END_POS_FIELD_9 = START_POS_FIELD_9 + 4 + START_POS_FIELD_10 = END_POS_FIELD_9 + END_POS_FIELD_10 = START_POS_FIELD_10 + 4 + START_POS_FIELD_11 = END_POS_FIELD_10 + END_POS_FIELD_11 = START_POS_FIELD_11 + 4 + START_POS_FIELD_12 = END_POS_FIELD_11 + END_POS_FIELD_12 = START_POS_FIELD_12 + 4 + START_POS_FIELD_13 = END_POS_FIELD_12 + END_POS_FIELD_13 = START_POS_FIELD_13 + 4 + START_POS_FIELD_14 = END_POS_FIELD_13 + END_POS_FIELD_14 = START_POS_FIELD_14 + 4 + START_POS_FIELD_15 = END_POS_FIELD_14 + END_POS_FIELD_15 = START_POS_FIELD_15 + 4 + START_POS_FIELD_16 = END_POS_FIELD_15 + END_POS_FIELD_16 = START_POS_FIELD_16 + 4 + START_POS_FIELD_17 = END_POS_FIELD_16 + END_POS_FIELD_17 = START_POS_FIELD_17 + 4 + START_POS_FIELD_18 = END_POS_FIELD_17 + END_POS_FIELD_18 = START_POS_FIELD_18 + 4 + START_POS_FIELD_19 = END_POS_FIELD_18 + END_POS_FIELD_19 = START_POS_FIELD_19 + 4 + START_POS_FIELD_20 = END_POS_FIELD_19 + END_POS_FIELD_20 = START_POS_FIELD_20 + 4 Index: dialin/dg/conductivity_sensors.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/conductivity_sensors.py (.../conductivity_sensors.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/dg/conductivity_sensors.py (.../conductivity_sensors.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -18,6 +18,7 @@ from ..utils.conversions import integer_to_bytearray, float_to_bytearray from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, MsgFldPositions from logging import Logger @@ -28,21 +29,6 @@ Dialysate Generator (DG) Dialin API sub-class for conductivity sensors related commands. """ - # Data message ID - MSG_ID_DG_CONDUCTIVITY_DATA = 0x0031 - - # Override message IDs - MSG_ID_CONDUCTIVITY_OVERRIDE = 0xA015 - MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE = 0xA016 - - # Conductivity sensor broadcast message field positions - START_POS_RO_REJECTION_RATIO = DenaliMessage.PAYLOAD_START_INDEX - END_POS_RO_REJECTION_RATIO = START_POS_RO_REJECTION_RATIO + 4 - START_POS_CS_CPI = END_POS_RO_REJECTION_RATIO - END_POS_CS_CPI = START_POS_CS_CPI + 4 - START_POS_CS_CPO = END_POS_CS_CPI - END_POS_CS_CPO = START_POS_CS_CPO + 4 - def __init__(self, can_interface, logger: Logger): """ @@ -55,7 +41,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_CONDUCTIVITY_DATA + msg_id = MsgIds.MSG_ID_DG_CONDUCTIVITY_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_conductivity_sensors_sync) @@ -89,9 +75,9 @@ @return: None """ - ro_rejection_ratio = struct.unpack('f', bytearray(message['message'][self.START_POS_RO_REJECTION_RATIO:self.END_POS_RO_REJECTION_RATIO])) - cpi = struct.unpack('f', bytearray(message['message'][self.START_POS_CS_CPI:self.END_POS_CS_CPI])) - cpo = struct.unpack('f', bytearray(message['message'][self.START_POS_CS_CPO:self.END_POS_CS_CPO])) + ro_rejection_ratio = struct.unpack('f', bytearray(message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) + cpi = struct.unpack('f', bytearray(message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) + cpo = struct.unpack('f', bytearray(message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) self.ro_rejection_ratio = ro_rejection_ratio[0] self.conductivity_sensor_cpi = cpi[0] @@ -117,7 +103,7 @@ payload = reset_byte_array + cond_byte_array + sensor_byte_array message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_CONDUCTIVITY_OVERRIDE, + message_id=MsgIds.MSG_ID_CONDUCTIVITY_OVERRIDE, payload=payload) if reset == RESET: @@ -151,7 +137,7 @@ payload = reset_byte_array + ms_byte_array message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override DG conductivity sensor broadcast interval") Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r65277463eda63686c6132b6716aaa997b6df1861 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 65277463eda63686c6132b6716aaa997b6df1861) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -7,14 +7,15 @@ # # @file dialysate_generator.py # -# @author (last) Peter Lucia -# @date (last) 20-Jul-2020 +# @author (last) Quang Nguyen +# @date (last) 09-Sep-2020 # @author (original) Peter Lucia # @date (original) 02-Apr-2020 # ############################################################################ import struct from .accelerometer import DGAccelerometer +from .alarms import DGAlarms from .drain_pump import DGDrainPump from .hd_proxy import DGHDProxy from .load_cells import DGLoadCells @@ -25,10 +26,7 @@ from .heaters import Heaters from .temperature_sensors import TemperatureSensors from .conductivity_sensors import ConductivitySensors -from ..protocols.CAN import (DenaliCanMessenger, - DenaliMessage, - DenaliChannels) - +from ..protocols.CAN import (DenaliCanMessenger, DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, _LogManager from ..common.msg_defs import MsgIds, MsgFldPositions @@ -138,6 +136,7 @@ self.heaters = Heaters(self.can_interface, self.logger) self.temperature_sensors = TemperatureSensors(self.can_interface, self.logger) self.conductivity_sensors = ConductivitySensors(self.can_interface, self.logger) + self.alarms = DGAlarms(self.can_interface, self.logger) def get_version(self): """ @@ -291,3 +290,32 @@ self.logger.debug("Timeout!!!!") return False + def cmd_dg_software_reset_request(self): + """ + Constructs and sends an DG software reset request via CAN bus. + Constraints: + Must be logged into DG. + + \returns response message if received, False if no response received + + @return: 1 if successful, zero otherwise + + """ + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=self.MSG_ID_DG_SOFTWARE_RESET_REQUEST) + + self.logger.debug("requesting DG software reset") + + # Send message + received_message = self.can_interface.send(message) + + if received_message is not None: + if received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] == 1: + self.logger.debug("DG is resetting...") + else: + self.logger.debug("DG reset request failed.") + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False Index: dialin/dg/drain_pump.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/drain_pump.py (.../drain_pump.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/dg/drain_pump.py (.../drain_pump.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray +from ..common.msg_defs import MsgIds, MsgFldPositions from .constants import RESET, NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -27,17 +28,6 @@ Dialysate Generator (DG) Dialin API sub-class for drain pump related commands. """ - # Drain pump message IDs - MSG_ID_DG_DRAIN_PUMP_PUBLISHED_DATA = 0x0024 - MSG_ID_DG_DRAIN_PUMP_SET_SPEED_OVERRIDE = 0xA00B - MSG_ID_DG_DRAIN_PUMP_BROADAST_INTERVAL_OVERRIDE = 0xA00C - - # Drain pump broadcast message field positions - START_POS_SET_SPD = DenaliMessage.PAYLOAD_START_INDEX - END_POS_SET_SPD = START_POS_SET_SPD + 4 - START_POS_DAC = END_POS_SET_SPD - END_POS_DAC = START_POS_DAC + 4 - def __init__(self, can_interface, logger: Logger): """ DGDrainPump constructor @@ -49,7 +39,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_DRAIN_PUMP_PUBLISHED_DATA + msg_id = MsgIds.MSG_ID_DG_DRAIN_PUMP_PUBLISHED_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_drain_pump_sync) @@ -82,9 +72,9 @@ """ tgt = struct.unpack('i', bytearray( - message['message'][self.START_POS_SET_SPD:self.END_POS_SET_SPD])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) dac = struct.unpack('i', bytearray( - message['message'][self.START_POS_DAC:self.END_POS_DAC])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) self.target_drain_pump_speed_RPM = tgt[0] self.dac_value = dac[0] @@ -105,7 +95,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_DRAIN_PUMP_SET_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_DG_DRAIN_PUMP_SET_SPEED_OVERRIDE, payload=payload) self.logger.debug("override drain pump speed set point") @@ -145,7 +135,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_DRAIN_PUMP_BROADAST_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_DG_DRAIN_PUMP_BROADAST_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override drain pump data broadcast interval") Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r65277463eda63686c6132b6716aaa997b6df1861 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 65277463eda63686c6132b6716aaa997b6df1861) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -8,7 +8,7 @@ # @file hd_proxy.py # # @author (last) Peter Lucia -# @date (last) 29-Jun-2020 +# @date (last) 26-Aug-2020 # @author (original) Sean # @date (original) 15-Apr-2020 # Index: dialin/dg/heaters.py =================================================================== diff -u -r65277463eda63686c6132b6716aaa997b6df1861 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/heaters.py (.../heaters.py) (revision 65277463eda63686c6132b6716aaa997b6df1861) +++ dialin/dg/heaters.py (.../heaters.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -7,8 +7,8 @@ # # @file heaters.py # -# @author (last) Dara Navaei -# @date (last) 07-Jul-2020 +# @author (last) Peter Lucia +# @date (last) 26-Aug-2020 # @author (original) Dara Navaei # @date (original) 29-May-2020 # Index: dialin/dg/load_cells.py =================================================================== diff -u -r65277463eda63686c6132b6716aaa997b6df1861 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/load_cells.py (.../load_cells.py) (revision 65277463eda63686c6132b6716aaa997b6df1861) +++ dialin/dg/load_cells.py (.../load_cells.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -8,7 +8,7 @@ # @file load_cells.py # # @author (last) Peter Lucia -# @date (last) 22-Jun-2020 +# @date (last) 26-Aug-2020 # @author (original) Sean # @date (original) 14-Apr-2020 # Index: dialin/dg/pressures.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/pressures.py (.../pressures.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/dg/pressures.py (.../pressures.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -15,6 +15,7 @@ ############################################################################ import struct from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..common.msg_defs import MsgIds, MsgFldPositions from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -27,21 +28,6 @@ DG interface containing pressure related commands. """ - # Pressure message IDs - MSG_ID_DG_PRESSURES_DATA = 0x0020 - MSG_ID_DG_PRESSURE_OVERRIDE = 0xA006 - MSG_ID_DG_PRESSURE_DATA_BROADCAST_INTERVAL_OVERRIDE = 0xA007 - - # Pressure broadcast message field positions - START_POS_RO_INLET_PRES = DenaliMessage.PAYLOAD_START_INDEX - END_POS_RO_INLET_PRES = START_POS_RO_INLET_PRES + 4 - START_POS_RO_OUTLET_PRES = END_POS_RO_INLET_PRES - END_POS_RO_OUTLET_PRES = START_POS_RO_OUTLET_PRES + 4 - START_POS_DRAIN_INLET_PRES = END_POS_RO_OUTLET_PRES - END_POS_DRAIN_INLET_PRES = START_POS_DRAIN_INLET_PRES + 4 - START_POS_DRAIN_OUTLET_PRES = END_POS_DRAIN_INLET_PRES - END_POS_DRAIN_OUTLET_PRES = START_POS_DRAIN_OUTLET_PRES + 4 - # Pressure Sensor IDs PRESSURE_SENSOR_RO_PUMP_INLET = 0 PRESSURE_SENSOR_RO_PUMP_OUTLET = 1 @@ -60,7 +46,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_PRESSURES_DATA + msg_id = MsgIds.MSG_ID_DG_PRESSURES_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pressures_sync) @@ -96,13 +82,13 @@ """ roi = struct.unpack('f', bytearray( - message['message'][self.START_POS_RO_INLET_PRES:self.END_POS_RO_INLET_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) roo = struct.unpack('f', bytearray( - message['message'][self.START_POS_RO_OUTLET_PRES:self.END_POS_RO_OUTLET_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) dri = struct.unpack('f', bytearray( - message['message'][self.START_POS_DRAIN_INLET_PRES:self.END_POS_DRAIN_INLET_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) dro = struct.unpack('f', bytearray( - message['message'][self.START_POS_DRAIN_OUTLET_PRES:self.END_POS_DRAIN_OUTLET_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) self.ro_pump_inlet_pressure = roi[0] self.ro_pump_outlet_pressure = roo[0] @@ -134,7 +120,7 @@ payload = rst + prs + idx message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_PRESSURE_OVERRIDE, + message_id=MsgIds.MSG_ID_DG_PRESSURE_OVERRIDE, payload=payload) self.logger.debug("override pressure sensor") @@ -168,7 +154,7 @@ payload = rst + ivl message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_PRESSURE_DATA_BROADCAST_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_DG_PRESSURE_DATA_BROADCAST_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override pressure data broadcast interval") Index: dialin/dg/reservoirs.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/reservoirs.py (.../reservoirs.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/dg/reservoirs.py (.../reservoirs.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -17,6 +17,7 @@ from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, MsgFldPositions from logging import Logger @@ -25,17 +26,6 @@ DG interface containing reservoir related commands. """ - # Reservoir message IDs - MSG_ID_DG_RESERVOIR_DATA = 0x0028 - - # Reservoir broadcast message field positions - START_POS_ACT_RES = DenaliMessage.PAYLOAD_START_INDEX - END_POS_ACT_RES = START_POS_ACT_RES + 4 - START_POS_FILL_TO_VOL = END_POS_ACT_RES - END_POS_FILL_TO_VOL = START_POS_FILL_TO_VOL + 4 - START_POS_DRAIN_TO_VOL = END_POS_FILL_TO_VOL - END_POS_DRAIN_TO_VOL = START_POS_DRAIN_TO_VOL + 4 - # Reservoir IDs RESERVOIR1 = 0 RESERVOIR2 = 1 @@ -52,7 +42,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_RESERVOIR_DATA + msg_id = MsgIds.MSG_ID_DG_RESERVOIR_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_reservoirs_sync) @@ -100,11 +90,11 @@ """ res = struct.unpack('i', bytearray( - message['message'][self.START_POS_ACT_RES:self.END_POS_ACT_RES])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) fil = struct.unpack('i', bytearray( - message['message'][self.START_POS_FILL_TO_VOL:self.END_POS_FILL_TO_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) dra = struct.unpack('i', bytearray( - message['message'][self.START_POS_DRAIN_TO_VOL:self.END_POS_DRAIN_TO_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) self.active_reservoir = res[0] self.fill_to_vol_ml = fil[0] Index: dialin/dg/ro_pump.py =================================================================== diff -u -r65277463eda63686c6132b6716aaa997b6df1861 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision 65277463eda63686c6132b6716aaa997b6df1861) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -7,8 +7,8 @@ # # @file ro_pump.py # -# @author (last) Dara Navaei -# @date (last) 01-Jul-2020 +# @author (last) Peter Lucia +# @date (last) 26-Aug-2020 # @author (original) Sean # @date (original) 14-Apr-2020 # Index: dialin/dg/temperature_sensors.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -16,6 +16,7 @@ import struct from ..utils.conversions import integer_to_bytearray from ..utils.conversions import float_to_bytearray +from ..common.msg_defs import MsgIds, MsgFldPositions from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish @@ -40,47 +41,6 @@ class TemperatureSensors(_AbstractSubSystem): - MSG_ID_DG_TEMPERATURE_DATA = 0x2D - MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE = 0xA012 - MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE = 0xA010 - - # Inlet primary temperature sensor - START_POS_INLET_PRIMARY_TEMP = DenaliMessage.PAYLOAD_START_INDEX - END_POS_INLET_PRIMARY_TEMP = START_POS_INLET_PRIMARY_TEMP + 4 - # Outlet primary temperature sensor - START_POS_OUTLET_PRIMARY_TEMP = END_POS_INLET_PRIMARY_TEMP - END_POS_OUTLET_PRIMARY_TEMP = START_POS_OUTLET_PRIMARY_TEMP + 4 - # Conductivity sensor 1 temperature sensor - START_POS_CD1_TEMP = END_POS_OUTLET_PRIMARY_TEMP - END_POS_CD1_TEMP = START_POS_CD1_TEMP + 4 - # Conductivity sensor 2 temperature sensor - START_POS_CD2_TEMP = END_POS_CD1_TEMP - END_POS_CD2_TEMP = START_POS_CD2_TEMP + 4 - # Outlet redundancy temperature sensor - START_POS_OUTLET_REDUNDANCY_TEMP = END_POS_CD2_TEMP - END_POS_OUTLET_REDUNDANCY_TEMP = START_POS_OUTLET_REDUNDANCY_TEMP + 4 - # Dialysate inlet temperature sensor - START_POS_INLET_DIALYSATE_TEMP = END_POS_OUTLET_REDUNDANCY_TEMP - END_POS_INLET_DIALYSATE_TEMP = START_POS_INLET_DIALYSATE_TEMP + 4 - # Primary heater thermocouple temperature sensor - START_POS_PRI_TC_TEMP = END_POS_INLET_DIALYSATE_TEMP - END_POS_PRI_TC_TEMP = START_POS_PRI_TC_TEMP + 4 - # Trimmer heater thermocouple temperature sensor - START_POS_TRI_TC_TEMP = END_POS_PRI_TC_TEMP - END_POS_TRI_TC_TEMP = START_POS_TRI_TC_TEMP + 4 - # Primary heater cold junction temperature sensor - START_POS_PRI_CJ_TEMP = END_POS_TRI_TC_TEMP - END_POS_PRI_CJ_TEMP = START_POS_PRI_CJ_TEMP + 4 - # Trimmer heater cold junction temperature sensor - START_POS_TRI_CJ_TEMP = END_POS_PRI_CJ_TEMP - END_POS_TRI_CJ_TEMP = START_POS_TRI_CJ_TEMP + 4 - # Primary heater internal temperature - START_POS_PRI_INTERNAL_TEMP = END_POS_TRI_CJ_TEMP - END_POS_PRI_INTERNAL_TEMP = START_POS_PRI_INTERNAL_TEMP + 4 - # Trimmer heater internal temperature - START_POS_TRI_INTERNAL_TEMP = END_POS_PRI_INTERNAL_TEMP - END_POS_TRI_INTERNAL_TEMP = START_POS_TRI_INTERNAL_TEMP + 4 - def __init__(self, can_interface, logger: Logger): super().__init__() @@ -102,7 +62,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_TEMPERATURE_DATA + msg_id = MsgIds.MSG_ID_DG_TEMPERATURE_DATA self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_temperature_sensors_sync) @_publish(["inlet_primary", "outlet_primary", "cd1", "cd2","outlet_redundancy", "inlet_dialysate", "primary_tc", @@ -115,51 +75,51 @@ @returns none """ sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_INLET_PRIMARY_TEMP:self.END_POS_INLET_PRIMARY_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) self.inlet_primary = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_OUTLET_PRIMARY_TEMP:self.END_POS_OUTLET_PRIMARY_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) self.outlet_primary = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_CD1_TEMP:self.END_POS_CD1_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) self.cd1 = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_CD2_TEMP:self.END_POS_CD2_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) self.cd2 = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_OUTLET_REDUNDANCY_TEMP:self.END_POS_OUTLET_REDUNDANCY_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) self.outlet_redundancy = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_INLET_DIALYSATE_TEMP:self.END_POS_INLET_DIALYSATE_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) self.inlet_dialysate = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_PRI_TC_TEMP:self.END_POS_PRI_TC_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) self.primary_tc = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_TRI_TC_TEMP:self.END_POS_TRI_TC_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_8:MsgFldPositions.END_POS_FIELD_8])) self.trimmer_tc = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_PRI_CJ_TEMP:self.END_POS_PRI_CJ_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_9:MsgFldPositions.END_POS_FIELD_9])) self.primary_cj = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_TRI_CJ_TEMP:self.END_POS_TRI_CJ_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_10:MsgFldPositions.END_POS_FIELD_10])) self.trimmer_cj = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_PRI_INTERNAL_TEMP:self.END_POS_PRI_INTERNAL_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_11:MsgFldPositions.END_POS_FIELD_11])) self.primary_internal = sensors_data[0] sensors_data = struct.unpack('f', bytearray( - message['message'][self.START_POS_TRI_INTERNAL_TEMP:self.END_POS_TRI_INTERNAL_TEMP])) + message['message'][MsgFldPositions.START_POS_FIELD_12:MsgFldPositions.END_POS_FIELD_12])) self.trimmer_internal = sensors_data[0] def cmd_temperature_sensors_broadcast_interval_override(self, ms, reset=NO_RESET): @@ -178,7 +138,7 @@ payload = reset_value + interval_value message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_TEMPERATURE_SENSORS_PUBLISH_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("Sending {} ms publish interval to the Temperature Sensors module".format(ms)) @@ -225,7 +185,7 @@ payload = rst + value + index message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE, + message_id=MsgIds.MSG_ID_TEMPERATURE_SENSORS_VALUE_OVERRIDE, payload=payload) self.logger.debug("Setting sensor {} to {} C".format(sensor_index, sensor_value)) Index: dialin/dg/valves.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/dg/valves.py (.../valves.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/dg/valves.py (.../valves.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -16,6 +16,7 @@ import struct from ..utils.conversions import integer_to_bytearray +from ..common.msg_defs import MsgIds from .constants import NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish @@ -31,11 +32,6 @@ Dialysate Generation (DG) interface for valve related commands. """ - # Valve state message IDs - MSG_ID_DG_VALVES_STATES = 0x2A - MSG_ID_DG_VALVE_STATE_OVERRIDE = 0xA00E - MSG_ID_DG_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE = 0xA00F - # Valves states publish message field positions START_POS_VALVES_STATES = DenaliMessage.PAYLOAD_START_INDEX END_POS_VALVES_STATES = START_POS_VALVES_STATES + 2 # Valves States come in as a U16 value (2 bytes) @@ -67,7 +63,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_VALVES_STATES + msg_id = MsgIds.MSG_ID_DG_VALVES_STATES self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_valves_sync) self.valve_states_all = 0x0000 @@ -258,7 +254,7 @@ payload = rst + ste + vlv message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_VALVE_STATE_OVERRIDE, + message_id=MsgIds.MSG_ID_DG_VALVE_STATE_OVERRIDE, payload=payload) self.logger.debug("override valve state") @@ -292,7 +288,7 @@ payload = rst + ivl message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_DG_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override valves states publish interval") Index: dialin/hd/alarms.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/alarms.py (.../alarms.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/hd/alarms.py (.../alarms.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -17,6 +17,7 @@ DenaliChannels) from ..utils.conversions import integer_to_bytearray from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds from .constants import RESET, NO_RESET from collections import OrderedDict import struct @@ -29,14 +30,6 @@ HD interface containing alarm related commands. """ - # alarms message IDs - MSG_ID_HD_ALARMS_PUBLISHED_STATUS = 0x0002 - MSG_ID_HD_ALARM_ACTIVATE = 0x0003 - MSG_ID_HD_ALARM_CLEAR = 0x0004 - MSG_ID_HD_ALARM_LAMP_OVERRIDE = 0x8004 - MSG_ID_HD_ALARM_STATE_OVERRIDE = 0x8006 - MSG_ID_HD_ALARM_TIME_OVERRIDE = 0x8007 - # Alarm lamp patterns HD_ALARM_LAMP_PATTERN_OFF = 0 HD_ALARM_LAMP_PATTERN_OK = 1 @@ -67,68 +60,6 @@ START_POS_ALARM_ID = DenaliMessage.PAYLOAD_START_INDEX END_POS_ALARM_ID = START_POS_ALARM_ID + 2 - # See AlarmDefs.h - ALARM_ID_NO_ALARM = 0 - ALARM_ID_SOFTWARE_FAULT = 1 - ALARM_ID_STUCK_BUTTON_TEST_FAILED = 2 - ALARM_ID_FPGA_POST_TEST_FAILED = 3 - ALARM_ID_WATCHDOG_POST_TEST_FAILED = 4 - ALARM_ID_UI_COMM_POST_FAILED = 5 - ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK = 6 - ALARM_ID_BLOOD_PUMP_OFF_CHECK = 7 - ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK = 8 - ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK = 9 - ALARM_ID_DIAL_IN_PUMP_MC_CURRENT_CHECK = 10 - ALARM_ID_DIAL_IN_PUMP_OFF_CHECK = 11 - ALARM_ID_DIAL_IN_PUMP_MC_DIRECTION_CHECK = 12 - ALARM_ID_DIAL_IN_PUMP_ROTOR_SPEED_CHECK = 13 - ALARM_ID_DIAL_OUT_PUMP_MC_CURRENT_CHECK = 14 - ALARM_ID_DIAL_OUT_PUMP_OFF_CHECK = 15 - ALARM_ID_DIAL_OUT_PUMP_MC_DIRECTION_CHECK = 16 - ALARM_ID_DIAL_OUT_PUMP_ROTOR_SPEED_CHECK = 17 - ALARM_ID_WATCHDOG_EXPIRED = 18 - ALARM_ID_RTC_COMM_ERROR = 19 - ALARM_ID_RTC_CONFIG_ERROR = 20 - ALARM_ID_DG_COMM_TIMEOUT = 21 - ALARM_ID_UI_COMM_TIMEOUT = 22 - ALARM_ID_COMM_TOO_MANY_BAD_CRCS = 23 - ALARM_ID_TREATMENT_STOPPED_BY_USER = 24 - ALARM_ID_BLOOD_SITTING_WARNING = 25 - ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RESUME = 26 - ALARM_ID_BLOOD_SITTING_TOO_LONG_NO_RINSEBACK = 27 - ALARM_ID_CAN_MESSAGE_NOT_ACKED = 28 - ALARM_ID_OCCLUSION_BLOOD_PUMP = 29 - ALARM_ID_OCCLUSION_DIAL_IN_PUMP = 30 - ALARM_ID_OCCLUSION_DIAL_OUT_PUMP = 31 - ALARM_ID_ARTERIAL_PRESSURE_LOW = 32 - ALARM_ID_ARTERIAL_PRESSURE_HIGH = 33 - ALARM_ID_VENOUS_PRESSURE_LOW = 34 - ALARM_ID_VENOUS_PRESSURE_HIGH = 35 - ALARM_ID_UF_RATE_TOO_HIGH_ERROR = 36 - ALARM_ID_UF_VOLUME_ACCURACY_ERROR = 37 - ALARM_ID_RTC_BATTERY_LOW = 38 - ALARM_ID_RTC_OR_TIMER_ACCURACY_FAILURE = 39 - ALARM_ID_RTC_RAM_OPS_ERROR = 40 - ALARM_ID_NVDATA_EEPROM_OPS_FAILURE = 41 - ALARM_ID_NVDATA_MFG_RECORD_CRC_ERROR = 42 - ALARM_ID_NVDATA_SRVC_RECORD_CRC_ERROR = 43 - ALARM_ID_NVDATA_CAL_RECORD_CRC_ERROR = 44 - ALARM_ID_NVDATA_HW_USAGE_DATA_CRC_ERROR = 45 - AlARM_ID_NVDATA_DISINFECTION_DATE_CRC_ERROR = 46 - ALARM_ID_RO_PUMP_OUT_PRESSURE_OUT_OF_RANGE = 47 - ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE = 48 - ALARM_ID_TEMPERATURE_SENSORS_INCONSISTENT = 49 - ALARM_ID_HD_COMM_TIMEOUT = 50 - ALARM_ID_VALVE_CONTROL_FAILURE = 51 - ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 52 - ALARM_ID_DIAL_IN_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 53 - ALARM_ID_DIAL_OUT_PUMP_FLOW_VS_MOTOR_SPEED_CHECK = 54 - ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK = 55 - ALARM_ID_DIAL_IN_PUMP_MOTOR_SPEED_CHECK = 56 - ALARM_ID_DIAL_OUT_PUMP_MOTOR_SPEED_CHECK = 57 - ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH = 58 - ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE = 59 - def __init__(self, can_interface, logger: Logger): """ @param can_interface: Denali Can Messenger object @@ -139,16 +70,16 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_alarm_broadcast_ch_id - msg_id = self.MSG_ID_HD_ALARMS_PUBLISHED_STATUS + msg_id = MsgIds.MSG_ID_ALARM_STATUS self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_alarms_status_sync) channel_id = DenaliChannels.hd_alarm_broadcast_ch_id - msg_id = self.MSG_ID_HD_ALARM_ACTIVATE + msg_id = MsgIds.MSG_ID_ALARM_TRIGGERED self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_alarm_activate) channel_id = DenaliChannels.hd_alarm_broadcast_ch_id - msg_id = self.MSG_ID_HD_ALARM_CLEAR + msg_id = MsgIds.MSG_ID_ALARM_CLEARED self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_alarm_clear) @@ -163,10 +94,10 @@ self.alarm_states = [False] * 500 self.ids = OrderedDict() - for attr in dir(AlarmList): - if not callable(getattr(AlarmList, attr)) and attr.startswith("ALARM_ID"): - self.ids[attr] = getattr(AlarmList, attr) - self.ids = OrderedDict(sorted(self.ids.items(), key=lambda key: key[1].value)) +# for attr in dir(AlarmList): +# if not callable(getattr(AlarmList, attr)) and attr.startswith("ALARM_ID"): +# self.ids[attr] = getattr(AlarmList, attr) +# self.ids = OrderedDict(sorted(self.ids.items(), key=lambda key: key[1].value)) def get_alarm_states(self): """ @@ -306,7 +237,7 @@ payload = rst + sta + alm message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_ALARM_STATE_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_ALARM_STATE_OVERRIDE, payload=payload) # Send message @@ -342,7 +273,7 @@ payload = rst + ms + alm message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_ALARM_TIME_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_ALARM_TIME_OVERRIDE, payload=payload) self.logger.debug("override alarm time since activated") @@ -390,7 +321,7 @@ payload = rst + pat message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_ALARM_LAMP_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_ALARM_LAMP_OVERRIDE, payload=payload) self.logger.debug("Override Alarm Lamp Pattern") Index: dialin/hd/blood_flow.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/blood_flow.py (.../blood_flow.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/hd/blood_flow.py (.../blood_flow.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -19,6 +19,7 @@ from .constants import RESET, NO_RESET from .constants import PUMP_CONTROL_MODE_CLOSED_LOOP, PUMP_CONTROL_MODE_OPEN_LOOP from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, MsgFldPositions import struct from logging import Logger @@ -31,33 +32,6 @@ """ - # bloodflow message IDs - MSG_ID_HD_BLOOD_FLOW_PUBLISHED_DATA = 0x0005 - MSG_ID_HD_BLOOD_FLOW_SET_RATE_OVERRIDE = 0x8008 - MSG_ID_HD_BLOOD_FLOW_MEAS_RATE_OVERRIDE = 0x8009 - MSG_ID_HD_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x800A - MSG_ID_HD_BLOOD_PUMP_MC_MEAS_CURRENT_OVERRIDE = 0x800B - MSG_ID_HD_BLOOD_FLOW_PUBLISH_INTERVAL_OVERRIDE = 0x800C - MSG_ID_HD_BLOOD_PUMP_MEAS_SPEED_OVERRIDE = 0x800E - MSG_ID_HD_BLOOD_PUMP_ROTOR_MEAS_SPEED_OVERRIDE = 0x800F - MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION = 0x802B - - # bloodflow broadcast message field positions - START_POS_SET_PT = DenaliMessage.PAYLOAD_START_INDEX - END_POS_SET_PT = START_POS_SET_PT + 4 - START_POS_MEAS_FLOW = END_POS_SET_PT - END_POS_MEAS_FLOW = START_POS_MEAS_FLOW + 4 - START_POS_MEAS_ROT_SPEED = END_POS_MEAS_FLOW - END_POS_MEAS_ROT_SPEED = START_POS_MEAS_ROT_SPEED + 4 - START_POS_MEAS_SPEED = END_POS_MEAS_ROT_SPEED - END_POS_MEAS_SPEED = START_POS_MEAS_SPEED + 4 - START_POS_MEAS_MC_SPEED = END_POS_MEAS_SPEED - END_POS_MEAS_MC_SPEED = START_POS_MEAS_MC_SPEED + 4 - START_POS_MEAS_MC_CURR = END_POS_MEAS_MC_SPEED - END_POS_MEAS_MC_CURR = START_POS_MEAS_MC_CURR + 4 - START_POS_PWM_DC = END_POS_MEAS_MC_CURR - END_POS_PWM_DC = START_POS_PWM_DC + 4 - def __init__(self, can_interface, logger: Logger): """ HD_BloodFlow constructor @@ -68,7 +42,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_sync_broadcast_ch_id - msg_id = self.MSG_ID_HD_BLOOD_FLOW_PUBLISHED_DATA + msg_id = MsgIds.MSG_ID_BLOOD_FLOW_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_blood_flow_sync) @@ -148,24 +122,20 @@ @return: none """ - # self.target_blood_flow_rate = int.from_bytes(bytearray( - # message['message'][self.START_POS_SET_PT:self.END_POS_SET_PT]), - # byteorder=DenaliMessage.BYTE_ORDER) tgt = struct.unpack('i', bytearray( - message['message'][self.START_POS_SET_PT:self.END_POS_SET_PT])) - + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) flow = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_FLOW:self.END_POS_MEAS_FLOW])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) rotor = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_ROT_SPEED:self.END_POS_MEAS_ROT_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) speed = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_SPEED:self.END_POS_MEAS_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) mcspeed = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_MC_SPEED:self.END_POS_MEAS_MC_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) mccurr = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_MC_CURR:self.END_POS_MEAS_MC_CURR])) + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) pwm = struct.unpack('f', bytearray( - message['message'][self.START_POS_PWM_DC:self.END_POS_PWM_DC])) + message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) self.target_blood_flow_rate = tgt[0] self.measured_blood_flow_rate = flow[0] @@ -194,7 +164,7 @@ payload = rst + flo + mod message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_FLOW_SET_RATE_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_FLOW_SET_RATE_OVERRIDE, payload=payload) self.logger.debug("override blood flow set point") @@ -238,7 +208,7 @@ payload = rst + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_FLOW_MEAS_RATE_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_FLOW_MEAS_RATE_OVERRIDE, payload=payload) self.logger.debug("override measured blood flow") @@ -278,7 +248,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_PUMP_MC_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured blood pump motor controller speed") @@ -317,7 +287,7 @@ payload = rst + cur message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_PUMP_MC_MEAS_CURRENT_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_PUMP_MC_MEAS_CURRENT_OVERRIDE, payload=payload) self.logger.debug("override measured blood pump motor controller current") @@ -357,7 +327,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_PUMP_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_PUMP_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured blood pump speed") @@ -397,7 +367,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_PUMP_ROTOR_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_PUMP_ROTOR_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured blood pump rotor speed") @@ -437,7 +407,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_FLOW_PUBLISH_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_BLOOD_FLOW_PUBLISH_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override blood flow broadcast interval") @@ -471,7 +441,7 @@ payload = gan + off message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION, + message_id=MsgIds.MSG_ID_HD_BLOOD_FLOW_SET_CALIBRATION, payload=payload) print("Setting blood flow calibration factors") Index: dialin/hd/buttons.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/buttons.py (.../buttons.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/hd/buttons.py (.../buttons.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -17,6 +17,7 @@ DenaliCanMessenger, DenaliChannels) from ..utils.conversions import integer_to_bytearray +from ..common.msg_defs import MsgIds from .constants import RESET, NO_RESET from ..utils.base import _AbstractSubSystem, _publish from logging import Logger @@ -31,14 +32,6 @@ START_POS_POWEROFF = DenaliMessage.PAYLOAD_START_INDEX END_POS_POWEROFF_STATUS = START_POS_POWEROFF + 2 - # buttons message IDs - MSG_ID_HD_OFF_BUTTON_OVERRIDE = 0x8002 - MSG_ID_HD_STOP_BUTTON_OVERRIDE = 0x8003 - - MSG_ID_HD_POWEROFF_OPEN = 0x01 - MSG_ID_HD_POWEROFF_TIMEOUT = 0x01 - MSG_ID_HD_POWEROFF_BROADCAST = 0x000E - PRESSED = 1 RELEASED = 0 @@ -56,7 +49,7 @@ if self.can_interface is not None: self.can_interface.register_receiving_publication_function(DenaliChannels.hd_to_ui_ch_id, - self.MSG_ID_HD_POWEROFF_TIMEOUT, + MsgIds.MSG_ID_OFF_BUTTON_PRESS, self._handler_poweroff_timeout_occurred) def get_power_timeout_expired(self): @@ -113,7 +106,7 @@ payload = rst + sta message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_OFF_BUTTON_OVERRIDE, + message_id=MsgIds.MSG_ID_OFF_BUTTON_STATE_OVERRIDE, payload=payload) self.logger.debug("override off button") @@ -154,7 +147,7 @@ payload = rst + sta message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_STOP_BUTTON_OVERRIDE, + message_id=MsgIds.MSG_ID_STOP_BUTTON_STATE_OVERRIDE, payload=payload) self.logger.debug("override stop button") Index: dialin/hd/dialysate_inlet_flow.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/dialysate_inlet_flow.py (.../dialysate_inlet_flow.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/hd/dialysate_inlet_flow.py (.../dialysate_inlet_flow.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -20,6 +20,7 @@ from .constants import RESET, NO_RESET from .constants import PUMP_CONTROL_MODE_CLOSED_LOOP, PUMP_CONTROL_MODE_OPEN_LOOP from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, MsgFldPositions from logging import Logger class HDDialysateInletFlow(_AbstractSubSystem): @@ -30,33 +31,6 @@ """ - # DialysateFlow message IDs - MSG_ID_HD_DIAL_IN_FLOW_PUBLISHED_DATA = 0x0008 - MSG_ID_HD_DIAL_IN_FLOW_SET_RATE_OVERRIDE = 0x8010 - MSG_ID_HD_DIAL_IN_FLOW_MEAS_RATE_OVERRIDE = 0x8011 - MSG_ID_HD_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x8012 - MSG_ID_HD_DIAL_IN_PUMP_MC_MEAS_CURRENT_OVERRIDE = 0x8013 - MSG_ID_HD_DIAL_IN_FLOW_PUBLISH_INTERVAL_OVERRIDE = 0x8014 - MSG_ID_HD_DIAL_IN_PUMP_MEAS_SPEED_OVERRIDE = 0x8015 - MSG_ID_HD_DIAL_IN_PUMP_ROTOR_MEAS_SPEED_OVERRIDE = 0x8016 - MSG_ID_HD_DIAL_IN_FLOW_SET_CALIBRATION = 0x802C - - # bloodflow broadcast message field positions - START_POS_SET_PT = DenaliMessage.PAYLOAD_START_INDEX - END_POS_SET_PT = START_POS_SET_PT + 4 - START_POS_MEAS_FLOW = END_POS_SET_PT - END_POS_MEAS_FLOW = START_POS_MEAS_FLOW + 4 - START_POS_MEAS_ROT_SPEED = END_POS_MEAS_FLOW - END_POS_MEAS_ROT_SPEED = START_POS_MEAS_ROT_SPEED + 4 - START_POS_MEAS_SPEED = END_POS_MEAS_ROT_SPEED - END_POS_MEAS_SPEED = START_POS_MEAS_SPEED + 4 - START_POS_MEAS_MC_SPEED = END_POS_MEAS_SPEED - END_POS_MEAS_MC_SPEED = START_POS_MEAS_MC_SPEED + 4 - START_POS_MEAS_MC_CURR = END_POS_MEAS_MC_SPEED - END_POS_MEAS_MC_CURR = START_POS_MEAS_MC_CURR + 4 - START_POS_PWM_DC = END_POS_MEAS_MC_CURR - END_POS_PWM_DC = START_POS_PWM_DC + 4 - def __init__(self, can_interface, logger: Logger): """ HD_DialysateFlow constructor @@ -68,7 +42,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_sync_broadcast_ch_id - msg_id = self.MSG_ID_HD_DIAL_IN_FLOW_PUBLISHED_DATA + msg_id = MsgIds.MSG_ID_DIALYSATE_FLOW_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_dialysate_inlet_flow_sync) @@ -153,22 +127,22 @@ @return: none """ - self.target_dialysate_inlet_flow_rate = int.from_bytes(bytearray( - message['message'][self.START_POS_SET_PT:self.END_POS_SET_PT]), - byteorder=DenaliMessage.BYTE_ORDER) + tgt = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) flow = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_FLOW:self.END_POS_MEAS_FLOW])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) rotor = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_ROT_SPEED:self.END_POS_MEAS_ROT_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) speed = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_SPEED:self.END_POS_MEAS_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) mcspeed = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_MC_SPEED:self.END_POS_MEAS_MC_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) mccurr = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_MC_CURR:self.END_POS_MEAS_MC_CURR])) + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) pwm = struct.unpack('f', bytearray( - message['message'][self.START_POS_PWM_DC:self.END_POS_PWM_DC])) + message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) + self.target_dialysate_inlet_flow_rate = tgt[0] self.measured_dialysate_inlet_flow_rate = flow[0] self.measured_dialysate_inlet_pump_rotor_speed = rotor[0] self.measured_dialysate_inlet_pump_speed = speed[0] @@ -195,7 +169,7 @@ payload = rst + flo + mod message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_FLOW_SET_RATE_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_FLOW_SET_RATE_OVERRIDE, payload=payload) self.logger.debug("override dialysate flow set point") @@ -239,7 +213,7 @@ payload = rst + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_FLOW_MEAS_RATE_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_FLOW_MEAS_RATE_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate flow") @@ -279,7 +253,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_PUMP_MC_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate inlet pump motor controller speed") @@ -318,7 +292,7 @@ payload = rst + cur message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_PUMP_MC_MEAS_CURRENT_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_PUMP_MC_MEAS_CURRENT_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate inlet pump motor controller current") @@ -358,7 +332,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_PUMP_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_PUMP_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate inlet pump speed") @@ -398,7 +372,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_PUMP_ROTOR_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_PUMP_ROTOR_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate inlet pump rotor speed") @@ -438,7 +412,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_FLOW_PUBLISH_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_FLOW_PUBLISH_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override dialysate inlet flow broadcast interval") @@ -471,7 +445,7 @@ payload = gan + off message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_IN_FLOW_SET_CALIBRATION, + message_id=MsgIds.MSG_ID_HD_DIAL_IN_FLOW_SET_CALIBRATION, payload=payload) print("Setting dialysate flow calibration factors") Index: dialin/hd/dialysate_outlet_flow.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/hd/dialysate_outlet_flow.py (.../dialysate_outlet_flow.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -20,6 +20,8 @@ from .constants import RESET, NO_RESET from .constants import PUMP_CONTROL_MODE_CLOSED_LOOP, PUMP_CONTROL_MODE_OPEN_LOOP from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, MsgFldPositions + from logging import Logger @@ -28,35 +30,6 @@ Hemodialysis Device (HD) Dialin API sub-class for dialysate outlet pump related commands. """ - # DialysateFlow message IDs - MSG_ID_HD_DIAL_OUT_FLOW_PUBLISHED_DATA = 0x000B - MSG_ID_HD_LOAD_CELL_READINGS = 0x000C - MSG_ID_HD_DIAL_OUT_FLOW_SET_RATE_OVERRIDE = 0x8001 - MSG_ID_HD_DIAL_OUT_FLOW_PUBLISH_INTERVAL_OVERRIDE = 0x801E - MSG_ID_HD_DIAL_OUT_UF_REF_VOLUME_OVERRIDE = 0x801F - MSG_ID_HD_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE = 0x8020 - MSG_ID_HD_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE = 0x8021 - MSG_ID_HD_DIAL_OUT_PUMP_MC_MEAS_CURRENT_OVERRIDE = 0x8022 - MSG_ID_HD_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE = 0x8023 - MSG_ID_HD_DIAL_OUT_PUMP_ROTOR_MEAS_SPEED_OVERRIDE = 0x8024 - MSG_ID_HD_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE = 0x8025 - - # bloodflow broadcast message field positions - START_POS_REF_VOL = DenaliMessage.PAYLOAD_START_INDEX - END_POS_REF_VOL = START_POS_REF_VOL + 4 - START_POS_MEAS_VOL = END_POS_REF_VOL - END_POS_MEAS_VOL = START_POS_MEAS_VOL + 4 - START_POS_MEAS_ROT_SPEED = END_POS_MEAS_VOL - END_POS_MEAS_ROT_SPEED = START_POS_MEAS_ROT_SPEED + 4 - START_POS_MEAS_SPEED = END_POS_MEAS_ROT_SPEED - END_POS_MEAS_SPEED = START_POS_MEAS_SPEED + 4 - START_POS_MEAS_MC_SPEED = END_POS_MEAS_SPEED - END_POS_MEAS_MC_SPEED = START_POS_MEAS_MC_SPEED + 4 - START_POS_MEAS_MC_CURR = END_POS_MEAS_MC_SPEED - END_POS_MEAS_MC_CURR = START_POS_MEAS_MC_CURR + 4 - START_POS_PWM_DC = END_POS_MEAS_MC_CURR - END_POS_PWM_DC = START_POS_PWM_DC + 4 - def __init__(self, can_interface, logger: Logger): """ HDDialysateFlow constructor @@ -67,7 +40,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_sync_broadcast_ch_id - msg_id = self.MSG_ID_HD_DIAL_OUT_FLOW_PUBLISHED_DATA + msg_id = MsgIds.MSG_ID_DIALYSATE_OUT_FLOW_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_dialysate_outlet_flow_sync) @@ -152,19 +125,19 @@ """ refvol = struct.unpack('f', bytearray( - message['message'][self.START_POS_REF_VOL:self.END_POS_REF_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) measvol = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_VOL:self.END_POS_MEAS_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) rotor = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_ROT_SPEED:self.END_POS_MEAS_ROT_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) speed = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_SPEED:self.END_POS_MEAS_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) mcspeed = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_MC_SPEED:self.END_POS_MEAS_MC_SPEED])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) mccurr = struct.unpack('f', bytearray( - message['message'][self.START_POS_MEAS_MC_CURR:self.END_POS_MEAS_MC_CURR])) + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) pwm = struct.unpack('f', bytearray( - message['message'][self.START_POS_PWM_DC:self.END_POS_PWM_DC])) + message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) self.reference_dialysate_outlet_uf_volume = refvol[0] self.measured_dialysate_outlet_uf_volume = measvol[0] @@ -193,7 +166,7 @@ payload = rst + flo + mod message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_FLOW_SET_RATE_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_FLOW_SET_RATE_OVERRIDE, payload=payload) print("override dialysate outlet pump set point") @@ -237,7 +210,7 @@ payload = rst + vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_UF_REF_VOLUME_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_UF_REF_VOLUME_OVERRIDE, payload=payload) self.logger.debug("override UF reference volume with " + str(refvol) + "mL.") @@ -277,7 +250,7 @@ payload = rst + vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_UF_MEAS_VOLUME_OVERRIDE, payload=payload) self.logger.debug("override measured UF volume with " + str(measvol) + " mL.") @@ -317,7 +290,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.measured_dialysate_outlet_pump_mc_speed, + message_id=MsgIds.MSG_ID_DIAL_OUT_PUMP_MC_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate outlet pump motor controller speed to " + str(spd) + " RPM.") @@ -356,7 +329,7 @@ payload = rst + cur message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_PUMP_MC_MEAS_CURRENT_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_PUMP_MC_MEAS_CURRENT_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate outlet pump motor controller current") @@ -396,7 +369,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_PUMP_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate outlet pump speed to " + str(speed) + " RPM.") @@ -436,7 +409,7 @@ payload = rst + spd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_PUMP_ROTOR_MEAS_SPEED_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_PUMP_ROTOR_MEAS_SPEED_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate outlet pump rotor speed to " + str(speed) + " RPM.") @@ -476,7 +449,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_FLOW_PUBLISH_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_FLOW_PUBLISH_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override dialysate outlet flow broadcast interval to " + str(ms) + " ms.") @@ -524,7 +497,7 @@ payload = rst + spd + sen message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_DIAL_OUT_LOAD_CELL_WEIGHT_OVERRIDE, payload=payload) self.logger.debug("override measured load cell weight to " + str(weight) + " grams for load cell # " + str(sensor)) @@ -565,7 +538,7 @@ payload = r1pb + r1bb + r2pb + r2bb message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_LOAD_CELL_READINGS, + message_id=MsgIds.MSG_ID_LOAD_CELL_READINGS, payload=payload) self.logger.debug("measured load cell weights set.") Index: dialin/hd/hemodialysis_device.py =================================================================== diff -u -rf994f3ff2163edac03c480e1112a7c4b3ade7b76 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision f994f3ff2163edac03c480e1112a7c4b3ade7b76) +++ dialin/hd/hemodialysis_device.py (.../hemodialysis_device.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -32,7 +32,7 @@ from ..utils.conversions import integer_to_bytearray from ..utils.base import _AbstractSubSystem, _publish, _LogManager from .constants import NO_RESET -from ..common.msg_defs import MsgIds +from ..common.msg_defs import MsgIds, MsgFldPositions class HD(_AbstractSubSystem): @@ -41,12 +41,6 @@ the HD firmware. """ - # broadcast message field positions - START_POS_HD_OP_MODE = DenaliMessage.PAYLOAD_START_INDEX - END_POS_HD_OP_MODE = START_POS_HD_OP_MODE + 4 - START_POS_HD_SUB_MODE = END_POS_HD_OP_MODE - END_POS_HD_SUB_MODE = START_POS_HD_SUB_MODE + 4 - # HD login password HD_LOGIN_PASSWORD = '123' @@ -129,9 +123,9 @@ @return: None """ mode = struct.unpack('i', bytearray( - message['message'][self.START_POS_HD_OP_MODE:self.END_POS_HD_OP_MODE])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) smode = struct.unpack('i', bytearray( - message['message'][self.START_POS_HD_SUB_MODE:self.END_POS_HD_SUB_MODE])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) self.hd_operation_mode = mode[0] self.hd_operation_sub_mode = smode[0] Index: dialin/hd/pressure_occlusion.py =================================================================== diff -u -r8ea13ae6dd10732bfcc456798f4785c4d88c95d3 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 8ea13ae6dd10732bfcc456798f4785c4d88c95d3) +++ dialin/hd/pressure_occlusion.py (.../pressure_occlusion.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -19,6 +19,7 @@ from ..utils.conversions import integer_to_bytearray, float_to_bytearray from .constants import RESET, NO_RESET from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, MsgFldPositions from logging import Logger @@ -27,27 +28,6 @@ Hemodialysis Delivery (HD) Dialin API sub-class for pressure related commands. """ - # Pressure/Occlusion message IDs - MSG_ID_HD_PRESSURE_OCCLUSION_DATA = 0x0009 - MSG_ID_HD_PRESSURE_ARTERIAL_OVERRIDE = 0x8017 - MSG_ID_HD_PRESSURE_VENOUS_OVERRIDE = 0x8018 - MSG_ID_HD_OCCLUSION_BLOOD_PUMP_OVERRIDE = 0x8019 - MSG_ID_HD_OCCLUSION_DIAL_IN_PUMP_OVERRIDE = 0x801A - MSG_ID_HD_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE = 0x801B - MSG_ID_HD_PRES_OCCL_SEND_INTERVAL_OVERRIDE = 0x801C - - # Pressure/Occlusion broadcast message field positions - START_POS_ART_PRES = DenaliMessage.PAYLOAD_START_INDEX - END_POS_ART_PRES = START_POS_ART_PRES + 4 - START_POS_VEN_PRES = END_POS_ART_PRES - END_POS_VEN_PRES = START_POS_VEN_PRES + 4 - START_POS_BP_OCCL = END_POS_VEN_PRES - END_POS_BP_OCCL = START_POS_BP_OCCL + 4 - START_POS_DIP_OCCL = END_POS_BP_OCCL - END_POS_DIP_OCCL = START_POS_DIP_OCCL + 4 - START_POS_DOP_OCCL = END_POS_DIP_OCCL - END_POS_DOP_OCCL = START_POS_DOP_OCCL + 4 - def __init__(self, can_interface, logger: Logger): """ HDPressureOcclusion constructor @@ -59,7 +39,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_sync_broadcast_ch_id - msg_id = self.MSG_ID_HD_PRESSURE_OCCLUSION_DATA + msg_id = MsgIds.MSG_ID_PRESSURE_OCCLUSION_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pressure_occlusion_sync) @@ -125,15 +105,15 @@ """ art = struct.unpack('f', bytearray( - message['message'][self.START_POS_ART_PRES:self.END_POS_ART_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) ven = struct.unpack('f', bytearray( - message['message'][self.START_POS_VEN_PRES:self.END_POS_VEN_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) bp = struct.unpack('f', bytearray( - message['message'][self.START_POS_BP_OCCL:self.END_POS_BP_OCCL])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) dpi = struct.unpack('f', bytearray( - message['message'][self.START_POS_DIP_OCCL:self.END_POS_DIP_OCCL])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) dpo = struct.unpack('f', bytearray( - message['message'][self.START_POS_DOP_OCCL:self.END_POS_DOP_OCCL])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) self.arterial_pressure = art[0] self.venous_pressure = ven[0] @@ -157,7 +137,7 @@ payload = rst + prs message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_PRESSURE_ARTERIAL_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_PRESSURE_ARTERIAL_OVERRIDE, payload=payload) self.logger.debug("override measured arterial pressure") @@ -196,7 +176,7 @@ payload = rst + prs message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_PRESSURE_VENOUS_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_PRESSURE_VENOUS_OVERRIDE, payload=payload) self.logger.debug("override measured venous pressure") @@ -234,7 +214,7 @@ payload = rst + occ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_OCCLUSION_BLOOD_PUMP_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_OCCLUSION_BLOOD_PUMP_OVERRIDE, payload=payload) self.logger.debug("override measured blood pump occlusion pressure") @@ -273,7 +253,7 @@ payload = rst + occ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_OCCLUSION_DIAL_IN_PUMP_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_OCCLUSION_DIAL_IN_PUMP_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate inlet pump occlusion pressure") @@ -312,7 +292,7 @@ payload = rst + occ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_OCCLUSION_DIAL_OUT_PUMP_OVERRIDE, payload=payload) self.logger.debug("override measured dialysate outlet pump occlusion pressure") @@ -351,7 +331,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_PRES_OCCL_SEND_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_HD_PRES_OCCL_SEND_INTERVAL_OVERRIDE, payload=payload) self.logger.debug("override pressure/occlusion broadcast interval") @@ -372,23 +352,3 @@ else: self.logger.debug("Timeout!!!!") return False - - # TEST CODE *************************************** - def test_can_message(self, seq): - zero = integer_to_bytearray(0) - seq1 = integer_to_bytearray(seq) - seq2 = integer_to_bytearray(seq+1) - seq3 = integer_to_bytearray(seq+2) - seq4 = integer_to_bytearray(seq+3) - seq5 = integer_to_bytearray(seq+4) - - payload = seq1 + zero + seq2 + zero + seq3 + zero + seq4 + zero + seq5 - - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=6, - payload=payload) - - received_message = self.can_interface.send(message, 0) - - return True - Index: dialin/hd/treatment.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/treatment.py (.../treatment.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/hd/treatment.py (.../treatment.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -18,6 +18,7 @@ DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..common.msg_defs import MsgIds, MsgFldPositions from logging import Logger @@ -28,11 +29,6 @@ """ - # treatment message IDs - MSG_ID_HD_TREATMENT_TIME_PUBLISHED_DATA = 0x000D - MSG_ID_HD_TREATMENT_STATE_PUBLISHED_DATA = 0x000F - MSG_ID_HD_SET_TREATMENT_PARAMETER = 0x802D - # Treatment Parameter IDs HD_TREATMENT_PARAMETER_BLOOD_FLOW = 0 HD_TREATMENT_PARAMETER_DIALYSATE_FLOW = 1 @@ -67,21 +63,18 @@ # Bicarbonate Concentrate IDs BICARB_CONC_TYPE_FRESENIUS_CENTRISOL = 0 - # 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 + # UF states + UF_START_STATE = 0 # Start state of the ultrafiltration state machine + UF_PAUSED_STATE = 1 # Paused state of the ultrafiltration state machine + UF_RUNNING_STATE = 2 # Running state of the ultrafiltration state machine + UF_OFF_STATE = 3 # Completed/off state of the ultrafiltration state machine + UF_COMPLETED_STATE = 4 # Completed state of ultrafiltration state machine - # 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 + # Saline bolus states + SALINE_BOLUS_STATE_IDLE = 0 # No saline bolus delivery is in progress + SALINE_BOLUS_STATE_WAIT_FOR_PUMPS_STOP = 1 # Wait for pumps to stop before starting bolus + SALINE_BOLUS_STATE_IN_PROGRESS = 2 # A saline bolus delivery is in progress + SALINE_BOLUS_STATE_MAX_DELIVERED = 3 # Maximum saline bolus volume reached def __init__(self, can_interface, logger: Logger): """ @@ -94,19 +87,25 @@ 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 + msg_id = MsgIds.MSG_ID_TREATMENT_TIME.value 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 + msg_id = MsgIds.MSG_ID_TREATMENT_STATE.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_treatment_state_sync) + msg_id = MsgIds.MSG_ID_SALINE_BOLUS_DATA.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, + self._handler_saline_bolus_data_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 + self.saline_bolus_state = 0 + self.saline_bolus_max_vol = 0 + self.saline_bolus_cum_vol = 0.0 + self.saline_bolus_bol_vol = 0.0 def get_treatment_time_prescribed(self): """ @@ -148,14 +147,39 @@ """ return self.treatment_uf_state - def get_saline_bolus_in_progress(self): + def get_saline_bolus_state(self): """ - Returns whether saline bolus is in progress + Returns whether saline bolus state - @return: True if saline bolus is in progress, False otherwise + @return: The saline bolus state """ - return self.saline_bolus_in_progress + return self.saline_bolus_state + def get_saline_bolus_max_volume(self): + """ + Returns maximum volume (in mL) saline that can be delivered to a patient + + @return: The maximum saline bolus volume + """ + return self.saline_bolus_max_vol + + def get_saline_bolus_cumulative_volume_delivered(self): + """ + Returns cumulative volume (in mL) of saline delivered + + @return: The cumulative saline volume delivered + """ + return self.saline_bolus_cum_vol + + def get_saline_bolus_volume_delivered(self): + """ + Returns bolus volume (in mL) of saline delivered + + @return: The bolus saline volume delivered + """ + return self.saline_bolus_bol_vol + + @_publish([ "treatment_time_prescribed", "treatment_time_elapsed", @@ -171,11 +195,11 @@ """ tot = struct.unpack('i', bytearray( - message['message'][self.START_POS_TIME_PRES:self.END_POS_TIME_PRES])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) ela = struct.unpack('i', bytearray( - message['message'][self.START_POS_TIME_ELAPSED:self.END_POS_TIME_ELAPSED])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) rem = struct.unpack('i', bytearray( - message['message'][self.START_POS_TIME_REMAINING:self.END_POS_TIME_REMAINING])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) self.treatment_time_prescribed = tot[0] self.treatment_time_elapsed = ela[0] @@ -196,19 +220,41 @@ """ tst = struct.unpack('i', bytearray( - message['message'][self.START_POS_TREATMENT_STATE:self.END_POS_TREATMENT_STATE])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) ufs = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_STATE:self.END_POS_UF_STATE])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) bol = struct.unpack('i', bytearray( - message['message'][self.START_POS_SALINE_BOLUS_IN_PROGRESS:self.END_POS_SALINE_BOLUS_IN_PROGRESS])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) 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 + self.saline_bolus_state = bol[0] + @_publish([ + "saline_bolus_max_vol", + "saline_bolus_cum_vol", + "saline_bolus_bol_vol" + ]) + def _handler_saline_bolus_data_sync(self, message): + """ + Handles published saline bolus data messages. Saline bolus data are captured + for reference. + + @param message: published saline bolus data message + @return: none + """ + + mxm = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) + cum = struct.unpack('f', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) + bol = struct.unpack('f', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) + + self.saline_bolus_max_vol = mxm[0] + self.saline_bolus_cum_vol = cum[0] + self.saline_bolus_bol_vol = bol[0] + def cmd_set_treatment_param_blood_flow_rate(self, flow): """ Constructs and sends the set blood flow rate treatment parameter command. @@ -227,7 +273,7 @@ payload = par + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting blood flow rate") @@ -265,7 +311,7 @@ payload = par + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting dialysate flow rate") @@ -301,7 +347,7 @@ payload = par + dur message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting treatment duration") @@ -337,7 +383,7 @@ payload = par + sto message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting Heparin pre-stop time") @@ -373,7 +419,7 @@ payload = par + vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting saline bolus volume") @@ -412,7 +458,7 @@ payload = par + acd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting acid concentrate parameter") @@ -449,7 +495,7 @@ payload = par + bic message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting bicarbonate concentrate parameter") @@ -489,7 +535,7 @@ payload = par + dia message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting dialyzer type parameter") @@ -525,7 +571,7 @@ payload = par + bpi message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting BP measurement interval parameter") @@ -561,7 +607,7 @@ payload = par + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting rinseback flow rate parameter") @@ -597,7 +643,7 @@ payload = par + pre message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting arterial pressure lower alarm limit parameter") @@ -633,7 +679,7 @@ payload = par + pre message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting arterial pressure upper alarm limit parameter") @@ -669,7 +715,7 @@ payload = par + pre message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting venous pressure lower alarm limit parameter") @@ -705,7 +751,7 @@ payload = par + pre message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting venous pressure upper alarm limit parameter") @@ -741,7 +787,7 @@ payload = par + rat message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting Heparin dispense rate parameter") @@ -777,7 +823,7 @@ payload = par + vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting Heparin bolus volume parameter") @@ -813,7 +859,7 @@ payload = par + tmp message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting dialysate temperature parameter") @@ -849,7 +895,7 @@ payload = par + vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_SET_TREATMENT_PARAMETER, + message_id=MsgIds.MSG_ID_HD_SET_TREATMENT_PARAMETER, payload=payload) print("setting ultrafiltration volume parameter") Index: dialin/hd/ui_proxy.py =================================================================== diff -u -re172ddc204389ba1eb69e14de52bd3b924087031 -r9fed7e633ffc4cf92a93e22ccff7d5aa078801ce --- dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision e172ddc204389ba1eb69e14de52bd3b924087031) +++ dialin/hd/ui_proxy.py (.../ui_proxy.py) (revision 9fed7e633ffc4cf92a93e22ccff7d5aa078801ce) @@ -18,6 +18,7 @@ from ..utils.conversions import integer_to_bytearray, float_to_bytearray import struct from ..utils.base import _AbstractSubSystem, _publish +from ..common.msg_defs import MsgIds, RequestRejectReasons, MsgFldPositions from collections import OrderedDict from logging import Logger @@ -27,25 +28,6 @@ Hemodialysis Delivery (HD) Dialin API sub-class for ui commands. """ - # ui message IDs - MSG_ID_UI_CHECKIN_WITH_HD = 0x0007 - MSG_ID_HD_UF_PAUSE_RESUME_REQUEST = 0x0010 - MSG_ID_HD_TREATMENT_PARAMS_RANGES = 0x001A - MSG_ID_UF_SETTINGS_CHANGE_REQUEST_BY_USER = 0x0011 - MSG_ID_UF_SETTINGS_CHANGE_RESPONSE_FROM_HD = 0x0013 - MSG_ID_UF_SETTINGS_CHANGE_CONFIRMED_BY_USER = 0x0015 - MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_REQUEST = 0x0016 - MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_RESPONSE_FROM_HD = 0x001B - MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_REQUEST_BY_USER = 0x0017 - MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_RESPONSE_FROM_HD = 0x0018 - MSG_ID_UI_REQUEST_HD_VERSION = 0x001C - MSG_ID_UI_HD_VERSION_RESPONSE = 0x001D - MSG_ID_UF_SETTINGS_CHANGE_CONFIRM_RESPONSE_FROM_HD = 0x002E - MSG_ID_UI_NEW_TREATMENT_PARAMS = 0x35 - MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE = 0x36 - MSG_ID_UI_START_TREATMENT = 0x38 - MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3B - LITER_TO_ML_CONVERSION_FACTOR = 1000.0 # UF pause/resume command IDs @@ -65,24 +47,6 @@ START_TREATMENT_CMD_CANCEL_TREATMENT_WORKFLOW = 1 START_TREATMENT_CMD_START_TREATMENT = 2 - REQUEST_REJECT_REASON_NONE = 0 - REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE = 1 - REQUEST_REJECT_REASON_TIMEOUT_WAITING_FOR_USER_CONFIRM = 2 - REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE = 3 - REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE = 4 - REQUEST_REJECT_REASON_TREATMENT_TOO_CLOSE_TO_FINISHED = 5 - REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE = 6 - REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT = 7 - REQUEST_REJECT_REASON_BLOOD_FLOW_OUT_OF_RANGE = 8 - REQUEST_REJECT_REASON_DIAL_FLOW_OUT_OF_RANGE = 9 - REQUEST_REJECT_REASON_DIAL_VOLUME_OUT_OF_RANGE = 10 - REQUEST_REJECT_REASON_UF_VOLUME_OUT_OF_RANGE = 11 - REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE = 12 - REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM = 13 - REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS = 14 - REQUEST_REJECT_REASON_UF_NOT_PAUSED = 15 - REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS = 16 - # HD version message field positions START_POS_MAJOR = DenaliMessage.PAYLOAD_START_INDEX END_POS_MAJOR = START_POS_MAJOR + 1 @@ -103,70 +67,6 @@ START_POS_FPGA_LAB = END_POS_FPGA_MINOR END_POS_FPGA_LAB = START_POS_FPGA_LAB + 1 - # HD update on valid treatment parameter ranges message field positions - START_POS_MIN_TREAT_TIME = DenaliMessage.PAYLOAD_START_INDEX - END_POS_MIN_TREAT_TIME = START_POS_MIN_TREAT_TIME + 4 - START_POS_MAX_TREAT_TIME = END_POS_MIN_TREAT_TIME - END_POS_MAX_TREAT_TIME = START_POS_MAX_TREAT_TIME + 4 - START_POS_MIN_UF_VOL = END_POS_MAX_TREAT_TIME - END_POS_MIN_UF_VOL = START_POS_MIN_UF_VOL + 4 - START_POS_MAX_UF_VOL = END_POS_MIN_UF_VOL - END_POS_MAX_UF_VOL = START_POS_MAX_UF_VOL + 4 - START_POS_MIN_DIAL_RATE = END_POS_MAX_UF_VOL - END_POS_MIN_DIAL_RATE = START_POS_MIN_DIAL_RATE + 4 - START_POS_MAX_DIAL_RATE = END_POS_MIN_DIAL_RATE - END_POS_MAX_DIAL_RATE = START_POS_MAX_DIAL_RATE + 4 - - # HD response to treatment duration change request message field positions - START_POS_TIME_CHG_RSP_ACCEPTED = DenaliMessage.PAYLOAD_START_INDEX - END_POS_TIME_CHG_RSP_ACCEPTED = START_POS_TIME_CHG_RSP_ACCEPTED + 4 - START_POS_TIME_CHG_RSP_REASON = END_POS_TIME_CHG_RSP_ACCEPTED - END_POS_TIME_CHG_RSP_REASON = START_POS_TIME_CHG_RSP_REASON + 4 - START_POS_TIME_CHG_RSP_TIME = END_POS_TIME_CHG_RSP_REASON - END_POS_TIME_CHG_RSP_TIME = START_POS_TIME_CHG_RSP_TIME + 4 - START_POS_TIME_CHG_RSP_UF_VOL = END_POS_TIME_CHG_RSP_TIME - END_POS_TIME_CHG_RSP_UF_VOL = START_POS_TIME_CHG_RSP_UF_VOL + 4 - - # HD response to UF volume change request message field positions - START_POS_UF_CHG_RSP_RESP = DenaliMessage.PAYLOAD_START_INDEX - END_POS_UF_CHG_RSP_RESP = START_POS_UF_CHG_RSP_RESP + 4 - START_POS_UF_CHG_RSP_REJECT_REASON = END_POS_UF_CHG_RSP_RESP - END_POS_UF_CHG_RSP_REJECT_REASON = START_POS_UF_CHG_RSP_REJECT_REASON + 4 - START_POS_UF_CHG_RSP_VOL = END_POS_UF_CHG_RSP_RESP - END_POS_UF_CHG_RSP_VOL = START_POS_UF_CHG_RSP_VOL + 4 - START_POS_UF_CHG_RSP_TIME = END_POS_UF_CHG_RSP_VOL - END_POS_UF_CHG_RSP_TIME = START_POS_UF_CHG_RSP_TIME + 4 - START_POS_UF_CHG_RSP_TIME_DIFF = END_POS_UF_CHG_RSP_TIME - END_POS_UF_CHG_RSP_TIME_DIFF = START_POS_UF_CHG_RSP_TIME_DIFF + 4 - START_POS_UF_CHG_RSP_RATE = END_POS_UF_CHG_RSP_TIME_DIFF - END_POS_UF_CHG_RSP_RATE = START_POS_UF_CHG_RSP_RATE + 4 - START_POS_UF_CHG_RSP_RATE_DIFF = END_POS_UF_CHG_RSP_RATE - END_POS_UF_CHG_RSP_RATE_DIFF = START_POS_UF_CHG_RSP_RATE_DIFF + 4 - START_POS_UF_CHG_RSP_OLD_RATE = END_POS_UF_CHG_RSP_RATE_DIFF - END_POS_UF_CHG_RSP_OLD_RATE = START_POS_UF_CHG_RSP_OLD_RATE + 4 - - # HD response to UF volume change confirmation message field positions - START_POS_UF_CNF_RSP_RESP = DenaliMessage.PAYLOAD_START_INDEX - END_POS_UF_CNF_RSP_RESP = START_POS_UF_CNF_RSP_RESP + 4 - START_POS_UF_CNF_RSP_REJECT_REASON = END_POS_UF_CNF_RSP_RESP - END_POS_UF_CNF_RSP_REJECT_REASON = START_POS_UF_CNF_RSP_REJECT_REASON + 4 - START_POS_UF_CNF_RSP_VOL = END_POS_UF_CNF_RSP_RESP - END_POS_UF_CNF_RSP_VOL = START_POS_UF_CNF_RSP_VOL + 4 - START_POS_UF_CNF_RSP_TIME = END_POS_UF_CNF_RSP_VOL - END_POS_UF_CNF_RSP_TIME = START_POS_UF_CNF_RSP_TIME + 4 - START_POS_UF_CNF_RSP_RATE = END_POS_UF_CNF_RSP_TIME - END_POS_UF_CNF_RSP_RATE = START_POS_UF_CNF_RSP_RATE + 4 - - # HD response to blood/dialysate flow change request message field positions - START_POS_BLD_DIAL_CHG_RSP_ACCEPTED = DenaliMessage.PAYLOAD_START_INDEX - END_POS_BLD_DIAL_CHG_RSP_ACCEPTED = START_POS_BLD_DIAL_CHG_RSP_ACCEPTED + 4 - START_POS_BLD_DIAL_CHG_RSP_REASON = END_POS_BLD_DIAL_CHG_RSP_ACCEPTED - END_POS_BLD_DIAL_CHG_RSP_REASON = START_POS_BLD_DIAL_CHG_RSP_REASON + 4 - START_POS_BLD_DIAL_CHG_RSP_BLD_RATE = END_POS_BLD_DIAL_CHG_RSP_REASON - END_POS_BLD_DIAL_CHG_RSP_BLD_RATE = START_POS_BLD_DIAL_CHG_RSP_BLD_RATE + 4 - START_POS_BLD_DIAL_CHG_RSP_DIAL_RATE = END_POS_BLD_DIAL_CHG_RSP_BLD_RATE - END_POS_BLD_DIAL_CHG_RSP_DIAL_RATE = START_POS_BLD_DIAL_CHG_RSP_DIAL_RATE + 4 - def __init__(self, can_interface, logger: Logger): """ @@ -181,23 +81,25 @@ if self.can_interface is not None: channel_id = DenaliChannels.hd_to_ui_ch_id self.can_interface.register_receiving_publication_function(channel_id, - self.MSG_ID_UF_SETTINGS_CHANGE_RESPONSE_FROM_HD, + MsgIds.MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE, self._handler_uf_change_response) self.can_interface.register_receiving_publication_function(channel_id, - self.MSG_ID_UF_SETTINGS_CHANGE_CONFIRM_RESPONSE_FROM_HD, + MsgIds.MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE, self._handler_uf_change_confirm_response) self.can_interface.register_receiving_publication_function(channel_id, - self.MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_RESPONSE_FROM_HD, + MsgIds.MSG_ID_USER_TREATMENT_TIME_CHANGE_RESPONSE, self._handler_treatment_duration_change_response) self.can_interface.register_receiving_publication_function(channel_id, - self.MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_RESPONSE_FROM_HD, + MsgIds.MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_RESPONSE, self._handler_blood_and_dialysate_change_response) - self.can_interface.register_receiving_publication_function(channel_id, self.MSG_ID_HD_TREATMENT_PARAMS_RANGES, + self.can_interface.register_receiving_publication_function(channel_id, MsgIds.MSG_ID_TREATMENT_PARAM_CHANGE_RANGES, self._handler_treatment_param_ranges) - self.can_interface.register_receiving_publication_function(DenaliChannels.hd_to_ui_ch_id, self.MSG_ID_UI_HD_VERSION_RESPONSE, + self.can_interface.register_receiving_publication_function(DenaliChannels.hd_to_ui_ch_id, MsgIds.MSG_ID_HD_VERSION, self._handler_hd_version) - self.can_interface.register_receiving_publication_function(DenaliChannels.hd_to_ui_ch_id, self.MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE, + self.can_interface.register_receiving_publication_function(DenaliChannels.hd_to_ui_ch_id, MsgIds.MSG_ID_HD_NEW_TREATMENT_PARAMS_RESPONSE, self._handler_treatment_param_settings) + self.can_interface.register_receiving_publication_function(DenaliChannels.hd_to_ui_ch_id, MsgIds.MSG_ID_USER_SALINE_BOLUS_RESPONSE, + self._handler_saline_bolus_response) # initialize variables that will be populated by HD version response self.hd_version = None @@ -265,6 +167,10 @@ self.blood_and_dialysate_flow_rate_change_reject_reason = 0 self.target_blood_flow_rate = 0 self.target_dialysate_flow_rate = 0 + # initialize variables that will be populated by response to saline bolus request + self.saline_bolus_request_succeeded = False + self.saline_bolus_request_reject_reason = 0 + self.saline_bolus_request_bolus_volume = 0 self.reject_reasons = OrderedDict() for attr in dir(self): @@ -624,6 +530,22 @@ """ return self.dialysate_temperature_reject_reason + def get_saline_bolus_reject_reason(self): + """ + Gets the reject reason code for the saline bolus request + + @return: The reject reason code for saline bolus request + """ + return self.saline_bolus_request_reject_reason + + def get_saline_bolus_volume(self): + """ + Gets the HD f/w saline bolus volume (in mL) + + @return: The saline bolus volume (in mL) + """ + return self.saline_bolus_request_bolus_volume + @_publish([ "hd_version" "fpga_version" @@ -712,42 +634,42 @@ @return: none """ - p = DenaliMessage.PAYLOAD_START_INDEX - val = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - bld = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - dia = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - dur = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - sto = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - sal = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - acd = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - bic = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - dlz = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - bpi = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - rbf = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - apl = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - aph = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - vpl = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - vph = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - hdr = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - hbv = struct.unpack('i', bytearray(message['message'][p:p+4])) - p += 4 - tmp = struct.unpack('i', bytearray(message['message'][p:p+4])) + val = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) + bld = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) + dia = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) + dur = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) + sto = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) + sal = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) + acd = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) + bic = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_8:MsgFldPositions.END_POS_FIELD_8])) + dlz = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_9:MsgFldPositions.END_POS_FIELD_9])) + bpi = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_10:MsgFldPositions.END_POS_FIELD_10])) + rbf = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_11:MsgFldPositions.END_POS_FIELD_11])) + apl = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_12:MsgFldPositions.END_POS_FIELD_12])) + aph = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_13:MsgFldPositions.END_POS_FIELD_13])) + vpl = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_14:MsgFldPositions.END_POS_FIELD_14])) + vph = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_15:MsgFldPositions.END_POS_FIELD_15])) + hdr = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_16:MsgFldPositions.END_POS_FIELD_16])) + hbv = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_17:MsgFldPositions.END_POS_FIELD_17])) + tmp = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_18:MsgFldPositions.END_POS_FIELD_18])) if val[0] == 1: self.treatment_parameters_valid = True @@ -794,17 +716,17 @@ @return: none """ mintime = struct.unpack('i', bytearray( - message['message'][self.START_POS_MIN_TREAT_TIME:self.END_POS_MIN_TREAT_TIME])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) maxtime = struct.unpack('i', bytearray( - message['message'][self.START_POS_MAX_TREAT_TIME:self.END_POS_MAX_TREAT_TIME])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) minufvol = struct.unpack('f', bytearray( - message['message'][self.START_POS_MIN_UF_VOL:self.END_POS_MIN_UF_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) maxufvol = struct.unpack('f', bytearray( - message['message'][self.START_POS_MAX_UF_VOL:self.END_POS_MAX_UF_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) mindialrt = struct.unpack('i', bytearray( - message['message'][self.START_POS_MIN_DIAL_RATE:self.END_POS_MIN_DIAL_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) maxdialrt = struct.unpack('i', bytearray( - message['message'][self.START_POS_MAX_DIAL_RATE:self.END_POS_MAX_DIAL_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) self.min_treatment_duration_min = mintime[0] self.max_treatment_duration_min = maxtime[0] @@ -814,6 +736,36 @@ self.max_dialysate_flow_rate_ml_min = maxdialrt[0] @_publish([ + "saline_bolus_request_succeeded", + "saline_bolus_request_reject_reason", + "saline_bolus_request_bolus_volume" + ]) + def _handler_saline_bolus_response(self, message): + """ + Handler for response from HD regarding saline bolus request. + + @param message: response message from HD regarding saline bolus request.\n + BOOL Accepted \n + U32 Reject reason (if not accepted) \n + U32 Saline bolus volume (mL) + + @return: none + """ + rsp = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) + rea = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) + vol = struct.unpack('i', bytearray( + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) + + if rsp[0] == 1: + self.saline_bolus_request_succeeded = True + else: + self.saline_bolus_request_succeeded = False + self.saline_bolus_request_reject_reason = rea[0] + self.saline_bolus_request_bolus_volume = vol[0] + + @_publish([ "duration_change_succeeded", "duration_change_reject_reason", "duration_change_time_min", @@ -832,13 +784,13 @@ @return: none """ rsp = struct.unpack('i', bytearray( - message['message'][self.START_POS_TIME_CHG_RSP_ACCEPTED:self.END_POS_TIME_CHG_RSP_ACCEPTED])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) rea = struct.unpack('i', bytearray( - message['message'][self.START_POS_TIME_CHG_RSP_REASON:self.END_POS_TIME_CHG_RSP_REASON])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) tim = struct.unpack('i', bytearray( - message['message'][self.START_POS_TIME_CHG_RSP_TIME:self.END_POS_TIME_CHG_RSP_TIME])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) vol = struct.unpack('f', bytearray( - message['message'][self.START_POS_TIME_CHG_RSP_UF_VOL:self.END_POS_TIME_CHG_RSP_UF_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) self.duration_change_succeeded = rsp[0] self.duration_change_reject_reason = rea[0] @@ -864,13 +816,13 @@ @return: none """ rsp = struct.unpack('i', bytearray( - message['message'][self.START_POS_BLD_DIAL_CHG_RSP_ACCEPTED:self.END_POS_BLD_DIAL_CHG_RSP_ACCEPTED])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) rea = struct.unpack('i', bytearray( - message['message'][self.START_POS_BLD_DIAL_CHG_RSP_REASON:self.END_POS_BLD_DIAL_CHG_RSP_REASON])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) bld = struct.unpack('i', bytearray( - message['message'][self.START_POS_BLD_DIAL_CHG_RSP_BLD_RATE:self.END_POS_BLD_DIAL_CHG_RSP_BLD_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) dil = struct.unpack('i', bytearray( - message['message'][self.START_POS_BLD_DIAL_CHG_RSP_DIAL_RATE:self.END_POS_BLD_DIAL_CHG_RSP_DIAL_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) if rsp[0] == self.RESPONSE_REJECTED: resp = False @@ -906,21 +858,21 @@ @return: none """ rsp = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_RESP:self.END_POS_UF_CHG_RSP_RESP])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) rea = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_REJECT_REASON:self.END_POS_UF_CHG_RSP_REJECT_REASON])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) vol = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_VOL:self.END_POS_UF_CHG_RSP_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) tim = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_TIME:self.END_POS_UF_CHG_RSP_TIME])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) tmd = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_TIME_DIFF:self.END_POS_UF_CHG_RSP_TIME_DIFF])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) rat = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_RATE:self.END_POS_UF_CHG_RSP_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_6:MsgFldPositions.END_POS_FIELD_6])) rtd = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_RATE_DIFF:self.END_POS_UF_CHG_RSP_RATE_DIFF])) + message['message'][MsgFldPositions.START_POS_FIELD_7:MsgFldPositions.END_POS_FIELD_7])) ort = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CHG_RSP_OLD_RATE:self.END_POS_UF_CHG_RSP_OLD_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_8:MsgFldPositions.END_POS_FIELD_8])) if rsp[0] == self.RESPONSE_REJECTED: resp = False @@ -957,15 +909,15 @@ @return: None """ rsp = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CNF_RSP_RESP:self.END_POS_UF_CNF_RSP_RESP])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) rea = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CNF_RSP_REJECT_REASON:self.END_POS_UF_CNF_RSP_REJECT_REASON])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) vol = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CNF_RSP_VOL:self.END_POS_UF_CNF_RSP_VOL])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) tim = struct.unpack('i', bytearray( - message['message'][self.START_POS_UF_CNF_RSP_TIME:self.END_POS_UF_CNF_RSP_TIME])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) rat = struct.unpack('f', bytearray( - message['message'][self.START_POS_UF_CNF_RSP_RATE:self.END_POS_UF_CNF_RSP_RATE])) + message['message'][MsgFldPositions.START_POS_FIELD_5:MsgFldPositions.END_POS_FIELD_5])) if rsp[0] == self.RESPONSE_REJECTED: resp = False @@ -985,7 +937,7 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UI_CHECKIN_WITH_HD) + message_id=MsgIds.MSG_ID_UI_CHECK_IN) self.logger.debug("Sending ui checkin w/ HD") @@ -1000,7 +952,7 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UI_REQUEST_HD_VERSION) + message_id=MsgIds.MSG_ID_REQUEST_FW_VERSIONS) self.logger.debug("Sending ui request for version to HD") @@ -1017,7 +969,7 @@ payload = integer_to_bytearray(cmd) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_HD_UF_PAUSE_RESUME_REQUEST, + message_id=MsgIds.MSG_ID_USER_UF_PAUSE_RESUME_REQUEST, payload=payload) if cmd == self.UF_CMD_PAUSE: @@ -1044,7 +996,7 @@ # build command message volume = float_to_bytearray(vol * self.LITER_TO_ML_CONVERSION_FACTOR) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UF_SETTINGS_CHANGE_REQUEST_BY_USER, + message_id=MsgIds.MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST, payload=volume) self.logger.debug("Sending UF settings change request.") @@ -1071,7 +1023,7 @@ adjust = integer_to_bytearray(adj) payload = volume + adjust message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UF_SETTINGS_CHANGE_REQUEST_BY_USER, + message_id=MsgIds.MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE, payload=payload) self.logger.debug("Sending UF settings change request.") @@ -1080,32 +1032,6 @@ return 0 - def cmd_ui_uf_change_settings_confirmed_by_user(self, response=RESPONSE_REJECTED, vol=0.0, tm=0, rate=0.0): - """ - Constructs and sends a ui UF change settings confirmed by user message - - @param response: (int) 0 for rejected, 1 for confirmed - @param vol: (float): volume (in L) that was confirmed - @param tm: (int) treatment time (in min) that was confirmed - @param rate: (float) ultrafiltration rate (in mL/min) that was confirmed - @return: None - """ - - resp = integer_to_bytearray(response) - volume = float_to_bytearray(vol * self.LITER_TO_ML_CONVERSION_FACTOR) - mins = integer_to_bytearray(tm) - ufrate = float_to_bytearray(rate) - payload = resp + volume + mins + ufrate - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UF_SETTINGS_CHANGE_CONFIRMED_BY_USER, - payload=payload) - - self.logger.debug("Sending UF settings change confirmation.") - - self.can_interface.send(message, 0) - - return 0 - def cmd_ui_treatment_duration_setting_change_request(self, time_min=0): """ Constructs and sends a ui UF change settings confirmed by user message @@ -1117,7 +1043,7 @@ payload = integer_to_bytearray(time_min) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_TREATMENT_DURATION_SETTING_CHANGE_REQUEST, + message_id=MsgIds.MSG_ID_USER_TREATMENT_TIME_CHANGE_REQUEST, payload=payload) self.logger.debug("Sending treatment duration setting change request.") @@ -1141,7 +1067,7 @@ dial = integer_to_bytearray(dial_flow) payload = bld + dial message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_BLOOD_DIALYSATE_FLOW_SETTING_CHANGE_REQUEST_BY_USER, + message_id=MsgIds.MSG_ID_USER_BLOOD_DIAL_RATE_CHANGE_REQUEST, payload=payload) self.logger.debug("Sending blood & dialysate flow rate settings change request.") @@ -1167,7 +1093,7 @@ cmd = integer_to_bytearray(cmnd) payload = cmd message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UI_START_TREATMENT, + message_id=MsgIds.MSG_ID_UI_START_TREATMENT, payload=payload) self.logger.debug("Sending start treatment command request.") @@ -1242,7 +1168,7 @@ payload = bld+dia+dur+hps+sal+acc+bic+dzr+bpi+rbf+apl+aph+vpl+vph+hdr+hbv+tmp message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UI_NEW_TREATMENT_PARAMS, + message_id=MsgIds.MSG_ID_UI_NEW_TREATMENT_PARAMS, payload=payload) self.logger.debug("Sending treatment parameters to HD.") @@ -1259,10 +1185,43 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, - message_id=self.MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS) + message_id=MsgIds.MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS) self.logger.debug("Sending confirm treatment parameters messge.") self.can_interface.send(message, 0) return 0 + + + def cmd_ui_request_saline_bolus(self, start=False): + """ + Constructs and sends a ui request for a saline bolus message + Constraints: + HD must be in treatment mode, dialysis sub-mode. + Will not succeed if saline bolus already in progress. + Will not succeed if max. saline volume has already been reached. + + @param start: (bool) True if we're requesting bolus start, False if bolus abort + + @return: none + """ + + if start: + sta = integer_to_bytearray(1) + str = "start" + else: + sta = integer_to_bytearray(0) + str = "abort" + + payload = sta + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_USER_SALINE_BOLUS_REQUEST.value, + payload=payload) + + + self.logger.debug("Sending request to " + str + " a saline bolus.") + + self.can_interface.send(message, 0) + + return 0