From 9e739de73168714ac5cced4fa85ac571595d2398 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:37:07 +0200 Subject: [PATCH 01/11] Add more clear manual install instructions --- Build.md => Manual_Install.md | 29 ++++++++++++++++++++--------- readme/platformio.png | Bin 0 -> 79652 bytes 2 files changed, 20 insertions(+), 9 deletions(-) rename Build.md => Manual_Install.md (65%) create mode 100644 readme/platformio.png diff --git a/Build.md b/Manual_Install.md similarity index 65% rename from Build.md rename to Manual_Install.md index 4d2b2ba..8d3d8a8 100644 --- a/Build.md +++ b/Manual_Install.md @@ -1,29 +1,38 @@ -# Building +# Manual install -## Running a developer build +## Flashing a build via the commandline -On every change made in this repository, [Github Actions](https://github.com/suchmememanyskill/CYD-Klipper/actions) automatically builds the firmware images for various screens. You can run one of these images as follows: +#### Release firmware image + +1. Go to [the releases tab](https://github.com/suchmememanyskill/CYD-Klipper/releases), and download the latest `firmware.zip` release. +2. Open the firmware.zip archive you just downloaded, open the corresponding folder for your screen, then extract `merged_firmware.bin` + +This merged_firmware.bin file is a ready to flash image. Note that flashing this image does wipe your current configuration. + +#### Developer firmware image +On every change made in this repository, [Github Actions](https://github.com/suchmememanyskill/CYD-Klipper/actions) automatically builds the firmware images for various screens. -#### Getting a firmware image 0. Make sure you are logged into github 1. Go to a [Github Actions](https://github.com/suchmememanyskill/CYD-Klipper/actions) build summary, then download the `firmware` Artifact. 2. Open the firmware.zip archive you just downloaded, open the corresponding folder for your screen, then extract `merged_firmware.bin` This merged_firmware.bin file is a ready to flash image. Note that flashing this image does wipe your current configuration. -#### Flashing merged_firmware.bin +### Flashing merged_firmware.bin 1. Download and extract [esptool](https://github.com/espressif/esptool/releases) to a new folder - For windows, download `esptool-v4.7.0-win64.zip` 2. Open a terminal window and navigate to this new folder containing esptool - In windows, you can type cmd and press enter in the address bar in explorer to jump to the folder in cmd ![cmd](readme/cmd.jpg) 3. Move `merged-firmware.bin` into this new folder 4. Connect the display to your computer -5. Execute the command `esptool write_flash 0x0 merged-firmware.bin` +5. Execute the command `esptool write_flash 0x0 merged_firmware.bin` - Don't forget to hold down the boot button on the display -## Building via PlatformIO +## Building & Flashing via PlatformIO -0. Install [Visual Studio Code](https://code.visualstudio.com/) and install the PlatformIO IDE plugin. +0. Install the following tools: + - [Visual Studio Code](https://code.visualstudio.com/) and install the PlatformIO IDE plugin. + - [Git](https://git-scm.com/download/win) 1. Download the source code of CYD-Klipper - This can be done via the `git clone https://github.com/suchmememanyskill/CYD-Klipper` command or via the green `<> Code` button on Github 2. Open the CYD-Klipper folder inside the CYD-Klipper folder in Visual Studio Code @@ -34,4 +43,6 @@ This merged_firmware.bin file is a ready to flash image. Note that flashing this 5. Connect the display to your computer 6. Click 'Upload and Monitor' - This will start compiling the code, and after upload it to the display - - Don't forget to hold the boot button while flashing. The screen will flash when the firmware is attempted to be flashed \ No newline at end of file + - Don't forget to hold the boot button while flashing. The screen will flash when the firmware is attempted to be flashed + +![platformio](readme/platformio.png) \ No newline at end of file diff --git a/readme/platformio.png b/readme/platformio.png new file mode 100644 index 0000000000000000000000000000000000000000..0c25164965b90bd3e395e0aa8fdecfffab4d2cb5 GIT binary patch literal 79652 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

