diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index f6afc4f..bb71673 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -31,6 +31,7 @@ set(headers actions/updateswapfrontbackaction.h bluetoothmode.h ble.h + bletexthelpers.h bmsutils.h changevaluedisplay_bluetoothmode.h changevaluedisplay_bool.h @@ -46,6 +47,7 @@ set(headers displays/graphdisplay.h displays/menus/aboutmenu.h displays/menus/accesspointwifisettingsmenu.h + displays/menus/blesettingsmenu.h displays/menus/bluetoothsettingsmenu.h displays/menus/bmsmenu.h displays/menus/buzzermenu.h diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 3679eb9..2d32cae 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -38,6 +38,10 @@ struct WifiEnabledAccessor : public RefAccessorSaveSettings { bool &getRef struct AutoBluetoothModeAccessor : public RefAccessorSaveSettings { BluetoothMode &getRef() const override { return settings.bluetoothSettings.autoBluetoothMode; } }; #endif +#ifdef FEATURE_BLE +struct BleEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.bleSettings.bleEnabled; } }; +#endif + struct FrontLeftEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.controllerHardware.enableFrontLeft; } }; struct FrontRightEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.controllerHardware.enableFrontRight; } }; struct BackLeftEnabledAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.controllerHardware.enableBackLeft; } }; diff --git a/main/ble.h b/main/ble.h index 08f8ab0..40a6080 100644 --- a/main/ble.h +++ b/main/ble.h @@ -1,5 +1,8 @@ #pragma once +// esp-idf includes +#include + // 3rdparty lib includes #include #ifdef FEATURE_BLE @@ -18,6 +21,9 @@ BLEService *pService{}; BLECharacteristic *livestatsCharacteristic{}; BLECharacteristic *remotecontrolCharacteristic{}; +void createBle(); +void destroyBle(); + class RemoteControlCallbacks : public NimBLECharacteristicCallbacks { public: @@ -28,6 +34,133 @@ RemoteControlCallbacks bleRemoteCallbacks; void initBle() { + if (settings.bleSettings.bleEnabled) + createBle(); +} + +void handleBle() +{ + if (settings.bleSettings.bleEnabled) + { + if (!pServer) + createBle(); + + if (livestatsCharacteristic->getSubscribedCount()) + { + StaticJsonDocument<1024> doc; + { + auto arr = doc.createNestedArray("v"); + if (controllers.front.feedbackValid) + arr.add(fixBatVoltage(controllers.front.feedback.batVoltage)); + else + arr.add(nullptr); + if (controllers.back.feedbackValid) + arr.add(fixBatVoltage(controllers.back.feedback.batVoltage)); + else + arr.add(nullptr); + } + + { + auto arr = doc.createNestedArray("t"); + if (controllers.front.feedbackValid) + arr.add(fixBoardTemp(controllers.front.feedback.boardTemp)); + else + arr.add(nullptr); + if (controllers.back.feedbackValid) + arr.add(fixBoardTemp(controllers.back.feedback.boardTemp)); + else + arr.add(nullptr); + } + + { + auto arr = doc.createNestedArray("e"); + if (controllers.front.feedbackValid) + { + arr.add(controllers.front.feedback.left.error); + arr.add(controllers.front.feedback.right.error); + } + else + { + arr.add(nullptr); + arr.add(nullptr); + } + if (controllers.back.feedbackValid) + { + arr.add(controllers.back.feedback.left.error); + arr.add(controllers.back.feedback.right.error); + } + else + { + arr.add(nullptr); + arr.add(nullptr); + } + } + + { + auto arr = doc.createNestedArray("s"); + if (controllers.front.feedbackValid) + { + arr.add(convertToKmh(controllers.front.feedback.left.speed * (settings.controllerHardware.invertFrontLeft ? -1 : 1))); + arr.add(convertToKmh(controllers.front.feedback.right.speed * (settings.controllerHardware.invertFrontRight ? -1 : 1))); + } + else + { + arr.add(nullptr); + arr.add(nullptr); + } + if (controllers.back.feedbackValid) + { + arr.add(convertToKmh(controllers.back.feedback.left.speed * (settings.controllerHardware.invertBackLeft ? -1 : 1))); + arr.add(convertToKmh(controllers.back.feedback.right.speed * (settings.controllerHardware.invertBackRight ? -1 : 1))); + } + else + { + arr.add(nullptr); + arr.add(nullptr); + } + } + + { + auto arr = doc.createNestedArray("a"); + if (controllers.front.feedbackValid) + { + arr.add(fixCurrent(controllers.front.feedback.left.dcLink) * 2); + arr.add(fixCurrent(controllers.front.feedback.right.dcLink) * 2); + } + else + { + arr.add(nullptr); + arr.add(nullptr); + } + if (controllers.back.feedbackValid) + { + arr.add(fixCurrent(controllers.back.feedback.left.dcLink) * 2); + arr.add(fixCurrent(controllers.back.feedback.right.dcLink) * 2); + } + else + { + arr.add(nullptr); + arr.add(nullptr); + } + } + + std::string json; + serializeJson(doc, json); + + livestatsCharacteristic->setValue(json); + livestatsCharacteristic->notify(); + } + } + else if (pServer) + { + destroyBle(); + } +} + +void createBle() +{ + ESP_LOGI("BOBBY", "called"); + BLEDevice::init(deviceName); const auto serviceUuid{"0335e46c-f355-4ce6-8076-017de08cee98"}; @@ -48,113 +181,16 @@ void initBle() BLEDevice::startAdvertising(); } -void handleBle() +void destroyBle() { - if (livestatsCharacteristic->getSubscribedCount()) - { - StaticJsonDocument<1024> doc; - { - auto arr = doc.createNestedArray("v"); - if (controllers.front.feedbackValid) - arr.add(fixBatVoltage(controllers.front.feedback.batVoltage)); - else - arr.add(nullptr); - if (controllers.back.feedbackValid) - arr.add(fixBatVoltage(controllers.back.feedback.batVoltage)); - else - arr.add(nullptr); - } + ESP_LOGI("BOBBY", "called"); - { - auto arr = doc.createNestedArray("t"); - if (controllers.front.feedbackValid) - arr.add(fixBoardTemp(controllers.front.feedback.boardTemp)); - else - arr.add(nullptr); - if (controllers.back.feedbackValid) - arr.add(fixBoardTemp(controllers.back.feedback.boardTemp)); - else - arr.add(nullptr); - } + BLEDevice::deinit(true); - { - auto arr = doc.createNestedArray("e"); - if (controllers.front.feedbackValid) - { - arr.add(controllers.front.feedback.left.error); - arr.add(controllers.front.feedback.right.error); - } - else - { - arr.add(nullptr); - arr.add(nullptr); - } - if (controllers.back.feedbackValid) - { - arr.add(controllers.back.feedback.left.error); - arr.add(controllers.back.feedback.right.error); - } - else - { - arr.add(nullptr); - arr.add(nullptr); - } - } - - { - auto arr = doc.createNestedArray("s"); - if (controllers.front.feedbackValid) - { - arr.add(convertToKmh(controllers.front.feedback.left.speed * (settings.controllerHardware.invertFrontLeft ? -1 : 1))); - arr.add(convertToKmh(controllers.front.feedback.right.speed * (settings.controllerHardware.invertFrontRight ? -1 : 1))); - } - else - { - arr.add(nullptr); - arr.add(nullptr); - } - if (controllers.back.feedbackValid) - { - arr.add(convertToKmh(controllers.back.feedback.left.speed * (settings.controllerHardware.invertBackLeft ? -1 : 1))); - arr.add(convertToKmh(controllers.back.feedback.right.speed * (settings.controllerHardware.invertBackRight ? -1 : 1))); - } - else - { - arr.add(nullptr); - arr.add(nullptr); - } - } - - { - auto arr = doc.createNestedArray("a"); - if (controllers.front.feedbackValid) - { - arr.add(fixCurrent(controllers.front.feedback.left.dcLink) * 2); - arr.add(fixCurrent(controllers.front.feedback.right.dcLink) * 2); - } - else - { - arr.add(nullptr); - arr.add(nullptr); - } - if (controllers.back.feedbackValid) - { - arr.add(fixCurrent(controllers.back.feedback.left.dcLink) * 2); - arr.add(fixCurrent(controllers.back.feedback.right.dcLink) * 2); - } - else - { - arr.add(nullptr); - arr.add(nullptr); - } - } - - std::string json; - serializeJson(doc, json); - - livestatsCharacteristic->setValue(json); - livestatsCharacteristic->notify(); - } + pServer = {}; + pService = {}; + livestatsCharacteristic = {}; + remotecontrolCharacteristic = {}; } void RemoteControlCallbacks::onWrite(NimBLECharacteristic* pCharacteristic) diff --git a/main/bletexthelpers.h b/main/bletexthelpers.h new file mode 100644 index 0000000..8f621c6 --- /dev/null +++ b/main/bletexthelpers.h @@ -0,0 +1,34 @@ +#pragma once + +// 3rdparty lib includes +#include + +// local includes +#include "textinterface.h" +#include "ble.h" + +namespace { +#ifdef FEATURE_BLE +struct BleServerPeerDevicesText : public virtual TextInterface { +public: + std::string text() const override + { + std::string text = "peerDevices: "; + if (pServer) + text += std::to_string(pServer->getPeerDevices().size()); + return text; + } +}; + +struct BleCharacSubscribedText : public virtual TextInterface { +public: + std::string text() const override + { + std::string text = "subscribed: "; + if (livestatsCharacteristic) + text += std::to_string(livestatsCharacteristic->getSubscribedCount()); + return text; + } +}; +#endif +} diff --git a/main/bluetoothtexthelpers.h b/main/bluetoothtexthelpers.h index 3f82122..5616fce 100644 --- a/main/bluetoothtexthelpers.h +++ b/main/bluetoothtexthelpers.h @@ -1,5 +1,6 @@ #pragma once +// local includes #include "textinterface.h" #include "globals.h" #include "utils.h" diff --git a/main/displays/menus/blesettingsmenu.h b/main/displays/menus/blesettingsmenu.h new file mode 100644 index 0000000..ad5daaa --- /dev/null +++ b/main/displays/menus/blesettingsmenu.h @@ -0,0 +1,36 @@ +#pragma once + +// local includes +#include "menudisplay.h" +#include "menuitem.h" +#include "actions/switchscreenaction.h" +#include "actions/toggleboolaction.h" +#include "checkboxicon.h" +#include "bletexthelpers.h" +#include "accessors/settingsaccessors.h" +#include "icons/back.h" +#include "texts.h" + +// forward declares +namespace { +class SettingsMenu; +} // namespace + +namespace { +#ifdef FEATURE_BLE +class BleSettingsMenu : + public MenuDisplay, + public StaticText, + public BackActionInterface> +{ +public: + BleSettingsMenu() + { + constructMenuItem, ToggleBoolAction, CheckboxIcon, BleEnabledAccessor>>(); + constructMenuItem>(); + constructMenuItem>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::back>>>(); + } +}; +#endif +} // namespace diff --git a/main/displays/menus/settingsmenu.h b/main/displays/menus/settingsmenu.h index 2731954..5faaaf9 100644 --- a/main/displays/menus/settingsmenu.h +++ b/main/displays/menus/settingsmenu.h @@ -7,7 +7,7 @@ #include "actions/switchscreenaction.h" #include "checkboxicon.h" #include "icons/wifi.h" -#ifdef FEATURE_BLUETOOTH +#if defined(FEATURE_BLUETOOTH) || defined(FEATURE_BLE) #include "icons/bluetooth.h" #endif #include "icons/hardware.h" @@ -23,6 +23,7 @@ namespace { class LimitsSettingsMenu; class WifiSettingsMenu; class BluetoothSettingsMenu; +class BleSettingsMenu; class ModesSettingsMenu; class ControllerHardwareSettingsMenu; class BoardcomputerHardwareSettingsMenu; @@ -57,6 +58,9 @@ public: constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::wifi>>>(); #ifdef FEATURE_BLUETOOTH constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::bluetooth>>>(); +#endif +#ifdef FEATURE_BLE + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::bluetooth>>>(); #endif constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&icons::hardware>>>(); diff --git a/main/displays/statusdisplay.h b/main/displays/statusdisplay.h index 8ce2075..865bf5d 100644 --- a/main/displays/statusdisplay.h +++ b/main/displays/statusdisplay.h @@ -100,7 +100,7 @@ private: Label m_labelWifiStatus{35, bottomLines[0]}; // 120, 15 Label m_labelLimit0{205, bottomLines[0]}; // 35, 15 Label m_labelIpAddress{25, bottomLines[1]}; // 130, 15 - Label m_labelSignal{125, bottomLines[1]}; // 130, 15 + Label m_labelSignal{120, bottomLines[1]}; // 130, 15 Label m_labelLimit1{205, bottomLines[1]}; // 35, 15 Label m_labelPerformance{40, bottomLines[2]}; // 40, 15 Label m_labelFreeMem{70, bottomLines[2]}; // 40, 15 diff --git a/main/icons/bluetooth.h b/main/icons/bluetooth.h index afbe57a..58abada 100644 --- a/main/icons/bluetooth.h +++ b/main/icons/bluetooth.h @@ -4,7 +4,7 @@ namespace { namespace icons { -#ifdef FEATURE_BLUETOOTH +#if defined(FEATURE_BLUETOOTH) || defined(FEATURE_BLE) const Icon<24, 24> bluetooth{{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x120F, 0x1A50, 0x0000, 0x01CF, 0x2AB1, 0x3B12, 0x4333, 0x4333, 0x3AF2, 0x2AB1, 0x01EF, // 0x0010 (16) pixels 0x0000, 0x1A50, 0x1210, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1210, 0x018E, 0x0007, 0x2AB1, // 0x0020 (32) pixels diff --git a/main/main.cpp b/main/main.cpp index 3aae14f..b71163f 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -27,6 +27,9 @@ using namespace std::chrono_literals; #ifdef FEATURE_BLUETOOTH #include "displays/menus/bluetoothsettingsmenu.h" #endif +#ifdef FEATURE_BLE +#include "displays/menus/blesettingsmenu.h" +#endif #include "displays/menus/bmsmenu.h" #include "displays/menus/buzzermenu.h" #include "displays/menus/commanddebugmenu.h" diff --git a/main/presets.h b/main/presets.h index ed9c392..b490f6d 100644 --- a/main/presets.h +++ b/main/presets.h @@ -75,6 +75,12 @@ constexpr Settings::BluetoothSettings defaultBluetoothSettings { }; #endif +#ifdef FEATURE_BLE +constexpr Settings::BleSettings defaultBleSettings { + .bleEnabled = true +}; +#endif + constexpr Settings::ControllerHardware spinnerControllerHardware { .enableFrontLeft = true, .enableFrontRight = true, @@ -182,6 +188,9 @@ constexpr Settings defaultSettings { .wifiSettings = defaultWifiSettings, #ifdef FEATURE_BLUETOOTH .bluetoothSettings = defaultBluetoothSettings, +#endif +#ifdef FEATURE_BLE + .bleSettings = defaultBleSettings, #endif .controllerHardware = defaultControllerHardware, .boardcomputerHardware = defaultBoardcomputerHardware, diff --git a/main/settings.h b/main/settings.h index e789cac..5fcea5c 100644 --- a/main/settings.h +++ b/main/settings.h @@ -47,6 +47,12 @@ struct Settings } bluetoothSettings; #endif +#ifdef FEATURE_BLE + struct BleSettings { + bool bleEnabled; + } bleSettings; +#endif + struct ControllerHardware { bool enableFrontLeft, enableFrontRight, enableBackLeft, enableBackRight; bool invertFrontLeft, invertFrontRight, invertBackLeft, invertBackRight; @@ -127,11 +133,15 @@ void Settings::executeForEveryCommonSetting(T &&callable) callable("autoConnectBms", autoConnectBms); #endif + callable("wifiEnabled", wifiSettings.wifiEnabled); + #ifdef FEATURE_BLUETOOTH callable("autoBluetoothMo", bluetoothSettings.autoBluetoothMode); #endif - callable("wifiEnabled", wifiSettings.wifiEnabled); +#ifdef FEATURE_BLE + callable("bleEnabled", bleSettings.bleEnabled); +#endif callable("wheelDiameter", controllerHardware.wheelDiameter); callable("numMagnetPoles", controllerHardware.numMagnetPoles); diff --git a/main/texts.h b/main/texts.h index 09e0d5a..d6a9a23 100644 --- a/main/texts.h +++ b/main/texts.h @@ -33,6 +33,13 @@ constexpr char TEXT_TURNOFFDISCHARGE[] = "Turn off discharge"; #endif #endif +#ifdef FEATURE_BLE +//BleSettingsMenu +constexpr char TEXT_BLESETTINGS[] = "BLE settings"; +constexpr char TEXT_BLEENABLED[] = "BLE enabled"; +//constexpr char TEXT_BACK[] = "Back"; +#endif + //DebugMenu constexpr char TEXT_LOADSETTINGS[] = "Load settings"; constexpr char TEXT_SAVESETTINGS[] = "Save settings"; @@ -74,6 +81,7 @@ constexpr char TEXT_BACKLIGHT[] = "Backlight"; constexpr char TEXT_LIMITSSETTINGS[] = "Limits settings"; constexpr char TEXT_WIFISETTINGS[] = "WiFi settings"; //constexpr char TEXT_BLUETOOTHSETTINGS[] = "Bluetooth settings"; +//constexpr char TEXT_BLESETTINGS[] = "BLE settings"; constexpr char TEXT_MODESSETTINGS[] = "Modes settings"; constexpr char TEXT_CONTROLLERHARDWARESETTINGS[] = "Controller H/W settings"; constexpr char TEXT_BOARDCOMPUTERHARDWARESETTINGS[] = "Boardcomputer H/W settings";