Changed some files
This commit is contained in:
@ -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;
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
@ -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>>();
|
||||||
}
|
}
|
||||||
|
@ -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>>>();
|
||||||
}
|
}
|
||||||
|
@ -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>>>(); }
|
||||||
|
@ -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)
|
||||||
|
@ -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>>>();
|
||||||
|
@ -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>>>();
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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++; }
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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());
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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())
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user