import struct # *** Toyota specific *** def fix(msg, addr): checksum = 0 idh = (addr & 0xff00) >> 8 idl = (addr & 0xff) checksum = idh + idl + len(msg) + 1 for d_byte in msg: checksum += ord(d_byte) #return msg + chr(checksum & 0xFF) return msg + struct.pack("B", checksum & 0xFF) def make_can_msg(addr, dat, alt, cks=False): if cks: dat = fix(dat, addr) return [addr, 0, dat, alt] def create_video_target(frame, addr): counter = frame & 0xff msg = struct.pack("!BBBBBBB", counter, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00) return make_can_msg(addr, msg, 1, True) def create_ipas_steer_command(packer, steer, enabled, apgs_enabled): """Creates a CAN message for the Toyota Steer Command.""" if steer < 0: direction = 3 elif steer > 0: direction = 1 else: direction = 2 mode = 3 if enabled else 1 values = { "STATE": mode, "DIRECTION_CMD": direction, "ANGLE": steer, "SET_ME_X10": 0x10, "SET_ME_X40": 0x40 } if apgs_enabled: return packer.make_can_msg("STEERING_IPAS", 0, values) else: return packer.make_can_msg("STEERING_IPAS_COMMA", 0, values) def create_steer_command(packer, steer, steer_req, raw_cnt): """Creates a CAN message for the Toyota Steer Command.""" values = { "STEER_REQUEST": steer_req, "STEER_TORQUE_CMD": steer, "COUNTER": raw_cnt, "SET_ME_1": 1, } return packer.make_can_msg("STEERING_LKA", 0, values) def create_accel_command(packer, accel, pcm_cancel, standstill_req): # TODO: find the exact canceling bit values = { "ACCEL_CMD": accel, "SET_ME_X63": 0x63, "SET_ME_1": 1, "RELEASE_STANDSTILL": not standstill_req, "CANCEL_REQ": pcm_cancel, } return packer.make_can_msg("ACC_CONTROL", 0, values) def create_fcw_command(packer, fcw): values = { "FCW": fcw, "SET_ME_X20": 0x20, "SET_ME_X10": 0x10, "SET_ME_X80": 0x80, } return packer.make_can_msg("ACC_HUD", 0, values) def create_ui_command(packer, steer, sound1, sound2): values = { "RIGHT_LINE": 1, "LEFT_LINE": 1, "SET_ME_X0C": 0x0c, "SET_ME_X2C": 0x2c, "SET_ME_X38": 0x38, "SET_ME_X02": 0x02, "SET_ME_X01": 1, "SET_ME_X01_2": 1, "REPEATED_BEEPS": sound1, "TWO_BEEPS": sound2, "LDA_ALERT": steer, } return packer.make_can_msg("LKAS_HUD", 0, values)