Force fingerprint function
This commit is contained in:
@@ -225,6 +225,8 @@ std::unordered_map<std::string, uint32_t> keys = {
|
|||||||
{"BlindSpotPath", PERSISTENT},
|
{"BlindSpotPath", PERSISTENT},
|
||||||
{"CameraFPS", PERSISTENT},
|
{"CameraFPS", PERSISTENT},
|
||||||
{"CameraView", PERSISTENT},
|
{"CameraView", PERSISTENT},
|
||||||
|
{"CarMake", PERSISTENT},
|
||||||
|
{"CarModel", PERSISTENT},
|
||||||
{"CECurves", PERSISTENT},
|
{"CECurves", PERSISTENT},
|
||||||
{"CECurvesLead", PERSISTENT},
|
{"CECurvesLead", PERSISTENT},
|
||||||
{"CENavigation", PERSISTENT},
|
{"CENavigation", PERSISTENT},
|
||||||
|
|||||||
@@ -239,13 +239,21 @@ def crash_log(candidate):
|
|||||||
|
|
||||||
def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1):
|
def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1):
|
||||||
params = Params()
|
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')
|
dongle_id = params.get("DongleId", block=True, encoding='utf-8')
|
||||||
|
|
||||||
candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(logcan, sendcan, num_pandas)
|
candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(logcan, sendcan, num_pandas)
|
||||||
|
|
||||||
if candidate is None:
|
if candidate is None:
|
||||||
cloudlog.event("car doesn't match any fingerprints", fingerprints=fingerprints, error=True)
|
if car_model is not None:
|
||||||
candidate = "mock"
|
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":
|
if get_branch() == "origin/FrogPilot-Development" and dongle_id[:3] != "be6":
|
||||||
candidate = "mock"
|
candidate = "mock"
|
||||||
|
|||||||
@@ -1,7 +1,103 @@
|
|||||||
|
#include <QDir>
|
||||||
|
#include <QRegularExpression>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
#include "selfdrive/frogpilot/ui/vehicle_settings.h"
|
#include "selfdrive/frogpilot/ui/vehicle_settings.h"
|
||||||
#include "selfdrive/ui/ui.h"
|
#include "selfdrive/ui/ui.h"
|
||||||
|
|
||||||
|
QStringList getCarNames(const QString &carMake) {
|
||||||
|
QMap<QString, QString> 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) {
|
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<std::tuple<QString, QString, QString, QString>> vehicleToggles {
|
std::vector<std::tuple<QString, QString, QString, QString>> vehicleToggles {
|
||||||
{"GasRegenCmd", "Gas Regen Cmd", "", ""},
|
{"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() {
|
void FrogPilotVehiclesPanel::updateToggles() {
|
||||||
@@ -39,9 +152,17 @@ void FrogPilotVehiclesPanel::updateToggles() {
|
|||||||
}).detach();
|
}).detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FrogPilotVehiclesPanel::setModels() {
|
||||||
|
models = getCarNames(carMake.toLower());
|
||||||
|
setToggles();
|
||||||
|
}
|
||||||
|
|
||||||
void FrogPilotVehiclesPanel::setToggles() {
|
void FrogPilotVehiclesPanel::setToggles() {
|
||||||
bool gm = false;
|
selectMakeButton->setValue(carMake);
|
||||||
bool toyota = false;
|
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) {
|
for (auto &[key, toggle] : toggles) {
|
||||||
toggle->setVisible(false);
|
toggle->setVisible(false);
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
#include "selfdrive/frogpilot/ui/frogpilot_functions.h"
|
#include "selfdrive/frogpilot/ui/frogpilot_functions.h"
|
||||||
#include "selfdrive/ui/qt/offroad/settings.h"
|
#include "selfdrive/ui/qt/offroad/settings.h"
|
||||||
|
|
||||||
@@ -12,9 +14,16 @@ public:
|
|||||||
explicit FrogPilotVehiclesPanel(SettingsWindow *parent);
|
explicit FrogPilotVehiclesPanel(SettingsWindow *parent);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void setModels();
|
||||||
void setToggles();
|
void setToggles();
|
||||||
void updateToggles();
|
void updateToggles();
|
||||||
|
|
||||||
|
ButtonControl *selectMakeButton;
|
||||||
|
ButtonControl *selectModelButton;
|
||||||
|
|
||||||
|
QString carMake;
|
||||||
|
QStringList models;
|
||||||
|
|
||||||
std::map<std::string, ParamControl*> toggles;
|
std::map<std::string, ParamControl*> toggles;
|
||||||
|
|
||||||
std::set<QString> gmKeys;
|
std::set<QString> gmKeys;
|
||||||
|
|||||||
Reference in New Issue
Block a user