Merge pull request #113 from bobbycar-graz/bug-fixes

Improved performance and usablity
This commit is contained in:
2021-10-18 14:56:29 +02:00
committed by GitHub
26 changed files with 316 additions and 76 deletions

View File

@@ -44,6 +44,7 @@ set(BOBBYCAR_BUILDFLAGS
-DAP_PASSWORD=Passwort_123 -DAP_PASSWORD=Passwort_123
-DFEATURE_WEBSERVER -DFEATURE_WEBSERVER
-DFEATURE_OTA -DFEATURE_OTA
-DOTA_USERNAME="comred"
# -DFEATURE_DPAD_5WIRESW # -DFEATURE_DPAD_5WIRESW
# -DPINS_DPAD_5WIRESW_OUT=4 # -DPINS_DPAD_5WIRESW_OUT=4
# -DPINS_DPAD_5WIRESW_IN1=5 # -DPINS_DPAD_5WIRESW_IN1=5

View File

@@ -44,6 +44,7 @@ set(BOBBYCAR_BUILDFLAGS
-DAP_PASSWORD=Passwort_123 -DAP_PASSWORD=Passwort_123
-DFEATURE_WEBSERVER -DFEATURE_WEBSERVER
-DFEATURE_OTA -DFEATURE_OTA
-DOTA_USERNAME="feedc0de"
-DFEATURE_DPAD_5WIRESW -DFEATURE_DPAD_5WIRESW
-DPINS_DPAD_5WIRESW_OUT=18 -DPINS_DPAD_5WIRESW_OUT=18
-DPINS_DPAD_5WIRESW_IN1=19 -DPINS_DPAD_5WIRESW_IN1=19

View File

@@ -44,6 +44,7 @@ set(BOBBYCAR_BUILDFLAGS
-DAP_PASSWORD=Passwort_123 -DAP_PASSWORD=Passwort_123
-DFEATURE_WEBSERVER -DFEATURE_WEBSERVER
-DFEATURE_OTA -DFEATURE_OTA
-DOTA_USERNAME="greyhash"
-DFEATURE_DPAD_5WIRESW -DFEATURE_DPAD_5WIRESW
-DPINS_DPAD_5WIRESW_OUT=4 -DPINS_DPAD_5WIRESW_OUT=4
-DPINS_DPAD_5WIRESW_IN1=5 -DPINS_DPAD_5WIRESW_IN1=5

View File

@@ -44,6 +44,7 @@ set(BOBBYCAR_BUILDFLAGS
-DAP_PASSWORD=Passwort_123 -DAP_PASSWORD=Passwort_123
-DFEATURE_WEBSERVER -DFEATURE_WEBSERVER
# -DFEATURE_OTA # -DFEATURE_OTA
# -DOTA_USERNAME="mick"
# -DFEATURE_DPAD_5WIRESW # -DFEATURE_DPAD_5WIRESW
# -DPINS_DPAD_5WIRESW_OUT=4 # -DPINS_DPAD_5WIRESW_OUT=4
# -DPINS_DPAD_5WIRESW_IN1=5 # -DPINS_DPAD_5WIRESW_IN1=5

View File

@@ -44,6 +44,7 @@ set(BOBBYCAR_BUILDFLAGS
-DAP_PASSWORD=Passwort_123 -DAP_PASSWORD=Passwort_123
-DFEATURE_WEBSERVER -DFEATURE_WEBSERVER
-DFEATURE_OTA -DFEATURE_OTA
-DOTA_USERNAME="peter"
-DFEATURE_DPAD_5WIRESW_2OUT -DFEATURE_DPAD_5WIRESW_2OUT
-DPINS_DPAD_5WIRESW_OUT1=18 -DPINS_DPAD_5WIRESW_OUT1=18
-DPINS_DPAD_5WIRESW_OUT2=19 -DPINS_DPAD_5WIRESW_OUT2=19

2
coredump.sh Executable file
View File

@@ -0,0 +1,2 @@
#!/bin/bash
espcoredump.py -p /dev/ttyUSB0 dbg_corefile ./build/bobbyquad_*.elf

View File

@@ -5,6 +5,7 @@ set(headers
bluetoothmode.h bluetoothmode.h
bluetoothtexthelpers.h bluetoothtexthelpers.h
bmsutils.h bmsutils.h
buildserver.h
buttons.h buttons.h
can.h can.h
changevaluedisplay_bluetoothmode.h changevaluedisplay_bluetoothmode.h
@@ -76,6 +77,7 @@ set(headers
actions/multiaction.h actions/multiaction.h
actions/rebootaction.h actions/rebootaction.h
actions/savesettingsaction.h actions/savesettingsaction.h
actions/selectbuildserveraction.h
actions/switchprofileaction.h actions/switchprofileaction.h
actions/tempomatmodeapplycurrentpeedaction.h actions/tempomatmodeapplycurrentpeedaction.h
actions/updateswapfrontbackaction.h actions/updateswapfrontbackaction.h
@@ -102,6 +104,7 @@ set(headers
displays/menus/cloudsettingsmenu.h displays/menus/cloudsettingsmenu.h
displays/menus/commanddebugmenu.h displays/menus/commanddebugmenu.h
displays/menus/controllerhardwaresettingsmenu.h displays/menus/controllerhardwaresettingsmenu.h
displays/menus/crashmenu.h
displays/menus/debugmenu.h displays/menus/debugmenu.h
displays/menus/defaultmodesettingsmenu.h displays/menus/defaultmodesettingsmenu.h
displays/menus/demosmenu.h displays/menus/demosmenu.h
@@ -126,6 +129,7 @@ set(headers
displays/menus/presetsmenu.h displays/menus/presetsmenu.h
displays/menus/profilesmenu.h displays/menus/profilesmenu.h
displays/menus/selectbatterytypemenu.h displays/menus/selectbatterytypemenu.h
displays/menus/selectbuildservermenu.h
displays/menus/selectmodemenu.h displays/menus/selectmodemenu.h
displays/menus/settingsmenu.h displays/menus/settingsmenu.h
displays/menus/stationwifisettingsmenu.h displays/menus/stationwifisettingsmenu.h
@@ -278,6 +282,7 @@ set(sources
displays/menus/cloudsettingsmenu.cpp displays/menus/cloudsettingsmenu.cpp
displays/menus/commanddebugmenu.cpp displays/menus/commanddebugmenu.cpp
displays/menus/controllerhardwaresettingsmenu.cpp displays/menus/controllerhardwaresettingsmenu.cpp
displays/menus/crashmenu.cpp
displays/menus/debugmenu.cpp displays/menus/debugmenu.cpp
displays/menus/defaultmodesettingsmenu.cpp displays/menus/defaultmodesettingsmenu.cpp
displays/menus/demosmenu.cpp displays/menus/demosmenu.cpp

View File

@@ -4,11 +4,19 @@
#include "utils.h" #include "utils.h"
#include "globals.h" #include "globals.h"
#include "ledstrip.h" #include "ledstrip.h"
#include "ledstripdefines.h" // #include "ledstripdefines.h"
using namespace espgui; using namespace espgui;
namespace { namespace {
template<int16_t type>
class LedStripSetAnimationAction : public virtual ActionInterface
{
public:
void triggered() override { animation_type = type; }
};
/*
class LedstripAnimationDefaultRainbowAction : public virtual ActionInterface class LedstripAnimationDefaultRainbowAction : public virtual ActionInterface
{ {
public: public:
@@ -26,4 +34,5 @@ class LedstripAnimationSyncToSpeedAction : public virtual ActionInterface
public: public:
void triggered() override { animation_type = LEDSTRIP_ANIMATION_TYPE_SPEEDSYNCANIMATION; } void triggered() override { animation_type = LEDSTRIP_ANIMATION_TYPE_SPEEDSYNCANIMATION; }
}; };
*/
} }

View File

@@ -0,0 +1,4 @@
#pragma once
#include "actioninterface.h"
#include "globals.h"

0
main/buildserver.h Normal file
View File

View File

View File

@@ -0,0 +1,39 @@
#pragma once
// local includes
#include "menudisplay.h"
#include "utils.h"
#include "actions/dummyaction.h"
#include "icons/back.h"
#include "texts.h"
#include <esp_log.h>
// forward declares
namespace {
class SettingsMenu;
class AssertAction : public virtual ActionInterface { public: void triggered() override { assert(0); } };
class DivideByZeroAction : public virtual ActionInterface { public: void triggered() override { int goodbye = 42 / 0; ESP_LOGW("divByZero", "%i", goodbye); } };
} // namespace
using namespace espgui;
namespace {
class CrashMenu :
public MenuDisplay,
public StaticText<TEXT_CRASHMENU>,
public BackActionInterface<SwitchScreenAction<SettingsMenu>>
{
public:
CrashMenu()
{
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CRASH_ASSERT>, AssertAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CRASH_DIVZERO>, DivideByZeroAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<SettingsMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
}
};
} // namespace

View File

@@ -45,9 +45,9 @@ namespace {
{ {
constructMenuItem<makeComponent<MenuItem, currentSelectedAnimationText, DisabledColor, DummyAction>>(); constructMenuItem<makeComponent<MenuItem, currentSelectedAnimationText, DisabledColor, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, EmptyText, DummyAction>>(); constructMenuItem<makeComponent<MenuItem, EmptyText, DummyAction>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ANIMATION_DEFAULTRAINBOW>, LedstripAnimationDefaultRainbowAction>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ANIMATION_DEFAULTRAINBOW>, LedStripSetAnimationAction<LEDSTRIP_ANIMATION_TYPE_DEFAULTRAINBOW>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ANIMATION_BETTERRAINBOW>, LedstripAnimationBetterRainbowAction>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ANIMATION_BETTERRAINBOW>, LedStripSetAnimationAction<LEDSTRIP_ANIMATION_TYPE_BETTERRAINBOW>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ANIMATION_SPEEDSYNCANIMATION>, LedstripAnimationSyncToSpeedAction>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ANIMATION_SPEEDSYNCANIMATION>, LedStripSetAnimationAction<LEDSTRIP_ANIMATION_TYPE_SPEEDSYNCANIMATION>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<LedstripMenu>, StaticMenuItemIcon<&espgui::icons::back>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<LedstripMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
} }
}; };

View File

@@ -27,6 +27,9 @@
#endif #endif
#include "icons/poweroff.h" #include "icons/poweroff.h"
#include "icons/reboot.h" #include "icons/reboot.h"
#ifdef MAINMENU_PLUGIN
#include MAINMENU_PLUGIN
#endif
// forward declares // forward declares
namespace { namespace {
@@ -47,6 +50,14 @@ class UpdateDisplay;
class PoweroffDisplay; class PoweroffDisplay;
class DebugMenu; class DebugMenu;
class BatteryMenu; class BatteryMenu;
#ifdef MAINMENU_PLUGIN
GMEN2
#endif
#if !defined(MAINMENU_PLUGIN) and !defined(GMEN3)
#define SHOWITEM !simplified
#else
#define SHOWITEM GMEN3
#endif
} // namespace } // namespace
using namespace espgui; using namespace espgui;
@@ -65,32 +76,35 @@ public:
#ifdef FEATURE_LEDSTRIP #ifdef FEATURE_LEDSTRIP
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LEDSTRIP>, SwitchScreenAction<LedstripMenu>, StaticMenuItemIcon<&bobbyicons::neopixel>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LEDSTRIP>, SwitchScreenAction<LedstripMenu>, StaticMenuItemIcon<&bobbyicons::neopixel>>>();
#endif #endif
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MODESETTINGS>, ModeSettingsAction>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MODESETTINGS>, ModeSettingsAction>>(); }
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PRESETS>, SwitchScreenAction<PresetsMenu>, StaticMenuItemIcon<&bobbyicons::presets>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PRESETS>, SwitchScreenAction<PresetsMenu>, StaticMenuItemIcon<&bobbyicons::presets>>>(); }
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PROFILES>, SwitchScreenAction<ProfilesMenu>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_PROFILES>, SwitchScreenAction<ProfilesMenu>>>(); }
if (!simplified) { 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 (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BATTERY>, SwitchScreenAction<BatteryMenu>, StaticMenuItemIcon<&bobbyicons::battery>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BATTERY>, SwitchScreenAction<BatteryMenu>, StaticMenuItemIcon<&bobbyicons::battery>>>(); }
#if defined(FEATURE_CAN) && defined(FEATURE_POWERSUPPLY) #if defined(FEATURE_CAN) && defined(FEATURE_POWERSUPPLY)
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_POWERSUPPLY>, SwitchScreenAction<PowerSupplyDisplay>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_POWERSUPPLY>, SwitchScreenAction<PowerSupplyDisplay>>>(); }
#endif #endif
#if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS) #if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS)
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BMS>, SwitchScreenAction<BmsMenu>, StaticMenuItemIcon<&bobbyicons::bms>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BMS>, SwitchScreenAction<BmsMenu>, StaticMenuItemIcon<&bobbyicons::bms>>>(); }
#endif #endif
if (!simplified) { 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_LOCKVEHICLE>, SwitchScreenAction<Lockscreen>, StaticMenuItemIcon<&bobbyicons::lock>>>();
#ifdef FEATURE_MOSFETS #ifdef FEATURE_MOSFETS
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MOSFETS>, SwitchScreenAction<MosfetsMenu>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_MOSFETS>, SwitchScreenAction<MosfetsMenu>>>(); }
#endif #endif
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_DEMOS>, SwitchScreenAction<DemosMenu>, StaticMenuItemIcon<&bobbyicons::demos>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_DEMOS>, SwitchScreenAction<DemosMenu>, StaticMenuItemIcon<&bobbyicons::demos>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LOCKVEHICLE>, SwitchScreenAction<Lockscreen>, StaticMenuItemIcon<&bobbyicons::lock>>>();
#ifdef FEATURE_GARAGE #ifdef FEATURE_GARAGE
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GARAGE>, SwitchScreenAction<GarageDisplay>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_GARAGE>, SwitchScreenAction<GarageDisplay>>>(); }
#endif #endif
#ifdef FEATURE_OTA #ifdef FEATURE_OTA
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_UPDATE>, SwitchScreenAction<UpdateDisplay>, StaticMenuItemIcon<&bobbyicons::update>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_UPDATE>, SwitchScreenAction<UpdateDisplay>, StaticMenuItemIcon<&bobbyicons::update>>>(); }
#endif #endif
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_POWEROFF>, SwitchScreenAction<PoweroffDisplay>, StaticMenuItemIcon<&bobbyicons::poweroff>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_POWEROFF>, SwitchScreenAction<PoweroffDisplay>, StaticMenuItemIcon<&bobbyicons::poweroff>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_REBOOT>, RebootAction, StaticMenuItemIcon<&bobbyicons::reboot>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_REBOOT>, RebootAction, StaticMenuItemIcon<&bobbyicons::reboot>>>();
if (!simplified) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_DEBUG>, SwitchScreenAction<DebugMenu>>>(); } if (SHOWITEM) { constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_DEBUG>, SwitchScreenAction<DebugMenu>>>(); }
#ifdef MAINMENU_PLUGIN
GMEN1
#endif
} }
}; };
} // namespace } // namespace

View File

@@ -0,0 +1,53 @@
#pragma once
// local includes
#include "menudisplay.h"
#include "utils.h"
#include "actions/dummyaction.h"
#include "actions/selectbuildserveraction.h"
#include "icons/back.h"
#include "texts.h"
#include "globals.h"
// forward declares
namespace {
class SettingsMenu;
} // namespace
using namespace espgui;
namespace {
class SelectBuildServerMenu :
public MenuDisplay,
public StaticText<TEXT_SELECTBUILDSERVERMENU>,
public BackActionInterface<SwitchScreenAction<SettingsMenu>>
{
public:
SelectBuildServerMenu() {
auto numDisplayedServers = 0;
for (auto index = 0; index < stringSettings.otaServers.size(); index++)
{
auto otaServer = stringSettings.otaServers[index];
std::string url = otaServer.url;
std::string name = (otaServer.name.empty()) ? url : otaServer.name;
if (!name.empty()) {
auto menuitem = constructMenuItem<makeComponent<MenuItem, ChangeableText, DummyAction>>();
menuitem.setTitle(name);
numDisplayedServers++;
}
}
if (!numDisplayedServers)
{
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_NOBUILDSERVERCONFIGURED>, DummyAction>>();
}
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<SettingsMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
}
};
} // namespace

