From 1efaa616e1a8db70d372d39976aa884c52a5e391 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Fri, 10 Jan 2025 22:28:35 +0100 Subject: [PATCH 01/11] Add 2x scale gcode preview option --- CYD-Klipper/src/conf/global_config.h | 1 + CYD-Klipper/src/ui/panels/files_panel.cpp | 81 +++++++++++--------- CYD-Klipper/src/ui/panels/settings_panel.cpp | 8 ++ 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/CYD-Klipper/src/conf/global_config.h b/CYD-Klipper/src/conf/global_config.h index c235fff..9a089d4 100644 --- a/CYD-Klipper/src/conf/global_config.h +++ b/CYD-Klipper/src/conf/global_config.h @@ -83,6 +83,7 @@ typedef struct { bool sort_macros : 1; bool show_estop : 1; bool full_filenames : 1; + bool double_size_gcode_img : 1; }; }; diff --git a/CYD-Klipper/src/ui/panels/files_panel.cpp b/CYD-Klipper/src/ui/panels/files_panel.cpp index d4c74be..ec931fc 100644 --- a/CYD-Klipper/src/ui/panels/files_panel.cpp +++ b/CYD-Klipper/src/ui/panels/files_panel.cpp @@ -32,43 +32,22 @@ static void btn_print_file_verify(lv_event_t * e) return; } - const auto button_size_mult = 1.3f; - - lv_obj_t * btn = lv_event_get_target(e); selected_file = (char*)lv_event_get_user_data(e); lv_obj_t * panel = lv_obj_create(lv_scr_act()); - lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX * 2, 0); + lv_obj_set_style_pad_hor(panel, CYD_SCREEN_GAP_PX * 2, 0); + lv_obj_set_style_pad_ver(panel, CYD_SCREEN_GAP_PX, 0); lv_obj_set_size(panel, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 4, CYD_SCREEN_HEIGHT_PX - CYD_SCREEN_GAP_PX * 3); lv_obj_align(panel, LV_ALIGN_CENTER, 0, 0); + lv_layout_flex_column(panel, LV_FLEX_ALIGN_CENTER); lv_obj_t * label_print_file = lv_label_create(panel); lv_label_set_text(label_print_file, "Print File"); - lv_obj_align(label_print_file, LV_ALIGN_TOP_LEFT, 0, 0); - lv_obj_t * label = lv_label_create(panel); - lv_label_set_text(label, selected_file); - lv_obj_align(label, LV_ALIGN_CENTER, 0, -20); - lv_obj_set_width(label, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 10); - lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); - - btn = lv_btn_create(panel); - lv_obj_align(btn, LV_ALIGN_BOTTOM_LEFT, 0, 0); - lv_obj_set_size(btn, CYD_SCREEN_MIN_BUTTON_WIDTH_PX * button_size_mult, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX * button_size_mult); - lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel); - - label = lv_label_create(btn); - lv_label_set_text(label, LV_SYMBOL_CLOSE); - lv_obj_center(label); - - btn = lv_btn_create(panel); - lv_obj_align(btn, LV_ALIGN_BOTTOM_RIGHT, 0, 0); - lv_obj_set_size(btn, CYD_SCREEN_MIN_BUTTON_WIDTH_PX * button_size_mult, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX * button_size_mult); - lv_obj_add_event_cb(btn, btn_print_file, LV_EVENT_CLICKED, panel); - - label = lv_label_create(btn); - lv_label_set_text(label, LV_SYMBOL_OK); - lv_obj_center(label); + lv_obj_t * top_panel = lv_create_empty_panel(panel); + lv_obj_set_width(top_panel, LV_PCT(100)); + lv_obj_set_flex_grow(top_panel, 1); + lv_layout_flex_row(top_panel, LV_FLEX_ALIGN_CENTER); Thumbnail thumbnail = current_printer_get_32_32_png_image_thumbnail(selected_file); lv_obj_t * img = NULL; @@ -85,17 +64,45 @@ static void btn_print_file_verify(lv_event_t * e) img_header->header.cf = LV_IMG_CF_RAW_ALPHA; img_header->data = thumbnail.png; - img = lv_img_create(panel); + img = lv_img_create(top_panel); lv_img_set_src(img, img_header); - lv_obj_align(img, LV_ALIGN_TOP_LEFT, 0, 0); - - lv_obj_t * text_center_panel = lv_create_empty_panel(panel); - lv_obj_set_size(text_center_panel, CYD_SCREEN_MIN_BUTTON_WIDTH_PX * 2, 32); - lv_obj_align(text_center_panel, LV_ALIGN_TOP_LEFT, CYD_SCREEN_GAP_PX + 32, 0); - - lv_obj_set_parent(label_print_file, text_center_panel); - lv_obj_align(label_print_file, LV_ALIGN_LEFT_MID, 0, 0); + lv_img_set_antialias(img, true); + lv_img_set_size_mode(img, LV_IMG_SIZE_MODE_REAL); + + if (global_config.double_size_gcode_img) + { + lv_img_set_zoom(img, LV_IMG_ZOOM_NONE * 2); + } } + + lv_obj_t * label = lv_label_create(top_panel); + lv_label_set_text(label, selected_file); + lv_obj_set_height(label, LV_SIZE_CONTENT); + lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); + lv_obj_set_flex_grow(label, 1); + + lv_obj_t* buttons_panel = lv_create_empty_panel(panel); + lv_layout_flex_row(buttons_panel); + lv_obj_set_size(buttons_panel, LV_PCT(100), CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + + lv_obj_t* btn = lv_btn_create(buttons_panel); + lv_obj_set_flex_grow(btn, 1); + lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel); + + label = lv_label_create(btn); + lv_label_set_text(label, LV_SYMBOL_CLOSE " Cancel"); + lv_obj_center(label); + + btn = lv_btn_create(buttons_panel); + lv_obj_set_flex_grow(btn, 1); + lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_obj_add_event_cb(btn, btn_print_file, LV_EVENT_CLICKED, panel); + lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel); + + label = lv_label_create(btn); + lv_label_set_text(label, LV_SYMBOL_OK " Print"); + lv_obj_center(label); } void files_panel_init(lv_obj_t* panel){ diff --git a/CYD-Klipper/src/ui/panels/settings_panel.cpp b/CYD-Klipper/src/ui/panels/settings_panel.cpp index 88755ce..8fbce5b 100644 --- a/CYD-Klipper/src/ui/panels/settings_panel.cpp +++ b/CYD-Klipper/src/ui/panels/settings_panel.cpp @@ -132,6 +132,13 @@ static void full_filenames_switch(lv_event_t* e){ write_global_config(); } +static void double_size_gcode_img_switch(lv_event_t* e){ + auto state = lv_obj_get_state(lv_event_get_target(e)); + bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED); + global_config.double_size_gcode_img = checked; + write_global_config(); +} + static void rotate_screen_switch(lv_event_t* e){ auto state = lv_obj_get_state(lv_event_get_target(e)); bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED); @@ -239,6 +246,7 @@ void settings_section_behaviour(lv_obj_t* panel) lv_create_custom_menu_switch("Sort Macros A->Z", panel, sort_macros_switch, global_config.sort_macros); lv_create_custom_menu_switch("Show Full Filenames", panel, full_filenames_switch, global_config.full_filenames); + lv_create_custom_menu_switch("2X Size Gcode Image", panel, double_size_gcode_img_switch, global_config.double_size_gcode_img); lv_create_custom_menu_button("Configure Printer Host", panel, reset_ip_click, "Restart"); } From fdfa2d014ffa87e1f45e88b41fb7a16be5132261 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 11 Jan 2025 17:15:26 +0100 Subject: [PATCH 02/11] Properly clear input buffer for serial --- .../serial_klipper_printer_integration.cpp | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/CYD-Klipper/src/core/klipper-serial/serial_klipper_printer_integration.cpp b/CYD-Klipper/src/core/klipper-serial/serial_klipper_printer_integration.cpp index 01ad9ab..bc96566 100644 --- a/CYD-Klipper/src/core/klipper-serial/serial_klipper_printer_integration.cpp +++ b/CYD-Klipper/src/core/klipper-serial/serial_klipper_printer_integration.cpp @@ -3,12 +3,23 @@ #include #include "../../ui/serial/serial_console.h" -void clear_serial_buffer() +void clear_serial_buffer(bool can_rely_on_newline_terminator = true) { - while (Serial.available()) + if (can_rely_on_newline_terminator) { - Serial.read(); - }; + if (Serial.available()) + { + while (Serial.read() != '\n') + ; + } + } + else + { + while (Serial.available()) + { + Serial.read(); + } + } } // Request: {timeout} {method} {endpoint} @@ -46,7 +57,7 @@ bool make_serial_request(JsonDocument &out, int timeout_ms, HttpRequestType requ if (buff[0] < '0' || buff[0] > '9') { - Serial.println("Invalid error code"); + Serial.printf("Invalid error code, got char '%c'\n", buff[0]); clear_serial_buffer(); return false; @@ -108,7 +119,7 @@ bool make_binary_request(BinaryResponse* data, int timeout_ms, HttpRequestType r if (buff[0] < '0' || buff[0] > '9') { Serial.println("Invalid length"); - clear_serial_buffer(); + clear_serial_buffer(false); return false; } @@ -118,7 +129,7 @@ bool make_binary_request(BinaryResponse* data, int timeout_ms, HttpRequestType r if (data_length <= 0) { Serial.println("0 Length"); - clear_serial_buffer(); + clear_serial_buffer(false); return false; } @@ -129,7 +140,7 @@ bool make_binary_request(BinaryResponse* data, int timeout_ms, HttpRequestType r if (data->data == NULL) { Serial.println("Failed to allocate memory"); - clear_serial_buffer(); + clear_serial_buffer(false); return false; } From f8ed3afd0646b4e4d48eb82cd2afb67846d0b854 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 11 Jan 2025 23:50:58 +0100 Subject: [PATCH 03/11] Don't ignore first popup message (Klipper) --- CYD-Klipper/src/core/printer_integration.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/CYD-Klipper/src/core/printer_integration.cpp b/CYD-Klipper/src/core/printer_integration.cpp index a76ae38..0ee304f 100644 --- a/CYD-Klipper/src/core/printer_integration.cpp +++ b/CYD-Klipper/src/core/printer_integration.cpp @@ -62,11 +62,18 @@ PrinterData* BasePrinter::AnnouncePrinterData() lv_msg_send(DATA_PRINTER_STATE, get_current_printer()); } - if (old_popup_message != printer_data_copy->popup_message && old_popup_message != NULL && old_popup_message != blank && !no_free) + if (old_popup_message != printer_data_copy->popup_message) { - LOG_F(("Freeing popup message '%s' (%x)\n", old_popup_message, old_popup_message)); - free(old_popup_message); - lv_msg_send(DATA_PRINTER_POPUP, get_current_printer()); + if (old_popup_message != NULL && old_popup_message != blank && !no_free) + { + LOG_F(("Freeing popup message '%s' (%x)\n", old_popup_message, old_popup_message)); + free(old_popup_message); + } + + if (printer_data_copy->popup_message != NULL && printer_data_copy->popup_message != blank) + { + lv_msg_send(DATA_PRINTER_POPUP, get_current_printer()); + } } lv_msg_send(DATA_PRINTER_DATA, get_current_printer()); From 0992f466cfeb7b51e7f634c8b74eda95b2b7b058 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 12 Jan 2025 00:13:26 +0100 Subject: [PATCH 04/11] Fix Klipper params being non-blocking --- CYD-Klipper/src/core/current_printer.cpp | 2 +- CYD-Klipper/src/core/data_setup.cpp | 25 +--------- CYD-Klipper/src/core/data_setup.h | 5 +- .../core/klipper/klipper_printer_panels.cpp | 48 ++++++++++++------- CYD-Klipper/src/core/semaphore.cpp | 28 +++++++++++ CYD-Klipper/src/core/semaphore.h | 11 +++++ CYD-Klipper/src/ui/macros.cpp | 1 + CYD-Klipper/src/ui/ota_setup.cpp | 1 + CYD-Klipper/src/ui/wifi_setup.cpp | 1 + 9 files changed, 76 insertions(+), 46 deletions(-) create mode 100644 CYD-Klipper/src/core/semaphore.cpp create mode 100644 CYD-Klipper/src/core/semaphore.h diff --git a/CYD-Klipper/src/core/current_printer.cpp b/CYD-Klipper/src/core/current_printer.cpp index 31f594f..659845b 100644 --- a/CYD-Klipper/src/core/current_printer.cpp +++ b/CYD-Klipper/src/core/current_printer.cpp @@ -1,5 +1,5 @@ -#include "data_setup.h" #include "current_printer.h" +#include "semaphore.h" bool current_printer_move_printer(const char* axis, float amount, bool relative) { diff --git a/CYD-Klipper/src/core/data_setup.cpp b/CYD-Klipper/src/core/data_setup.cpp index 2427425..3df2315 100644 --- a/CYD-Klipper/src/core/data_setup.cpp +++ b/CYD-Klipper/src/core/data_setup.cpp @@ -1,5 +1,6 @@ #include "data_setup.h" +#include "semaphore.h" #include #include #include "printer_integration.hpp" @@ -8,32 +9,8 @@ #include "bambu/bambu_printer_integration.hpp" #include "octoprint/octoprint_printer_integration.hpp" -SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore; const long data_update_interval = 780; -void semaphore_init(){ - freezeRenderThreadSemaphore = xSemaphoreCreateMutex(); - freezeRequestThreadSemaphore = xSemaphoreCreateMutex(); - xSemaphoreGive(freezeRenderThreadSemaphore); - xSemaphoreGive(freezeRequestThreadSemaphore); -} - -void freeze_request_thread(){ - xSemaphoreTake(freezeRequestThreadSemaphore, portMAX_DELAY); -} - -void unfreeze_request_thread(){ - xSemaphoreGive(freezeRequestThreadSemaphore); -} - -void freeze_render_thread(){ - xSemaphoreTake(freezeRenderThreadSemaphore, portMAX_DELAY); -} - -void unfreeze_render_thread(){ - xSemaphoreGive(freezeRenderThreadSemaphore); -} - void fetch_printer_data() { freeze_request_thread(); diff --git a/CYD-Klipper/src/core/data_setup.h b/CYD-Klipper/src/core/data_setup.h index 6aebf01..188f059 100644 --- a/CYD-Klipper/src/core/data_setup.h +++ b/CYD-Klipper/src/core/data_setup.h @@ -1,7 +1,4 @@ #pragma once void data_loop(); -void data_setup(); - -void freeze_request_thread(); -void unfreeze_request_thread(); \ No newline at end of file +void data_setup(); \ No newline at end of file diff --git a/CYD-Klipper/src/core/klipper/klipper_printer_panels.cpp b/CYD-Klipper/src/core/klipper/klipper_printer_panels.cpp index c00418b..1c43f21 100644 --- a/CYD-Klipper/src/core/klipper/klipper_printer_panels.cpp +++ b/CYD-Klipper/src/core/klipper/klipper_printer_panels.cpp @@ -3,6 +3,27 @@ #include "../../ui/ui_utils.h" #include "../common/constants.h" #include +#include "../semaphore.h" + +bool send_gcode_blocking(const char *gcode, bool wait = true) +{ + freeze_request_thread(); + KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref + bool result = printer->send_gcode(gcode); + unfreeze_request_thread(); + + return result; +} + +bool move_printer_blocking(const char* axis, float amount, bool relative) +{ + freeze_request_thread(); + KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref + bool result = printer->move_printer(axis, amount, relative); + unfreeze_request_thread(); + + return result; +} static void set_fan_speed_text(lv_event_t * e) { lv_obj_t * label = lv_event_get_target(e); @@ -14,10 +35,9 @@ static void set_fan_speed_text(lv_event_t * e) { static void set_fan_speed(lv_event_t * e){ int speed = (int)lv_event_get_user_data(e); int actual_speed = fan_percent_to_byte(speed); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref char gcode[16]; sprintf(gcode, "M106 S%d", actual_speed); - printer->send_gcode(gcode); + send_gcode_blocking(gcode); } FAN_SPEED_COLUMN(set_fan_speed, klipper_fan_speed_columns) @@ -40,24 +60,21 @@ static void set_zoffset_text_ex(lv_event_t * e) { static void set_zoffset(lv_event_t * e){ char* offset = (char*)lv_event_get_user_data(e); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref - char gcode[48]; sprintf(gcode, "SET_GCODE_OFFSET Z_ADJUST=%s MOVE=1", offset); - printer->send_gcode(gcode); + send_gcode_blocking(gcode); } static void set_z(lv_event_t * e){ void* ptr = lv_event_get_user_data(e); float value = *(float *)(&ptr); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref if (value < 0) { - printer->send_gcode("SET_GCODE_OFFSET Z=0 MOVE=1"); + send_gcode_blocking("SET_GCODE_OFFSET Z=0 MOVE=1"); return; } - printer->move_printer("Z", value, false); + move_printer_blocking("Z", value, false); } const char* zoffsets[] = { "-0.01", "-0.025", "-0.05", "-0.2" }; @@ -80,20 +97,18 @@ static void set_speed_mult_text(lv_event_t * e){ static void set_speed_mult(lv_event_t * e){ int speed = (int)lv_event_get_user_data(e); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref char gcode[16]; sprintf(gcode, "M220 S%d", speed); - printer->send_gcode(gcode); + send_gcode_blocking(gcode); } static void set_speed_mult_offset(lv_event_t * e){ int speed = (int)lv_event_get_user_data(e); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref float result = get_current_printer_data()->speed_mult * 100 + speed; get_current_printer_data()->speed_mult = result / 100; char gcode[16]; sprintf(gcode, "M220 S%.0f", result); - printer->send_gcode(gcode); + send_gcode_blocking(gcode); } const char* speed_presets[] = { "50%", "100%", "150%", "200%" }; @@ -118,20 +133,19 @@ static void set_extrude_mult_text(lv_event_t * e){ static void set_extrude_mult(lv_event_t * e){ int speed = (int)lv_event_get_user_data(e); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref char gcode[16]; sprintf(gcode, "M221 S%d", speed); - printer->send_gcode(gcode); + send_gcode_blocking(gcode); } static void set_extrude_mult_offset(lv_event_t * e){ int speed = (int)lv_event_get_user_data(e); - KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref float result = get_current_printer_data()->extrude_mult * 100 + speed; get_current_printer_data()->extrude_mult = result / 100; char gcode[16]; sprintf(gcode, "M221 S%.0f", result); - printer->send_gcode(gcode); + + send_gcode_blocking(gcode); } const char* extrude_presets[] = { "95%", "100%", "105%", "110%" }; @@ -145,7 +159,7 @@ lv_button_column_t extrude_mult_columns[] = { }; static void open_fan_speed_panel(lv_event_t * e){ - lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_fan_speed_text, klipper_fan_speed_columns, 2); + lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_fan_speed_text, klipper_fan_speed_columns, 3); } static void open_zoffset_panel(lv_event_t * e){ diff --git a/CYD-Klipper/src/core/semaphore.cpp b/CYD-Klipper/src/core/semaphore.cpp new file mode 100644 index 0000000..903ab66 --- /dev/null +++ b/CYD-Klipper/src/core/semaphore.cpp @@ -0,0 +1,28 @@ +#include "semaphore.h" +#include +#include + +SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore; + +void semaphore_init(){ + freezeRenderThreadSemaphore = xSemaphoreCreateMutex(); + freezeRequestThreadSemaphore = xSemaphoreCreateMutex(); + xSemaphoreGive(freezeRenderThreadSemaphore); + xSemaphoreGive(freezeRequestThreadSemaphore); +} + +void freeze_request_thread(){ + xSemaphoreTake(freezeRequestThreadSemaphore, portMAX_DELAY); +} + +void unfreeze_request_thread(){ + xSemaphoreGive(freezeRequestThreadSemaphore); +} + +void freeze_render_thread(){ + xSemaphoreTake(freezeRenderThreadSemaphore, portMAX_DELAY); +} + +void unfreeze_render_thread(){ + xSemaphoreGive(freezeRenderThreadSemaphore); +} \ No newline at end of file diff --git a/CYD-Klipper/src/core/semaphore.h b/CYD-Klipper/src/core/semaphore.h new file mode 100644 index 0000000..ce1f626 --- /dev/null +++ b/CYD-Klipper/src/core/semaphore.h @@ -0,0 +1,11 @@ +#pragma once + +void semaphore_init(); + +void freeze_request_thread(); +void unfreeze_request_thread(); + +// Don't use unless you want trouble +void freeze_render_thread(); +// Don't use unless you want trouble +void unfreeze_render_thread(); \ No newline at end of file diff --git a/CYD-Klipper/src/ui/macros.cpp b/CYD-Klipper/src/ui/macros.cpp index 9afa22e..727479e 100644 --- a/CYD-Klipper/src/ui/macros.cpp +++ b/CYD-Klipper/src/ui/macros.cpp @@ -3,6 +3,7 @@ #include #include "../core/current_printer.h" #include "../core/data_setup.h" +#include "../core/semaphore.h" typedef struct { const char* power_device_name; diff --git a/CYD-Klipper/src/ui/ota_setup.cpp b/CYD-Klipper/src/ui/ota_setup.cpp index aa4d0a6..46111ab 100644 --- a/CYD-Klipper/src/ui/ota_setup.cpp +++ b/CYD-Klipper/src/ui/ota_setup.cpp @@ -5,6 +5,7 @@ #include "../core/data_setup.h" #include "../conf/global_config.h" #include "ota_setup.h" +#include "../core/semaphore.h" //const char *ota_url = "https://gist.githubusercontent.com/suchmememanyskill/ece418fe199e155340de6c224a0badf2/raw/0d6762d68bc807cbecc71e40d55b76692397a7b3/update.json"; // Test url const char *ota_url = "https://suchmememanyskill.github.io/CYD-Klipper/OTA.json"; // Prod url diff --git a/CYD-Klipper/src/ui/wifi_setup.cpp b/CYD-Klipper/src/ui/wifi_setup.cpp index a91d0f6..0b82f4d 100644 --- a/CYD-Klipper/src/ui/wifi_setup.cpp +++ b/CYD-Klipper/src/ui/wifi_setup.cpp @@ -7,6 +7,7 @@ #include "../core/lv_setup.h" #include "serial/serial_console.h" #include "panels/panel.h" +#include "../core/semaphore.h" void wifi_init_inner(); void wifi_pass_entry(const char* ssid); From 3aeb67cfddd13aacea671ed41cbe9d3684e31ecf Mon Sep 17 00:00:00 2001 From: Sims <38142618+suchmememanyskill@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:16:46 +0100 Subject: [PATCH 05/11] esp32-CROWPANEL-35C (#159) * :) * Correct screen rotation * Remove brightness adjustment * Silence buzzer * Fixes from atomique --- CYD-Klipper/boards/esp32-CROWPANEL-35C.json | 55 ++++++ CYD-Klipper/platformio.ini | 11 ++ .../src/core/device/ESP32-CROWPANEL-35C.cpp | 183 ++++++++++++++++++ ci.py | 7 +- 4 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 CYD-Klipper/boards/esp32-CROWPANEL-35C.json create mode 100644 CYD-Klipper/src/core/device/ESP32-CROWPANEL-35C.cpp diff --git a/CYD-Klipper/boards/esp32-CROWPANEL-35C.json b/CYD-Klipper/boards/esp32-CROWPANEL-35C.json new file mode 100644 index 0000000..56f68e4 --- /dev/null +++ b/CYD-Klipper/boards/esp32-CROWPANEL-35C.json @@ -0,0 +1,55 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld", + "partitions": "default_16MB.csv", + "memory_type": "qio_opi" + }, + "core": "esp32", + "extra_flags": [ + "-DCYD_SCREEN_HEIGHT_PX=320", + "-DCYD_SCREEN_WIDTH_PX=480", + "-DCYD_SCREEN_GAP_PX=10", + "-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_CROWPANEL_35C=1", + "-DCYD_SCREEN_DISABLE_TOUCH_CALIBRATION=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0x303A", + "0x1001" + ] + ], + "mcu": "esp32s3", + "variant": "esp32s3" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "esp32-8048S043C-SD", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.elecrow.com/esp-terminal-with-esp32-3-5-inch-parallel-480x320-tft-capacitive-touch-display-rgb-by-chip-ili9488.html", + "vendor": "CROWPANEL" + } \ No newline at end of file diff --git a/CYD-Klipper/platformio.ini b/CYD-Klipper/platformio.ini index d1e7486..c39c3d1 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -102,3 +102,14 @@ lib_deps = plageoj/UrlEncode@^1.0.1 knolleary/PubSubClient@^2.8 WiFiClientSecure + +[env:esp32-CROWPANEL-35C] +board = esp32-CROWPANEL-35C +lib_deps = + SPI + https://github.com/suchmememanyskill/lvgl + https://github.com/lovyan03/LovyanGFX@1.2.0 + bblanchon/ArduinoJson@^7.0.0 + plageoj/UrlEncode@^1.0.1 + knolleary/PubSubClient@^2.8 + WiFiClientSecure diff --git a/CYD-Klipper/src/core/device/ESP32-CROWPANEL-35C.cpp b/CYD-Klipper/src/core/device/ESP32-CROWPANEL-35C.cpp new file mode 100644 index 0000000..bf25583 --- /dev/null +++ b/CYD-Klipper/src/core/device/ESP32-CROWPANEL-35C.cpp @@ -0,0 +1,183 @@ +// Adapted from https://github.com/OzInFl/Elecrow-3.5-RGB-TFT-SQUARELINE-EXAMPLE + +#ifdef CYD_SCREEN_DRIVER_ESP32_CROWPANEL_35C +#include "../screen_driver.h" +#include "lvgl.h" +#include "../../conf/global_config.h" +#include +#include +#include + +#ifdef CYD_SCREEN_VERTICAL +#error "Vertical screen not supported with the ESP32_CROWPANEL_28R driver" +#endif + +static lv_disp_draw_buf_t draw_buf; +static lv_color_t buf[CYD_SCREEN_HEIGHT_PX * CYD_SCREEN_WIDTH_PX / 10]; + +#define BUZZER_PIN 20 +#define LCD_BL 46 +#define SDA_FT6236 38 +#define SCL_FT6236 39 +#define I2C_TOUCH_ADDR 0x38 + +class LGFX : public lgfx::LGFX_Device +{ + lgfx::Panel_ILI9488 _panel_instance; + lgfx::Bus_Parallel16 _bus_instance; + lgfx::Touch_FT5x06 _touch_instance; + +public: + LGFX() + { + auto bus_cfg = _bus_instance.config(); + bus_cfg.port = 0; + bus_cfg.freq_write = 80000000; + bus_cfg.pin_wr = 18; + bus_cfg.pin_rd = 48; + bus_cfg.pin_rs = 45; + bus_cfg.pin_d0 = 47; + bus_cfg.pin_d1 = 21; + bus_cfg.pin_d2 = 14; + bus_cfg.pin_d3 = 13; + bus_cfg.pin_d4 = 12; + bus_cfg.pin_d5 = 11; + bus_cfg.pin_d6 = 10; + bus_cfg.pin_d7 = 9; + bus_cfg.pin_d8 = 3; + bus_cfg.pin_d9 = 8; + bus_cfg.pin_d10 = 16; + bus_cfg.pin_d11 = 15; + bus_cfg.pin_d12 = 7; + bus_cfg.pin_d13 = 6; + bus_cfg.pin_d14 = 5; + bus_cfg.pin_d15 = 4; + _bus_instance.config(bus_cfg); + _panel_instance.setBus(&_bus_instance); + + auto panel_cfg = _panel_instance.config(); + panel_cfg.pin_cs = -1; + panel_cfg.pin_rst = -1; + panel_cfg.pin_busy = -1; + panel_cfg.memory_width = 320; + panel_cfg.memory_height = 480; + panel_cfg.panel_width = 320; + panel_cfg.panel_height = 480; + panel_cfg.offset_x = 0; + panel_cfg.offset_y = 0; + panel_cfg.offset_rotation = 0; + panel_cfg.dummy_read_pixel = 8; + panel_cfg.dummy_read_bits = 1; + panel_cfg.readable = true; + panel_cfg.invert = global_config.printer_config[global_config.printer_index].invert_colors ? true : false; + panel_cfg.rgb_order = false; + panel_cfg.dlen_16bit = true; + panel_cfg.bus_shared = true; + + _panel_instance.config(panel_cfg); + + auto touch_cfg = _touch_instance.config(); + touch_cfg.x_min = 0; + touch_cfg.x_max = 319; + touch_cfg.y_min = 0; + touch_cfg.y_max = 479; + touch_cfg.pin_int = -1; + touch_cfg.bus_shared = false; + touch_cfg.offset_rotation = 0; + + touch_cfg.i2c_port = 1; + touch_cfg.i2c_addr = 0x38; + touch_cfg.pin_sda = 38; + touch_cfg.pin_scl = 39; + touch_cfg.freq = 400000; + + _touch_instance.config(touch_cfg); + _panel_instance.setTouch(&_touch_instance); + + setPanel(&_panel_instance); + } +}; + +LGFX tft; + +void screen_setBrightness(unsigned char brightness) +{ + // TODO +} + +void set_invert_display() +{ + // TODO +} + +void screen_lv_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) +{ + uint32_t w = (area->x2 - area->x1 + 1); + uint32_t h = (area->y2 - area->y1 + 1); + + tft.startWrite(); + tft.setAddrWindow(area->x1, area->y1, w, h); + tft.writePixels((lgfx::rgb565_t *)&color_p->full, w * h); + tft.endWrite(); + + lv_disp_flush_ready(disp); +} + +void screen_lv_touchRead(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) +{ + uint16_t touchX, touchY; + + bool touched = tft.getTouch(&touchX, &touchY); + + if (touchX > CYD_SCREEN_WIDTH_PX || touchY > CYD_SCREEN_HEIGHT_PX) + { + LOG_LN("Y or y outside of expected parameters.."); + } + else + { + data->state = touched ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + data->point.x = touchX; + data->point.y = touchY; + } +} + +void screen_setup() +{ + pinMode(BUZZER_PIN, OUTPUT); + ledcSetup(4, 5000, 8); + ledcAttachPin(BUZZER_PIN, 4); + + tft.begin(); + tft.setRotation(global_config.rotate_screen ? 3 : 1); + + delay(500); + + pinMode(LCD_BL, OUTPUT); + digitalWrite(LCD_BL, HIGH); + +/* + ledcSetup(0, 5000, 12); + ledcAttachPin(LCD_BL, 0); +*/ + + lv_init(); + lv_disp_draw_buf_init(&draw_buf, buf, NULL, CYD_SCREEN_WIDTH_PX * CYD_SCREEN_HEIGHT_PX / 10); + + /*Initialize the display*/ + static lv_disp_drv_t disp_drv; + lv_disp_drv_init(&disp_drv); + disp_drv.hor_res = CYD_SCREEN_WIDTH_PX; + disp_drv.ver_res = CYD_SCREEN_HEIGHT_PX; + disp_drv.flush_cb = screen_lv_flush; + disp_drv.draw_buf = &draw_buf; + lv_disp_drv_register(&disp_drv); + + /*Initialize the (dummy) input device driver*/ + static lv_indev_drv_t indev_drv; + lv_indev_drv_init(&indev_drv); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.read_cb = screen_lv_touchRead; + lv_indev_drv_register(&indev_drv); +} + +#endif \ No newline at end of file diff --git a/ci.py b/ci.py index 3917a62..535cdf6 100644 --- a/ci.py +++ b/ci.py @@ -11,12 +11,14 @@ CYD_PORTS = [ "esp32-3248S035C-V", #"esp32-4827S043R-SD", "esp32-CROWPANEL-28R", + "esp32-CROWPANEL-35C", ] ESP_S3_CHIPS = [ "esp32-8048S043C-SD", "esp32-8048S043C-SD-alt", "esp32-4827S043C-SD", + "esp32-CROWPANEL-35C", ] BASE_DIR = os.getcwd() @@ -80,7 +82,10 @@ for port in CYD_PORTS: shutil.copy(os.path.join(os.path.expanduser("~"), ".platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin"), f"{port_path}/boot_app0.bin") os.chdir(port_path) - subprocess.run(["python3", "-m", "esptool", "--chip", "esp32", "merge_bin", "-o", "merged_firmware.bin", "--flash_mode", "dio", "--flash_freq", "40m", "--flash_size", "4MB", "0x1000", "bootloader.bin", "0x8000", "partitions.bin", "0xe000", "boot_app0.bin", "0x10000", "firmware.bin"], check=True) + if (port in ESP_S3_CHIPS): + subprocess.run(["python3", "-m", "esptool", "--chip", "esp32s3", "merge_bin", "-o", "merged_firmware.bin", "--flash_mode", "qio", "--flash_freq", "80m", "--flash_size", "16MB", "0x1000", "bootloader.bin", "0x8000", "partitions.bin", "0xe000", "boot_app0.bin", "0x10000", "firmware.bin"], check=True) + else: + subprocess.run(["python3", "-m", "esptool", "--chip", "esp32", "merge_bin", "-o", "merged_firmware.bin", "--flash_mode", "dio", "--flash_freq", "40m", "--flash_size", "4MB", "0x1000", "bootloader.bin", "0x8000", "partitions.bin", "0xe000", "boot_app0.bin", "0x10000", "firmware.bin"], check=True) os.chdir(BASE_DIR) From 4e3cd69b63a198c848068fbe90fb4a2302eebd78 Mon Sep 17 00:00:00 2001 From: Kire Dyfvelsten Date: Tue, 28 Jan 2025 21:19:36 +0100 Subject: [PATCH 06/11] Sunton esp32 2.2" c (#151) * Update readme * Update README.md * driver definition? for a vertical 2.2" with touch * Update platformio.ini * Update esp32-2432S022C-vertical.json * Update esp32-2432S022C-vertical.json --------- Co-authored-by: Sims <38142618+suchmememanyskill@users.noreply.github.com> --- .../boards/esp32-2432S022C-vertical.json | 127 ++++++++++++++++++ CYD-Klipper/platformio.ini | 4 + README.md | 5 +- _site/index.html | 2 +- 4 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 CYD-Klipper/boards/esp32-2432S022C-vertical.json diff --git a/CYD-Klipper/boards/esp32-2432S022C-vertical.json b/CYD-Klipper/boards/esp32-2432S022C-vertical.json new file mode 100644 index 0000000..ce76058 --- /dev/null +++ b/CYD-Klipper/boards/esp32-2432S022C-vertical.json @@ -0,0 +1,127 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": [ + "'-D ARDUINO_ESP32_DEV'", + "'-D ESP32_2432S022C'", + "'-D LCD_WIDTH=240'", + "'-D LCD_HEIGHT=320'", + "'-D LVGL_BUFFER_PIXELS=(LCD_WIDTH*LCD_HEIGHT/8)'", + "'-D LVGL_BUFFER_MALLOC_FLAGS=(MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)'", + "'-D GPIO_BCKL=0'", + "'-D LCD_ST7789_I80'", + "'-D ST7789_I80_BUS_CONFIG_CLK_SRC=LCD_CLK_SRC_PLL160M'", + "'-D ST7789_I80_BUS_CONFIG_DC=16'", + "'-D ST7789_I80_BUS_CONFIG_WR=4'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D8=15'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D9=13'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D10=12'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D11=14'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D12=27'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D13=25'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D14=33'", + "'-D ST7789_I80_BUS_CONFIG_DATA_GPIO_D15=32'", + "'-D ST7789_I80_BUS_CONFIG_BUS_WIDTH=8'", + "'-D ST7789_I80_BUS_CONFIG_MAX_TRANSFER_BYTES=(LVGL_BUFFER_PIXELS * sizeof(lv_color_t))'", + "'-D ST7789_I80_BUS_CONFIG_PSRAM_TRANS_ALIGN=64'", + "'-D ST7789_I80_BUS_CONFIG_SRAM_TRANS_ALIGN=4'", + "'-D ST7789_IO_I80_CONFIG_CS_GPIO_NUM=17'", + "'-D ST7789_IO_I80_CONFIG_PCLK_HZ=12000000'", + "'-D ST7789_IO_I80_CONFIG_TRANS_QUEUE_DEPTH=10'", + "'-D ST7789_IO_I80_CONFIG_LCD_CMD_BITS=8'", + "'-D ST7789_IO_I80_CONFIG_LCD_PARAM_BITS=8'", + "'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_IDLE_LEVEL=0'", + "'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_CMD_LEVEL=0'", + "'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_DUMMY_LEVEL=0'", + "'-D ST7789_IO_I80_CONFIG_DC_LEVELS_DC_DATA_LEVEL=1'", + "'-D ST7789_IO_I80_CONFIG_FLAGS_CS_ACTIVE_HIGH=0'", + "'-D ST7789_IO_I80_CONFIG_FLAGS_REVERSE_COLOR_BITS=0'", + "'-D ST7789_IO_I80_CONFIG_FLAGS_SWAP_COLOR_BYTES=0'", + "'-D ST7789_IO_I80_CONFIG_FLAGS_PCLK_ACTIVE_NEG=0'", + "'-D ST7789_IO_I80_CONFIG_FLAGS_PCLK_IDLE_LOW=0'", + "'-D ST7789_DEV_CONFIG_RESET_GPIO_NUM=GPIO_NUM_NC'", + "'-D ST7789_DEV_CONFIG_COLOR_SPACE=ESP_LCD_COLOR_SPACE_RGB'", + "'-D ST7789_DEV_CONFIG_BITS_PER_PIXEL=16'", + "'-D ST7789_DEV_CONFIG_FLAGS_RESET_ACTIVE_HIGH=false'", + "'-D ST7789_DEV_CONFIG_VENDOR_CONFIG=NULL'", + "'-D ST7789_RD_GPIO=2'", + "'-D LCD_SWAP_XY=false'", + "'-D LCD_MIRROR_X=false'", + "'-D LCD_MIRROR_Y=false'", + "'-D BOARD_HAS_TOUCH'", + "'-D TOUCH_CST816S_I2C'", + "'-D CST816S_I2C_HOST=I2C_NUM_0'", + "'-D CST816S_I2C_CONFIG_SDA_IO_NUM=21'", + "'-D CST816S_I2C_CONFIG_SCL_IO_NUM=22'", + "'-D CST816S_I2C_CONFIG_SDA_PULLUP_EN=GPIO_PULLUP_ENABLE'", + "'-D CST816S_I2C_CONFIG_SCL_PULLUP_EN=GPIO_PULLUP_ENABLE'", + "'-D CST816S_I2C_CONFIG_MASTER_CLK_SPEED=400000'", + "'-D CST816S_I2C_CONFIG_CLK_FLAGS=0'", + "'-D CST816S_IO_I2C_CONFIG_DEV_ADDR=ESP_LCD_TOUCH_IO_I2C_CST816S_ADDRESS'", + "'-D CST816S_IO_I2C_CONFIG_CONTROL_PHASE_BYTES=1'", + "'-D CST816S_IO_I2C_CONFIG_DC_BIT_OFFSET=0'", + "'-D CST816S_IO_I2C_CONFIG_LCD_CMD_BITS=8'", + "'-D CST816S_IO_I2C_CONFIG_LCD_PARAM_BITS=0'", + "'-D CST816S_IO_I2C_CONFIG_FLAGS_DC_LOW_ON_DATA=false'", + "'-D CST816S_IO_I2C_CONFIG_FLAGS_DISABLE_CONTROL_PHASE=true'", + "'-D CST816S_TOUCH_CONFIG_X_MAX=LCD_WIDTH'", + "'-D CST816S_TOUCH_CONFIG_Y_MAX=LCD_HEIGHT'", + "'-D CST816S_TOUCH_CONFIG_RST_GPIO_NUM=GPIO_NUM_NC'", + "'-D CST816S_TOUCH_CONFIG_INT_GPIO_NUM=GPIO_NUM_NC'", + "'-D CST816S_TOUCH_CONFIG_LEVELS_RESET=0'", + "'-D CST816S_TOUCH_CONFIG_LEVELS_INTERRUPT=0'", + "'-D TOUCH_SWAP_XY=false'", + "'-D TOUCH_SWAP_X=false'", + "'-D TOUCH_SWAP_Y=false'", + "'-D BOARD_HAS_TF'", + "'-D TF_CS=5'", + "'-D TF_SPI_MOSI=23'", + "'-D TF_SPI_SCLK=18'", + "'-D TF_SPI_MISO=19'", + "'-D BOARD_HAS_SPEAK'", + "'-D SPEAK=26'", + + "-DCYD_SCREEN_GAP_PX=8", + "-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=35", + "-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=35", + "-DCYD_SCREEN_VERTICAL=1", + "-DCYD_SCREEN_FONT=lv_font_montserrat_14", + "-DCYD_SCREEN_FONT_SMALL=lv_font_montserrat_10", + "-DCYD_SCREEN_SIDEBAR_SIZE_PX=40", + "-DCYD_SCREEN_DRIVER_ESP32_SMARTDISPLAY=1", + "-DCYD_SCREEN_DISABLE_TOUCH_CALIBRATION=1", + "-DCYD_SCREEN_DISABLE_INVERT_COLORS=1" + ], + "f_cpu": "240000000L", + "f_flash": "40000000L", + "flash_mode": "dio", + "mcu": "esp32", + "variant": "esp32" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_board": "esp-wroom-32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "esp32-2432S022C-V", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://www.aliexpress.com/item/1005006284154750.html", + "vendor": "Sunton" + } diff --git a/CYD-Klipper/platformio.ini b/CYD-Klipper/platformio.ini index c39c3d1..0929073 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -92,6 +92,9 @@ board = esp32-8048S043C-smartdisplay [env:esp32-8048S043C-SD-alt] board = esp32-8048S043C-smartdisplay-alt +[env:esp32-2432S022C-SD-V] +board = esp32-2432S022C-vertical + [env:esp32-CROWPANEL-28R] board = esp32-CROWPANEL-28R lib_deps = @@ -113,3 +116,4 @@ lib_deps = plageoj/UrlEncode@^1.0.1 knolleary/PubSubClient@^2.8 WiFiClientSecure + diff --git a/README.md b/README.md index 13e7171..5d52b2a 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ [![Donations](https://img.shields.io/badge/Support%20on-Ko--Fi-red)](https://ko-fi.com/suchmememanyskill) # CYD-Klipper -An implementation of a wireless Klipper status display on an ESP32 + screen. Uses Moonraker to fetch data. +An implementation of a wireless Klipper, Bambu and Octoprint status display on an ESP32 + screen. Uses Moonraker to fetch data. A simple and cheap solution to use a dedicated screen with Klipper, a 3d printing Firmware. +Also now with Bambu Lab and Octoprint printers! ![showcase_image](readme/PXL_20231113_171629383.jpg) @@ -24,6 +25,8 @@ A ESP32-2432S028R is required to run this project. You can find out where to buy - Toggle Moonraker power devices - OTA updates - Serial console over USB (115200 8n1, echo off, LF/LF) +- Control Klipper, Octoprint and Bambu printers. +- Wired Serial/Usb Klipper connection ### Install diff --git a/_site/index.html b/_site/index.html index 62444d5..da92100 100644 --- a/_site/index.html +++ b/_site/index.html @@ -71,7 +71,7 @@

