Index: dialin/common/msg_defs.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/common/msg_defs.py (.../msg_defs.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ dialin/common/msg_defs.py (.../msg_defs.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -13,9 +13,12 @@ # @date (original) 07-Aug-2020 # ############################################################################ -import enum +from enum import unique +from ..protocols.CAN import DenaliMessage +from ..utils.base import DialinEnum -class MsgIds(enum.Enum): +@unique +class MsgIds(DialinEnum): MSG_ID_UNUSED = 0 # Zero is an undefined (un-used) message ID) MSG_ID_OFF_BUTTON_PRESS = 1 # HD/UI off button interactions MSG_ID_ALARM_STATUS = 2 # HD broadcast of system alarm state information @@ -63,8 +66,8 @@ MSG_ID_DG_HEATERS_DATA = 0x2C # DG broadcast of the heaters data MSG_ID_DG_TEMPERATURE_DATA = 0x2D # DG broadcast of the temperature sensors data MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE = 0x2E # HD response to user selection of ultrafiltration settings change option selection - MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0x2F # HD request to start or stop DG heat disinfection - MSG_ID_SALINE_BOLUS_DATA = 0x30 # HD broadcast of saline bolus data + MSG_ID_SALINE_BOLUS_DATA = 0x2F # HD broadcast of saline bolus data + MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0x30 # HD request to start or stop DG heat disinfection MSG_ID_DG_CONDUCTIVITY_DATA = 0x31 # DG broadcast of the conductivity sensors data MSG_ID_USER_REQUEST_ALARM_SILENCE = 0x32 # UI request alarm silence (or cancel) MSG_ID_HD_ACCELEROMETER_DATA = 0x33 # HD broadcast of accelerometer data @@ -74,19 +77,28 @@ MSG_ID_DG_HEAT_DISINFECT_DATA = 0x37 # DG heat disinfection publish data MSG_ID_UI_START_TREATMENT = 0x38 # UI user request to initiate a treatment MSG_ID_HD_START_TREATMENT_RESPONSE = 0x39 # HD response to user request to initiate a treatment - MSG_ID_UI_ALARM_ACKNOWLEDGE = 0x3F # UI Tells HD an alarm has been acknowledged MSG_ID_HD_VALVES_DATA = 0x3B # HD broadcast of valves data MSG_ID_UI_USER_CONFIRM_TREATMENT_PARAMS = 0x3A # UI user confirmation of treatment parameters 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_UI_ALARM_USER_ACKNOWLEDGE = 0x3F # UI user has acknowledged alarm + MSG_ID_UI_ALARM_USER_ACTION = 0x40 # UI user has requested an alarm action + MSG_ID_USER_UF_PAUSE_RESUME_RESPONSE = 0x41 # HD response to user request to pause or resume UF + MSG_ID_DG_CONCENTRATE_PUMP_DATA = 0x42 # DG broadcast of concentrate pump data + MSG_ID_DG_PRIMING_STATUS_DATA = 0x43 # HD priming status during cartridge prime + MSG_ID_DG_UV_REACTORS_DATA = 0x44 # DG broadcast UV reactors data + MSG_ID_DG_THERMISTORS_DATA = 0x45 # DG broadcast thermistors data + MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST = 0x46 # DG broadcast thermistors data + MSG_ID_HD_PRESSURE_LIMITS_CHANGE_RESPONSE = 0x47 # DG broadcast thermistors data + MSG_ID_DG_FANS_DATA = 0x48 # DG broadcast fans data + MSG_ID_HD_CALIBRATION_DATA = 0x49 # HD broadcast calibration data + MSG_ID_DG_CALIBRATION_DATA = 0x4A # DG broadcast calibration data MSG_ID_CAN_ERROR_COUNT = 0x999 # test code in support of EMC testing # service/test CAN messages - MSG_ID_FIRST_TESTER_MESSAGE = 0x8000 # First HD test message ID - MSG_ID_TESTER_LOGIN_REQUEST = MSG_ID_FIRST_TESTER_MESSAGE # HD tester log-in - MSG_ID_HD_MESSAGE = 0x8001 # Obsolete - TODO - remove when all references to this ID are deleted + MSG_ID_TESTER_LOGIN_REQUEST = 0x8000 # HD tester log-in MSG_ID_DIAL_OUT_FLOW_SET_PT_OVERRIDE = 0x8001 # Dialysate outlet flow set point override request MSG_ID_OFF_BUTTON_STATE_OVERRIDE = 0x8002 # Off button override request MSG_ID_STOP_BUTTON_STATE_OVERRIDE = 0x8003 # Stop button override request @@ -139,9 +151,15 @@ MSG_ID_DG_AIR_TRAP_DATA_BROADCAST_INTERVAL_OVERRIDE = 0x8032 # HD air trap data broadcast interval override request MSG_ID_DG_AIR_TRAP_LEVEL_SENSOR_OVERRIDE = 0x8033 # HD air trap level sensor override request MSG_ID_HD_SOFTWARE_RESET_REQUEST = 0x8034 # HD reset request + MSG_ID_BLOOD_FLOW_SIG_STRENGTH_OVERRIDE = 0x8035 # Blood flow signal strength override request + MSG_ID_DIAL_IN_FLOW_SIG_STRENGTH_OVERRIDE = 0x8036 # Dialysate flow signal strength override request + MSG_ID_BLOOD_PUMP_HOME_CMD = 0x8037 # Blood pump home command + MSG_ID_DIAL_IN_PUMP_HOME_CMD = 0x8038 # Dialysate inlet pump home command + MSG_ID_DIAL_OUT_PUMP_HOME_CMD = 0x8039 # Dialysate outlet pump home command + MSG_ID_SUPER_CLEAR_ALARMS_CMD = 0x803A # Clears all alarms (even if non-recoverable or fault) + MSG_ID_HD_REQUEST_CALIBRATION_DATA = 0x803B # Requests calibration data from HD - MSG_ID_FIRST_DG_TESTER_MESSAGE = 0xA000 # First DG test message ID - MSG_ID_DG_TESTER_LOGIN_REQUEST = MSG_ID_FIRST_DG_TESTER_MESSAGE # DG tester log-in + MSG_ID_DG_TESTER_LOGIN_REQUEST = 0XA000 # DG tester log-in MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 # DG alarm state override message ID MSG_ID_DG_WATCHDOG_TASK_CHECKIN_OVERRIDE = 0xA002 # Watchdog check-in override request MSG_ID_DG_SET_RTC_DATE_TIME = 0xA004 # DG RTC set date/time @@ -174,17 +192,22 @@ MSG_ID_HEAT_DISINFECT_RSRVR2_TO_RSRVR1_DURATION_MINS = 0xA01F # Heat disinfection reservoir 2 to reservoir 1 duration in minutes MSG_ID_HEAT_DISINFECT_NO_OF_CYCLES_TO_RUN = 0xA020 # Heat disinfection number of cycles to run MSG_ID_HEAT_DISINFECT_PUBLISH_INTERVAL_OVERRIDE = 0xA021 # Heat disinfection data publish interval override request - MSG_ID_PRIMING_STATUS = 0x0037 # The priming status MSG_ID_DG_SOFTWARE_RESET_REQUEST = 0xA022 # DG reset request - MSG_ID_HD_VALVES_SET_BLOOD_TRAP_VALVE = 0x8030 # HD valves set blood trap valve state + MSG_ID_DG_OPERATION_MODE_REQUEST = 0xA023 # DG operation mode request + MSG_ID_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE = 0xA024 # Concentrate pumps' target speed override request + MSG_ID_UV_REACTORS_DATA_PUBLISH_INTERVAL_OVERRIDE = 0xA025 # UV reactors data publish interval override + MSG_ID_CONCENTRATE_PUMP_STATE_CHANGE_REQUEST = 0xA026 # Concentrate pumps' state change request (on / off) + MSG_ID_CONCENTRATE_PUMP_PUBLISH_INTERVAL_OVERRIDE = 0xA027 # Concentrate pumps' data publish interval override request + MSG_ID_DG_START_STOP_UV_REACTORS_OVERRIDE = 0xA028 # DG start/stop UV reactors override request + MSG_ID_DG_REQUEST_CALIBRATION_DATA = 0xA029 # Requests calibration data from DG + MSG_ID_HD_DEBUG_EVENT = 0xFFF1 # HD debug event text to be logged in event log MSG_ID_DG_DEBUG_EVENT = 0xFFF2 # DG debug event text to be logged in event log END_OF_MSG_IDS = 0xFFF3 # End of system message IDs - -class RequestRejectReasons(enum.Enum): - +@unique +class RequestRejectReasons(DialinEnum): REQUEST_REJECT_REASON_NONE = 0 REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE = 1 REQUEST_REJECT_REASON_TIMEOUT_WAITING_FOR_USER_CONFIRM = 2 @@ -202,4 +225,54 @@ 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/accelerometer.py =================================================================== diff -u -rcd9d98248537d10d9cf188307ae2237c8cf8e6e4 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/accelerometer.py (.../accelerometer.py) (revision cd9d98248537d10d9cf188307ae2237c8cf8e6e4) +++ dialin/dg/accelerometer.py (.../accelerometer.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -1,19 +1,17 @@ ########################################################################### # -# Copyright (c) 2020-2020 Diality Inc. - All Rights Reserved. +# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. # -# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN -# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # -# @file accelerometer.py +# @file accelerometer.py # -# @date 28-Jul-2020 -# @author S. Nash +# @author (last) Sean Nash +# @date (last) 10-Sep-2020 +# @author (original) Sean Nash +# @date (original) 29-Jul-2020 # -# @brief -# Provides access to accelerometer readings and commands to override the -# accelerometer sensor readings. -# ############################################################################ import struct from ..protocols.CAN import (DenaliMessage, Index: dialin/dg/dialysate_generator.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ dialin/dg/dialysate_generator.py (.../dialysate_generator.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -26,8 +26,11 @@ from .heaters import Heaters from .temperature_sensors import TemperatureSensors from .conductivity_sensors import ConductivitySensors +from .concentrate_pumps import ConcentratePumps +from ..utils.conversions import integer_to_bytearray from ..protocols.CAN import (DenaliCanMessenger, DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish, _LogManager +from ..common.msg_defs import MsgIds, MsgFldPositions class DG(_AbstractSubSystem): @@ -36,23 +39,9 @@ the DG firmware. """ - # DG message IDs - MSG_ID_DG_OPERATION_MODE_BROADCAST = 0x0027 - MSG_ID_DG_REQUEST_DG_VERSION = 0x001C - MSG_ID_DG_DG_VERSION_RESPONSE = 0x001E - MSG_ID_LOGIN_TO_DG = 0xA000 - MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE = 0xA014 - MSG_ID_DG_SOFTWARE_RESET_REQUEST = 0xA022 - # HD login password DG_LOGIN_PASSWORD = '123' - # broadcast message field positions - START_POS_DG_OP_MODE = DenaliMessage.PAYLOAD_START_INDEX - END_POS_DG_OP_MODE = START_POS_DG_OP_MODE + 4 - START_POS_DG_SUB_MODE = END_POS_DG_OP_MODE - END_POS_DG_SUB_MODE = START_POS_DG_SUB_MODE + 4 - # DG version message field positions START_POS_MAJOR = DenaliMessage.PAYLOAD_START_INDEX END_POS_MAJOR = START_POS_MAJOR + 1 @@ -123,11 +112,11 @@ # register handler for HD operation mode broadcast messages if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_OPERATION_MODE_BROADCAST + msg_id = MsgIds.MSG_ID_DG_OP_MODE.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_dg_op_mode_sync) self.can_interface.register_receiving_publication_function(DenaliChannels.dg_sync_broadcast_ch_id, - self.MSG_ID_DG_DG_VERSION_RESPONSE, + MsgIds.MSG_ID_DG_VERSION.value, self._handler_dg_version) # initialize variables that will be populated by DG version response @@ -149,6 +138,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.concentrate_pumps = ConcentratePumps(self.can_interface, self.logger) self.alarms = DGAlarms(self.can_interface, self.logger) def get_version(self): @@ -229,9 +219,9 @@ """ mode = struct.unpack('i', bytearray( - message['message'][self.START_POS_DG_OP_MODE:self.END_POS_DG_OP_MODE])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) smode = struct.unpack('i', bytearray( - message['message'][self.START_POS_DG_SUB_MODE:self.END_POS_DG_SUB_MODE])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) self.dg_operation_mode = mode[0] self.dg_operation_sub_mode = smode[0] @@ -245,7 +235,7 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_LOGIN_TO_DG, + message_id=MsgIds.MSG_ID_DG_TESTER_LOGIN_REQUEST.value, payload=list(map(int, map(ord, self.DG_LOGIN_PASSWORD)))) self.logger.info("Logging in to the DG...") @@ -270,7 +260,7 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_REQUEST_DG_VERSION) + message_id=MsgIds.MSG_ID_REQUEST_FW_VERSIONS.value) self.logger.debug("Sending Dialin request for version to DG") @@ -286,7 +276,7 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE) + message_id=MsgIds.MSG_ID_DG_SAFETY_SHUTDOWN_OVERRIDE.value) self.logger.debug("overriding DG safety shutdown") @@ -316,7 +306,7 @@ """ message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_SOFTWARE_RESET_REQUEST) + message_id=MsgIds.MSG_ID_DG_SOFTWARE_RESET_REQUEST.value) self.logger.debug("requesting DG software reset") @@ -332,3 +322,35 @@ else: self.logger.debug("Timeout!!!!") return False + + def cmd_dg_change_operation_mode_request(self, mode=0): + """ + Constructs and sends an DG change operation mode 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 + + """ + + mode_byte_array = integer_to_bytearray(mode) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_OPERATION_MODE_REQUEST.value, + payload=mode_byte_array) + + self.logger.debug("requesting DG operation mode change") + + # 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("request changing DG operation mode succesfully...") + else: + self.logger.debug("DG operation mode change request failed.") + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -14,6 +14,7 @@ # ############################################################################ from ..utils.conversions import integer_to_bytearray +from ..common.msg_defs import MsgIds from ..protocols.CAN import (DenaliMessage, DenaliChannels) from ..utils.base import _AbstractSubSystem, _publish @@ -26,15 +27,7 @@ \brief Dialysate Generator (DG) Dialin API sub-class for HD proxy commands. """ - # Pressure/Occlusion message IDs - MSG_ID_HD_SWITCH_RESERVOIRS_CMD = 0x0021 - MSG_ID_HD_FILL_CMD = 0x0022 - MSG_ID_HD_DRAIN_CMD = 0x0023 - MSG_ID_HD_START_STOP_DG_CMD = 0x0026 - MSG_ID_HD_START_STOP_DG_TRIMMER_HEATER = 0x002B - MSG_ID_DG_START_STOP_HEAT_DISINFECT = 0x2F - # Reservoir IDs RESERVOIR1 = 0 RESERVOIR2 = 1 @@ -67,7 +60,7 @@ payload = res message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_HD_SWITCH_RESERVOIRS_CMD, + message_id=MsgIds.MSG_ID_DG_SWITCH_RESERVOIR_CMD.value, payload=payload) self.logger.debug("switch reservoirs cmd sent to DG") @@ -98,7 +91,7 @@ payload = vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_HD_FILL_CMD, + message_id=MsgIds.MSG_ID_DG_FILL_CMD.value, payload=payload) self.logger.debug("fill cmd sent to DG") @@ -129,7 +122,7 @@ payload = vol message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_HD_DRAIN_CMD, + message_id=MsgIds.MSG_ID_DG_DRAIN_CMD.value, payload=payload) self.logger.debug("drain cmd sent to DG") @@ -165,7 +158,7 @@ payload = integer_to_bytearray(cmd) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_HD_START_STOP_DG_CMD, + message_id=MsgIds.MSG_ID_STARTING_STOPPING_TREATMENT_CMD.value, payload=payload) self.logger.debug(str+"DG cmd sent to DG") @@ -198,7 +191,7 @@ payload = integer_to_bytearray(cmd) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_HD_START_STOP_DG_TRIMMER_HEATER, + message_id=MsgIds.MSG_ID_DG_START_STOP_TRIMMER_HEATER_CMD.value, payload=payload) self.logger.debug(str+"DG trimmer heater cmd sent to DG") @@ -225,7 +218,7 @@ # 1 is to start payload = integer_to_bytearray(1) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_START_STOP_HEAT_DISINFECT, + message_id=MsgIds.MSG_ID_DG_START_STOP_HEAT_DISINFECT.value, payload=payload) print("Starting heat disinfection process") received_message = self.can_interface.send(message) @@ -241,7 +234,7 @@ # 1 is to start payload = integer_to_bytearray(0) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_START_STOP_HEAT_DISINFECT, + message_id=MsgIds.MSG_ID_DG_START_STOP_HEAT_DISINFECT.value, payload=payload) print("Stopping heat disinfection process") received_message = self.can_interface.send(message) @@ -255,7 +248,7 @@ # 0 is to stop payload = integer_to_bytearray(0) message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_HD_START_STOP_DG_TRIMMER_HEATER, + message_id=MsgIds.MSG_ID_HD_START_STOP_DG_TRIMMER_HEATER.value, payload=payload) print("Stopping heat disinfection process") - self.can_interface.send(message, 0) \ No newline at end of file + self.can_interface.send(message, 0) Index: dialin/dg/heaters.py =================================================================== diff -u -rcd9d98248537d10d9cf188307ae2237c8cf8e6e4 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/heaters.py (.../heaters.py) (revision cd9d98248537d10d9cf188307ae2237c8cf8e6e4) +++ dialin/dg/heaters.py (.../heaters.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -8,7 +8,7 @@ # @file heaters.py # # @author (last) Peter Lucia -# @date (last) 26-Aug-2020 +# @date (last) 02-Oct-2020 # @author (original) Dara Navaei # @date (original) 29-May-2020 # Index: dialin/dg/load_cells.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/load_cells.py (.../load_cells.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ dialin/dg/load_cells.py (.../load_cells.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -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 RESET,NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -29,21 +30,6 @@ Dialysate Generator (DG) Dialin API sub-class for load cell related commands. """ - # Load cell message IDs - MSG_ID_DG_LOAD_CELL_DATA = 0x000C - MSG_ID_DG_LOAD_CELL_OVERRIDE = 0xA005 - MSG_ID_DG_LOAD_CELL_DATA_BROADCAST_INTERVAL_OVERRIDE = 0xA00D - - # Load cell broadcast message field positions - START_POS_LC_A1 = DenaliMessage.PAYLOAD_START_INDEX - END_POS_LC_A1 = START_POS_LC_A1 + 4 - START_POS_LC_A2 = END_POS_LC_A1 - END_POS_LC_A2 = START_POS_LC_A2 + 4 - START_POS_LC_B1 = END_POS_LC_A2 - END_POS_LC_B1 = START_POS_LC_B1 + 4 - START_POS_LC_B2 = END_POS_LC_B1 - END_POS_LC_B2 = START_POS_LC_B2 + 4 - # Load Cell IDs LOAD_CELL_A1 = 0 LOAD_CELL_A2 = 1 @@ -61,7 +47,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_LOAD_CELL_DATA + msg_id = MsgIds.MSG_ID_LOAD_CELL_READINGS.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_load_cells_sync) @@ -89,13 +75,13 @@ """ a1 = struct.unpack('f', bytearray( - message['message'][self.START_POS_LC_A1:self.END_POS_LC_A1])) + message['message'][MsgFldPositions.START_POS_FIELD_1:MsgFldPositions.END_POS_FIELD_1])) a2 = struct.unpack('f', bytearray( - message['message'][self.START_POS_LC_A2:self.END_POS_LC_A2])) + message['message'][MsgFldPositions.START_POS_FIELD_2:MsgFldPositions.END_POS_FIELD_2])) b1 = struct.unpack('f', bytearray( - message['message'][self.START_POS_LC_B1:self.END_POS_LC_B1])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) b2 = struct.unpack('f', bytearray( - message['message'][self.START_POS_LC_B2:self.END_POS_LC_B2])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) self.load_cell_A1 = a1[0] self.load_cell_A2 = a2[0] @@ -127,7 +113,7 @@ payload = rst + grm + idx message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_LOAD_CELL_OVERRIDE, + message_id=MsgIds.MSG_ID_LOAD_CELL_OVERRIDE.value, payload=payload) self.logger.debug("override load cell weight value for sensor " + str(sensor)) @@ -160,7 +146,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_LOAD_CELL_DATA_BROADCAST_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_LOAD_CELLL_SEND_INTERVAL_OVERRIDE.value, payload=payload) self.logger.debug("override DG load cell broadcast interval") Index: dialin/dg/ro_pump.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -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 RESET, NO_RESET from ..protocols.CAN import (DenaliMessage, DenaliChannels) @@ -29,23 +30,6 @@ """ - # RO pump message IDs - MSG_ID_DG_RO_PUMP_PUBLISHED_DATA = 0x001F - MSG_ID_DG_RO_PUMP_PRESSURE_SET_PT_OVERRIDE = 0xA008 - #MSG_ID_DG_RO_FLOW_RATE_OVERRIDE = 0xA009 - MSG_ID_DG_RO_PUMP_BROADCAST_INTERVAL_OVERRIDE = 0xA00A - MSG_ID_RO_PUMP_SET_PT_OVERRIDE = 0xA008 - - # RO pump broadcast message field positions - START_POS_PRES_SET_PT = DenaliMessage.PAYLOAD_START_INDEX - END_POS_PRES_SET_PT = START_POS_PRES_SET_PT + 4 - START_POS_MEAS_FLOW = END_POS_PRES_SET_PT - END_POS_MEAS_FLOW = START_POS_MEAS_FLOW + 4 - START_POS_PWM = END_POS_MEAS_FLOW - END_POS_PWM = START_POS_PWM + 4 - START_POS_STATE = END_POS_PWM - END_POS_STATE = START_POS_STATE + 4 - #Enums RAMP_UP_STATE = 0 @@ -61,7 +45,7 @@ if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id - msg_id = self.MSG_ID_DG_RO_PUMP_PUBLISHED_DATA + msg_id = MsgIds.MSG_ID_RO_PUMP_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_ro_pump_sync) @@ -107,13 +91,13 @@ """ tgt = struct.unpack('f', bytearray( - message['message'][self.START_POS_PRES_SET_PT:self.END_POS_PRES_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])) pwm = struct.unpack('f', bytearray( - message['message'][self.START_POS_PWM:self.END_POS_PWM])) + message['message'][MsgFldPositions.START_POS_FIELD_3:MsgFldPositions.END_POS_FIELD_3])) ro_state = struct.unpack('i', bytearray( - message['message'][self.START_POS_STATE:self.END_POS_STATE])) + message['message'][MsgFldPositions.START_POS_FIELD_4:MsgFldPositions.END_POS_FIELD_4])) self.target_pressure_psi = tgt[0] self.measured_flow_rate_lpm = flow[0] @@ -149,7 +133,7 @@ payload = rst + prs message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_RO_PUMP_SET_PT_OVERRIDE, + message_id=MsgIds.MSG_ID_RO_PUMP_SET_PT_OVERRIDE.value, payload=payload) self.logger.debug("override RO pump pressure set point") @@ -189,7 +173,7 @@ payload = rst + flo message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_RO_PUMP_SET_PT_OVERRIDE, + message_id=MsgIds.MSG_ID_RO_PUMP_SET_PT_OVERRIDE.value, payload=payload) self.logger.debug("override RO pump pressure set point") @@ -230,7 +214,7 @@ payload = rst + mis message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=self.MSG_ID_DG_RO_PUMP_BROADCAST_INTERVAL_OVERRIDE, + message_id=MsgIds.MSG_ID_RO_PUMP_SEND_INTERVAL_OVERRIDE.value, payload=payload) self.logger.debug("override RO pump data broadcast interval") Index: dialin/dg/temperature_sensors.py =================================================================== diff -u -rcd9d98248537d10d9cf188307ae2237c8cf8e6e4 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision cd9d98248537d10d9cf188307ae2237c8cf8e6e4) +++ dialin/dg/temperature_sensors.py (.../temperature_sensors.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -7,8 +7,8 @@ # # @file temperature_sensors.py # -# @author (last) Peter Lucia -# @date (last) 26-Aug-2020 +# @author (last) Dara Navaei +# @date (last) 02-Oct-2020 # @author (original) Dara Navaei # @date (original) 02-Jun-2020 # Index: dialin/hd/accelerometer.py =================================================================== diff -u -rcd9d98248537d10d9cf188307ae2237c8cf8e6e4 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/hd/accelerometer.py (.../accelerometer.py) (revision cd9d98248537d10d9cf188307ae2237c8cf8e6e4) +++ dialin/hd/accelerometer.py (.../accelerometer.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -1,19 +1,17 @@ ########################################################################### # -# Copyright (c) 2020-2020 Diality Inc. - All Rights Reserved. +# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. # -# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN -# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +# WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # -# @file accelerometer.py +# @file accelerometer.py # -# @date 28-Jul-2020 -# @author S. Nash +# @author (last) Sean Nash +# @date (last) 10-Sep-2020 +# @author (original) Sean Nash +# @date (original) 29-Jul-2020 # -# @brief -# Provides access to accelerometer readings and commands to override the -# accelerometer sensor readings. -# ############################################################################ import struct from ..protocols.CAN import (DenaliMessage, Index: dialin/hd/alarms.py =================================================================== diff -u -r91dc90bd009bdbf5621dcaa1bc12ab3d691673f7 -re833e6523af30bc1f644385df10bca91f0e81b13 --- dialin/hd/alarms.py (.../alarms.py) (revision 91dc90bd009bdbf5621dcaa1bc12ab3d691673f7) +++ dialin/hd/alarms.py (.../alarms.py) (revision e833e6523af30bc1f644385df10bca91f0e81b13) @@ -13,30 +13,22 @@ # @date (original) 02-Apr-2020 # ############################################################################ +import struct +from logging import Logger + +from .constants import RESET, NO_RESET +from ..common.msg_defs import MsgIds from ..protocols.CAN import (DenaliMessage, DenaliChannels) -from ..utils.conversions import integer_to_bytearray from ..utils.base import _AbstractSubSystem, _publish -from .constants import RESET, NO_RESET -from collections import OrderedDict -import struct -from logging import Logger -from ..common.alarm_defs import AlarmList +from ..utils.conversions import integer_to_bytearray class HDAlarms(_AbstractSubSystem): """ 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 @@ -77,16 +69,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.value 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.value 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.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_alarm_clear) @@ -100,11 +92,6 @@ # alarm states based on received HD alarm activation and alarm clear messages 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)) def get_alarm_states(self): """ @@ -166,14 +153,6 @@ """ return self.alarms_flags - def get_alarm_ids(self): - """ - Returns a dictionary of the alarm short name and the corresponding id - - @return: OrderedDict of the alarm ids - """ - return self.ids - @_publish(["alarms_state", "alarm_top", "alarms_silence_expires_in", "alarms_escalates_in", "alarms_flags"]) def _handler_alarms_status_sync(self, message): """ @@ -225,6 +204,33 @@ alarm_id = struct.unpack('