Changed some files

This commit is contained in:
CommanderRedYT
2022-02-18 01:21:54 +01:00
parent 2adccba813
commit 168baeac83
21 changed files with 163 additions and 89 deletions

View File

@ -104,7 +104,7 @@ void initBle()
void handleBle() void handleBle()
{ {
if (!configs.feature.ble.value) if (!configs.feature.ble.isEnabled.value)
return; return;
if (configs.bleSettings.bleEnabled.value) if (configs.bleSettings.bleEnabled.value)
@ -237,7 +237,7 @@ void RemoteControlCallbacks::onWrite(NimBLECharacteristic* pCharacteristic)
return; return;
} }
if (configs.feature.ledstrip.value) if (configs.feature.ledstrip.isEnabled.value)
{ {
const auto newBlinkAnimation = doc["anim"].as<int16_t>(); const auto newBlinkAnimation = doc["anim"].as<int16_t>();
if (blinkAnimation != newBlinkAnimation) blinkAnimation = newBlinkAnimation; if (blinkAnimation != newBlinkAnimation) blinkAnimation = newBlinkAnimation;

View File

@ -56,7 +56,7 @@ void handle_bobby_quickaction(espgui::Button button)
void open_garage() void open_garage()
{ {
if (!configs.feature.esp_now.value) if (!configs.feature.esp_now.isEnabled.value)
return; return;
if (!espnow::espnow_init_allowed()) if (!espnow::espnow_init_allowed())
@ -82,7 +82,7 @@ void action_wifi_scan()
void blink_left() void blink_left()
{ {
if (configs.feature.ledstrip.value) if (configs.feature.ledstrip.isEnabled.value)
{ {
if (blinkAnimation == LEDSTRIP_OVERWRITE_NONE) //transition from off to left if (blinkAnimation == LEDSTRIP_OVERWRITE_NONE) //transition from off to left
{ {
@ -101,7 +101,7 @@ void blink_left()
void blink_right() void blink_right()
{ {
if(configs.feature.ledstrip.value) if(configs.feature.ledstrip.isEnabled.value)
{ {
if (blinkAnimation == LEDSTRIP_OVERWRITE_NONE) //transition from off to right if (blinkAnimation == LEDSTRIP_OVERWRITE_NONE) //transition from off to right
{ {

View File

@ -52,7 +52,7 @@ void initCloud()
void updateCloud() void updateCloud()
{ {
if (!configs.feature.cloud.value) if (!configs.feature.cloud.isEnabled.value)
return; return;
const auto now = espchrono::millis_clock::now(); const auto now = espchrono::millis_clock::now();

View File

@ -68,7 +68,7 @@ DebugMenu::DebugMenu()
#endif #endif
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_QRCODE_DEBUG>, SwitchScreenAction<QrCodeDebugDisplay>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_QRCODE_DEBUG>, SwitchScreenAction<QrCodeDebugDisplay>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BATTERYDEBUG>, SwitchScreenAction<BatteryDebugMenu>, StaticMenuItemIcon<&bobbyicons::battery>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BATTERYDEBUG>, SwitchScreenAction<BatteryDebugMenu>, StaticMenuItemIcon<&bobbyicons::battery>>>();
if (configs.feature.udpcloud.value) if (configs.feature.udpcloud.isEnabled.value)
{ {
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_TOGGLECLOUDDEBUG>, BobbyCheckbox, CloudDebugEnableAccessor>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_TOGGLECLOUDDEBUG>, BobbyCheckbox, CloudDebugEnableAccessor>>();
} }

View File

@ -1,16 +1,18 @@
#include "featureflagsmenu.h" #include "featureflagsmenu.h"
// 3rdparty lib includes // 3rdparty lib includes
#include <fmt/core.h> #include <TFT_eSPI.h>
#include <actions/switchscreenaction.h> #include <actions/switchscreenaction.h>
#include <fmt/core.h>
#include <icons/back.h> #include <icons/back.h>
#include <strutils.h> #include <strutils.h>
// local includes // local includes
#include "bobbycheckbox.h"
#include "displays/bobbypopupdisplay.h" #include "displays/bobbypopupdisplay.h"
#include "displays/menus/settingsmenu.h" #include "displays/menus/settingsmenu.h"
#include "bobbycheckbox.h"
#include "newsettings.h" #include "newsettings.h"
#include "taskmanager.h"
using namespace espgui; using namespace espgui;
@ -22,29 +24,44 @@ constexpr char TEXT_BACK[] = "Back";
class FeatureFlagMenuItem : public MenuItem, public virtual BobbyErrorHandler { class FeatureFlagMenuItem : public MenuItem, public virtual BobbyErrorHandler {
public: public:
explicit FeatureFlagMenuItem(ConfigWrapper<bool> &config) : m_config{config} {} explicit FeatureFlagMenuItem(ConfiguredFeatureFlag &flag, bool isInitialized) : m_flag{flag}, m_isInitialized{isInitialized} {}
std::string text() const override std::string text() const override
{ {
std::string_view name = m_config.nvsName(); std::string_view name = m_flag.isEnabled.nvsName();
constexpr const std::string_view prefix = "f_"; constexpr const std::string_view prefix = "f_";
if (cpputils::stringStartsWith(name, prefix)) { if (cpputils::stringStartsWith(name, prefix)) {
name.remove_prefix(prefix.size()); name.remove_prefix(prefix.size());
} }
return std::string{name}; std::string return_name = std::string{name};
return_name += m_flag.isBeta() ? " (beta)" : "";
return return_name;
}
int color() const override
{
if (m_isInitialized)
{
return m_flag.isBeta() ? TFT_YELLOW : TFT_GREEN;
}
else
{
return m_flag.isBeta() ? TFT_ORANGE : TFT_GREY;
}
} }
void triggered() override void triggered() override
{ {
if (auto result = m_config.write(configs.nvs_handle_user, !m_config.value); !result) if (auto result = m_flag.isEnabled.write(configs.nvs_handle_user, !m_flag.isEnabled.value); !result)
errorOccured(std::move(result).error()); errorOccured(std::move(result).error());
} }
const MenuItemIcon *icon() const override const MenuItemIcon *icon() const override
{ {
return m_config.value ? &icons::checked : &icons::unchecked; return m_flag.isEnabled.value ? &icons::checked : &icons::unchecked;
} }
private: private:
ConfigWrapper<bool> &m_config; ConfiguredFeatureFlag &m_flag;
const bool m_isInitialized;
}; };
// TODO: Replace SwitchScreenAction / switchScreen with this action. Needs: BobbyPopupDisplayWithCustomExitAction => pass SwitchScreenAction<SettingsMenu> into it // TODO: Replace SwitchScreenAction / switchScreen with this action. Needs: BobbyPopupDisplayWithCustomExitAction => pass SwitchScreenAction<SettingsMenu> into it
@ -62,8 +79,13 @@ public:
FeatureFlagsMenu::FeatureFlagsMenu() FeatureFlagsMenu::FeatureFlagsMenu()
{ {
configs.callForEveryFeature([&](ConfigWrapper<bool> &feature){ configs.callForEveryFeature([&](ConfiguredFeatureFlag &feature){
constructMenuItem<FeatureFlagMenuItem>(feature);
if (const auto err = checkInitializedByName(feature.getTaskName()); !err) {
constructMenuItem<FeatureFlagMenuItem>(feature, *err);
}
else
constructMenuItem<FeatureFlagMenuItem>(feature, true);
}); });
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<SettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<SettingsMenu>>>();
} }

View File

@ -166,7 +166,7 @@ LedstripMenu::LedstripMenu()
if (!simplified) { constructMenuItem<makeComponent<MenuItem, TextWithValueHelper<TEXT_STVO_FRONTLENGTH, LedsStVOFrontLengthAccessor>, espgui::SwitchScreenAction<StVOLengthChangeScreen>>>(); } if (!simplified) { constructMenuItem<makeComponent<MenuItem, TextWithValueHelper<TEXT_STVO_FRONTLENGTH, LedsStVOFrontLengthAccessor>, espgui::SwitchScreenAction<StVOLengthChangeScreen>>>(); }
constructMenuItem<makeComponent<MenuItem, espgui::StaticText<TEXT_BLINKANIMATION>, espgui::SwitchScreenAction<LedstripSelectBlinkMenu>>>(); constructMenuItem<makeComponent<MenuItem, espgui::StaticText<TEXT_BLINKANIMATION>, espgui::SwitchScreenAction<LedstripSelectBlinkMenu>>>();
if (configs.feature.ota.value) if (configs.feature.ota.isEnabled.value)
if (!simplified) { constructMenuItem<makeComponent<MenuItem, espgui::StaticText<TEXT_LEDSTRIP_CHANGE_OTA_ANIM>, espgui::SwitchScreenAction<LedstripOtaAnimationChangeMenu>>>(); } if (!simplified) { constructMenuItem<makeComponent<MenuItem, espgui::StaticText<TEXT_LEDSTRIP_CHANGE_OTA_ANIM>, espgui::SwitchScreenAction<LedstripOtaAnimationChangeMenu>>>(); }
constructMenuItem<makeComponent<MenuItem, espgui::StaticText<TEXT_ANIMATION_MULTIPLIER>, espgui::SwitchScreenAction<AnimationMultiplierChangeScreen>>>(); constructMenuItem<makeComponent<MenuItem, espgui::StaticText<TEXT_ANIMATION_MULTIPLIER>, espgui::SwitchScreenAction<AnimationMultiplierChangeScreen>>>();
if (!simplified) { constructMenuItem<makeComponent<MenuItem, TextWithValueHelper<TEXT_LEDSCOUNT, LedsCountAccessor>, espgui::SwitchScreenAction<LedsCountChangeScreen>>>(); } if (!simplified) { constructMenuItem<makeComponent<MenuItem, TextWithValueHelper<TEXT_LEDSCOUNT, LedsCountAccessor>, espgui::SwitchScreenAction<LedsCountChangeScreen>>>(); }

View File

@ -83,7 +83,7 @@ MainMenu::MainMenu()
// constructMenuItem<makeComponent<MenuItem, mainmenu::CurrentTimeText, DummyAction, StaticMenuItemIcon<&bobbyicons::time>>>(); // constructMenuItem<makeComponent<MenuItem, mainmenu::CurrentTimeText, DummyAction, StaticMenuItemIcon<&bobbyicons::time>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATUS>, SwitchScreenAction<StatusDisplay>, StaticMenuItemIcon<&espgui::icons::back>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_STATUS>, SwitchScreenAction<StatusDisplay>, StaticMenuItemIcon<&espgui::icons::back>>>();
if (configs.feature.ledstrip.value) if (configs.feature.ledstrip.isEnabled.value)
{ {
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LEDSTRIP>, SwitchScreenAction<LedstripMenu>, StaticMenuItemIcon<&bobbyicons::neopixel>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LEDSTRIP>, SwitchScreenAction<LedstripMenu>, StaticMenuItemIcon<&bobbyicons::neopixel>>>();
} }
@ -94,11 +94,11 @@ MainMenu::MainMenu()
if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SETTINGS>, SwitchScreenAction<SettingsMenu>, StaticMenuItemIcon<&bobbyicons::settings>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SETTINGS>, SwitchScreenAction<SettingsMenu>, StaticMenuItemIcon<&bobbyicons::settings>>>(); }
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GREENPASS>, SwitchScreenAction<GreenPassMenu>, StaticMenuItemIcon<&bobbyicons::greenpass>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GREENPASS>, SwitchScreenAction<GreenPassMenu>, StaticMenuItemIcon<&bobbyicons::greenpass>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LOCKVEHICLE>, SwitchScreenAction<Lockscreen>, StaticMenuItemIcon<&bobbyicons::lock>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LOCKVEHICLE>, SwitchScreenAction<Lockscreen>, StaticMenuItemIcon<&bobbyicons::lock>>>();
if (configs.feature.garage.value && configs.feature.esp_now.value) if (configs.feature.garage.isEnabled.value && configs.feature.esp_now.isEnabled.value)
{ {
if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GARAGE>, SwitchScreenAction<GarageMenu>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GARAGE>, SwitchScreenAction<GarageMenu>>>(); }
} }
if (configs.feature.ota.value) if (configs.feature.ota.isEnabled.value)
if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_UPDATE>, SwitchScreenAction<OtaMenu>, StaticMenuItemIcon<&bobbyicons::update>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_UPDATE>, SwitchScreenAction<OtaMenu>, StaticMenuItemIcon<&bobbyicons::update>>>(); }
if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GRAPHS>, SwitchScreenAction<GraphsMenu>, StaticMenuItemIcon<&bobbyicons::graph>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GRAPHS>, SwitchScreenAction<GraphsMenu>, StaticMenuItemIcon<&bobbyicons::graph>>>(); }
#if defined(FEATURE_CAN) && defined(FEATURE_POWERSUPPLY) #if defined(FEATURE_CAN) && defined(FEATURE_POWERSUPPLY)

View File

@ -84,18 +84,18 @@ SettingsMenu::SettingsMenu()
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LIMITSSETTINGS>, SwitchScreenAction<LimitsSettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LIMITSSETTINGS>, SwitchScreenAction<LimitsSettingsMenu>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NETWORKSETTINGS>, SwitchScreenAction<NetworkSettingsMenu>, StaticMenuItemIcon<&bobbyicons::wifi>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NETWORKSETTINGS>, SwitchScreenAction<NetworkSettingsMenu>, StaticMenuItemIcon<&bobbyicons::wifi>>>();
if (configs.feature.esp_now.value) if (configs.feature.esp_now.isEnabled.value)
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ESPNOW>, SwitchScreenAction<EspNowMenu>, StaticMenuItemIcon<&bobbyicons::wifi>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ESPNOW>, SwitchScreenAction<EspNowMenu>, StaticMenuItemIcon<&bobbyicons::wifi>>>();
#ifdef FEATURE_BLUETOOTH #ifdef FEATURE_BLUETOOTH
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BLUETOOTHSETTINGS>, SwitchScreenAction<BluetoothSettingsMenu>, StaticMenuItemIcon<&bobbyicons::bluetooth>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BLUETOOTHSETTINGS>, SwitchScreenAction<BluetoothSettingsMenu>, StaticMenuItemIcon<&bobbyicons::bluetooth>>>();
#endif #endif
if (configs.feature.ble.value) if (configs.feature.ble.isEnabled.value)
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BLESETTINGS>, SwitchScreenAction<BleSettingsMenu>, StaticMenuItemIcon<&bobbyicons::bluetooth>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BLESETTINGS>, SwitchScreenAction<BleSettingsMenu>, StaticMenuItemIcon<&bobbyicons::bluetooth>>>();
if (configs.feature.cloud.value) if (configs.feature.cloud.isEnabled.value)
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CLOUDSETTINGS>, SwitchScreenAction<CloudSettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CLOUDSETTINGS>, SwitchScreenAction<CloudSettingsMenu>>>();
if (configs.feature.udpcloud.value) if (configs.feature.udpcloud.isEnabled.value)
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_UDPCLOUDSETTINGS>, SwitchScreenAction<UdpCloudSettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_UDPCLOUDSETTINGS>, SwitchScreenAction<UdpCloudSettingsMenu>>>();
if (configs.feature.ota.value) if (configs.feature.ota.isEnabled.value)
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SELECTBUILDSERVERMENU>, SwitchScreenAction<SelectBuildServerMenu>, StaticMenuItemIcon<&bobbyicons::update>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SELECTBUILDSERVERMENU>, SwitchScreenAction<SelectBuildServerMenu>, StaticMenuItemIcon<&bobbyicons::update>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_TIME>, SwitchScreenAction<TimeSettingsMenu>, StaticMenuItemIcon<&bobbyicons::time>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_TIME>, SwitchScreenAction<TimeSettingsMenu>, StaticMenuItemIcon<&bobbyicons::time>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MODESSETTINGS>, SwitchScreenAction<ModesSettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MODESSETTINGS>, SwitchScreenAction<ModesSettingsMenu>>>();

View File

@ -110,7 +110,7 @@ TimeSettingsMenu::TimeSettingsMenu()
constructMenuItem<makeComponent<MenuItem, CurrentLocalDateTimeText, StaticFont<2>, DummyAction>>(); constructMenuItem<makeComponent<MenuItem, CurrentLocalDateTimeText, StaticFont<2>, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_OFFSET>, SwitchScreenAction<TimezoneOffsetChangeDisplay>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_OFFSET>, SwitchScreenAction<TimezoneOffsetChangeDisplay>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_DAYLIGHTSAVINGMODE>, SwitchScreenAction<DaylightSavingModeChangeDisplay>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_DAYLIGHTSAVINGMODE>, SwitchScreenAction<DaylightSavingModeChangeDisplay>>>();
if (configs.feature.ntp.value) if (configs.feature.ntp.isEnabled.value)
{ {
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NTPENABLED>, BobbyCheckbox, TimeServerEnabledAccessor>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NTPENABLED>, BobbyCheckbox, TimeServerEnabledAccessor>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NTPSERVER>, SwitchScreenAction<TimeServerChangeDisplay>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NTPSERVER>, SwitchScreenAction<TimeServerChangeDisplay>>>();

View File

@ -104,7 +104,7 @@ void StatusDisplay::redraw()
} }
} }
if(configs.feature.ledstrip.value) if(configs.feature.ledstrip.isEnabled.value)
{ {
static bool blink_fill_with_black; static bool blink_fill_with_black;
if (configs.ledstrip.enableVisualizeBlink.value && (espchrono::utc_clock::now().time_since_epoch() % 750ms < 375ms) && (blinkAnimation > 0)) if (configs.ledstrip.enableVisualizeBlink.value && (espchrono::utc_clock::now().time_since_epoch() % 750ms < 375ms) && (blinkAnimation > 0))
@ -151,7 +151,7 @@ void StatusDisplay::redraw()
tft.setTextFont(2); tft.setTextFont(2);
if (configs.feature.udpcloud.value) if (configs.feature.udpcloud.isEnabled.value)
{ {
if(configs.udpCloudSettings.udpCloudEnabled.value && configs.udpCloudSettings.enableCloudDebug.value) if(configs.udpCloudSettings.udpCloudEnabled.value && configs.udpCloudSettings.enableCloudDebug.value)
{ {

View File

@ -24,7 +24,7 @@ void init_dns_announce()
void handle_dns_announce() void handle_dns_announce()
{ {
if (!configs.feature.dnsannounce.value || !configs.dns_announce_enabled.value) if (!configs.feature.dnsannounce.isEnabled.value || !configs.dns_announce_enabled.value)
return; return;
if (wifi_stack::get_sta_status() != wifi_stack::WiFiStaStatus::CONNECTED) if (wifi_stack::get_sta_status() != wifi_stack::WiFiStaStatus::CONNECTED)

View File

@ -85,7 +85,7 @@ std::array<bool, 10> Helper<OUT, IN1, IN2, IN3, IN4, IN5>::read()
result[7] = digitalRead(IN4); result[7] = digitalRead(IN4);
result[9] = digitalRead(IN5); result[9] = digitalRead(IN5);
if (configs.feature.gschissene_diode.value && (result[8] && result[9])) if (configs.feature.gschissene_diode.isEnabled.value && (result[8] && result[9]))
{ {
result[9] = 0; result[9] = 0;
} }

View File

@ -24,7 +24,7 @@ namespace {
void initLedStrip() void initLedStrip()
{ {
if (configs.feature.ledstrip.value) if (configs.feature.ledstrip.isEnabled.value)
{ {
leds.resize(configs.ledstrip.ledsCount.value); leds.resize(configs.ledstrip.ledsCount.value);
FastLED.addLeds<NEOPIXEL, PINS_LEDSTRIP>(&*std::begin(leds), leds.size()) FastLED.addLeds<NEOPIXEL, PINS_LEDSTRIP>(&*std::begin(leds), leds.size())
@ -35,16 +35,16 @@ void initLedStrip()
void updateLedStrip() void updateLedStrip()
{ {
if (configs.feature.ledstrip.value && !initialized) if (configs.feature.ledstrip.isEnabled.value && !initialized)
initLedStrip(); initLedStrip();
else if (!configs.feature.ledstrip.value && initialized) else if (!configs.feature.ledstrip.isEnabled.value && initialized)
{ {
std::fill(std::begin(leds), std::end(leds), CRGB::Black); std::fill(std::begin(leds), std::end(leds), CRGB::Black);
FastLED.show(); FastLED.show();
initialized = false; initialized = false;
return; return;
} }
else if (!configs.feature.ledstrip.value) else if (!configs.feature.ledstrip.isEnabled.value)
return; return;
EVERY_N_MILLISECONDS( 20 ) { gHue++; } EVERY_N_MILLISECONDS( 20 ) { gHue++; }

View File

@ -65,8 +65,10 @@ extern "C" void app_main()
for (const auto &task : schedulerTasks) for (const auto &task : schedulerTasks)
{ {
bootLabel.redraw(task.name()); if (checkEnabledByName(task.name())) {
task.setup(); bootLabel.redraw(task.name());
task.setup();
}
} }
#ifdef FEATURE_JOYSTICK #ifdef FEATURE_JOYSTICK

View File

@ -3,30 +3,30 @@
#include "sdkconfig.h" #include "sdkconfig.h"
// system includes // system includes
#include <string>
#include <array> #include <array>
#include <optional> #include <optional>
#include <string>
// esp-idf includes // esp-idf includes
#include <esp_sntp.h> #include <esp_sntp.h>
// 3rdparty lib includes // 3rdparty lib includes
#include <fmt/core.h>
#include <configmanager.h>
#include <configconstraints_base.h> #include <configconstraints_base.h>
#include <configconstraints_espchrono.h> #include <configconstraints_espchrono.h>
#include <configmanager.h>
#include <configwrapper.h> #include <configwrapper.h>
#include <espwifiutils.h>
#include <espchrono.h> #include <espchrono.h>
#include <espwifiutils.h>
#include <fmt/core.h>
#include <makearray.h> #include <makearray.h>
// local includes // local includes
#include "battery.h" #include "battery.h"
#include "ledstrip.h" #include "bobbyquickactions.h"
#include "unifiedmodelmode.h"
#include "displays/lockscreen.h" #include "displays/lockscreen.h"
#include "handbremse.h" #include "handbremse.h"
#include "bobbyquickactions.h" #include "ledstrip.h"
#include "unifiedmodelmode.h"
using namespace espconfig; using namespace espconfig;
@ -34,6 +34,11 @@ std::string defaultHostname();
constexpr const auto INPUT_MAPPING_NONE = std::numeric_limits<uint8_t>::max(); constexpr const auto INPUT_MAPPING_NONE = std::numeric_limits<uint8_t>::max();
template <typename T>
std::optional<T*> optional_ptr(T* ptr) {
return ptr ? std::optional<T*>(ptr) : std::optional<T*>();
}
class WiFiConfig class WiFiConfig
{ {
public: public:
@ -103,6 +108,23 @@ public:
ConfigWrapper<std::string> url; ConfigWrapper<std::string> url;
}; };
class ConfiguredFeatureFlag
{
public:
ConfiguredFeatureFlag(const char *enabledKey, const bool default_enabled = false, const bool default_is_beta = false, const char* taskName = "") :
isEnabled{default_enabled, DoReset, {}, enabledKey },
m_isBeta{default_is_beta},
m_taskName{taskName}
{}
ConfigWrapper<bool> isEnabled;
bool isBeta() const { return m_isBeta; }
std::string getTaskName() const { return m_taskName; }
private:
const bool m_isBeta;
const std::string m_taskName;
};
class ConfigContainer class ConfigContainer
{ {
using mac_t = wifi_stack::mac_t; using mac_t = wifi_stack::mac_t;
@ -321,18 +343,18 @@ public:
} espnow; } espnow;
struct { struct {
ConfigWrapper<bool> ledstrip {false, DoReset, {}, "f_ledstrip" }; ConfiguredFeatureFlag ledstrip {"f_ledstrip", false, false, "ledstrip"};
ConfigWrapper<bool> webserver_disable_lock{false, DoReset, {}, "f_no_web_lock" }; ConfiguredFeatureFlag webserver_disable_lock{"f_no_web_lock", false, true};
ConfigWrapper<bool> garage {false, DoReset, {}, "f_garage" }; ConfiguredFeatureFlag garage {"f_garage" };
ConfigWrapper<bool> cloud {false, DoReset, {}, "f_cloud" }; ConfiguredFeatureFlag cloud {"f_cloud", false, false, "cloud"};
ConfigWrapper<bool> udpcloud {false, DoReset, {}, "f_udpcloud" }; ConfiguredFeatureFlag udpcloud {"f_udpcloud", false, false, "udpcloud"};
ConfigWrapper<bool> dnsannounce {false, DoReset, {}, "f_dnsannounce" }; ConfiguredFeatureFlag dnsannounce {"f_dnsannounce"};
ConfigWrapper<bool> ntp {false, DoReset, {}, "f_ntp" }; ConfiguredFeatureFlag ntp {"f_ntp", false, false, "time"};
ConfigWrapper<bool> ble {false, DoReset, {}, "f_ble" }; ConfiguredFeatureFlag ble {"f_ble", false, false, "ble"};
ConfigWrapper<bool> ota {false, DoReset, {}, "f_ota" }; ConfiguredFeatureFlag ota {"f_ota", false, false, "ota"};
ConfigWrapper<bool> webserver {true, DoReset, {}, "featureWebserv" }; ConfiguredFeatureFlag webserver {"featureWebserv", true};
ConfigWrapper<bool> gschissene_diode {false, DoReset, {}, "featurDiodeHin" }; ConfiguredFeatureFlag gschissene_diode {"featurDiodeHin"};
ConfigWrapper<bool> esp_now {false, DoReset, {}, "featureEspNow" }; ConfiguredFeatureFlag esp_now {"featureEspNow", false, false, "espnow"};
} feature; } feature;
struct { struct {
@ -624,33 +646,33 @@ public:
x(espnow.syncTimeWithOthers) \ x(espnow.syncTimeWithOthers) \
x(espnow.syncBlink) \ x(espnow.syncBlink) \
\ \
x(feature.ledstrip) \ x(feature.ble.isEnabled) \
x(feature.webserver_disable_lock) \ x(feature.cloud.isEnabled) \
x(feature.garage) \ x(feature.dnsannounce.isEnabled)\
x(feature.udpcloud) \ x(feature.esp_now.isEnabled) \
x(feature.cloud) \ x(feature.garage.isEnabled) \
x(feature.dnsannounce) \ x(feature.gschissene_diode.isEnabled) \
x(feature.ntp) \ x(feature.ledstrip.isEnabled) \
x(feature.ble) \ x(feature.ntp.isEnabled) \
x(feature.ota) \ x(feature.ota.isEnabled) \
x(feature.webserver) \ x(feature.udpcloud.isEnabled) \
x(feature.gschissene_diode) \ x(feature.webserver.isEnabled) \
x(feature.esp_now) x(feature.webserver_disable_lock.isEnabled)
//x(bleSettings.bleEnabled) //x(bleSettings.bleEnabled)
#define FEATURES(x) \ #define FEATURES(x) \
x(feature.ledstrip) \
x(feature.webserver_disable_lock) \
x(feature.garage) \
x(feature.udpcloud) \
x(feature.cloud) \
x(feature.dnsannounce) \
x(feature.ntp) \
x(feature.ble) \ x(feature.ble) \
x(feature.ota) \ x(feature.cloud) \
x(feature.esp_now) \ x(feature.dnsannounce)\
x(feature.webserver) x(feature.esp_now) \
//x(feature.gschisseneDiode) x(feature.garage) \
x(feature.gschissene_diode) \
x(feature.ledstrip) \
x(feature.ntp) \
x(feature.ota) \
x(feature.udpcloud) \
x(feature.webserver) \
// x(feature.webserver_disable_lock)
template<typename T> template<typename T>
void callForEveryConfig(T &&callback) void callForEveryConfig(T &&callback)
@ -677,16 +699,16 @@ public:
#define HELPER(x) callback(x); #define HELPER(x) callback(x);
FEATURES(HELPER) FEATURES(HELPER)
#undef HELPER #undef HELPER
callback(feature.gschissene_diode); callback(feature.webserver_disable_lock);
} }
auto getAllFeatureParams() auto getAllFeatureParams()
{ {
return cpputils::make_array( return cpputils::make_array(
#define HELPER(x) std::ref<ConfigWrapperInterface>(x), #define HELPER(x) std::ref<ConfiguredFeatureFlag>(x),
FEATURES(HELPER) FEATURES(HELPER)
#undef HELPER #undef HELPER
std::ref<ConfigWrapperInterface>(feature.gschissene_diode) std::ref<ConfiguredFeatureFlag>(feature.webserver_disable_lock)
); );
} }
}; };

View File

@ -28,7 +28,7 @@ void handleOta()
tl::expected<void, std::string> triggerOta(std::string_view url) tl::expected<void, std::string> triggerOta(std::string_view url)
{ {
if (!configs.feature.ota.value) if (!configs.feature.ota.isEnabled.value)
return tl::make_unexpected("OTA is not enabled!"); return tl::make_unexpected("OTA is not enabled!");
ESP_LOGI(TAG, "%.*s", url.size(), url.data()); ESP_LOGI(TAG, "%.*s", url.size(), url.data());

View File

@ -3,7 +3,6 @@
#include "sdkconfig.h" #include "sdkconfig.h"
// system includes // system includes
#include <iterator>
#include <chrono> #include <chrono>
// esp-idf includes // esp-idf includes
@ -137,3 +136,24 @@ void sched_pushStats(bool printTasks)
if (printTasks) if (printTasks)
ESP_LOGI(TAG, "end listing tasks"); ESP_LOGI(TAG, "end listing tasks");
} }
tl::expected<bool, std::string> checkInitializedByName(std::string name)
{
for (auto &schedulerTask : schedulerTasks)
{
if (schedulerTask.name() == name)
return schedulerTask.isInitialized();
}
return tl::make_unexpected("Task not found: " + std::string{name});
}
bool checkEnabledByName(std::string name) {
bool enabled = false;
// iterate over all feature flags (runForEveryFeature())
configs.callForEveryFeature([&](ConfiguredFeatureFlag &feature) {
ESP_LOGE(TAG, "checkEnabledByName: %s == %s", feature.getTaskName().c_str(), name.c_str());
if (feature.getTaskName() == name && !enabled)
enabled = feature.isEnabled.value;
});
return enabled;
}

View File

@ -1,7 +1,11 @@
#pragma once #pragma once
// system includes
#include <optional>
// 3rdparty lib includes // 3rdparty lib includes
#include <arrayview.h> #include <arrayview.h>
#include <tl/expected.hpp>
// local includes // local includes
#include "bobbyschedulertask.h" #include "bobbyschedulertask.h"
@ -11,3 +15,7 @@ extern cpputils::ArrayView<BobbySchedulerTask> schedulerTasks;
extern const BobbySchedulerTask &drivingModeTask; extern const BobbySchedulerTask &drivingModeTask;
void sched_pushStats(bool printTasks); void sched_pushStats(bool printTasks);
tl::expected<bool, std::string> checkInitializedByName(std::string name);
bool checkEnabledByName(std::string name);

View File

@ -51,7 +51,7 @@ void initTime()
void updateTime() void updateTime()
{ {
if (!configs.feature.ntp.value) if (!configs.feature.ntp.isEnabled.value)
return; return;
if (bool(sntp_enabled()) != configs.timeServerEnabled.value) if (bool(sntp_enabled()) != configs.timeServerEnabled.value)

View File

@ -39,7 +39,7 @@ void udpCloudInit()
void udpCloudUpdate() void udpCloudUpdate()
{ {
if (!configs.feature.udpcloud.value) if (!configs.feature.udpcloud.isEnabled.value)
return; return;
if (configs.udpCloudSettings.udpCloudEnabled.value && configs.udpCloudSettings.udpUid.touched()) if (configs.udpCloudSettings.udpCloudEnabled.value && configs.udpCloudSettings.udpUid.touched())

View File

@ -44,7 +44,7 @@ esp_err_t webserver_status_handler(httpd_req_t *req);
esp_err_t webserver_middleware_handler(httpd_req_t *req) { esp_err_t webserver_middleware_handler(httpd_req_t *req) {
const auto handler = reinterpret_cast<esp_err_t(*)(httpd_req_t*)>(req->user_ctx); const auto handler = reinterpret_cast<esp_err_t(*)(httpd_req_t*)>(req->user_ctx);
if (configs.feature.webserver_disable_lock.value) if (configs.feature.webserver_disable_lock.isEnabled.value)
{ {
return handler(req); return handler(req);
} }
@ -71,7 +71,7 @@ httpd_handle_t httpdHandle;
void initWebserver() void initWebserver()
{ {
if(!configs.feature.webserver_disable_lock.value) if(!configs.feature.webserver_disable_lock.isEnabled.value)
{ {
webserver_lock.construct(); webserver_lock.construct();
webserver_lock->take(portMAX_DELAY); webserver_lock->take(portMAX_DELAY);
@ -117,7 +117,7 @@ void initWebserver()
void handleWebserver() void handleWebserver()
{ {
if (!configs.feature.webserver_disable_lock.value) if (!configs.feature.webserver_disable_lock.isEnabled.value)
{ {
webserver_lock->give(); webserver_lock->give();
vTaskDelay(1); vTaskDelay(1);