From 6569e428c8feb721f333e131d87d147c2bd9137e Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 12 Nov 2023 02:33:28 +0100 Subject: [PATCH] Fetch data via HTTP --- CYD-Klipper-Display/src/conf/lv_conf.h | 2 +- .../src/conf/screen_driver.cpp | 2 +- CYD-Klipper-Display/src/core/data_setup.cpp | 105 ++++++++++++++++++ CYD-Klipper-Display/src/core/data_setup.h | 27 +++++ CYD-Klipper-Display/src/main.cpp | 12 +- CYD-Klipper-Display/src/ui/ip_setup.cpp | 2 +- CYD-Klipper-Display/src/ui/main_ui.cpp | 83 ++++++++++++++ CYD-Klipper-Display/src/ui/main_ui.h | 2 + 8 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 CYD-Klipper-Display/src/core/data_setup.cpp create mode 100644 CYD-Klipper-Display/src/core/data_setup.h create mode 100644 CYD-Klipper-Display/src/ui/main_ui.cpp create mode 100644 CYD-Klipper-Display/src/ui/main_ui.h diff --git a/CYD-Klipper-Display/src/conf/lv_conf.h b/CYD-Klipper-Display/src/conf/lv_conf.h index f41ebcb..e16dc7e 100644 --- a/CYD-Klipper-Display/src/conf/lv_conf.h +++ b/CYD-Klipper-Display/src/conf/lv_conf.h @@ -519,7 +519,7 @@ #define LV_USE_SPINNER 0 -#define LV_USE_TABVIEW 1 +#define LV_USE_TABVIEW 0 #define LV_USE_TILEVIEW 0 diff --git a/CYD-Klipper-Display/src/conf/screen_driver.cpp b/CYD-Klipper-Display/src/conf/screen_driver.cpp index 82f7d83..ccd13df 100644 --- a/CYD-Klipper-Display/src/conf/screen_driver.cpp +++ b/CYD-Klipper-Display/src/conf/screen_driver.cpp @@ -100,7 +100,7 @@ void screen_timer_sleep(lv_timer_t *timer) void screen_timer_setup() { - screenSleepTimer = lv_timer_create(screen_timer_sleep, 1 * 1000 * 60, NULL); + screenSleepTimer = lv_timer_create(screen_timer_sleep, 5 * 1000 * 60, NULL); lv_timer_pause(screenSleepTimer); } diff --git a/CYD-Klipper-Display/src/core/data_setup.cpp b/CYD-Klipper-Display/src/core/data_setup.cpp new file mode 100644 index 0000000..5ed2a20 --- /dev/null +++ b/CYD-Klipper-Display/src/core/data_setup.cpp @@ -0,0 +1,105 @@ + +#include "data_setup.h" +#include "lvgl.h" +#include "../conf/global_config.h" +#include +#include + +const char * printer_state_messages[] = { + "Error", + "Idle", + "Printing" +}; + +Printer printer = {0}; + +void fetch_printer_state(){ + char buff[91] = {}; + sprintf(buff, "http://%s:%d/printer/info", global_config.klipperHost, global_config.klipperPort); + HTTPClient client; + client.begin(buff); + int httpCode = client.GET(); + if (httpCode == 200) { + String payload = client.getString(); + Serial.println(payload); + DynamicJsonDocument doc(1024); + deserializeJson(doc, payload); + auto result = doc["result"]; + + bool update = false; + const char* state = result["state"]; + + if (strcmp(state, "ready") == 0 && printer.state == PRINTER_STATE_ERROR){ + printer.state = PRINTER_STATE_IDLE; + update = true; + } + else if (strcmp(state, "shutdown") == 0 && printer.state != PRINTER_STATE_ERROR) { + printer.state = PRINTER_STATE_ERROR; + update = true; + } + + const char* message = result["state_message"]; + if (printer.state_message == NULL || strcmp(printer.state_message, message)) { + if (printer.state_message != NULL){ + free(printer.state_message); + } + + printer.state_message = (char*)malloc(strlen(message) + 1); + strcpy(printer.state_message, message); + update = true; + } + + if (update) + lv_msg_send(DATA_PRINTER_STATE, &printer); + } + else { + Serial.printf("Failed to fetch printer state: %d\n", httpCode); + } +} + +void fetch_printer_data(){ + char buff[256] = {}; + sprintf(buff, "http://%s:%d/printer/objects/query?extruder&heater_bed&toolhead", global_config.klipperHost, global_config.klipperPort); + HTTPClient client; + client.begin(buff); + int httpCode = client.GET(); + if (httpCode == 200) { + String payload = client.getString(); + Serial.println(payload); + DynamicJsonDocument doc(2048); + deserializeJson(doc, payload); + auto status = doc["result"]["status"]; + if (status.containsKey("extruder")){ + printer.extruder_temp = status["extruder"]["temperature"]; + printer.extruder_target_temp = status["extruder"]["target"]; + } + + if (status.containsKey("heater_bed")){ + printer.bed_temp = status["heater_bed"]["temperature"]; + printer.bed_target_temp = status["heater_bed"]["target"]; + } + + if (status.containsKey("toolhead")){ + printer.position[0] = status["toolhead"]["position"][0]; + printer.position[1] = status["toolhead"]["position"][1]; + printer.position[2] = status["toolhead"]["position"][2]; + } + + lv_msg_send(DATA_PRINTER_DATA, &printer); + } + else { + Serial.printf("Failed to fetch printer data: %d\n", httpCode); + } +} + +void data_loop(){ + // TODO: slow down requests + fetch_printer_state(); + if (printer.state != PRINTER_STATE_ERROR) + fetch_printer_data(); +} + +void data_setup(){ + fetch_printer_state(); + fetch_printer_data(); +} \ No newline at end of file diff --git a/CYD-Klipper-Display/src/core/data_setup.h b/CYD-Klipper-Display/src/core/data_setup.h new file mode 100644 index 0000000..ca1bd01 --- /dev/null +++ b/CYD-Klipper-Display/src/core/data_setup.h @@ -0,0 +1,27 @@ +#pragma once + +enum { + PRINTER_STATE_ERROR = 0, + PRINTER_STATE_IDLE = 1, + PRINTER_SATE_PRINTING = 2, +}; + +extern const char* printer_state_messages[]; + +typedef struct Printer { + unsigned char state; + char* state_message; + float extruder_temp; + float extruder_target_temp; + float bed_temp; + float bed_target_temp; + float position[3]; +} _Printer; + +extern Printer printer; + +#define DATA_PRINTER_STATE 1 +#define DATA_PRINTER_DATA 2 + +void data_loop(); +void data_setup(); \ No newline at end of file diff --git a/CYD-Klipper-Display/src/main.cpp b/CYD-Klipper-Display/src/main.cpp index 9c0eb00..df9e5bf 100644 --- a/CYD-Klipper-Display/src/main.cpp +++ b/CYD-Klipper-Display/src/main.cpp @@ -4,6 +4,8 @@ #include "ui/ip_setup.h" #include "core/websocket_setup.h" #include "lvgl.h" +#include "core/data_setup.h" +#include "ui/main_ui.h" static void event_handler(lv_event_t * e){ lv_event_code_t code = lv_event_get_code(e); @@ -26,9 +28,14 @@ void setup() { wifi_init(); ip_setup(); websocket_setup(); + data_setup(); + main_ui_setup(); + + + /* lv_obj_clean(lv_scr_act()); - + lv_obj_t * label; lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); @@ -44,11 +51,12 @@ void setup() { lv_obj_align(slider, LV_ALIGN_CENTER, 0, 40); lv_slider_set_range(slider, 0, 100); lv_slider_set_value(slider, 50, LV_ANIM_OFF); + */ } void loop(){ wifi_ok(); - websocket_process(); + data_loop(); lv_timer_handler(); lv_task_handler(); } \ No newline at end of file diff --git a/CYD-Klipper-Display/src/ui/ip_setup.cpp b/CYD-Klipper-Display/src/ui/ip_setup.cpp index e5c60dd..c45b2ec 100644 --- a/CYD-Klipper-Display/src/ui/ip_setup.cpp +++ b/CYD-Klipper-Display/src/ui/ip_setup.cpp @@ -66,7 +66,7 @@ void ip_setup_inner(){ ipEntry = lv_textarea_create(lv_scr_act()); lv_textarea_set_one_line(ipEntry, true); - lv_textarea_set_max_length(ipEntry, 57); + lv_textarea_set_max_length(ipEntry, 63); lv_textarea_set_text(ipEntry, ""); lv_obj_align(ipEntry, LV_ALIGN_TOP_LEFT, 10, 40); lv_obj_add_event_cb(ipEntry, ta_event_cb, LV_EVENT_ALL, keyboard); diff --git a/CYD-Klipper-Display/src/ui/main_ui.cpp b/CYD-Klipper-Display/src/ui/main_ui.cpp new file mode 100644 index 0000000..afab6c5 --- /dev/null +++ b/CYD-Klipper-Display/src/ui/main_ui.cpp @@ -0,0 +1,83 @@ +#include "main_ui.h" +#include "../core/data_setup.h" +#include "lvgl.h" +#include + +char extruder_temp_buff[20]; +char bed_temp_buff[20]; +char position_buff[20]; + +static void update_printer_state(lv_event_t * e){ + lv_obj_t * label = lv_event_get_target(e); + + lv_label_set_text(label, printer_state_messages[printer.state]); +} + +static void update_printer_state_message(lv_event_t * e) { + lv_obj_t * label = lv_event_get_target(e); + + lv_label_set_text(label, printer.state_message); +} + +static void update_printer_data_extruder_temp(lv_event_t * e) { + lv_obj_t * label = lv_event_get_target(e); + + sprintf(extruder_temp_buff, "E: %.1f/%.1f", printer.extruder_temp, printer.extruder_target_temp); + lv_label_set_text(label, extruder_temp_buff); +} + +static void update_printer_data_bed_temp(lv_event_t * e) { + lv_obj_t * label = lv_event_get_target(e); + + sprintf(bed_temp_buff, "B: %.1f/%.1f", printer.bed_temp, printer.bed_target_temp); + lv_label_set_text(label, bed_temp_buff); +} + +static void update_printer_data_position(lv_event_t * e) { + lv_obj_t * label = lv_event_get_target(e); + + sprintf(position_buff, "P: %.0f/%.0f/%.0f", printer.position[0], printer.position[1], printer.position[2]); + lv_label_set_text(label, position_buff); +} + +void main_ui(){ + lv_obj_clean(lv_scr_act()); + + lv_obj_t * label; + label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "Waiting for update..."); + lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 0); + lv_obj_add_event_cb(label, update_printer_state, LV_EVENT_MSG_RECEIVED, NULL); + lv_msg_subsribe_obj(DATA_PRINTER_STATE, label, NULL); + + label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "Waiting for update..."); + lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 30); + lv_obj_add_event_cb(label, update_printer_state_message, LV_EVENT_MSG_RECEIVED, NULL); + lv_msg_subsribe_obj(DATA_PRINTER_STATE, label, NULL); + + label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "Waiting for update..."); + lv_obj_align(label, LV_ALIGN_BOTTOM_LEFT, 0, 0); + lv_obj_add_event_cb(label, update_printer_data_extruder_temp, LV_EVENT_MSG_RECEIVED, NULL); + lv_msg_subsribe_obj(DATA_PRINTER_DATA, label, NULL); + + label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "Waiting for update..."); + lv_obj_align(label, LV_ALIGN_BOTTOM_LEFT, 100, 0); + lv_obj_add_event_cb(label, update_printer_data_bed_temp, LV_EVENT_MSG_RECEIVED, NULL); + lv_msg_subsribe_obj(DATA_PRINTER_DATA, label, NULL); + + label = lv_label_create(lv_scr_act()); + lv_label_set_text(label, "Waiting for update..."); + lv_obj_align(label, LV_ALIGN_BOTTOM_LEFT, 200, 0); + lv_obj_add_event_cb(label, update_printer_data_position, LV_EVENT_MSG_RECEIVED, NULL); + lv_msg_subsribe_obj(DATA_PRINTER_DATA, label, NULL); +} + +void main_ui_setup(){ + // TODO: Subscribe to events + main_ui(); + lv_msg_send(DATA_PRINTER_STATE, &printer); + lv_msg_send(DATA_PRINTER_DATA, &printer); +} \ No newline at end of file diff --git a/CYD-Klipper-Display/src/ui/main_ui.h b/CYD-Klipper-Display/src/ui/main_ui.h new file mode 100644 index 0000000..d0e04c2 --- /dev/null +++ b/CYD-Klipper-Display/src/ui/main_ui.h @@ -0,0 +1,2 @@ +void main_ui(); +void main_ui_setup(); \ No newline at end of file