From ef6f2d0c57d55fe7cd50e19edb6463edfd637d8e Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Thu, 15 Apr 2021 10:44:20 +0200 Subject: [PATCH] Scrolling from view to view works now And quite some bugs & crashes fixed. --- radio/src/audio.cpp | 4 + radio/src/curves.cpp | 4 + radio/src/gui/colorlcd/curveedit.cpp | 1 + radio/src/gui/colorlcd/fullscreen_dialog.cpp | 1 + radio/src/gui/colorlcd/gvar_numberedit.h | 1 + radio/src/gui/colorlcd/layout.cpp | 52 ++++++++++- radio/src/gui/colorlcd/layout.h | 21 ++--- radio/src/gui/colorlcd/layouts/layout2x4.cpp | 8 +- radio/src/gui/colorlcd/model_flightmodes.cpp | 1 + radio/src/gui/colorlcd/model_inputs.cpp | 3 +- radio/src/gui/colorlcd/model_select.cpp | 1 + radio/src/gui/colorlcd/radio_diaganas.cpp | 1 + radio/src/gui/colorlcd/radio_diagkeys.cpp | 1 + .../colorlcd/radio_ghost_module_config.cpp | 1 + radio/src/gui/colorlcd/radio_hardware.cpp | 1 + radio/src/gui/colorlcd/radio_setup.cpp | 1 + .../gui/colorlcd/radio_spectrum_analyser.cpp | 1 + radio/src/gui/colorlcd/radio_trainer.cpp | 1 + radio/src/gui/colorlcd/screen_setup.cpp | 53 +++++++---- radio/src/gui/colorlcd/special_functions.cpp | 1 + radio/src/gui/colorlcd/theme.cpp | 2 + radio/src/gui/colorlcd/themes/480_default.cpp | 2 +- radio/src/gui/colorlcd/topbar.cpp | 11 +++ radio/src/gui/colorlcd/topbar.h | 8 +- .../gui/colorlcd/view_logical_switches.cpp | 1 + .../src/gui/colorlcd/view_logical_switches.h | 1 + radio/src/gui/colorlcd/view_main.cpp | 92 ++++++++++++++++--- radio/src/gui/colorlcd/view_main.h | 12 ++- .../src/gui/colorlcd/view_main_decoration.cpp | 4 +- radio/src/gui/colorlcd/view_statistics.h | 4 +- radio/src/gui/colorlcd/widget.h | 11 ++- radio/src/gui/colorlcd/widget_settings.cpp | 29 +++--- radio/src/gui/colorlcd/widgets/outputs.cpp | 15 +++ radio/src/gui/colorlcd/zone.h | 8 +- radio/src/io/bootloader_flash.cpp | 1 + radio/src/io/frsky_firmware_update.cpp | 3 +- radio/src/io/multi_firmware_update.cpp | 1 + radio/src/logs.cpp | 4 + radio/src/lua/api_general.cpp | 4 + radio/src/lua/interface.cpp | 5 +- radio/src/main.cpp | 2 +- radio/src/opentx.cpp | 7 +- radio/src/opentx.h | 4 - radio/src/sdcard.cpp | 5 +- radio/src/simu.cpp | 2 +- radio/src/targets/horus/libopenui_config.h | 2 +- radio/src/targets/simu/CMakeLists.txt | 5 +- radio/src/telemetry/frsky_pxx2.cpp | 4 + radio/src/telemetry/telemetry.cpp | 4 + radio/src/telemetry/telemetry_sensors.cpp | 4 + 50 files changed, 315 insertions(+), 100 deletions(-) diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index 42a8acae1..02fd5acb4 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -21,6 +21,10 @@ #include "opentx.h" #include +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + extern RTOS_MUTEX_HANDLE audioMutex; const int16_t sineValues[] = diff --git a/radio/src/curves.cpp b/radio/src/curves.cpp index fe1dc377b..0bac367b9 100644 --- a/radio/src/curves.cpp +++ b/radio/src/curves.cpp @@ -20,6 +20,10 @@ #include "opentx.h" +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + int8_t * curveEnd[MAX_CURVES]; void loadCurves() diff --git a/radio/src/gui/colorlcd/curveedit.cpp b/radio/src/gui/colorlcd/curveedit.cpp index b1760bd32..9eb248083 100644 --- a/radio/src/gui/colorlcd/curveedit.cpp +++ b/radio/src/gui/colorlcd/curveedit.cpp @@ -21,6 +21,7 @@ #include "curveedit.h" #include "keyboard_curve.h" #include "opentx.h" // TODO for applyCustomCurve +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_MODEL) diff --git a/radio/src/gui/colorlcd/fullscreen_dialog.cpp b/radio/src/gui/colorlcd/fullscreen_dialog.cpp index 49ffaefa0..0a3fd3542 100644 --- a/radio/src/gui/colorlcd/fullscreen_dialog.cpp +++ b/radio/src/gui/colorlcd/fullscreen_dialog.cpp @@ -21,6 +21,7 @@ #include "fullscreen_dialog.h" #include "mainwindow.h" #include "opentx.h" +#include "libopenui.h" FullScreenDialog::FullScreenDialog(uint8_t type, std::string title, std::string message, std::string action, const std::function & confirmHandler): FormGroup(MainWindow::instance(), {0, 0, LCD_W, LCD_H}, OPAQUE), diff --git a/radio/src/gui/colorlcd/gvar_numberedit.h b/radio/src/gui/colorlcd/gvar_numberedit.h index ac3b3e833..9051b3607 100644 --- a/radio/src/gui/colorlcd/gvar_numberedit.h +++ b/radio/src/gui/colorlcd/gvar_numberedit.h @@ -21,6 +21,7 @@ #define _GVAR_NUMBEREDIT_H_ #include "form.h" +#include "choice.h" #include "numberedit.h" #include "gvars.h" diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index d2731bb76..e15e41d92 100644 --- a/radio/src/gui/colorlcd/layout.cpp +++ b/radio/src/gui/colorlcd/layout.cpp @@ -23,6 +23,10 @@ #include "layouts/trims.h" #include "layouts/sliders.h" +constexpr uint32_t LAYOUT_REFRESH = 1000 / 2; // 2 Hz + +Layout * customScreens[MAX_CUSTOM_SCREENS] = {}; + std::list & getRegisteredLayouts() { static std::list layouts; @@ -100,15 +104,24 @@ void loadDefaultLayout() // void loadCustomScreens() { - for (unsigned int i = 0; i < MAX_CUSTOM_SCREENS; i++) { + unsigned i = 0; + while (i < MAX_CUSTOM_SCREENS) { auto& screen = customScreens[i]; screen = loadLayout(g_model.screenData[i].LayoutId, &g_model.screenData[i].layoutData); - if (screen) { - screen->attach(ViewMain::instance()); + if (!screen) { + // no more layouts + break; } + + // layout is ok, let's add it + auto viewMain = ViewMain::instance(); + screen->attach(viewMain); + viewMain->setMainViewsCount(i + 1); + screen->setLeft(viewMain->getMainViewLeftPos(i)); + i++; } } @@ -159,6 +172,39 @@ void disposeCustomScreen(unsigned idx) memset(dst, 0, len); } +void Layout::create() +{ + memset(persistentData, 0, sizeof(PersistentData)); + + getOptionValue(OPTION_TOPBAR)->boolValue = true; + getOptionValue(OPTION_FM)->boolValue = true; + getOptionValue(OPTION_SLIDERS)->boolValue = true; + getOptionValue(OPTION_TRIMS)->boolValue = true; + getOptionValue(OPTION_MIRRORED)->boolValue = false; +} + +#if defined(DEBUG_WINDOWS) +void Layout::paint(BitmapBuffer * dc) +{ + TRACE("### painting -> %s", getWindowDebugString().c_str()); + //rect_t zone = getMainZone(); + //dc->drawSolidFilledRect( zone.x, zone.y + rect.y, zone.w, zone.h, DEFAULT_BGCOLOR); + LayoutBase::paint(dc); +} +#endif + +void Layout::checkEvents() +{ + LayoutBase::checkEvents(); + decorate(); + + // uint32_t now = RTOS_GET_MS(); + // if (now - lastRefresh >= LAYOUT_REFRESH) { + // lastRefresh = now; + // invalidate(); + // } +} + void Layout::decorate() { // Check if deco setting are still up-to-date diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index 48b9e9200..d96aeef0f 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -74,28 +74,18 @@ class Layout: public LayoutBase { return "Layout"; } + + void paint(BitmapBuffer * dc) override; #endif - void create() override - { - setOptionValue(OPTION_TOPBAR, OPTION_VALUE_BOOL(true)); - setOptionValue(OPTION_FM, OPTION_VALUE_BOOL(true)); - setOptionValue(OPTION_SLIDERS, OPTION_VALUE_BOOL(true)); - setOptionValue(OPTION_TRIMS, OPTION_VALUE_BOOL(true)); - setOptionValue(OPTION_MIRRORED, OPTION_VALUE_BOOL(false)); - decorate(); - } + void create() override; inline const LayoutFactory * getFactory() const { return factory; } - void checkEvents() override - { - LayoutBase::checkEvents(); - decorate(); - } + void checkEvents() override; bool hasTopbar() const { return getOptionValue(OPTION_TOPBAR)->boolValue; @@ -123,6 +113,9 @@ class Layout: public LayoutBase // Decoration settings bitmask to detect updates uint8_t decorationSettings = 0; + // Last time we refreshed the window + uint32_t lastRefresh = 0; + // Updates settings for trims, sliders, pots, etc... void decorate(); diff --git a/radio/src/gui/colorlcd/layouts/layout2x4.cpp b/radio/src/gui/colorlcd/layouts/layout2x4.cpp index c3e6a0d02..618f98a6f 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x4.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x4.cpp @@ -52,10 +52,10 @@ class Layout2x4: public Layout void create() override { Layout::create(); - setOptionValue(OPTION_PANEL1_BACKGROUND, OPTION_VALUE_BOOL(true)); - setOptionValue(OPTION_PANEL1_COLOR, OPTION_VALUE_UNSIGNED( RGB(77,112,203))); - setOptionValue(OPTION_PANEL2_BACKGROUND, OPTION_VALUE_BOOL(true)); - setOptionValue(OPTION_PANEL2_COLOR, OPTION_VALUE_UNSIGNED( RGB(77,112,203))); + getOptionValue(OPTION_PANEL1_BACKGROUND)->boolValue = true; + getOptionValue(OPTION_PANEL1_COLOR)->unsignedValue = RGB(77,112,203); + getOptionValue(OPTION_PANEL2_BACKGROUND)->boolValue = true; + getOptionValue(OPTION_PANEL2_COLOR)->unsignedValue = RGB(77,112,203); } unsigned int getZonesCount() const override diff --git a/radio/src/gui/colorlcd/model_flightmodes.cpp b/radio/src/gui/colorlcd/model_flightmodes.cpp index 841e98d91..b8a70fb9a 100644 --- a/radio/src/gui/colorlcd/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model_flightmodes.cpp @@ -20,6 +20,7 @@ #include "model_flightmodes.h" #include "opentx.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_MODEL) diff --git a/radio/src/gui/colorlcd/model_inputs.cpp b/radio/src/gui/colorlcd/model_inputs.cpp index 78596644d..ce6a797a3 100644 --- a/radio/src/gui/colorlcd/model_inputs.cpp +++ b/radio/src/gui/colorlcd/model_inputs.cpp @@ -21,6 +21,7 @@ #include "model_inputs.h" #include "opentx.h" #include "gvar_numberedit.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_MODEL) @@ -527,4 +528,4 @@ void insertExpo(uint8_t idx, uint8_t input) expo->weight = 100; resumeMixerCalculations(); storageDirty(EE_MODEL); -} \ No newline at end of file +} diff --git a/radio/src/gui/colorlcd/model_select.cpp b/radio/src/gui/colorlcd/model_select.cpp index 53017aef8..2dbc75c93 100644 --- a/radio/src/gui/colorlcd/model_select.cpp +++ b/radio/src/gui/colorlcd/model_select.cpp @@ -22,6 +22,7 @@ #include "model_select.h" #include "opentx.h" #include "storage/modelslist.h" +#include "libopenui.h" #define CATEGORIES_WIDTH 120 #define MODELS_LEFT 123 diff --git a/radio/src/gui/colorlcd/radio_diaganas.cpp b/radio/src/gui/colorlcd/radio_diaganas.cpp index 23be1e154..f08d848c6 100644 --- a/radio/src/gui/colorlcd/radio_diaganas.cpp +++ b/radio/src/gui/colorlcd/radio_diaganas.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "radio_diaganas.h" +#include "libopenui.h" constexpr coord_t ANA_OFFSET = 150; diff --git a/radio/src/gui/colorlcd/radio_diagkeys.cpp b/radio/src/gui/colorlcd/radio_diagkeys.cpp index f4c4e54ff..6f0c5f033 100644 --- a/radio/src/gui/colorlcd/radio_diagkeys.cpp +++ b/radio/src/gui/colorlcd/radio_diagkeys.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "radio_diagkeys.h" +#include "libopenui.h" #if defined(KEYS_GPIO_PIN_PGUP) constexpr uint8_t KEY_START = 0; diff --git a/radio/src/gui/colorlcd/radio_ghost_module_config.cpp b/radio/src/gui/colorlcd/radio_ghost_module_config.cpp index e97a211c5..368c0c195 100644 --- a/radio/src/gui/colorlcd/radio_ghost_module_config.cpp +++ b/radio/src/gui/colorlcd/radio_ghost_module_config.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "radio_ghost_module_config.h" +#include "libopenui.h" class GhostModuleConfigWindow: public Window { diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index c2839c4b3..0b4132e7b 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -23,6 +23,7 @@ #include "radio_diagkeys.h" #include "radio_diaganas.h" #include "opentx.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_GENERAL) diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index 3b13677e6..5e40c7f5f 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -22,6 +22,7 @@ #include "radio_setup.h" #include "opentx.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_GENERAL) diff --git a/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp b/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp index 5df010844..4ea32a864 100644 --- a/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp +++ b/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp @@ -20,6 +20,7 @@ #include "radio_spectrum_analyser.h" #include "opentx.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_GENERAL) diff --git a/radio/src/gui/colorlcd/radio_trainer.cpp b/radio/src/gui/colorlcd/radio_trainer.cpp index 53edb620c..202a732f9 100644 --- a/radio/src/gui/colorlcd/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio_trainer.cpp @@ -20,6 +20,7 @@ #include "radio_trainer.h" #include "opentx.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_GENERAL) diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index 084155c31..e33864e18 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -23,6 +23,7 @@ #include "opentx.h" #include "view_main.h" #include "widget_settings.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(EE_MODEL) @@ -172,6 +173,7 @@ class SetupWidgetsPage: public FormWindow auto screen = customScreens[customScreenIdx]; if (screen) { screen->attach(this); + screen->setLeft(0); setRect(screen->getRect()); } @@ -200,7 +202,9 @@ class SetupWidgetsPage: public FormWindow #endif auto screen = customScreens[customScreenIdx]; if (screen) { - screen->attach(ViewMain::instance()); + auto viewMain = ViewMain::instance(); + screen->setLeft(viewMain->getMainViewLeftPos(customScreenIdx)); + screen->attach(viewMain); } FormWindow::deleteLater(detach, trash); @@ -277,33 +281,44 @@ void ScreenAddPage::build(FormWindow * window) // First page is "User interface", subtract it auto newIdx = pageIndex - 1; - + TRACE("ScreenAddPage: add screen: newIdx = %d", newIdx); + auto& screen = customScreens[newIdx]; auto& screenData = g_model.screenData[newIdx]; + TRACE("ScreenAddPage: add screen: screen = %p", screen); + const LayoutFactory * factory = defaultLayout; - screen = factory->create(&screenData.layoutData); - strncpy(screenData.LayoutId, factory->getId(), sizeof(screenData.LayoutId)); + if (factory) { + TRACE("ScreenAddPage: add screen: factory = %p", factory); + screen = factory->create(&screenData.layoutData); - auto tab = new ScreenSetupPage(menu, pageIndex, newIdx); - std::string title(STR_MAIN_VIEW_X); - title.back() = newIdx + '1'; - tab->setTitle(title); - tab->setIcon(ICON_THEME_VIEW1 + newIdx); + strncpy(screenData.LayoutId, factory->getId(), sizeof(screenData.LayoutId)); + TRACE("ScreenAddPage: add screen: LayoutId = %s", screenData.LayoutId); - // remove current tab first - menu->setCurrentTab(0); - menu->removeTab(pageIndex); + auto tab = new ScreenSetupPage(menu, pageIndex, newIdx); + std::string title(STR_MAIN_VIEW_X); + title.back() = newIdx + '1'; + tab->setTitle(title); + tab->setIcon(ICON_THEME_VIEW1 + newIdx); - // add the new one - menu->addTab(tab); - menu->setCurrentTab(pageIndex); + // remove current tab first + menu->setCurrentTab(0); + menu->removeTab(pageIndex); - if (menu->getTabs() < MAX_CUSTOM_SCREENS) { - menu->addTab(new ScreenAddPage(menu, menu->getTabs())); + // add the new one + menu->addTab(tab); + menu->setCurrentTab(pageIndex); + + if (menu->getTabs() < MAX_CUSTOM_SCREENS) { + menu->addTab(new ScreenAddPage(menu, menu->getTabs())); + } + + storageDirty(EE_MODEL); + } + else { + TRACE("Add main view: factory is NULL"); } - - storageDirty(EE_MODEL); return 0; }); } diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 2b076a32a..5d8f03bae 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -20,6 +20,7 @@ #include "special_functions.h" #include "opentx.h" +#include "libopenui.h" #define SET_DIRTY() storageDirty(functions == g_model.customFn ? EE_MODEL : EE_GENERAL) diff --git a/radio/src/gui/colorlcd/theme.cpp b/radio/src/gui/colorlcd/theme.cpp index 1a9ba857c..e0fcd422a 100644 --- a/radio/src/gui/colorlcd/theme.cpp +++ b/radio/src/gui/colorlcd/theme.cpp @@ -19,6 +19,8 @@ */ #include "opentx.h" +#include "libopenui.h" + //#include "checkbox.h" //#include "modal_window.h" diff --git a/radio/src/gui/colorlcd/themes/480_default.cpp b/radio/src/gui/colorlcd/themes/480_default.cpp index 8479e3fb5..3e0947282 100644 --- a/radio/src/gui/colorlcd/themes/480_default.cpp +++ b/radio/src/gui/colorlcd/themes/480_default.cpp @@ -316,7 +316,7 @@ class Theme480: public OpenTxTheme void drawBackground(BitmapBuffer * dc) const override { if (backgroundBitmap) { - dc->drawBitmap(0, 0, backgroundBitmap); + dc->drawBitmap(0 - dc->getOffsetX(), 0 - dc->getOffsetY(), backgroundBitmap); } else { lcdSetColor(g_eeGeneral.themeData.options[0].value.unsignedValue); diff --git a/radio/src/gui/colorlcd/topbar.cpp b/radio/src/gui/colorlcd/topbar.cpp index ed9d92a7f..fe3694962 100644 --- a/radio/src/gui/colorlcd/topbar.cpp +++ b/radio/src/gui/colorlcd/topbar.cpp @@ -20,6 +20,8 @@ #include "opentx.h" +constexpr uint32_t TOPBAR_REFRESH = 1000 / 2; // 2 Hz + TopBar::TopBar(Window * parent) : WidgetsContainer({0, 0, LCD_W, MENU_HEADER_HEIGHT}, &g_model.topbarData) { @@ -160,3 +162,12 @@ void TopBar::paint(BitmapBuffer * dc) } #endif } + +void TopBar::checkEvents() +{ + // uint32_t now = RTOS_GET_MS(); + // if (now - lastRefresh >= TOPBAR_REFRESH) { + // lastRefresh = now; + // invalidate(); + // } +} diff --git a/radio/src/gui/colorlcd/topbar.h b/radio/src/gui/colorlcd/topbar.h index 404b0aaac..c0c2596a2 100644 --- a/radio/src/gui/colorlcd/topbar.h +++ b/radio/src/gui/colorlcd/topbar.h @@ -49,10 +49,10 @@ class TopBar: public WidgetsContainer void paint(BitmapBuffer * dc) override; - void checkEvents() override - { - invalidate(); - } + void checkEvents() override; + + protected: + uint32_t lastRefresh = 0; }; #endif // _TOPBAR_H_ diff --git a/radio/src/gui/colorlcd/view_logical_switches.cpp b/radio/src/gui/colorlcd/view_logical_switches.cpp index 233e6439b..d8c5afc3e 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.cpp +++ b/radio/src/gui/colorlcd/view_logical_switches.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "view_logical_switches.h" +#include "gridlayout.h" #include diff --git a/radio/src/gui/colorlcd/view_logical_switches.h b/radio/src/gui/colorlcd/view_logical_switches.h index 1f2750288..f7aab6ecf 100644 --- a/radio/src/gui/colorlcd/view_logical_switches.h +++ b/radio/src/gui/colorlcd/view_logical_switches.h @@ -21,6 +21,7 @@ #pragma once #include "opentx.h" +#include "tabsgroup.h" constexpr coord_t CSW_1ST_COLUMN = 50; constexpr coord_t CSW_2ND_COLUMN = 120; diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index 74e1ecc2d..2fc3e2294 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -31,22 +31,10 @@ #include "view_main_decoration.h" #include "opentx.h" -Layout * customScreens[MAX_CUSTOM_SCREENS] = {}; - -int getMainViewsCount() -{ - for (int index=1; indexgetRect()) { #if defined(HARDWARE_TOUCH) && !defined(HARDWARE_KEYS) new FabButton(this, 50, 100, ICON_MODEL, @@ -73,7 +61,10 @@ ViewMain::ViewMain(): return 0; }, NO_FOCUS); #endif + createDecoration(); + setPageWidth(getParent()->width()); + focusWindow = this; } @@ -109,6 +100,26 @@ void ViewMain::adjustDecoration() decoration->adjustDecoration(); } +unsigned ViewMain::getMainViewsCount() const +{ + return views; +} + +void ViewMain::setMainViewsCount(unsigned views) +{ + if (views > MAX_CUSTOM_SCREENS) + views = MAX_CUSTOM_SCREENS; + + this->views = views; + setInnerWidth(getParent()->width() * views); + //setWidth(getParent()->width() * views); +} + +coord_t ViewMain::getMainViewLeftPos(unsigned view) const +{ + return getParent()->width() * view; +} + rect_t ViewMain::getMainZone() const { rect_t zone = decoration->getMainZone(); @@ -141,6 +152,33 @@ void ViewMain::onEvent(event_t event) killEvents(event); openMenu(); break; + + case EVT_KEY_BREAK(KEY_PGDN): + killEvents(event); + g_model.view++; + if (g_model.view >= getMainViewsCount()) + g_model.view = 0; + setScrollPositionX(g_model.view * pageWidth); + //customScreens[g_model.view]->setFocus(); + TRACE("### switched to view #%i", g_model.view); + break; + +//TODO: these need to go away! +// -> board code should map the keys as required +#if defined(KEYS_GPIO_REG_UP) + case EVT_KEY_BREAK(KEY_PGUP): +#else + case EVT_KEY_LONG(KEY_PGDN): +#endif + killEvents(event); + if (!g_model.view) + g_model.view = getMainViewsCount() - 1; + else + g_model.view--; + setScrollPositionX(g_model.view * pageWidth); + //customScreens[g_model.view]->setFocus(); + TRACE("### switched to view #%i", g_model.view); + break; } } #endif @@ -187,6 +225,9 @@ void ViewMain::openMenu() void ViewMain::paint(BitmapBuffer * dc) { + TRACE("### ViewMain::paint(offset_x=%d;offset_y=%d) ###", + dc->getOffsetX(), dc->getOffsetY()); + OpenTxTheme::instance()->drawBackground(dc); if (g_model.view >= getMainViewsCount()) { @@ -206,3 +247,28 @@ void ViewMain::createTopbar() topbar->load(); } +#if 0 +FormGroup * setMultiPageForm(uint8_t pages, bool focus = true) +{ + if (mainForm) + mainForm->deleteLater(); + + coord_t height = + bottomToolbarIcon >= 0 ? + MULTI_PAGE_FORM_HEIGHT + : MULTI_PAGE_FORM_WITHOUT_TOOLBAR_HEIGHT; + + mainForm = new FormWindow(this, + {0, MULTI_PAGE_FORM_TOP, LCD_W, height}, + FRSKY_PAGE_FORM_FLAGS); + + mainForm->setPageWidth(LCD_W); + mainForm->setInnerWidth(pages * LCD_W); + + if (focus) { + mainForm->setFocus(SET_FOCUS_DEFAULT); + } + + return mainForm; +} +#endif diff --git a/radio/src/gui/colorlcd/view_main.h b/radio/src/gui/colorlcd/view_main.h index 1c6390181..4a535768a 100644 --- a/radio/src/gui/colorlcd/view_main.h +++ b/radio/src/gui/colorlcd/view_main.h @@ -63,12 +63,18 @@ class ViewMain: public FormWindow // Get the available space in the middle of the screen // (without decoration) rect_t getMainZone() const; + + unsigned getMainViewsCount() const; + void setMainViewsCount(unsigned views); + + coord_t getMainViewLeftPos(unsigned view) const; protected: static ViewMain * _instance; - TopBar* topbar; - ViewMainDecoration* decoration; + unsigned views = 0; + TopBar* topbar = nullptr; + ViewMainDecoration* decoration = nullptr; friend class SetupWidgetsPage; @@ -81,6 +87,8 @@ class ViewMain: public FormWindow void createDecoration(); void createTopbar(); + + void nextView(); }; #endif // _VIEW_MAIN_H_ diff --git a/radio/src/gui/colorlcd/view_main_decoration.cpp b/radio/src/gui/colorlcd/view_main_decoration.cpp index e16a0ed58..79f4614fc 100644 --- a/radio/src/gui/colorlcd/view_main_decoration.cpp +++ b/radio/src/gui/colorlcd/view_main_decoration.cpp @@ -266,8 +266,8 @@ void ViewMainDecoration::createTrims() VERTICAL_SLIDERS_HEIGHT }; - trims[TRIMS_LV] = new MainViewVerticalTrim(this, r, 1); - trims[TRIMS_RV] = new MainViewVerticalTrim(this, r, 2); + trims[TRIMS_LV] = new MainViewVerticalTrim(this, r, 2); + trims[TRIMS_RV] = new MainViewVerticalTrim(this, r, 1); } void ViewMainDecoration::createFlightMode() diff --git a/radio/src/gui/colorlcd/view_statistics.h b/radio/src/gui/colorlcd/view_statistics.h index c7568de1b..f9632e628 100644 --- a/radio/src/gui/colorlcd/view_statistics.h +++ b/radio/src/gui/colorlcd/view_statistics.h @@ -23,6 +23,8 @@ #include "opentx.h" #include "tabsgroup.h" #include "static.h" +#include "window.h" +#include "font.h" template class DebugInfoNumber : public Window @@ -34,7 +36,7 @@ class DebugInfoNumber : public Window prefix(prefix), suffix(suffix) { - coord_t prefixSize = getTextWidth(prefix, 0,HEADER_COLOR | FONT(XS)); + coord_t prefixSize = getTextWidth(prefix, 0, HEADER_COLOR | FONT(XS)); new StaticText(this, {0, 0, prefixSize, rect.h}, prefix, 0, HEADER_COLOR | FONT(XS)); new DynamicNumber(this, {prefixSize, 0, rect.w - prefixSize, rect.h}, [] { return menusStack.available(); diff --git a/radio/src/gui/colorlcd/widget.h b/radio/src/gui/colorlcd/widget.h index c1a41b6af..d7a198f59 100644 --- a/radio/src/gui/colorlcd/widget.h +++ b/radio/src/gui/colorlcd/widget.h @@ -71,10 +71,13 @@ class Widget : public FormField return &persistentData->options[index].value; } - inline void setOptionValue(unsigned int index, const ZoneOptionValue& value) - { - persistentData->options[index].value = value; - } + // + // TODO: for some reason, this one crashes on the radio... + // + // inline void setOptionValue(unsigned int index, const ZoneOptionValue& value) + // { + // persistentData->options[index].value = value; + // } inline PersistentData * getPersistentData() { diff --git a/radio/src/gui/colorlcd/widget_settings.cpp b/radio/src/gui/colorlcd/widget_settings.cpp index 510769b3d..1f2f7ee46 100644 --- a/radio/src/gui/colorlcd/widget_settings.cpp +++ b/radio/src/gui/colorlcd/widget_settings.cpp @@ -19,7 +19,9 @@ */ #include "opentx.h" + #include "widget_settings.h" +#include "libopenui.h" static const rect_t widgetSettingsDialogRect = { LCD_W / 10, // x @@ -51,30 +53,30 @@ WidgetSettings::WidgetSettings(Window * parent, Widget * widget) : case ZoneOption::Integer: new NumberEdit(form, grid.getFieldSlot(), option.min.signedValue, option.max.signedValue, [=]() -> int { - return widget->getOptionValue(optIdx)->signedValue; + return widget->getOptionValue(optIdx)->signedValue; }, [=](int32_t newValue) { - widget->setOptionValue(optIdx, OPTION_VALUE_SIGNED(newValue)); + widget->getOptionValue(optIdx)->signedValue = newValue; }); break; case ZoneOption::Source: new SourceChoice(form, grid.getFieldSlot(), 0, MIXSRC_LAST_TELEM, [=]() -> int16_t { - return (int16_t) widget->getOptionValue(optIdx)->unsignedValue; + return (int16_t) widget->getOptionValue(optIdx)->unsignedValue; }, [=](int16_t newValue) { - widget->setOptionValue(optIdx, OPTION_VALUE_UNSIGNED((uint32_t) newValue)); + widget->getOptionValue(optIdx)->unsignedValue = (uint32_t)newValue; }); break; case ZoneOption::Bool: new CheckBox(form, grid.getFieldSlot(), [=]() -> uint8_t { - return (uint8_t) widget->getOptionValue(optIdx)->boolValue; + return (uint8_t) widget->getOptionValue(optIdx)->boolValue; }, [=](int8_t newValue) { - widget->setOptionValue(optIdx, OPTION_VALUE_BOOL((uint32_t) newValue)); + widget->getOptionValue(optIdx)->boolValue = newValue; }); break; @@ -91,10 +93,10 @@ WidgetSettings::WidgetSettings(Window * parent, Widget * widget) : { auto tmChoice = new Choice(form, grid.getFieldSlot(), 0, TIMERS - 1, [=]() -> int { // getValue - return (int) widget->getOptionValue(optIdx)->unsignedValue; + return (int) widget->getOptionValue(optIdx)->unsignedValue; }, [=](int newValue) { // setValue - widget->setOptionValue(optIdx, OPTION_VALUE_UNSIGNED((uint32_t) newValue)); + widget->getOptionValue(optIdx)->unsignedValue = (uint32_t) newValue; }); tmChoice->setTextHandler([](int value) { @@ -108,19 +110,20 @@ WidgetSettings::WidgetSettings(Window * parent, Widget * widget) : option.min.unsignedValue, // min option.max.unsignedValue, // max [=]() -> int16_t { // getValue - return (uint8_t) widget->getOptionValue(optIdx)->unsignedValue; + return (uint8_t) widget->getOptionValue(optIdx)->unsignedValue; }, [=](int16_t newValue) { // setValue - widget->setOptionValue(optIdx, OPTION_VALUE_UNSIGNED((uint32_t) newValue)); + widget->getOptionValue(optIdx)->unsignedValue = (uint32_t) newValue; }); break; case ZoneOption::Color: - new ColorEdit(form, grid.getFieldSlot(), [=]() -> int { // getValue - return (int) widget->getOptionValue(optIdx)->unsignedValue; + new ColorEdit(form, grid.getFieldSlot(), + [=]() -> int { // getValue + return (int) widget->getOptionValue(optIdx)->unsignedValue; }, [=](int newValue) { // setValue - widget->setOptionValue(optIdx, OPTION_VALUE_UNSIGNED((uint32_t) newValue)); + widget->getOptionValue(optIdx)->unsignedValue = (uint32_t) newValue; }); break; } diff --git a/radio/src/gui/colorlcd/widgets/outputs.cpp b/radio/src/gui/colorlcd/widgets/outputs.cpp index 38c6d240a..a6693902d 100644 --- a/radio/src/gui/colorlcd/widgets/outputs.cpp +++ b/radio/src/gui/colorlcd/widgets/outputs.cpp @@ -25,6 +25,9 @@ #define VIEW_CHANNELS_LIMIT_PCT (g_model.extendedLimits ? LIMIT_EXT_PERCENT : 100) +constexpr uint32_t OUTPUTS_REFRESH = 1000 / 5; // 5 Hz + + class OutputsWidget: public Widget { public: @@ -100,11 +103,23 @@ class OutputsWidget: public Widget void checkEvents() override { Widget::checkEvents(); + + // Last time we refreshed the window + uint32_t now = RTOS_GET_MS(); + if (now - lastRefresh >= OUTPUTS_REFRESH) { + lastRefresh = now; + invalidate(); + } + invalidate(); } static const ZoneOption options[]; + + protected: + // Last time we refreshed the window + uint32_t lastRefresh = 0; }; const ZoneOption OutputsWidget::options[] = { diff --git a/radio/src/gui/colorlcd/zone.h b/radio/src/gui/colorlcd/zone.h index 26836b063..bd941433e 100644 --- a/radio/src/gui/colorlcd/zone.h +++ b/radio/src/gui/colorlcd/zone.h @@ -13,10 +13,10 @@ #define OPTION_VALUE_BOOL(x) { bool(x) } #define OPTION_VALUE_STRING(...) { *(ZoneOptionValue *)(const char *) #__VA_ARGS__ } #else - #define OPTION_VALUE_UNSIGNED(x) { .unsignedValue = (x) } - #define OPTION_VALUE_SIGNED(x) { .signedValue = (x) } - #define OPTION_VALUE_BOOL(x) { .boolValue = (x) } - #define OPTION_VALUE_STRING(...) { .stringValue = { __VA_ARGS__ } } + #define OPTION_VALUE_UNSIGNED(x) ZoneOptionValue{ .unsignedValue = (x) } + #define OPTION_VALUE_SIGNED(x) ZoneOptionValue{ .signedValue = (x) } + #define OPTION_VALUE_BOOL(x) ZoneOptionValue{ .boolValue = (x) } + #define OPTION_VALUE_STRING(...) ZoneOptionValue{ .stringValue = { __VA_ARGS__ } } #endif union ZoneOptionValue diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index 33a0ab28d..583262627 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "bootloader_flash.h" +#include "libopenui.h" bool isBootloader(const char * filename) { diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 5d91c0a1e..2898380ef 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -20,7 +20,8 @@ #include "opentx.h" #include "frsky_firmware_update.h" -#include "libopenui/src/libopenui_file.h" + +#include "libopenui.h" #define PRIM_REQ_POWERUP 0 #define PRIM_REQ_VERSION 1 diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index bb87a4142..7bf86a63e 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -24,6 +24,7 @@ #include "multi_firmware_update.h" #include "stk500.h" #include "debug.h" +#include "libopenui.h" #define UPDATE_MULTI_EXT_BIN ".bin" diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 13f6f4a3a..bd8767d52 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -21,6 +21,10 @@ #include "opentx.h" #include "ff.h" +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + FIL g_oLogFile __DMA; const char * g_logError = nullptr; uint8_t logDelay; diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 213421411..5ccde6e08 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -26,6 +26,10 @@ #include "telemetry/frsky.h" #include "telemetry/multi.h" +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + #if defined(PCBX12S) #include "lua/lua_exports_x12s.inc" // this line must be after lua headers #elif defined(RADIO_FAMILY_T16) diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 0cc1d48cc..a3ad5dbc9 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -27,7 +27,10 @@ #include "bin_allocator.h" #include "lua_api.h" #include "sdcard.h" -#include "libopenui/src/libopenui_file.h" + +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif extern "C" { #include diff --git a/radio/src/main.cpp b/radio/src/main.cpp index a43ddd254..c7b0fd8da 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -21,7 +21,7 @@ #include "opentx.h" #if defined(LIBOPENUI) - #include "mainwindow.h" + #include "libopenui.h" #endif uint8_t currentSpeakerVolume = 255; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 4ad05a801..81f842582 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -22,9 +22,10 @@ #include #if defined(LIBOPENUI) -// #include "shutdown_animation.h" -#include "radio_calibration.h" -#include "view_main.h" + #include "libopenui.h" + // #include "shutdown_animation.h" + #include "radio_calibration.h" + #include "view_main.h" #endif #if defined(PCBSKY9X) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index dbbd9eec8..f60c4ddeb 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -27,10 +27,6 @@ #include "opentx_helpers.h" #include "touch.h" -#if defined(LIBOPENUI) -#include "libopenui.h" -#endif - #if defined(SIMU) #include "targets/simu/simpgmspace.h" #endif diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 1719eff2f..366010d5c 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -21,7 +21,10 @@ #include #include "opentx.h" #include "diskio.h" -#include "libopenui/src/libopenui_file.h" + +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif bool sdCardFormat() { diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index ee9c8ae45..adbe4788a 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -383,7 +383,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start) static FXuint trimKeys[] = { KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12 }; #endif - for (unsigned i=0; igetKeyState(trimKeys[i])); } diff --git a/radio/src/targets/horus/libopenui_config.h b/radio/src/targets/horus/libopenui_config.h index b354635a5..77168ca71 100644 --- a/radio/src/targets/horus/libopenui_config.h +++ b/radio/src/targets/horus/libopenui_config.h @@ -29,7 +29,7 @@ typedef uint16_t pixel_t; constexpr bool WRAP_FORM_FIELDS_WITHIN_PAGE = true; -constexpr uint32_t SLIDE_SPEED_REDUCTION = 5; +constexpr short SLIDE_SPEED_REDUCTION = 5; constexpr uint32_t MENU_HEADER_BUTTON_WIDTH = 33; constexpr uint32_t MENU_HEADER_BUTTONS_LEFT = 47; diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index 523d38c81..beb25cbc6 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -83,8 +83,8 @@ else() # struct packing breaks on MinGW w/out -mno-ms-bitfields: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991 & http://stackoverflow.com/questions/24015852/struct-packing-and-alignment-with-mingw set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-ms-bitfields") endif() - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0") - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -fsanitize=address") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -fsanitize=address") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}") @@ -98,6 +98,7 @@ if(FOX_FOUND) endif() add_executable(simu WIN32 ${SIMU_SRC} ${RADIO_SRC_DIR}/simu.cpp) add_dependencies(simu ${RADIO_DEPENDENCIES}) + target_include_directories(simu PUBLIC ${FOX_INCLUDE_DIR} ) target_link_libraries(simu ${FOX_LIBRARY} pthread ${SDL_LIBRARY}) target_compile_definitions(simu PUBLIC -DSIMU) diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 959d0ee43..51943e6f0 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -20,6 +20,10 @@ #include "opentx.h" +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + void processGetHardwareInfoFrame(uint8_t module, const uint8_t * frame) { if (moduleState[module].mode != MODULE_MODE_GET_HARDWARE_INFO) { diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index c32cd491c..9fdc6c749 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -23,6 +23,10 @@ #include "pulses/afhds3.h" #include "mixer_scheduler.h" +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + uint8_t telemetryStreaming = 0; uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) uint8_t telemetryRxBufferCount = 0; diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index b439bd678..92f51e8c4 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -22,6 +22,10 @@ #define _USE_MATH_DEFINES #include +#if defined(LIBOPENUI) + #include "libopenui.h" +#endif + TelemetryItem telemetryItems[MAX_TELEMETRY_SENSORS]; uint8_t allowNewSensors;