|Jwex85!07LU)0E`yjFj2FU9Qo5 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

hOYO%<%yYr~Yb$_${U6hz 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 SW^yFpM@jCsY@zfc-~RxNt#}3i literal 0 HcmV?d00001 From e06ea214c47100af1b95b32fc9ef1e687645087b Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:02:05 +0200 Subject: [PATCH 02/11] esp32-4827S043R --- .../boards/esp32-4827S043R-smartdisplay.json | 146 ++++++++++++++++++ CYD-Klipper/src/ui/panels/settings_panel.cpp | 5 + ci.py | 4 +- 3 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 CYD-Klipper/boards/esp32-4827S043R-smartdisplay.json diff --git a/CYD-Klipper/boards/esp32-4827S043R-smartdisplay.json b/CYD-Klipper/boards/esp32-4827S043R-smartdisplay.json new file mode 100644 index 0000000..c686baa --- /dev/null +++ b/CYD-Klipper/boards/esp32-4827S043R-smartdisplay.json @@ -0,0 +1,146 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld", + "partitions": "default_16MB.csv", + "memory_type": "qio_opi" + }, + "core": "esp32", + "extra_flags": [ + "'-D ARDUINO_ESP32S3_DEV'", + "'-D BOARD_HAS_PSRAM'", + "'-D ARDUINO_USB_MODE=1'", + "'-D ARDUINO_RUNNING_CORE=1'", + "'-D ARDUINO_EVENT_RUNNING_CORE=1'", + "'-D ARDUINO_USB_CDC_ON_BOOT=0'", + "'-D ESP32_4827S043R'", + "'-D LCD_WIDTH=480'", + "'-D LCD_HEIGHT=272'", + "'-D LVGL_BUFFER_PIXELS=(LCD_WIDTH*LCD_HEIGHT)'", + "'-D LVGL_BUFFER_MALLOC_FLAGS=(MALLOC_CAP_SPIRAM|MALLOC_CAP_8BIT)'", + "'-D GPIO_BCKL=2'", + "'-D LCD_ST7262_PAR'", + "'-D ST7262_PANEL_CONFIG_CLK_SRC=LCD_CLK_SRC_PLL160M'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_PCLK_HZ=(8*1000000)'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_H_RES=LCD_WIDTH'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_V_RES=LCD_HEIGHT'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_HSYNC_PULSE_WIDTH=4'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_HSYNC_BACK_PORCH=43'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_HSYNC_FRONT_PORCH=8'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_VSYNC_PULSE_WIDTH=4'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_VSYNC_BACK_PORCH=12'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_VSYNC_FRONT_PORCH=8'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_FLAGS_HSYNC_IDLE_LOW=true'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_FLAGS_VSYNC_IDLE_LOW=true'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_FLAGS_DE_IDLE_HIGH=false'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_ACTIVE_NEG=true'", + "'-D ST7262_PANEL_CONFIG_TIMINGS_FLAGS_PCLK_IDLE_HIGH=false'", + "'-D ST7262_PANEL_CONFIG_DATA_WIDTH=16'", + "'-D ST7262_PANEL_CONFIG_SRAM_TRANS_ALIGN=4'", + "'-D ST7262_PANEL_CONFIG_PSRAM_TRANS_ALIGN=64'", + "'-D ST7262_PANEL_CONFIG_HSYNC_GPIO_NUM=39'", + "'-D ST7262_PANEL_CONFIG_VSYNC_GPIO_NUM=41'", + "'-D ST7262_PANEL_CONFIG_DE_GPIO_NUM=40'", + "'-D ST7262_PANEL_CONFIG_PCLK_GPIO_NUM=42'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_R0=8'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_R1=3'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_R2=46'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_R3=9'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_R4=1'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_G0=5'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_G1=6'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_G2=7'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_G3=15'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_G4=16'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_G5=4'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_B0=45'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_B1=48'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_B2=47'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_B3=21'", + "'-D ST7262_PANEL_CONFIG_DATA_GPIO_B4=14'", + "'-D ST7262_PANEL_CONFIG_DISP_GPIO_NUM=GPIO_NUM_NC'", + "'-D ST7262_PANEL_CONFIG_FLAGS_DISP_ACTIVE_LOW=false'", + "'-D ST7262_PANEL_CONFIG_FLAGS_RELAX_ON_IDLE=false'", + "'-D ST7262_PANEL_CONFIG_FLAGS_FB_IN_PSRAM=true'", + "'-D BOARD_HAS_TOUCH'", + "'-D TOUCH_XPT2046_SPI'", + "'-D XPT2046_SPI_HOST=SPI2_HOST'", + "'-D XPT2046_SPI_DMA_CHANNEL=SPI_DMA_CH_AUTO'", + "'-D XPT2046_SPI_BUS_MOSI_IO_NUM=11'", + "'-D XPT2046_SPI_BUS_MISO_IO_NUM=13'", + "'-D XPT2046_SPI_BUS_SCLK_IO_NUM=12'", + "'-D XPT2046_SPI_BUS_QUADWP_IO_NUM=GPIO_NUM_NC'", + "'-D XPT2046_SPI_BUS_QUADHD_IO_NUM=GPIO_NUM_NC'", + "'-D XPT2046_SPI_CONFIG_CS_GPIO_NUM=38'", + "'-D XPT2046_SPI_CONFIG_DC_GPIO_NUM=GPIO_NUM_NC'", + "'-D XPT2046_SPI_CONFIG_SPI_MODE=SPI_MODE0'", + "'-D XPT2046_SPI_CONFIG_PCLK_HZ=2000000'", + "'-D XPT2046_SPI_CONFIG_TRANS_QUEUE_DEPTH=3'", + "'-D XPT2046_SPI_CONFIG_LCD_CMD_BITS=8'", + "'-D XPT2046_SPI_CONFIG_LCD_PARAM_BITS=8'", + "'-D XPT2046_SPI_CONFIG_FLAGS_DC_AS_CMD_PHASE=false'", + "'-D XPT2046_SPI_CONFIG_FLAGS_DC_LOW_ON_DATA=false'", + "'-D XPT2046_SPI_CONFIG_FLAGS_OCTAL_MODE=false'", + "'-D XPT2046_SPI_CONFIG_FLAGS_LSB_FIRST=false'", + "'-D XPT2046_TOUCH_CONFIG_X_MAX=LCD_WIDTH'", + "'-D XPT2046_TOUCH_CONFIG_Y_MAX=LCD_HEIGHT'", + "'-D XPT2046_TOUCH_CONFIG_RST_GPIO_NUM=GPIO_NUM_NC'", + "'-D XPT2046_TOUCH_CONFIG_INT_GPIO_NUM=18'", + "'-D XPT2046_TOUCH_CONFIG_LEVELS_RESET=0'", + "'-D XPT2046_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=10'", + "'-D TF_SPI_MOSI=11'", + "'-D TF_SPI_SCLK=12'", + "'-D TF_SPI_MISO=13'", + + "'-DCYD_SCREEN_HEIGHT_PX=272'", + "'-DCYD_SCREEN_WIDTH_PX=480'", + "-DROTATION_INVERTED=LV_DISP_ROT_180", + "-DROTATION_NORMAL=LV_DISP_ROT_NONE", + "'-DCYD_SCREEN_GAP_PX=10'", + "'-DCYD_SCREEN_MIN_BUTTON_HEIGHT_PX=35'", + "'-DCYD_SCREEN_MIN_BUTTON_WIDTH_PX=40'", + "'-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'" + ], + "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-4827S043R-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.aliexpress.com/item/1005004788147691.html", + "vendor": "Sunton" + } \ No newline at end of file diff --git a/CYD-Klipper/src/ui/panels/settings_panel.cpp b/CYD-Klipper/src/ui/panels/settings_panel.cpp index 5ccc81c..c7d1710 100644 --- a/CYD-Klipper/src/ui/panels/settings_panel.cpp +++ b/CYD-Klipper/src/ui/panels/settings_panel.cpp @@ -217,7 +217,12 @@ void settings_section_device(lv_obj_t* panel) lv_create_custom_menu_switch("Screen Color Fix", panel, dualusb_screen_fix_switch, global_config.display_mode, NULL, "ONLY for the 2.8\" dual USB model screen"); #endif +#if defined(CYD_SCREEN_DRIVER_ESP32_SMARTDISPLAY) && !defined(CYD_SCREEN_DISABLE_TOUCH_CALIBRATION) + // TODO: Rotating screen requires different calibration points. +#else lv_create_custom_menu_switch("Rotate Screen", panel, rotate_screen_switch, global_config.rotate_screen); +#endif + lv_create_custom_menu_switch("Auto Update", panel, auto_ota_update_switch, global_config.auto_ota_update); lv_create_custom_menu_label("Version", panel, REPO_VERSION " "); diff --git a/ci.py b/ci.py index 8ed1366..9aaf6c0 100644 --- a/ci.py +++ b/ci.py @@ -7,13 +7,15 @@ CYD_PORTS = [ "esp32-8048S043C-SD", "esp32-2432S024C-SD", "esp32-4827S043C-SD", - "esp32-3248S035C-V" + "esp32-3248S035C-V", + "esp32-4827S043R-SD", ] BASE_DIR = os.getcwd() def get_manifest(base_path : str, device_name : str): return { "name": f"to {device_name}", + "funding_url": "https://ko-fi.com/suchmememanyskill", "new_install_prompt_erase": True, "builds": [ { From 73be7c6c9f0d2c6796b795abc44516efc04271ae Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Mon, 15 Apr 2024 19:39:03 +0200 Subject: [PATCH 03/11] Forgot to add device to platformio cfg --- CYD-Klipper/platformio.ini | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CYD-Klipper/platformio.ini b/CYD-Klipper/platformio.ini index fbfd7f4..88eed10 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -78,5 +78,9 @@ board = esp32-3248S035C-smartdisplay [env:esp32-4827S043C-SD] board = esp32-4827S043C-smartdisplay +[env:esp32-4827S043R-SD] +board = esp32-4827S043C-smartdisplay + [env:esp32-8048S043C-SD] -board = esp32-8048S043C-smartdisplay \ No newline at end of file +board = esp32-8048S043C-smartdisplay + From 9b551915d7b0b7bbc0503a91c2776ced96dbc4fd Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Mon, 15 Apr 2024 22:56:57 +0200 Subject: [PATCH 04/11] Fix possible nullref in fetch_printer_data --- CYD-Klipper/src/core/data_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CYD-Klipper/src/core/data_setup.cpp b/CYD-Klipper/src/core/data_setup.cpp index e57bf85..751d0b1 100644 --- a/CYD-Klipper/src/core/data_setup.cpp +++ b/CYD-Klipper/src/core/data_setup.cpp @@ -212,7 +212,7 @@ void fetch_printer_data() if (status.containsKey("print_stats")) { const char *filename = status["print_stats"]["filename"]; - strcpy(filename_buff, filename); + strcpy(filename_buff, filename == NULL ? "" : filename); printer.print_filename = filename_buff; printer.elapsed_time_s = status["print_stats"]["total_duration"]; printer.printed_time_s = status["print_stats"]["print_duration"]; From 06691df0946f13c2e1d1edb9c601c885613f7642 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Wed, 24 Apr 2024 22:23:57 +0200 Subject: [PATCH 05/11] Remove esp32-4827S043R-SD from CI builds --- ci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci.py b/ci.py index 9aaf6c0..b60d48d 100644 --- a/ci.py +++ b/ci.py @@ -8,7 +8,7 @@ CYD_PORTS = [ "esp32-2432S024C-SD", "esp32-4827S043C-SD", "esp32-3248S035C-V", - "esp32-4827S043R-SD", + #"esp32-4827S043R-SD", ] BASE_DIR = os.getcwd() From cbd40414c85b8b53eff7a924ed7cfa58c4517865 Mon Sep 17 00:00:00 2001 From: Flaviu Tamas Date: Sun, 28 Apr 2024 14:22:06 -0400 Subject: [PATCH 06/11] Fix segfault on entering IP (#93) On my esp32-3248S035C, after entering the IP address, I was seeing a segfault at lv_mem_free at .pio/libdeps/esp32-3248S035C/lvgl/src/misc/lv_mem.c:179 allocate_btn_areas_and_controls at .pio/libdeps/esp32-3248S035C/lvgl/src/widgets/lv_btnmatrix.c:877 lv_btnmatrix_set_map at .pio/libdeps/esp32-3248S035C/lvgl/src/widgets/lv_btnmatrix.c:94 lv_keyboard_update_map at .pio/libdeps/esp32-3248S035C/lvgl/src/extra/widgets/keyboard/lv_keyboard.c:397 lv_keyboard_set_mode at .pio/libdeps/esp32-3248S035C/lvgl/src/extra/widgets/keyboard/lv_keyboard.c:185 keyboard_event_ip_entry(_lv_event_t*) at src/ui/ip_setup.cpp:81 event_send_core at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:467 lv_event_send at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:63 lv_keyboard_def_event_cb at .pio/libdeps/esp32-3248S035C/lvgl/src/extra/widgets/keyboard/lv_keyboard.c:308 event_send_core at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:467 lv_event_send at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:63 lv_btnmatrix_event at .pio/libdeps/esp32-3248S035C/lvgl/src/widgets/lv_btnmatrix.c:520 lv_obj_event_base at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:91 (discriminator 1) event_send_core at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:458 lv_event_send at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_event.c:63 indev_proc_release at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_indev.c:970 indev_button_proc at .pio/libdeps/esp32-3248S035C/lvgl/src/core/lv_indev.c:808 lv_timer_exec at .pio/libdeps/esp32-3248S035C/lvgl/src/misc/lv_timer.c:313 set_screen_brightness() at src/core/lv_setup.cpp:191 ip_init() at src/ui/ip_setup.cpp:239 setup() at src/main.cpp:28 loopTask(void*) at /home/user/etc/.platformio/packages/framework-arduinoespressif32/cores/esp32/main.cpp:41 This seems to be due to a free-after-free. The solution here is to potentially change the keymap before running the rest of the logic, because the later logic may tear down the context. This change also only changes the keyboard mode on focus change, to avoid running this code on the many un-related events that this handler gets called for. --- CYD-Klipper/src/ui/ip_setup.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/CYD-Klipper/src/ui/ip_setup.cpp b/CYD-Klipper/src/ui/ip_setup.cpp index 1419972..c647828 100644 --- a/CYD-Klipper/src/ui/ip_setup.cpp +++ b/CYD-Klipper/src/ui/ip_setup.cpp @@ -62,6 +62,20 @@ static void keyboard_event_ip_entry(lv_event_t * 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_FOCUSED || code == LV_EVENT_DEFOCUSED) && ta != NULL) + { + // make sure we alter the keymap before taking actions that might + // destroy the keyboard + if (lv_obj_has_flag(ta, LV_OBJ_FLAG_USER_1)) + { + lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_USER_1); + } + else + { + lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER); + } + } + if(code == LV_EVENT_FOCUSED) { lv_keyboard_set_textarea(kb, ta); lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN); @@ -94,15 +108,6 @@ static void keyboard_event_ip_entry(lv_event_t * e) { { return; } - - if (lv_obj_has_flag(ta, LV_OBJ_FLAG_USER_1)) - { - lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_USER_1); - } - else - { - lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER); - } } static void keyboard_event_auth_entry(lv_event_t * e) { From ae34e9153038e3e332bc4fd7b7e4c47262f7f1ec Mon Sep 17 00:00:00 2001 From: Flaviu Tamas Date: Sun, 28 Apr 2024 14:23:49 -0400 Subject: [PATCH 07/11] Custom API key keymap (#94) Since the api key is just hex, we can use a keymap with larger buttons that is easier to use. --- CYD-Klipper/src/ui/ip_setup.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/CYD-Klipper/src/ui/ip_setup.cpp b/CYD-Klipper/src/ui/ip_setup.cpp index c647828..014734e 100644 --- a/CYD-Klipper/src/ui/ip_setup.cpp +++ b/CYD-Klipper/src/ui/ip_setup.cpp @@ -33,6 +33,20 @@ static const lv_btnmatrix_ctrl_t kb_ctrl[] = { LV_KEYBOARD_CTRL_BTN_FLAGS | 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, LV_KEYBOARD_CTRL_BTN_FLAGS | 6 }; +static const char * hex_numpad_map[] = { + "1", "2", "3", "f", LV_SYMBOL_BACKSPACE, "\n", + "4", "5", "6", "e", LV_SYMBOL_OK, "\n", + "7", "8", "9", "d", LV_SYMBOL_LEFT, "\n", + "0", "a", "b", "c", LV_SYMBOL_RIGHT, NULL +}; + +static const lv_btnmatrix_ctrl_t hex_numpad_ctrl[] = { + 1, 1, 1, 1, LV_KEYBOARD_CTRL_BTN_FLAGS | 1, + 1, 1, 1, 1, LV_KEYBOARD_CTRL_BTN_FLAGS | 1, + 1, 1, 1, 1, LV_KEYBOARD_CTRL_BTN_FLAGS | 1, + 1, 1, 1, 1, LV_KEYBOARD_CTRL_BTN_FLAGS | 1, +}; + enum connection_status_t { CONNECT_FAIL = 0, CONNECT_OK = 1, @@ -175,8 +189,8 @@ void show_auth_entry() lv_obj_set_flex_grow(passEntry, 1); lv_keyboard_set_textarea(keyboard, passEntry); - lv_keyboard_set_map(keyboard, LV_KEYBOARD_MODE_USER_1, kb_map, kb_ctrl); - lv_keyboard_set_mode(keyboard, LV_KEYBOARD_MODE_USER_1); + lv_keyboard_set_map(keyboard, LV_KEYBOARD_MODE_USER_2, hex_numpad_map, hex_numpad_ctrl); + lv_keyboard_set_mode(keyboard, LV_KEYBOARD_MODE_USER_2); } void show_ip_entry() From d75cbb65dcef1b5012872ad44568c551b095237c Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 11 May 2024 00:05:24 +0200 Subject: [PATCH 08/11] Fix #99 --- CYD-Klipper/src/core/data_setup.cpp | 30 +++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/CYD-Klipper/src/core/data_setup.cpp b/CYD-Klipper/src/core/data_setup.cpp index 751d0b1..584a6d6 100644 --- a/CYD-Klipper/src/core/data_setup.cpp +++ b/CYD-Klipper/src/core/data_setup.cpp @@ -16,6 +16,7 @@ int klipper_request_consecutive_fail_count = 999; char filename_buff[512] = {0}; SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore; const long data_update_interval = 780; +unsigned char lock_absolute_relative_mode_swap = 0; void semaphore_init(){ freezeRenderThreadSemaphore = xSemaphoreCreateMutex(); @@ -82,25 +83,29 @@ void move_printer(const char* axis, float amount, bool relative) { char gcode[64]; const char* extra = (amount > 0) ? "+" : ""; + const char* start = ""; + const char* end = ""; bool absolute_coords = printer.absolute_coords; if (absolute_coords && relative) { - send_gcode(true, "G91"); + start = "G91\n"; } else if (!absolute_coords && !relative) { - send_gcode(true, "G90"); + start = "G90\n"; } - sprintf(gcode, "G1 %s%s%.3f F6000", axis, extra, amount); - send_gcode(true, gcode); - if (absolute_coords && relative) { - send_gcode(true, "G90"); + end = "\nG90"; } else if (!absolute_coords && !relative) { - send_gcode(true, "G91"); + end = "\nG91"; } + + sprintf(gcode, "%sG1 %s%s%.3f F6000%s", start, axis, extra, amount, end); + send_gcode(true, gcode); + + lock_absolute_relative_mode_swap = 2; } int last_slicer_time_query = -15000; @@ -192,7 +197,16 @@ void fetch_printer_data() printer.gcode_offset[1] = status["gcode_move"]["homing_origin"][1]; printer.gcode_offset[2] = status["gcode_move"]["homing_origin"][2]; bool absolute_coords = status["gcode_move"]["absolute_coordinates"]; - printer.absolute_coords = absolute_coords == true; + + if (lock_absolute_relative_mode_swap > 0) + { + lock_absolute_relative_mode_swap--; + } + else + { + printer.absolute_coords = absolute_coords == true; + } + printer.speed_mult = status["gcode_move"]["speed_factor"]; printer.extrude_mult = status["gcode_move"]["extrude_factor"]; printer.feedrate_mm_per_s = status["gcode_move"]["speed"]; From bc0502745d16e53afe26d6816ec4eb77863fb767 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 25 May 2024 12:40:07 +0200 Subject: [PATCH 09/11] Allow custom extrude/retract macros --- CYD-Klipper/src/conf/global_config.h | 2 ++ CYD-Klipper/src/ui/panels/settings_panel.cpp | 16 ++++++++++++-- CYD-Klipper/src/ui/panels/temp_panel.cpp | 22 ++++++++++++++++---- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/CYD-Klipper/src/conf/global_config.h b/CYD-Klipper/src/conf/global_config.h index 2e7a135..545735d 100644 --- a/CYD-Klipper/src/conf/global_config.h +++ b/CYD-Klipper/src/conf/global_config.h @@ -32,6 +32,8 @@ typedef struct _PRINTER_CONFIG { bool invert_colors : 1; unsigned char remaining_time_calc_mode : 2; unsigned char show_stats_on_progress_panel : 2; + + bool custom_filament_move_macros : 1; }; }; diff --git a/CYD-Klipper/src/ui/panels/settings_panel.cpp b/CYD-Klipper/src/ui/panels/settings_panel.cpp index c7d1710..48787a2 100644 --- a/CYD-Klipper/src/ui/panels/settings_panel.cpp +++ b/CYD-Klipper/src/ui/panels/settings_panel.cpp @@ -52,6 +52,13 @@ static void light_mode_switch(lv_event_t * e){ set_color_scheme(); } +static void filament_move_mode_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); + get_current_printer_config()->custom_filament_move_macros = checked; + write_global_config(); +} + static void show_stats_on_progress_panel_dropdown(lv_event_t * e){ auto selected = lv_dropdown_get_selected(lv_event_get_target(e)); get_current_printer_config()->show_stats_on_progress_panel = selected; @@ -147,7 +154,7 @@ static void estimated_time_dropdown(lv_event_t * e){ write_global_config(); } -#define PRINTER_SPECIFIC_SETTING global_config.multi_printer_mode ? LV_SYMBOL_PLUS " Stored per printer" : NULL +#define PRINTER_SPECIFIC_SETTING global_config.multi_printer_mode ? "Stored per printer" : NULL void settings_section_theming(lv_obj_t* panel) { @@ -157,7 +164,7 @@ void settings_section_theming(lv_obj_t* panel) lv_create_custom_menu_dropdown("Theme", panel, theme_dropdown, "Blue\nGreen\nLime\nGrey\nYellow\nOrange\nRed\nPurple", get_current_printer_config()->color_scheme, NULL, PRINTER_SPECIFIC_SETTING); #ifndef CYD_SCREEN_DISABLE_INVERT_COLORS - lv_create_custom_menu_switch("Invert Colors", panel, invert_color_switch, get_current_printer_config()->invert_colors, NULL, (global_config.multi_printer_mode) ? LV_SYMBOL_PLUS " Stored per printer" + lv_create_custom_menu_switch("Invert Colors", panel, invert_color_switch, get_current_printer_config()->invert_colors, NULL, (global_config.multi_printer_mode) ? "Stored per printer" #ifdef CYD_SCREEN_DRIVER_ESP32_2432S028R "\nIntended for the 2.8\" dual USB model screen" : "Intended for the 2.8\" dual USB model screen" #else @@ -196,6 +203,11 @@ void settings_section_behaviour(lv_obj_t* panel) lv_create_custom_menu_switch("Multi Printer Mode", panel, multi_printer_switch, global_config.multi_printer_mode); lv_create_custom_menu_switch("Disable M117 Messaging", panel, disable_m117_messaging_switch, global_config.disable_m117_messaging); lv_create_custom_menu_button("Configure Printer IP", panel, reset_ip_click, "Restart"); + + lv_create_custom_menu_switch("Custom Filament Move Macros", panel, filament_move_mode_switch, get_current_printer_config()->custom_filament_move_macros, NULL, + global_config.multi_printer_mode + ? "Calls FILAMENT_RETRACT and\nFILAMENT_EXTRUDE in temperature menu\nwhen enabled. Stored per printer." + : "Calls FILAMENT_RETRACT and\nFILAMENT_EXTRUDE in temperature menu\nwhen enabled"); } void settings_section_device(lv_obj_t* panel) diff --git a/CYD-Klipper/src/ui/panels/temp_panel.cpp b/CYD-Klipper/src/ui/panels/temp_panel.cpp index fc1f57c..5880eaf 100644 --- a/CYD-Klipper/src/ui/panels/temp_panel.cpp +++ b/CYD-Klipper/src/ui/panels/temp_panel.cpp @@ -139,8 +139,15 @@ static void btn_extrude(lv_event_t * e){ return; } - send_gcode(true, "M83"); - send_gcode(true, "G1 E25 F300"); + if (get_current_printer_config()->custom_filament_move_macros) + { + send_gcode(true, "FILAMENT_EXTRUDE"); + } + else + { + send_gcode(true, "M83"); + send_gcode(true, "G1 E25 F300"); + } } static void set_temp_via_preset(lv_event_t * e){ @@ -173,8 +180,15 @@ static void btn_retract(lv_event_t * e){ return; } - send_gcode(true, "M83"); - send_gcode(true, "G1 E-25 F300"); + if (get_current_printer_config()->custom_filament_move_macros) + { + send_gcode(true, "FILAMENT_RETRACT"); + } + else + { + send_gcode(true, "M83"); + send_gcode(true, "G1 E-25 F300"); + } } static void set_chart_range(lv_event_t * e) { From bd32fcb81e50a7cdc37c9f127db40f6c89bbc42d Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 25 May 2024 12:47:43 +0200 Subject: [PATCH 10/11] Allow accessing the parameters/stats panel from unlocked stepper move panel --- CYD-Klipper/src/ui/panels/move_panel.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CYD-Klipper/src/ui/panels/move_panel.cpp b/CYD-Klipper/src/ui/panels/move_panel.cpp index 75652ff..059bbfd 100644 --- a/CYD-Klipper/src/ui/panels/move_panel.cpp +++ b/CYD-Klipper/src/ui/panels/move_panel.cpp @@ -312,19 +312,30 @@ inline void root_panel_steppers_locked(lv_obj_t * root_panel){ inline void root_panel_steppers_unlocked(lv_obj_t * root_panel){ lv_obj_t * panel = lv_create_empty_panel(root_panel); lv_obj_set_size(panel, CYD_SCREEN_PANEL_WIDTH_PX, CYD_SCREEN_PANEL_HEIGHT_PX); - lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX, 0); lv_layout_flex_column(panel, LV_FLEX_ALIGN_CENTER); lv_obj_t * label = lv_label_create(panel); lv_label_set_text(label, LV_SYMBOL_EYE_CLOSE " Steppers unlocked"); - lv_obj_t * btn = lv_btn_create(panel); + lv_obj_t * btn_row = lv_create_empty_panel(panel); + lv_obj_set_size(btn_row, CYD_SCREEN_PANEL_WIDTH_PX, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_layout_flex_row(btn_row, LV_FLEX_ALIGN_CENTER); + + lv_obj_t * btn = lv_btn_create(btn_row); lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); lv_obj_add_event_cb(btn, home_button_click, LV_EVENT_CLICKED, NULL); label = lv_label_create(btn); lv_label_set_text(label, LV_SYMBOL_HOME "Home Axis"); lv_obj_center(label); + + btn = lv_btn_create(btn_row); + lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); + lv_obj_add_event_cb(btn, switch_to_stat_panel, LV_EVENT_CLICKED, NULL); + + label = lv_label_create(btn); + lv_label_set_text(label, LV_SYMBOL_SETTINGS "Parameters"); + lv_obj_center(label); } static void root_panel_state_update(lv_event_t * e){ From 7815a0fbf47dd127bb9dc6778e31c54e765efbaa Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 26 May 2024 00:26:49 +0200 Subject: [PATCH 11/11] Specify specific version for esp32 platform --- 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 88eed10..87de374 100644 --- a/CYD-Klipper/platformio.ini +++ b/CYD-Klipper/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [env] -platform = espressif32 +platform = https://github.com/platformio/platform-espressif32#v6.4.0 board = esp32dev framework = arduino monitor_speed = 115200