diff --git a/data_embed/index.html b/data_embed/index.html
index f1ce07e..4c20d88 100644
--- a/data_embed/index.html
+++ b/data_embed/index.html
@@ -518,13 +518,44 @@
>Enable bluetooth
-
diff --git a/data_embed/script.js b/data_embed/script.js
index e75973e..5c044c7 100644
--- a/data_embed/script.js
+++ b/data_embed/script.js
@@ -246,7 +246,9 @@ function loadSettings(settings) {
// BLUETOOTH
document.getElementById("bluetooth.active").checked = settings.bluetooth.active;
- document.getElementById("bluetooth.type").value = settings.bluetooth.type;
+ document.getElementById("bluetooth.deviceName").value = settings.bluetooth.deviceName;
+ document.getElementById("bluetooth.useBLE").checked = settings.bluetooth.useBLE;
+ document.getElementById("bluetooth.useKISS").checked = settings.bluetooth.useKISS;
// PTT Trigger
document.getElementById("ptt.active").checked = settings.pttTrigger.active;
diff --git a/include/configuration.h b/include/configuration.h
index 8b3a8b7..545109d 100644
--- a/include/configuration.h
+++ b/include/configuration.h
@@ -91,8 +91,10 @@ public:
class BLUETOOTH {
public:
- byte type;
bool active;
+ String deviceName;
+ bool useBLE;
+ bool useKISS;
};
diff --git a/src/LoRa_APRS_Tracker.cpp b/src/LoRa_APRS_Tracker.cpp
index 2ad2b96..a007c7d 100644
--- a/src/LoRa_APRS_Tracker.cpp
+++ b/src/LoRa_APRS_Tracker.cpp
@@ -57,7 +57,7 @@ TinyGPSPlus gps;
BluetoothSerial SerialBT;
#endif
-String versionDate = "2025.01.11";
+String versionDate = "2025.01.22";
uint8_t myBeaconsIndex = 0;
int myBeaconsSize = Config.beacons.size();
@@ -76,6 +76,7 @@ uint32_t refreshDisplayTime = millis();
bool sendUpdate = true;
+bool bluetoothActive = Config.bluetooth.active;
bool bluetoothConnected = false;
uint32_t lastTx = 0.0;
@@ -136,12 +137,14 @@ void setup() {
WiFi.mode(WIFI_OFF);
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "Main", "WiFi controller stopped");
- if (Config.bluetooth.type == 0 || Config.bluetooth.type == 2) {
- BLE_Utils::setup();
- } else {
- #ifdef HAS_BT_CLASSIC
- BLUETOOTH_Utils::setup();
- #endif
+ if (bluetoothActive) {
+ if (Config.bluetooth.useBLE) {
+ BLE_Utils::setup();
+ } else {
+ #ifdef HAS_BT_CLASSIC
+ BLUETOOTH_Utils::setup();
+ #endif
+ }
}
if (!Config.simplifiedTrackerMode) {
@@ -200,14 +203,16 @@ void loop() {
MSG_Utils::processOutputBuffer();
MSG_Utils::clean15SegBuffer();
- if (Config.bluetooth.type == 0 || Config.bluetooth.type == 2) {
- BLE_Utils::sendToPhone(packet.text.substring(3));
- BLE_Utils::sendToLoRa();
- } else {
- #ifdef HAS_BT_CLASSIC
- BLUETOOTH_Utils::sendToPhone(packet.text.substring(3));
- BLUETOOTH_Utils::sendToLoRa();
- #endif
+ if (bluetoothActive) {
+ if (Config.bluetooth.useBLE) {
+ BLE_Utils::sendToPhone(packet.text.substring(3));
+ BLE_Utils::sendToLoRa();
+ } else {
+ #ifdef HAS_BT_CLASSIC
+ BLUETOOTH_Utils::sendToPhone(packet.text.substring(3));
+ BLUETOOTH_Utils::sendToLoRa();
+ #endif
+ }
}
MSG_Utils::ledNotification();
diff --git a/src/ble_utils.cpp b/src/ble_utils.cpp
index 33ed8df..8c7abf4 100644
--- a/src/ble_utils.cpp
+++ b/src/ble_utils.cpp
@@ -15,23 +15,23 @@
#define CHARACTERISTIC_UUID_RX_0 "00000002-ba2a-46c9-ae49-01b0961f68bb"
// ANDROID - BLE Terminal app (Serial Bluetooth Terminal from Playstore)
-#define SERVICE_UUID_2 "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
-#define CHARACTERISTIC_UUID_TX_2 "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
-#define CHARACTERISTIC_UUID_RX_2 "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
+#define SERVICE_UUID_1 "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
+#define CHARACTERISTIC_UUID_TX_1 "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
+#define CHARACTERISTIC_UUID_RX_1 "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
-BLEServer *pServer;
-BLECharacteristic *pCharacteristicTx;
-BLECharacteristic *pCharacteristicRx;
+BLEServer *pServer;
+BLECharacteristic *pCharacteristicTx;
+BLECharacteristic *pCharacteristicRx;
extern Configuration Config;
extern Beacon *currentBeacon;
extern logging::Logger logger;
extern bool bluetoothConnected;
+extern bool bluetoothActive;
bool shouldSendBLEtoLoRa = false;
String BLEToLoRaPacket = "";
-
-String kissSerialBuffer = "";
+String kissSerialBuffer = "";
class MyServerCallbacks : public NimBLEServerCallbacks {
@@ -52,7 +52,7 @@ class MyServerCallbacks : public NimBLEServerCallbacks {
class MyCallbacks : public NimBLECharacteristicCallbacks {
void onWrite(NimBLECharacteristic *pCharacteristic) {
- if (Config.bluetooth.type == 0) { // AX25 KISS
+ if (Config.bluetooth.useKISS) { // KISS (AX.25)
std::string receivedData = pCharacteristic->getValue();
delay(100);
for (int i = 0; i < receivedData.length(); i++) {
@@ -72,7 +72,7 @@ class MyCallbacks : public NimBLECharacteristicCallbacks {
}
}
}
- } else if (Config.bluetooth.type == 2) { // TNC2
+ } else { // TNC2
std::string receivedData = pCharacteristic->getValue();
String receivedString = "";
for (int i = 0; i < receivedData.length(); i++) receivedString += receivedData[i];
@@ -90,22 +90,21 @@ namespace BLE_Utils {
}
void setup() {
- String id = currentBeacon->callsign;
- String BLEid = id.substring(0, id.indexOf("-")) + "-BLE";
- BLEDevice::init(BLEid.c_str());
+ String BLEid = Config.bluetooth.deviceName;
+ BLEDevice::init(BLEid.c_str());
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = nullptr;
- if (Config.bluetooth.type == 0) {
+ if (Config.bluetooth.useKISS) { // KISS (AX.25)
pService = pServer->createService(SERVICE_UUID_0);
pCharacteristicTx = pService->createCharacteristic(CHARACTERISTIC_UUID_TX_0, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
pCharacteristicRx = pService->createCharacteristic(CHARACTERISTIC_UUID_RX_0, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR);
- } else if (Config.bluetooth.type == 2) {
- pService = pServer->createService(SERVICE_UUID_2);
- pCharacteristicTx = pService->createCharacteristic(CHARACTERISTIC_UUID_TX_2, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
- pCharacteristicRx = pService->createCharacteristic(CHARACTERISTIC_UUID_RX_2, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR);
+ } else { // TNC2
+ pService = pServer->createService(SERVICE_UUID_1);
+ pCharacteristicTx = pService->createCharacteristic(CHARACTERISTIC_UUID_TX_1, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
+ pCharacteristicRx = pService->createCharacteristic(CHARACTERISTIC_UUID_RX_1, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR);
}
if (pService != nullptr) {
@@ -114,10 +113,10 @@ namespace BLE_Utils {
BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
- if (Config.bluetooth.type == 0) {
+ if (Config.bluetooth.useKISS) {
pAdvertising->addServiceUUID(SERVICE_UUID_0);
- } else if (Config.bluetooth.type == 2) {
- pAdvertising->addServiceUUID(SERVICE_UUID_2);
+ } else {
+ pAdvertising->addServiceUUID(SERVICE_UUID_1);
}
pServer->getAdvertising()->setScanResponse(true);
pServer->getAdvertising()->setMinPreferred(0x06);
@@ -125,7 +124,7 @@ namespace BLE_Utils {
pAdvertising->start();
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "BLE", "%s", "Waiting for BLE central to connect...");
} else {
- logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "BLE", "Failed to create BLE service. Invalid bluetoothType: %d", Config.bluetooth.type);
+ logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "BLE", "Failed to create BLE service");
}
}
@@ -155,7 +154,7 @@ namespace BLE_Utils {
}
void txToPhoneOverBLE(const String& frame) {
- if (Config.bluetooth.type == 0) { // AX25 KISS
+ if (Config.bluetooth.useKISS) { // KISS (AX.25)
const String kissEncodedFrame = KISS_Utils::encodeKISS(frame);
const char* t = kissEncodedFrame.c_str();
@@ -171,7 +170,7 @@ namespace BLE_Utils {
delete[] chunk;
delay(200);
}
- } else { // TNC2
+ } else { // TNC2
for (int n = 0; n < frame.length(); n++) txBLE(frame[n]);
txBLE('\n');
}
diff --git a/src/bluetooth_utils.cpp b/src/bluetooth_utils.cpp
index 21e399d..ef26b67 100644
--- a/src/bluetooth_utils.cpp
+++ b/src/bluetooth_utils.cpp
@@ -14,16 +14,14 @@ extern BluetoothSerial SerialBT;
extern logging::Logger logger;
extern TinyGPSPlus gps;
extern bool bluetoothConnected;
-
-bool bluetoothActive;
+extern bool bluetoothActive;
namespace BLUETOOTH_Utils {
String serialReceived;
bool shouldSendToLoRa = false;
- bool useKiss = false;
+ bool useKiss = Config.bluetooth.useKISS? true : false;
void setup() {
- bluetoothActive = Config.bluetooth.active;
if (!bluetoothActive) {
btStop();
esp_bt_controller_disable();
@@ -36,8 +34,7 @@ namespace BLUETOOTH_Utils {
SerialBT.register_callback(BLUETOOTH_Utils::bluetoothCallback);
SerialBT.onData(BLUETOOTH_Utils::getData); // callback instead of while to avoid RX buffer limit when NMEA data received
- String id = currentBeacon->callsign;
- String BTid = id.substring(0, id.indexOf("-")) + "-BT";
+ String BTid = Config.bluetooth.deviceName;
if (!SerialBT.begin(String(BTid))) {
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "Bluetooth", "Starting Bluetooth failed!");
@@ -53,7 +50,6 @@ namespace BLUETOOTH_Utils {
if (event == ESP_SPP_SRV_OPEN_EVT) {
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Bluetooth", "Client connected !");
bluetoothConnected = true;
- useKiss = false;
} else if (event == ESP_SPP_CLOSE_EVT) {
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "Bluetooth", "Client disconnected !");
bluetoothConnected = false;
@@ -63,9 +59,7 @@ namespace BLUETOOTH_Utils {
}
void getData(const uint8_t *buffer, size_t size) {
- if (size == 0) {
- return;
- }
+ if (size == 0) return;
shouldSendToLoRa = false;
serialReceived.clear();
bool isNmea = buffer[0] == '$';
@@ -111,7 +105,7 @@ namespace BLUETOOTH_Utils {
}
void sendToPhone(const String& packet) {
- if (!packet.isEmpty() && bluetoothActive) {
+ if (!packet.isEmpty()) {
if (useKiss) {
logger.log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, "BT RX Kiss", "%s", serialReceived.c_str());
SerialBT.println(KISS_Utils::encodeKISS(packet));
diff --git a/src/configuration.cpp b/src/configuration.cpp
index d1941a6..0a553f4 100644
--- a/src/configuration.cpp
+++ b/src/configuration.cpp
@@ -1,6 +1,7 @@
#include
#include
#include "configuration.h"
+#include "board_pinout.h"
#include "display.h"
#include "logger.h"
@@ -75,8 +76,14 @@ void Configuration::writeFile() {
data["pttTrigger"]["postDelay"] = ptt.postDelay;
data["pttTrigger"]["reverse"] = ptt.reverse;
- data["bluetooth"]["type"] = bluetooth.type;
data["bluetooth"]["active"] = bluetooth.active;
+ data["bluetooth"]["deviceName"] = bluetooth.deviceName;
+ #ifdef HAS_BT_CLASSIC
+ data["bluetooth"]["useBLE"] = bluetooth.useBLE;
+ #else
+ data["bluetooth"]["useBLE"] = true; // fixed as BLE
+ #endif
+ data["bluetooth"]["useKISS"] = bluetooth.useKISS;
data["other"]["simplifiedTrackerMode"] = simplifiedTrackerMode;
data["other"]["sendCommentAfterXBeacons"] = sendCommentAfterXBeacons;
@@ -175,8 +182,15 @@ bool Configuration::readFile() {
ptt.postDelay = data["pttTrigger"]["postDelay"] | 0;
ptt.reverse = data["pttTrigger"]["reverse"] | false;
- bluetooth.type = data["bluetooth"]["type"] | 1;
bluetooth.active = data["bluetooth"]["active"] | false;
+ bluetooth.deviceName = data["bluetooth"]["deviceName"] | "LoRaTracker";
+ #ifdef HAS_BT_CLASSIC
+ bluetooth.useBLE = data["bluetooth"]["useBLE"] | false;
+ bluetooth.useKISS = data["bluetooth"]["useKISS"] | false;
+ #else
+ bluetooth.useBLE = true; // fixed as BLE
+ bluetooth.useKISS = data["bluetooth"]["useKISS"] | true; // true=KISS, false=TNC2
+ #endif
simplifiedTrackerMode = data["other"]["simplifiedTrackerMode"] | false;
sendCommentAfterXBeacons = data["other"]["sendCommentAfterXBeacons"] | 10;
@@ -299,9 +313,16 @@ void Configuration::init() {
ptt.postDelay = 0;
ptt.reverse = false;
- bluetooth.type = 1;
bluetooth.active = false;
-
+ bluetooth.deviceName = "LoRaTracker";
+ #ifdef HAS_BT_CLASSIC
+ bluetooth.useBLE = false;
+ bluetooth.useKISS = false;
+ #else
+ bluetooth.useBLE = true; // fixed as BLE
+ bluetooth.useKISS = true;
+ #endif
+
simplifiedTrackerMode = false;
sendCommentAfterXBeacons = 10;
path = "WIDE1-1";
diff --git a/src/web_utils.cpp b/src/web_utils.cpp
index 155cdf3..04c0063 100644
--- a/src/web_utils.cpp
+++ b/src/web_utils.cpp
@@ -179,7 +179,9 @@ namespace WEB_Utils {
// Bluetooth
Config.bluetooth.active = request->hasParam("bluetooth.active", true);
- Config.bluetooth.type = request->getParam("bluetooth.type", true)->value().toInt();
+ Config.bluetooth.deviceName = request->getParam("bluetooth.deviceName", true)->value();
+ Config.bluetooth.useBLE = request->hasParam("bluetooth.useBLE", true);
+ Config.bluetooth.useKISS = request->hasParam("bluetooth.useKISS", true);
// PTT Trigger
Config.ptt.active = request->hasParam("ptt.active", true);
@@ -190,7 +192,10 @@ namespace WEB_Utils {
// WiFi AP
Config.wifiAP.password = request->getParam("wifiAP.password", true)->value();
- Config.wifiAP.active = false; // when Configuration is finished Tracker returns to normal mode.
+
+ //
+ Config.wifiAP.active = true;
+ //Config.wifiAP.active = false; // when Configuration is finished Tracker returns to normal mode.
Config.writeFile();