Index: dialin/hd/air_pump.py =================================================================== diff -u --- dialin/hd/air_pump.py (revision 0) +++ dialin/hd/air_pump.py (revision da3a2451ace2c0e28343e258867755dc5bd3b8dc) @@ -0,0 +1,121 @@ +########################################################################### +# +# Copyright (c) 2020-2022 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 air_pump.py +# +# @author (last) Michael Garthwaite +# @date (last) 07-Jul-2021 +# @author (original) Michael Garthwaite +# @date (original) 21-Sep-2020 +# +############################################################################ + +import struct +from logging import Logger + +from .constants import RESET, NO_RESET +from ..common.msg_defs import MsgIds, MsgFieldPositions +from ..protocols.CAN import DenaliMessage, DenaliChannels +from ..utils.base import AbstractSubSystem, publish +from ..utils.checks import check_broadcast_interval_override_ms +from ..utils.conversions import integer_to_bytearray + + +class HDAirPump(AbstractSubSystem): + def __init__(self, can_interface, logger: Logger): + """ + + @param can_interface: Denali Can Messenger object + """ + super().__init__() + self.can_interface = can_interface + self.logger = logger + + if self.can_interface is not None: + channel_id = DenaliChannels.hd_sync_broadcast_ch_id + msg_id = MsgIds.MSG_ID_HD_AIR_TRAP_DATA.value + self.can_interface.register_receiving_publication_function(channel_id, msg_id, + self._handler_air_pump_sync) + + self.air_pump_state = 0 + + def get_air_pump_state(self): + return self.air_pump_state + + def _handler_air_pump_sync(self, message): + pass + + def cmd_air_trap_level_sensor_override(self, state: int) -> int: + """ + Constructs and sends the air pump level sensor override command + Constraints: + Must be logged into HD. + Given sensor must be one of the sensors listed below. + + """ + + idx = integer_to_bytearray(state) + payload = idx + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_AIR_PUMP_SET_STATE.value, + payload=payload) + + self.logger.debug("override air pump level sensor detection value for sensor " + str(state)) + + # 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_air_pump_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the air pump data broadcast interval override command + Constraints: + Must be logged into HD. + Given interval must be non-zero and a multiple of the HD general task interval (50 ms). + + @param ms: integer - interval (in ms) to override with + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + if not check_broadcast_interval_override_ms(ms): + return False + + rst = integer_to_bytearray(reset) + mis = integer_to_bytearray(ms) + payload = rst + mis + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD air pump data broadcast interval") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + if reset == RESET: + str_res = "reset back to normal: " + else: + str_res = str(ms) + " ms: " + self.logger.debug("Air pump data broadcast interval overridden to " + str_res + + str(received_message['message'][DenaliMessage.PAYLOAD_START_INDEX])) + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False