aLeadK&vLeadK, EV6BSM, CanParserDisplay

This commit is contained in:
ajouatom 2025-02-28 19:28:52 +09:00
parent 7248099643
commit 4483bb7a73
9 changed files with 72 additions and 35 deletions

View File

@ -290,6 +290,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"RadarReactionFactor", PERSISTENT},
{"EnableRadarTracks", PERSISTENT},
{"EnableRadarTracksResult", PERSISTENT | CLEAR_ON_MANAGER_START},
{"CanParserResult", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION },
{"HotspotOnBoot", PERSISTENT},
{"HyundaiCameraSCC", PERSISTENT},
{"CanfdHDA2", PERSISTENT},

View File

@ -4,6 +4,7 @@
#include <limits>
#include <stdexcept>
#include <sstream>
#include <unistd.h>
#include "opendbc/can/common.h"
@ -210,8 +211,10 @@ void CANParser::UpdateCans(const CanData &can, std::set<uint32_t> &updated_addre
bus_timeout = (can.nanos - last_nonempty_nanos) > bus_timeout_threshold;
}
int error_print_count = 0;
void CANParser::UpdateValid(uint64_t nanos) {
static uint64_t last_log_time = 0;
const uint64_t LOG_INTERVAL = 2e9;
const bool show_missing = (nanos - first_nanos) > 8e9;
bool _valid = true;
@ -227,14 +230,22 @@ void CANParser::UpdateValid(uint64_t nanos) {
const bool timed_out = (nanos - state.last_seen_nanos) > state.check_threshold;
if (state.check_threshold > 0 && (missing || timed_out)) {
if (show_missing && !bus_timeout) {
char str[256];
const char* parser_result_params = "/data/params/d/CanParserResult";
if (missing) {
if (error_print_count++ < 20) {
LOGE_100("0x%X '%s' NOT SEEN", state.address, state.name.c_str());
}
if ((nanos - last_log_time) > LOG_INTERVAL) {
last_log_time = nanos;
LOGE_100("0x%X '%s' NOT SEEN", state.address, state.name.c_str());
sprintf(str, "echo -n \"0x%X '%s' NOT SEEN\" > %s", state.address, state.name.c_str(), parser_result_params);
system(str);
}
} else if (timed_out) {
if (error_print_count++ < 20) {
LOGE_100("0x%X '%s' TIMED OUT", state.address, state.name.c_str());
}
if ((nanos - last_log_time) > LOG_INTERVAL) {
last_log_time = nanos;
LOGE_100("0x%X '%s' TIMED OUT", state.address, state.name.c_str());
sprintf(str, "echo -n \"0x%X '%s' TIMED OUT\" > %s", state.address, state.name.c_str(), parser_result_params);
system(str);
}
}
}
_valid = false;

View File

@ -33,7 +33,7 @@ class CarInterface(CarInterfaceBase):
cam_can = CanBus(None, fingerprint).CAM if camera_scc == 0 else 1
hda2 = False #0x50 in fingerprint[cam_can] or 0x110 in fingerprint[cam_can]
hda2 = hda2 or params.get_bool("CanfdHDA2")
hda2 = hda2 or params.get_int("CanfdHDA2") > 0
CAN = CanBus(None, fingerprint, hda2)
if params.get_int("CanfdDebug") == -1:
@ -187,7 +187,7 @@ class CarInterface(CarInterfaceBase):
# *** feature detection ***
if ret.flags & HyundaiFlags.CANFD:
#if candidate in (CAR.KIA_CARNIVAL_4TH_GEN, CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN, CAR.HYUNDAI_IONIQ_5_N, CAR.KIA_EV9) and hda2: ##카니발4th & hda2 인경우에만 BSM이 ADAS에서 나옴.
if 0x161 in fingerprint[CAN.ECAN] and hda2:
if (0x161 in fingerprint[CAN.ECAN] and hda2) or params.get_int("CanfdHDA2") == 2: # EV6일부모델은 BSM이 ADAS에서 나옴.
ret.extFlags |= HyundaiExtFlags.BSM_IN_ADAS.value
print(f"$$$$$ CanFD ECAN = {CAN.ECAN}")
if 0x1fa in fingerprint[CAN.ECAN]:

View File

@ -355,6 +355,16 @@ def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging
personality = str(personality).title()
return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5)
def car_parser_result(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
results = Params().get("CanParserResult")
if results is None:
results = ""
return Alert(
"CAN 오류: Check Connections",
results,
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.)
EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
@ -898,22 +908,24 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# - CAN data is received, but some message are not received at the right frequency
# If you're not writing a new car port, this is usually cause by faulty wiring
EventName.canError: {
ET.PERMANENT: car_parser_result,
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN 오류 : 장치를 점검하세요"),
ET.PERMANENT: Alert(
"CAN 오류 : 장치를 점검하세요",
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
#ET.PERMANENT: Alert(
# "CAN 오류 : 장치를 점검하세요",
# "",
# AlertStatus.normal, AlertSize.small,
# Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("CAN 오류 : 장치를 점검하세요"),
},
EventName.canBusMissing: {
ET.PERMANENT: car_parser_result,
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus 연결 끈김"),
ET.PERMANENT: Alert(
"CAN Bus 오류 : 케이블을 점검하세요",
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
#ET.PERMANENT: Alert(
# "CAN Bus 오류 : 케이블을 점검하세요",
# "",
# AlertStatus.normal, AlertSize.small,
# Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("CAN Bus 오류 : 장치를 점검하세요"),
},

View File

@ -1150,12 +1150,12 @@
"group": "시작",
"name": "CanfdHDA2",
"title": "CANFD HDA2지원(0)",
"descr": "HDA2 강제인식, 일부CANFD차량 오류발생시 켜야함.",
"descr": "1: HDA2 강제인식, 2: HDA2+BSM",
"egroup": "START",
"etitle": "CANFD HDA2(0)",
"edescr": "",
"min": 0,
"max": 1,
"max": 2,
"default": 0,
"unit": 1
},

View File

@ -321,8 +321,8 @@ class LongitudinalMpc:
v_ego = self.x0[1]
if lead is not None and lead.status:
x_lead = lead.dRel
v_lead = lead.vLead
a_lead = lead.aLead
v_lead = lead.vLeadK
a_lead = lead.aLeadK
a_lead_tau = lead.aLeadTau
else:
# Fake a fast lead car, so mpc can keep running in the same mode

View File

@ -408,6 +408,7 @@ class RadarD:
self.kalman_params = KalmanParams(DT_MDL)
self.v_ego = 0.0
print("###RadarD.. : delay = ", delay, int(round(delay / DT_MDL))+1)
self.v_ego_hist = deque([0.0], maxlen=int(round(delay / DT_MDL))+1)
self.last_v_ego_frame = -1
@ -423,6 +424,7 @@ class RadarD:
self.ready = sm.seen['modelV2']
self.current_time = 1e-9*max(sm.logMonoTime.values())
leads_v3 = sm['modelV2'].leadsV3
if sm.recv_frame['carState'] != self.last_v_ego_frame:
self.v_ego = sm['carState'].vEgo

View File

@ -355,6 +355,15 @@ def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging
personality = str(personality).title()
return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5)
def car_parser_result(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
results = Params().get("CanParserResult")
if results is None:
results = ""
return Alert(
"CAN Error: Check Connections!!",
results,
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.)
EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
@ -891,22 +900,24 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# - CAN data is received, but some message are not received at the right frequency
# If you're not writing a new car port, this is usually cause by faulty wiring
EventName.canError: {
ET.PERMANENT: car_parser_result,
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Error"),
ET.PERMANENT: Alert(
"CAN Error: Check Connections",
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
#ET.PERMANENT: Alert(
# "CAN Error: Check Connections",
# "",
# AlertStatus.normal, AlertSize.small,
# Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("CAN Error: Check Connections"),
},
EventName.canBusMissing: {
ET.PERMANENT: car_parser_result,
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"),
ET.PERMANENT: Alert(
"CAN Bus Disconnected: Likely Faulty Cable",
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
#ET.PERMANENT: Alert(
# "CAN Bus Disconnected: Likely Faulty Cable",
# "",
# AlertStatus.normal, AlertSize.small,
# Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("CAN Bus Disconnected: Check Connections"),
},

View File

@ -775,7 +775,7 @@ CarrotPanel::CarrotPanel(QWidget* parent) : QWidget(parent) {
startToggles->addItem(selectCarBtn);
startToggles->addItem(new ParamControl("HyundaiCameraSCC", "HYUNDAI: CAMERA SCC", "Connect the SCC's CAN line to CAM", "../assets/offroad/icon_shell.png", this));
startToggles->addItem(new ParamControl("EnableRadarTracks", "Enable RadarTrack", "", "../assets/offroad/icon_shell.png", this));
startToggles->addItem(new ParamControl("CanfdHDA2", "CANFD: HDA2 mode", "", "../assets/offroad/icon_shell.png", this));
startToggles->addItem(new CValueControl("CanfdHDA2", "CANFD: HDA2 mode", "1:HDA2,2:HDA2+BSM", "../assets/offroad/icon_shell.png", 0, 2, 1));
startToggles->addItem(new CValueControl("AutoCruiseControl", "Auto Cruise control", "Softhold, Auto Cruise ON/OFF control", "../assets/offroad/icon_road.png", 0, 3, 1));
startToggles->addItem(new CValueControl("CruiseOnDist", "CRUISE: Auto ON distance(0cm)", "When GAS/Brake is OFF, Cruise ON when the lead car gets closer.", "../assets/offroad/icon_road.png", 0, 2500, 50));
startToggles->addItem(new CValueControl("AutoEngage", "Auto Engage control on start", "1:SteerEnable, 2:Steer/Cruise Engage", "../assets/offroad/icon_road.png", 0, 2, 1));