Source code for selfdrive.car.mazda.mazdacan

from openpilot.selfdrive.car.mazda.values import Buttons, MazdaFlags


[docs] def create_steering_control(packer, CP, frame, apply_steer, lkas): tmp = apply_steer + 2048 lo = tmp & 0xFF hi = tmp >> 8 # copy values from camera b1 = int(lkas["BIT_1"]) er1 = int(lkas["ERR_BIT_1"]) lnv = 0 ldw = 0 er2 = int(lkas["ERR_BIT_2"]) # Some older models do have these, newer models don't. # Either way, they all work just fine if set to zero. steering_angle = 0 b2 = 0 tmp = steering_angle + 2048 ahi = tmp >> 10 amd = (tmp & 0x3FF) >> 2 amd = (amd >> 4) | (( amd & 0xF) << 4) alo = (tmp & 0x3) << 2 ctr = frame % 16 # bytes: [ 1 ] [ 2 ] [ 3 ] [ 4 ] csum = 249 - ctr - hi - lo - (lnv << 3) - er1 - (ldw << 7) - ( er2 << 4) - (b1 << 5) # bytes [ 5 ] [ 6 ] [ 7 ] csum = csum - ahi - amd - alo - b2 if ahi == 1: csum = csum + 15 if csum < 0: if csum < -256: csum = csum + 512 else: csum = csum + 256 csum = csum % 256 values = {} if CP.flags & MazdaFlags.GEN1: values = { "LKAS_REQUEST": apply_steer, "CTR": ctr, "ERR_BIT_1": er1, "LINE_NOT_VISIBLE" : lnv, "LDW": ldw, "BIT_1": b1, "ERR_BIT_2": er2, "STEERING_ANGLE": steering_angle, "ANGLE_ENABLED": b2, "CHKSUM": csum } return packer.make_can_msg("CAM_LKAS", 0, values)
[docs] def create_alert_command(packer, cam_msg: dict, ldw: bool, steer_required: bool): values = {s: cam_msg[s] for s in [ "LINE_VISIBLE", "LINE_NOT_VISIBLE", "LANE_LINES", "BIT1", "BIT2", "BIT3", "NO_ERR_BIT", "S1", "S1_HBEAM", ]} values.update({ # TODO: what's the difference between all these? do we need to send all? "HANDS_WARN_3_BITS": 0b111 if steer_required else 0, "HANDS_ON_STEER_WARN": steer_required, "HANDS_ON_STEER_WARN_2": steer_required, # TODO: right lane works, left doesn't # TODO: need to do something about L/R "LDW_WARN_LL": 0, "LDW_WARN_RL": 0, }) return packer.make_can_msg("CAM_LANEINFO", 0, values)
[docs] def create_button_cmd(packer, CP, counter, button): can = int(button == Buttons.CANCEL) res = int(button == Buttons.RESUME) if CP.flags & MazdaFlags.GEN1: values = { "CAN_OFF": can, "CAN_OFF_INV": (can + 1) % 2, "SET_P": 0, "SET_P_INV": 1, "RES": res, "RES_INV": (res + 1) % 2, "SET_M": 0, "SET_M_INV": 1, "DISTANCE_LESS": 0, "DISTANCE_LESS_INV": 1, "DISTANCE_MORE": 0, "DISTANCE_MORE_INV": 1, "MODE_X": 0, "MODE_X_INV": 1, "MODE_Y": 0, "MODE_Y_INV": 1, "BIT1": 1, "BIT2": 1, "BIT3": 1, "CTR": (counter + 1) % 16, } return packer.make_can_msg("CRZ_BTNS", 0, values)