mirror of
https://github.com/suchmememanyskill/CYD-Klipper.git
synced 2026-03-21 13:43:25 +00:00
Merge branch 'experimental_load_gcode_img-2' into dev
This commit is contained in:
@@ -49,7 +49,7 @@
|
|||||||
#define LV_MEM_CUSTOM 0
|
#define LV_MEM_CUSTOM 0
|
||||||
#if LV_MEM_CUSTOM == 0
|
#if LV_MEM_CUSTOM == 0
|
||||||
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
|
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
|
||||||
#define LV_MEM_SIZE (32U * 1024U) /*[bytes]*/
|
#define LV_MEM_SIZE (40U * 1024U) /*[bytes]*/
|
||||||
|
|
||||||
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
|
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
|
||||||
#define LV_MEM_ADR 0 /*0: unused*/
|
#define LV_MEM_ADR 0 /*0: unused*/
|
||||||
@@ -194,7 +194,7 @@
|
|||||||
*-----------*/
|
*-----------*/
|
||||||
|
|
||||||
/*Enable the log module*/
|
/*Enable the log module*/
|
||||||
#define LV_USE_LOG 1
|
#define LV_USE_LOG 0
|
||||||
#if LV_USE_LOG
|
#if LV_USE_LOG
|
||||||
|
|
||||||
/*How important log should be added:
|
/*How important log should be added:
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
|
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
|
||||||
*LV_LOG_LEVEL_USER Only logs added by the user
|
*LV_LOG_LEVEL_USER Only logs added by the user
|
||||||
*LV_LOG_LEVEL_NONE Do not log anything*/
|
*LV_LOG_LEVEL_NONE Do not log anything*/
|
||||||
#define LV_LOG_LEVEL LV_LOG_LEVEL_USER
|
#define LV_LOG_LEVEL LV_LOG_LEVEL_NONE
|
||||||
|
|
||||||
/*1: Print the log with 'printf';
|
/*1: Print the log with 'printf';
|
||||||
*0: User need to register a callback with `lv_log_register_print_cb()`*/
|
*0: User need to register a callback with `lv_log_register_print_cb()`*/
|
||||||
@@ -607,7 +607,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*PNG decoder library*/
|
/*PNG decoder library*/
|
||||||
#define LV_USE_PNG 0
|
#define LV_USE_PNG 1
|
||||||
|
|
||||||
/*BMP decoder library*/
|
/*BMP decoder library*/
|
||||||
#define LV_USE_BMP 0
|
#define LV_USE_BMP 0
|
||||||
@@ -678,16 +678,16 @@
|
|||||||
====================*/
|
====================*/
|
||||||
|
|
||||||
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
|
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
|
||||||
#define LV_USE_DEMO_WIDGETS 1
|
#define LV_USE_DEMO_WIDGETS 0
|
||||||
#if LV_USE_DEMO_WIDGETS
|
#if LV_USE_DEMO_WIDGETS
|
||||||
#define LV_DEMO_WIDGETS_SLIDESHOW 1
|
#define LV_DEMO_WIDGETS_SLIDESHOW 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*Demonstrate the usage of encoder and keyboard*/
|
/*Demonstrate the usage of encoder and keyboard*/
|
||||||
#define LV_USE_DEMO_KEYPAD_AND_ENCODER 1
|
#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
|
||||||
|
|
||||||
/*Benchmark your system*/
|
/*Benchmark your system*/
|
||||||
#define LV_USE_DEMO_BENCHMARK 1
|
#define LV_USE_DEMO_BENCHMARK 0
|
||||||
|
|
||||||
/*Stress test for LVGL*/
|
/*Stress test for LVGL*/
|
||||||
#define LV_USE_DEMO_STRESS 0
|
#define LV_USE_DEMO_STRESS 0
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ void screen_setup()
|
|||||||
tft.setRotation(global_config.rotateScreen ? 3 : 1);
|
tft.setRotation(global_config.rotateScreen ? 3 : 1);
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
set_invert_display();
|
set_invert_display();
|
||||||
|
set_screen_brightness();
|
||||||
touchscreen_spi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
|
touchscreen_spi.begin(XPT2046_CLK, XPT2046_MISO, XPT2046_MOSI, XPT2046_CS);
|
||||||
touchscreen.begin(touchscreen_spi);
|
touchscreen.begin(touchscreen_spi);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
#ifdef CYD_SCREEN_DRIVER_ESP32_SMARTDISPLAY
|
#ifdef CYD_SCREEN_DRIVER_ESP32_SMARTDISPLAY
|
||||||
|
|
||||||
#include "../screen_driver.h"
|
#include "../screen_driver.h"
|
||||||
|
|||||||
@@ -271,6 +271,7 @@ void lv_setup()
|
|||||||
screen_timer_setup();
|
screen_timer_setup();
|
||||||
screen_timer_start();
|
screen_timer_start();
|
||||||
set_screen_brightness();
|
set_screen_brightness();
|
||||||
|
lv_png_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_screen_asleep()
|
bool is_screen_asleep()
|
||||||
|
|||||||
146
CYD-Klipper/src/ui/gcode_img.cpp
Normal file
146
CYD-Klipper/src/ui/gcode_img.cpp
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
#include "gcode_img.h"
|
||||||
|
#include "lvgl.h"
|
||||||
|
#include "ui_utils.h"
|
||||||
|
#include <esp.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include "../conf/global_config.h"
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
|
||||||
|
static unsigned char * data_png = NULL;
|
||||||
|
static char img_filename_path[256] = {0};
|
||||||
|
static lv_img_dsc_t img_header = {0};
|
||||||
|
|
||||||
|
static void close_button_click(lv_event_t * e){
|
||||||
|
lv_obj_t * root = (lv_obj_t *)lv_event_get_user_data(e);
|
||||||
|
lv_obj_del(root);
|
||||||
|
clear_img_mem();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_128_128_gcode(const char* filename)
|
||||||
|
{
|
||||||
|
if (filename == NULL){
|
||||||
|
Serial.println("No gcode filename");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String url = "http://" + String(global_config.klipperHost) + ":" + String(global_config.klipperPort) + "/server/files/thumbnails?filename=" + String(filename);
|
||||||
|
HTTPClient client;
|
||||||
|
int httpCode = 0;
|
||||||
|
try {
|
||||||
|
client.begin(url.c_str());
|
||||||
|
httpCode = client.GET();
|
||||||
|
}
|
||||||
|
catch (...){
|
||||||
|
Serial.println("Exception while fetching gcode img location");
|
||||||
|
return {0};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (httpCode == 200)
|
||||||
|
{
|
||||||
|
String payload = client.getString();
|
||||||
|
JsonDocument doc;
|
||||||
|
deserializeJson(doc, payload);
|
||||||
|
auto result = doc["result"].as<JsonArray>();
|
||||||
|
const char* chosen_thumb = NULL;
|
||||||
|
|
||||||
|
for (auto file : result){
|
||||||
|
int width = file["width"];
|
||||||
|
int height = file["height"];
|
||||||
|
int size = file["size"];
|
||||||
|
const char* thumbnail = file["thumbnail_path"];
|
||||||
|
|
||||||
|
if (width != height || width != 32)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (strcmp(thumbnail + strlen(thumbnail) - 4, ".png"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
chosen_thumb = thumbnail;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chosen_thumb != NULL){
|
||||||
|
Serial.printf("Found 128x128 PNG gcode img at %s\n", filename);
|
||||||
|
strcpy(img_filename_path, chosen_thumb);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_t* draw_gcode_img()
|
||||||
|
{
|
||||||
|
clear_img_mem();
|
||||||
|
|
||||||
|
if (img_filename_path[0] == 0){
|
||||||
|
Serial.println("No gcode img path");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
HTTPClient client;
|
||||||
|
int httpCode = 0;
|
||||||
|
try {
|
||||||
|
String img_url = "http://" + String(global_config.klipperHost) + ":" + String(global_config.klipperPort) + "/server/files/gcodes/" + String(img_filename_path);
|
||||||
|
client.begin(img_url);
|
||||||
|
httpCode = client.GET();
|
||||||
|
}
|
||||||
|
catch (...){
|
||||||
|
Serial.println("Exception while fetching gcode img");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (httpCode == 200)
|
||||||
|
{
|
||||||
|
size_t len = client.getSize();
|
||||||
|
if (len <= 0)
|
||||||
|
{
|
||||||
|
Serial.println("No gcode img data");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
data_png = (unsigned char*)malloc(len + 1);
|
||||||
|
if (len != client.getStream().readBytes(data_png, len)){
|
||||||
|
Serial.println("Failed to read gcode img data");
|
||||||
|
clear_img_mem();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&img_header, 0, sizeof(img_header));
|
||||||
|
img_header.header.w = 32;
|
||||||
|
img_header.header.h = 32;
|
||||||
|
img_header.data_size = len;
|
||||||
|
img_header.header.cf = LV_IMG_CF_RAW_ALPHA;
|
||||||
|
img_header.data = data_png;
|
||||||
|
|
||||||
|
lv_obj_t * img = lv_img_create(lv_scr_act());
|
||||||
|
lv_img_set_src(img, &img_header);
|
||||||
|
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
lv_obj_t* show_gcode_img(const char* filename)
|
||||||
|
{
|
||||||
|
if (filename == NULL){
|
||||||
|
Serial.println("No gcode filename");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!has_128_128_gcode(filename)){
|
||||||
|
Serial.println("No 128x128 gcode img found");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return draw_gcode_img();
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_img_mem()
|
||||||
|
{
|
||||||
|
if (data_png != NULL){
|
||||||
|
free(data_png);
|
||||||
|
data_png = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
6
CYD-Klipper/src/ui/gcode_img.h
Normal file
6
CYD-Klipper/src/ui/gcode_img.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "lvgl.h"
|
||||||
|
|
||||||
|
lv_obj_t* show_gcode_img(const char* filename);
|
||||||
|
bool has_128_128_gcode(const char* filename);
|
||||||
|
void clear_img_mem();
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <HTTPClient.h>
|
#include <HTTPClient.h>
|
||||||
#include "../ui_utils.h"
|
#include "../ui_utils.h"
|
||||||
#include "../../core/lv_setup.h"
|
#include "../../core/lv_setup.h"
|
||||||
|
#include "../gcode_img.h"
|
||||||
|
|
||||||
FILESYSTEM_FILE* selected_file = NULL;
|
FILESYSTEM_FILE* selected_file = NULL;
|
||||||
|
|
||||||
@@ -83,6 +84,13 @@ static void btn_print_file_verify(lv_event_t * e){
|
|||||||
label = lv_label_create(btn);
|
label = lv_label_create(btn);
|
||||||
lv_label_set_text(label, LV_SYMBOL_OK);
|
lv_label_set_text(label, LV_SYMBOL_OK);
|
||||||
lv_obj_center(label);
|
lv_obj_center(label);
|
||||||
|
|
||||||
|
lv_obj_t* img = show_gcode_img(selected_file->name);
|
||||||
|
|
||||||
|
if (img != NULL){
|
||||||
|
lv_obj_set_parent(img, panel);
|
||||||
|
lv_obj_align(img, LV_ALIGN_BOTTOM_MID, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_panel_init(lv_obj_t* panel){
|
void print_panel_init(lv_obj_t* panel){
|
||||||
@@ -91,6 +99,8 @@ void print_panel_init(lv_obj_t* panel){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clear_img_mem();
|
||||||
|
|
||||||
lv_obj_t * list = lv_list_create(panel);
|
lv_obj_t * list = lv_list_create(panel);
|
||||||
lv_obj_set_style_radius(list, 0, 0);
|
lv_obj_set_style_radius(list, 0, 0);
|
||||||
lv_obj_set_style_border_width(list, 0, 0);
|
lv_obj_set_style_border_width(list, 0, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user