From 8c88e5ee8244d5a07e4293abd365226af07af38b Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:13:02 -0500 Subject: [PATCH 1/7] feat: Update ESPP / LVGL --- .gitignore | 1 + .gitmodules | 6 -- CMakeLists.txt | 4 +- components/esp-protocols | 1 - components/espp | 1 - components/gui/idf_component.yml | 18 +++++ components/gui/include/graph_window.hpp | 3 + components/gui/include/gui.hpp | 20 +++-- components/gui/include/window.hpp | 2 +- components/gui/src/graph_window.cpp | 100 ++++++++++++++++-------- components/gui/src/gui.cpp | 8 +- components/gui/src/text_window.cpp | 5 +- main/idf_component.yml | 25 ++++++ main/main.cpp | 18 +---- requirements.txt | 1 + 15 files changed, 144 insertions(+), 69 deletions(-) delete mode 160000 components/esp-protocols delete mode 160000 components/espp create mode 100644 components/gui/idf_component.yml create mode 100644 main/idf_component.yml create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 6a47bed..441fadb 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ build/ sdkconfig sdkconfig.old +managed_components/ diff --git a/.gitmodules b/.gitmodules index 90d9f6c..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +0,0 @@ -[submodule "components/espp"] - path = components/espp - url = git@github.com:esp-cpp/espp -[submodule "components/esp-protocols"] - path = components/esp-protocols - url = git@github.com:espressif/esp-protocols diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ed98dd..89b4ef2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,12 @@ # The following lines of boilerplate have to be in your project's CMakeLists # in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.20) include($ENV{IDF_PATH}/tools/cmake/project.cmake) # add the component directories that we want to use set(EXTRA_COMPONENT_DIRS "components/" - "components/espp/components/" - "components/esp-protocols/components" ) # set the hal component to use based on the target diff --git a/components/esp-protocols b/components/esp-protocols deleted file mode 160000 index 25d8423..0000000 --- a/components/esp-protocols +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 25d8423e6dd9031d4bd5a3afe815810137d4532b diff --git a/components/espp b/components/espp deleted file mode 160000 index a93e6a7..0000000 --- a/components/espp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a93e6a7d095b076c44df26646b12eafc0e75a740 diff --git a/components/gui/idf_component.yml b/components/gui/idf_component.yml new file mode 100644 index 0000000..afc56ad --- /dev/null +++ b/components/gui/idf_component.yml @@ -0,0 +1,18 @@ +## IDF Component Manager Manifest File +dependencies: + ## Required IDF version + idf: + version: '>=4.1.0' + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true + espp/task: '>=1.0' + espp/display: '>=1.0' diff --git a/components/gui/include/graph_window.hpp b/components/gui/include/graph_window.hpp index ee00fbe..30eb9c6 100644 --- a/components/gui/include/graph_window.hpp +++ b/components/gui/include/graph_window.hpp @@ -12,6 +12,7 @@ class GraphWindow : public Window { void init(lv_obj_t *parent, size_t width, size_t height) override; void update() override; + void set_max_point_count(size_t max_point_count); void clear_plots(void); void add_data(const std::string &plot_name, int new_data); @@ -24,6 +25,8 @@ class GraphWindow : public Window { void update_ticks(void); private: + lv_obj_t *wrapper_{nullptr}; + lv_obj_t *y_scale_{nullptr}; lv_obj_t *chart_{nullptr}; lv_obj_t *legend_{nullptr}; std::string y_ticks_{""}; diff --git a/components/gui/include/gui.hpp b/components/gui/include/gui.hpp index 4e2f15d..e004a09 100644 --- a/components/gui/include/gui.hpp +++ b/components/gui/include/gui.hpp @@ -16,6 +16,9 @@ class Gui { public: + using Pixel = lv_color16_t; + using Display = espp::Display; + const std::string delimeter_data = "::"; ///< Delimeter indicating this contains plottable data const std::string delimeter_command = "+++"; ///< Delimeter indicating this contains a command const std::string command_remove_plot = "RP:"; ///< Command: remove plot @@ -23,19 +26,22 @@ class Gui { const std::string command_clear_logs = "CL"; ///< Command: clear logs struct Config { - std::shared_ptr display; - espp::Logger::Verbosity log_level{espp::Logger::Verbosity::WARN}; + std::shared_ptr display; ///< Display to use + size_t max_chart_point_count{30}; ///< Max number of points to show on the chart + espp::Logger::Verbosity log_level{espp::Logger::Verbosity::WARN}; ///< Log level }; explicit Gui(const Config &config) : display_(config.display) , logger_({.tag = "Gui", .level = config.log_level}) { init_ui(); + plot_window_.set_max_point_count(config.max_chart_point_count); + plot_window_.clear_plots(); // now start the gui updater task using namespace std::placeholders; - task_ = espp::Task::make_unique({.name = "Gui Task", - .callback = std::bind(&Gui::update, this, _1, _2), - .stack_size_bytes = 6 * 1024}); + task_ = espp::Task::make_unique(espp::Task::Config{ + .callback = [this](auto &m, auto &cv) -> bool { return this->update(m, cv); }, + .task_config = {.name = "Gui Task", .stack_size_bytes = 6 * 1024}}); task_->start(); } @@ -54,6 +60,8 @@ class Gui { bool handle_data(); + void set_chart_max_point_count(size_t count) { plot_window_.set_max_point_count(count); } + protected: void init_ui(); void deinit_ui(); @@ -107,7 +115,7 @@ class Gui { std::mutex data_queue_mutex_; std::queue data_queue_; - std::shared_ptr display_; + std::shared_ptr display_; std::unique_ptr task_; espp::Logger logger_; diff --git a/components/gui/include/window.hpp b/components/gui/include/window.hpp index aa650b1..3b05c5d 100644 --- a/components/gui/include/window.hpp +++ b/components/gui/include/window.hpp @@ -1,6 +1,6 @@ #pragma once -#include "lvgl.h" +#include class Window { public: diff --git a/components/gui/src/graph_window.cpp b/components/gui/src/graph_window.cpp index df0ef82..02ea67c 100644 --- a/components/gui/src/graph_window.cpp +++ b/components/gui/src/graph_window.cpp @@ -1,14 +1,24 @@ #include "graph_window.hpp" +#include "format.hpp" + +#include + void GraphWindow::init(lv_obj_t *parent, size_t width, size_t height) { Window::init(parent, width, height); + // create a transparent wrapper for the chart and the scale. + wrapper_ = lv_obj_create(parent_); + lv_obj_remove_style_all(wrapper_); + lv_obj_set_size(wrapper_, lv_pct(100), lv_pct(100)); + // Create a chart - chart_ = lv_chart_create(parent_); + chart_ = lv_chart_create(wrapper_); + lv_chart_set_update_mode(chart_, LV_CHART_UPDATE_MODE_SHIFT); // we need to make the width of the chart less than the parent full width to // leave room for tick labels lv_obj_set_width(chart_, lv_pct(90)); - lv_obj_set_height(chart_, lv_pct(100)); + lv_obj_set_height(chart_, lv_pct(95)); // the y axis labels are on the left of the chart, so align the chart on the // right side of the parent to leave room for tick labels @@ -18,48 +28,75 @@ void GraphWindow::init(lv_obj_t *parent, size_t width, size_t height) { lv_chart_set_type(chart_, LV_CHART_TYPE_LINE); // update the tick values - size_t major_tick_length = 5; - size_t minor_tick_length = 2; + size_t major_tick_length = 6; + size_t minor_tick_length = 3; size_t major_tick_count = 5; size_t minor_tick_count = 2; + size_t total_tick_count = major_tick_count * minor_tick_count + 1; bool label_enabled = true; - size_t draw_size = 50; - lv_chart_set_axis_tick(chart_, LV_CHART_AXIS_PRIMARY_Y, major_tick_length, minor_tick_length, - major_tick_count, minor_tick_count, label_enabled, draw_size); + + // create the scale for the y-axis + y_scale_ = lv_scale_create(wrapper_); + lv_obj_set_size(y_scale_, lv_pct(10), lv_pct(95)); + lv_obj_align(y_scale_, LV_ALIGN_LEFT_MID, 0, 0); + lv_scale_set_mode(y_scale_, LV_SCALE_MODE_VERTICAL_LEFT); + lv_scale_set_label_show(y_scale_, label_enabled); + lv_scale_set_total_tick_count(y_scale_, total_tick_count); + lv_scale_set_major_tick_every(y_scale_, major_tick_count); + lv_obj_set_style_length(y_scale_, minor_tick_length, LV_PART_ITEMS); + lv_obj_set_style_length(y_scale_, major_tick_length, LV_PART_INDICATOR); // create the legend - legend_ = lv_label_create(chart_); - lv_obj_align(legend_, LV_ALIGN_TOP_RIGHT, -7, 5); - lv_label_set_text(legend_, ""); + legend_ = lv_spangroup_create(chart_); + lv_obj_set_width(legend_, lv_pct(100)); + lv_obj_set_height(legend_, LV_SIZE_CONTENT); + lv_obj_align(legend_, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_spangroup_set_align(legend_, LV_TEXT_ALIGN_RIGHT); + lv_spangroup_set_mode(legend_, LV_SPAN_MODE_BREAK); + lv_spangroup_set_max_lines(legend_, -1); // no limit + lv_spangroup_set_indent(legend_, 0); // create a style for the chart // give some padding to the chart - especially on the left where we // have the y axis labels / ticks. + lv_chart_set_div_line_count(chart_, 5, 7); lv_obj_set_style_border_width(chart_, 0, 0); - lv_obj_set_style_pad_left(chart_, 60, 0); - lv_obj_set_style_pad_bottom(chart_, 36, 0); - lv_obj_set_style_pad_right(chart_, 25, 0); - lv_obj_set_style_pad_top(chart_, 20, 0); + lv_obj_set_style_pad_all(chart_, 0, 0); } -void GraphWindow::update_ticks() { +void GraphWindow::set_max_point_count(size_t max_point_count) { + // set the maximum number of points to be displayed on the chart + lv_chart_set_point_count(chart_, max_point_count); +} +void GraphWindow::update_ticks() { + if (plot_map_.empty()) { + // if we have no plots, then we don't need to do anything + return; + } // get the minimum and maximum - lv_coord_t min = 0, max = 0; + std::vector y_points; + auto num_points = lv_chart_get_point_count(chart_); - for (auto e : plot_map_) { + for (const auto &e : plot_map_) { auto series = e.second; for (size_t i = 0; i < num_points; i++) { auto point = series->y_points[i]; - if (point < min) - min = point; - if (point > max) - max = point; + if (point == LV_CHART_POINT_NONE) { + // skip this point + continue; + } + y_points.push_back(series->y_points[i]); } } + // get the min/max values + auto min = *std::min_element(y_points.begin(), y_points.end()); + auto max = *std::max_element(y_points.begin(), y_points.end()); + // update the chart range lv_chart_set_range(chart_, LV_CHART_AXIS_PRIMARY_Y, min, max); + lv_scale_set_range(y_scale_, min, max); } void GraphWindow::update() { @@ -78,7 +115,9 @@ void GraphWindow::clear_plots(void) { // now clear the map plot_map_.clear(); // clear the legend - lv_label_set_text(legend_, ""); + while (lv_spangroup_get_child(legend_, 0)) { + lv_spangroup_delete_span(legend_, lv_spangroup_get_child(legend_, 0)); + } } void GraphWindow::add_data(const std::string &plotName, int newData) { @@ -99,15 +138,14 @@ lv_chart_series_t *GraphWindow::create_plot(const std::string &plotName) { // now make the plot auto plot = lv_chart_add_series(chart_, color, LV_CHART_AXIS_PRIMARY_Y); - // Add text to legend, #XXX # will be a colored string, if we set the - // recolor property to true on the label - char label_buf[50]; - sprintf(label_buf, "#%02X%02X%02X - %s#\n", red, green, blue, plotName.c_str()); - char *current_legend = lv_label_get_text(legend_); - auto new_text = std::string(current_legend); - new_text += label_buf; - lv_label_set_text(legend_, new_text.c_str()); - lv_label_set_recolor(legend_, true); + // create a new span for the new legend text + auto span = lv_spangroup_new_span(legend_); + // set the text to be the color of the plot + std::string legend_text = fmt::format("{} -\n", plotName); + lv_span_set_text(span, legend_text.c_str()); + lv_style_set_text_color(lv_span_get_style(span), color); + + lv_spangroup_refr_mode(legend_); // add it to the map plot_map_[plotName] = plot; diff --git a/components/gui/src/gui.cpp b/components/gui/src/gui.cpp index 6e8a42e..9b33540 100644 --- a/components/gui/src/gui.cpp +++ b/components/gui/src/gui.cpp @@ -9,7 +9,9 @@ void Gui::init_ui() { // Initialize the GUI const auto tab_location = LV_DIR_TOP; const size_t tab_height = 20; - tabview_ = lv_tabview_create(lv_scr_act(), tab_location, tab_height); + tabview_ = lv_tabview_create(lv_scr_act()); + lv_tabview_set_tab_bar_position(tabview_, tab_location); + lv_tabview_set_tab_bar_size(tabview_, tab_height); // create the plotting tab and hide the scrollbars auto plot_tab = lv_tabview_add_tab(tabview_, "Plots"); @@ -34,7 +36,7 @@ void Gui::init_ui() { void Gui::switch_tab() { std::lock_guard lk{mutex_}; - auto num_tabs = ((lv_tabview_t *)tabview_)->tab_cnt; + auto num_tabs = lv_tabview_get_tab_count(tabview_); auto active_tab = lv_tabview_get_tab_act(tabview_); auto next_tab = (active_tab + 1) % num_tabs; lv_tabview_set_act(tabview_, next_tab, LV_ANIM_ON); @@ -146,6 +148,6 @@ bool Gui::handle_data() { } void Gui::on_pressed(lv_event_t *e) { - lv_obj_t *target = lv_event_get_target(e); + lv_obj_t *target = (lv_obj_t *)lv_event_get_target(e); logger_.info("PRESSED: {}", fmt::ptr(target)); } diff --git a/components/gui/src/text_window.cpp b/components/gui/src/text_window.cpp index 4767fcd..0d29d9f 100644 --- a/components/gui/src/text_window.cpp +++ b/components/gui/src/text_window.cpp @@ -3,7 +3,10 @@ void TextWindow::init(lv_obj_t *parent, size_t width, size_t height) { Window::init(parent, width, height); log_container_ = lv_label_create(parent_); - lv_label_set_recolor(log_container_, true); + // NOTE: in LVGL v9 (up to 9.2.2) text recoloring was removed. In the future + // (>=9.2.3) it will be added back. + // + // lv_label_set_recolor(log_container_, true); // wrap text on long lines lv_label_set_long_mode(log_container_, LV_LABEL_LONG_WRAP); diff --git a/main/idf_component.yml b/main/idf_component.yml new file mode 100644 index 0000000..bd2312a --- /dev/null +++ b/main/idf_component.yml @@ -0,0 +1,25 @@ +## IDF Component Manager Manifest File +dependencies: + ## Required IDF version + idf: + version: '>=5.0' + espressif/mdns: '>=1.8' + espp/button: '>=1.0' + espp/rtsp: '>=1.0' + espp/wifi: '>=1.0' + espp/monitor: '>=1.0' + espp/socket: '>=1.0' + espp/nvs: '>=1.0' + espp/task: '>=1.0' + espp/esp-box: + version: '>=1.0' + rules: + - if: "target in [esp32s3]" + espp/t-deck: + version: '>=1.0' + rules: + - if: "target in [esp32s3]" + espp/wrover-kit: + version: '>=1.0' + rules: + - if: "target in [esp32]" diff --git a/main/main.cpp b/main/main.cpp index dd143ea..c3935dc 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -67,7 +67,7 @@ extern "C" void app_main(void) { auto display = hal.display(); // create the gui - Gui gui({.display = display, .log_level = espp::Logger::Verbosity::DEBUG}); + Gui gui(Gui::Config{.display = display, .log_level = espp::Logger::Verbosity::DEBUG}); // initialize the input system #if CONFIG_HARDWARE_WROVER_KIT @@ -89,19 +89,6 @@ extern "C" void app_main(void) { logger.error("Could not initialize touch"); return; } - // make a task to run the touch update - auto touch_task_config = espp::Task::Config{ - .name = "TouchTask", - .callback = - [&](auto &m, auto &cv) { - hal.update_touch(); - std::this_thread::sleep_for(10ms); - return false; - }, - .stack_size_bytes = 6 * 1024, - }; - espp::Task touch_task(touch_task_config); - touch_task.start(); #endif // initialize WiFi @@ -129,9 +116,8 @@ extern "C" void app_main(void) { logger.info("Creating debug server at {}:{}", server_address, server_port); // create the socket espp::UdpSocket server_socket({.log_level = espp::Logger::Verbosity::WARN}); - auto server_task_config = espp::Task::Config{ + auto server_task_config = espp::Task::BaseConfig{ .name = "UdpServer", - .callback = nullptr, .stack_size_bytes = 6 * 1024, }; auto server_config = espp::UdpSocket::ReceiveConfig{ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..947c9c5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +zeroconf From f4b086f75d7c71ebfa877ee20b91b82b80d534a9 Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:14:36 -0500 Subject: [PATCH 2/7] remove unused variable --- components/gui/include/graph_window.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/components/gui/include/graph_window.hpp b/components/gui/include/graph_window.hpp index 30eb9c6..1d1c56d 100644 --- a/components/gui/include/graph_window.hpp +++ b/components/gui/include/graph_window.hpp @@ -29,6 +29,5 @@ class GraphWindow : public Window { lv_obj_t *y_scale_{nullptr}; lv_obj_t *chart_{nullptr}; lv_obj_t *legend_{nullptr}; - std::string y_ticks_{""}; std::unordered_map plot_map_{}; }; From 420fa37b7df1d248911948648f676ae28fbb8cc2 Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:14:43 -0500 Subject: [PATCH 3/7] add dep lock --- dependencies.lock | 521 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 517 insertions(+), 4 deletions(-) diff --git a/dependencies.lock b/dependencies.lock index 9f52290..3d17687 100644 --- a/dependencies.lock +++ b/dependencies.lock @@ -1,9 +1,522 @@ dependencies: + espp/base_component: + component_hash: 141149e8a257c6e31ccf0e150634102761134766d13c8d88c163d570b98f0986 + dependencies: + - name: espp/logger + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/base_peripheral: + component_hash: e5825b34b7eb62338c4055e564bd9c09d52ad1d952499200a79f5446c7969e6c + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/button: + component_hash: 0315e6964eba471134e3f628345f776040d89a1294bfd141300ea5a2b1fb1f6e + dependencies: + - name: espp/interrupt + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/cli: + component_hash: 892c256965ddfc6b915211ae27de02dc22819214b97c0f8022e45e81859cf097 + dependencies: + - name: espp/logger + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/codec: + component_hash: e184a22b3b0c7ff8eab0f5eeedaec7ed76642ffc27b9945468dfc11cb044d0c3 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/display: + component_hash: 5f1d4ead5bb79cfb5d85e3ac81adf9d14ed2211c5cbdba1757a1d11f25e844f7 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/led + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + - name: lvgl/lvgl + registry_url: https://components.espressif.com + require: private + version: '>=9.2.2' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/display_drivers: + component_hash: cc974ce69158ec047d863889b7b11e76e689b1e14dd64f9c0a7e78bb9d94d599 + dependencies: + - name: espp/display + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/led + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/esp-box: + component_hash: 25990cbb554f4db4434888cd8b994052a95d5f893ab9ba680288e64e729e3999 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/codec + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/display + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/display_drivers + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/gt911 + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/i2c + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/icm42607 + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/input_drivers + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/interrupt + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/tt21100 + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/format: + component_hash: 14d8a6baef3b4cf6b42542c8ccfd74353d31318e0e806ad0ccc6fb5f4cae3edd + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/gt911: + component_hash: 083bb859065fe7524c0b6b425c531c275f22f82b0ad0aa4cd8e12c7f8ec921fa + dependencies: + - name: espp/base_peripheral + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/i2c: + component_hash: 46130714e24081995710184c6090fe2b92c2343c9cc458248f72d77c525ba92f + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/cli + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/icm42607: + component_hash: 39ced96375632a145831a75235511322467e60d6f26f4ade70a951721c561139 + dependencies: + - name: espp/base_peripheral + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/math + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/input_drivers: + component_hash: b9e0975aff7bb6b524124c0199062597a5cfc16c4af5e650eba0ba9be5a0350b + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + - name: lvgl/lvgl + registry_url: https://components.espressif.com + require: private + version: '>=9.2.2' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/interrupt: + component_hash: 611f0e317489b16c0ea03517a307237377e1b2f682eb89244fbe1b7b739bbb71 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/led: + component_hash: e4840c8c0609d256f7ca8a3c79c9b12f0b7b5e9fa92333ce56ca78bb7ad867de + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/logger: + component_hash: fdd66656ae46ca690bf3750626d26221fc2b63f1b1ed768ce1ba9fb3be712821 + dependencies: + - name: espp/format + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/math: + component_hash: 389ddc4444dbe4604fb80a8635c289d925b28b722da3112c7bfad84dc5dbd053 + dependencies: + - name: espp/format + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/monitor: + component_hash: 7a6be40f74fe62a7b905a9ac3c65b662d92fb7bd3742b46d7797730118775325 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/nvs: + component_hash: 8efc985e1943c91f54e1b4526172561528c86d0f7ff11c027b779e8dbe1df282 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/rtsp: + component_hash: 9e56b64172fbc6d7a0a8c8beda9b3fa008ede4bb949a001642bae73ed692830b + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/socket + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/socket: + component_hash: d5f96ec0ef27491aeacffd0ba92e61e3c1f67444b17f18300efd954cf936bd94 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/t-deck: + component_hash: 29b50638bd6dfe18c67e480c3dad7fc4d54263c8cbc3d7845b796e412da10fae + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/display + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/display_drivers + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/gt911 + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/i2c + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/input_drivers + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/interrupt + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/t_keyboard + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: espp/task + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/t_keyboard: + component_hash: 15da21e50ec88b3feb5313ef286b3e21313b00589582bee5167e8948c9aac0ee + dependencies: + - name: espp/base_peripheral + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/task: + component_hash: ccc71fb2b265a9f0ca719fd562e6a6380473db2e5fed531d9ab46daa82434b52 + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espp/tt21100: + component_hash: 112021a91e105de073c3335384a003e072f70c08062712634a22bc21df49fce1 + dependencies: + - name: espp/base_peripheral + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com + type: service + version: 1.0.3 + espp/wifi: + component_hash: e5b16535771ad79641a4d6e6a7c9b30fab3bcc3e3fed4785725ee3ff6ad6a5bd + dependencies: + - name: espp/base_component + registry_url: https://components.espressif.com + require: private + version: '>=1.0' + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espressif/mdns: + component_hash: 3ec0af5f6bce310512e90f482388d21cc7c0e99668172d2f895356165fc6f7c5 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.8.2 idf: - component_hash: null source: type: idf - version: 5.2.2 -manifest_hash: 3b2f19acb78af92ba73aad159d4776bc678f2d95005e555536493d6d06488be2 + version: 5.4.1 + lvgl/lvgl: + component_hash: 096c69af22eaf8a2b721e3913da91918c5e6bf1a762a113ec01f401aa61337a0 + dependencies: [] + source: + registry_url: https://components.espressif.com + type: service + version: 9.2.2 +direct_dependencies: +- espp/button +- espp/display +- espp/esp-box +- espp/monitor +- espp/nvs +- espp/rtsp +- espp/socket +- espp/t-deck +- espp/task +- espp/wifi +- espressif/mdns +- idf +manifest_hash: e3e6ec9b6a5e43df0b4944237880c6c166882e269ae4ebfff7a5cfe8b1509732 target: esp32s3 -version: 1.0.0 +version: 2.0.0 From c512ca5e7bfba34ed4d4c4ad00fd4bd3712ead6a Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:19:25 -0500 Subject: [PATCH 4/7] update workflows --- .github/workflows/build.yml | 4 +--- .github/workflows/package_main.yml | 29 ++++++++++++++++++++++----- .github/workflows/static_analysis.yml | 6 ++---- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 56d68bf..375fa60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,12 +10,10 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@v4 - with: - submodules: 'recursive' - name: Build Examples uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v5.2.2 + esp_idf_version: v5.4 target: esp32s3 path: '.' diff --git a/.github/workflows/package_main.yml b/.github/workflows/package_main.yml index 190feaf..b9ced5a 100644 --- a/.github/workflows/package_main.yml +++ b/.github/workflows/package_main.yml @@ -5,6 +5,7 @@ on: branches: [main] release: types: [published] + workflow_dispatch: jobs: build: @@ -12,28 +13,32 @@ jobs: runs-on: ubuntu-latest continue-on-error: false + outputs: + zipfile-id: ${{ steps.zip_step.outputs.artifact-id }} + steps: - name: Checkout repo - uses: actions/checkout@v2 - with: - submodules: 'recursive' + uses: actions/checkout@v4 - name: Build Main Code uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v5.2.2 + esp_idf_version: v5.4 target: esp32s3 path: '.' command: 'idf.py build' - name: Upload Build Outputs uses: actions/upload-artifact@v4 + id: zip_step with: name: build-artifacts path: | + build/*.bin + build/*.elf build/bootloader/bootloader.bin build/partition_table/partition-table.bin - build/*.bin + build/flasher_args.json build/flash_args - name: Attach files to release @@ -42,7 +47,21 @@ jobs: with: files: | build/*.bin + build/*.elf build/bootloader/bootloader.bin build/partition_table/partition-table.bin + build/flasher_args.json build/flash_args + package: + name: Package the binaries into an executables for Windows, MacOS, and Linux (Ubuntu) + needs: build + strategy: + matrix: + os: [windows-latest, macos-latest, ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: esp-cpp/esp-packaged-programmer-action@v1.0.5 + with: + zipfile-id: ${{ needs.build.outputs.zipfile-id }} + programmer-name: 'wireless-debug-display_programmer' diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index d54694b..810c97a 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -9,8 +9,6 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@v4 - with: - submodules: 'recursive' - name: Run static analysis uses: esp-cpp/StaticAnalysis@master @@ -19,7 +17,7 @@ jobs: use_cmake: false # Use the 5.2 release version since it's what we build with - esp_idf_version: release/v5.2 + esp_idf_version: release/v5.4 # (Optional) cppcheck args - cppcheck_args: -i$GITHUB_WORKSPACE/components/espp -i$GITHUB_WORKSPACE/components/esp-protocols --force --enable=all --inline-suppr --inconclusive --platform=mips32 --std=c++17 --suppressions-list=$GITHUB_WORKSPACE/suppressions.txt + cppcheck_args: --check-level=exhaustive --force --enable=all --inline-suppr --inconclusive --platform=mips32 --std=c++17 --suppressions-list=$GITHUB_WORKSPACE/suppressions.txt From 1fa5ff3dd09b679776608606a0d78082368032af Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:22:20 -0500 Subject: [PATCH 5/7] update readme --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index 03678a8..44c9604 100644 --- a/README.md +++ b/README.md @@ -97,22 +97,6 @@ All other text is treated as a log and written out to the log window. Note, we do not wrap lines, so any text that would go off the edge of the screen is simply not rendered. -## Cloning - -Since this repo contains a submodule, you need to make sure you clone it -recursively, e.g. with: - -``` sh -git clone --recurse-submodules -``` - -Alternatively, you can always ensure the submodules are up to date after cloning -(or if you forgot to clone recursively) by running: - -``` sh -git submodule update --init --recursive -``` - ## Build and Flash Build the project and flash it to the board, then run monitor tool to view serial output: From acc15bbc9c133b39357852d017c31e07a5a2b89e Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:27:10 -0500 Subject: [PATCH 6/7] fix sa --- components/gui/include/gui.hpp | 6 +++--- components/gui/src/converter.cpp | 4 ++-- components/gui/src/gui.cpp | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/components/gui/include/gui.hpp b/components/gui/include/gui.hpp index e004a09..6d5736c 100644 --- a/components/gui/include/gui.hpp +++ b/components/gui/include/gui.hpp @@ -39,9 +39,9 @@ class Gui { plot_window_.clear_plots(); // now start the gui updater task using namespace std::placeholders; - task_ = espp::Task::make_unique(espp::Task::Config{ - .callback = [this](auto &m, auto &cv) -> bool { return this->update(m, cv); }, - .task_config = {.name = "Gui Task", .stack_size_bytes = 6 * 1024}}); + task_ = espp::Task::make_unique( + espp::Task::Config{.callback = [this](auto &m, auto &cv) -> bool { return update(m, cv); }, + .task_config = {.name = "Gui Task", .stack_size_bytes = 6 * 1024}}); task_->start(); } diff --git a/components/gui/src/converter.cpp b/components/gui/src/converter.cpp index 6d93c29..cbfa4b4 100644 --- a/components/gui/src/converter.cpp +++ b/components/gui/src/converter.cpp @@ -5,10 +5,10 @@ Converter::Status Converter::str2int(int &i, char const *s, int base) { long l; errno = 0; l = strtol(s, &end, base); - if ((errno == ERANGE && l == LONG_MAX) || l > INT_MAX) { + if (errno == ERANGE && l == LONG_MAX) { return Status::Overflow; } - if ((errno == ERANGE && l == LONG_MIN) || l < INT_MIN) { + if (errno == ERANGE && l == LONG_MIN) { return Status::Underflow; } if (*s == '\0' || *end != '\0') { diff --git a/components/gui/src/gui.cpp b/components/gui/src/gui.cpp index 9b33540..8749465 100644 --- a/components/gui/src/gui.cpp +++ b/components/gui/src/gui.cpp @@ -88,7 +88,6 @@ bool Gui::handle_data() { // parse for commands if ((pos = line.find(delimeter_command)) != std::string::npos) { std::string command; - std::string plotName; command = line.substr(pos + delimeter_command.length(), line.length()); if (command == command_clear_logs) { log_window_.clear_logs(); @@ -99,7 +98,7 @@ bool Gui::handle_data() { // make sure we transition to the next state hasNewPlotData = true; } else if ((pos = line.find(command_remove_plot)) != std::string::npos) { - plotName = line.substr(pos + command_remove_plot.length(), line.length()); + std::string plotName = line.substr(pos + command_remove_plot.length(), line.length()); plot_window_.remove_plot(plotName); // make sure we transition to the next state hasNewPlotData = true; From c0b435a81bdaa30b067ec71cd88e6b2925e3f74e Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Thu, 22 May 2025 12:32:42 -0500 Subject: [PATCH 7/7] use release-v5.4 instead of v5.4 --- .github/workflows/build.yml | 2 +- .github/workflows/package_main.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 375fa60..84cc878 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,6 @@ jobs: - name: Build Examples uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v5.4 + esp_idf_version: release-v5.4 target: esp32s3 path: '.' diff --git a/.github/workflows/package_main.yml b/.github/workflows/package_main.yml index b9ced5a..5a405e6 100644 --- a/.github/workflows/package_main.yml +++ b/.github/workflows/package_main.yml @@ -23,7 +23,7 @@ jobs: - name: Build Main Code uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v5.4 + esp_idf_version: release-v5.4 target: esp32s3 path: '.' command: 'idf.py build'