Index: leahi-dialin/dd/modules/concentrate_pump.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/concentrate_pump.py (.../concentrate_pump.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -56,7 +56,7 @@ self.logger = logger if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_concentrate_pumps_sync) @@ -184,7 +184,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + speed_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_TARGET_SPEED_OVERRIDE_REQUEST.value, payload=payload) @@ -220,7 +220,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + speed_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_MEASURED_SPEED_OVERRIDE_REQUEST.value, payload=payload) @@ -259,7 +259,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + status_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_PARKED_OVERRIDE_REQUEST.value, payload=payload) @@ -298,7 +298,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + status_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_PARK_FAULT_OVERRIDE_REQUEST.value, payload=payload) @@ -331,7 +331,7 @@ """ payload = integer_to_bytearray(pump_id) - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONCENTRATE_PUMP_PARK_REQUEST_OVERRIDE_REQUEST.value, payload=payload) Index: leahi-dialin/dd/modules/conductivity_sensors.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/conductivity_sensors.py (.../conductivity_sensors.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -51,7 +51,7 @@ self.logger = logger if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DD_CONDUCTIVITY_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_conductivity_sensors_sync) @@ -127,7 +127,7 @@ ms_byte_array = integer_to_bytearray(ms) payload = reset_byte_array + ms_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) @@ -171,7 +171,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + cond_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_READINGS_OVERRIDE_REQUEST.value, payload=payload) @@ -208,7 +208,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + temp_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_READINGS_OVERRIDE_REQUEST.value, payload=payload) @@ -245,7 +245,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + read_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_READ_COUNTER_OVERRIDE_REQUEST.value, payload=payload) @@ -282,7 +282,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + error_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_CONDUCTIVITY_SENSOR_ERROR_COUNTER_OVERRIDE_REQUEST.value, payload=payload) Index: leahi-dialin/dd/modules/dialysate_pump.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/dialysate_pump.py (.../dialysate_pump.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -56,7 +56,7 @@ self.logger = logger if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DIALYSATE_PUMPS_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_concentrate_pumps_sync) @@ -167,7 +167,7 @@ ms_byte_array = integer_to_bytearray(ms) payload = reset_byte_array + ms_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) @@ -202,7 +202,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + speed_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_TARGET_SPEED_OVERRIDE_REQUEST.value, payload=payload) @@ -237,7 +237,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + speed_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_SPEED_OVERRIDE_REQUEST.value, payload=payload) @@ -272,7 +272,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + pressure_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_TARGET_PRESSURE_OVERRIDE_REQUEST.value, payload=payload) @@ -307,7 +307,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + current_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_CURRENT_OVERRIDE_REQUEST.value, payload=payload) @@ -342,7 +342,7 @@ pump_id_byte_array = integer_to_bytearray(pump_id) payload = reset_byte_array + direction_byte_array + pump_id_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_DIALYSATE_PUMPS_MEASURED_DIRECTION_OVERRIDE_REQUEST.value, payload=payload) Index: leahi-dialin/dd/modules/heaters.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/heaters.py (.../heaters.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/heaters.py (.../heaters.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -78,7 +78,7 @@ self.dd_heaters_timestamp = 0.0 if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DD_HEATERS_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_heaters_sync) @@ -131,7 +131,7 @@ interval_value = integer_to_bytearray(ms) payload = reset_value + interval_value - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_HEATERS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) @@ -162,7 +162,7 @@ heater_name = integer_to_bytearray(heater) duty = float_to_bytearray(duty_cycle/100) payload = reset_value + duty + heater_name - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_HEATERS_DUTY_CYCLE_OVERRIDE_REQUEST.value, payload=payload) @@ -193,7 +193,7 @@ heater_name = integer_to_bytearray(heater) cmd = integer_to_bytearray(command) payload = reset_value + cmd + heater_name - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_HEATERS_START_STOP_OVERRIDE_REQUEST.value, payload=payload) Index: leahi-dialin/dd/modules/levels.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/levels.py (.../levels.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/levels.py (.../levels.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -49,7 +49,7 @@ self.dd_levels_timestamp = 0 if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DD_LEVEL_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_heaters_sync) @@ -91,7 +91,7 @@ interval_value = integer_to_bytearray(ms) payload = reset_value + interval_value - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_LEVELS_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) @@ -122,7 +122,7 @@ level_sensor = integer_to_bytearray(heater) sts = integer_to_bytearray(status) payload = reset_value + sts + level_sensor - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_LEVELS_STATUS_OVERRIDE_REQUEST.value, payload=payload) Index: leahi-dialin/dd/modules/pressure_sensors.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/pressure_sensors.py (.../pressure_sensors.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -57,7 +57,7 @@ self.logger = logger if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DD_PRESSURES_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_pressures_sync) @@ -155,7 +155,7 @@ ivl = integer_to_bytearray(ms) payload = rst + ivl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) @@ -197,7 +197,7 @@ idx = integer_to_bytearray(sensor) payload = rst + prs + idx - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_READINGS_OVERRIDE_REQUEST.value, payload=payload) @@ -239,7 +239,7 @@ idx = integer_to_bytearray(sensor) payload = rst + tmp + idx - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_TEMPERATURE_OVERRIDE_REQUEST.value, payload=payload) @@ -272,7 +272,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + read_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_READ_COUNTER_OVERRIDE_REQUEST.value, payload=payload) @@ -309,7 +309,7 @@ sensor_byte_array = integer_to_bytearray(sensor) payload = reset_byte_array + error_byte_array + sensor_byte_array - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_ERROR_COUNTER_OVERRIDE_REQUEST.value, payload=payload) @@ -355,7 +355,7 @@ idx = integer_to_bytearray(sensor) payload = rst + prs + idx - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_FILTER_READINGS_OVERRIDE_REQUEST.value, payload=payload) @@ -397,7 +397,7 @@ idx = integer_to_bytearray(sensor) payload = rst + tmp + idx - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, message_id=MsgIds.MSG_ID_DD_PRESSURE_SENSOR_FILTER_TEMPERATURE_OVERRIDE_REQUEST.value, payload=payload) Index: leahi-dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -1 +1,267 @@ +########################################################################### +# +# Copyright (c) 2021-2024 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. +# +# @file temperatures.py +# +# @author (last) Micahel Garthwaite +# @date (last) 28-Jul-2023 +# @author (original) Dara Navaei +# @date (original) 01-Dec-2021 +# +############################################################################ +import struct +from enum import unique +from logging import Logger + +from .constants import NO_RESET +from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..protocols.CAN import DenaliMessage, DenaliChannels +from ..utils.base import AbstractSubSystem, publish, DialinEnum +from ..utils.checks import check_broadcast_interval_override_ms +from ..utils.conversions import integer_to_bytearray, float_to_bytearray + + +@unique +class DDTemperaturesNames(DialinEnum): + INLET_HEAT_EXCHANGER = 0 + OUTLET_HEAT_EXCHANGER = 1 + HYDRAULICS_PRIMARY_HEATER = 2 + TRIMMER_HEATER = 3 + BOARD_TEMP = 4 + BARO_TEMP_SENSOR = 5 + + +class TemperatureSensors(AbstractSubSystem): + + def __init__(self, can_interface, logger: Logger): + + super().__init__() + + self.can_interface = can_interface + self.logger = logger + # Dictionary of the temperature sensors + self.dd_temperatures_timestamp = 0.0 + self.dd_temperatures = {DDTemperaturesNames.INLET_HEAT_EXCHANGER.name: 0.0, + DDTemperaturesNames.OUTLET_HEAT_EXCHANGER.name: 0.0, + DDTemperaturesNames.HYDRAULICS_PRIMARY_HEATER.name: 0.0, + DDTemperaturesNames.TRIMMER_HEATER.name: 0.0, + DDTemperaturesNames.BOARD_TEMP.name: 0.0, + DDTemperaturesNames.BARO_TEMP_SENSOR.name: 0.0,} + + if self.can_interface is not None: + channel_id = DenaliChannels.dd_sync_broadcast_ch_id + msg_id = MsgIds.MSG_ID_DD_TEMPERATURE_DATA.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, + self._handler_temperature_sensors_sync) + + @publish(["dd_temperatures_timestamp", "dd_temperatures"]) + def _handler_temperature_sensors_sync(self, message,timestamp=0.0): + """ + Handles published temperature sensors message + + @param message: published temperature sensors data message + @returns none + """ + self.temperatures[DGTemperaturesNames.INLET_HEAT_EXCHANGER.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] + + self.temperatures[DGTemperaturesNames.OUTLET_HEAT_EXCHANGER.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] + + self.temperatures[DGTemperaturesNames.HYDRAULICS_PRIMARY_HEATER.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] + + self.temperatures[DGTemperaturesNames.TRIMMER_HEATER.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] + + self.temperatures[DGTemperaturesNames.BOARD_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + + self.temperatures[DGTemperaturesNames.BARO_TEMP_SENSOR.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + + self.dg_temperatures_timestamp = timestamp + + def cmd_temperatures_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends broadcast time interval. + Constraints: + Must be logged into DD. + Given interval must be non-zero and a multiple of the DD general task interval (50 ms). + + @param ms: (int) Publish time interval in ms + @param reset: (int) 1 to reset a previous override, 0 to override + @returns 1 if successful, zero otherwise + """ + if not check_broadcast_interval_override_ms(ms): + return False + + reset_value = integer_to_bytearray(reset) + interval_value = integer_to_bytearray(ms) + payload = reset_value + interval_value + + message = DenaliMessage.build_message( + channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, + payload=payload) + + self.logger.debug("Sending {} ms publish interval to the Temperature Sensors module".format(ms)) + # Send message + received_message = self.can_interface.send(message) + + # If there is content in message + if received_message is not None: + # Response payload is OK or not + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_temperatures_value_override(self, sensor_index: int, sensor_value: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the value override of a temperature sensor. + Constraints: + Must be logged into DD. + Given sensor_index must be one of the sensors listed below. + + @param sensor_index : (int) Index of the sensor + @param sensor_value: (float) Value of the sensor to override + @param reset: (int) whether to reset the override value. The default is NO_RESET + @returns 1 if successful, zero otherwise + + """ + rst = integer_to_bytearray(reset) + value = float_to_bytearray(sensor_value) + index = integer_to_bytearray(sensor_index) + + payload = rst + value + index + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_MEASURED_TEMPERATURE_OVERRIDE_REQUEST.value, + payload=payload) + + self.logger.debug("Setting sensor {} to {} C".format(sensor_index, sensor_value)) + + # Send message + received_message = self.can_interface.send(message) + + # If there is content in message + if received_message is not None: + # Response payload is OK or not + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + + def cmd_temperature_sensor_read_counter_override(self, sensor: int, counter: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the temperature value override command + + @param sensor: unsigned int - sensor ID + @param counter: float - temperature value to override sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + + """ + + reset_byte_array = integer_to_bytearray(reset) + read_byte_array = float_to_bytearray(counter) + sensor_byte_array = integer_to_bytearray(sensor) + payload = reset_byte_array + read_byte_array + sensor_byte_array + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_READ_COUNTER_OVERRIDE_REQUEST.value, + payload=payload) + + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(conductivity) + " celsius" + self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.error("Timeout!!!!") + return False + + def cmd_baro_sensor_read_counter_override(self, counter: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the temperature value override command + + @param sensor: unsigned int - sensor ID + @param counter: float - temperature value to override sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + + """ + + reset_byte_array = integer_to_bytearray(reset) + read_byte_array = float_to_bytearray(counter) + payload = reset_byte_array + read_byte_array + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_BARO_READ_COUNTER_OVERRIDE_REQUEST.value, + payload=payload) + + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(conductivity) + " celsius" + self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.error("Timeout!!!!") + return False + + def cmd_baro_sensor_crc_override(self, counter: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the temperature value override command + + @param sensor: unsigned int - sensor ID + @param counter: float - temperature value to override sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + + """ + + reset_byte_array = integer_to_bytearray(reset) + read_byte_array = float_to_bytearray(counter) + payload = reset_byte_array + read_byte_array + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_TEMPERATURE_SENSOR_BARO_CRC_OVERRIDE_REQUEST.value, + payload=payload) + + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(conductivity) + " celsius" + self.logger.debug("override conductivity sensor value for sensor " + str(sensor) + ": " + str_res) + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.error("Timeout!!!!") + return False \ No newline at end of file Index: leahi-dialin/dd/modules/valves.py =================================================================== diff -u -r4d96d48cebe2c74e0fd6feced56a66e7402d33c3 -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/dd/modules/valves.py (.../valves.py) (revision 4d96d48cebe2c74e0fd6feced56a66e7402d33c3) +++ leahi-dialin/dd/modules/valves.py (.../valves.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -32,75 +32,42 @@ @unique -class VPiVSPVBfVRD1VRD2States(DialinEnum): +class DDValveStates(DialinEnum): VALVE_STATE_CLOSED = 0 VALVE_STATE_OPEN = 1 @unique -class VPdStates(DialinEnum): - VALVE_STATE_DRAIN_C_TO_NO = 0 - VALVE_STATE_OPEN_C_TO_NC = 1 +class DDValveNames(DialinEnum): + VDR = 0 # Valve Drain (D53) + VTD = 1 # Valve Thermal Disinfect (D52) + VHB = 2 # Valve Hydraulics Bypass (D8) + VRP = 3 # Valve Rinse Port (D54) + VHO = 4 # Valve Hydraulics Outlet (D14) + VDB1 = 5 # Valve DryBcarb Inlet (D65) + VP1 = 6 # Valve Purge 1 (D64) + VPT = 7 # Valve Pressure Test (D31) + VDB2 = 8 # Valve Dialyzer Bypass (D34) + VDI = 9 # Valve Dialyzer Inlet (D35) + VDO = 10 # Valve Dialyzer Outlet (D40) + VP2 = 11 # Valve Dialysate Out Purge 2 (D47) + VHI = 12 # Valve Hydraulics Inlet (D3) + VWI = 13 # Valve Water Inlet (M4) + RSRVD_SPACE1 = 14 # This space has been reserved + RSRVD_SPACE2 = 15 # This space has been reserved + BCV1 = 16 # Balancing chamber Valve 1 (D23) + BCV2 = 17 # Balancing chamber Valve 2 (D19) + BCV3 = 18 # Balancing chamber Valve 3 (D25) + BCV4 = 19 # Balancing chamber Valve 4 (D21) + BCV5 = 20 # Balancing chamber Valve 5 (D24) + BCV6 = 21 # Balancing chamber Valve 6 (D20) + BCV7 = 22 # Balancing chamber Valve 7 (D26) + BCV8 = 23 # Balancing chamber Valve 8 (D22) + UFI1 = 24 # Ultrafiltration Valve 1 Inlet (D69) + UFI2 = 25 # Ultrafiltration Valve 2 Inlet (D71) + UFO1 = 26 # Ultrafiltration Valve 1 Outlet (D70) + UFO2 = 27 # Ultrafiltration Valve 2 Outlet (D72) - -@unique -class VPoStates(DialinEnum): - VALVE_STATE_NOFILL_C_TO_NO = 0 - VALVE_STATE_FILL_C_TO_NC = 1 - - -@unique -class VDrVRcStates(DialinEnum): - VALVE_STATE_DRAIN_C_TO_NO = 0 - VALVE_STATE_RECIRC_C_TO_NC = 1 - - -@unique -class VRoVRiStates(DialinEnum): - VALVE_STATE_R1_C_TO_NO = 0 - VALVE_STATE_R2_C_TO_NC = 1 - - -@unique -class VRdVRfStates(DialinEnum): - VALVE_STATE_R2_C_TO_NO = 0 - VALVE_STATE_R1_C_TO_NC = 1 - -@unique -class DGValvesSensedStates(DialinEnum): - VALVE_STATE_OPEN = 0 # Open valve state, used only for VPi, VBf, VRD1, VRD2, and VSP - VALVE_STATE_CLOSED = 1 # Closed valve state, used only for VPi, VBf, VRD1, VRD2, and VSP - VALVE_STATE_OPEN_C_TO_NC = 2 # Open Common to Normally Closed valve state, used only for VPd - VALVE_STATE_NOFILL_C_TO_NO = 3 # No Fill Common to Normally Open valve state, used only for VPo - VALVE_STATE_FILL_C_TO_NC = 4 # Fill Common to Normally Closed valve state, used only for VPo - VALVE_STATE_DRAIN_C_TO_NO = 5 # Drain Common to Normally Open valve state, used only for VDr and VRc. It is also used for VPd in V3 - VALVE_STATE_RECIRC_C_TO_NC = 6 # Recirculate Common to Normally Closed valve state, used only for VDr and VRc - VALVE_STATE_R1_C_TO_NO = 7 # Reservoir 1 Common to Normally Open valve state, used only for VRo and VRi - VALVE_STATE_R1_C_TO_NC = 8 # Reservoir 1 Common to Normally Closed valve state, used only for VRf - VALVE_STATE_R2_C_TO_NO = 9 # Reservoir 2 Common to Normally Open valve state, used only for VRf - VALVE_STATE_R2_C_TO_NC = 10 # Reservoir 2 Common to Normally Closed valve state, used only for VRo and VRi - NUM_OF_VALVE_STATES = 11 # number of valve states - - -@unique -class DGValveNames(DialinEnum): - # NOTE: NUM_OF enum has been removed because it should be a part of the software configuration - # structure since the members of this class is for looped to create the dictionary automatically - VALVE_RESERVOIR_FILL = 0 # VRF - VALVE_RESERVOIR_INLET = 1 # VRI - RESERVED_SPACE = 2 # RESERVED SPACE - VALVE_RESERVOIR_OUTLET = 3 # VRO - VALVE_PRESSURE_OUTLET = 4 # VPO - VALVE_BYPASS_FILTER = 5 # VBF - VALVE_RECIRCULATE = 6 # VRC - VALVE_DRAIN = 7 # VDR - VALVE_PRESSURE_INLET = 8 # VPI - VALVE_SAMPLING_PORT = 9 # VSP - VALVE_RESERVOIR_DRAIN_1 = 10 # VRD1 - VALVE_RESERVOIR_DRAIN_2 = 11 # VRD2 - VALVE_PRODUCTION_DRAIN = 12 # VPD - - class DDValves(AbstractSubSystem): """ Dialysate Delivery (DG) interface for valve related commands. @@ -124,29 +91,29 @@ self.dg_valves_states_timestamp = 0.0 if self.can_interface is not None: - channel_id = DenaliChannels.dg_sync_broadcast_ch_id + channel_id = DenaliChannels.dd_sync_broadcast_ch_id msg_id = MsgIds.MSG_ID_DD_VALVES_STATES_DATA.value self.can_interface.register_receiving_publication_function(channel_id, msg_id, self._handler_valves_sync) self.valve_states_all = 0x0000 - self.valve_state_VRF = {"id": DGValveNames.VALVE_RESERVOIR_FILL.value, "state": DEENERGIZED} - self.valve_state_VRI = {"id": DGValveNames.VALVE_RESERVOIR_INLET.value, "state": DEENERGIZED} - self.valve_state_VRO = {"id": DGValveNames.VALVE_RESERVOIR_OUTLET.value, "state": DEENERGIZED} - self.valve_state_VPO = {"id": DGValveNames.VALVE_PRESSURE_OUTLET.value, "state": DEENERGIZED} - self.valve_state_VBF = {"id": DGValveNames.VALVE_BYPASS_FILTER.value, "state": DEENERGIZED} - self.valve_state_VRC = {"id": DGValveNames.VALVE_RECIRCULATE.value, "state": DEENERGIZED} - self.valve_state_VDR = {"id": DGValveNames.VALVE_DRAIN.value, "state": DEENERGIZED} - self.valve_state_VPI = {"id": DGValveNames.VALVE_PRESSURE_INLET.value, "state": DEENERGIZED} - self.valve_state_VSP = {"id": DGValveNames.VALVE_SAMPLING_PORT.value, "state": DEENERGIZED} - self.valve_state_VRD1 = {"id": DGValveNames.VALVE_RESERVOIR_DRAIN_1.value, "state": DEENERGIZED} - self.valve_state_VRD2 = {"id": DGValveNames.VALVE_RESERVOIR_DRAIN_2.value, "state": DEENERGIZED} - self.valve_state_VPD = {"id": DGValveNames.VALVE_PRODUCTION_DRAIN.value, "state": DEENERGIZED} + self.valve_state_VRF = {"id": DDValveNames.VALVE_RESERVOIR_FILL.value, "state": DEENERGIZED} + self.valve_state_VRI = {"id": DDValveNames.VALVE_RESERVOIR_INLET.value, "state": DEENERGIZED} + self.valve_state_VRO = {"id": DDValveNames.VALVE_RESERVOIR_OUTLET.value, "state": DEENERGIZED} + self.valve_state_VPO = {"id": DDValveNames.VALVE_PRESSURE_OUTLET.value, "state": DEENERGIZED} + self.valve_state_VBF = {"id": DDValveNames.VALVE_BYPASS_FILTER.value, "state": DEENERGIZED} + self.valve_state_VRC = {"id": DDValveNames.VALVE_RECIRCULATE.value, "state": DEENERGIZED} + self.valve_state_VDR = {"id": DDValveNames.VALVE_DRAIN.value, "state": DEENERGIZED} + self.valve_state_VPI = {"id": DDValveNames.VALVE_PRESSURE_INLET.value, "state": DEENERGIZED} + self.valve_state_VSP = {"id": DDValveNames.VALVE_SAMPLING_PORT.value, "state": DEENERGIZED} + self.valve_state_VRD1 = {"id": DDValveNames.VALVE_RESERVOIR_DRAIN_1.value, "state": DEENERGIZED} + self.valve_state_VRD2 = {"id": DDValveNames.VALVE_RESERVOIR_DRAIN_2.value, "state": DEENERGIZED} + self.valve_state_VPD = {"id": DDValveNames.VALVE_PRODUCTION_DRAIN.value, "state": DEENERGIZED} # NOTE: The len function counts the enums with the same number only once. This is not the case in the DG valves # class because each valve must have a unique ID. - self.valve_states_enum = [0 for _ in range(len(DGValveNames))] + self.valve_states_enum = [0 for _ in range(len(DDValveNames))] - for valve in DGValveNames.__members__: + for valve in DDValveNames.__members__: self.valves_sensed_states[valve] = '' def get_valve_states(self): @@ -288,18 +255,18 @@ self.valve_state_VRD2["state"] = self._binary_to_valve_state(vst[0] & 2048) self.valve_state_VPD["state"] = self._binary_to_valve_state(vst[0] & 4096) - self.valve_states_enum[DGValveNames.VALVE_RESERVOIR_FILL.value] = VRdVRfStates(self._binary_to_valve_state(vst[0] & 1)).name # VRF - self.valve_states_enum[DGValveNames.VALVE_RESERVOIR_INLET.value] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 2)).name # VRI - self.valve_states_enum[DGValveNames.VALVE_RESERVOIR_OUTLET.value] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 8)).name # VRO - self.valve_states_enum[DGValveNames.VALVE_PRESSURE_OUTLET.value] = VPoStates(self._binary_to_valve_state(vst[0] & 16)).name # VPO - self.valve_states_enum[DGValveNames.VALVE_BYPASS_FILTER.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 32)).name # VBF - self.valve_states_enum[DGValveNames.VALVE_RECIRCULATE.value] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 64)).name # VRC - self.valve_states_enum[DGValveNames.VALVE_DRAIN.value] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 128)).name # VDR - self.valve_states_enum[DGValveNames.VALVE_PRESSURE_INLET.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 256)).name # VPI - self.valve_states_enum[DGValveNames.VALVE_SAMPLING_PORT.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 512)).name # VSP - self.valve_states_enum[DGValveNames.VALVE_RESERVOIR_DRAIN_1.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 1024)).name # VRD1 - self.valve_states_enum[DGValveNames.VALVE_RESERVOIR_DRAIN_2.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 2048)).name # VRD2 - self.valve_states_enum[DGValveNames.VALVE_PRODUCTION_DRAIN.value] = VPdStates(self._binary_to_valve_state(vst[0] & 4096)).name # VPD + self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_FILL.value] = VRdVRfStates(self._binary_to_valve_state(vst[0] & 1)).name # VRF + self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_INLET.value] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 2)).name # VRI + self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_OUTLET.value] = VRoVRiStates(self._binary_to_valve_state(vst[0] & 8)).name # VRO + self.valve_states_enum[DDValveNames.VALVE_PRESSURE_OUTLET.value] = VPoStates(self._binary_to_valve_state(vst[0] & 16)).name # VPO + self.valve_states_enum[DDValveNames.VALVE_BYPASS_FILTER.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 32)).name # VBF + self.valve_states_enum[DDValveNames.VALVE_RECIRCULATE.value] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 64)).name # VRC + self.valve_states_enum[DDValveNames.VALVE_DRAIN.value] = VDrVRcStates(self._binary_to_valve_state(vst[0] & 128)).name # VDR + self.valve_states_enum[DDValveNames.VALVE_PRESSURE_INLET.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 256)).name # VPI + self.valve_states_enum[DDValveNames.VALVE_SAMPLING_PORT.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 512)).name # VSP + self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_DRAIN_1.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 1024)).name # VRD1 + self.valve_states_enum[DDValveNames.VALVE_RESERVOIR_DRAIN_2.value] = VPiVSPVBfVRD1VRD2States(self._binary_to_valve_state(vst[0] & 2048)).name # VRD2 + self.valve_states_enum[DDValveNames.VALVE_PRODUCTION_DRAIN.value] = VPdStates(self._binary_to_valve_state(vst[0] & 4096)).name # VPD start = self.END_POS_VALVES_STATES end = start + 1 @@ -344,8 +311,8 @@ vlv = integer_to_bytearray(valve) payload = rst + ste + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_DG_VALVES_SENSED_STATE_OVERRIDE.value, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_VALVE_SENSED_STATE_OVERRIDE_REQUEST.value, payload=payload) self.logger.debug("Override valve sensed state") @@ -394,8 +361,8 @@ vlv = integer_to_bytearray(valve) payload = rst + ste + vlv - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_VALVE_STATE_OVERRIDE.value, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_VALVE_STATE_OVERRIDE_REQUEST.value, payload=payload) self.logger.debug("Override valve state") @@ -431,8 +398,8 @@ ivl = integer_to_bytearray(ms) payload = rst + ivl - message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, - message_id=MsgIds.MSG_ID_DG_VALVES_STATES_PUBLISH_INTERVAL_OVERRIDE.value, + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dd_ch_id, + message_id=MsgIds.MSG_ID_DD_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) self.logger.debug("override valves states publish interval") Index: leahi-dialin/protocols/CAN.py =================================================================== diff -u -r07db7b5f01ad17d60c190e21574e1ed0552535ff -r3105612137b369a34e717f7524b29f81134fcb4c --- leahi-dialin/protocols/CAN.py (.../CAN.py) (revision 07db7b5f01ad17d60c190e21574e1ed0552535ff) +++ leahi-dialin/protocols/CAN.py (.../CAN.py) (revision 3105612137b369a34e717f7524b29f81134fcb4c) @@ -379,24 +379,28 @@ specifically in the CAN Channels sheet, should also be applied here. """ - hd_alarm_broadcast_ch_id = 0x001 - dg_alarm_broadcast_ch_id = 0x002 - ui_alarm_broadcast_ch_id = 0x004 - hd_to_dg_ch_id = 0x008 - dg_to_hd_ch_id = 0x010 - hd_to_ui_ch_id = 0x020 - hd_sync_broadcast_ch_id = 0x040 - dg_to_ui_ch_id = 0x070 - dg_sync_broadcast_ch_id = 0x080 - ui_to_hd_ch_id = 0x100 - ui_to_dg_ch_id = 0x110 - ui_sync_broadcast_ch_id = 0x200 - dialin_to_hd_ch_id = 0x400 - hd_to_dialin_ch_id = 0x401 - dialin_to_dg_ch_id = 0x402 - dg_to_dialin_ch_id = 0x403 - dialin_to_ui_ch_id = 0x404 - ui_to_dialin_ch_id = 0x405 + td_alarm_broadcast_ch_id = 0x001 + dd_alarm_broadcast_ch_id = 0x002 + ro_alarm_broadcast_ch_id = 0x004 + ui_alarm_broadcast_ch_id = 0x008 + td_to_dd_ch_id = 0x010 + dd_to_td_ch_id = 0x011 + dd_to_ro_ch_id = 0x020 + ro_to_dd_ch_id = 0x021 + td_to_ui_ch_id = 0x040 + ui_to_td_ch_id = 0x041 + td_sync_broadcast_ch_id = 0x100 + dd_sync_broadcast_ch_id = 0x101 + ro_sync_broadcast_ch_id = 0x102 + ui_sync_broadcast_ch_id = 0x103 + dialin_to_td_ch_id = 0x400 + td_to_dialin_ch_id = 0x401 + dialin_to_dd_ch_id = 0x402 + dd_to_dialin_ch_id = 0x403 + dialin_to_ro_ch_id = 0x404 + ro_to_dialin_ch_id = 0x405 + dialin_to_ui_ch_id = 0x406 + ui_to_dialin_ch_id = 0x407 class LongDenaliMessageBuilder: