From e9b58e0a6f75a58318a0cea13781efaa7643bf46 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 9 Mar 2024 01:55:31 +0100 Subject: [PATCH] Implement printer panel fully --- .../boards/esp32-3248S035C-smartdisplay.json | 14 +- CYD-Klipper/src/conf/global_config.cpp | 3 + CYD-Klipper/src/conf/global_config.h | 1 + CYD-Klipper/src/core/data_setup.cpp | 2 +- CYD-Klipper/src/ui/panels/printer_panel.cpp | 146 +++++++++++++++++- 5 files changed, 152 insertions(+), 14 deletions(-) diff --git a/CYD-Klipper/boards/esp32-3248S035C-smartdisplay.json b/CYD-Klipper/boards/esp32-3248S035C-smartdisplay.json index 25e1f76..b873d3e 100644 --- a/CYD-Klipper/boards/esp32-3248S035C-smartdisplay.json +++ b/CYD-Klipper/boards/esp32-3248S035C-smartdisplay.json @@ -9,6 +9,8 @@ "'-D ESP32_3248S035C'", "'-D LCD_WIDTH=320'", "'-D LCD_HEIGHT=480'", + "'-D LVGL_BUFFER_PIXELS=(LCD_WIDTH*LCD_HEIGHT/4)'", + "'-D LVGL_BUFFER_MALLOC_FLAGS=(MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)'", "'-D BCKL=27'", "'-D LCD_ST7796_SPI'", "'-D ST7796_SPI_HOST=SPI2_HOST'", @@ -18,10 +20,13 @@ "'-D ST7796_SPI_BUS_SCLK_IO_NUM=14'", "'-D ST7796_SPI_BUS_QUADWP_IO_NUM=GPIO_NUM_NC'", "'-D ST7796_SPI_BUS_QUADHD_IO_NUM=GPIO_NUM_NC'", + "'-D ST7796_SPI_BUS_MAX_TRANSFER_SZ=0'", + "'-D ST7796_SPI_BUS_FLAGS=0'", + "'-D ST7796_SPI_BUS_INTR_FLAGS=0'", "'-D ST7796_SPI_CONFIG_CS_GPIO_NUM=15'", "'-D ST7796_SPI_CONFIG_DC_GPIO_NUM=2'", "'-D ST7796_SPI_CONFIG_SPI_MODE=SPI_MODE0'", - "'-D ST7796_SPI_CONFIG_PCLK_HZ=80000000'", + "'-D ST7796_SPI_CONFIG_PCLK_HZ=24000000'", "'-D ST7796_SPI_CONFIG_TRANS_QUEUE_DEPTH=10'", "'-D ST7796_SPI_CONFIG_LCD_CMD_BITS=8'", "'-D ST7796_SPI_CONFIG_LCD_PARAM_BITS=8'", @@ -77,14 +82,13 @@ "'-D SPEAK=26'", "-DCYD_SCREEN_GAP_PX=10", - "-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=40", - "-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=40", + "-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=45", + "-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=45", "-DCYD_SCREEN_FONT=lv_font_montserrat_16", "-DCYD_SCREEN_FONT_SMALL=lv_font_montserrat_12", "-DCYD_SCREEN_SIDEBAR_SIZE_PX=50", "-DCYD_SCREEN_DRIVER_ESP32_SMARTDISPLAY=1", - "-DCYD_SCREEN_DISABLE_TOUCH_CALIBRATION=1", - "-DCYD_SCREEN_DISABLE_INVERT_COLORS=1" + "-DCYD_SCREEN_DISABLE_TOUCH_CALIBRATION=1" ], "f_cpu": "240000000L", "f_flash": "40000000L", diff --git a/CYD-Klipper/src/conf/global_config.cpp b/CYD-Klipper/src/conf/global_config.cpp index e717eee..cff6515 100644 --- a/CYD-Klipper/src/conf/global_config.cpp +++ b/CYD-Klipper/src/conf/global_config.cpp @@ -90,8 +90,11 @@ void set_printer_config_index(int index) new_config->bed_presets[i] = old_config->bed_presets[i]; } + write_global_config(); ESP.restart(); } + + write_global_config(); } void load_global_config() diff --git a/CYD-Klipper/src/conf/global_config.h b/CYD-Klipper/src/conf/global_config.h index 5a67a01..9b18e28 100644 --- a/CYD-Klipper/src/conf/global_config.h +++ b/CYD-Klipper/src/conf/global_config.h @@ -86,5 +86,6 @@ void load_global_config(); PRINTER_CONFIG* get_current_printer_config(); int get_printer_config_count(); void set_printer_config_index(int index); +int get_printer_config_free_index(); #endif // !_GLOBAL_CONFIG_INIT \ 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 c09743e..e64a732 100644 --- a/CYD-Klipper/src/core/data_setup.cpp +++ b/CYD-Klipper/src/core/data_setup.cpp @@ -341,7 +341,7 @@ void fetch_printer_data_minimal() } } - if (printer_minimal->state != PRINTER_STATE_ERROR) + if (data[i].state != PRINTER_STATE_ERROR) { if (status.containsKey("virtual_sdcard")) { diff --git a/CYD-Klipper/src/ui/panels/printer_panel.cpp b/CYD-Klipper/src/ui/panels/printer_panel.cpp index c4ef1f8..6e09307 100644 --- a/CYD-Klipper/src/ui/panels/printer_panel.cpp +++ b/CYD-Klipper/src/ui/panels/printer_panel.cpp @@ -2,6 +2,9 @@ #include "../../conf/global_config.h" #include "../../core/data_setup.h" #include "../ui_utils.h" +#include "../../core/lv_setup.h" +#include +#include "../nav_buttons.h" const char * printer_status[] = { "Error", @@ -12,6 +15,16 @@ const char * printer_status[] = { const static lv_point_t line_points[] = { {0, 0}, {(short int)((CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2) * 0.85f), 0} }; +static void update_printer_name_text(lv_event_t * e) +{ + lv_obj_t * label = lv_event_get_target(e); + PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); + int index = config - global_config.printer_config; + PrinterMinimal * printer = &printer_minimal[index]; + + lv_label_set_text(label, config->printer_name[0] == 0 ? config->klipper_host : config->printer_name); +} + static void update_printer_status_text(lv_event_t * e) { lv_obj_t * label = lv_event_get_target(e); @@ -49,27 +62,124 @@ static void update_printer_percentage_text(lv_event_t * e) int index = config - global_config.printer_config; PrinterMinimal * printer = &printer_minimal[index]; - if (printer->online && (printer->state == PRINTER_STATE_PRINTING || printer->state == PRINTER_STATE_PAUSED)){ - lv_label_set_text_fmt(label, "%.2f%%", printer->print_progress * 100); + if (printer->online && (printer->state == PRINTER_STATE_PRINTING || printer->state == PRINTER_STATE_PAUSED)) + { + char percentage_buffer[12]; + sprintf(percentage_buffer, "%.2f%%", printer->print_progress * 100); + lv_label_set_text(label, percentage_buffer); } - else { - lv_label_set_text(label, "-"); + else + { + lv_label_set_text(label, "-%"); + } +} + +static void btn_disable_if_controlled(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_target(e); + PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); + + if (config == get_current_printer_config()) + { + lv_obj_add_state(btn, LV_STATE_DISABLED); + } + else + { + lv_obj_clear_state(btn, LV_STATE_DISABLED); + } +} + +static void btn_disable_if_controlled_or_offline(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_target(e); + PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); + int index = config - global_config.printer_config; + PrinterMinimal * printer = &printer_minimal[index]; + + if (config == get_current_printer_config() || !printer->online) + { + lv_obj_add_state(btn, LV_STATE_DISABLED); + } + else + { + lv_obj_clear_state(btn, LV_STATE_DISABLED); + } +} + +PRINTER_CONFIG * keyboard_config = NULL; + +static void keyboard_callback(lv_event_t * e){ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * ta = lv_event_get_target(e); + lv_obj_t * kb = (lv_obj_t *)lv_event_get_user_data(e); + + if (code == LV_EVENT_READY) { + const char * text = lv_textarea_get_text(ta); + strcpy(keyboard_config->printer_name, text); + write_global_config(); + lv_msg_send(DATA_PRINTER_MINIMAL, NULL); + } + + if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_CANCEL || code == LV_EVENT_READY) { + lv_keyboard_set_textarea(kb, NULL); + lv_obj_del(lv_obj_get_parent(kb)); } } static void btn_printer_delete(lv_event_t * e) { + lv_obj_t * btn = lv_event_get_target(e); + PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); + if (config == get_current_printer_config()) + { + return; + } + + config->ip_configured = false; + write_global_config(); + + nav_buttons_setup(6); } +// TODO: Extract this from temp/print panel and combine static void btn_printer_rename(lv_event_t * e) { + keyboard_config = (PRINTER_CONFIG*)lv_event_get_user_data(e); + lv_obj_t * parent = lv_create_empty_panel(lv_scr_act()); + lv_obj_set_style_bg_opa(parent, LV_OPA_50, 0); + lv_obj_set_size(parent, CYD_SCREEN_WIDTH_PX, CYD_SCREEN_HEIGHT_PX); + lv_layout_flex_column(parent, LV_FLEX_ALIGN_SPACE_BETWEEN); + + lv_obj_t * empty_panel = lv_create_empty_panel(parent); + lv_obj_set_flex_grow(empty_panel, 1); + + lv_obj_t * ta = lv_textarea_create(parent); + lv_obj_t * keyboard = lv_keyboard_create(parent); + + lv_obj_set_width(ta, CYD_SCREEN_WIDTH_PX * 0.75); + lv_textarea_set_max_length(ta, 16); + lv_textarea_set_one_line(ta, true); + lv_textarea_set_text(ta, keyboard_config->printer_name); + lv_obj_add_event_cb(ta, keyboard_callback, LV_EVENT_ALL, keyboard); + lv_keyboard_set_textarea(keyboard, ta); } static void btn_printer_activate(lv_event_t * e) { + lv_obj_t * label = lv_event_get_target(e); + PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); + int index = config - global_config.printer_config; + set_printer_config_index(index); + set_color_scheme(); + lv_msg_send(DATA_PRINTER_MINIMAL, NULL); +} + +static void btn_printer_add(lv_event_t * e) +{ + set_printer_config_index(get_printer_config_free_index()); } void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root) @@ -82,7 +192,8 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root) lv_obj_set_size(data_row_name, width, LV_SIZE_CONTENT); lv_obj_t * label = lv_label_create(data_row_name); - lv_label_set_text(label, config->printer_name[0] == 0 ? config->klipper_host : config->printer_name); + lv_obj_add_event_cb(label, update_printer_name_text, LV_EVENT_MSG_RECEIVED, config); + lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); label = lv_label_create(data_row_name); lv_obj_add_event_cb(label, update_printer_status_text, LV_EVENT_MSG_RECEIVED, config); @@ -109,6 +220,8 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root) lv_obj_t * btn = lv_btn_create(button_row); lv_obj_set_flex_grow(btn, 1); lv_obj_add_event_cb(btn, btn_printer_delete, LV_EVENT_CLICKED, config); + lv_obj_add_event_cb(btn, btn_disable_if_controlled, LV_EVENT_MSG_RECEIVED, config); + lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, btn, config); label = lv_label_create(btn); lv_label_set_text(label, LV_SYMBOL_TRASH); @@ -125,9 +238,11 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root) btn = lv_btn_create(button_row); lv_obj_set_flex_grow(btn, 2); lv_obj_add_event_cb(btn, btn_printer_activate, LV_EVENT_CLICKED, config); + lv_obj_add_event_cb(btn, btn_disable_if_controlled_or_offline, LV_EVENT_MSG_RECEIVED, config); + lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, btn, config); label = lv_label_create(btn); - lv_label_set_text(label, "Activate"); + lv_label_set_text(label, "Control"); lv_obj_center(label); lv_obj_t * line = lv_line_create(root); @@ -139,11 +254,13 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root) void printer_panel_init(lv_obj_t* panel) { lv_obj_t * inner_panel = lv_create_empty_panel(panel); - lv_obj_align(inner_panel, LV_ALIGN_TOP_LEFT, CYD_SCREEN_GAP_PX, CYD_SCREEN_GAP_PX); - lv_obj_set_size(inner_panel, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_PANEL_HEIGHT_PX - CYD_SCREEN_GAP_PX * 2); + lv_obj_align(inner_panel, LV_ALIGN_TOP_LEFT, CYD_SCREEN_GAP_PX, 0); + lv_obj_set_size(inner_panel, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_PANEL_HEIGHT_PX); lv_layout_flex_column(inner_panel); lv_obj_set_scrollbar_mode(inner_panel, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_size(lv_create_empty_panel(inner_panel), 0, 0); + for (int i = 0; i < PRINTER_CONFIG_COUNT; i++){ PRINTER_CONFIG * config = &global_config.printer_config[i]; if (config->ip_configured) { @@ -151,5 +268,18 @@ void printer_panel_init(lv_obj_t* panel) } } + // Add Printer Button + if (get_printer_config_free_index() != -1){ + lv_obj_t * btn = lv_btn_create(inner_panel); + lv_obj_set_size(btn, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_obj_add_event_cb(btn, btn_printer_add, LV_EVENT_CLICKED, NULL); + + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text(label, "Add Printer"); + lv_obj_center(label); + } + + lv_obj_set_size(lv_create_empty_panel(inner_panel), 0, 0); + lv_msg_send(DATA_PRINTER_MINIMAL, NULL); } \ No newline at end of file