Index: dialin/common/msg_ids.py =================================================================== diff -u -r59b592b33c4d5e1105ea0bbd5131ac32d02a605d -rb898f008bf4387896c57e94c3296d7e5c3ca95e2 --- dialin/common/msg_ids.py (.../msg_ids.py) (revision 59b592b33c4d5e1105ea0bbd5131ac32d02a605d) +++ dialin/common/msg_ids.py (.../msg_ids.py) (revision b898f008bf4387896c57e94c3296d7e5c3ca95e2) @@ -362,6 +362,9 @@ MSG_ID_HD_NV_RECORD_CRC_OVERRIDE = 0x8089 MSD_ID_HD_RTC_CTL_REG1_STATUS_OVERRIDE = 0x808A MSD_ID_HD_RTC_CTL_REG3_STATUS_OVERRIDE = 0x808B + MSG_ID_HD_BATTERY_STATUS_OVERRIDE = 0x808C + MSG_ID_HD_BATTERY_CHARGER_STATUS_OVERRIDE = 0x808D + MSG_ID_HD_BATTERY_COMM_STATUS_OVERRIDE = 0x808E MSG_ID_DG_TESTER_LOGIN_REQUEST = 0xA000 MSG_ID_DG_ALARM_STATE_OVERRIDE = 0xA001 Index: dialin/hd/battery.py =================================================================== diff -u -r4666aae711079c97edd9d1e23c3e06f2cc47b7bf -rb898f008bf4387896c57e94c3296d7e5c3ca95e2 --- dialin/hd/battery.py (.../battery.py) (revision 4666aae711079c97edd9d1e23c3e06f2cc47b7bf) +++ dialin/hd/battery.py (.../battery.py) (revision b898f008bf4387896c57e94c3296d7e5c3ca95e2) @@ -266,3 +266,127 @@ self.logger.debug("Timeout!!!!") return False + def cmd_battery_status_override(self, status: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery remaining capacity (in mWh) override \n + command. + BATTERY_PACK_ERROR_BITS = 0x000F + Constraints: + Must be logged into HD. + + @param status: int - the battery comm status as a bit map. + + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BATTERY_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD battery status") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(sts) + self.logger.debug("HD battery status 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 + + def cmd_battery_charger_status_override(self, status: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery charger status override command. + Setting BATTERY_CHARGER_STATUS_AC_PRESENT_MASK to 0 causes the HD to assume battery power. + Constraints: + Must be logged into HD. + + @param status: int - the bit map for the charger status register. + BATTERY_CHARGER_STATUS_AC_PRESENT_MASK = 0x8000 + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BATTERY_CHARGER_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD battery charger status.") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(sts) + self.logger.debug("HD battery charger status 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 + + def cmd_battery_comm_status_override(self, status: int, reset: int = NO_RESET) -> int: + """ + Constructs and sends the battery comm status override command. \n + This overrides the I2C status register. \n + Constraints: + Must be logged into HD. + + @param status: int - the bit map for the i2c status register. + I2C_AL = 0x0001, /* arbitration lost */ + I2C_NACK = 0x0002, /* no acknowledgement */ + @param reset: integer - 1 to reset a previous override, 0 to override + @return: 1 if successful, zero otherwise + """ + + rst = integer_to_bytearray(reset) + sts = integer_to_bytearray(status) + payload = rst + sts + + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_hd_ch_id, + message_id=MsgIds.MSG_ID_HD_BATTERY_COMM_STATUS_OVERRIDE.value, + payload=payload) + + self.logger.debug("override HD battery comm status.") + + # Send message + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # self.logger.debug(received_message) + if reset == RESET: + str_res = "reset back to normal" + else: + str_res = str(sts) + self.logger.debug("HD battery comm status 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 \ No newline at end of file