Index: dialin/common/msg_ids.py =================================================================== diff -u -rd2b3fbb3d2f087b815a6a74f85098e0ae57e6b85 -r84f019168b0942c94d95a4028d2d252dfc48a0df --- dialin/common/msg_ids.py (.../msg_ids.py) (revision d2b3fbb3d2f087b815a6a74f85098e0ae57e6b85) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision 84f019168b0942c94d95a4028d2d252dfc48a0df) @@ -497,6 +497,7 @@ MSG_ID_DG_DRAIN_MODE_BROADCAST_INTERVAL_OVERRIDE = 0xA070 MSG_ID_DG_DIALIN_RO_ONLY_MODE_STATUS_REQUEST = 0xA071 MSG_ID_DG_RAM_STATUS_OVERRIDE = 0xA072 + MSG_ID_DG_RESERVOIR_BROADCAST_INTERVAL_OVERRIDE = 0xA074 MSG_ID_HD_DEBUG_EVENT = 0xFFF1 MSG_ID_DG_DEBUG_EVENT = 0xFFF2 Index: dialin/dg/reservoirs.py =================================================================== diff -u -rbb27421af996ff0333c514d27d9c0b13155bce77 -r84f019168b0942c94d95a4028d2d252dfc48a0df --- dialin/dg/reservoirs.py (.../reservoirs.py) (revision bb27421af996ff0333c514d27d9c0b13155bce77) +++ dialin/dg/reservoirs.py (.../reservoirs.py) (revision 84f019168b0942c94d95a4028d2d252dfc48a0df) @@ -17,10 +17,12 @@ from logging import Logger from enum import unique +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, DialinEnum from ..utils.conversions import integer_to_bytearray, float_to_bytearray +from ..utils.checks import check_broadcast_interval_override_ms @unique @@ -203,3 +205,39 @@ self.time_rsrvr_fill = struct.unpack('f', bytearray( message['message'][MsgFieldPositions.START_POS_FIELD_12:MsgFieldPositions.END_POS_FIELD_12]))[0] self.dg_reservoirs_timestamp = timestamp + + def cmd_reservoir_data_broadcast_interval_override(self, ms: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the reservoir data broadcast interval override command + Constraints: + Must be logged into DG. + Given interval must be non-zero and a multiple of the DG 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 + + reset_byte_array = integer_to_bytearray(reset) + 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_id=MsgIds.MSG_ID_DG_RESERVOIR_BROADCAST_INTERVAL_OVERRIDE.value, + payload=payload) + + self.logger.debug("override reservoir data broadcast interval") + + # 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