From cb472867848dff0d1c7378ec17513ddbab84712a Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Thu, 23 Nov 2023 11:46:09 +0100 Subject: [PATCH] Add macro support --- CYD-Klipper/.vscode/settings.json | 3 +- CYD-Klipper/src/core/data_setup.cpp | 2 + CYD-Klipper/src/core/macros_query.cpp | 51 ++++++++++++++ CYD-Klipper/src/core/macros_query.h | 9 +++ CYD-Klipper/src/ui/nav_buttons.cpp | 13 +++- CYD-Klipper/src/ui/panels/macros_panel.cpp | 79 ++++++++++++++++++++++ CYD-Klipper/src/ui/panels/panel.h | 3 +- 7 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 CYD-Klipper/src/core/macros_query.cpp create mode 100644 CYD-Klipper/src/core/macros_query.h create mode 100644 CYD-Klipper/src/ui/panels/macros_panel.cpp diff --git a/CYD-Klipper/.vscode/settings.json b/CYD-Klipper/.vscode/settings.json index 03d5353..75d2259 100644 --- a/CYD-Klipper/.vscode/settings.json +++ b/CYD-Klipper/.vscode/settings.json @@ -8,6 +8,7 @@ "unordered_set": "cpp", "vector": "cpp", "string_view": "cpp", - "initializer_list": "cpp" + "initializer_list": "cpp", + "algorithm": "cpp" } } \ No newline at end of file diff --git a/CYD-Klipper/src/core/data_setup.cpp b/CYD-Klipper/src/core/data_setup.cpp index fde8eee..4d8927e 100644 --- a/CYD-Klipper/src/core/data_setup.cpp +++ b/CYD-Klipper/src/core/data_setup.cpp @@ -4,6 +4,7 @@ #include "../conf/global_config.h" #include #include +#include "macros_query.h" const char *printer_state_messages[] = { "Error", @@ -179,4 +180,5 @@ void data_setup() { printer.print_filename = filename_buff; fetch_printer_data(); + macros_query_setup(); } \ No newline at end of file diff --git a/CYD-Klipper/src/core/macros_query.cpp b/CYD-Klipper/src/core/macros_query.cpp new file mode 100644 index 0000000..11ddef3 --- /dev/null +++ b/CYD-Klipper/src/core/macros_query.cpp @@ -0,0 +1,51 @@ +#include "lvgl.h" +#include "macros_query.h" +#include "./data_setup.h" +#include +#include "../conf/global_config.h" +#include + +static char* macros[64] = {0}; +static int macros_count = 0; + +static void on_state_change(void * s, lv_msg_t * m) { + if (printer.state == PRINTER_STATE_ERROR || printer.state == PRINTER_STATE_PAUSED){ + return; + } + + String url = "http://" + String(global_config.klipperHost) + ":" + String(global_config.klipperPort) + "/printer/gcode/help"; + HTTPClient client; + client.begin(url.c_str()); + int httpCode = client.GET(); + if (httpCode == 200){ + String payload = client.getString(); + DynamicJsonDocument doc(16384); + deserializeJson(doc, payload); + auto result = doc["result"].as(); + + for (int i = 0; i < macros_count; i++){ + free(macros[i]); + } + + macros_count = 0; + + for (JsonPair i : result){ + const char *key = i.key().c_str(); + const char *value = i.value().as().c_str(); + if (strcmp(value, "CYD_SCREEN_MACRO") == 0) { + char* macro = (char*)malloc(strlen(key) + 1); + strcpy(macro, key); + macros[macros_count++] = macro; + } + } + } +} + +MACROSQUERY macros_query() { + return {(const char**)macros, macros_count}; +} + +void macros_query_setup(){ + lv_msg_subscribe(DATA_PRINTER_STATE, on_state_change, NULL); + on_state_change(NULL, NULL); +} \ No newline at end of file diff --git a/CYD-Klipper/src/core/macros_query.h b/CYD-Klipper/src/core/macros_query.h new file mode 100644 index 0000000..5fdee3f --- /dev/null +++ b/CYD-Klipper/src/core/macros_query.h @@ -0,0 +1,9 @@ +#pragma once + +typedef struct { + const char** macros; + uint32_t count; +} MACROSQUERY; + +MACROSQUERY macros_query(); +void macros_query_setup(); \ No newline at end of file diff --git a/CYD-Klipper/src/ui/nav_buttons.cpp b/CYD-Klipper/src/ui/nav_buttons.cpp index 0cee3ee..e056316 100644 --- a/CYD-Klipper/src/ui/nav_buttons.cpp +++ b/CYD-Klipper/src/ui/nav_buttons.cpp @@ -71,6 +71,10 @@ static void btn_click_settings(lv_event_t * e){ nav_buttons_setup(3); } +static void btn_click_macros(lv_event_t * e){ + nav_buttons_setup(4); +} + void nav_buttons_setup(unsigned char active_panel){ lv_obj_clean(lv_scr_act()); lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); @@ -140,14 +144,14 @@ void nav_buttons_setup(unsigned char active_panel){ lv_obj_set_size(btn, button_width, button_height); lv_obj_align(btn, LV_ALIGN_TOP_LEFT, 0, button_height * 3); lv_obj_add_style(btn, &nav_button_style, 0); - lv_obj_add_event_cb(btn, btn_click_settings, LV_EVENT_CLICKED, NULL); + lv_obj_add_event_cb(btn, btn_click_macros, LV_EVENT_CLICKED, NULL); label = lv_label_create(btn); - lv_label_set_text(label, LV_SYMBOL_SETTINGS); + lv_label_set_text(label, LV_SYMBOL_GPS); lv_obj_align(label, LV_ALIGN_CENTER, 0, -1 * icon_text_spacing); label = lv_label_create(btn); - lv_label_set_text(label, "Screen"); + lv_label_set_text(label, "Macro"); lv_obj_align(label, LV_ALIGN_CENTER, 0, icon_text_spacing); lv_obj_add_style(label, &nav_button_text_style, 0); @@ -171,6 +175,9 @@ void nav_buttons_setup(unsigned char active_panel){ case 3: settings_panel_init(panel); break; + case 4: + macros_panel_init(panel); + break; } } diff --git a/CYD-Klipper/src/ui/panels/macros_panel.cpp b/CYD-Klipper/src/ui/panels/macros_panel.cpp new file mode 100644 index 0000000..804c135 --- /dev/null +++ b/CYD-Klipper/src/ui/panels/macros_panel.cpp @@ -0,0 +1,79 @@ +#include "lvgl.h" +#include "panel.h" +#include "../nav_buttons.h" +#include "../../core/data_setup.h" +#include "../../core/macros_query.h" +#include + +int y_offset_macros = 40; +const int y_element_size = 50; +const int y_seperator_size = 1; +const int y_seperator_x_padding = 50; +const int panel_width = TFT_HEIGHT - 40; +const int y_element_x_padding = 30; +const static lv_point_t line_points[] = { {0, 0}, {panel_width - y_seperator_x_padding, 0} }; + +static void btn_press(lv_event_t * e){ + lv_obj_t * btn = lv_event_get_target(e); + const char* macro = (const char*)lv_event_get_user_data(e); + Serial.printf("Macro: %s\n", macro); + send_gcode(false, macro); +} + +static void btn_goto_settings(lv_event_t * e){ + nav_buttons_setup(3); +} + +void create_macro_widget(const char* macro, lv_obj_t* root_panel){ + lv_obj_t * panel = lv_obj_create(root_panel); + lv_obj_set_style_border_width(panel, 0, 0); + lv_obj_set_style_bg_opa(panel, LV_OPA_TRANSP, 0); + lv_obj_set_style_pad_all(panel, 0, 0); + lv_obj_align(panel, LV_ALIGN_TOP_MID, 0, y_offset_macros); + lv_obj_set_size(panel, panel_width - y_element_x_padding, y_element_size); + + lv_obj_t * line = lv_line_create(panel); + lv_line_set_points(line, line_points, 2); + lv_obj_set_style_line_width(line, y_seperator_size, 0); + lv_obj_set_style_line_color(line, lv_color_hex(0xAAAAAA), 0); + lv_obj_align(line, LV_ALIGN_BOTTOM_MID, 0, 0); + + lv_obj_t * label = lv_label_create(panel); + lv_label_set_text(label, macro); + lv_obj_align(label, LV_ALIGN_LEFT_MID, 0, 0); + + lv_obj_t * btn = lv_btn_create(panel); + lv_obj_align(btn, LV_ALIGN_RIGHT_MID, 0, 0); + lv_obj_add_event_cb(btn, btn_press, LV_EVENT_CLICKED, (void*)macro); + + label = lv_label_create(btn); + lv_label_set_text(label, "Run"); + lv_obj_center(label); + + y_offset_macros += y_element_size; +} + +void macros_panel_init(lv_obj_t* panel) { + y_offset_macros = 40; + + lv_obj_t * btn = lv_btn_create(panel); + lv_obj_add_event_cb(btn, btn_goto_settings, LV_EVENT_CLICKED, NULL); + lv_obj_set_size(btn, TFT_HEIGHT - 40 - 20, 30); + lv_obj_align(btn, LV_ALIGN_TOP_MID, 0, 5); + + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text(label, LV_SYMBOL_SETTINGS " Screen Settings"); + lv_obj_center(label); + + MACROSQUERY query = macros_query(); + if (query.count == 0){ + label = lv_label_create(panel); + lv_label_set_text(label, "No macros found.\nMacros with the description\n\"CYD_SCREEN_MACRO\"\nwill show up here."); + lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); + return; + } + + for (int i = 0; i < query.count; i++){ + create_macro_widget(query.macros[i], panel); + } +} \ No newline at end of file diff --git a/CYD-Klipper/src/ui/panels/panel.h b/CYD-Klipper/src/ui/panels/panel.h index 251f833..ac65776 100644 --- a/CYD-Klipper/src/ui/panels/panel.h +++ b/CYD-Klipper/src/ui/panels/panel.h @@ -6,4 +6,5 @@ void settings_panel_init(lv_obj_t* panel); void temp_panel_init(lv_obj_t* panel); void print_panel_init(lv_obj_t* panel); void move_panel_init(lv_obj_t* panel); -void progress_panel_init(lv_obj_t* panel); \ No newline at end of file +void progress_panel_init(lv_obj_t* panel); +void macros_panel_init(lv_obj_t* panel); \ No newline at end of file