Fetch data via HTTP

This commit is contained in:
suchmememanyskill
2023-11-12 02:33:28 +01:00
parent bf892d6855
commit 6569e428c8
8 changed files with 230 additions and 5 deletions

View File

@@ -519,7 +519,7 @@
#define LV_USE_SPINNER 0
#define LV_USE_TABVIEW 1
#define LV_USE_TABVIEW 0
#define LV_USE_TILEVIEW 0

View File

@@ -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);
}

View File

@@ -0,0 +1,105 @@
#include "data_setup.h"
#include "lvgl.h"
#include "../conf/global_config.h"
#include <HTTPClient.h>
#include <ArduinoJson.h>
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();
}

View File

@@ -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();

View File

@@ -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,7 +28,12 @@ void setup() {
wifi_init();
ip_setup();
websocket_setup();
data_setup();
main_ui_setup();
/*
lv_obj_clean(lv_scr_act());
lv_obj_t * label;
@@ -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();
}

View File

@@ -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);

View File

@@ -0,0 +1,83 @@
#include "main_ui.h"
#include "../core/data_setup.h"
#include "lvgl.h"
#include <ArduinoJson.h>
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);
}

View File

@@ -0,0 +1,2 @@
void main_ui();
void main_ui_setup();