diff --git a/firmware/keira/src/apps/launcher.cpp b/firmware/keira/src/apps/launcher.cpp index a6575be4..a833ddc7 100644 --- a/firmware/keira/src/apps/launcher.cpp +++ b/firmware/keira/src/apps/launcher.cpp @@ -50,6 +50,9 @@ #include "icons/music.h" #include "fmanager.h" +#include // for setWiFiTxPower +#include + LauncherApp::LauncherApp() : App("Menu") { networkService = static_cast(ServiceManager::getInstance()->getService("network")); } @@ -133,6 +136,7 @@ void LauncherApp::run() { } ), ITEM::MENU("Мережі WiFi", [this]() { this->wifiManager(); }), + ITEM::MENU("Потужність WiFi", [this]() { this->setWiFiTxPower(); }), ITEM::MENU("Звук", [this]() { this->runApp(); }), ITEM::MENU("Про систему", [this]() { this->about(); }), ITEM::MENU("Інфо про пристрій", [this]() { this->info(); }), @@ -211,7 +215,54 @@ template void LauncherApp::runApp(Args&&... args) { AppManager::getInstance()->runApp(new T(std::forward(args)...)); } +void LauncherApp::setWiFiTxPower() { + // String names[16]; + // int partitionCount = lilka::sys.get_partition_labels(names); + + String names[] = { + "19.5 dBm", "19 dBm", "18.5 dBm", "17 dBm", "15 dBm", "13 dBm", "11 dBm", "8.5 dBm", "7 dBm", "2 dBm", "-1 dBm" + }; + wifi_power_t values[] = { + WIFI_POWER_19_5dBm, + WIFI_POWER_19dBm, + WIFI_POWER_18_5dBm, + WIFI_POWER_17dBm, + WIFI_POWER_15dBm, + WIFI_POWER_13dBm, + WIFI_POWER_11dBm, + WIFI_POWER_8_5dBm, + WIFI_POWER_7dBm, + WIFI_POWER_5dBm, + WIFI_POWER_2dBm, + WIFI_POWER_MINUS_1dBm + }; + lilka::Menu wifiSetTxMenu; + wifiSetTxMenu.setTitle("Оберіть потужність"); + wifiSetTxMenu.addActivationButton(lilka::Button::B); // Exit + // Add names + for (auto i = 0; i < sizeof(names) / sizeof(names[0]); i++) + wifiSetTxMenu.addItem(names[i]); + // Perform draw + while (!wifiSetTxMenu.isFinished()) { + wifiSetTxMenu.update(); + wifiSetTxMenu.draw(canvas); + queueDraw(); + } + auto button = wifiSetTxMenu.getButton(); + + if (button == lilka::Button::B) return; + auto index = wifiSetTxMenu.getCursor(); + + // Set power immediately + WiFi.setTxPower(values[index]); + + // Save value to NVS + Preferences prefs; + prefs.begin(WIFI_KEIRA_NAMESPACE, false); + prefs.putInt("txPower", static_cast(values[index])); + prefs.end(); +} void LauncherApp::wifiToggle() { networkService->setEnabled(!networkService->getEnabled()); } diff --git a/firmware/keira/src/apps/launcher.h b/firmware/keira/src/apps/launcher.h index 47f7b0a2..e25320ff 100644 --- a/firmware/keira/src/apps/launcher.h +++ b/firmware/keira/src/apps/launcher.h @@ -64,7 +64,7 @@ class LauncherApp : public App { void alert(String title, String message); template void runApp(Args&&... args); - + void setWiFiTxPower(); void wifiToggle(); void wifiManager(); void about(); diff --git a/firmware/keira/src/services/network.cpp b/firmware/keira/src/services/network.cpp index a6346b30..df378b54 100644 --- a/firmware/keira/src/services/network.cpp +++ b/firmware/keira/src/services/network.cpp @@ -29,10 +29,13 @@ NetworkService::NetworkService() : void NetworkService::run() { Preferences prefs; - prefs.begin("keira", true); + prefs.begin(WIFI_KEIRA_NAMESPACE, true); bool enabled = prefs.isKey("enabled") ? prefs.getBool("enabled") : false; + wifi_power_t txPower = + prefs.isKey("txPower") ? static_cast(prefs.getInt("txPower")) : WIFI_POWER_19_5dBm; prefs.end(); + WiFi.setTxPower(txPower); WiFi.onEvent([this](WiFiEvent_t event, WiFiEventInfo_t info) { switch (event) { case ARDUINO_EVENT_WIFI_STA_START: { @@ -45,7 +48,7 @@ void NetworkService::run() { setNetworkState(NETWORK_STATE_ONLINE); Preferences prefs; String connectedSSID = String(info.wifi_sta_connected.ssid, info.wifi_sta_connected.ssid_len); - prefs.begin("keira", false); + prefs.begin(WIFI_KEIRA_NAMESPACE, false); if (!prefs.isKey("last_ssid") || !String(prefs.getString("last_ssid")).equals(connectedSSID)) { // Set current SSID as last connected prefs.putString("last_ssid", String(connectedSSID)); @@ -54,7 +57,7 @@ void NetworkService::run() { prefs.end(); String ssidHash = hash(connectedSSID); String savedPassword = getPassword(connectedSSID); - prefs.begin("keira", false); + prefs.begin(WIFI_KEIRA_NAMESPACE, false); if (savedPassword != lastPassword) { // Save password for the connected network prefs.putString(String(ssidHash + "_pw").c_str(), lastPassword); @@ -155,7 +158,7 @@ void NetworkService::autoConnect() { // Check if there is a known network to connect to Preferences prefs; - prefs.begin("keira", true); + prefs.begin(WIFI_KEIRA_NAMESPACE, true); if (!prefs.isKey("last_ssid")) { lilka::serial_log("NetworkService: no last SSID found, skipping auto connection"); } else { @@ -206,7 +209,7 @@ bool NetworkService::getEnabled() { void NetworkService::setEnabled(bool enabled) { Preferences prefs; - prefs.begin("keira", false); + prefs.begin(WIFI_KEIRA_NAMESPACE, false); prefs.putBool("enabled", enabled); prefs.end(); @@ -224,7 +227,7 @@ void NetworkService::setEnabled(bool enabled) { String NetworkService::getPassword(String ssid) { Preferences prefs; - prefs.begin("keira", true); + prefs.begin(WIFI_KEIRA_NAMESPACE, true); String ssidHash = hash(ssid); String result; if (!prefs.isKey(String(ssidHash + "_pw").c_str())) { diff --git a/firmware/keira/src/services/network.h b/firmware/keira/src/services/network.h index 2a927633..dea71354 100644 --- a/firmware/keira/src/services/network.h +++ b/firmware/keira/src/services/network.h @@ -3,6 +3,8 @@ #include #include "service.h" +#define WIFI_KEIRA_NAMESPACE "kwifi" + enum NetworkState { NETWORK_STATE_DISABLED, NETWORK_STATE_OFFLINE,