From dff49153135e25f62bc3968b485fc17c79b7ad96 Mon Sep 17 00:00:00 2001 From: FrogAi <91348155+FrogAi@users.noreply.github.com> Date: Fri, 12 Jan 2024 22:39:30 -0700 Subject: [PATCH] Force fingerprint function --- common/params.cc | 2 + selfdrive/car/car_helpers.py | 12 +- selfdrive/frogpilot/ui/vehicle_settings.cc | 125 ++++++++++++++++++++- selfdrive/frogpilot/ui/vehicle_settings.h | 9 ++ 4 files changed, 144 insertions(+), 4 deletions(-) diff --git a/common/params.cc b/common/params.cc index 301d42a..6268a12 100644 --- a/common/params.cc +++ b/common/params.cc @@ -225,6 +225,8 @@ std::unordered_map keys = { {"BlindSpotPath", PERSISTENT}, {"CameraFPS", PERSISTENT}, {"CameraView", PERSISTENT}, + {"CarMake", PERSISTENT}, + {"CarModel", PERSISTENT}, {"CECurves", PERSISTENT}, {"CECurvesLead", PERSISTENT}, {"CENavigation", PERSISTENT}, diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 45f4f69..1981810 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -239,13 +239,21 @@ def crash_log(candidate): def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): params = Params() + car_brand = params.get("CarMake", encoding='utf-8') + car_model = params.get("CarModel", encoding='utf-8') dongle_id = params.get("DongleId", block=True, encoding='utf-8') candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(logcan, sendcan, num_pandas) if candidate is None: - cloudlog.event("car doesn't match any fingerprints", fingerprints=fingerprints, error=True) - candidate = "mock" + if car_model is not None: + candidate = car_model + else: + cloudlog.event("Car doesn't match any fingerprints", fingerprints=fingerprints, error=True) + candidate = "mock" + else: + params.put("CarMake", candidate.split(' ')[0].title()) + params.put("CarModel", candidate) if get_branch() == "origin/FrogPilot-Development" and dongle_id[:3] != "be6": candidate = "mock" diff --git a/selfdrive/frogpilot/ui/vehicle_settings.cc b/selfdrive/frogpilot/ui/vehicle_settings.cc index b8e697a..680537a 100644 --- a/selfdrive/frogpilot/ui/vehicle_settings.cc +++ b/selfdrive/frogpilot/ui/vehicle_settings.cc @@ -1,7 +1,103 @@ +#include +#include +#include + #include "selfdrive/frogpilot/ui/vehicle_settings.h" #include "selfdrive/ui/ui.h" +QStringList getCarNames(const QString &carMake) { + QMap makeMap; + makeMap["acura"] = "honda"; + makeMap["audi"] = "volkswagen"; + makeMap["buick"] = "gm"; + makeMap["cadillac"] = "gm"; + makeMap["chevrolet"] = "gm"; + makeMap["chrysler"] = "chrysler"; + makeMap["dodge"] = "chrysler"; + makeMap["ford"] = "ford"; + makeMap["gm"] = "gm"; + makeMap["gmc"] = "gm"; + makeMap["genesis"] = "hyundai"; + makeMap["honda"] = "honda"; + makeMap["hyundai"] = "hyundai"; + makeMap["infiniti"] = "nissan"; + makeMap["jeep"] = "chrysler"; + makeMap["kia"] = "hyundai"; + makeMap["lexus"] = "toyota"; + makeMap["lincoln"] = "ford"; + makeMap["man"] = "volkswagen"; + makeMap["mazda"] = "mazda"; + makeMap["nissan"] = "nissan"; + makeMap["ram"] = "chrysler"; + makeMap["seat"] = "volkswagen"; + makeMap["subaru"] = "subaru"; + makeMap["tesla"] = "tesla"; + makeMap["toyota"] = "toyota"; + makeMap["volkswagen"] = "volkswagen"; + makeMap["skoda"] = "volkswagen"; + + QString dirPath = "../../selfdrive/car"; + QDir dir(dirPath); + QString targetFolder = makeMap.value(carMake, carMake); + QStringList names; + + foreach (const QString &folder, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { + if (folder == targetFolder) { + QFile file(dirPath + "/" + folder + "/values.py"); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QRegularExpression regex("class CAR\\(StrEnum\\):([\\s\\S]*?)(?=^\\w)", QRegularExpression::MultilineOption); + QRegularExpressionMatch match = regex.match(QTextStream(&file).readAll()); + file.close(); + + if (match.hasMatch()) { + QRegularExpression nameRegex("=\\s*\"([^\"]+)\""); + QRegularExpressionMatchIterator it = nameRegex.globalMatch(match.captured(1)); + while (it.hasNext()) { + names << it.next().captured(1); + } + } + } + } + } + + std::sort(names.begin(), names.end()); + return names; +} + FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(SettingsWindow *parent) : FrogPilotListWidget(parent) { + selectMakeButton = new ButtonControl(tr("Select Make"), tr("SELECT")); + QObject::connect(selectMakeButton, &ButtonControl::clicked, [this]() { + std::string currentMake = params.get("CarMake"); + QStringList makes = { + "Acura", "Audi", "BMW", "Buick", "Cadillac", "Chevrolet", "Chrysler", "Dodge", "Ford", "GM", "GMC", + "Genesis", "Honda", "Hyundai", "Infiniti", "Jeep", "Kia", "Lexus", "Lincoln", "MAN", "Mazda", + "Mercedes", "Nissan", "Ram", "SEAT", "Subaru", "Tesla", "Toyota", "Volkswagen", "Volvo", "Škoda", + }; + + QString newMakeSelection = MultiOptionDialog::getSelection(tr("Select a Make"), makes, QString::fromStdString(currentMake), this); + if (!newMakeSelection.isEmpty()) { + carMake = newMakeSelection; + params.put("CarMake", carMake.toStdString()); + selectMakeButton->setValue(newMakeSelection); + setModels(); + } + }); + addItem(selectMakeButton); + + selectModelButton = new ButtonControl(tr("Select Model"), tr("SELECT")); + QString modelSelection = QString::fromStdString(params.get("CarModel")); + QObject::connect(selectModelButton, &ButtonControl::clicked, [this]() { + std::string currentModel = params.get("CarModel"); + QString newModelSelection = MultiOptionDialog::getSelection(tr("Select a Model"), models, QString::fromStdString(currentModel), this); + if (!newModelSelection.isEmpty()) { + params.put("CarModel", newModelSelection.toStdString()); + selectModelButton->setValue(newModelSelection); + } + }); + selectModelButton->setValue(modelSelection); + addItem(selectModelButton); + selectModelButton->setVisible(false); + std::vector> vehicleToggles { {"GasRegenCmd", "Gas Regen Cmd", "", ""}, }; @@ -29,6 +125,23 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(SettingsWindow *parent) : FrogPil } }); } + + QObject::connect(uiState(), &UIState::offroadTransition, this, [this](bool offroad) { + if (!offroad) { + std::thread([this]() { + while (carMake.isEmpty()) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + carMake = QString::fromStdString(params.get("CarMake")); + } + setModels(); + }).detach(); + } + }); + + carMake = QString::fromStdString(params.get("CarMake")); + if (!carMake.isEmpty()) { + setModels(); + } } void FrogPilotVehiclesPanel::updateToggles() { @@ -39,9 +152,17 @@ void FrogPilotVehiclesPanel::updateToggles() { }).detach(); } +void FrogPilotVehiclesPanel::setModels() { + models = getCarNames(carMake.toLower()); + setToggles(); +} + void FrogPilotVehiclesPanel::setToggles() { - bool gm = false; - bool toyota = false; + selectMakeButton->setValue(carMake); + selectModelButton->setVisible(!carMake.isEmpty()); + + bool gm = carMake == "Buick" || carMake == "Cadillac" || carMake == "Chevrolet" || carMake == "GM" || carMake == "GMC"; + bool toyota = carMake == "Lexus" || carMake == "Toyota"; for (auto &[key, toggle] : toggles) { toggle->setVisible(false); diff --git a/selfdrive/frogpilot/ui/vehicle_settings.h b/selfdrive/frogpilot/ui/vehicle_settings.h index 3986826..d8d8a32 100644 --- a/selfdrive/frogpilot/ui/vehicle_settings.h +++ b/selfdrive/frogpilot/ui/vehicle_settings.h @@ -2,6 +2,8 @@ #include +#include + #include "selfdrive/frogpilot/ui/frogpilot_functions.h" #include "selfdrive/ui/qt/offroad/settings.h" @@ -12,9 +14,16 @@ public: explicit FrogPilotVehiclesPanel(SettingsWindow *parent); private: + void setModels(); void setToggles(); void updateToggles(); + ButtonControl *selectMakeButton; + ButtonControl *selectModelButton; + + QString carMake; + QStringList models; + std::map toggles; std::set gmKeys;