Index: leahi_dialin/dd/modules/temperature_sensors.py =================================================================== diff -u -r68cb68aa6427556aab6e1ff8f4b538690182b17d -r82b297112cb6098c63938b45e1e2b6099f460697 --- leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 68cb68aa6427556aab6e1ff8f4b538690182b17d) +++ leahi_dialin/dd/modules/temperature_sensors.py (.../temperature_sensors.py) (revision 82b297112cb6098c63938b45e1e2b6099f460697) @@ -19,7 +19,7 @@ from .constants import NO_RESET, RESET from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions -from leahi_dialin.common.dd_defs import COND_SENSOR_INDEX_OFFSET, DDTemperaturesNames +from leahi_dialin.common.dd_defs import COND_SENSOR_INDEX_OFFSET, DDTemperaturesNames, DDPressureNames, DDPressureAttributesEnum 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 @@ -60,6 +60,24 @@ self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_dd_temperature_data, self._handler_temperature_sensors_sync) + if self.can_interface is not None: + channel_id = DenaliChannels.dd_sync_broadcast_ch_id + self.msg_id_dd_pressures_temperature_data = MsgIds.MSG_ID_DD_PRESSURES_DATA.value + self.can_interface.register_receiving_publication_function(channel_id, self.msg_id_dd_pressures_temperature_data, + self._handler_pressure_sensors_temperatures_sync) + + self.dd_pressure_temperatures = { + DDPressureNames.M1_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 }, + DDPressureNames.M3_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 }, + DDPressureNames.D9_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 }, + DDPressureNames.D66_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 }, + DDPressureNames.D51_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 }, + DDPressureNames.D18_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 }, + DDPressureNames.D41_PRES.name: { DDPressureAttributesEnum.TEMP.name: 0.0 } + } + + self.dd_pressure_sensors_temperatures_timestamp = 0.0 + @publish(["msg_id_dd_temperature_data", "dd_temperatures", "dd_temperatures_timestamp"]) def _handler_temperature_sensors_sync(self, message,timestamp=0.0): """ @@ -115,6 +133,31 @@ self.dd_temperatures_timestamp = timestamp + @publish(["msg_id_dd_pressures_temperature_data", "dd_pressure_temperatures", "dd_pressure_sensors_temperatures_timestamp"]) + def _handler_pressure_sensors_temperatures_sync(self, message,timestamp=0.0): + """ + Handles published DD pressure sensors temperature message + + @param message: published DD pressure sensors temperatures data message + @returns none + """ + self.dd_pressure_temperatures[DDPressureNames.M1_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_8:MsgFieldPositions.END_POS_FIELD_8]))[0] + self.dd_pressure_temperatures[DDPressureNames.M3_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_9:MsgFieldPositions.END_POS_FIELD_9]))[0] + self.dd_pressure_temperatures[DDPressureNames.D9_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_10:MsgFieldPositions.END_POS_FIELD_10]))[0] + self.dd_pressure_temperatures[DDPressureNames.D66_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_11:MsgFieldPositions.END_POS_FIELD_11]))[0] + self.dd_pressure_temperatures[DDPressureNames.D51_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12]))[0] + self.dd_pressure_temperatures[DDPressureNames.D18_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_13:MsgFieldPositions.END_POS_FIELD_13]))[0] + self.dd_pressure_temperatures[DDPressureNames.D41_PRES.name][DDPressureAttributesEnum.TEMP.name] = struct.unpack( + 'f', bytearray(message['message'][MsgFieldPositions.START_POS_FIELD_14:MsgFieldPositions.END_POS_FIELD_14]))[0] + + self.dd_pressure_sensors_temperatures_timestamp = timestamp + def cmd_temperatures_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: """ Constructs and sends broadcast time interval. @@ -157,7 +200,7 @@ 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_index : (int) Index of the sensor from DDTemperaturesNames @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 @@ -293,4 +336,72 @@ return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] else: self.logger.error("Timeout!!!!") + return False + + def cmd_pressure_temperature_override(self, sensor: int, temperature: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the pressure temperature override command. + Constraints: + Must be logged into DD. + + @param sensor: unsigned int - pressure sensor ID from DDPressureNames + @param temperature: float - pressure (in PSI) + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + tmp = float_to_bytearray(temperature) + idx = integer_to_bytearray(sensor) + payload = rst + tmp + idx + + 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) + + self.logger.debug("override pressure temperature") + + # 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.debug("Timeout!!!!") + return False + + def cmd_pressure_filtered_temperature_override(self, sensor: int, temperature: float, reset: int = NO_RESET) -> int: + """ + Constructs and sends the filtered temperature override command. + Constraints: + Must be logged into DD. + + @param sensor: unsigned int - pressure sensor ID from DDPressureNames + @param temperature: float - temperature to override the sensor with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + tmp = float_to_bytearray(temperature) + idx = integer_to_bytearray(sensor) + payload = rst + tmp + idx + + 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) + + self.logger.debug("override pressure filtered temperature") + + # 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.debug("Timeout!!!!") return False \ No newline at end of file