View File

@@ -14,7 +14,9 @@
#include "icons/hardware.h" #include "icons/hardware.h"
#include "icons/buzzer.h" #include "icons/buzzer.h"
#include "icons/info.h" #include "icons/info.h"
#include "icons/demos.h"
#include "icons/back.h" #include "icons/back.h"
#include "icons/update.h"
#include "texts.h" #include "texts.h"
#include "globals.h" #include "globals.h"
#include "accessors/settingsaccessors.h" #include "accessors/settingsaccessors.h"
@@ -33,6 +35,8 @@ class BoardcomputerHardwareSettingsMenu;
class BuzzerMenu; class BuzzerMenu;
class AboutMenu; class AboutMenu;
class MainMenu; class MainMenu;
class CrashMenu;
class SelectBuildServerMenu;
} }
using namespace espgui; using namespace espgui;
@@ -59,7 +63,10 @@ public:
#ifdef FEATURE_LEDBACKLIGHT #ifdef FEATURE_LEDBACKLIGHT
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACKLIGHT>, ToggleBoolAction, CheckboxIcon, BacklightAccessor>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACKLIGHT>, ToggleBoolAction, CheckboxIcon, BacklightAccessor>>();
#endif #endif
if (!simplified)
{
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LIMITSSETTINGS>, SwitchScreenAction<LimitsSettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_LIMITSSETTINGS>, SwitchScreenAction<LimitsSettingsMenu>>>();
}
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_WIFISETTINGS>, SwitchScreenAction<WifiSettingsMenu>, StaticMenuItemIcon<&bobbyicons::wifi>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_WIFISETTINGS>, SwitchScreenAction<WifiSettingsMenu>, 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>>>();
@@ -69,6 +76,9 @@ public:
#endif #endif
#ifdef FEATURE_CLOUD #ifdef FEATURE_CLOUD
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CLOUDSETTINGS>, SwitchScreenAction<CloudSettingsMenu>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CLOUDSETTINGS>, SwitchScreenAction<CloudSettingsMenu>>>();
#endif
#ifdef FEATURE_OTA
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_SELECTBUILDSERVERMENU>, SwitchScreenAction<SelectBuildServerMenu>, StaticMenuItemIcon<&bobbyicons::update>>>();
#endif #endif
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>>>();
@@ -80,6 +90,7 @@ public:
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BUZZER>, SwitchScreenAction<BuzzerMenu>, StaticMenuItemIcon<&bobbyicons::buzzer>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BUZZER>, SwitchScreenAction<BuzzerMenu>, StaticMenuItemIcon<&bobbyicons::buzzer>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_FRONTLED>, ToggleBoolAction, CheckboxIcon, FrontLedAccessor>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_FRONTLED>, ToggleBoolAction, CheckboxIcon, FrontLedAccessor>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACKLED>, ToggleBoolAction, CheckboxIcon, BackLedAccessor>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACKLED>, ToggleBoolAction, CheckboxIcon, BackLedAccessor>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_CRASHMENU>, SwitchScreenAction<CrashMenu>, StaticMenuItemIcon<&bobbyicons::demos>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ABOUT>, SwitchScreenAction<AboutMenu>, StaticMenuItemIcon<&bobbyicons::info>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_ABOUT>, SwitchScreenAction<AboutMenu>, StaticMenuItemIcon<&bobbyicons::info>>>();
constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&espgui::icons::back>>>(); constructMenuItem<makeComponent<MenuItem, StaticText<TEXT_BACK>, SwitchScreenAction<MainMenu>, StaticMenuItemIcon<&espgui::icons::back>>>();
} }

