From 120d6e21bf40077b0acd854512b5ae34f4b4f089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Adler?= Date: Mon, 24 Feb 2025 06:50:52 +0100 Subject: [PATCH] feat: allow to set PIN for ELM327 dongle --- src/main.cpp | 8 ++++---- src/obd.cpp | 11 ++++++++++- src/obd.h | 4 +++- src/settings.cpp | 10 ++++++++++ src/settings.h | 5 +++++ ui/src/app/components/settings.component.html | 10 ++++++++++ ui/src/app/components/settings.component.ts | 1 + ui/src/app/definitions/settings.ts | 1 + 8 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index d43fae2..3336547 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -159,8 +159,8 @@ void WiFiAPStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info) { if (wifiAPStaConnected == 0) { DEBUG_PORT.println("WiFi AP all clients disconnected. Start all other task."); - OBD.begin(Settings.getOBD2Name(OBD_ADP_NAME), Settings.getOBD2MAC(), Settings.getOBD2Protocol(), - Settings.getOBD2CheckPIDSupport()); + OBD.begin(Settings.getOBD2Name(OBD_ADP_NAME), Settings.getOBD2MAC(), Settings.getOBD2Pin(), + Settings.getOBD2Protocol(), Settings.getOBD2CheckPIDSupport()); OBD.connect(true); wifiAPInUse = false; } @@ -837,8 +837,8 @@ void setup() { OBD.onConnected(onOBDConnected); OBD.onConnectError(onOBDConnectError); - OBD.begin(Settings.getOBD2Name(OBD_ADP_NAME), Settings.getOBD2MAC(), Settings.getOBD2Protocol(), - Settings.getOBD2CheckPIDSupport()); + OBD.begin(Settings.getOBD2Name(OBD_ADP_NAME), Settings.getOBD2MAC(), Settings.getOBD2Pin(), + Settings.getOBD2Protocol(), Settings.getOBD2CheckPIDSupport()); OBD.onDevicesDiscovered(onBTDevicesDiscovered); OBD.connect(); diff --git a/src/obd.cpp b/src/obd.cpp index b95b9bc..b6d14f0 100644 --- a/src/obd.cpp +++ b/src/obd.cpp @@ -387,10 +387,11 @@ BTScanResults *OBDClass::discoverBtDevices() { return nullptr; } -void OBDClass::begin(const String &devName, const String &devMac, const char protocol, +void OBDClass::begin(const String &devName, const String &devMac, const String &devPin, const char protocol, const bool checkPidSupport) { this->devName = devName; this->devMac = devMac; + this->devPin = devPin; this->protocol = protocol; this->checkPidSupport = checkPidSupport; stopConnect = false; @@ -451,6 +452,10 @@ void OBDClass::connect(bool reconnect) { } if (!stopConnect && addr) { + if (devPin != nullptr && devPin.length() != 0) { + serialBt.setPin(devPin.c_str()); + } + Serial.printf("connecting to %s - %d\n", addr.toString().c_str(), channel); if (serialBt.connect(addr, channel, ESP_SPP_SEC_NONE, ESP_SPP_ROLE_SLAVE)) { connectedBTAddress = addr.toString().c_str(); @@ -474,6 +479,10 @@ void OBDClass::connect(bool reconnect) { } if (!stopConnect && addr) { + if (devPin != nullptr && devPin.length() != 0) { + serialBt.setPin(devPin.c_str()); + } + Serial.printf("connecting to %s - %d\n", addr.toString().c_str(), channel); if (serialBt.connect(addr, channel, ESP_SPP_SEC_NONE, ESP_SPP_ROLE_SLAVE)) { connectedBTAddress = addr.toString().c_str(); diff --git a/src/obd.h b/src/obd.h index f08be41..72e2822 100644 --- a/src/obd.h +++ b/src/obd.h @@ -75,6 +75,7 @@ class OBDClass : public OBDStates { String devName; String devMac; + String devPin; char protocol; bool checkPidSupport = false; @@ -114,7 +115,8 @@ class OBDClass : public OBDStates { bool writeStates(FS &fs); - void begin(const String &devName, const String &devMac, char protocol = AUTOMATIC, bool checkPidSupport = false); + void begin(const String &devName, const String &devMac, const String &devPin, char protocol = AUTOMATIC, + bool checkPidSupport = false); void end(); diff --git a/src/settings.cpp b/src/settings.cpp index 35d7e73..902a356 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -36,6 +36,7 @@ void SettingsClass::readJson(JsonDocument &doc) { strlcpy(obd2.name, doc["obd2"]["name"] | "", sizeof(obd2.name)); strlcpy(obd2.mac, doc["obd2"]["mac"] | "", sizeof(obd2.mac)); + strlcpy(obd2.pin, doc["obd2"]["pin"] | "", sizeof(obd2.pin)); obd2.checkPIDSupport = doc["obd2"]["checkPIDSupport"] | false; obd2.protocol = doc["obd2"]["protocol"] | '0'; @@ -66,6 +67,7 @@ void SettingsClass::writeJson(JsonDocument &doc) { doc["obd2"]["name"] = obd2.name; doc["obd2"]["mac"] = obd2.mac; + doc["obd2"]["pin"] = obd2.pin; doc["obd2"]["checkPIDSupport"] = obd2.checkPIDSupport; doc["obd2"]["protocol"] = obd2.protocol; @@ -230,6 +232,14 @@ void SettingsClass::setOBD2MAC(const char *mac) { strlcpy(obd2.mac, mac, sizeof(obd2.mac)); } +String SettingsClass::getOBD2Pin() const { + return obd2.pin; +} + +void SettingsClass::setOBD2Pin(const char *pin) { + strlcpy(obd2.pin, pin, sizeof(obd2.pin)); +} + bool SettingsClass::getOBD2CheckPIDSupport() const { return obd2.checkPIDSupport; } diff --git a/src/settings.h b/src/settings.h index 38b3612..0fb95dd 100644 --- a/src/settings.h +++ b/src/settings.h @@ -64,6 +64,7 @@ struct MobileSettings { struct OBD2Settings { char name[65]; char mac[19]; + char pin[7]; bool checkPIDSupport; char protocol; }; @@ -147,6 +148,10 @@ class SettingsClass { void setOBD2MAC(const char *mac); + String getOBD2Pin() const; + + void setOBD2Pin(const char *pin); + bool getOBD2CheckPIDSupport() const; void setOBD2CheckPIDSupport(bool checkPIDSupport); diff --git a/ui/src/app/components/settings.component.html b/ui/src/app/components/settings.component.html index 1dc631e..278ce09 100644 --- a/ui/src/app/components/settings.component.html +++ b/ui/src/app/components/settings.component.html @@ -167,6 +167,16 @@ > +
+ +
+ +
+
diff --git a/ui/src/app/components/settings.component.ts b/ui/src/app/components/settings.component.ts index 703dc30..e0159e2 100644 --- a/ui/src/app/components/settings.component.ts +++ b/ui/src/app/components/settings.component.ts @@ -118,6 +118,7 @@ export class SettingsComponent implements OnInit { this.obd2 = new FormGroup({ name: new FormControl("", Validators.maxLength(64)), mac: new FormControl("", Validators.pattern(/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/)), + pin: new FormControl("", [Validators.minLength(4), Validators.maxLength(6), Validators.pattern("^[0-9]+")]), checkPIDSupport: new FormControl(false), protocol: new FormControl(OBD2Protocol.AUTOMATIC), }); diff --git a/ui/src/app/definitions/settings.ts b/ui/src/app/definitions/settings.ts index 5ad2f0b..edfd6d8 100644 --- a/ui/src/app/definitions/settings.ts +++ b/ui/src/app/definitions/settings.ts @@ -57,6 +57,7 @@ export enum OBD2Protocol { export interface OBD2Settings { name?: string; mac?: string; + pin?: string; checkPIDSupport?: boolean; protocol?: OBD2Protocol; }