diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index ec7fc45..a136156 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -77,6 +77,7 @@ set(headers displays/menus/demosmenu.h displays/menus/dynamicdebugmenu.h displays/menus/enablemenu.h + displays/menus/espnowmenu.h displays/menus/feedbackdebugmenu.h displays/menus/gametrakmodesettingsmenu.h displays/menus/genericwifisettingsmenu.h @@ -280,6 +281,7 @@ set(sources displays/menus/demosmenu.cpp displays/menus/dynamicdebugmenu.cpp displays/menus/enablemenu.cpp + displays/menus/espnowmenu.cpp displays/menus/feedbackdebugmenu.cpp displays/menus/gametrakmodesettingsmenu.cpp displays/menus/genericwifisettingsmenu.cpp diff --git a/main/displays/menus/espnowmenu.cpp b/main/displays/menus/espnowmenu.cpp new file mode 100644 index 0000000..effc935 --- /dev/null +++ b/main/displays/menus/espnowmenu.cpp @@ -0,0 +1,28 @@ +#include "espnowmenu.h" + +#ifdef FEATURE_ESPNOW +#include "actions/dummyaction.h" +#include "actions/switchscreenaction.h" +#include "actions/toggleboolaction.h" +#include "checkboxicon.h" +#include "icons/back.h" +#include "icons/time.h" +#include "settingsmenu.h" + +using namespace espgui; + +namespace espnowmenu { +} // namespace + +EspNowMenu::EspNowMenu() { + constructMenuItem, espnowmenu::SendBobbycarTimesyncMessageAction, StaticMenuItemIcon<&bobbyicons::time>>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, espnowmenu::ReceiveTimeStampAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, espnowmenu::ReceiveTsFromOtherBobbycarsAccessor>>(); + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); +} + +void EspNowMenu::back() +{ + switchScreen(); +} +#endif diff --git a/main/displays/menus/espnowmenu.h b/main/displays/menus/espnowmenu.h new file mode 100644 index 0000000..d4155bf --- /dev/null +++ b/main/displays/menus/espnowmenu.h @@ -0,0 +1,42 @@ +#pragma once + +#ifdef FEATURE_ESPNOW + +#include +#include +#include +#include +#include +#include +#include + +#include "espnowfunctions.h" + +using namespace espgui; + +namespace espnowmenu { + +struct ReceiveTimeStampAccessor : public RefAccessor { bool &getRef() const override { return espnow::receiveTimeStamp; } }; +struct ReceiveTsFromOtherBobbycarsAccessor : public RefAccessor { bool &getRef() const override { return espnow::receiveTsFromOtherBobbycars; } }; + +class SendBobbycarTimesyncMessageAction : public virtual ActionInterface { +public: + void triggered() override + { + const auto message = fmt::format("BOBBYT:{}", espchrono::utc_clock::now().time_since_epoch().count()); + espnow::send_espnow_message(message); + } +}; + +} // namespace + +class EspNowMenu : + public espgui::MenuDisplay, + public espgui::StaticText +{ +public: + EspNowMenu(); + void back() override; +}; + +#endif diff --git a/main/displays/menus/settingsmenu.cpp b/main/displays/menus/settingsmenu.cpp index db53ff4..a4c0901 100644 --- a/main/displays/menus/settingsmenu.cpp +++ b/main/displays/menus/settingsmenu.cpp @@ -28,6 +28,7 @@ #include "displays/menus/bluetoothsettingsmenu.h" #include "displays/menus/blesettingsmenu.h" #include "displays/menus/cloudsettingsmenu.h" +#include "displays/menus/espnowmenu.h" #include "displays/menus/selectbuildservermenu.h" #include "displays/menus/timesettingsmenu.h" #include "displays/menus/modessettingsmenu.h" @@ -61,6 +62,9 @@ SettingsMenu::SettingsMenu() constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&bobbyicons::wifi>>>(); +#ifdef FEATURE_ESPNOW + constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&bobbyicons::wifi>>>(); +#endif #ifdef FEATURE_BLUETOOTH constructMenuItem, SwitchScreenAction, StaticMenuItemIcon<&bobbyicons::bluetooth>>>(); #endif diff --git a/main/espnowfunctions.cpp b/main/espnowfunctions.cpp index 1b5f25f..22d2c97 100644 --- a/main/espnowfunctions.cpp +++ b/main/espnowfunctions.cpp @@ -16,18 +16,13 @@ namespace espnow { uint16_t lastYear; // Used for esp-now timesync -esp_now_settings_t::Enable DefaultEnable { - .receiveTimeStamp = true, -}; - -esp_now_settings_t esp_now_settings{ - .enable = DefaultEnable, -}; - std::deque message_queue{}; std::list peers{}; uint8_t initialized{0}; +bool receiveTimeStamp{true}; +bool receiveTsFromOtherBobbycars{true}; + void onReceive(const uint8_t *mac_addr, const uint8_t *data, int data_len) { ESP_LOGD(TAG, "Received data"); @@ -121,12 +116,12 @@ void handle() return; } - if (esp_now_settings.enable.receiveTimeStamp) + if (receiveTimeStamp) { const auto thisYear = int(espchrono::toDateTime(espchrono::utc_clock::now()).date.year()); if (abs(thisYear - espnow::lastYear) > 1) { - esp_now_settings.enable.receiveTimeStamp = false; + receiveTimeStamp = false; } } @@ -139,7 +134,7 @@ void handle() if (msg.type == "T") { - if (!esp_now_settings.enable.receiveTimeStamp) + if (!receiveTimeStamp) return; if (const auto result = cpputils::fromString(msg.content); result) @@ -151,6 +146,11 @@ void handle() ESP_LOGW(TAG, "could not parse number: %.*s", result.error().size(), result.error().data()); } } + else if (msg.type == "BOBBYT") + { + if (!receiveTsFromOtherBobbycars) + return; + } else { ESP_LOGI(TAG, "Unkown Type: %s - Message: %s", msg.type.c_str(), msg.content.c_str()); @@ -164,6 +164,7 @@ void onRecvTs(uint64_t millis) const auto milliseconds = std::chrono::milliseconds(millis); const auto timepoint = espchrono::utc_clock::time_point(milliseconds); time_set_now(timepoint); + receiveTsFromOtherBobbycars = false; } esp_err_t send_espnow_message(std::string message) diff --git a/main/espnowfunctions.h b/main/espnowfunctions.h index 512d8dd..009adb3 100644 --- a/main/espnowfunctions.h +++ b/main/espnowfunctions.h @@ -14,12 +14,8 @@ struct esp_now_message_t { const std::string type; }; -struct esp_now_settings_t { - struct Enable { - bool receiveTimeStamp; - } enable; -} -extern esp_now_settings; +extern bool receiveTimeStamp; +extern bool receiveTsFromOtherBobbycars; extern std::deque message_queue; extern std::list peers; diff --git a/main/texts.cpp b/main/texts.cpp index 1111207..ec23560 100644 --- a/main/texts.cpp +++ b/main/texts.cpp @@ -544,4 +544,10 @@ char TEXT_QRCODE_DEBUG[] = "QR Debug"; char TEXT_GREENPASS[] = "Green Pass"; char TEXT_SHOWCERT[] = "Show cert"; +//EspNowMenu +char TEXT_ESPNOW[] = "ESP-Now"; +char TEXT_ESPNOW_MENU[] = "ESP-Now Menu"; +char TEXT_ESPNOW_RECEIVETS[] = "Recv Ts State"; +char TEXT_ESPNOW_RECEIVETSFROMBOBBY[] = "Recv BobbyTs State"; +char TEXT_ESPNOW_SENDTSMSG[] = "Broadcast Time"; } // namespace diff --git a/main/texts.h b/main/texts.h index ebbe24f..ed83a05 100644 --- a/main/texts.h +++ b/main/texts.h @@ -543,6 +543,13 @@ extern char TEXT_QRCODE_DEBUG[]; //GreenPassMenu extern char TEXT_GREENPASS[]; extern char TEXT_SHOWCERT[]; + +//EspNowMenu +extern char TEXT_ESPNOW[]; +extern char TEXT_ESPNOW_MENU[]; +extern char TEXT_ESPNOW_RECEIVETS[]; +extern char TEXT_ESPNOW_RECEIVETSFROMBOBBY[]; +extern char TEXT_ESPNOW_SENDTSMSG[]; } // namespace using namespace bobbytexts;