View File

@@ -23,6 +23,8 @@ namespace {
class MainMenu; class MainMenu;
class BmsDisplay; class BmsDisplay;
class MetersDisplay; class MetersDisplay;
static uint16_t counter = 24;
} }
namespace { namespace {
@@ -158,6 +160,7 @@ void StatusDisplay::initScreen()
m_labelProfile.start(); m_labelProfile.start();
tft.setTextColor(TFT_WHITE, TFT_BLACK); tft.setTextColor(TFT_WHITE, TFT_BLACK);
counter = 0;
} }
void StatusDisplay::redraw() void StatusDisplay::redraw()
@@ -170,9 +173,15 @@ void StatusDisplay::redraw()
m_labelBrems.redraw(brems ? fmt::format("{:.2f}", *brems) : "?"); m_labelBrems.redraw(brems ? fmt::format("{:.2f}", *brems) : "?");
m_progressBarBrems.redraw(brems ? *brems : 0); m_progressBarBrems.redraw(brems ? *brems : 0);
if (counter < 1)
{
counter = 25;
m_batterypercent.redraw(getBatteryPercentageString()); m_batterypercent.redraw(getBatteryPercentageString());
m_watthoursleft.redraw(getBatteryRemainingWattHoursString()); m_watthoursleft.redraw(getBatteryRemainingWattHoursString());
m_kilometersleft.redraw(getRemainingRangeString()); m_kilometersleft.redraw(getRemainingRangeString());
}
else
counter--;
m_frontStatus.redraw(controllers.front); m_frontStatus.redraw(controllers.front);
m_backStatus.redraw(controllers.back); m_backStatus.redraw(controllers.back);
@@ -241,6 +250,7 @@ clearIp:
void StatusDisplay::rotate(int offset) void StatusDisplay::rotate(int offset)
{ {
counter = 0;
if (offset < 0) if (offset < 0)
#ifdef FEATURE_BMS #ifdef FEATURE_BMS
switchScreen<BmsDisplay>(); switchScreen<BmsDisplay>();

View File

@@ -41,7 +41,11 @@ float avgSpeed, avgSpeedKmh, sumCurrent;
char deviceName[32] = STRING(DEVICE_PREFIX) "_ERR"; char deviceName[32] = STRING(DEVICE_PREFIX) "_ERR";
#if defined(SIMPLIFIED_TRIGGER_TRIGGERONPRESET) #ifdef GLOBALS_PLUGIN
#include GLOBALS_PLUGIN
#endif
#if defined(HAS_SIMPLIFIED)
bool simplified = true; bool simplified = true;
#else #else
bool simplified = false; bool simplified = false;

View File

@@ -149,20 +149,22 @@ void updateLedStrip()
} }
void showAnimation() { void showAnimation() {
if (settings.ledstrip.enableLedAnimation && !simplified)
{
if (animation_type == LEDSTRIP_ANIMATION_TYPE_DEFAULTRAINBOW) showDefaultLedstrip(); if (animation_type == LEDSTRIP_ANIMATION_TYPE_DEFAULTRAINBOW) showDefaultLedstrip();
else if (animation_type == LEDSTRIP_ANIMATION_TYPE_BETTERRAINBOW) showBetterRainbow(); else if (animation_type == LEDSTRIP_ANIMATION_TYPE_BETTERRAINBOW) showBetterRainbow();
else if (animation_type == LEDSTRIP_ANIMATION_TYPE_SPEEDSYNCANIMATION) showSpeedSyncAnimation(); else if (animation_type == LEDSTRIP_ANIMATION_TYPE_SPEEDSYNCANIMATION) showSpeedSyncAnimation();
else showDefaultLedstrip(); else showDefaultLedstrip();
} }
else
{
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
}
}
void showBetterRainbow() { void showBetterRainbow() {
if (settings.ledstrip.enableLedAnimation)
{
fill_rainbow(&*std::begin(leds), leds.size(), gHue); fill_rainbow(&*std::begin(leds), leds.size(), gHue);
} }
else
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
}
void fill_rainbow_invert_at( struct CRGB * pFirstLED, int numToFill, int invertAtLed, void fill_rainbow_invert_at( struct CRGB * pFirstLED, int numToFill, int invertAtLed,
uint8_t initialhue, uint8_t initialhue,
@@ -185,8 +187,6 @@ void fill_rainbow_invert_at( struct CRGB * pFirstLED, int numToFill, int invertA
} }
void showSpeedSyncAnimation() { void showSpeedSyncAnimation() {
if (settings.ledstrip.enableLedAnimation)
{
#ifdef LEDS_PER_METER #ifdef LEDS_PER_METER
const float leds_per_meter = LEDS_PER_METER; const float leds_per_meter = LEDS_PER_METER;
#else #else
@@ -209,13 +209,8 @@ void showSpeedSyncAnimation() {
last_interval = espchrono::millis_clock::now(); last_interval = espchrono::millis_clock::now();
} }
else
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
}
void showDefaultLedstrip() void showDefaultLedstrip()
{
if (settings.ledstrip.enableLedAnimation)
{ {
fadeToBlackBy(&*std::begin(leds), leds.size(), 20); fadeToBlackBy(&*std::begin(leds), leds.size(), 20);
@@ -226,8 +221,5 @@ void showDefaultLedstrip()
dothue += 32; dothue += 32;
} }
} }
else
std::fill(std::begin(leds), std::end(leds), CRGB{0, 0, 0});
}
} // namespace } // namespace
#endif #endif

