Index: leahi_dialin/fp/modules/temperatures.py =================================================================== diff -u -r71216b08590dd4b556c10b3384dddc26c8d29a99 -rf0f1a6557cb07e31eb26bb8f8c70e87902f30626 --- leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision 71216b08590dd4b556c10b3384dddc26c8d29a99) +++ leahi_dialin/fp/modules/temperatures.py (.../temperatures.py) (revision f0f1a6557cb07e31eb26bb8f8c70e87902f30626) @@ -18,19 +18,13 @@ from logging import Logger from .constants import NO_RESET, RESET +from leahi_dialin.common.fp_defs import FPTemperaturesNames from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols.CAN import DenaliMessage, DenaliChannels from leahi_dialin.utils.base import AbstractSubSystem, publish, DialinEnum from leahi_dialin.utils.checks import check_broadcast_interval_override_ms from leahi_dialin.utils.conversions import integer_to_bytearray, float_to_bytearray -@unique -class FPTemperaturesNames(DialinEnum): - P23_TEMP = 0 # P23 temperature sensor. - P22_TEMP = 1 # P22 temperature sensor. - P10_TEMP = 2 # P10 temperature from inlet conductivity sensor. - P19_TEMP = 3 # P19 temperature from outlet conductivity sensor. - FP_BOARD_TEMP = 4 # Board Temperature Sensor class FPTemperatureSensors(AbstractSubSystem): @@ -42,42 +36,76 @@ if self.can_interface is not None: - channel_id = DenaliChannels.dd_sync_broadcast_ch_id - msg_id = MsgIds.MSG_ID_RO_TEMPERATURE_DATA.value - self.can_interface.register_receiving_publication_function(channel_id, msg_id, + channel_id = DenaliChannels.fp_sync_broadcast_ch_id + self.msg_id_fp_temperature_data = MsgIds.MSG_ID_FP_TEMPERATURE_DATA.value + self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_fp_temperature_data, self._handler_temperature_sensors_sync) - self.fp_temperature_sensors_timestamp = 0.0 - self.fp_temperatures = {FPTemperaturesNames.P23_TEMP.name: 0.0, - FPTemperaturesNames.P22_TEMP.name: 0.0, - FPTemperaturesNames.P10_TEMP.name: 0.0, + self.fp_temperature_sensors_timestamp = 0 + self.fp_temperatures = {FPTemperaturesNames.P10_TEMP.name: 0.0, FPTemperaturesNames.P19_TEMP.name: 0.0, - FPTemperaturesNames.FP_BOARD_TEMP.name: 0.0 } + FPTemperaturesNames.M1_TEMP.name: 0.0, + FPTemperaturesNames.M3_TEMP.name: 0.0, + FPTemperaturesNames.P8_TEMP.name: 0.0, + FPTemperaturesNames.P13_TEMP.name: 0.0, + FPTemperaturesNames.P17_TEMP.name: 0.0, + FPTemperaturesNames.X1_TEMP.name: 0.0, + FPTemperaturesNames.X2_TEMP.name: 0.0, + FPTemperaturesNames.X3_TEMP.name: 0.0, + FPTemperaturesNames.X4_TEMP.name: 0.0, + FPTemperaturesNames.P7_TEMP.name: 0.0, + FPTemperaturesNames.P16_TEMP.name: 0.0, + } - @publish(["fp_temperatures_timestamp", "fp_temperatures"]) + @publish(["msg_id_fp_temperature_data", "fp_temperatures", "fp_temperatures_timestamp"]) def _handler_temperature_sensors_sync(self, message,timestamp=0.0): """ Handles published FP temperature sensors message @param message: published FP temperature sensors data message @returns none """ - self.fp_temperatures[FPTemperaturesNames.P23_TEMP.name] = struct.unpack('f', bytearray( + self.fp_temperatures[FPTemperaturesNames.P10_TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_1:MsgFieldPositions.END_POS_FIELD_1]))[0] - self.fp_temperatures[FPTemperaturesNames.P22_TEMP.name] = struct.unpack('f', bytearray( + self.fp_temperatures[FPTemperaturesNames.P19_TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_2:MsgFieldPositions.END_POS_FIELD_2]))[0] - self.fp_temperatures[FPTemperaturesNames.P10_TEMP.name] = struct.unpack('f', bytearray( + self.fp_temperatures[FPTemperaturesNames.M1_TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_3:MsgFieldPositions.END_POS_FIELD_3]))[0] - self.fp_temperatures[FPTemperaturesNames.P19_TEMP.name] = struct.unpack('f', bytearray( + self.fp_temperatures[FPTemperaturesNames.M3_TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_4:MsgFieldPositions.END_POS_FIELD_4]))[0] - self.fp_temperatures[FPTemperaturesNames.FP_BOARD_TEMP.name] = struct.unpack('f', bytearray( + self.fp_temperatures[FPTemperaturesNames.P8_TEMP.name] = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_5:MsgFieldPositions.END_POS_FIELD_5]))[0] + self.fp_temperatures[FPTemperaturesNames.P13_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_6:MsgFieldPositions.END_POS_FIELD_6]))[0] + self.fp_temperatures[FPTemperaturesNames.P17_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_7:MsgFieldPositions.END_POS_FIELD_7]))[0] + + self.fp_temperatures[FPTemperaturesNames.X1_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] + + self.fp_temperatures[FPTemperaturesNames.X2_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] + + self.fp_temperatures[FPTemperaturesNames.X3_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] + + self.fp_temperatures[FPTemperaturesNames.X4_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11]))[0] + + self.fp_temperatures[FPTemperaturesNames.X4_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12]))[0] + + self.fp_temperatures[FPTemperaturesNames.X4_TEMP.name] = struct.unpack('f', bytearray( + message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13]))[0] + + self.fp_temperature_sensors_timestamp = timestamp + def cmd_temperatures_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval. @@ -98,7 +126,7 @@ message = DenaliMessage.build_message( channel_id=DenaliChannels.dialin_to_fp_ch_id, - message_id=MsgIds.MSG_ID_RO_TEMPERATURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, + message_id=MsgIds.MSG_ID_FP_TEMPERATURE_SENSOR_PUBLISH_INTERVAL_OVERRIDE_REQUEST.value, payload=payload) self.logger.debug("Sending {} ms publish interval to the Temperature Sensors module".format(ms)) @@ -111,4 +139,50 @@ 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 FP. + 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 + + if sensor_index <= FPTemperaturesNames.P19_TEMP.value: + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, + message_id=MsgIds.MSG_ID_FP_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST.value, + payload=payload) + + elif FPTemperaturesNames.P7_TEMP.value <= sensor_index < FPTemperaturesNames.NUM_OF_TEMPERATURE_SENSORS.value: + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, + message_id=MsgIds.MSG_ID_FP_FLOW_TEMP_OVERRIDE_REQUEST.value, + payload=payload) + + else: # the remaining sensors are sent to the pressure temp override + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_fp_ch_id, + message_id=MsgIds.MSG_ID_FP_PRESSURE_TEMP_OVERRIDE_REQUEST.value, + payload=payload) + + self.logger.debug("Setting sensor {} to {} C".format(list(self.fp_temperatures.keys())[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 \ No newline at end of file