import crcmod from selfdrive.car.hyundai.values import CHECKSUM hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf) def make_can_msg(addr, dat, alt): return [addr, 0, dat, alt] def create_lkas11(packer, car_fingerprint, apply_steer, steer_req, cnt, enabled, lkas11, hud_alert, keep_stock=False): values = { "CF_Lkas_Bca_R": 3 if enabled else 0, "CF_Lkas_LdwsSysState": 3 if steer_req else 1, "CF_Lkas_SysWarning": hud_alert, "CF_Lkas_LdwsLHWarning": lkas11["CF_Lkas_LdwsLHWarning"] if keep_stock else 0, "CF_Lkas_LdwsRHWarning": lkas11["CF_Lkas_LdwsRHWarning"] if keep_stock else 0, "CF_Lkas_HbaLamp": lkas11["CF_Lkas_HbaLamp"] if keep_stock else 0, "CF_Lkas_FcwBasReq": lkas11["CF_Lkas_FcwBasReq"] if keep_stock else 0, "CR_Lkas_StrToqReq": apply_steer, "CF_Lkas_ActToi": steer_req, "CF_Lkas_ToiFlt": 0, "CF_Lkas_HbaSysState": lkas11["CF_Lkas_HbaSysState"] if keep_stock else 1, "CF_Lkas_FcwOpt": lkas11["CF_Lkas_FcwOpt"] if keep_stock else 0, "CF_Lkas_HbaOpt": lkas11["CF_Lkas_HbaOpt"] if keep_stock else 3, "CF_Lkas_MsgCount": cnt, "CF_Lkas_FcwSysState": lkas11["CF_Lkas_FcwSysState"] if keep_stock else 0, "CF_Lkas_FcwCollisionWarning": lkas11["CF_Lkas_FcwCollisionWarning"] if keep_stock else 0, "CF_Lkas_FusionState": lkas11["CF_Lkas_FusionState"] if keep_stock else 0, "CF_Lkas_Chksum": 0, "CF_Lkas_FcwOpt_USM": 2 if enabled else 1, "CF_Lkas_LdwsOpt_USM": lkas11["CF_Lkas_LdwsOpt_USM"] if keep_stock else 3, } dat = packer.make_can_msg("LKAS11", 0, values)[2] if car_fingerprint in CHECKSUM["crc8"]: # CRC Checksum as seen on 2019 Hyundai Santa Fe dat = dat[:6] + dat[7] checksum = hyundai_checksum(dat) elif car_fingerprint in CHECKSUM["6B"]: # Checksum of first 6 Bytes, as seen on 2018 Kia Sorento dat = [ord(i) for i in dat] checksum = sum(dat[:6]) % 256 elif car_fingerprint in CHECKSUM["7B"]: # Checksum of first 6 Bytes and last Byte as seen on 2018 Kia Stinger dat = [ord(i) for i in dat] checksum = (sum(dat[:6]) + dat[7]) % 256 values["CF_Lkas_Chksum"] = checksum return packer.make_can_msg("LKAS11", 0, values) def create_lkas12(): return make_can_msg(1342, "\x00\x00\x00\x00\x60\x05", 0) def create_1191(): return make_can_msg(1191, "\x01\x00", 0) def create_1156(): return make_can_msg(1156, "\x08\x20\xfe\x3f\x00\xe0\xfd\x3f", 0) def create_clu11(packer, clu11, button): values = { "CF_Clu_CruiseSwState": button, "CF_Clu_CruiseSwMain": clu11["CF_Clu_CruiseSwMain"], "CF_Clu_SldMainSW": clu11["CF_Clu_SldMainSW"], "CF_Clu_ParityBit1": clu11["CF_Clu_ParityBit1"], "CF_Clu_VanzDecimal": clu11["CF_Clu_VanzDecimal"], "CF_Clu_Vanz": clu11["CF_Clu_Vanz"], "CF_Clu_SPEED_UNIT": clu11["CF_Clu_SPEED_UNIT"], "CF_Clu_DetentOut": clu11["CF_Clu_DetentOut"], "CF_Clu_RheostatLevel": clu11["CF_Clu_RheostatLevel"], "CF_Clu_CluInfo": clu11["CF_Clu_CluInfo"], "CF_Clu_AmpInfo": clu11["CF_Clu_AmpInfo"], "CF_Clu_AliveCnt1": 0, } return packer.make_can_msg("CLU11", 0, values)