View File

@@ -38,6 +38,7 @@ using namespace std::chrono_literals;
#endif #endif
#include "displays/menus/buzzermenu.h" #include "displays/menus/buzzermenu.h"
#include "displays/menus/commanddebugmenu.h" #include "displays/menus/commanddebugmenu.h"
#include "displays/menus/crashmenu.h"
#include "displays/menus/debugmenu.h" #include "displays/menus/debugmenu.h"
#include "displays/menus/defaultmodesettingsmenu.h" #include "displays/menus/defaultmodesettingsmenu.h"
#include "displays/menus/demosmenu.h" #include "displays/menus/demosmenu.h"
@@ -126,6 +127,7 @@ using namespace std::chrono_literals;
#include "serialhandler.h" #include "serialhandler.h"
#ifdef FEATURE_OTA #ifdef FEATURE_OTA
#include "ota.h" #include "ota.h"
#include "displays/menus/selectbuildservermenu.h"
#endif #endif
#include "presets.h" #include "presets.h"
#include "statistics.h" #include "statistics.h"

View File

@@ -258,10 +258,10 @@ constexpr Settings::Battery defaultBattery {
.cellsParallel = 4, .cellsParallel = 4,
.cellType = 0, .cellType = 0,
.watthoursPerKilometer = 20, .watthoursPerKilometer = 20,
.front30VoltCalibration = 30, .front30VoltCalibration = 3000,
.back30VoltCalibration = 30, .back30VoltCalibration = 3000,
.front50VoltCalibration = 50, .front50VoltCalibration = 5000,
.back50VoltCalibration = 50, .back50VoltCalibration = 5000,
.applyCalibration = true .applyCalibration = true
}; };
@@ -297,6 +297,7 @@ constexpr Settings defaultSettings {
StringSettings makeDefaultStringSettings() StringSettings makeDefaultStringSettings()
{ {
using ConfiguredWifi = StringSettings::ConfiguredWifi; using ConfiguredWifi = StringSettings::ConfiguredWifi;
using ConfiguredOtaServer = StringSettings::ConfiguredOtaServer;
return { return {
.wifis = std::array<ConfiguredWifi, 10> { .wifis = std::array<ConfiguredWifi, 10> {
@@ -322,6 +323,20 @@ StringSettings makeDefaultStringSettings()
#endif #endif
#ifdef FEATURE_NTP #ifdef FEATURE_NTP
.timeServer = "europe.pool.ntp.org", .timeServer = "europe.pool.ntp.org",
#endif
#ifdef FEATURE_OTA
.otaServers = std::array<ConfiguredOtaServer, 2> {
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },/*
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },
ConfiguredOtaServer { .name = {}, .url = {} },*/
},
#endif #endif
}; };
} }

View File

@@ -10,17 +10,20 @@
namespace { namespace {
void switchProfile(uint8_t index) void switchProfile(uint8_t index)
{ {
settings = presets::defaultSettings;
stringSettings = presets::makeDefaultStringSettings();
#ifdef SIMPLIFIED_TRIGGER_TRIGGERONPRESET #ifdef SIMPLIFIED_TRIGGER_TRIGGERONPRESET
if (index == SIMPLIFIED_TRIGGER_TRIGGERONPRESET) if (index == SIMPLIFIED_TRIGGER_TRIGGERONPRESET)
{ {
simplified = true; simplified = true;
#ifdef SETTINGSUTILS_PLUGIN
#include SETTINGSUTILS_PLUGIN
#endif
return; return;
} }
#endif #endif
settings = presets::defaultSettings;
stringSettings = presets::makeDefaultStringSettings();
if (!settingsPersister.openProfile(index)) if (!settingsPersister.openProfile(index))
{ {
ESP_LOGE("BOBBY", "openProfile() failed"); ESP_LOGE("BOBBY", "openProfile() failed");

View File

@@ -36,6 +36,15 @@ struct StringSettings
template<typename T> template<typename T>
void executeForEveryProfileSetting(T &&callable); void executeForEveryProfileSetting(T &&callable);
#ifdef FEATURE_OTA
struct ConfiguredOtaServer {
std::string name;
std::string url;
};
std::array<ConfiguredOtaServer, 2> otaServers;
#endif
}; };
template<typename T> template<typename T>
@@ -76,6 +85,28 @@ void StringSettings::executeForEveryCommonSetting(T &&callable)
#ifdef FEATURE_NTP #ifdef FEATURE_NTP
callable("timeServer", timeServer); callable("timeServer", timeServer);
#endif #endif
#ifdef FEATURE_OTA
callable("otaName0", otaServers[0].name);
callable("otaUrl0", otaServers[0].url);
callable("otaName1", otaServers[1].name);
callable("otaUrl1", otaServers[1].url);/*
callable("otaName2", otaServers[2].name);
callable("otaUrl2", otaServers[2].url);
callable("otaName3", otaServers[3].name);
callable("otaUrl3", otaServers[3].url);
callable("otaName4", otaServers[4].name);
callable("otaUrl4", otaServers[4].url);
callable("otaName5", otaServers[5].name);
callable("otaUrl5", otaServers[5].url);
callable("otaName6", otaServers[6].name);
callable("otaUrl6", otaServers[6].url);
callable("otaName7", otaServers[7].name);
callable("otaUrl7", otaServers[7].url);
callable("otaName8", otaServers[8].name);
callable("otaUrl8", otaServers[8].url);
callable("otaName9", otaServers[9].name);
callable("otaUrl9", otaServers[9].url);*/
#endif
} }
template<typename T> template<typename T>

View File

@@ -9,6 +9,10 @@ constexpr char TEXT_BACK[] = "Back";
constexpr char TEXT_ACCESSPOINTWIFISETTINGS[] = "Access Point WiFi settings"; constexpr char TEXT_ACCESSPOINTWIFISETTINGS[] = "Access Point WiFi settings";
//constexpr char TEXT_BACK[] = "Back"; //constexpr char TEXT_BACK[] = "Back";
#ifdef TEXTS_PLUGIN
#include TEXTS_PLUGIN
#endif
#ifdef FEATURE_BLUETOOTH #ifdef FEATURE_BLUETOOTH
//BluetoothSettingsMenu //BluetoothSettingsMenu
constexpr char TEXT_BLUETOOTHSETTINGS[] = "Bluetooth settings"; constexpr char TEXT_BLUETOOTHSETTINGS[] = "Bluetooth settings";
@@ -462,6 +466,15 @@ constexpr char TEXT_WIFI_POWER_2dBm[] = "2dBm";
constexpr char TEXT_WIFI_POWER_MINUS_1dBm[] = "-1dBm"; constexpr char TEXT_WIFI_POWER_MINUS_1dBm[] = "-1dBm";
//constexpr char TEXT_BACK[] = "Back"; //constexpr char TEXT_BACK[] = "Back";
//Crashmenu
constexpr char TEXT_CRASHMENU[] = "Crash Menu";
constexpr char TEXT_CRASH_ASSERT[] = "assert(0)";
constexpr char TEXT_CRASH_DIVZERO[] = "42 / 0";
//SelectBuildServerMenu
constexpr char TEXT_SELECTBUILDSERVERMENU[] = "Select Buildserver";
constexpr char TEXT_NOBUILDSERVERCONFIGURED[] = "Not configured";
#ifdef FEATURE_CAN #ifdef FEATURE_CAN
constexpr char TEXT_POWERSUPPLY[] = "Powersupply"; constexpr char TEXT_POWERSUPPLY[] = "Powersupply";
#endif #endif

View File

@@ -681,9 +681,16 @@ CONFIG_ESP32_PHY_MAX_TX_POWER=20
# #
# Core dump # Core dump
# #
# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set # CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set
CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y # CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set
# CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set
CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y
# CONFIG_ESP_COREDUMP_CHECKSUM_CRC32 is not set
CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y
CONFIG_ESP_COREDUMP_ENABLE=y
CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64
CONFIG_ESP_COREDUMP_STACK_SIZE=0
# end of Core dump # end of Core dump
# #
@@ -769,7 +776,7 @@ CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set # CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set
# CONFIG_FREERTOS_ASSERT_DISABLE is not set # CONFIG_FREERTOS_ASSERT_DISABLE is not set
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304 CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304
CONFIG_FREERTOS_ISR_STACKSIZE=1536 CONFIG_FREERTOS_ISR_STACKSIZE=2096
# CONFIG_FREERTOS_LEGACY_HOOKS is not set # CONFIG_FREERTOS_LEGACY_HOOKS is not set
CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
@@ -1442,9 +1449,16 @@ CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y
# CONFIG_ESP32S2_PANIC_GDBSTUB is not set # CONFIG_ESP32S2_PANIC_GDBSTUB is not set
CONFIG_TIMER_TASK_STACK_SIZE=3584 CONFIG_TIMER_TASK_STACK_SIZE=3584
CONFIG_SW_COEXIST_ENABLE=y CONFIG_SW_COEXIST_ENABLE=y
# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y
# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y # CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set
# CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set
CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y
# CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32 is not set
CONFIG_ESP32_COREDUMP_CHECKSUM_SHA256=y
CONFIG_ESP32_ENABLE_COREDUMP=y
CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64
CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0
CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
CONFIG_MB_QUEUE_LENGTH=20 CONFIG_MB_QUEUE_LENGTH=20

View File

@@ -681,9 +681,16 @@ CONFIG_ESP32_PHY_MAX_TX_POWER=20
# #
# Core dump # Core dump
# #
# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH=y
# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set # CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set
CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y # CONFIG_ESP_COREDUMP_ENABLE_TO_NONE is not set
# CONFIG_ESP_COREDUMP_DATA_FORMAT_BIN is not set
CONFIG_ESP_COREDUMP_DATA_FORMAT_ELF=y
# CONFIG_ESP_COREDUMP_CHECKSUM_CRC32 is not set
CONFIG_ESP_COREDUMP_CHECKSUM_SHA256=y
CONFIG_ESP_COREDUMP_ENABLE=y
CONFIG_ESP_COREDUMP_MAX_TASKS_NUM=64
CONFIG_ESP_COREDUMP_STACK_SIZE=0
# end of Core dump # end of Core dump
# #
@@ -769,7 +776,7 @@ CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set # CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set
# CONFIG_FREERTOS_ASSERT_DISABLE is not set # CONFIG_FREERTOS_ASSERT_DISABLE is not set
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304 CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=2304
CONFIG_FREERTOS_ISR_STACKSIZE=1536 CONFIG_FREERTOS_ISR_STACKSIZE=2096
# CONFIG_FREERTOS_LEGACY_HOOKS is not set # CONFIG_FREERTOS_LEGACY_HOOKS is not set
CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
@@ -1442,9 +1449,16 @@ CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y
# CONFIG_ESP32S2_PANIC_GDBSTUB is not set # CONFIG_ESP32S2_PANIC_GDBSTUB is not set
CONFIG_TIMER_TASK_STACK_SIZE=3584 CONFIG_TIMER_TASK_STACK_SIZE=3584
CONFIG_SW_COEXIST_ENABLE=y CONFIG_SW_COEXIST_ENABLE=y
# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH=y
# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set # CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y # CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE is not set
# CONFIG_ESP32_COREDUMP_DATA_FORMAT_BIN is not set
CONFIG_ESP32_COREDUMP_DATA_FORMAT_ELF=y
# CONFIG_ESP32_COREDUMP_CHECKSUM_CRC32 is not set
CONFIG_ESP32_COREDUMP_CHECKSUM_SHA256=y
CONFIG_ESP32_ENABLE_COREDUMP=y
CONFIG_ESP32_CORE_DUMP_MAX_TASKS_NUM=64
CONFIG_ESP32_CORE_DUMP_STACK_SIZE=0
CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150 CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
CONFIG_MB_MASTER_DELAY_MS_CONVERT=200 CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
CONFIG_MB_QUEUE_LENGTH=20 CONFIG_MB_QUEUE_LENGTH=20