CYD-Klipper

-

An implementation of a Klipper status display on an ESP32 + screen.
Uses Moonraker to fetch data.
Source code is available on GitHub.

+

An implementation of a wireless Klipper, Bambu and Octoprint status display on an ESP32 + screen.
Uses Moonraker to fetch data.
Source code is available on GitHub.

Changelog

From 8d8e36fde9c5f2b6cf9290d0ae889c0a91233b76 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:20:22 +0100 Subject: [PATCH 07/11] Merge #152 --- CYD-Klipper/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CYD-Klipper/platformio.ini b/CYD-Klipper/platformio.ini index 0929073..ee36d08 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -84,7 +84,7 @@ board = esp32-3248S035C-smartdisplay board = esp32-4827S043C-smartdisplay [env:esp32-4827S043R-SD] -board = esp32-4827S043C-smartdisplay +board = esp32-4827S043R-smartdisplay [env:esp32-8048S043C-SD] board = esp32-8048S043C-smartdisplay From 9bfbb1cb0ec37d8b1d03325186b1e0c556226a4b Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:23:02 +0100 Subject: [PATCH 08/11] Change keyboard for bambu setup (#161) --- CYD-Klipper/src/ui/ip_setup.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/CYD-Klipper/src/ui/ip_setup.cpp b/CYD-Klipper/src/ui/ip_setup.cpp index b5bab46..8e5ab95 100644 --- a/CYD-Klipper/src/ui/ip_setup.cpp +++ b/CYD-Klipper/src/ui/ip_setup.cpp @@ -375,6 +375,7 @@ void show_ip_entry() lv_textarea_set_placeholder_text(host_entry, "Printer IP"); lv_textarea_set_placeholder_text(port_entry, "Access code"); lv_textarea_set_placeholder_text(auth_entry, "Printer serial number"); + lv_obj_add_flag(auth_entry, LV_OBJ_FLAG_USER_3); break; case PrinterType::PrinterTypeOctoprint: lv_obj_clear_flag(auth_entry, LV_OBJ_FLAG_USER_2); From d616ef5a6d95a76d47b8afa88eec91470b92ee33 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:50:21 +0100 Subject: [PATCH 09/11] Allow running service under root --- serial/install.sh | 47 +++++++++++++++++++++++++++++---------------- serial/uninstall.sh | 20 ++++++++++++------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/serial/install.sh b/serial/install.sh index 7fe8471..2e57dfc 100644 --- a/serial/install.sh +++ b/serial/install.sh @@ -1,8 +1,15 @@ #!/bin/bash if [ "$EUID" -eq 0 ]; then - echo "Please do not run as root" - exit + read -r -p "Are you sure you want to run this service as root? [y/N] " response + response=${response,,} # tolower + if ! [[ "$response" =~ ^(yes|y)$ ]]; then + exit + fi + SERVICE_PATH="/etc/systemd/system/cyd-klipper-serial.service" +else + mkdir -p ~/.config/systemd/user + SERVICE_PATH="~/.config/systemd/user/cyd-klipper-serial.service" fi set -e @@ -15,20 +22,26 @@ source ./env/bin/activate pip3 install -r requirements.txt # Create systemd unit file -mkdir -p ~/.config/systemd/user -echo "[Unit]" > ~/.config/systemd/user/cyd-klipper-serial.service -echo "Description=CYD Klipper serial server" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "After=network.target" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "[Service]" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "ExecStart=$(pwd)/run.sh" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "WorkingDirectory=$(pwd)" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "Restart=always" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "[Install]" >> ~/.config/systemd/user/cyd-klipper-serial.service -echo "WantedBy=multi-user.target" >> ~/.config/systemd/user/cyd-klipper-serial.service + +echo "[Unit]" > $SERVICE_PATH +echo "Description=CYD Klipper serial server" >> $SERVICE_PATH +echo "After=network.target" >> $SERVICE_PATH +echo "" >> $SERVICE_PATH +echo "[Service]" >> $SERVICE_PATH +echo "ExecStart=$(pwd)/run.sh" >> $SERVICE_PATH +echo "WorkingDirectory=$(pwd)" >> $SERVICE_PATH +echo "Restart=always" >> $SERVICE_PATH +echo "" >> $SERVICE_PATH +echo "[Install]" >> $SERVICE_PATH +echo "WantedBy=multi-user.target" >> $SERVICE_PATH # Start the service -systemctl --user daemon-reload -systemctl --user enable cyd-klipper-serial -systemctl --user start cyd-klipper-serial \ No newline at end of file +if [ "$EUID" -eq 0 ]; then + systemctl daemon-reload + systemctl enable cyd-klipper-serial + systemctl start cyd-klipper-serial +else + systemctl --user daemon-reload + systemctl --user enable cyd-klipper-serial + systemctl --user start cyd-klipper-serial +fi \ No newline at end of file diff --git a/serial/uninstall.sh b/serial/uninstall.sh index 02735b2..34d210c 100644 --- a/serial/uninstall.sh +++ b/serial/uninstall.sh @@ -1,13 +1,19 @@ #!/bin/bash +set -e + if [ "$EUID" -eq 0 ]; then - echo "Please do not run as root" - exit -fi + systemctl stop cyd-klipper-serial + systemctl disable cyd-klipper-serial -systemctl --user stop cyd-klipper-serial -systemctl --user disable cyd-klipper-serial + rm /etc/systemd/system/cyd-klipper-serial.service -rm ~/.config/systemd/user/cyd-klipper-serial.service + systemctl daemon-reload +else + systemctl --user stop cyd-klipper-serial + systemctl --user disable cyd-klipper-serial -systemctl --user daemon-reload \ No newline at end of file + rm ~/.config/systemd/user/cyd-klipper-serial.service + + systemctl --user daemon-reload +fi \ No newline at end of file From fbc2964ad826c26e934eb6405fb78d2d050e89b6 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:20:06 +0100 Subject: [PATCH 10/11] Make serial script work with both sudo and not sudo --- serial/install.sh | 8 +++++++- serial/uninstall.sh | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/serial/install.sh b/serial/install.sh index 2e57dfc..5609f96 100644 --- a/serial/install.sh +++ b/serial/install.sh @@ -8,8 +8,14 @@ if [ "$EUID" -eq 0 ]; then fi SERVICE_PATH="/etc/systemd/system/cyd-klipper-serial.service" else + echo "Are you sure you want to run this service as the current user?" + read -r -p "Make sure this user is logged in at boot! [y/N] " response + response=${response,,} # tolower + if ! [[ "$response" =~ ^(yes|y)$ ]]; then + exit + fi mkdir -p ~/.config/systemd/user - SERVICE_PATH="~/.config/systemd/user/cyd-klipper-serial.service" + SERVICE_PATH="$HOME/.config/systemd/user/cyd-klipper-serial.service" fi set -e diff --git a/serial/uninstall.sh b/serial/uninstall.sh index 34d210c..2d72807 100644 --- a/serial/uninstall.sh +++ b/serial/uninstall.sh @@ -16,4 +16,6 @@ else rm ~/.config/systemd/user/cyd-klipper-serial.service systemctl --user daemon-reload -fi \ No newline at end of file +fi + +rm -rf ./env \ No newline at end of file From d8a9b13fe14c721a65dd08f8765227af11a40d55 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:37:06 +0100 Subject: [PATCH 11/11] Fix compile --- .github/workflows/compile.yaml | 10 +++++----- CYD-Klipper/src/ui/ip_setup.cpp | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/compile.yaml b/.github/workflows/compile.yaml index 411fc31..950656f 100644 --- a/.github/workflows/compile.yaml +++ b/.github/workflows/compile.yaml @@ -20,7 +20,7 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -31,7 +31,7 @@ jobs: # ~/.platformio/.cache # key: ${{ runner.os }}-pio-cyd-klipper - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: '3.9' @@ -43,13 +43,13 @@ jobs: python3 ci.py - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: firmware path: ./out - name: Upload GitHub Page Artifact - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 deploy: environment: @@ -65,5 +65,5 @@ jobs: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v2 + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/CYD-Klipper/src/ui/ip_setup.cpp b/CYD-Klipper/src/ui/ip_setup.cpp index 8e5ab95..ab239dc 100644 --- a/CYD-Klipper/src/ui/ip_setup.cpp +++ b/CYD-Klipper/src/ui/ip_setup.cpp @@ -375,6 +375,7 @@ void show_ip_entry() lv_textarea_set_placeholder_text(host_entry, "Printer IP"); lv_textarea_set_placeholder_text(port_entry, "Access code"); lv_textarea_set_placeholder_text(auth_entry, "Printer serial number"); + lv_obj_clear_flag(auth_entry, LV_OBJ_FLAG_USER_2); lv_obj_add_flag(auth_entry, LV_OBJ_FLAG_USER_3); break; case PrinterType::PrinterTypeOctoprint: