Skip to content

Commit

Permalink
Merge pull request #7 from suchmememanyskill/dev
Browse files Browse the repository at this point in the history
v1.1.2
  • Loading branch information
suchmememanyskill authored Dec 16, 2023
2 parents 230884c + 7c786d1 commit ffdc8ae
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 12 deletions.
70 changes: 60 additions & 10 deletions CYD-Klipper/src/core/data_setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,34 @@ const char *printer_state_messages[] = {
"Printing"};

Printer printer = {0};
int klipper_request_consecutive_fail_count = 0;
char filename_buff[512] = {0};
SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore;
long last_data_update = 0;
const long data_update_interval = 800;

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 send_gcode(bool wait, const char *gcode)
{
Expand All @@ -35,24 +63,29 @@ void send_gcode(bool wait, const char *gcode)
}
}

char filename_buff[512] = {0};

void fetch_printer_data()
{
bool frozen = true;
freeze_request_thread();
char buff[256] = {};
sprintf(buff, "http://%s:%d/printer/objects/query?extruder&heater_bed&toolhead&gcode_move&virtual_sdcard&print_stats&webhooks", global_config.klipperHost, global_config.klipperPort);
HTTPClient client;
client.begin(buff);
int httpCode = client.GET();
if (httpCode == 200)
{
klipper_request_consecutive_fail_count = 0;
String payload = client.getString();
DynamicJsonDocument doc(4096);
deserializeJson(doc, payload);
auto status = doc["result"]["status"];
bool emit_state_update = false;
int printer_state = printer.state;

unfreeze_request_thread();
frozen = false;
freeze_render_thread();

if (status.containsKey("webhooks"))
{
const char *state = status["webhooks"]["state"];
Expand Down Expand Up @@ -156,29 +189,46 @@ void fetch_printer_data()
printer.state = printer_state;
lv_msg_send(DATA_PRINTER_STATE, &printer);
}

unfreeze_render_thread();
}
else
{
klipper_request_consecutive_fail_count++;
Serial.printf("Failed to fetch printer data: %d\n", httpCode);
}
}

long last_data_update = 0;
const long data_update_interval = 1500;
if (frozen)
unfreeze_request_thread();
}

void data_loop()
{
if (millis() - last_data_update < data_update_interval)
return;
// Causes other threads that are trying to lock the thread to actually lock it
unfreeze_render_thread();
delay(1);
freeze_render_thread();
}

last_data_update = millis();
void data_loop_background(void * param){
while (true){
delay(100);
if (millis() - last_data_update < data_update_interval)
continue;

fetch_printer_data();
fetch_printer_data();
last_data_update = millis();
}
}

TaskHandle_t background_loop;

void data_setup()
{
semaphore_init();
printer.print_filename = filename_buff;
fetch_printer_data();
macros_query_setup();
}
freeze_render_thread();
xTaskCreatePinnedToCore(data_loop_background, "data_loop_background", 5000, NULL, 1, &background_loop, 0);
}
6 changes: 5 additions & 1 deletion CYD-Klipper/src/core/data_setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,15 @@ typedef struct _Printer {
} Printer;

extern Printer printer;
extern int klipper_request_consecutive_fail_count;

#define DATA_PRINTER_STATE 1
#define DATA_PRINTER_DATA 2
#define DATA_PRINTER_TEMP_PRESET 3

void data_loop();
void data_setup();
void send_gcode(bool wait, const char* gcode);
void send_gcode(bool wait, const char* gcode);

void freeze_request_thread();
void unfreeze_request_thread();
4 changes: 4 additions & 0 deletions CYD-Klipper/src/core/files_query.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <list>
#include "files_query.h"
#include "../conf/global_config.h"
#include "data_setup.h"
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <HardwareSerial.h>
Expand All @@ -9,6 +10,8 @@
FILESYSTEM_FILE* last_query = NULL;

FILESYSTEM_FILE* get_files(){
freeze_request_thread();

if (last_query != NULL){
FILESYSTEM_FILE* current = last_query;

Expand Down Expand Up @@ -59,5 +62,6 @@ FILESYSTEM_FILE* get_files(){
result += 1;
}

unfreeze_request_thread();
return last_query;
}
1 change: 1 addition & 0 deletions CYD-Klipper/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ void setup() {

void loop(){
wifi_ok();
ip_ok();
data_loop();
lv_timer_handler();
lv_task_handler();
Expand Down
12 changes: 12 additions & 0 deletions CYD-Klipper/src/ui/ip_setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "lvgl.h"
#include <TFT_eSPI.h>
#include <HTTPClient.h>
#include "core/data_setup.h"

bool connect_ok = false;
lv_obj_t * ipEntry;
Expand Down Expand Up @@ -117,6 +118,7 @@ int retry_count = 0;

void ip_init(){
connect_ok = false;
retry_count = 0;

ip_init_inner();

Expand All @@ -133,4 +135,14 @@ void ip_init(){
lv_label_set_text(label, retry_count_text.c_str());
}
}
}

void ip_ok(){
if (klipper_request_consecutive_fail_count > 5){
freeze_request_thread();
ip_init();
unfreeze_request_thread();
klipper_request_consecutive_fail_count = 0;
lv_msg_send(DATA_PRINTER_STATE, &printer);
}
}
3 changes: 2 additions & 1 deletion CYD-Klipper/src/ui/ip_setup.h
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
void ip_init();
void ip_init();
void ip_ok();

0 comments on commit ffdc8ae

Please sign in to comment.