diff --git a/.github/workflows/esp32_build.yml b/.github/workflows/esp32_build.yml index abbf692..90f8121 100644 --- a/.github/workflows/esp32_build.yml +++ b/.github/workflows/esp32_build.yml @@ -1,4 +1,4 @@ -name: Lolin ESP32-S3 Mini +name: ESP-IDF Build permissions: contents: read diff --git a/components/justus/include/common/Common.h b/components/justus/include/common/Common.h new file mode 100644 index 0000000..2f7c2e6 --- /dev/null +++ b/components/justus/include/common/Common.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +enum class ButtonType { NONE, UP, DOWN, LEFT, RIGHT, SELECT, BACK }; + +typedef std::function ButtonCallback; diff --git a/components/justus/include/common/PSMenu.h b/components/justus/include/common/PSMenu.h index 135b266..f8d202a 100644 --- a/components/justus/include/common/PSMenu.h +++ b/components/justus/include/common/PSMenu.h @@ -2,39 +2,40 @@ #include +#include "Common.h" #include "MenuOptions.h" #include "Widget.h" #include "data/MenuItem.h" -typedef std::function MenuCallback; - class PSMenu : public Widget { - public: +public: explicit PSMenu(menu_options_t *options); ~PSMenu() override; + void addText(uint8_t id, const std::string &text, const ButtonCallback &callback); + void addSelection(uint8_t id, const std::string &text, std::string &value, const std::vector& values, + const ButtonCallback &callback); + void addNumber(uint8_t id, const std::string &text, std::string &value, const ButtonCallback &callback); + void addToggle(uint8_t id, const std::string &text, bool selected, const ButtonCallback &callback); + +private: void render() override; void onButtonClicked(uint8_t button) override; - void addText(const std::string &text, const MenuCallback &callback); - void addSwitch(const std::string &text, std::string &value, const MenuCallback &callback); - void addNumber(const std::string &text, std::string &value, const MenuCallback &callback); - - private: void onPressedDown(); void onPressedUp(); - void onPressedLeft(); - void onPressedRight(); + void onPressedLeft() const; + void onPressedRight() const; void onPressedSelect() const; void onPressedBack() const; void drawScrollBar() const; void drawSelectionBox() const; - void renderWidget(uint8_t type, const uint8_t *font, int x, int y, const char *text) const; + void renderWidget(const MenuItem *item, const uint8_t *font, int x, int y) const; size_t m_selected_item = 0; std::vector m_items; menu_options_t *m_options; -}; +}; \ No newline at end of file diff --git a/components/justus/include/common/Widget.h b/components/justus/include/common/Widget.h index 2f9e58b..71c2edd 100644 --- a/components/justus/include/common/Widget.h +++ b/components/justus/include/common/Widget.h @@ -6,7 +6,7 @@ class Widget { - public: +public: explicit Widget(u8g2_t *u8g2); virtual ~Widget() = default; @@ -17,6 +17,6 @@ class Widget virtual void onButtonClicked(uint8_t button); - protected: +protected: u8g2_t *u8g2; -}; +}; \ No newline at end of file diff --git a/components/justus/include/data/MenuItem.h b/components/justus/include/data/MenuItem.h index 7ad0afe..bf91d08 100644 --- a/components/justus/include/data/MenuItem.h +++ b/components/justus/include/data/MenuItem.h @@ -1,24 +1,31 @@ #pragma once -#include #include #include +#include "common/Common.h" + class MenuItem { - public: - MenuItem(uint8_t type, std::string text, std::function callback); - MenuItem(uint8_t type, std::string text, std::string value, std::function callback); +public: + MenuItem(uint8_t id, uint8_t type, std::string text, ButtonCallback callback); + MenuItem(uint8_t id, uint8_t type, std::string text, std::string value, ButtonCallback callback); + MenuItem(uint8_t id, uint8_t type, std::string text, std::string value, std::vector values, + ButtonCallback callback); + MenuItem(uint8_t id, uint8_t type, std::string text, bool selected, ButtonCallback callback); + [[nodiscard]] uint8_t getId() const; [[nodiscard]] uint8_t getType() const; [[nodiscard]] const std::string &getText() const; [[nodiscard]] const std::string &getValue() const; void setValue(const std::string &value); - void callback(uint8_t id) const; + void onButtonPressed(uint8_t id, ButtonType button) const; [[nodiscard]] bool hasCallback() const; - private: +private: + uint8_t m_id; uint8_t m_type; std::string m_text; std::string m_value; - std::function m_callback; -}; + std::vector m_values; + ButtonCallback m_callback; +}; \ No newline at end of file diff --git a/components/justus/include/ui/LightMenu.h b/components/justus/include/ui/LightMenu.h index 4432703..ae4f70c 100644 --- a/components/justus/include/ui/LightMenu.h +++ b/components/justus/include/ui/LightMenu.h @@ -2,8 +2,13 @@ #include "common/PSMenu.h" -class LightMenu : public PSMenu +class LightMenu final : public PSMenu { public: explicit LightMenu(menu_options_t *options); + +private: + void onButtonPressed(uint8_t id, ButtonType button) const; + + menu_options_t *m_options; }; diff --git a/components/justus/include/ui/MainMenu.h b/components/justus/include/ui/MainMenu.h index 883aa27..68c573d 100644 --- a/components/justus/include/ui/MainMenu.h +++ b/components/justus/include/ui/MainMenu.h @@ -4,11 +4,11 @@ class MainMenu final : public PSMenu { - public: +public: explicit MainMenu(menu_options_t *options); - private: - void onSelect(uint8_t id) const; +private: + void onButtonPressed(uint8_t id, ButtonType button) const; menu_options_t *m_options; -}; +}; \ No newline at end of file diff --git a/components/justus/include/ui/SettingsMenu.h b/components/justus/include/ui/SettingsMenu.h index 79ca2e4..752ff09 100644 --- a/components/justus/include/ui/SettingsMenu.h +++ b/components/justus/include/ui/SettingsMenu.h @@ -2,7 +2,7 @@ #include "common/PSMenu.h" -class SettingsMenu : public PSMenu +class SettingsMenu final : public PSMenu { public: explicit SettingsMenu(menu_options_t *options); diff --git a/components/justus/src/common/PSMenu.cpp b/components/justus/src/common/PSMenu.cpp index 7ecb784..0b7aed1 100644 --- a/components/justus/src/common/PSMenu.cpp +++ b/components/justus/src/common/PSMenu.cpp @@ -6,7 +6,9 @@ PSMenu::PSMenu(menu_options_t *options) : Widget(options->u8g2), m_options(options) { - m_options->onButtonClicked = [this](const uint8_t button) { onButtonClicked(button); }; + m_options->onButtonClicked = [this](const uint8_t button) { + onButtonClicked(button); + }; } PSMenu::~PSMenu() @@ -31,35 +33,54 @@ void PSMenu::render() int x = 8; // sure? auto widget = m_items.at(m_selected_item); - renderWidget(widget.getType(), u8g2_font_helvB08_tr, x, u8g2->height / 2 + 3, widget.getText().c_str()); + renderWidget(&widget, u8g2_font_helvB08_tr, x, u8g2->height / 2 + 3); if (m_selected_item > 0) { auto item = m_items.at(m_selected_item - 1); - renderWidget(item.getType(), u8g2_font_haxrcorp4089_tr, x, 14, item.getText().c_str()); + renderWidget(&item, u8g2_font_haxrcorp4089_tr, x, 14); } if (m_selected_item < m_items.size() - 1) { auto item = m_items.at(m_selected_item + 1); - renderWidget(item.getType(), u8g2_font_haxrcorp4089_tr, x, u8g2->height - 10, item.getText().c_str()); + renderWidget(&item, u8g2_font_haxrcorp4089_tr, x, u8g2->height - 10); } } -void PSMenu::renderWidget(const uint8_t type, const uint8_t *font, const int x, const int y, const char *text) const +void PSMenu::renderWidget(const MenuItem *item, const uint8_t *font, const int x, const int y) const { - switch (type) + u8g2_SetFont(u8g2, font); + u8g2_DrawStr(u8g2, x, y, item->getText().c_str()); + switch (item->getType()) { - case 0: // text - u8g2_SetFont(u8g2, font); - u8g2_DrawStr(u8g2, x, y, text); + case 1: // Selection + { + std::string value = "< "; + value += item->getValue(); + value += " >"; + const u8g2_uint_t w = u8g2_GetStrWidth(u8g2, value.c_str()); + u8g2_DrawStr(u8g2, u8g2->width - w - 10, y, value.c_str()); break; + } + + case 3: // toggle + { + u8g2_DrawFrame(u8g2, u8g2->width - 24, y - 11, 14, 14); + if (strcmp(item->getValue().c_str(), "true") == 0) + { + u8g2_DrawLine(u8g2, u8g2->width - 22, y - 9, u8g2->width - 13, y); + u8g2_DrawLine(u8g2, u8g2->width - 22, y, u8g2->width - 13, y - 9); + } + break; + } default: - break; + + } } -void PSMenu::onButtonClicked(uint8_t button) +void PSMenu::onButtonClicked(const uint8_t button) { switch (button) { @@ -116,19 +137,22 @@ void PSMenu::onPressedUp() } } -void PSMenu::onPressedLeft() +void PSMenu::onPressedLeft() const { - // + const auto item = m_items.at(m_selected_item); + item.onButtonPressed(item.getId(), ButtonType::LEFT); } -void PSMenu::onPressedRight() +void PSMenu::onPressedRight() const { - /// + const auto item = m_items.at(m_selected_item); + item.onButtonPressed(item.getId(), ButtonType::RIGHT); } void PSMenu::onPressedSelect() const { - m_items.at(m_selected_item).callback(m_selected_item); + const auto item = m_items.at(m_selected_item); + item.onButtonPressed(item.getId(), ButtonType::SELECT); } void PSMenu::onPressedBack() const @@ -139,19 +163,26 @@ void PSMenu::onPressedBack() const } } -void PSMenu::addText(const std::string &text, const MenuCallback &callback) +void PSMenu::addText(uint8_t id, const std::string &text, const ButtonCallback &callback) { - m_items.emplace_back(0, text, callback); + m_items.emplace_back(id, 0, text, callback); } -void PSMenu::addSwitch(const std::string &text, std::string &value, const MenuCallback &callback) +void PSMenu::addSelection(uint8_t id, const std::string &text, std::string &value, + const std::vector &values, + const ButtonCallback &callback) { - m_items.emplace_back(1, text, value, callback); + m_items.emplace_back(id, 1, text, value, values, callback); } -void PSMenu::addNumber(const std::string &text, std::string &value, const MenuCallback &callback) +void PSMenu::addNumber(uint8_t id, const std::string &text, std::string &value, const ButtonCallback &callback) { - m_items.emplace_back(2, text, value, callback); + m_items.emplace_back(id, 2, text, value, callback); +} + +void PSMenu::addToggle(uint8_t id, const std::string &text, bool selected, const ButtonCallback &callback) +{ + m_items.emplace_back(id, 3, text, selected, callback); } void PSMenu::drawScrollBar() const @@ -173,4 +204,4 @@ void PSMenu::drawSelectionBox() const u8g2_DrawRFrame(u8g2, 2, boxHeight, displayWidth - rightPadding, boxHeight, 3); u8g2_DrawLine(u8g2, 4, y, displayWidth - rightPadding, y); u8g2_DrawLine(u8g2, x, y - boxHeight + 3, x, y - 1); -} +} \ No newline at end of file diff --git a/components/justus/src/data/MenuItem.cpp b/components/justus/src/data/MenuItem.cpp index 544a176..1ccb7eb 100644 --- a/components/justus/src/data/MenuItem.cpp +++ b/components/justus/src/data/MenuItem.cpp @@ -1,15 +1,36 @@ #include "data/MenuItem.h" -MenuItem::MenuItem(const uint8_t type, std::string text, std::function callback) - : m_type(type), m_text(std::move(text)), m_callback(std::move(callback)) +MenuItem::MenuItem(const uint8_t id, const uint8_t type, std::string text, ButtonCallback callback) + : m_id(id), m_type(type), m_text(std::move(text)), m_callback(std::move(callback)) { } -MenuItem::MenuItem(const uint8_t type, std::string text, std::string value, std::function callback) - : m_type(type), m_text(std::move(text)), m_value(std::move(value)), m_callback(std::move(callback)) +MenuItem::MenuItem(const uint8_t id, const uint8_t type, std::string text, std::string value, + ButtonCallback callback) + : m_id(id), m_type(type), m_text(std::move(text)), m_value(std::move(value)), m_callback(std::move(callback)) { } +MenuItem::MenuItem(const uint8_t id, const uint8_t type, std::string text, std::string value, + std::vector values, + ButtonCallback callback) + : m_id(id), m_type(type), m_text(std::move(text)), m_value(std::move(value)), m_values(std::move(values)), + m_callback(std::move(callback)) +{ +} + +MenuItem::MenuItem(const uint8_t id, const uint8_t type, std::string text, const bool selected, + ButtonCallback callback) + : m_id(id), m_type(type), m_text(std::move(text)), m_value(selected ? "true" : "false"), + m_callback(std::move(callback)) +{ +} + +uint8_t MenuItem::getId() const +{ + return m_id; +} + uint8_t MenuItem::getType() const { return m_type; @@ -30,19 +51,15 @@ void MenuItem::setValue(const std::string &value) m_value = value; } -void MenuItem::callback(const uint8_t id) const +void MenuItem::onButtonPressed(const uint8_t id, const ButtonType button) const { if (m_callback) { - m_callback(id); - } - else - { - /// + m_callback(id, button); } } bool MenuItem::hasCallback() const { return (m_callback != nullptr); -} +} \ No newline at end of file diff --git a/components/justus/src/ui/LightMenu.cpp b/components/justus/src/ui/LightMenu.cpp index 117f266..3efe4aa 100644 --- a/components/justus/src/ui/LightMenu.cpp +++ b/components/justus/src/ui/LightMenu.cpp @@ -1,12 +1,36 @@ #include "ui/LightMenu.h" -void demoL(uint8_t id) +LightMenu::LightMenu(menu_options_t *options) : PSMenu(options), m_options(options) { - // + std::vector values; + values.emplace_back("Tag"); + values.emplace_back("Nacht"); + addSelection(1, "Modus", values.front(), values, [this](const uint8_t id, const ButtonType button) { + onButtonPressed(id, button); + }); + + addText(2, "LED Einstellungen", [this](const uint8_t id, const ButtonType button) { + onButtonPressed(id, button); + }); + + addToggle(3, "Toggle", false, nullptr); } -LightMenu::LightMenu(menu_options_t *options) : PSMenu(options) +void LightMenu::onButtonPressed(const uint8_t id, const ButtonType button) const { - addText("Tag/Nacht", nullptr); - addText("LED Einstellungen", demoL); -} + std::shared_ptr widget; + switch (id) + { + case 2: + widget = std::make_shared(m_options); + break; + + default: + break; + } + + if (m_options && m_options->pushScreen) + { + m_options->pushScreen(widget); + } +} \ No newline at end of file diff --git a/components/justus/src/ui/MainMenu.cpp b/components/justus/src/ui/MainMenu.cpp index 4bae077..c6914bf 100644 --- a/components/justus/src/ui/MainMenu.cpp +++ b/components/justus/src/ui/MainMenu.cpp @@ -6,24 +6,35 @@ MainMenu::MainMenu(menu_options_t *options) : PSMenu(options), m_options(options) { - addText("Lichtsteuerung", [this](const uint8_t button) { onSelect(button); }); - addText("Einstellungen", [this](const uint8_t button) { onSelect(button); }); + addText(1, "Lichtsteuerung", [this](const uint8_t id, const ButtonType button) { + onButtonPressed(id, button); + }); + addText(2, "externe Geraete", [this](const uint8_t id, const ButtonType button) { + onButtonPressed(id, button); + }); + addText(3, "Einstellungen", [this](const uint8_t id, const ButtonType button) { + onButtonPressed(id, button); + }); } -void MainMenu::onSelect(const uint8_t id) const +void MainMenu::onButtonPressed(const uint8_t id, const ButtonType button) const { std::shared_ptr widget; switch (id) { - case 0: + case 1: widget = std::make_shared(m_options); break; - case 1: + + case 3: widget = std::make_shared(m_options); break; + default: + break; } + if (m_options && m_options->pushScreen) { m_options->pushScreen(widget); } -} +} \ No newline at end of file diff --git a/components/justus/src/ui/SettingsMenu.cpp b/components/justus/src/ui/SettingsMenu.cpp index ae273b0..129dec9 100644 --- a/components/justus/src/ui/SettingsMenu.cpp +++ b/components/justus/src/ui/SettingsMenu.cpp @@ -1,11 +1,11 @@ #include "ui/SettingsMenu.h" -void demo(uint8_t id) +void demo(uint8_t id, ButtonType button) { /// } SettingsMenu::SettingsMenu(menu_options_t *options) : PSMenu(options) { - addText("OTA Einspielen", demo); -} + addText(1, "OTA Einspielen", demo); +} \ No newline at end of file diff --git a/components/justus/src/ui/SplashScreen.cpp b/components/justus/src/ui/SplashScreen.cpp index 0ba45db..ea7a58e 100644 --- a/components/justus/src/ui/SplashScreen.cpp +++ b/components/justus/src/ui/SplashScreen.cpp @@ -37,4 +37,4 @@ void SplashScreen::render() u8g2_DrawStr(u8g2, 30, u8g2->height / 2 + 5, "Axel Janz"); u8g2_SetFont(u8g2, u8g2_font_haxrcorp4089_tr); u8g2_DrawStr(u8g2, 35, 50, "Initialisierung..."); -} +} \ No newline at end of file