From 1878a43c77f2ce7db1b65930b0643bf2a974636f Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 08:08:34 -0500 Subject: [PATCH 01/25] Bump minor version --- Makefile | 2 +- docs/Doxyfile | 2 +- include/robodash/api.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 33c14f6..9c8bd3d 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ EXCLUDE_COLD_LIBRARIES:= # Set this to 1 to add additional rules to compile your project as a PROS library template IS_LIBRARY:=1 LIBNAME:=robodash -VERSION:=2.0.0 +VERSION:=2.1.0 # EXCLUDE_SRC_FROM_LIB= $(SRCDIR)/unpublishedfile.c # this line excludes opcontrol.c and similar files diff --git a/docs/Doxyfile b/docs/Doxyfile index a4fa6b3..689702f 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -48,7 +48,7 @@ PROJECT_NAME = Robodash # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2.0.0 +PROJECT_NUMBER = 2.1.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/include/robodash/api.h b/include/robodash/api.h index 66c880d..04b1206 100644 --- a/include/robodash/api.h +++ b/include/robodash/api.h @@ -9,7 +9,7 @@ #define ROBODASH #define RD_VERSION_MAJOR 2 -#define RD_VERSION_MINOR 0 +#define RD_VERSION_MINOR 1 #define RD_VERSION_PATCH 0 #include "liblvgl/lvgl.h" From 986bbdb8197716323e59d483504f24337b928ccb Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 13:48:14 -0500 Subject: [PATCH 02/25] Make multiple instances of selector work properly --- include/robodash/views/selector.hpp | 20 ++++++++++-- src/robodash/views/selector.cpp | 49 +++++++++++++---------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index 885ad67..83382fc 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -28,9 +28,6 @@ namespace rd { class Selector { /// @addtogroup selector /// @{ - private: - rd_view_t *view; - public: /// @name Selector Typedefs typedef std::function routine_action_t; @@ -56,6 +53,23 @@ class Selector { void focus(); /// @} + + private: + rd_view_t *view; + + lv_obj_t *select_cont; + lv_obj_t *selected_label; + lv_obj_t *saved_toast; + lv_anim_t anim_toast; + + std::vector routines; + rd::Selector::routine_t *selected_routine = nullptr; + + void sd_save(); + void sd_load(); + + static void select_cb(lv_event_t *event); + static void save_cb(lv_event_t *event); }; } // namespace rd \ No newline at end of file diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 1f9e933..9184df6 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -1,22 +1,9 @@ #include "api.h" #include "robodash/apix.h" -// =============================== Variables =============================== // - -// TODO: Make variables members, so multiple selectors can be used - -std::vector routines; -rd::Selector::routine_t *selected_routine = nullptr; - -lv_obj_t *select_cont; -lv_obj_t *selected_label; -lv_obj_t *saved_toast; - -lv_anim_t anim_toast; - // ============================= SD Card Saving ============================= // -void sd_save() { +void rd::Selector::sd_save() { FILE *save_file; save_file = fopen("/usd/rd_auton.txt", "w"); @@ -34,7 +21,7 @@ void sd_save() { fclose(save_file); } -void sd_load() { +void rd::Selector::sd_load() { FILE *save_file; save_file = fopen("/usd/rd_auton.txt", "r"); if (!save_file) return; @@ -73,29 +60,33 @@ void sd_load() { // ============================== UI Callbacks ============================== // -void r_select_act(lv_event_t *event) { +void rd::Selector::select_cb(lv_event_t *event) { lv_obj_t *obj = lv_event_get_target(event); rd::Selector::routine_t *routine = (rd::Selector::routine_t *)lv_event_get_user_data(event); + rd::Selector *selector = (rd::Selector *)lv_obj_get_user_data(obj); if (routine == nullptr) { - lv_label_set_text(selected_label, "No routine\nselected"); - lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); + lv_label_set_text(selector->selected_label, "No routine\nselected"); + lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); } else { const char *routine_name = routine->first.c_str(); char label_str[sizeof(routine_name) + 20]; sprintf(label_str, "Selected routine:\n%s", routine_name); - lv_label_set_text(selected_label, label_str); - lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); + lv_label_set_text(selector->selected_label, label_str); + lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); } - selected_routine = routine; + selector->selected_routine = routine; } -void save_act(lv_event_t *event) { - sd_save(); - lv_obj_clear_flag(saved_toast, LV_OBJ_FLAG_HIDDEN); - lv_anim_start(&anim_toast); +void rd::Selector::save_cb(lv_event_t *event) { + lv_obj_t *obj = lv_event_get_target(event); + rd::Selector *selector = (rd::Selector *)lv_obj_get_user_data(obj); + selector->sd_save(); + + lv_obj_clear_flag(selector->saved_toast, LV_OBJ_FLAG_HIDDEN); + lv_anim_start(&selector->anim_toast); } // ============================== Constructor ============================== // @@ -119,7 +110,7 @@ rd::Selector::Selector(std::vector new_routines) { lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); lv_obj_t *nothing_btn = lv_list_add_btn(routine_list, NULL, "Nothing"); - lv_obj_add_event_cb(nothing_btn, &r_select_act, LV_EVENT_PRESSED, nullptr); + lv_obj_add_event_cb(nothing_btn, &select_cb, LV_EVENT_PRESSED, nullptr); lv_obj_add_style(nothing_btn, &style_list_btn, 0); lv_obj_add_style(nothing_btn, &style_list_btn_pr, LV_STATE_PRESSED); @@ -139,10 +130,11 @@ rd::Selector::Selector(std::vector new_routines) { lv_obj_t *save_btn = lv_btn_create(view->obj); lv_obj_set_size(save_btn, 64, 32); lv_obj_align(save_btn, LV_ALIGN_BOTTOM_RIGHT, -172, -8); - lv_obj_add_event_cb(save_btn, &save_act, LV_EVENT_PRESSED, NULL); + lv_obj_add_event_cb(save_btn, &save_cb, LV_EVENT_PRESSED, NULL); lv_obj_add_style(save_btn, &style_btn, 0); lv_obj_add_style(save_btn, &style_btn_outline, 0); lv_obj_add_style(save_btn, &style_btn_outline_pr, LV_STATE_PRESSED); + lv_obj_set_user_data(save_btn, this); lv_obj_t *save_img = lv_img_create(save_btn); lv_img_set_src(save_img, LV_SYMBOL_SAVE); @@ -167,7 +159,8 @@ rd::Selector::Selector(std::vector new_routines) { lv_obj_t *new_btn = lv_list_add_btn(routine_list, NULL, routine.first.c_str()); lv_obj_add_style(new_btn, &style_list_btn, 0); lv_obj_add_style(new_btn, &style_list_btn_pr, LV_STATE_PRESSED); - lv_obj_add_event_cb(new_btn, &r_select_act, LV_EVENT_PRESSED, &routine); + lv_obj_set_user_data(new_btn, this); + lv_obj_add_event_cb(new_btn, &select_cb, LV_EVENT_PRESSED, &routine); } if (pros::usd::is_installed()) sd_load(); From 8cd7f25f2aee5a7f954d50a152291bd33318989f Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 14:11:21 -0500 Subject: [PATCH 03/25] Use strlen instead of sizeof in select_cb --- src/robodash/views/selector.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 9184df6..abb875f 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -1,5 +1,6 @@ #include "api.h" #include "robodash/apix.h" +#include // ============================= SD Card Saving ============================= // @@ -71,7 +72,7 @@ void rd::Selector::select_cb(lv_event_t *event) { } else { const char *routine_name = routine->first.c_str(); - char label_str[sizeof(routine_name) + 20]; + char label_str[strlen(routine_name) + 20]; sprintf(label_str, "Selected routine:\n%s", routine_name); lv_label_set_text(selector->selected_label, label_str); lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); From 0e6a5b2ac145bffad84c9d336fa4c8673abd7d6a Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 14:23:03 -0500 Subject: [PATCH 04/25] Fix data abort when tapping "nothing" Add selector as user data to nothing_btn and check if selector is null in callbacks for redundancy --- src/robodash/views/selector.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index abb875f..b6443fb 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -65,6 +65,7 @@ void rd::Selector::select_cb(lv_event_t *event) { lv_obj_t *obj = lv_event_get_target(event); rd::Selector::routine_t *routine = (rd::Selector::routine_t *)lv_event_get_user_data(event); rd::Selector *selector = (rd::Selector *)lv_obj_get_user_data(obj); + if (selector == nullptr) return; if (routine == nullptr) { lv_label_set_text(selector->selected_label, "No routine\nselected"); @@ -84,6 +85,7 @@ void rd::Selector::select_cb(lv_event_t *event) { void rd::Selector::save_cb(lv_event_t *event) { lv_obj_t *obj = lv_event_get_target(event); rd::Selector *selector = (rd::Selector *)lv_obj_get_user_data(obj); + if (selector == nullptr) return; selector->sd_save(); lv_obj_clear_flag(selector->saved_toast, LV_OBJ_FLAG_HIDDEN); @@ -112,6 +114,7 @@ rd::Selector::Selector(std::vector new_routines) { lv_obj_t *nothing_btn = lv_list_add_btn(routine_list, NULL, "Nothing"); lv_obj_add_event_cb(nothing_btn, &select_cb, LV_EVENT_PRESSED, nullptr); + lv_obj_set_user_data(nothing_btn, this); lv_obj_add_style(nothing_btn, &style_list_btn, 0); lv_obj_add_style(nothing_btn, &style_list_btn_pr, LV_STATE_PRESSED); From 1e7e8bac3327903958c493644275c3e9a9345f27 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 15:54:33 -0500 Subject: [PATCH 05/25] Add rudimentary image support for selector --- include/robodash/views/selector.hpp | 8 +++- src/robodash/views/selector.cpp | 58 +++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index 83382fc..290f501 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -31,7 +31,12 @@ class Selector { public: /// @name Selector Typedefs typedef std::function routine_action_t; - typedef std::pair routine_t; + + typedef struct routine { + std::string name; + routine_action_t action; + std::string img = ""; + } routine_t; /// @name Selector Functions @@ -59,6 +64,7 @@ class Selector { lv_obj_t *select_cont; lv_obj_t *selected_label; + lv_obj_t *selected_img; lv_obj_t *saved_toast; lv_anim_t anim_toast; diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index b6443fb..50b32c8 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -1,4 +1,6 @@ #include "api.h" +#include "liblvgl/core/lv_obj.h" +#include "liblvgl/extra/layouts/flex/lv_flex.h" #include "robodash/apix.h" #include @@ -11,7 +13,7 @@ void rd::Selector::sd_save() { if (selected_routine == nullptr) { fputs("", save_file); } else { - std::string routine_name = selected_routine->first; + std::string routine_name = selected_routine->name; char file_data[sizeof(routine_name)]; sprintf(file_data, "%s", routine_name.c_str()); @@ -47,13 +49,13 @@ void rd::Selector::sd_load() { } for (rd::Selector::routine_t &r : routines) { - if (strcmp(r.first.c_str(), saved_name) == 0) selected_routine = &r; + if (strcmp(r.name.c_str(), saved_name) == 0) selected_routine = &r; } if (selected_routine != nullptr) { // Update routine label char label_str[sizeof(saved_name) + 20]; - sprintf(label_str, "Selected routine:\n%s", selected_routine->first.c_str()); + sprintf(label_str, "Selected routine:\n%s", selected_routine->name.c_str()); lv_label_set_text(selected_label, label_str); lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); } @@ -67,19 +69,28 @@ void rd::Selector::select_cb(lv_event_t *event) { rd::Selector *selector = (rd::Selector *)lv_obj_get_user_data(obj); if (selector == nullptr) return; + selector->selected_routine = routine; + if (routine == nullptr) { lv_label_set_text(selector->selected_label, "No routine\nselected"); - lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); - } else { - const char *routine_name = routine->first.c_str(); + lv_obj_add_flag(selector->selected_img, LV_OBJ_FLAG_HIDDEN); + return; + } + + const char *routine_name = routine->name.c_str(); - char label_str[strlen(routine_name) + 20]; - sprintf(label_str, "Selected routine:\n%s", routine_name); - lv_label_set_text(selector->selected_label, label_str); - lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); + char label_str[strlen(routine_name) + 20]; + sprintf(label_str, "Selected routine:\n%s", routine_name); + lv_label_set_text(selector->selected_label, label_str); + lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); + + if (routine->img.empty()) { + lv_obj_add_flag(selector->selected_img, LV_OBJ_FLAG_HIDDEN); + return; } - selector->selected_routine = routine; + lv_img_set_src(selector->selected_img, routine->img.c_str()); + lv_obj_clear_flag(selector->selected_img, LV_OBJ_FLAG_HIDDEN); } void rd::Selector::save_cb(lv_event_t *event) { @@ -107,10 +118,27 @@ rd::Selector::Selector(std::vector new_routines) { lv_obj_align(routine_list, LV_ALIGN_BOTTOM_LEFT, 8, -8); lv_obj_add_style(routine_list, &style_list, 0); - selected_label = lv_label_create(view->obj); + // FIXME: Figure out the layout of the image and label + + lv_obj_t *selected_cont = lv_obj_create(view->obj); + lv_obj_add_style(selected_cont, &style_transp, 0); + lv_obj_set_layout(selected_cont, LV_LAYOUT_FLEX); + lv_obj_set_size(selected_cont, 240, 240); + lv_obj_align(selected_cont, LV_ALIGN_CENTER, 120, 0); + lv_obj_set_flex_align( + selected_cont, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER + ); + lv_obj_set_flex_flow(selected_cont, LV_FLEX_FLOW_COLUMN); + + selected_label = lv_label_create(selected_cont); lv_label_set_text(selected_label, "No routine\nselected"); lv_obj_add_style(selected_label, &style_text_centered, 0); - lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); + + selected_img = lv_img_create(selected_cont); + lv_obj_set_size(selected_img, 168, 168); + // lv_obj_set_style_bg_opa(selected_img, LV_OPA_COVER, 0); + // lv_obj_set_style_bg_color(selected_img, lv_color_hex(0xff0000), 0); + lv_obj_add_flag(selected_img, LV_OBJ_FLAG_HIDDEN); lv_obj_t *nothing_btn = lv_list_add_btn(routine_list, NULL, "Nothing"); lv_obj_add_event_cb(nothing_btn, &select_cb, LV_EVENT_PRESSED, nullptr); @@ -160,7 +188,7 @@ rd::Selector::Selector(std::vector new_routines) { } for (routine_t &routine : routines) { - lv_obj_t *new_btn = lv_list_add_btn(routine_list, NULL, routine.first.c_str()); + lv_obj_t *new_btn = lv_list_add_btn(routine_list, NULL, routine.name.c_str()); lv_obj_add_style(new_btn, &style_list_btn, 0); lv_obj_add_style(new_btn, &style_list_btn_pr, LV_STATE_PRESSED); lv_obj_set_user_data(new_btn, this); @@ -174,7 +202,7 @@ rd::Selector::Selector(std::vector new_routines) { void rd::Selector::run_auton() { if (selected_routine == nullptr) return; // If commanded to do nothing then return - selected_routine->second(); + selected_routine->action(); } void rd::Selector::focus() { rd_view_focus(this->view); } \ No newline at end of file From 2538163255cefcbb4c7e8d02640040c06ed72595 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 15:56:31 -0500 Subject: [PATCH 06/25] Update styles Apparently a trailing comma makes vectors act how I want them to --- .clang-format | 2 -- 1 file changed, 2 deletions(-) diff --git a/.clang-format b/.clang-format index 857de7f..1f1f52f 100644 --- a/.clang-format +++ b/.clang-format @@ -6,6 +6,4 @@ UseCRLF: false ColumnLimit: 100 AllowShortIfStatementsOnASingleLine: WithoutElse AlignAfterOpenBracket: BlockIndent -AlignArrayOfStructures: Left AlwaysBreakTemplateDeclarations: "MultiLine" -AlwaysBreakTemplateDeclarations: true From e703665fffeb131ca6ffdb1554404562ead12d5a Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 15:56:48 -0500 Subject: [PATCH 07/25] Update style --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index baeff1b..64a77f1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,9 +11,9 @@ void good_auton() { std::cout << "Running good auton" << std::endl; } // Create robodash selector rd::Selector selector({ - {"Best auton", &best_auton }, + {"Best auton", &best_auton}, {"Simple auton", &simple_auton}, - {"Good auton", &good_auton } + {"Good auton", &good_auton}, }); // Create robodash console From 7f2a42509f5e261c767575084ad78beb22cc870d Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 15:57:40 -0500 Subject: [PATCH 08/25] Remove bug comment --- include/robodash/views/selector.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index 290f501..5326fd5 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -43,7 +43,6 @@ class Selector { /** * @brief Create autonomous selector * @param autons Vector of autonomous rotuines - * @bug Multiple selectors cannot be active at the same time. */ Selector(std::vector autons); From f2859eb26a76bb9a3574a31c10ff84643cb53782 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 16:07:39 -0500 Subject: [PATCH 09/25] Allow optional custom selector names with constructor delegation --- include/robodash/views/selector.hpp | 7 +++++++ src/robodash/views/selector.cpp | 7 +++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index 5326fd5..48d7db2 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -40,6 +40,13 @@ class Selector { /// @name Selector Functions + /** + * @brief Create autonomous selector + * @param name Name of the autonomous selector + * @param autons Vector of autonomous rotuines + */ + Selector(std::string name, std::vector autons); + /** * @brief Create autonomous selector * @param autons Vector of autonomous rotuines diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 50b32c8..478d597 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -1,3 +1,4 @@ +#include "selector.hpp" #include "api.h" #include "liblvgl/core/lv_obj.h" #include "liblvgl/extra/layouts/flex/lv_flex.h" @@ -105,11 +106,13 @@ void rd::Selector::save_cb(lv_event_t *event) { // ============================== Constructor ============================== // -rd::Selector::Selector(std::vector new_routines) { +rd::Selector::Selector(std::vector autons) : Selector("Auton Selector", autons) {} + +rd::Selector::Selector(std::string name, std::vector new_routines) { // ----------------------------- Create UI ----------------------------- // - this->view = rd_view_create("Auton Selector"); + this->view = rd_view_create(name.c_str()); lv_obj_set_style_bg_color(view->obj, color_bg, 0); From 8792d56d40d401f81959862be11d001adbe4b442 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 16:33:28 -0500 Subject: [PATCH 10/25] Remove unnecessary includes --- src/robodash/views/selector.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 478d597..63d3536 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -1,7 +1,5 @@ #include "selector.hpp" #include "api.h" -#include "liblvgl/core/lv_obj.h" -#include "liblvgl/extra/layouts/flex/lv_flex.h" #include "robodash/apix.h" #include From cee4f0951c7e0134d30ba14d36d2334e6130222e Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 21:15:00 -0500 Subject: [PATCH 11/25] Use strlen instead of sizeof in sd card functions --- src/robodash/views/selector.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 63d3536..24aa0af 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -12,10 +12,10 @@ void rd::Selector::sd_save() { if (selected_routine == nullptr) { fputs("", save_file); } else { - std::string routine_name = selected_routine->name; + const char *routine_name = selected_routine->name.c_str(); - char file_data[sizeof(routine_name)]; - sprintf(file_data, "%s", routine_name.c_str()); + char file_data[strlen(routine_name)]; + sprintf(file_data, "%s", routine_name); fputs(file_data, save_file); } @@ -53,7 +53,7 @@ void rd::Selector::sd_load() { if (selected_routine != nullptr) { // Update routine label - char label_str[sizeof(saved_name) + 20]; + char label_str[strlen(saved_name) + 20]; sprintf(label_str, "Selected routine:\n%s", selected_routine->name.c_str()); lv_label_set_text(selected_label, label_str); lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); From 65a3f64a3471e594023e8dfdfb49bf4acb7653fc Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Fri, 22 Dec 2023 22:44:13 -0500 Subject: [PATCH 12/25] fixme comment --- src/robodash/views/selector.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 24aa0af..ac0962b 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -5,6 +5,8 @@ // ============================= SD Card Saving ============================= // +// FIXME: SD card saving doesnt work properly with multiple selectors + void rd::Selector::sd_save() { FILE *save_file; save_file = fopen("/usd/rd_auton.txt", "w"); From 78f79d063774254aa9a76b8f97ca5386e04a8f58 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 01:28:31 -0500 Subject: [PATCH 13/25] Make sd card saving support multiple selectors --- include/robodash/views/selector.hpp | 1 + src/robodash/views/selector.cpp | 78 ++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 23 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index 48d7db2..a366ff9 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -74,6 +74,7 @@ class Selector { lv_obj_t *saved_toast; lv_anim_t anim_toast; + std::string name; std::vector routines; rd::Selector::routine_t *selected_routine = nullptr; diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index ac0962b..572e344 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -3,22 +3,50 @@ #include "robodash/apix.h" #include -// ============================= SD Card Saving ============================= // +const char *file_name = "/usd/rd_auton.txt"; -// FIXME: SD card saving doesnt work properly with multiple selectors +// ============================= SD Card Saving ============================= // void rd::Selector::sd_save() { FILE *save_file; - save_file = fopen("/usd/rd_auton.txt", "w"); - if (selected_routine == nullptr) { - fputs("", save_file); - } else { - const char *routine_name = selected_routine->name.c_str(); + // Ensure the file exists + save_file = fopen(file_name, "a"); + fclose(save_file); + + // Open in read mode + save_file = fopen(file_name, "r"); + if (!save_file) return; + + // Get file size + fseek(save_file, 0L, SEEK_END); + int file_size = ftell(save_file); + rewind(save_file); + + char new_text[file_size]; + char line[256]; + char saved_selector[256]; - char file_data[strlen(routine_name)]; - sprintf(file_data, "%s", routine_name); + new_text[0] = '\0'; // THIS IS VERY IMPORTANT + + // Find and remove keys for our selector + while (fgets(line, 256, save_file)) { + sscanf(line, "%[^:] \n", saved_selector); + if (saved_selector == this->name) continue; + strcat(new_text, line); + } + + fclose(save_file); + save_file = fopen(file_name, "w"); + fputs(new_text, save_file); + // Write save data + if (selected_routine != nullptr) { + const char *selector_name = this->name.c_str(); + const char *routine_name = selected_routine->name.c_str(); + + char file_data[strlen(selector_name) + strlen(routine_name) + 2]; + sprintf(file_data, "%s: %s\n", selector_name, routine_name); fputs(file_data, save_file); } @@ -27,24 +55,23 @@ void rd::Selector::sd_save() { void rd::Selector::sd_load() { FILE *save_file; - save_file = fopen("/usd/rd_auton.txt", "r"); + save_file = fopen(file_name, "r"); if (!save_file) return; - // Get file size - fseek(save_file, 0L, SEEK_END); - int file_size = ftell(save_file); - rewind(save_file); - // Read contents - char saved_name[file_size]; - fscanf(save_file, "%[^\n]", saved_name); - fclose(save_file); + char line[256]; + char saved_selector[256]; + char saved_name[256]; - // None selected condition - if (strcmp(saved_name, "") == 0) { - lv_label_set_text(selected_label, "No routine\nselected"); - lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); + while (fgets(line, 256, save_file)) { + sscanf(line, "%[^:]: %[^\n\0]", saved_selector, saved_name); + if (saved_selector == this->name) break; + } + fclose(save_file); + + // None selected or not our selector + if (strcmp(saved_name, "") == 0 || saved_selector != this->name) { selected_routine = nullptr; return; } @@ -59,6 +86,11 @@ void rd::Selector::sd_load() { sprintf(label_str, "Selected routine:\n%s", selected_routine->name.c_str()); lv_label_set_text(selected_label, label_str); lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); + + if (selected_routine->img.empty()) return; + + lv_img_set_src(this->selected_img, selected_routine->img.c_str()); + lv_obj_clear_flag(this->selected_img, LV_OBJ_FLAG_HIDDEN); } } @@ -108,7 +140,7 @@ void rd::Selector::save_cb(lv_event_t *event) { rd::Selector::Selector(std::vector autons) : Selector("Auton Selector", autons) {} -rd::Selector::Selector(std::string name, std::vector new_routines) { +rd::Selector::Selector(std::string name, std::vector new_routines) : name(name) { // ----------------------------- Create UI ----------------------------- // From 55bd5a13a79f5f3012f83214bf3f407928413728 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 13:16:15 -0500 Subject: [PATCH 14/25] Remove manual SD saving, adjust UI Autons will be saved automatically now, SD card icon indicates if SD is installed --- include/robodash/views/selector.hpp | 3 -- src/robodash/views/selector.cpp | 57 ++++++----------------------- 2 files changed, 11 insertions(+), 49 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index a366ff9..9142b0d 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -71,8 +71,6 @@ class Selector { lv_obj_t *select_cont; lv_obj_t *selected_label; lv_obj_t *selected_img; - lv_obj_t *saved_toast; - lv_anim_t anim_toast; std::string name; std::vector routines; @@ -82,7 +80,6 @@ class Selector { void sd_load(); static void select_cb(lv_event_t *event); - static void save_cb(lv_event_t *event); }; } // namespace rd \ No newline at end of file diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 572e344..42046a0 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -103,6 +103,7 @@ void rd::Selector::select_cb(lv_event_t *event) { if (selector == nullptr) return; selector->selected_routine = routine; + selector->sd_save(); if (routine == nullptr) { lv_label_set_text(selector->selected_label, "No routine\nselected"); @@ -126,16 +127,6 @@ void rd::Selector::select_cb(lv_event_t *event) { lv_obj_clear_flag(selector->selected_img, LV_OBJ_FLAG_HIDDEN); } -void rd::Selector::save_cb(lv_event_t *event) { - lv_obj_t *obj = lv_event_get_target(event); - rd::Selector *selector = (rd::Selector *)lv_obj_get_user_data(obj); - if (selector == nullptr) return; - selector->sd_save(); - - lv_obj_clear_flag(selector->saved_toast, LV_OBJ_FLAG_HIDDEN); - lv_anim_start(&selector->anim_toast); -} - // ============================== Constructor ============================== // rd::Selector::Selector(std::vector autons) : Selector("Auton Selector", autons) {} @@ -150,11 +141,9 @@ rd::Selector::Selector(std::string name, std::vector new_routines) : lv_obj_t *routine_list = lv_list_create(view->obj); lv_obj_set_size(routine_list, 228, 192); - lv_obj_align(routine_list, LV_ALIGN_BOTTOM_LEFT, 8, -8); + lv_obj_align(routine_list, LV_ALIGN_TOP_LEFT, 8, 40); lv_obj_add_style(routine_list, &style_list, 0); - // FIXME: Figure out the layout of the image and label - lv_obj_t *selected_cont = lv_obj_create(view->obj); lv_obj_add_style(selected_cont, &style_transp, 0); lv_obj_set_layout(selected_cont, LV_LAYOUT_FLEX); @@ -165,16 +154,14 @@ rd::Selector::Selector(std::string name, std::vector new_routines) : ); lv_obj_set_flex_flow(selected_cont, LV_FLEX_FLOW_COLUMN); - selected_label = lv_label_create(selected_cont); - lv_label_set_text(selected_label, "No routine\nselected"); - lv_obj_add_style(selected_label, &style_text_centered, 0); - selected_img = lv_img_create(selected_cont); lv_obj_set_size(selected_img, 168, 168); - // lv_obj_set_style_bg_opa(selected_img, LV_OPA_COVER, 0); - // lv_obj_set_style_bg_color(selected_img, lv_color_hex(0xff0000), 0); lv_obj_add_flag(selected_img, LV_OBJ_FLAG_HIDDEN); + selected_label = lv_label_create(selected_cont); + lv_label_set_text(selected_label, "No routine\nselected"); + lv_obj_add_style(selected_label, &style_text_centered, 0); + lv_obj_t *nothing_btn = lv_list_add_btn(routine_list, NULL, "Nothing"); lv_obj_add_event_cb(nothing_btn, &select_cb, LV_EVENT_PRESSED, nullptr); lv_obj_set_user_data(nothing_btn, this); @@ -187,35 +174,13 @@ rd::Selector::Selector(std::string name, std::vector new_routines) : lv_obj_align(title, LV_ALIGN_TOP_LEFT, 8, 12); if (pros::usd::is_installed()) { - saved_toast = lv_label_create(view->obj); - lv_label_set_text(saved_toast, "Saved to SD"); - lv_obj_add_style(saved_toast, &style_text_centered, 0); - lv_obj_add_style(saved_toast, &style_text_small, 0); - lv_obj_align(saved_toast, LV_ALIGN_BOTTOM_RIGHT, -16, -16); - lv_obj_add_flag(saved_toast, LV_OBJ_FLAG_HIDDEN); - - lv_obj_t *save_btn = lv_btn_create(view->obj); - lv_obj_set_size(save_btn, 64, 32); - lv_obj_align(save_btn, LV_ALIGN_BOTTOM_RIGHT, -172, -8); - lv_obj_add_event_cb(save_btn, &save_cb, LV_EVENT_PRESSED, NULL); - lv_obj_add_style(save_btn, &style_btn, 0); - lv_obj_add_style(save_btn, &style_btn_outline, 0); - lv_obj_add_style(save_btn, &style_btn_outline_pr, LV_STATE_PRESSED); - lv_obj_set_user_data(save_btn, this); - - lv_obj_t *save_img = lv_img_create(save_btn); - lv_img_set_src(save_img, LV_SYMBOL_SAVE); - lv_obj_set_align(save_img, LV_ALIGN_CENTER); + lv_obj_t *save_icon = lv_label_create(view->obj); + lv_obj_add_style(save_icon, &style_text_medium, 0); + lv_obj_add_style(save_icon, &style_text_centered, 0); + lv_label_set_text(save_icon, LV_SYMBOL_SD_CARD "\nSD"); + lv_obj_align(save_icon, LV_ALIGN_BOTTOM_MID, 16, -8); } - lv_anim_init(&anim_toast); - lv_anim_set_var(&anim_toast, saved_toast); - lv_anim_set_time(&anim_toast, 255); - lv_anim_set_delay(&anim_toast, 3000); - lv_anim_set_exec_cb(&anim_toast, &anim_text_opa_cb); - lv_anim_set_deleted_cb(&anim_toast, &anim_del_cb); - lv_anim_set_values(&anim_toast, 255, 0); - // ----------------------------- Add autons ----------------------------- // for (routine_t routine : new_routines) { From 9d2140ab6d14d6073edd2d4e954787028eb79c28 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 13:18:11 -0500 Subject: [PATCH 15/25] Init selected routine in implementation Also dont use initializer list, not as readable --- include/robodash/views/selector.hpp | 2 +- src/robodash/views/selector.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index 9142b0d..c9db1b5 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -74,7 +74,7 @@ class Selector { std::string name; std::vector routines; - rd::Selector::routine_t *selected_routine = nullptr; + rd::Selector::routine_t *selected_routine; void sd_save(); void sd_load(); diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 42046a0..778a7e7 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -131,7 +131,9 @@ void rd::Selector::select_cb(lv_event_t *event) { rd::Selector::Selector(std::vector autons) : Selector("Auton Selector", autons) {} -rd::Selector::Selector(std::string name, std::vector new_routines) : name(name) { +rd::Selector::Selector(std::string name, std::vector new_routines) { + this->name = name; + this->selected_routine = nullptr; // ----------------------------- Create UI ----------------------------- // From 1a3a4201c2474c7eb54b1d365d4d46dcdd03ed56 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 13:40:02 -0500 Subject: [PATCH 16/25] Dont attempt to display image if SD not installed --- src/robodash/views/selector.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 778a7e7..1530401 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -87,7 +87,7 @@ void rd::Selector::sd_load() { lv_label_set_text(selected_label, label_str); lv_obj_align(selected_label, LV_ALIGN_CENTER, 120, 0); - if (selected_routine->img.empty()) return; + if (selected_routine->img.empty() || !pros::usd::is_installed()) return; lv_img_set_src(this->selected_img, selected_routine->img.c_str()); lv_obj_clear_flag(this->selected_img, LV_OBJ_FLAG_HIDDEN); @@ -118,7 +118,7 @@ void rd::Selector::select_cb(lv_event_t *event) { lv_label_set_text(selector->selected_label, label_str); lv_obj_align(selector->selected_label, LV_ALIGN_CENTER, 120, 0); - if (routine->img.empty()) { + if (routine->img.empty() || !pros::usd::is_installed()) { lv_obj_add_flag(selector->selected_img, LV_OBJ_FLAG_HIDDEN); return; } From ba9a8b350c39e8328597ab30b3decac7a58f18c0 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 13:58:25 -0500 Subject: [PATCH 17/25] Prepend routine image source with drive letter if present --- src/robodash/views/selector.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index 1530401..a976b87 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -186,6 +186,10 @@ rd::Selector::Selector(std::string name, std::vector new_routines) { // ----------------------------- Add autons ----------------------------- // for (routine_t routine : new_routines) { + if (!routine.img.empty()) { + routine.img.insert(0, "S:"); + } + routines.push_back(routine); } From a797b64a8adf83b3be33f54fc47515786a420b5c Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 13:59:27 -0500 Subject: [PATCH 18/25] Update description --- include/robodash/views/selector.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/robodash/views/selector.hpp b/include/robodash/views/selector.hpp index c9db1b5..e667c7e 100644 --- a/include/robodash/views/selector.hpp +++ b/include/robodash/views/selector.hpp @@ -17,8 +17,9 @@ namespace rd { * @brief A function selector * @image html selector.png * - * A function selector for easily managing autonomous routines. Supports saving a configuration to - * an SD card, and automatically loading it on the next run. + * A function selector for easily managing autonomous routines. If available, automatically saves + * the current configuration to an SD card and loads it on the next run. Also supports displaying + * images from the SD card. */ /** From a86e62c5cb7381bdfe004f9201bef5b23709ca16 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 14:09:34 -0500 Subject: [PATCH 19/25] Remove custom letter space --- src/robodash/styles/text.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/robodash/styles/text.c b/src/robodash/styles/text.c index b3cefbc..fbb2046 100644 --- a/src/robodash/styles/text.c +++ b/src/robodash/styles/text.c @@ -21,14 +21,12 @@ void _init_style_text() { lv_style_set_text_color(&style_text_small, color_text); lv_style_set_text_opa(&style_text_small, LV_OPA_COVER); lv_style_set_text_font(&style_text_small, &lv_font_montserrat_12); - lv_style_set_text_letter_space(&style_text_small, 1); // Medium text lv_style_init(&style_text_medium); lv_style_set_text_color(&style_text_medium, color_text); lv_style_set_text_opa(&style_text_medium, LV_OPA_COVER); lv_style_set_text_font(&style_text_medium, &lv_font_montserrat_14); - lv_style_set_text_letter_space(&style_text_medium, 1); // Large text lv_style_init(&style_text_large); From da825ea6fe94ab9333573488460ec7e5b2b03c71 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 14:19:42 -0500 Subject: [PATCH 20/25] Add text style to selected label --- src/robodash/views/selector.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/robodash/views/selector.cpp b/src/robodash/views/selector.cpp index a976b87..ec1bd4c 100644 --- a/src/robodash/views/selector.cpp +++ b/src/robodash/views/selector.cpp @@ -1,6 +1,7 @@ #include "selector.hpp" #include "api.h" #include "robodash/apix.h" +#include "robodash/impl/styles.h" #include const char *file_name = "/usd/rd_auton.txt"; @@ -163,6 +164,7 @@ rd::Selector::Selector(std::string name, std::vector new_routines) { selected_label = lv_label_create(selected_cont); lv_label_set_text(selected_label, "No routine\nselected"); lv_obj_add_style(selected_label, &style_text_centered, 0); + lv_obj_add_style(selected_label, &style_text_medium, 0); lv_obj_t *nothing_btn = lv_list_add_btn(routine_list, NULL, "Nothing"); lv_obj_add_event_cb(nothing_btn, &select_cb, LV_EVENT_PRESSED, nullptr); From ba72790c3f8516b3e4cb9c6c7aa6732ad0a050ac Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 14:21:50 -0500 Subject: [PATCH 21/25] Update example images --- docs/assets/alert.png | Bin 11427 -> 10980 bytes docs/assets/alert_button.png | Bin 12125 -> 11979 bytes docs/assets/selector.png | Bin 10632 -> 10205 bytes docs/assets/view_button.png | Bin 12247 -> 12097 bytes docs/assets/view_selector.png | Bin 13441 -> 13323 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/alert.png b/docs/assets/alert.png index 0203c09502c9967d3e3919697ab1aeed648f6ad5..1f941cea0e4bb699ec00595b22bdcf9246b58969 100644 GIT binary patch literal 10980 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 literal 11427 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 XC)+cFpl=iY$*-)Wl0>nXzW@IM9sdq$ diff --git a/docs/assets/alert_button.png b/docs/assets/alert_button.png index 2ac95e517291c290052c3ce35810ebb2d4b52d3b..610644f5b9e2deca47fe4a89e67f3396854f5fe6 100644 GIT binary patch literal 11979 zcmd6Nc|6qb*Y}vFq6kA2m0hxD&91UD*>|EOJ7XDyv9wFbGGkvt#MpOZt%%5OtYazr z$iDB-XXyL;{hsH3?)&eX*Ne~0wVmr+*E#2X-scmn^+1{80>cFm2t=W(qM!o;kxT&3 zE2QUuzk`ShEbtFva~F0O1S$%@c<|^f@R`|4MF$1~`EY_jfiFRzJ>aXrIS>dT2m%o- zK_JOk5QrY0h}D(`8nmp9RG-3NAa3B96a*%Lg3bU>B)~7|jU5Pb@(cn2GXXzmQc3>Z znhO4>m1H9I%sd*a0N%EeSk2 zS$jNU_I7e~c9-;)VLj;~2|N?O7GPyQ>Ehua!)gT6V!rR^>ZqxwYS~BS8{g$yDeaY0>l=9 z+x&t8|G!}#c2EDCVZ@fxVJG`KT~3-fnWUDTx3#0Of}NAKvpXP~tdNMH^vN>+rRCp( z{>Mn8e~%Qo^M8%}kCy*;*5xf7F z@Ba3e79eW%KeT*$geTtuXDE9?THs&zLG}VIV`B*j#8acHa97WpWHE{Iz5YPbIOR}d zQR(0d8sA!~Z;pM9V}pXjrLIq?w8YD&?go|$F@|4syg1^+D|k6y`tg_OzB2k3RQW%- zUo&7{p#ptsnoKTJS^XHpl0R>$9#J^6g?7yOLvC!7BzfD)ljA1ld+qp{`dQ(a{juup z!>Z-FZCT~`s_jwVj^%@n*^Zj!!zAA&iQdd{p>-?e=O73(h=f$0*$|x4Q6|Ryg7`To zj19h<$wXfc6ZaD=DXc^06ej<=a@sNV1sN5I*GkhTJE}ksWQ|=b!?vVFyULsfGN@Ac z>SXk5=ngKy1u-z*)vJ{-{T}J@tmp7>e;FkuGwrQ?kap3h)%w?&li5U`H^6F-xx`md z^-v$2G2i7M0+7mK+;8cV)+el~r0cpVdngTSh6rOs&XQZUtv^e{bUtk}3sL4&PVh5? z)J+M)>?O6?NJr5%Bb`xFI2)POMKDn|<`0n|a3Yj;=wyQ+a435N*PK#MBi+g5rPqTB zj{04y0?KAAumK0Sg3PtU0OWS{k{r_k+xF-(Qb7O6Esko!?a7@>z*-=%`CaCaoeOWt zHeWYWPvq~M`4~Z51RK;q(VMmZ^x;u;eOq1?=jV$@^R?Lo>2=nU3xj-4^$o`mhgo>lqa-=%mOsS$yW_(3bfX-W~ci8M#0DLVbU9 zWcIt;HU_sjJ2r7CudoLZy|VQ)_SadXsdfPy%o-hPMa59El0{lNsEx_t)=jIGM-@kYBi z&y3yoA5X)>9^lUARUZmxX`1)Sjvh9%ffT==zf}LHIu-}pJ{Y6dMd)VnW%(7`ng1ft zrPRYCwqg74{80~OZvRGVjk&2tyhq$LslZ~JCw~w^m<+e8TW^`@>o$T(wtGwK8=~y?m(f}8NrJ%%l=$reMUit{+~I|;v-nDU3cn4@;FVu zK&eh@a+B2EkzG1B;KD@)llTU`M>ZZRBaAO^Pr$41KZIZO;N9yf*f<+io;aPr7+i?` z>a{$$WG>UU** zA1sU3$(63D8P?&l8E?2IzITQyEA!OF%<~`q&`1Nekj|2tmmk znY@Ts)2)l@u^V0=9kT0bc0Fb`J|FuAkN3S2lTP@YIP1OhK@Mj-&TZb@6$6)B5N+F& zgZ4McLL`G5=zB<4eiB$m!!&ddcU|6NM`&HSu!%JuKLWJF67S5^H-1xE4o++LHY}^_ zx;#YgG-gsh!tYdN!}_SNz2PuqCME|LQ<1E#ZnV)fN`oxonQyBZ7M=)QI6oTB$*ETE zs0{3EdvEA-hubD5RJAT-L0HO5kvAMR59eh?p=kYC2?OID`SkIj!4sMeNcq+{OUmnrL@vveeMm2{Q*0dx}fr{IL3P( zmfTquIc7rE8sxXMFLYt4<*F*MTbIcf@a4e;h7xDAYJ=@>fc zNL<%_X`g+yE^aY*q;!CH;aJ5$u7xtllhv}|y8ha(_;Tepy9|%4PkPjaq9)xR6czS* z^rk*8jaSbiKW&_~@3hR*sKmuMnsF_LRG3J#8S>>&EMUq7BJ}l~EPmtG27KxwmpK(U zJq?r-qmW{z<*?ro{h8QG6mLL{Gv-^lF+s?5x*WT!T~Put3b?OEVCjOj@)R+?stjHE z4v5vXpuRtpA2D6gIg{>$Im|PaDEUSQPExb%rO~VuG4HZJPCnjA+@F!N7^0<(A2IH9 z7X60OVH;cBe4TU9%HHsi57C>QU|_)srQGk)5}*Bn={AYA*hk-#c5co=mH0v1*jY%O zGDio5RS=6gA)^YmKYFH*P?)aQ1OqQS=_W;C|1nv^wNXc-LxarW@~dKPxVTUGyt(Y9 zdl7=!=Pj9i=<=PnC~pd&oHtr`pEM^-Ck(kv_50;*RgASr7M%@ZrBR_dj6b$}HN0js zWdG>wC*Cukiw6Z_#8DuJXqz4Bp7*NcD9&^N4Mh$gSv(V&Q4P<7h^JS|jGj4hWZJdf zN?{_WlUWW`R$*v-(y7IlQ)0`O%Y%>6gzAqf3<~2`{3;8+7@z45s@zc*{Cz9i-(k}7 z`SLpuDtAH3xd1==bkI@3+}LQIK{a~As+Nc0uA?}|^Z{A8&94tl6&VXx`c2#FcH=h# zGSFDAGeMrrT}(3Z8Y5+XyKB>#qN*4MTy^0+z7GA%mSiZUa|^Rmt5%=pbgA2(D~252 zrZH5EBs}O#=)NOwZo`1V@0H7hcV%;2 z&ILWdHh2v!hOs@x#lif4Tv}suj&jA>LbqVD(bZv+hME_U?Q3#6nn}^G16ug4#vpbTyFZ8C1AP z+ML#|-uH*Tx3t3+Gx+FdN`|VQ*tfR^>Cp19L=8HK6k~hJ%&H%Fn_RL(Mjg5h+w10a$>v$5j zy?k`2yEyn#Lsm1vzwKwZFp63D6hJXE1K5g3`ws<^+12cWU4ingvX3c8EBpLQQTTR( zVgFrY+*(_Kp#I|XOTs0TC(wgxjt;!q-EB9VCuFCKz6zv@ip|>3EW9tAQkcT5TS+-9IAF(67dTa7nlT6Noq*K^iK!o26L|;c7lLdK{L>u zxiyrXbAqXQ@unKWP%_3b&s8~!pcKg1Os{@|rl_cQ_P58~>kp=n+mc=p^hT$3x)1IJ zwwd1wI|VoG5ZNooa{RXlm?2Bl^Bi@Afx6;ah;|n)pKkUay!P%6k79=CRVVq6X*-G# zd|*g0*@+%D~u}*ZFc_r=l zB(39f$Hw8pvfH~ezRDC-b2{J{|1I6^r5%fErW*H-!*2rq-JfV}J*%k-6|W38ji>Fz z`G{sD1Ryg_;p1nPT)qd)eLp7bFCA{n8hTw|`!6j+lr{1r6|K2kFXq@;% z_vK^0W0xd1C%f~I_ww8%=pBEj?%Jh43k6j_DE*&W58VTSVVqs=y|eg(eI|H->>ej8 z{z-rA8~HIvj_etOiV{|fM)76!`$#JI(QCtF-#wejo|i76%&9HgOPa?$#~$}-&GZ8qNiH*<=nxcS z5Bb_6jxR9CH}7O?SoE1*VI)G+^VEfN1MwLumA&bfkimR0)01*}>f=+m+C%eJx!$1ow6DnDzGOja5ze37`CQ9`P^=9UFN1HL%+aEhYPR8EASrP{ zDR7ay6+sZ}YA_-ujJnm0B~2s}U|}<+`61l`R36kcm21PfZa7rVc`r ztxSDVcOIF6Ia}iF4OMg5pWinv$Npk_gO5j@S(*yAT8c}mu34GC;A|#0_nMN)jlQ}0 z1cxIpF2}h&is3a~qT@CDQ&(mkRp7Ff_|Qx6T@8j~S5yj02-WteaUHcR4RDf>u|T^B zEc$-g7lZD4uCx^DdT9R50QFeAiur9NHr3d3+-EnR-9_%>V|z7YX|vTxIRe>khVARx zXoh1c({0K*{p8|f;ZadB2UXtBu19yh8O67*6N0Ik&SD&^GTa;tWy~azw_6#}Q7+K! zN*5n=jm`Lxj)dpmG)xs@LPwGy{7$1YJajkz*G?*La7kov0ZLmW*JA*;?kR2O%L)A> z7^lLMmKU9a;+ZwY52zvFmrf208zbL#)@W`ZpJBz&QuCeR>*(A3eRc5f7BXaPg}t$# z%gh)?rh&ujAM+;b9x*#b}1Z2@z!>36)wSbRXat!L|xMA=xE z)!Bj7PKm1fqNh&gDa2%t{LT}O+qhI-io%|CLk^jA9Ee9oceK{3I%aAy* zQ9`*!QgdN9EcIMClzvH2koVf!)n3xKi$)l|Mv`W*G#o!>P@A&z0*{tnx&M)M!gK#y zcOxUgUiPZu#Je8RVjr$}y7ixPw;C%(`8kgOw?)+w2LhX&ha>J{_Knjp{I-bjh0EEq zp0cKI^xqNN1Lei33q4I&IZ7IX2icu#60+7!yJF%0lrDzZsZ*tW4 zH`!JLku3FG)GRseS_Yw-=wHk7Jh5}Y)04tu9(u=9oY;LHuzm$vuIw}j#XxOa%(_fC zLm?!jeaeB>ato8n^Bv6aZ|8-j(pheqbW@Scgs`2pD<*mjz^Q=29(T_R4xTtAz`ZDf zNIF79HviQ~3J1L~KUpc)#RE-P8#EpLdjOWetF@Ep57V2K z@dvL$7=}G@n|pIZuZMG=@GkFh?|zjy*&Y{vkY+_|*$?#?{IEV{Oiq1KRx?Gu@6YSf zLVuP_y~Fpr8x`iSN&UT(57@dQNe7whkj_7cI){4GohSE{53{S*_jp6bxpVYh=6;sA zrAA~cl&d5Q{5qGB-Kt$EFZkg(@#=~SS|`oh*Zj1m@(x@X(TcNE%CXJ~!p*bw3pw>T zf-gJvidpW-Uu^4Y97W|<-7q76*!tC#neyWYiZGzYN^p33XdIC zA7h`)yKU$3CEx*KBHca9FWS)@2d$Uc->L>2=)tpT-95OQ5Om|NxZlo)Y9Q_Iyj9E} zLyHUtveN$CYb%I(PD@QaFSK5^EZIUAI&Vx9=PH!5061JVr*fZj26>((Y+rEgE#DC@ zy8R2JyuAk>{0(E5SOBj%mwZ*&kNwJQWx#Sptv8{PwVtC5tvMfQ(3mSy`V360Z1V45P2xn$CRX_^oxGKbH*AKU5lU*ONI=7|q2Gg=$*u;)(}Y)el?= z%XMQ$0|!l?DGHLWtn$vGJKaQEE&?h@9fX*0Hmuq-d@W@roI^9KdOQqfHCcG)FG@I~ zh-w^(OzZ!MG4F#`tUnA4M=9Xf^hdbU(4Tqs$fFud9{wuvjNOSxDlXa=IJ5rw&ieic z)fvVE%^#q|#PFTkVzPW2#0VztdYgQY_v6*K$)Re2d@@%QvG3@jBE!b(ZR-}ovDvkO z%8zsN%@Kypi#JgNw-Et6!}=S1+R?D!$I{@X`CWw_ef}fk=3;hSg4pJhmV|!J-BaX= zfLvH7zoTIJINjDjwKI_8-B!BQa76}^Y-_UHy_c9>r|haV_GT6`nrc6_9dR^Eyi(68 ziJr((?Y~4pcQI=CQ}mV+3vZh&AZ(BbMC606m7PixTbB+AdSxga8z@Su-l=x^6}Kw6 z=v%eXQih;hX$Fa0>P9hA^%T)PBU7mY?M_Y~*_<$0^@EKlT0}f3-nK2vChe~7BOSwS zAXBPkk`%CT>N1KI$d+|@b1o$N{ehluU;e06`J1L8!0VaFH;k34?D-eE^TBy^QES3> z9cMyqv_W^dZv>$ccNZk`&(Xh9O-FI4{7PjHweM#NZ`3ZJogXTKn7oLM7U3SoCR_J9 z8qt?0SF1I0_;2BdAOi%0Moh#HsQEFut+0t}7)6PXy-(?3~@YfKX^ zj@+glrE1X}5|+Eq_y_QKyEI+f%|UaaXDF8bWMm}Y)wxZkaguNFRFywoOqKGn%xTeU z?F4K*RRXeO;dsf=SbyU)qXWli;mE@Ky;< z-+0k<^9LD5ZT~@lkA&05fH!oYgYm6G3r@uha#T&yu^NW#gbCBCmd3X{v z!}x(>9p)}*Yht#qEsm_gNI4}vXD1t>f2G7FPnQ-#^miIJMl?D8hUb))b^8kp;#Z+B= zQTG!n_BI2`B0taxcPU&hue`^%Fq3&p*Ew$jerSPU{uRE>o&q%{$`x`Z0|SkQot|YrU8uNp&I8u%^Wo&xqCDqY`5&fa zzVE-#&+s+J&|TO;jGr&+bJfSPqvZ)K#nIsR&2TiDl{QYK9Hrbw@w$9k_?88rp}LxE z3NV$eFu1&N0w8Wzk{!ZqVU*c=ZP+Ti)@V~6?>q4fy6Yl59C^nH{pF2blh`jhQXNXv zwa#23+rqcxfGPZQvw?ij_CDBz{E_W?lt0XjtRPMMdX(j>g_+l|i}Y~Pa0fZq)i$ep zE@B#fi|&37)1_f9vG)RaHSt@jWi%w0ibRo2B+inLxdEdXjthLbb)>kCtSG?-aeOCS z@Q2$4WE+>|0;zqR&MSRS`ywZEg1&}3HVEQPksTy>`z&yaIZ1+}43vDNea7}S>!e1T zR$c2Kz)y5+_3Zb;B}_<_PO%%Rf3-~7b;Kth)*91LV784Bm)6g2m8##<#9R0;3vgTi zx&~IZ5YVp!HjahXm*tx#Fo^p(rb4SG*@>o6V<2YCkmvu|2J@OIQ3AjRWZa+lMw@vQ+ zQn24uqs{82^W*gsbsqbROE=}7bsmnV9I&Gn1(3U*+XDW}7RsFwH)}iBmd6i9ZsIq! zWdhtb>QTwU`%wq>48ToKcun^Wu&SF>cii`)nVfR-ZDiE-H!$7b-n~WH8;gs>;siUj zTnY-jfRyZ01kUHR6o4I=KIR#w_viZz+65XJ<>Mvm-c4;XM3&7T3>t|P?`b!y%=sNZ zHm1B|G1hl3D4wkF2E2Wai!|sSbmA(UMd0EC;GP3(X3@w8N*!M4l|4mX>;Ojo5OX%` z)a-fz%S!TpWyf@4TC_k3%dDmCx$Y^ro(CZ4gZi(flqYt0K{d4y>^HH}=C2SAFUz6y!drNhWBD5>{i zui7Hc^IQ;P>7NZT9Qe}5{yQGJ1aOZ2!(}`?(T<1`Cu})iipBt^uYtjW%_W6(Y))?G z!`^78cx;}I4m$&SsMg)rj=M6$ZT-;xmMM}^R0bbsn{R}(;t9PLiYDvr^Xya=O~`;v1AW3;nA!6oY+5xry2SYDVEQ) z;a+3kVT|(~|LUvOgfoD3#>DS3pN>N$NaMFTbDmcwu2s1wa9?cAcuRd z!LPB2ms!*Xe}~+^`KySmc@Ym(foiS~m5^#-qEuqPEjdot>v*Qp26Gpqxl}88Tg9q} z)f$M&ep6?fQV9Bums_|O z5Ox_Q-l0}|9{cM9g+usS#OZAlg}8+W;xvM%N7w6qr}x9<4g8R;cc8(DSjP`&h_nWj zG1wtiuRqO2Dqp3{j6J_aUzNK2T*y$k0e#WZqY@hD%hxd%ht^Ct7{gn>3E6G8-=wkN z$+9)N^?qhDSEFUp?B}^ta;POnehDZ@Xg=m*DR0p?$M~j|@qe>PLRaAXA-MACHJtmw z7p@+dgM~QFJJ0Rq!}4WT1BnwL8O*vZ*d+I6w&xFKtW?$EEx?2k!_y|j1WIyK@daJe zQ|c(*9oqTtPTLlXV9jFpBfnEEChA+ANmNIPm13Ae}_8HERwxZ8dm1Hqe#_6#r zkz!->9}HZmX!cZ-KPH_99C$*H{&pT+VZS`TjBn^o8u=kKDJHK|Ap#lO_f&C@!8|Yj zNwA9_2({LR##X}|_3L*t)=a3(p69N$W_1F!PQW49G7-({rDD35sEN^N2ULmTO5~Ne zJ7Q;2AQlMIBp(V@w)ZfRC_?ldp2w(EwW+DB0UnV z+5k+b^!zmKkY`o~!eLlp_JvcJVF{tKWc%`$sr$eNU<~C!Js?^Ul_m%#EsU@vCPPHb z5djqX*&K8JQdw6>{`D>bkkYFFz=c{&|HSoz01o&5%=3OByVDx=V%;AbWL}mC1RE}Y z9}+7NwzU84W7DY%Wdec(Kpxng?m->~h#g<3O?oPt78BsKW&NX1cnyGQPymtSlQF(J zxtc^Q1JEY_+lB_^(@g-RDE?Kj*C;>)5Ykot*_slV@A8ClzsyY74W?CAE|xz3;~wj) z30*gaQU(t)d;#v%_fAO6X$0~Br#SmiSaW|E>{wiI|MrHm3dpei^3Q6sV~HrsX`OSs z6=!Ar&i%@%qPqHtb}CoDttjr>am@>GkNApmGip<^rO5@R&F0^~F)GI0>1j`#m`tkn z80PHOxGo?a{#@ z#Pr?Pw*#D?+`ou|gMr()`=@?(i~U12NWBIPxJ%Dvzy3qp$G;iuSFNDQz)KFu=$fa~ zfl|+Y$ND~<<-gfo9L*X2QkQiHNYfMlBuXG#0p`Pzv(@>0x{p$tq`s2)MR&IDF`A*) z6K@}J1VE(ii5~xes7KSiJNY$dFb4Yx=+JIh>pvtxCHB~W^7PVk(FNhFQ~9`~K?dsY zR@kMXi4io-$gPqr<EPdx!o?_1?blCqa9cX>d~nQG;w_Jg_u#iLR4_4q`^37ERI?BtUKRx z%xq3+it9~75E;+DcqiG%=c$GS?XmRqlXsMMe&WJ1U)F7pStDnY9Ww}F)E_-(&t6XGU$EGBptJWZ;LiW~VmNaTB0#k3=(Hoq9ca zaLsGIhLGp#RJNQX?Q@xmnj$PPX}icP?Y{ZO!z#ehxC8HhiN^@^vuJUFp%yR_hu+-e zt1{CzE>SD?7HQI@yHRmt7pA2<|0K@e%bfZ%=Xw*ABG&V|3xi96`E$6bdw5dh}`{u+Il8_x8JrOO$@ zz}n#FS~_CgY;kh*wxWQiH$|TPd|G?N0+1Vzib+yBC6qD1oOyNNzSH1ot_rBKwe3NA zbwuFPI<+YN2N`WK-|2vwYtR~mL5LJn^Q;3n5=EB6r?@~yvx+aHgT1=_9Kp-L>nVJ` z$uxleCIPL4S_N~E(#8iG-07(yqJY#Zkh$ml-w_QLPcNeo5C>z-;qiZs8=#u$CnYD& zp5pbZKHmYC>BzOi{J8Iit( zVtWHkDwCG9+r44D9m_aej7th`tw%cZ7F|2f0ty-?>pE*LC8c&RwGbkkn7C2L_c@)> zSi6{W`2$rHpvCV%Zp7G08$x9(K|;1dd>v|HkK$;kAo=XJ@@S`VRN6SeG8faa$pM+> zb0F%2p~lQzVUWI2zwMfW%0q2-#!D?Zif>1X4tL0d(tycA{9mn5f)P|&?7S@g(hN^F ziTQ0y@T7BR-C;Ig&c%J{&H&wYRyKfV_{`lvEFpWX=Lwe#vJ0G0RK#-aV>E4@^ONb0 zMA>OCp7!%j&o=*fdAbOsr&5rbl8VI2~yjK-a&hCLyk_dwi*9~mTbW|Uttrd#n`+k{rPaGqo6jw)Ux~WF$0t>H53ZW ziI&$VIr<_si;r~4_mK16PfR$NunEn(?f@L4K3GN^*@67H9kMjV#FQOBAfzI)c>%~t zDj5QCKq0etzmD*Htk%8SdfhasSE?Qzt@)zht6}V)Yd|ncb^TjS!u=dQSP&i^pc`H2 zs5@d{HKPEE^j-2`==koo+{BUJ25kFiobDri4q-s?jOjSJZg2b}+61c4!NeN4b@0mb z{TuKA;iLQFM~35B>R3)Z?Q?lau+I#}*+#L>X3RT}`8Urv^@NAv2Q#YA517k9ZGATR z)g8$Bj%UsW%Py5yQ}+E33sV4LVb7XMVh9XWmOowzvFLk}F7b+LVg}x1FAi;CZx|(g zD+U-M3jqEyzQ__C;ihPY&wJg!s1OwN1h|bt^kIMTX*^Ij`X3wuU^&^|w@*t8+ zi~#TX(~8}srluBg ze{L=GOj`C|ap03Et*xi0s}L8Lx3@Q^H!r7)yA9VPK|w(-ZXPZk9uB~Q!^79v)7*!{ z*@Nz?lK<2rZRKI8Dyg;EhcDciIz~%dwG{id~;e9;rZ_?9X^L%n}|XklfT`dS=Bd z;iSmZbnRQ!w<@Pl=Y?eB+r5hjH?6*IjvrCn76aW{V29S1Nd{)C%BvOEh@YdrezLzy z`YYM%mxR`vhSZ8+emC@CC))R9=VJB{jXa$@Ju5TmINcNt4qEm&ZAYJH`fm!_y!}wI z%Ny|&1R)3kL8;%dhSqCVzU`w1fngFkOR)ECM|##XdcVnBwD!ov%_%HV3I@G{$&tksOSCy?a>x%Y{@( z#6DQ(Ebo@zxZT3FE6W$1J;ogg=|_F0xb17~R{A@)z?|@=CwG88fFM?P)x(ZoaRt;? zh&0Mq2x)uM^rxG`TyuGQf-tWMN?uDCpazfMv*~!(S|0b6Eg=Kobe)a#%KHDh8U`i! z8I~h|16vzG2?JR6=~O(U6?VuHV|R}x1v*wQCN?fd&*z$vNxg@`M?Z#UO`R{;4(n4) z6cdr^w9poU2M1D^DUvWGV3rHG{weHa)1TmH(-BT?9Hy1&(9Z9VECYDef{x7X2OdAo zJQ#9T)>^*k@TXzwj^rVh|0MboV)h*m+l5u4qk5#+;V)z1vFaA^W7U6W7ta@780ix(s;D`6&bM!Wo<-`+$n(M0V;H*K(TS*7j5e1udB6paTu7_?lLcI+!q+URfD{BA4;uG z5h}jkI%Uk~W$+YOIaPF=pJ~)6)W+d^DIn;}mp!$c~F<{&EBg6(Vf0 zSaa)4rs2^?uaooNOF0&3->iZ6j=4iv1vN#rs;%laCr{08`mP@ z>z?`d42_mMw^qhgXDYflCJtSEX)x7Mnpe#Ha>PNr+aCZE{Ntd6^h}!V6P$3rkj(jj z`-Vy!`TW}FSTuWD5hZT-$cWc`^Y_+(8WDvv1^Q08@NgsaXsd^$W{DYYZWuZ*#?5&@ zYH70+Pp!pnn)G~y^fXi z>I~J;IN$uWPv|~ezdVz$NU=ii{Lg7vq_NFW(E1Ba<71s-PM=S1^oY*8a>oMxn<7Ia zqbu$4JQEz%JUDq8;fPn%Hx>lz5&UweQf$Rl+@`rsxCs|ro}Bx^wAlyfne|K4MN+u= zgDjQAA&*%^4^>&COV6O?ic*X5rXbs)FyUkmKhz+yQ#S$TYGW7YEXx>)$VrhwIYm7o zHja7!WFeRt$7^Fte9=6AN@m2mt=vF-CCc$cr-JpnQwrbw%Q)^e3$w{Lr626~e^vUA z6W%*_^_CX@%X6NZg1~8Ww5#@a@Oh$}>?EJcx@sa$Fri-()c7bHy?F97U5+kUSazRr zMRKwBF@A>9ru^^XQ3Xe>*os*mxCX6Boz0o)vdoj9!A~m72663S20G5h#nD_xMa=4X zjXn!bA9kOMk$m$!2^n143ArP~l#~_5s zg*(wQD(2I!!r4bF*PVSxefT(hu{XOSzta3zS2Z8yO4AKA9QPB+Eut_gY>&JxXN!{B+~%eD8V4w5VP`5prFQpEL2` zqakZ{Asfj=_*!RW?zRZ{9?-M8f5CgI~oA^$)UQsW-gQU(Ke>7YHkuz}tzubOwC>Pw8!^zCoT)&C34`0(SICDFZT^574!*uc|z$&s*kg^N;m=q(FS@?bp}CY?tNT|{BanLR z(VGeP`(*Q|lw}wY;h1+(D*(VOu^U2S1B1kq!qW+Y3TbpF|x`s8!8f!$- zV4So9*Shft%%YW<<+oZ($HO~IN6BcB@O_;+CuH&|MQH)&jzrD_n5SGbV}ch)wuo;z|pdZY)#bv?<#xGukqxes)tfvgs3{FX)YHj8EQ&rp$Mo`uYM;uVA(sLP4h z&)1PL!s&eTYx3-s0j(~jRP_p)MMp3l$ucUzv>Sme17W?F0i^g|U9Ml^ThDDRWpa-5 zOp_SgQq=7`6FE8eeu)T^8VC;x>kXPeB+_wnr!o67$txzA9^#=@4d(tT0< zrgV+#(4t@x`87gvS>sDt?eLU4l5S#L!36d^t#icki~FV>t6~P;dN7sP-;0Lk#_VP; zL70*xd~A>0D0r_o;s(f0mc4!N{wu_2_ecq$#DK&S-CJfMEup2_FDCAZmgEY%uT~ws zI7#5AFS3k?*=Q2JJMh&Zc#BoC(^|zT$|q5TD(rcis*xwVr$LLYPnR5KwTed9z^E-;#6vtfJx} zeK>%&0F(rUs+t6_Mp2wzl*aX?1hm)2;o*X)xH1`WAqS*xz3dz@R>iK?tZB#Zugb!69o(Kl2lci#}Aka2zXfVPTb0 zIcg3It9~gdV4(`Z-J^-^W|T|tX~wvIiRy%LZ`~hKh|!92Efuyitc+V1!~R|K(!poR3?28c8?QOKJ-o7@&3Rp~CvBjS`?xoeq~mpngDVdU}4 zVrQf&ayjNsI}j=M>Q46()TR?51J3s#O)#nYqYM&pqUvzZRb3%eLx!{0<&(W|@{?nS z&7+y@>V?##&p&aX2Cq5`Q@jyXRG?{C{KmHPVu+^cQ_p&$+Zs*(w>KRs>dqV9%Ut85d!6lh<9 z4;eJwT5Byv=OCj2m^3T|RlHfVd0aM=*4qqM72>etgq&=y3YVa1Z-nYF4F?X&saAW{ z#6v2;x`^dy0Jy%T%eg9RklDGjEBD@H!wfj&`I!$~C+=L{Ycv!_dHGcP8FcecUO<{@*PlyBCIe~x_AVuY-$>}=dZ?qcMVoBxOb zO=vjk+9rTrou;SJe}*=y%sp7y*0Kt{b&}(Zu>A*x-o)jjhwz&+siZ9iZT03K)c!oB zP}m&lvWpHKGfN91PH?4Rd(gv}9u6E*5 z(!OHJ-x-B*T$;s0TiH@na@wD9{_Se%9CL_>`(l`3yTu0#<|ZLxi!__>)2<4hx#xZQ zg0k6v>dqm6c-psCZ*v+>ub(tKy8#$-7K6rB#$4{hEo_D|my1-gS2s;R%uWfITcpf9 zl$k434pMm?=BH0g!DTo~?v$OTc9^m>qe-5%g~XFaI?YX@iBbO{cNS2x$?F`&S&`E4 z(cdg4>ZZQF!>c6ewA#42P*<}l)!>y*Wc%jJm8?qKdBcw%ouB^>6Tdf9ok@67lVNC= zg?jum-)xEFd0#UIT78tuYcLl(W^{`^E%N`m&hPkb$@1FOF@F~;@sZZdLpE*|;2QIf zA5tYUxFx3@8Bof6tXo&5YCb=nJCu7tksjGVJ8hxEYDzP|h`d++@~WG|NGKU+r(}nZ zd93)gbwUxIf-tw-gS7s$u{ay3S3E82KuUq*D25@1NSqS%hJnhJ^il0&*55ouyFleH zi(3m?m%mZKWvz$Omc>7m8t%H16vmTa7i&5c1TpH-pA5AA6ITVH*2hGVhDV{w zBH`no&+LS-!K{G=3~fEdWfc_U3B%|#- ztZEsepcE5Y+h6=igAorhgaTz%W~vYvZ&+k?kBxofBvQ1tgBTD)7S7oGJgOx3#z5HmQjG9D=M84lM8v6 zmuRM#^Zbr?hw-(n>!_Wj_jsd{fOG5R4-Ln4J)^AQR*6Q0GRPBV z+T^{SMC4_^MFdMF_++ryZwRAgINXF+uKUQTe&R4L^_CeYgv(^-Du|Smh&e<=Rwq@L z7;j9-gc<9FjdYCu2$JcZI5FSfxjLF}nTEN+I%6tEw_l1W+4|-A=M$RM8|KODj#!9| zUFh=`AvQ}grf>Pse_or`_J+5e1spf3q2{B!NCK6JwTq-5QG&fa131t6NG~e_mr~bM z>?y1YR16qbv0*&N4a(zz|3uo%BHvc0$iI_N#@{ZxX`q3l3(16VImu+1I`KymZWrA1 zvSjPK-QUC$a~nVNE``!oLTaPb%N|M1*5?Xb#NBO<7Atodx9i{-D8Np9iO`%-D@X;WHE=m+PRGuS<#G@;}W40_U$n?({Ve9 zZ5~H9<(nHSuZpTR?Rc&I#669W(>b-=#>kTj3NrR0ksZwqjn+xA9re^qCqN?wL;os7 z2Xx?jRe+t7vHNj=pdPg z{<2MvQAS70l+!$)!SkrXWsEnZf&`GRf7C8y^&5ZHs7(6z;7PvNdMX5jn&a7RhmVNu zH?3OuS?&?b)<)aGuQ|AuX7#D-`+XaJ@%ounX@pwnXG;glrnPg;yF=(x1?P(BQRQ?V zzl$&j#+buZ?dCi)B8y!aoC&s)Te0W%_8KLH>rJ0;$ zhmJBz81&5%@e&@~`Lay@&ZY2=SxsA;u4)LZ#og;S;PnmOg&?vgP-RuqM>!Q1LwmPg z-LSpK6X|;tCiB>eq>OI$!eSS%BgX(CeLI~_gnei_`wWi;9 zF1`{ClCCYvZ)9SPqKUi(M>ZhvGd}Gkkz{*NUkECEP#FDAmy^u@=DQOWx{*!-Y9yST z2n9kZ3@lTYo~08@IsGfrK0VTnBWqR7KEEUVzw@w$GPV<-q-(I6zc%o* zUc69iI(1B_&i|n*d;z$;C4%Acgg`c(eshowoHS|l0P|1f^lw5|Nmbz))>HYHo?8O0P=9Wu6mftfc>aHVSl5Dl6S;v(9%>?u&2w#KGJrl^^TwWr0_ zF=PkPvn~J_b~YW>blpCo_ifOrnIzC@PtVY=ce6{A9>A;I5B5))-8keh^s{khk&IJ# z)&wZ?T{Vu!Zwi$F%#b3`2*5QJ+0Nwq0rnq><~#=OR<6=mB~@f((5vM(zBtVMbQp?N{vtP6i7kvwX*b-E4v}(%&&!6a$E4l_ z>ak{|&dq#mS%&t~5vcj3XWZ5NZFTT*c|6>M?Q24L%_ms~E5j7O$UH$KDTqk8mQ*V7 zbzna-f+G`jWD!h=d5jlE0Fg2%^QYqEfJ*$A(N9wpI;0+t>H~Tvw;TDk>)@v3N-3SB zL+!4Aul1C*9T;|?O#)Yod*WRI9bY~afTP6J%cY9|J$ipb`YWG)Ps1uN>JWJ;r+R1! zNALBUB4_PBAa@6ahl)qGJC25ems-mz`;Yv0JJ4bmN0z}u+7>3Pv4t8bTVJRGe-8>@ z25=o+vXI?A7`xoh>%gDAdpugdr8c`>P2r_$64>a!oY{Zfxhjo!GDNFO3R% z?5B6PwgQ-_gx|PhdvN%%pKi5Y7P)?HUq@ua0k4{wkL@iKWrc z0DQD8T{+tGO_=JTc=CS8*piA9K}jlT9jyB%<_$qFJ$Msrv(xaC7>l49gn)xIF~q&` z5=*m{0YJ;^Yv6hld&~?n0hGLElX`$901}J_V}zaHHf`R)MY}2gBoI zPbb!)9sBcdS+*v+OB3S`>2)fa%_O`sdFEL_N~2HZdJ5OPR);|!>%6QAezSNwo6i1s zMY@@Mt8TtVl;ucIL|Upy2bw7ePI8>jXF;!tANn^v^4EFm#cb_wPIN+}w`GHBsY-P5 zuSpXp@^WkdilgEesEjec>i82#srSrr`Y=G4|)@}qKMF0p(m82w*B-dS9$58jGLV!@Nl7!VX zQO&`nD!Py5OESmCzDJw=p#FqEAXvKpn9xxfu8RDr9Wl8zK59$2G`v_b-d`iQ<_mZ^ z4D}+1K8p=u=uB5P%FE@nk$FwnbhJ2py!Acom)Bn)8H9Y8WOFx1hbfLb0`)^NnAJs% zlTiCPheo`sexlRTnlVHS$mDPZ-Fs}%FxzaAlp%h&+bHodAe}&zPiA{b)wSw`xU#=O z)v2Eex13Y#P0BP|5uw#OQg`|Z+dk#W3n?o-|HM02o9{D$yeLG6mmzsR>kN;oG5lKH z;=1PNIQa^x`lkkjTf_AHgj2(bQ+X~k)$)z%^i{puMKHscJ%0-)WGei>_uL zF>1I+9^3m-M4@?riO96S*jDeJ?5>**<8L=kof~NE8oc8S9j7yM$oix%=@?gz(3z5P zFb+Qy;&96KCerffN~}shZbU3QCBD97e<#EB*ilzHjGJ4e5n@a-1c{K%=qVVpP-MQYcisaq2S=zwB!rNyCsMh z69XAsnR#AsLHL#G#FRxNO~=G&mUpo{(eCFs7uX0UQG{DS305lbt1}wZfe=s8+P``dnFn-%JcH;$W z{U9`N-0xzp!&h({M*fl&MR?66IupCtpip950&p=bqYS&>K@eFG zn4ho>OW;A!XMkq+|MOiAqsLQ+G(JqiIYy$M>r~%({VQJR!9U1xe&J^O28rHjQ^$y4uGBibwzV3uOH>b z-0}7~D#54$aN@650t*3if`rudBg`#;4Pl%%m?EqZC2HfGreYiO8>1rt_YEXGo$1{uZ0aP8&PD`P@d}pI%UkIjKPb=Lyc; zpCUJlRs~v4b+ZT!aW_Sk(0iwgi{(Oy_xIApJNVYgn6 zAZ`I?Ct>vukL3?QsPS^a!_R)ofmG`rYj#hHjdw8}{^f<9UI55`NrG(}g96<`A`D3B z;ugCD+3#O~{?SZ(6L~1Re_I;P8q0Z)Q6{gQlePSzVN=7D+{r%;_FN`>No}!p^nl&y zHFw=VwNVc13y#sXP&Nz)i< zE3sCG&SvqT5er|RE4}_NA>hk7fr}c3Nvb17-#$$RzrOe`Y8mPK*p65wg=hVR&Q!I@ zz4OVuQ-MhIpZSZGZaO|9cbRU09s>KBk1BNh`u8x)>Af_Pv76|wd#v;dWHO^Y%2v$N z+6_Vdv(5qzpS6lPf40Cq-;g)5UHFc7L8;=8oO?W>hxq`txpMP?kkVT<(k_RC6jfYg zEzeOSued2hP{!oJe0B%#eZ`_bwWaf+iu+l#I*yC0oZ-8Fi2edu?u$7`y>M9%rdoO= z6H5diwyNO(=(7$Sc4@MWinuOB1mFghU(*|5)LhIJh=jzI)fP$>gVSCqvCL6h?j*7P z_@cNKht4q>jRw{Q9l-?&PE)J%+6)08l>X5gQ^&fbUP3VRiIUAV)2n0Q z1mpWF__K*dS&HVJ2ILo$$pYuOVllb*SBA~H>Ni7)Dd>yE65;JR|IH(=m=F0MU99^A z-iJz5!l*kNX%z$sY#|WRHxGVQwRzRGE|xjW3V(@_g?NusQ232y9xctcTpq46rP+4< zSbo3$IdGLQ*qnR2uN<|{>+I=raaQAhKHR@KMHQ5aOXUWEGy-Dk)C*cGi5y&5z^{xB zG@=SIjVEJqFdKU@eSV_*gP7MC_AvM~HMl)!C8zag_oF#w&Um{PSJv64|<4lTEewtBayiGP*- zWCEylQaQxn8|F#0pWI-4kHBz2rGVHw?F$FD|2hh7Bi#Lk;AS?Rj8I{RIGWm4HL- z8~+w>zO`?tzhTsfI6t2wo&6^MMpmvPC{-@e;QV>B*{MBkXXD9&?NcNlE~J!b*aPV| zUXm62Kn1u31>B9Oww=NFF~HTZrx#7Xw9lU|6n+-lS0#FAb${nC%$XYvpk3(~z6e^yE)5uz!l z`ih{03ar9a`k-p5vS-rM^cbJfR1n@al2H~Q{%@|P!K zEWq3RmJ{zaJ__~DAL%ssCgwClq1>W@{wlE32w=gPM=(Aj%>Eg?hm_2LhRVLZv8i9f zy!@lG%gfm&Q(zjt=bc&mEFcq?8&*CT!a@nLBYbiZZRxz2q}w`$PoZ3IPz=`Rxz*zj(XF`^Y%bMwurm_LxF4bFLcCgjF3+XK9Iv>yUnDgBvpFeAdmS*rqP8ac) zRRUIV5(?nShvg|Ib3fiVeYAl!+y)2Y^k@F^9onRD4w#xcFIhM8n={^IeKJ$X4e{WV(4yPQKUAXHc?~QfeOrOyoQvxnrsnq2z2TWX( z7&nZ*g!J{^4E+RQkAN>#aG{T?*vNPm{B?2`aG+}{5-&;sB|g&+wfsj*%1MDHM i;`cYM@__eXXTf0t+=B`+hMFMYM?pqax=PaQ#s2}v@#^;g diff --git a/docs/assets/selector.png b/docs/assets/selector.png index 56c943e35af11de36d6686f2ce1825bc24691347..374fcbb1e7437b1f763bd60c733ebcc6d2409d8c 100644 GIT binary patch literal 10205 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 literal 12247 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 A00000 diff --git a/docs/assets/view_selector.png b/docs/assets/view_selector.png index c32d2ad51c3f48e39f0285b275f0e689c493c0f9..3e1570ad7d2882e1b0b3c4deae1f904b50ac1ce0 100644 GIT binary patch literal 13323 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 literal 13441 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 Date: Mon, 25 Dec 2023 14:26:01 -0500 Subject: [PATCH 22/25] Fix gitignore for .DS_Store --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a670baf..ba1d54c 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,4 @@ temp.errors .d/ docs-output/ -.DS_STORE \ No newline at end of file +.DS_Store \ No newline at end of file From e27377bec84b84bc571fc892cdbf5b765254058c Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 14:26:15 -0500 Subject: [PATCH 23/25] Remove .DS_Store --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 020bed7459f88c4522458f7df2c8e692e3707431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHLu}%U(5S@ifBw9$UEU&aMB=7-xlC!fhL@Npe6imP)BC#^L%ECnd!C2Y(2h#Wr z{sxH!R>n8G%dyJ=r7>hD*?o6AGdu6z<#t(!NR$W7B2k`*a%ha+I=VT=er_qt=#g!p z;5j<2Vx-+tBc{P3AC=BbJsE)B*sdVbUKYbk7 z{^nADuRUEGgs35v)+TkSO#`Z1)hSy|N0=P;o{uIRX6ETeQzna}Og?J;gAPrKs6l;; zNhW##lf-9oxc^Bw82)MXd48*I=8bj8(FN4MrY_ym8SvbyKf2qQ7i02x+&`XZk($d? zV_BTVYcynDYhZN+Jvw+h%^6me@m4y*}}5^I3v(e2sy|SRp(xp;Cb=Rp=vzQ0W-=bzGn^R;bcR$jX>UR~Gt&B4l-p`!bwF zpwRVB0jGeiKvv!6dH+9LeEzqS+?`XvDX>xs2rsOJWjvDJTT>6md##UFLu2E(SfNZo kr?+Ey!CNu^uOJORpD%!c##kXnVD5*2l)-gQfj?E?7b>~MkpKVy From f4c4d0debb49fb5752b5ef91bb4831e370657f29 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 25 Dec 2023 15:02:11 -0500 Subject: [PATCH 24/25] Create issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 17 +++++++++++++++++ .github/ISSUE_TEMPLATE/enhancement.md | 14 ++++++++++++++ .github/ISSUE_TEMPLATE/question.md | 10 ++++++++++ 3 files changed, 41 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/enhancement.md create mode 100644 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..389a485 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,17 @@ +--- +name: Bug report +about: Report a bug in robodash +title: 'Bug: ' +labels: bug +assignees: unwieldycat + +--- + +**Bug description** +Description of what the bug is. + +**Expected behavior** +Description of what you expected to happen. + +**Steps to reproduce** +Steps to reproduce the behavior, including any necessary code. diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md new file mode 100644 index 0000000..4d62ac6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -0,0 +1,14 @@ +--- +name: Enhancement +about: Suggest a new feature or idea +title: 'Enhancement: ' +labels: enhancement +assignees: unwieldycat + +--- + +**Proposed enhancement** +Describe the change or feature you want. + +**Motivation behind change** +Describe why this enhancement would be helpful. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..add0215 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,10 @@ +--- +name: Question +about: Ask a question about robodash +title: 'Question: ' +labels: question +assignees: unwieldycat + +--- + +Ask your question here. Provide any relevant background information. From ac6c6e7397fdafe51df51813ec205ff6b9e1eca6 Mon Sep 17 00:00:00 2001 From: Thurston Yates Date: Mon, 25 Dec 2023 15:19:13 -0500 Subject: [PATCH 25/25] Create a changelog --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b2dc814 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,22 @@ +# Changelog + +Changes to this project will be logged in this file. This project uses +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). Format is loosely +based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). + +## 2.1.0 + +Robodash 2.1.0 resolves issues with the autonomous selector. + +### Added + +- The ability to associate images with autonomous routines +- Support for multiple active selectors +- Automatic SD saving, no need to press a button + +Minor breaking changes with selector: `rd::Selector::routine_t` is now a +`struct` instead of an `std::pair`. This shouldn't break any existing code. + +### Fixed + +- A data abort error when a routine name was too long