More progress

This commit is contained in:
suchmememanyskill
2024-10-27 00:06:37 +02:00
parent ec7e6f180d
commit 309a6865a5
28 changed files with 296 additions and 766 deletions

View File

@@ -15,7 +15,12 @@
"*.tcc": "cpp", "*.tcc": "cpp",
"cmath": "cpp", "cmath": "cpp",
"system_error": "cpp", "system_error": "cpp",
"random": "cpp" "random": "cpp",
"optional": "cpp",
"limits": "cpp",
"memory": "cpp",
"new": "cpp",
"type_traits": "cpp"
}, },
"cmake.configureOnOpen": false "cmake.configureOnOpen": false
} }

View File

@@ -2,10 +2,10 @@
#include "global_config.h" #include "global_config.h"
#include "lvgl.h" #include "lvgl.h"
GLOBAL_CONFIG global_config = {0}; GlobalConfig global_config = {0};
TEMPORARY_CONFIG temporary_config = {0}; TemporaryConfig temporary_config = {0};
COLOR_DEF color_defs[] = { ColorDefinition color_defs[] = {
{LV_PALETTE_BLUE, 0, LV_PALETTE_RED}, {LV_PALETTE_BLUE, 0, LV_PALETTE_RED},
{LV_PALETTE_GREEN, 0, LV_PALETTE_PURPLE}, {LV_PALETTE_GREEN, 0, LV_PALETTE_PURPLE},
{LV_PALETTE_LIME, -2, LV_PALETTE_PURPLE}, {LV_PALETTE_LIME, -2, LV_PALETTE_PURPLE},
@@ -30,7 +30,7 @@ void verify_version()
if (!preferences.begin("global_config", false)) if (!preferences.begin("global_config", false))
return; return;
GLOBAL_CONFIG config = {0}; GlobalConfig config = {0};
preferences.getBytes("global_config", &config, sizeof(config)); preferences.getBytes("global_config", &config, sizeof(config));
LOG_F(("Config version: %d\n", config.version)) LOG_F(("Config version: %d\n", config.version))
if (config.version != CONFIG_VERSION) { if (config.version != CONFIG_VERSION) {
@@ -41,7 +41,7 @@ void verify_version()
preferences.end(); preferences.end();
} }
PRINTER_CONFIG* get_current_printer_config() PrinterConfiguration* get_current_printer_config()
{ {
return &global_config.printer_config[global_config.printer_index]; return &global_config.printer_config[global_config.printer_index];
} }
@@ -70,8 +70,8 @@ void set_printer_config_index(int index)
if (index < 0 || index >= PRINTER_CONFIG_COUNT) if (index < 0 || index >= PRINTER_CONFIG_COUNT)
return; return;
PRINTER_CONFIG* old_config = &global_config.printer_config[global_config.printer_index]; PrinterConfiguration* old_config = &global_config.printer_config[global_config.printer_index];
PRINTER_CONFIG* new_config = &global_config.printer_config[index]; PrinterConfiguration* new_config = &global_config.printer_config[index];
global_config.printer_index = index; global_config.printer_index = index;

View File

@@ -20,7 +20,14 @@ enum {
SHOW_STATS_ON_PROGRESS_PANEL_ALL = 3, SHOW_STATS_ON_PROGRESS_PANEL_ALL = 3,
}; };
typedef struct _PRINTER_CONFIG { enum PrinterType {
PrinterTypeKlipper = 0,
PrinterTypeKlipperSerial = 1,
PrinterTypeBambu = 2,
PrinterTypeOctoprint = 3,
};
typedef struct {
union { union {
unsigned int raw; unsigned int raw;
struct { struct {
@@ -35,6 +42,7 @@ typedef struct _PRINTER_CONFIG {
unsigned char show_stats_on_progress_panel : 2; unsigned char show_stats_on_progress_panel : 2;
bool custom_filament_move_macros : 1; bool custom_filament_move_macros : 1;
PrinterType printer_type : 3;
}; };
}; };
@@ -51,9 +59,9 @@ typedef struct _PRINTER_CONFIG {
unsigned short printer_move_x_steps[3]; unsigned short printer_move_x_steps[3];
unsigned short printer_move_y_steps[3]; unsigned short printer_move_y_steps[3];
unsigned short printer_move_z_steps[3]; unsigned short printer_move_z_steps[3];
} PRINTER_CONFIG; } PrinterConfiguration;
typedef struct _GLOBAL_CONFIG { typedef struct {
unsigned char version; unsigned char version;
union { union {
unsigned int raw; unsigned int raw;
@@ -75,7 +83,7 @@ typedef struct _GLOBAL_CONFIG {
}; };
}; };
PRINTER_CONFIG printer_config[PRINTER_CONFIG_COUNT]; PrinterConfiguration printer_config[PRINTER_CONFIG_COUNT];
float screen_cal_x_offset; float screen_cal_x_offset;
float screen_cal_x_mult; float screen_cal_x_mult;
@@ -88,24 +96,23 @@ typedef struct _GLOBAL_CONFIG {
unsigned char brightness; unsigned char brightness;
unsigned char screen_timeout; unsigned char screen_timeout;
unsigned char printer_index; unsigned char printer_index;
} GLOBAL_CONFIG; } GlobalConfig;
// Volatile/temporary config that doesn't survive a reset // Volatile/temporary config that doesn't survive a reset
typedef struct _TEMPORARY_CONFIG { typedef struct {
bool debug : 1; bool debug : 1;
bool remote_echo : 1; bool remote_echo : 1;
} TEMPORARY_CONFIG; } TemporaryConfig;
typedef struct {
typedef struct _COLOR_DEF {
lv_palette_t primary_color; lv_palette_t primary_color;
short primary_color_light; short primary_color_light;
lv_palette_t secondary_color; lv_palette_t secondary_color;
} COLOR_DEF; } ColorDefinition;
extern GLOBAL_CONFIG global_config; extern GlobalConfig global_config;
extern TEMPORARY_CONFIG temporary_config; extern TemporaryConfig temporary_config;
extern COLOR_DEF color_defs[]; extern ColorDefinition color_defs[];
#define LOG(x) if(temporary_config.debug){ Serial.print(x);} #define LOG(x) if(temporary_config.debug){ Serial.print(x);}
#define LOG_LN(x) if(temporary_config.debug){ Serial.println(x);} #define LOG_LN(x) if(temporary_config.debug){ Serial.println(x);}
@@ -115,9 +122,9 @@ void write_global_config();
void verify_version(); void verify_version();
void load_global_config(); void load_global_config();
PRINTER_CONFIG* get_current_printer_config(); //PRINTER_CONFIG* get_current_printer_config();
int get_printer_config_count(); //int get_printer_config_count();
void set_printer_config_index(int index); //void set_printer_config_index(int index);
int get_printer_config_free_index(); //int get_printer_config_free_index();
#endif // !_GLOBAL_CONFIG_INIT #endif // !_GLOBAL_CONFIG_INIT

View File

@@ -1,23 +1,11 @@
#include "data_setup.h" #include "data_setup.h"
#include "lvgl.h"
#include "../conf/global_config.h"
#include <ArduinoJson.h>
#include <esp_task_wdt.h> #include <esp_task_wdt.h>
#include "macros_query.h"
#include <UrlEncode.h> #include <UrlEncode.h>
#include "http_client.h"
#include "../ui/ui_utils.h"
#include "macros_query.h"
#include "printer_integration.hpp" #include "printer_integration.hpp"
Printer printer = {0};
PrinterMinimal *printer_minimal;
int klipper_request_consecutive_fail_count = 999;
char filename_buff[512] = {0};
SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore; SemaphoreHandle_t freezeRenderThreadSemaphore, freezeRequestThreadSemaphore;
const long data_update_interval = 780; const long data_update_interval = 780;
unsigned char lock_absolute_relative_mode_swap = 0;
void semaphore_init(){ void semaphore_init(){
freezeRenderThreadSemaphore = xSemaphoreCreateMutex(); freezeRenderThreadSemaphore = xSemaphoreCreateMutex();
@@ -42,90 +30,6 @@ void unfreeze_render_thread(){
xSemaphoreGive(freezeRenderThreadSemaphore); xSemaphoreGive(freezeRenderThreadSemaphore);
} }
void send_gcode(bool wait, const char *gcode)
{
LOG_F(("Sending gcode: %s\n", gcode))
SETUP_HTTP_CLIENT_FULL("/printer/gcode/script?script=" + urlEncode(gcode), false, wait ? 5000 : 750);
try
{
client.GET();
}
catch (...)
{
LOG_LN("Failed to send gcode");
}
}
void send_estop()
{
LOG_LN("Sending estop");
SETUP_HTTP_CLIENT_FULL("/printer/emergency_stop", false, 5000);
try
{
client.GET();
}
catch (...)
{
LOG_LN("Failed to send estop");
}
}
int get_slicer_time_estimate_s()
{
if (printer.state == PRINTER_STATE_IDLE)
return 0;
delay(10);
SETUP_HTTP_CLIENT("/server/files/metadata?filename=" + urlEncode(printer.print_filename));
int httpCode = client.GET();
if (httpCode != 200)
return 0;
JsonDocument doc;
deserializeJson(doc, client.getStream());
int time_estimate_s = doc["result"]["estimated_time"];
LOG_F(("Got slicer time estimate: %ds\n", time_estimate_s))
return time_estimate_s;
}
void move_printer(const char* axis, float amount, bool relative) {
if (!printer.homed_axis || printer.state == PRINTER_STATE_PRINTING)
return;
char gcode[64];
const char* extra = (amount > 0) ? "+" : "";
const char* start = "";
const char* end = "";
bool absolute_coords = printer.absolute_coords;
if (absolute_coords && relative) {
start = "G91\n";
}
else if (!absolute_coords && !relative) {
start = "G90\n";
}
if (absolute_coords && relative) {
end = "\nG90";
}
else if (!absolute_coords && !relative) {
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;
void fetch_printer_data() void fetch_printer_data()
{ {
freeze_request_thread(); freeze_request_thread();
@@ -159,10 +63,14 @@ void fetch_printer_data_minimal()
PrinterDataMinimal* data = (PrinterDataMinimal*)malloc(sizeof(PrinterDataMinimal) * get_printer_count()); PrinterDataMinimal* data = (PrinterDataMinimal*)malloc(sizeof(PrinterDataMinimal) * get_printer_count());
for (int i = 0; i < get_printer_count(); i++) for (int i = 0; i < get_printer_count(); i++)
{ {
freeze_request_thread();
BasePrinter* printer = get_printer(i); BasePrinter* printer = get_printer(i);
unfreeze_request_thread();
*(data + i) = printer->fetch_min(); *(data + i) = printer->fetch_min();
} }
freeze_render_thread();
announce_printer_data_minimal(data); announce_printer_data_minimal(data);
unfreeze_render_thread();
free(data); free(data);
} }
@@ -193,11 +101,8 @@ TaskHandle_t background_loop;
void data_setup() void data_setup()
{ {
printer_minimal = (PrinterMinimal*)calloc(sizeof(PrinterMinimal), PRINTER_CONFIG_COUNT);
semaphore_init(); semaphore_init();
printer.print_filename = filename_buff;
fetch_printer_data(); fetch_printer_data();
freeze_render_thread(); freeze_render_thread();
xTaskCreatePinnedToCore(data_loop_background, "data_loop_background", 5000, NULL, 2, &background_loop, 0); xTaskCreatePinnedToCore(data_loop_background, "data_loop_background", 5000, NULL, 2, &background_loop, 0);
} }

View File

@@ -1,62 +1,7 @@
#pragma once #pragma once
enum {
PRINTER_STATE_OFFLINE = 0,
PRINTER_STATE_ERROR = 1,
PRINTER_STATE_IDLE = 2,
PRINTER_STATE_PRINTING = 3,
PRINTER_STATE_PAUSED = 4,
};
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];
unsigned char can_extrude;
unsigned char homed_axis;
unsigned char absolute_coords;
float elapsed_time_s;
float printed_time_s;
float remaining_time_s;
float filament_used_mm;
char* print_filename;
float print_progress; // 0 -> 1
float fan_speed; // 0 -> 1
float gcode_offset[3];
float speed_mult;
float extrude_mult;
int total_layers;
int current_layer;
float pressure_advance;
float smooth_time;
int feedrate_mm_per_s;
int slicer_estimated_print_time_s;
} Printer;
typedef struct _PrinterMinimal {
unsigned char state;
float print_progress; // 0 -> 1
unsigned int power_devices;
} PrinterMinimal;
extern Printer printer;
extern PrinterMinimal *printer_minimal;
extern int klipper_request_consecutive_fail_count;
#define DATA_PRINTER_STATE 1
#define DATA_PRINTER_DATA 2
#define DATA_PRINTER_TEMP_PRESET 3
#define DATA_PRINTER_MINIMAL 4
void data_loop(); void data_loop();
void data_setup(); void data_setup();
void send_estop();
void send_gcode(bool wait, const char* gcode);
void move_printer(const char* axis, float amount, bool relative);
void freeze_request_thread(); void freeze_request_thread();
void unfreeze_request_thread(); void unfreeze_request_thread();

View File

@@ -1,113 +0,0 @@
#include <list>
#include "files_query.h"
#include "../conf/global_config.h"
#include "data_setup.h"
#include <ArduinoJson.h>
#include <HardwareSerial.h>
#include "http_client.h"
// Always has +1 entry with a null'd name
FILESYSTEM_FILE* last_query = NULL;
void clear_files()
{
if (last_query != NULL){
FILESYSTEM_FILE* current = last_query;
while (current->name != NULL){
free(current->name);
current += 1;
}
free(last_query);
last_query = NULL;
}
}
FILESYSTEM_FILE* get_files(int limit)
{
freeze_request_thread();
clear_files();
LOG_F(("Heap space pre-file-parse: %d bytes\n", esp_get_free_heap_size()))
std::list<FILESYSTEM_FILE> files;
auto timer_request = millis();
SETUP_HTTP_CLIENT_FULL("/server/files/list", true, 5000);
int httpCode = client.GET();
auto timer_parse = millis();
if (httpCode == 200){
JsonDocument doc;
auto parseResult = deserializeJson(doc, client.getStream());
LOG_F(("Json parse: %s\n", parseResult.c_str()))
auto result = doc["result"].as<JsonArray>();
for (auto file : result){
FILESYSTEM_FILE f = {0};
const char* path = file["path"];
float modified = file["modified"];
auto file_iter = files.begin();
while (file_iter != files.end()){
if ((*file_iter).modified < modified)
break;
file_iter++;
}
if (file_iter == files.end() && files.size() >= limit)
continue;
f.name = (char*)malloc(strlen(path) + 1);
if (f.name == NULL){
LOG_LN("Failed to allocate memory");
continue;
}
strcpy(f.name, path);
f.modified = modified;
if (file_iter != files.end())
files.insert(file_iter, f);
else
files.push_back(f);
if (files.size() > limit){
auto last_entry = files.back();
if (last_entry.name != NULL)
free(last_entry.name);
files.pop_back();
}
}
}
size_t size = sizeof(FILESYSTEM_FILE) * (files.size() + 1);
FILESYSTEM_FILE* result = (FILESYSTEM_FILE*)malloc(size);
if (result == NULL){
LOG_LN("Failed to allocate memory");
for (auto file : files){
free(file.name);
}
unfreeze_request_thread();
return NULL;
}
last_query = result;
result[files.size()].name = NULL;
for (auto file : files){
*result = file;
result += 1;
}
LOG_F(("Heap space post-file-parse: %d bytes\n", esp_get_free_heap_size()))
LOG_F(("Got %d files. Request took %dms, parsing took %dms\n", files.size(), timer_parse - timer_request, millis() - timer_parse))
unfreeze_request_thread();
return last_query;
}

View File

@@ -1,23 +0,0 @@
/*
At some point it may be a fun challenge to try to implement a virtual folder structure, but not today.
typedef struct _FILESYSTEM_FILE {
char* name;
char* parent_folder_name;
long level;
} FILESYSTEM_FILE;
typedef struct _FILESYSTEM_FOLDER {
char** files;
char* folder_path;
FILESYSTEM_FOLDER* folders;
} FILESYSTEM_FOLDER;
*/
typedef struct _FILESYSTEM_FILE {
char* name;
float modified;
} FILESYSTEM_FILE;
FILESYSTEM_FILE* get_files(int limit);
void clear_files();

View File

@@ -1,32 +0,0 @@
#include "http_client.h"
String get_full_url(String url_part, PRINTER_CONFIG * config)
{
if (config == NULL){
config = get_current_printer_config();
}
return "http://" + String(config->klipper_host) + ":" + String(config->klipper_port) + url_part;
}
void configure_http_client(HTTPClient &client, String url, bool stream, int timeout, PRINTER_CONFIG * config)
{
if (config == NULL){
config = get_current_printer_config();
}
if (stream){
client.useHTTP10(true);
}
if (timeout > 0){
client.setTimeout(timeout);
client.setConnectTimeout(timeout);
}
client.begin(url);
if (config->auth_configured) {
client.addHeader("X-Api-Key", config->klipper_auth);
}
}

View File

@@ -1,10 +0,0 @@
#pragma once
#include <HTTPClient.h>
#include "../conf/global_config.h"
String get_full_url(String url_part, PRINTER_CONFIG * config = NULL);
void configure_http_client(HTTPClient &client, String url, bool stream = true, int timeout = 1000, PRINTER_CONFIG * config = NULL);
#define SETUP_HTTP_CLIENT(url_part) HTTPClient client; configure_http_client(client, get_full_url(url_part));
#define SETUP_HTTP_CLIENT_FULL(url_part, stream, timeout) HTTPClient client; configure_http_client(client, get_full_url(url_part), stream, timeout);

View File

@@ -144,7 +144,7 @@ bool KlipperPrinter::execute_feature(PrinterFeatures feature)
return false; return false;
} }
if (get_current_printer_config()->custom_filament_move_macros) if (get_current_printer()->printer_config->custom_filament_move_macros)
{ {
return send_gcode("FILAMENT_RETRACT"); return send_gcode("FILAMENT_RETRACT");
} }
@@ -491,7 +491,7 @@ Macros KlipperPrinter::get_macros()
} }
} }
if (global_config->sort_macros) if (global_config.sort_macros)
{ {
std::sort(macros.macros, macros.macros + macros.count, [](const char* a, const char* b) { std::sort(macros.macros, macros.macros + macros.count, [](const char* a, const char* b) {
return strcmp(a, b) < 0; return strcmp(a, b) < 0;

View File

@@ -5,6 +5,7 @@
#include "../ui/ui_utils.h" #include "../ui/ui_utils.h"
#include <Esp.h> #include <Esp.h>
#include "../ui/serial/serial_console.h" #include "../ui/serial/serial_console.h"
#include "printer_integration.hpp"
#ifndef CPU_FREQ_HIGH #ifndef CPU_FREQ_HIGH
#define CPU_FREQ_HIGH 240 #define CPU_FREQ_HIGH 240
@@ -254,10 +255,10 @@ void set_screen_timer_period()
void set_color_scheme() void set_color_scheme()
{ {
PRINTER_CONFIG *config = get_current_printer_config(); PrinterConfiguration *config = get_current_printer()->printer_config;
lv_disp_t *dispp = lv_disp_get_default(); lv_disp_t *dispp = lv_disp_get_default();
lv_color_t main_color = {0}; lv_color_t main_color = {0};
COLOR_DEF color_def = color_defs[config->color_scheme]; ColorDefinition color_def = color_defs[config->color_scheme];
if (color_defs[config->color_scheme].primary_color_light > 0){ if (color_defs[config->color_scheme].primary_color_light > 0){
main_color = lv_palette_lighten(color_def.primary_color, color_def.primary_color_light); main_color = lv_palette_lighten(color_def.primary_color, color_def.primary_color_light);

View File

@@ -1,185 +0,0 @@
#include "lvgl.h"
#include "macros_query.h"
#include "./data_setup.h"
#include <ArduinoJson.h>
#include <UrlEncode.h>
#include "http_client.h"
static char* macros[64] = {0};
static int macros_count = 0;
static char* power_devices[16] = {0};
static bool power_device_states[16] = {0};
static unsigned int stored_power_devices_count = 0;
void macros_clear()
{
for (int i = 0; i < macros_count; i++){
free(macros[i]);
}
macros_count = 0;
}
MACROSQUERY macros_query(PRINTER_CONFIG * config)
{
HTTPClient client;
configure_http_client(client, get_full_url("/printer/gcode/help", config), true, 1000);
int httpCode = client.GET();
if (httpCode == 200){
JsonDocument doc;
deserializeJson(doc, client.getStream());
auto result = doc["result"].as<JsonObject>();
macros_clear();
for (JsonPair i : result){
const char *key = i.key().c_str();
const char *value = i.value().as<String>().c_str();
if (strcmp(value, "CYD_SCREEN_MACRO") == 0) {
char* macro = (char*)malloc(strlen(key) + 1);
strcpy(macro, key);
macros[macros_count++] = macro;
}
}
if (global_config.sort_macros)
{
std::sort(macros, macros + macros_count, [](const char* a, const char* b) {
return strcmp(a, b) < 0;
});
}
return {(const char**)macros, (unsigned int)macros_count};
}
else {
return {NULL, 0};
}
}
MACROSQUERY macros_query()
{
return macros_query(get_current_printer_config());
}
unsigned int macro_count(PRINTER_CONFIG * config)
{
HTTPClient client;
configure_http_client(client, get_full_url("/printer/gcode/help", config), true, 1000);
int httpCode = client.GET();
if (httpCode == 200){
JsonDocument doc;
deserializeJson(doc, client.getStream());
auto result = doc["result"].as<JsonObject>();
unsigned int count = 0;
for (JsonPair i : result){
const char *value = i.value().as<String>().c_str();
if (strcmp(value, "CYD_SCREEN_MACRO") == 0) {
count++;
}
}
return count;
}
else {
return 0;
}
}
unsigned int macro_count()
{
return macro_count(get_current_printer_config());
}
void power_devices_clear()
{
for (int i = 0; i < stored_power_devices_count; i++){
free(power_devices[i]);
}
stored_power_devices_count = 0;
}
POWERQUERY power_devices_query(PRINTER_CONFIG * config)
{
HTTPClient client;
configure_http_client(client, get_full_url("/machine/device_power/devices", config), true, 1000);
int httpCode = client.GET();
if (httpCode == 200){
JsonDocument doc;
deserializeJson(doc, client.getStream());
auto result = doc["result"]["devices"].as<JsonArray>();
power_devices_clear();
for (auto i : result){
const char * device_name = i["device"];
const char * device_state = i["status"];
power_devices[stored_power_devices_count] = (char*)malloc(strlen(device_name) + 1);
strcpy(power_devices[stored_power_devices_count], device_name);
power_device_states[stored_power_devices_count] = strcmp(device_state, "on") == 0;
stored_power_devices_count++;
}
return {(const char**)power_devices, (const bool*)power_device_states, (unsigned int)stored_power_devices_count};
}
else {
return {NULL, NULL, 0};
}
}
POWERQUERY power_devices_query()
{
return power_devices_query(get_current_printer_config());
}
unsigned int power_devices_count(PRINTER_CONFIG * config)
{
HTTPClient client;
configure_http_client(client, get_full_url("/machine/device_power/devices", config), true, 1000);
int httpCode = client.GET();
if (httpCode == 200){
JsonDocument doc;
deserializeJson(doc, client.getStream());
auto result = doc["result"]["devices"].as<JsonArray>();
unsigned int count = 0;
for (auto i : result){
count++;
}
return count;
}
else {
return 0;
}
}
unsigned int power_devices_count()
{
return power_devices_count(get_current_printer_config());
}
bool set_power_state(const char* device_name, bool state, PRINTER_CONFIG * config)
{
HTTPClient client;
configure_http_client(client, get_full_url("/machine/device_power/device?device=" + urlEncode(device_name) + "&action=" + (state ? "on" : "off"), config), true, 1000);
return client.POST("") == 200;
}
bool set_power_state(const char* device_name, bool state)
{
return set_power_state(device_name, state, get_current_printer_config());
}

View File

@@ -1,27 +0,0 @@
#pragma once
#include "../conf/global_config.h"
typedef struct {
const char** macros;
uint32_t count;
} MACROSQUERY;
typedef struct {
const char** power_devices;
const bool* power_states;
uint32_t count;
} POWERQUERY;
MACROSQUERY macros_query(PRINTER_CONFIG * config);
MACROSQUERY macros_query();
unsigned int macro_count(PRINTER_CONFIG * config);
unsigned int macro_count();
POWERQUERY power_devices_query(PRINTER_CONFIG * config);
POWERQUERY power_devices_query();
unsigned int power_devices_count(PRINTER_CONFIG * config);
unsigned int power_devices_count();
bool set_power_state(const char* device_name, bool state, PRINTER_CONFIG * config);
bool set_power_state(const char* device_name, bool state);
void macros_clear();
void power_devices_clear();

View File

@@ -1,4 +1,6 @@
#include "printer_integration.hpp" #include "printer_integration.hpp"
#include "lv_setup.h"
#include "screen_driver.h"
unsigned char current_printer_index = 0; unsigned char current_printer_index = 0;
unsigned char total_printers; unsigned char total_printers;
@@ -20,12 +22,6 @@ BasePrinter::BasePrinter(unsigned char index)
// TODO: Fetch printer config and global config // TODO: Fetch printer config and global config
} }
#define DATA_PRINTER_STATE 1
#define DATA_PRINTER_DATA 2
#define DATA_PRINTER_TEMP_PRESET 3
#define DATA_PRINTER_MINIMAL 4
#define DATA_PRINTER_POPUP 5
PrinterData* BasePrinter::AnnouncePrinterData() PrinterData* BasePrinter::AnnouncePrinterData()
{ {
char* old_state_message = printer_data_copy->state_message; char* old_state_message = printer_data_copy->state_message;
@@ -37,11 +33,6 @@ PrinterData* BasePrinter::AnnouncePrinterData()
if (old_state_message != printer_data_copy->state_message) if (old_state_message != printer_data_copy->state_message)
{ {
free(old_state_message); free(old_state_message);
lv_msg_send(DATA_PRINTER_STATE, get_current_printer());
}
else if (printer_data.state != printer_data_copy->state)
{
lv_msg_send(DATA_PRINTER_STATE, get_current_printer());
} }
if (old_print_filename != printer_data_copy->print_filename) if (old_print_filename != printer_data_copy->print_filename)
@@ -49,6 +40,11 @@ PrinterData* BasePrinter::AnnouncePrinterData()
free(old_print_filename); free(old_print_filename);
} }
if (printer_data.state != printer_data_copy->state)
{
lv_msg_send(DATA_PRINTER_STATE, get_current_printer());
}
if (old_popup_message != printer_data_copy->popup_message) if (old_popup_message != printer_data_copy->popup_message)
{ {
free(old_popup_message); free(old_popup_message);
@@ -73,6 +69,11 @@ BasePrinter* get_printer(int idx)
return registered_printers + idx; return registered_printers + idx;
} }
int get_current_printer_index()
{
return current_printer_index;
}
PrinterData* get_current_printer_data() PrinterData* get_current_printer_data()
{ {
return printer_data_copy; return printer_data_copy;
@@ -87,4 +88,27 @@ void announce_printer_data_minimal(PrinterDataMinimal* printer_data)
{ {
memcpy(printer_data_copy, printer_data, sizeof(PrinterDataMinimal) * total_printers); memcpy(printer_data_copy, printer_data, sizeof(PrinterDataMinimal) * total_printers);
lv_msg_send(DATA_PRINTER_MINIMAL, get_current_printer()); lv_msg_send(DATA_PRINTER_MINIMAL, get_current_printer());
}
PrinterDataMinimal* get_printer_data_minimal(int idx)
{
return &(minimal_data_copy[idx]);
}
void BasePrinter::save_printer_config()
{
// TODO
}
void add_printer()
{
}
void set_current_printer(int idx)
{
//set_printer_config_index(index);
set_color_scheme();
set_invert_display();
} }

View File

@@ -97,7 +97,7 @@ typedef struct _PrinterData {
int feedrate_mm_per_s; int feedrate_mm_per_s;
} PrinterData; } PrinterData;
typedef struct { typedef struct {
unsigned char state; unsigned char state;
float print_progress; // 0 -> 1 float print_progress; // 0 -> 1
unsigned int power_devices; unsigned int power_devices;
@@ -118,7 +118,7 @@ typedef struct {
} PowerDevices; } PowerDevices;
typedef struct { typedef struct {
const char** available_files; char** available_files;
unsigned int count; unsigned int count;
bool success; bool success;
} Files; } Files;
@@ -132,11 +132,10 @@ class BasePrinter
{ {
protected: protected:
unsigned char config_index{}; unsigned char config_index{};
GLOBAL_CONFIG* global_config{};
PrinterData printer_data{}; PrinterData printer_data{};
PRINTER_CONFIG* printer_config{};
public: public:
PrinterConfiguration* printer_config{};
PrinterFeatures supported_features{}; PrinterFeatures supported_features{};
PrinterTemperatureDevice supported_temperature_devices{}; PrinterTemperatureDevice supported_temperature_devices{};
PrinterUiPanel* custom_menus{}; PrinterUiPanel* custom_menus{};
@@ -148,12 +147,15 @@ class BasePrinter
virtual bool fetch() = 0; virtual bool fetch() = 0;
virtual PrinterDataMinimal fetch_min() = 0; virtual PrinterDataMinimal fetch_min() = 0;
virtual void disconnect() = 0; virtual void disconnect() = 0;
// Free macros externally when done
virtual Macros get_macros() = 0; virtual Macros get_macros() = 0;
virtual int get_macros_count() = 0; virtual int get_macros_count() = 0;
virtual bool execute_macro(const char* macro) = 0; virtual bool execute_macro(const char* macro) = 0;
// Free power devices externally when done
virtual PowerDevices get_power_devices() = 0; virtual PowerDevices get_power_devices() = 0;
virtual int get_power_devices_count() = 0; virtual int get_power_devices_count() = 0;
virtual bool set_power_device_state(const char* device_name, bool state) = 0; virtual bool set_power_device_state(const char* device_name, bool state) = 0;
// Free files externally when done
virtual Files get_files() = 0; virtual Files get_files() = 0;
virtual bool start_file(const char* filename) = 0; virtual bool start_file(const char* filename) = 0;
virtual unsigned char* get_32_32_png_image_thumbnail(const char* gcode_filename); virtual unsigned char* get_32_32_png_image_thumbnail(const char* gcode_filename);
@@ -161,11 +163,22 @@ class BasePrinter
BasePrinter(unsigned char index); BasePrinter(unsigned char index);
PrinterData* AnnouncePrinterData(); PrinterData* AnnouncePrinterData();
void save_printer_config();
}; };
#define DATA_PRINTER_STATE 1
#define DATA_PRINTER_DATA 2
#define DATA_PRINTER_TEMP_PRESET 3
#define DATA_PRINTER_MINIMAL 4
#define DATA_PRINTER_POPUP 5
BasePrinter* get_current_printer(); BasePrinter* get_current_printer();
BasePrinter* get_printer(int idx); BasePrinter* get_printer(int idx);
void initialize_printers(); void initialize_printers();
PrinterData* get_current_printer_data(); PrinterData* get_current_printer_data();
unsigned int get_printer_count(); unsigned int get_printer_count();
void announce_printer_data_minimal(PrinterDataMinimal* printer_data); void announce_printer_data_minimal(PrinterDataMinimal* printer_data);
PrinterDataMinimal* get_printer_data_minimal(int idx);
int get_current_printer_index();
void add_printer();
void set_current_printer(int idx);

View File

@@ -3,52 +3,80 @@
#include <Esp.h> #include <Esp.h>
#include "../core/data_setup.h" #include "../core/data_setup.h"
PRINTER_CONFIG * curernt_config = NULL; typedef struct {
const char* power_device_name;
BasePrinter* printer;
} DoubleStorage;
static void btn_press(lv_event_t * e){ static void macro_run(lv_event_t * e){
lv_obj_t * btn = lv_event_get_target(e); lv_obj_t * btn = lv_event_get_target(e);
const char* macro = (const char*)lv_event_get_user_data(e); const char* macro = (const char*)lv_event_get_user_data(e);
LOG_F(("Macro: %s\n", macro)) LOG_F(("Macro: %s\n", macro))
send_gcode(false, macro); get_current_printer()->execute_macro(macro);
} }
void macros_add_macros_to_panel(lv_obj_t * root_panel, MACROSQUERY query) int macros_add_macros_to_panel(lv_obj_t * root_panel, BasePrinter* printer)
{ {
for (int i = 0; i < query.count; i++){ freeze_request_thread();
const char* macro = query.macros[i]; Macros macros = printer->get_macros();
lv_create_custom_menu_button(macro, root_panel, btn_press, "Run", (void*)macro); unfreeze_request_thread();
if (!macros.success)
{
return 0;
} }
for (int i = 0; i < macros.count; i++)
{
const char* macro = macros.macros[i];
lv_obj_on_destroy_free_data(root_panel, macro);
lv_create_custom_menu_button(macro, root_panel, macro_run, "Run", (void*)macro);
}
free(macros.macros);
return macros.count;
} }
static void power_device_toggle(lv_event_t * e) static void power_device_toggle(lv_event_t * e)
{ {
auto state = lv_obj_get_state(lv_event_get_target(e)); auto state = lv_obj_get_state(lv_event_get_target(e));
bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED); bool checked = (state & LV_STATE_CHECKED == LV_STATE_CHECKED);
const char* power_device_name = (const char*)lv_event_get_user_data(e); DoubleStorage* device = (DoubleStorage*)lv_event_get_user_data(e);
LOG_F(("Power Device: %s, State: %d -> %d\n", power_device_name, !checked, checked)) LOG_F(("Power Device: %s, State: %d -> %d\n", device->power_device_name, !checked, checked))
if (curernt_config != NULL) device->printer->set_power_device_state(device->power_device_name, checked);
set_power_state(power_device_name, checked, curernt_config);
} }
void macros_add_power_devices_to_panel(lv_obj_t * root_panel, POWERQUERY query) int macros_add_power_devices_to_panel(lv_obj_t * root_panel, BasePrinter* printer)
{ {
for (int i = 0; i < query.count; i++){ freeze_request_thread();
const char* power_device_name = query.power_devices[i]; PowerDevices devices = printer->get_power_devices();
const bool power_device_state = query.power_states[i]; unfreeze_request_thread();
lv_create_custom_menu_switch(power_device_name, root_panel, power_device_toggle, power_device_state, (void*)power_device_name);
if (!devices.success)
{
return 0;
} }
for (int i = 0; i < devices.count; i++)
{
const char* power_device_name = devices.power_devices[i];
const bool power_device_state = devices.power_states[i];
DoubleStorage* storage = (DoubleStorage*)malloc(sizeof(DoubleStorage));
storage->printer = printer;
storage->power_device_name = power_device_name;
lv_obj_on_destroy_free_data(root_panel, storage);
lv_obj_on_destroy_free_data(root_panel, power_device_name);
lv_create_custom_menu_switch(power_device_name, root_panel, power_device_toggle, power_device_state, (void*)storage);
}
free(devices.power_devices);
free(devices.power_states);
return devices.count;
} }
void macros_set_current_config(PRINTER_CONFIG * config) void macros_draw_power_fullscreen(BasePrinter* printer)
{ {
curernt_config = config;
}
void macros_draw_power_fullscreen(PRINTER_CONFIG * config)
{
macros_set_current_config(config);
lv_obj_t * parent = lv_create_empty_panel(lv_scr_act()); lv_obj_t * parent = lv_create_empty_panel(lv_scr_act());
lv_obj_set_style_bg_opa(parent, LV_OPA_100, 0); lv_obj_set_style_bg_opa(parent, LV_OPA_100, 0);
lv_obj_align(parent, LV_ALIGN_TOP_RIGHT, 0, 0); lv_obj_align(parent, LV_ALIGN_TOP_RIGHT, 0, 0);
@@ -67,11 +95,10 @@ void macros_draw_power_fullscreen(PRINTER_CONFIG * config)
lv_label_set_text(label, LV_SYMBOL_CLOSE " Close"); lv_label_set_text(label, LV_SYMBOL_CLOSE " Close");
lv_obj_center(label); lv_obj_center(label);
POWERQUERY power = power_devices_query(config); macros_add_power_devices_to_panel(parent, printer);
macros_add_power_devices_to_panel(parent, power);
} }
void macros_draw_power_fullscreen() void macros_draw_power_fullscreen()
{ {
macros_draw_power_fullscreen(get_current_printer_config()); macros_draw_power_fullscreen(get_current_printer());
} }

View File

@@ -1,10 +1,10 @@
#pragma once #pragma once
#include "lvgl.h" #include "lvgl.h"
#include "../core/macros_query.h" #include "../conf/global_config.h"
#include "../core/printer_integration.hpp"
void macros_add_macros_to_panel(lv_obj_t * root_panel, MACROSQUERY query); int macros_add_macros_to_panel(lv_obj_t * root_panel, BasePrinter* printer);
void macros_add_power_devices_to_panel(lv_obj_t * root_panel, POWERQUERY query); int macros_add_power_devices_to_panel(lv_obj_t * root_panel, BasePrinter* printer);
void macros_set_current_config(PRINTER_CONFIG * config); void macros_draw_power_fullscreen(BasePrinter* printer);
void macros_draw_power_fullscreen(PRINTER_CONFIG * config);
void macros_draw_power_fullscreen(); void macros_draw_power_fullscreen();

View File

@@ -2,17 +2,17 @@
#include "../core/data_setup.h" #include "../core/data_setup.h"
#include "../conf/global_config.h" #include "../conf/global_config.h"
#include "../core/screen_driver.h" #include "../core/screen_driver.h"
#include "../core/printer_integration.hpp"
#include "lvgl.h" #include "lvgl.h"
#include "nav_buttons.h" #include "nav_buttons.h"
#include "ui_utils.h" #include "ui_utils.h"
#include "panels/panel.h" #include "panels/panel.h"
#include "../core/macros_query.h"
#include "../core/lv_setup.h" #include "../core/lv_setup.h"
#include "switch_printer.h" #include "switch_printer.h"
#include "macros.h" #include "macros.h"
void check_if_screen_needs_to_be_disabled(){ void check_if_screen_needs_to_be_disabled(){
if (global_config.on_during_print && printer.state == PRINTER_STATE_PRINTING){ if (global_config.on_during_print && get_current_printer_data()->state == PrinterState::PrinterStatePrinting){
screen_timer_wake(); screen_timer_wake();
screen_timer_stop(); screen_timer_stop();
} }
@@ -24,18 +24,22 @@ void check_if_screen_needs_to_be_disabled(){
static void on_state_change(void * s, lv_msg_t * m){ static void on_state_change(void * s, lv_msg_t * m){
check_if_screen_needs_to_be_disabled(); check_if_screen_needs_to_be_disabled();
if (printer.state == PRINTER_STATE_OFFLINE){ PrinterData* printer = get_current_printer_data();
if (printer->state == PrinterState::PrinterStateOffline){
nav_buttons_setup(PANEL_CONNECTING); nav_buttons_setup(PANEL_CONNECTING);
} }
else if (printer.state == PRINTER_STATE_ERROR){ else if (printer->state == PrinterState::PrinterStateError){
nav_buttons_setup(PANEL_ERROR); nav_buttons_setup(PANEL_ERROR);
} }
else if (printer.state == PRINTER_STATE_IDLE) { else if (printer->state == PrinterState::PrinterStateIdle) {
nav_buttons_setup(PANEL_FILES); nav_buttons_setup(PANEL_FILES);
} }
else { else {
nav_buttons_setup(PANEL_PROGRESS); nav_buttons_setup(PANEL_PROGRESS);
} }
lv_msg_send(DATA_PRINTER_DATA, get_current_printer());
} }
void main_ui_setup(){ void main_ui_setup(){

View File

@@ -1,9 +1,11 @@
#include "panel.h" #include "panel.h"
#include "../../conf/global_config.h" #include "../../core/printer_integration.hpp"
void connecting_panel_init(lv_obj_t* panel) void connecting_panel_init(lv_obj_t* panel)
{ {
lv_obj_t* label = lv_label_create(panel); lv_obj_t* label = lv_label_create(panel);
lv_label_set_text_fmt(label, "Connecting to %s...", (get_current_printer_config()->printer_name[0] == 0) ? get_current_printer_config()->klipper_host : get_current_printer_config()->printer_name); lv_label_set_text_fmt(label, "Connecting to %s...", (get_current_printer()->printer_config->printer_name[0] == 0)
? get_current_printer()->printer_config->klipper_host
: get_current_printer()->printer_config->printer_name);
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
} }

View File

@@ -1,13 +1,19 @@
#include "panel.h" #include "panel.h"
#include "../../core/data_setup.h" #include "../../core/data_setup.h"
#include "../ui_utils.h" #include "../ui_utils.h"
#include "../../core/printer_integration.hpp"
static void btn_click_restart(lv_event_t * e){ static void btn_click_restart(lv_event_t * e){
send_gcode(false, "RESTART"); get_current_printer()->execute_feature(PrinterFeatureRestart);
} }
static void btn_click_firmware_restart(lv_event_t * e){ static void btn_click_firmware_restart(lv_event_t * e){
send_gcode(false, "FIRMWARE_RESTART"); get_current_printer()->execute_feature(PrinterFeatureFirmwareRestart);
}
static void set_state_message_text(lv_event_t * e) {
lv_obj_t * label = lv_event_get_target(e);
lv_label_set_text(label, get_current_printer_data()->state_message);
} }
void error_panel_init(lv_obj_t* panel) void error_panel_init(lv_obj_t* panel)
@@ -25,9 +31,10 @@ void error_panel_init(lv_obj_t* panel)
lv_obj_set_width(panel_with_text, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2); lv_obj_set_width(panel_with_text, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2);
label = lv_label_create(panel_with_text); label = lv_label_create(panel_with_text);
lv_label_set_text(label, printer.state_message);
lv_obj_set_width(label, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2); lv_obj_set_width(label, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2);
lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);
lv_obj_add_event_cb(label, set_state_message_text, LV_EVENT_MSG_RECEIVED, NULL);
lv_msg_subscribe_obj(DATA_PRINTER_DATA, label, NULL);
lv_obj_t * button_row = lv_create_empty_panel(panel); lv_obj_t * button_row = lv_create_empty_panel(panel);
lv_obj_set_size(button_row, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); lv_obj_set_size(button_row, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);

View File

@@ -1,36 +1,33 @@
#include "lvgl.h" #include "lvgl.h"
#include "panel.h" #include "panel.h"
#include "../../core/data_setup.h" #include "../../core/data_setup.h"
#include "../../core/files_query.h"
#include "../../conf/global_config.h" #include "../../conf/global_config.h"
#include <HardwareSerial.h> #include <HardwareSerial.h>
#include "../ui_utils.h" #include "../ui_utils.h"
#include "../../core/lv_setup.h" #include "../../core/lv_setup.h"
#include "../gcode_img.h" #include "../gcode_img.h"
#include "../../core/http_client.h"
#include <UrlEncode.h> #include <UrlEncode.h>
#include "../../core/printer_integration.hpp"
FILESYSTEM_FILE* selected_file = NULL; const char* selected_file = NULL;
static void btn_print_file(lv_event_t * e){ static void btn_print_file(lv_event_t * e){
lv_obj_t * panel = (lv_obj_t*)lv_event_get_user_data(e); lv_obj_t * panel = (lv_obj_t*)lv_event_get_user_data(e);
lv_obj_del(panel); lv_obj_del(panel);
SETUP_HTTP_CLIENT("/printer/print/start?filename=" + urlEncode(selected_file->name)); get_current_printer()->start_file(selected_file);
int httpCode = client.POST("");
LOG_F(("Print start: HTTP %d\n", httpCode))
} }
static void btn_print_file_verify(lv_event_t * e){ static void btn_print_file_verify(lv_event_t * e){
if (printer.state != PRINTER_STATE_IDLE){ if (get_current_printer_data()->state != PrinterState::PrinterStateIdle){
return; return;
} }
const auto button_size_mult = 1.3f; const auto button_size_mult = 1.3f;
lv_obj_t * btn = lv_event_get_target(e); lv_obj_t * btn = lv_event_get_target(e);
selected_file = (FILESYSTEM_FILE*)lv_event_get_user_data(e); selected_file = (char*)lv_event_get_user_data(e);
lv_obj_t * panel = lv_obj_create(lv_scr_act()); lv_obj_t * panel = lv_obj_create(lv_scr_act());
lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX * 2, 0); lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX * 2, 0);
@@ -42,7 +39,7 @@ static void btn_print_file_verify(lv_event_t * e){
lv_obj_align(label_print_file, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_align(label_print_file, LV_ALIGN_TOP_LEFT, 0, 0);
lv_obj_t * label = lv_label_create(panel); lv_obj_t * label = lv_label_create(panel);
lv_label_set_text(label, selected_file->name); lv_label_set_text(label, selected_file);
lv_obj_align(label, LV_ALIGN_CENTER, 0, -20); lv_obj_align(label, LV_ALIGN_CENTER, 0, -20);
lv_obj_set_width(label, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 10); lv_obj_set_width(label, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 10);
lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);
@@ -65,7 +62,7 @@ static void btn_print_file_verify(lv_event_t * e){
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); lv_obj_t* img = show_gcode_img(selected_file);
if (img != NULL){ if (img != NULL){
lv_obj_set_parent(img, panel); lv_obj_set_parent(img, panel);
@@ -81,7 +78,14 @@ static void btn_print_file_verify(lv_event_t * e){
} }
void files_panel_init(lv_obj_t* panel){ void files_panel_init(lv_obj_t* panel){
clear_img_mem(); Files files = get_current_printer()->get_files();
if (!files.success || files.count <= 0){
lv_obj_t * label = lv_label_create(panel);
lv_label_set_text(label, "Failed to read files.");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
return;
}
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);
@@ -90,25 +94,19 @@ void files_panel_init(lv_obj_t* panel){
lv_obj_set_size(list, CYD_SCREEN_PANEL_WIDTH_PX, CYD_SCREEN_PANEL_HEIGHT_PX); lv_obj_set_size(list, CYD_SCREEN_PANEL_WIDTH_PX, CYD_SCREEN_PANEL_HEIGHT_PX);
lv_obj_align(list, LV_ALIGN_CENTER, 0, 0); lv_obj_align(list, LV_ALIGN_CENTER, 0, 0);
FILESYSTEM_FILE* files = get_files(25); for (int i = 0; i < files.count; i++)
int count = 0; {
while (files != NULL && files->name != NULL && count <= 20){ lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_FILE, files.available_files[i]);
lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_FILE, files->name);
lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0); lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, 0);
if (global_config.full_filenames){ if (global_config.full_filenames){
lv_label_set_long_mode(lv_obj_get_child(btn, 1), LV_LABEL_LONG_WRAP); lv_label_set_long_mode(lv_obj_get_child(btn, 1), LV_LABEL_LONG_WRAP);
} }
lv_obj_add_event_cb(btn, btn_print_file_verify, LV_EVENT_CLICKED, (void*)files); lv_obj_add_event_cb(btn, btn_print_file_verify, LV_EVENT_CLICKED, (void*)(files.available_files[i]));
lv_obj_on_destroy_free_data(btn, files.available_files[i]);
files += 1;
count++;
} }
if (count <= 0){ // Not deallocating filenames in this scope will cause double allocation, oh well.
lv_obj_del(list); // TODO: read label text
lv_obj_t * label = lv_label_create(panel); free(files.available_files);
lv_label_set_text(label, "Failed to read files.");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
}
} }

View File

@@ -11,8 +11,6 @@ static void btn_goto_settings(lv_event_t * e){
} }
void macros_panel_init(lv_obj_t* panel) { void macros_panel_init(lv_obj_t* panel) {
macros_set_current_config(get_current_printer_config());
lv_obj_t * btn = lv_btn_create(panel); lv_obj_t * btn = lv_btn_create(panel);
lv_obj_add_event_cb(btn, btn_goto_settings, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn, btn_goto_settings, LV_EVENT_CLICKED, NULL);
lv_obj_set_size(btn, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); lv_obj_set_size(btn, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
@@ -22,27 +20,23 @@ void macros_panel_init(lv_obj_t* panel) {
lv_label_set_text(label, LV_SYMBOL_SETTINGS " Screen Settings"); lv_label_set_text(label, LV_SYMBOL_SETTINGS " Screen Settings");
lv_obj_center(label); lv_obj_center(label);
MACROSQUERY macros = macros_query();
POWERQUERY power = power_devices_query();
lv_obj_t * root_panel = lv_create_empty_panel(panel); lv_obj_t * root_panel = lv_create_empty_panel(panel);
lv_obj_set_scrollbar_mode(root_panel, LV_SCROLLBAR_MODE_OFF); lv_obj_set_scrollbar_mode(root_panel, LV_SCROLLBAR_MODE_OFF);
lv_obj_set_size(root_panel, CYD_SCREEN_PANEL_WIDTH_PX, CYD_SCREEN_PANEL_HEIGHT_PX - CYD_SCREEN_MIN_BUTTON_HEIGHT_PX - CYD_SCREEN_GAP_PX * 2); lv_obj_set_size(root_panel, CYD_SCREEN_PANEL_WIDTH_PX, CYD_SCREEN_PANEL_HEIGHT_PX - CYD_SCREEN_MIN_BUTTON_HEIGHT_PX - CYD_SCREEN_GAP_PX * 2);
lv_obj_align(root_panel, LV_ALIGN_TOP_MID, 0, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX + CYD_SCREEN_GAP_PX * 2); lv_obj_align(root_panel, LV_ALIGN_TOP_MID, 0, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX + CYD_SCREEN_GAP_PX * 2);
lv_layout_flex_column(root_panel); lv_layout_flex_column(root_panel);
macros_add_power_devices_to_panel(root_panel, power); int power_count = macros_add_power_devices_to_panel(root_panel, get_current_printer());
int macros_count = macros_add_macros_to_panel(root_panel, get_current_printer());
if (macros.count == 0){ if (macros_count <= 0){
label = lv_label_create(root_panel); label = lv_label_create(root_panel);
lv_label_set_text(label, "No macros found.\nMacros with the description\n\"CYD_SCREEN_MACRO\"\nwill show up here."); lv_label_set_text(label, "No macros found.\nMacros with the description\n\"CYD_SCREEN_MACRO\"\nwill show up here.");
if (power.count == 0){ if (power_count <= 0){
lv_layout_flex_column(root_panel, LV_FLEX_ALIGN_CENTER); lv_layout_flex_column(root_panel, LV_FLEX_ALIGN_CENTER);
} }
return; return;
} }
macros_add_macros_to_panel(root_panel, macros);
} }

View File

@@ -5,6 +5,7 @@
#include "../ui_utils.h" #include "../ui_utils.h"
#include <stdio.h> #include <stdio.h>
#include <Esp.h> #include <Esp.h>
#include "../../core/printer_integration.hpp"
static bool last_homing_state = false; static bool last_homing_state = false;
static bool move_edit_mode = false; static bool move_edit_mode = false;
@@ -21,7 +22,7 @@ char z_offset_labels[6 * OFFSET_LABEL_SIZE] = {0};
static void calculate_offsets_from_current_printer() static void calculate_offsets_from_current_printer()
{ {
unsigned short* items[] = {get_current_printer_config()->printer_move_x_steps, get_current_printer_config()->printer_move_y_steps, get_current_printer_config()->printer_move_z_steps}; unsigned short* items[] = {get_current_printer()->printer_config->printer_move_x_steps, get_current_printer()->printer_config->printer_move_y_steps, get_current_printer()->printer_config->printer_move_z_steps};
float* offsets[] = {(float*)x_offsets, (float*)y_offsets, (float*)z_offsets}; float* offsets[] = {(float*)x_offsets, (float*)y_offsets, (float*)z_offsets};
char * labels[] = {(char*)x_offset_labels, (char*)y_offset_labels, (char*)z_offset_labels}; char * labels[] = {(char*)x_offset_labels, (char*)y_offset_labels, (char*)z_offset_labels};
@@ -74,7 +75,7 @@ static void keyboard_cb_edit_move_increment(lv_event_t * e)
return; return;
} }
unsigned short* items[] = {get_current_printer_config()->printer_move_x_steps, get_current_printer_config()->printer_move_y_steps, get_current_printer_config()->printer_move_z_steps}; unsigned short* items[] = {get_current_printer()->printer_config->printer_move_x_steps, get_current_printer()->printer_config->printer_move_y_steps, get_current_printer()->printer_config->printer_move_z_steps};
LOG_F(("Setting increment %d %d %f\n", selected_column, selected_row, increment)) LOG_F(("Setting increment %d %d %f\n", selected_column, selected_row, increment))
items[selected_column][selected_row] = increment * 10; items[selected_column][selected_row] = increment * 10;
write_global_config(); write_global_config();
@@ -109,7 +110,7 @@ static void x_line_button_press(lv_event_t * e) {
} }
float data = *data_pointer; float data = *data_pointer;
move_printer("X", data, true); get_current_printer()->move_printer("X", data, true);
} }
static void y_line_button_press(lv_event_t * e) { static void y_line_button_press(lv_event_t * e) {
@@ -122,7 +123,7 @@ static void y_line_button_press(lv_event_t * e) {
} }
float data = *data_pointer; float data = *data_pointer;
move_printer("Y", data, true); get_current_printer()->move_printer("Y", data, true);
} }
static void z_line_button_press(lv_event_t * e) { static void z_line_button_press(lv_event_t * e) {
@@ -135,27 +136,27 @@ static void z_line_button_press(lv_event_t * e) {
} }
float data = *data_pointer; float data = *data_pointer;
move_printer("Z", data, true); get_current_printer()->move_printer("Z", data, true);
} }
static void x_pos_update(lv_event_t * e){ static void x_pos_update(lv_event_t * e){
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
char x_pos_buff[12]; char x_pos_buff[12];
sprintf(x_pos_buff, "X: %.1f", printer.position[0]); sprintf(x_pos_buff, "X: %.1f", get_current_printer_data()->position[0]);
lv_label_set_text(label, x_pos_buff); lv_label_set_text(label, x_pos_buff);
} }
static void y_pos_update(lv_event_t * e){ static void y_pos_update(lv_event_t * e){
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
char y_pos_buff[12]; char y_pos_buff[12];
sprintf(y_pos_buff, "Y: %.1f", printer.position[1]); sprintf(y_pos_buff, "Y: %.1f", get_current_printer_data()->position[1]);
lv_label_set_text(label, y_pos_buff); lv_label_set_text(label, y_pos_buff);
} }
static void z_pos_update(lv_event_t * e){ static void z_pos_update(lv_event_t * e){
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
char z_pos_buff[12]; char z_pos_buff[12];
sprintf(z_pos_buff, "Z: %.2f", printer.position[2]); sprintf(z_pos_buff, "Z: %.2f", get_current_printer_data()->position[2]);
lv_label_set_text(label, z_pos_buff); lv_label_set_text(label, z_pos_buff);
} }
@@ -163,17 +164,17 @@ lv_event_cb_t button_callbacks[] = {x_line_button_press, y_line_button_press, z_
lv_event_cb_t position_callbacks[] = {x_pos_update, y_pos_update, z_pos_update}; lv_event_cb_t position_callbacks[] = {x_pos_update, y_pos_update, z_pos_update};
static void home_button_click(lv_event_t * e) { static void home_button_click(lv_event_t * e) {
if (printer.state == PRINTER_STATE_PRINTING) if (get_current_printer_data()->state == PrinterState::PrinterStatePrinting)
return; return;
send_gcode(false, "G28"); get_current_printer()->execute_feature(PrinterFeatures::PrinterFeatureHome);
} }
static void disable_steppers_click(lv_event_t * e) { static void disable_steppers_click(lv_event_t * e) {
if (printer.state == PRINTER_STATE_PRINTING) if (get_current_printer_data()->state == PrinterState::PrinterStatePrinting)
return; return;
send_gcode(true, "M18"); get_current_printer()->execute_feature(PrinterFeatures::PrinterFeatureDisableSteppers);
} }
static void switch_to_stat_panel(lv_event_t * e) { static void switch_to_stat_panel(lv_event_t * e) {
@@ -194,7 +195,7 @@ static void line_custom_set(const char * axis, const char *text)
if (pos < 0 || pos > 500) if (pos < 0 || pos > 500)
return; return;
move_printer(axis, pos, false); get_current_printer()->move_printer(axis, pos, false);
} }
static void x_line_custom_callback(lv_event_t * e) { static void x_line_custom_callback(lv_event_t * e) {
@@ -339,28 +340,28 @@ inline void root_panel_steppers_unlocked(lv_obj_t * root_panel){
} }
static void root_panel_state_update(lv_event_t * e){ static void root_panel_state_update(lv_event_t * e){
if (last_homing_state == printer.homed_axis) if (last_homing_state == get_current_printer_data()->homed_axis)
return; return;
lv_obj_t * panel = lv_event_get_target(e); lv_obj_t * panel = lv_event_get_target(e);
last_homing_state = printer.homed_axis; last_homing_state = get_current_printer_data()->homed_axis;
lv_obj_clean(panel); lv_obj_clean(panel);
if (printer.homed_axis) if (get_current_printer_data()->homed_axis)
root_panel_steppers_locked(panel); root_panel_steppers_locked(panel);
else else
root_panel_steppers_unlocked(panel); root_panel_steppers_unlocked(panel);
} }
void move_panel_init(lv_obj_t* panel){ void move_panel_init(lv_obj_t* panel){
if (printer.state == PRINTER_STATE_PRINTING){ if (get_current_printer_data()->state == PrinterState::PrinterStatePrinting){
stats_panel_init(panel); stats_panel_init(panel);
return; return;
} }
calculate_offsets_from_current_printer(); calculate_offsets_from_current_printer();
last_homing_state = !printer.homed_axis; last_homing_state = !get_current_printer_data()->homed_axis;
lv_obj_add_event_cb(panel, root_panel_state_update, LV_EVENT_MSG_RECEIVED, NULL); lv_obj_add_event_cb(panel, root_panel_state_update, LV_EVENT_MSG_RECEIVED, NULL);
lv_msg_subsribe_obj(DATA_PRINTER_DATA, panel, NULL); lv_msg_subsribe_obj(DATA_PRINTER_DATA, panel, NULL);

View File

@@ -1,5 +1,4 @@
#include "lvgl.h" #include "lvgl.h"
#include "../../core/macros_query.h"
#define SIZEOF(arr) (sizeof(arr) / sizeof(*arr)) #define SIZEOF(arr) (sizeof(arr) / sizeof(*arr))

View File

@@ -5,7 +5,6 @@
#include "../../core/lv_setup.h" #include "../../core/lv_setup.h"
#include <stdio.h> #include <stdio.h>
#include "../nav_buttons.h" #include "../nav_buttons.h"
#include "../../core/macros_query.h"
#include "../switch_printer.h" #include "../switch_printer.h"
#include "../macros.h" #include "../macros.h"
@@ -22,41 +21,32 @@ const static lv_point_t line_points[] = { {0, 0}, {(short int)((CYD_SCREEN_PANEL
static void update_printer_name_text(lv_event_t * e) static void update_printer_name_text(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; BasePrinter* printer = get_printer(config_index);
PrinterMinimal * printer = &printer_minimal[index]; lv_label_set_text(label, printer->printer_config->printer_name[0] == 0 ? printer->printer_config->klipper_host : printer->printer_config->printer_name);
lv_label_set_text(label, config->printer_name[0] == 0 ? config->klipper_host : config->printer_name);
} }
static void update_printer_status_text(lv_event_t * e) static void update_printer_status_text(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
PrinterMinimal * printer = &printer_minimal[index];
if (config == get_current_printer_config()) if (config_index == get_current_printer_index())
{ {
lv_label_set_text(label, "In Control"); lv_label_set_text(label, "In Control");
return; return;
} }
if (printer->state == PRINTER_STATE_OFFLINE)
{
lv_label_set_text(label, "Offline");
return;
}
lv_label_set_text(label, printer_status[printer->state]); lv_label_set_text(label, printer_status[printer->state]);
} }
static void update_printer_label_visible_active_printer(lv_event_t * e) static void update_printer_label_visible_active_printer(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
if (config == get_current_printer_config()) if (config_index == get_current_printer_index())
{ {
lv_label_set_text(label, LV_SYMBOL_WIFI); lv_label_set_text(label, LV_SYMBOL_WIFI);
} }
@@ -69,14 +59,15 @@ static void update_printer_label_visible_active_printer(lv_event_t * e)
static void update_printer_percentage_bar(lv_event_t * e) static void update_printer_percentage_bar(lv_event_t * e)
{ {
lv_obj_t * percentage = lv_event_get_target(e); lv_obj_t * percentage = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
PrinterMinimal * printer = &printer_minimal[index];
if (printer->state != PRINTER_STATE_OFFLINE && (printer->state == PRINTER_STATE_PRINTING || printer->state == PRINTER_STATE_PAUSED)){ if (printer->state == PrinterState::PrinterStatePrinting || printer->state == PrinterState::PrinterStatePaused)
{
lv_bar_set_value(percentage, printer->print_progress * 100, LV_ANIM_OFF); lv_bar_set_value(percentage, printer->print_progress * 100, LV_ANIM_OFF);
} }
else { else
{
lv_bar_set_value(percentage, 0, LV_ANIM_OFF); lv_bar_set_value(percentage, 0, LV_ANIM_OFF);
} }
} }
@@ -84,11 +75,10 @@ static void update_printer_percentage_bar(lv_event_t * e)
static void update_printer_percentage_text(lv_event_t * e) static void update_printer_percentage_text(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
PrinterMinimal * printer = &printer_minimal[index];
if (printer->state != PRINTER_STATE_OFFLINE && (printer->state == PRINTER_STATE_PRINTING || printer->state == PRINTER_STATE_PAUSED)) if (printer->state == PrinterState::PrinterStatePrinting || printer->state == PrinterState::PrinterStatePaused)
{ {
char percentage_buffer[12]; char percentage_buffer[12];
sprintf(percentage_buffer, "%.2f%%", printer->print_progress * 100); sprintf(percentage_buffer, "%.2f%%", printer->print_progress * 100);
@@ -103,11 +93,10 @@ static void update_printer_percentage_text(lv_event_t * e)
static void update_printer_control_button_text(lv_event_t * e) static void update_printer_control_button_text(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
PrinterMinimal * printer = &printer_minimal[index];
if (printer->power_devices > 0 && (config == get_current_printer_config() || printer->state == PRINTER_STATE_OFFLINE)) if (printer->power_devices > 0 && (config_index == get_current_printer_index() || printer->state == PrinterState::PrinterStateOffline))
{ {
lv_label_set_text(label, "Power"); lv_label_set_text(label, "Power");
} }
@@ -120,9 +109,10 @@ static void update_printer_control_button_text(lv_event_t * e)
static void btn_set_secondary_button_text(lv_event_t * e) static void btn_set_secondary_button_text(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
if (config == get_current_printer_config()) if (config_index == get_current_printer_index())
{ {
lv_label_set_text(label, LV_SYMBOL_SETTINGS); lv_label_set_text(label, LV_SYMBOL_SETTINGS);
} }
@@ -135,11 +125,10 @@ static void btn_set_secondary_button_text(lv_event_t * e)
static void btn_enable_control(lv_event_t * e) static void btn_enable_control(lv_event_t * e)
{ {
lv_obj_t * btn = lv_event_get_target(e); lv_obj_t * btn = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
PrinterMinimal * printer = &printer_minimal[index];
if ((config == get_current_printer_config() || printer->state == PRINTER_STATE_OFFLINE) && printer->power_devices <= 0) if ((config_index == get_current_printer_index() || printer->state == PrinterState::PrinterStateOffline) && printer->power_devices <= 0)
{ {
// Disable // Disable
lv_obj_add_state(btn, LV_STATE_DISABLED); lv_obj_add_state(btn, LV_STATE_DISABLED);
@@ -152,7 +141,7 @@ static void btn_enable_control(lv_event_t * e)
} }
} }
PRINTER_CONFIG * keyboard_config = NULL; PrinterConfiguration * keyboard_config = NULL;
static void keyboard_callback(lv_event_t * e){ static void keyboard_callback(lv_event_t * e){
lv_obj_t * ta = lv_event_get_target(e); lv_obj_t * ta = lv_event_get_target(e);
@@ -167,15 +156,16 @@ static void keyboard_callback(lv_event_t * e){
static void btn_printer_secondary(lv_event_t * e) static void btn_printer_secondary(lv_event_t * e)
{ {
lv_obj_t * btn = lv_event_get_target(e); lv_obj_t * btn = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
BasePrinter* printer = get_printer(config_index);
if (config == get_current_printer_config())
if (config_index == get_current_printer_index())
{ {
nav_buttons_setup(PANEL_SETTINGS); nav_buttons_setup(PANEL_SETTINGS);
return; return;
} }
config->ip_configured = false; printer->printer_config->ip_configured = false;
write_global_config(); write_global_config();
nav_buttons_setup(PANEL_PRINTER); nav_buttons_setup(PANEL_PRINTER);
@@ -183,33 +173,33 @@ static void btn_printer_secondary(lv_event_t * e)
static void btn_printer_rename(lv_event_t * e) static void btn_printer_rename(lv_event_t * e)
{ {
keyboard_config = (PRINTER_CONFIG*)lv_event_get_user_data(e); keyboard_config = (PrinterConfiguration*)lv_event_get_user_data(e);
lv_create_keyboard_text_entry(keyboard_callback, "Rename Printer", LV_KEYBOARD_MODE_TEXT_LOWER, CYD_SCREEN_WIDTH_PX * 0.75, 24, keyboard_config->printer_name, false); lv_create_keyboard_text_entry(keyboard_callback, "Rename Printer", LV_KEYBOARD_MODE_TEXT_LOWER, CYD_SCREEN_WIDTH_PX * 0.75, 24, keyboard_config->printer_name, false);
} }
static void btn_printer_activate(lv_event_t * e) static void btn_printer_activate(lv_event_t * e)
{ {
lv_obj_t * label = lv_event_get_target(e); lv_obj_t * label = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); int config_index = (int)lv_event_get_user_data(e);
int index = config - global_config.printer_config; PrinterDataMinimal* printer = get_printer_data_minimal(config_index);
PrinterMinimal * printer = &printer_minimal[index]; BasePrinter* printer_full = get_printer(config_index);
if (printer->power_devices > 0 && (config == get_current_printer_config() || printer->state == PRINTER_STATE_OFFLINE)) if (printer->power_devices > 0 && (config_index == get_current_printer_index() || printer->state == PrinterState::PrinterStateOffline))
{ {
macros_draw_power_fullscreen(config); macros_draw_power_fullscreen(printer_full);
return; return;
} }
switch_printer(index); set_current_printer(config_index);
lv_msg_send(DATA_PRINTER_MINIMAL, NULL); lv_msg_send(DATA_PRINTER_MINIMAL, NULL);
} }
static void btn_printer_add(lv_event_t * e) static void btn_printer_add(lv_event_t * e)
{ {
set_printer_config_index(get_printer_config_free_index()); add_printer();
} }
void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root) void create_printer_ui(PrinterConfiguration * config, lv_obj_t * root)
{ {
int index = config - global_config.printer_config; int index = config - global_config.printer_config;
auto width = CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2; auto width = CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2;
@@ -219,16 +209,16 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root)
lv_obj_set_size(data_row_name, width, LV_SIZE_CONTENT); lv_obj_set_size(data_row_name, width, LV_SIZE_CONTENT);
lv_obj_t * label = lv_label_create(data_row_name); lv_obj_t * label = lv_label_create(data_row_name);
lv_obj_add_event_cb(label, update_printer_name_text, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(label, update_printer_name_text, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, (void*)index);
label = lv_label_create(data_row_name); label = lv_label_create(data_row_name);
lv_obj_add_event_cb(label, update_printer_label_visible_active_printer, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(label, update_printer_label_visible_active_printer, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, (void*)index);
label = lv_label_create(data_row_name); label = lv_label_create(data_row_name);
lv_obj_add_event_cb(label, update_printer_status_text, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(label, update_printer_status_text, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, (void*)index);
lv_obj_t * progress_row = lv_create_empty_panel(root); lv_obj_t * progress_row = lv_create_empty_panel(root);
lv_layout_flex_row(progress_row); lv_layout_flex_row(progress_row);
@@ -236,13 +226,13 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root)
lv_obj_t * progress_bar = lv_bar_create(progress_row); lv_obj_t * progress_bar = lv_bar_create(progress_row);
lv_obj_set_flex_grow(progress_bar, 1); lv_obj_set_flex_grow(progress_bar, 1);
lv_obj_add_event_cb(progress_bar, update_printer_percentage_bar, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(progress_bar, update_printer_percentage_bar, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, progress_bar, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, progress_bar, (void*)index);
label = lv_label_create(progress_row); label = lv_label_create(progress_row);
lv_obj_set_style_text_font(label, &CYD_SCREEN_FONT_SMALL, 0); lv_obj_set_style_text_font(label, &CYD_SCREEN_FONT_SMALL, 0);
lv_obj_add_event_cb(label, update_printer_percentage_text, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(label, update_printer_percentage_text, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, (void*)index);
lv_obj_t * button_row = lv_create_empty_panel(root); lv_obj_t * button_row = lv_create_empty_panel(root);
lv_layout_flex_row(button_row); lv_layout_flex_row(button_row);
@@ -250,16 +240,16 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root)
lv_obj_t * btn = lv_btn_create(button_row); lv_obj_t * btn = lv_btn_create(button_row);
lv_obj_set_flex_grow(btn, 1); lv_obj_set_flex_grow(btn, 1);
lv_obj_add_event_cb(btn, btn_printer_secondary, LV_EVENT_CLICKED, config); lv_obj_add_event_cb(btn, btn_printer_secondary, LV_EVENT_CLICKED, (void*)index);
label = lv_label_create(btn); label = lv_label_create(btn);
lv_obj_center(label); lv_obj_center(label);
lv_obj_add_event_cb(label, btn_set_secondary_button_text, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(label, btn_set_secondary_button_text, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, (void*)index);
btn = lv_btn_create(button_row); btn = lv_btn_create(button_row);
lv_obj_set_flex_grow(btn, 2); lv_obj_set_flex_grow(btn, 2);
lv_obj_add_event_cb(btn, btn_printer_rename, LV_EVENT_CLICKED, config); lv_obj_add_event_cb(btn, btn_printer_rename, LV_EVENT_CLICKED, (void*)index);
label = lv_label_create(btn); label = lv_label_create(btn);
lv_label_set_text(label, "Rename"); lv_label_set_text(label, "Rename");
@@ -267,14 +257,14 @@ void create_printer_ui(PRINTER_CONFIG * config, lv_obj_t * root)
btn = lv_btn_create(button_row); btn = lv_btn_create(button_row);
lv_obj_set_flex_grow(btn, 2); lv_obj_set_flex_grow(btn, 2);
lv_obj_add_event_cb(btn, btn_printer_activate, LV_EVENT_CLICKED, config); lv_obj_add_event_cb(btn, btn_printer_activate, LV_EVENT_CLICKED, (void*)index);
lv_obj_add_event_cb(btn, btn_enable_control, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(btn, btn_enable_control, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, btn, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, btn, (void*)index);
label = lv_label_create(btn); label = lv_label_create(btn);
lv_obj_center(label); lv_obj_center(label);
lv_obj_add_event_cb(label, update_printer_control_button_text, LV_EVENT_MSG_RECEIVED, config); lv_obj_add_event_cb(label, update_printer_control_button_text, LV_EVENT_MSG_RECEIVED, (void*)index);
lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, config); lv_msg_subsribe_obj(DATA_PRINTER_MINIMAL, label, (void*)index);
lv_obj_t * line = lv_line_create(root); lv_obj_t * line = lv_line_create(root);
lv_line_set_points(line, line_points, 2); lv_line_set_points(line, line_points, 2);
@@ -293,14 +283,14 @@ void printer_panel_init(lv_obj_t* panel)
lv_obj_set_size(lv_create_empty_panel(inner_panel), 0, 0); lv_obj_set_size(lv_create_empty_panel(inner_panel), 0, 0);
for (int i = 0; i < PRINTER_CONFIG_COUNT; i++){ for (int i = 0; i < PRINTER_CONFIG_COUNT; i++){
PRINTER_CONFIG * config = &global_config.printer_config[i]; PrinterConfiguration * config = &global_config.printer_config[i];
if (config->ip_configured) { if (config->ip_configured) {
create_printer_ui(&global_config.printer_config[i], inner_panel); create_printer_ui(&global_config.printer_config[i], inner_panel);
} }
} }
// Add Printer Button // Add Printer Button
if (get_printer_config_free_index() != -1){ if (get_printer_count() == PRINTER_CONFIG_COUNT){
lv_obj_t * btn = lv_btn_create(inner_panel); lv_obj_t * btn = lv_btn_create(inner_panel);
lv_obj_set_size(btn, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX); lv_obj_set_size(btn, CYD_SCREEN_PANEL_WIDTH_PX - CYD_SCREEN_GAP_PX * 2, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
lv_obj_add_event_cb(btn, btn_printer_add, LV_EVENT_CLICKED, NULL); lv_obj_add_event_cb(btn, btn_printer_add, LV_EVENT_CLICKED, NULL);
@@ -311,6 +301,4 @@ void printer_panel_init(lv_obj_t* panel)
} }
lv_obj_set_size(lv_create_empty_panel(inner_panel), 0, 0); lv_obj_set_size(lv_create_empty_panel(inner_panel), 0, 0);
lv_msg_send(DATA_PRINTER_MINIMAL, NULL);
} }

View File

@@ -17,7 +17,7 @@ void switch_printer(int index)
static void btn_switch_printer(lv_event_t *e){ static void btn_switch_printer(lv_event_t *e){
lv_obj_t *btn = lv_event_get_target(e); lv_obj_t *btn = lv_event_get_target(e);
PRINTER_CONFIG * config = (PRINTER_CONFIG*)lv_event_get_user_data(e); PrinterConfiguration * config = (PrinterConfiguration*)lv_event_get_user_data(e);
int index = config - global_config.printer_config; int index = config - global_config.printer_config;
switch_printer(index); switch_printer(index);
@@ -45,7 +45,7 @@ void switch_printer_init() {
lv_obj_center(label); lv_obj_center(label);
for (int i = 0; i < PRINTER_CONFIG_COUNT; i++){ for (int i = 0; i < PRINTER_CONFIG_COUNT; i++){
PRINTER_CONFIG * config = &global_config.printer_config[i]; PrinterConfiguration * config = &global_config.printer_config[i];
const char* printer_name = (config->printer_name[0] == 0) ? config->klipper_host : config->printer_name; const char* printer_name = (config->printer_name[0] == 0) ? config->klipper_host : config->printer_name;
if (config == get_current_printer_config() && config->ip_configured) if (config == get_current_printer_config() && config->ip_configured)

View File

@@ -40,9 +40,9 @@ void destroy_event_free_data(lv_event_t * e)
free(data); free(data);
} }
void lv_on_destroy_free_data(lv_obj_t * element, void* ptr) void lv_obj_on_destroy_free_data(lv_obj_t * element, const void* ptr)
{ {
lv_obj_add_event_cb(element, destroy_event_free_data, LV_EVENT_DELETE, ptr); lv_obj_add_event_cb(element, destroy_event_free_data, LV_EVENT_DELETE, (void*)ptr);
} }
void lv_create_fullscreen_button_matrix_popup(lv_obj_t * root, lv_event_cb_t title, lv_button_column_t* columns, int column_count){ void lv_create_fullscreen_button_matrix_popup(lv_obj_t * root, lv_event_cb_t title, lv_button_column_t* columns, int column_count){

View File

@@ -38,7 +38,7 @@ void lv_layout_flex_column(lv_obj_t* obj, lv_flex_align_t allign = LV_FLEX_ALIGN
void lv_layout_flex_row(lv_obj_t* obj, lv_flex_align_t allign = LV_FLEX_ALIGN_START, lv_coord_t pad_column = CYD_SCREEN_GAP_PX, lv_coord_t pad_row = CYD_SCREEN_GAP_PX); void lv_layout_flex_row(lv_obj_t* obj, lv_flex_align_t allign = LV_FLEX_ALIGN_START, lv_coord_t pad_column = CYD_SCREEN_GAP_PX, lv_coord_t pad_row = CYD_SCREEN_GAP_PX);
void lv_create_fullscreen_button_matrix_popup(lv_obj_t * root, lv_event_cb_t title, lv_button_column_t* columns, int column_count); void lv_create_fullscreen_button_matrix_popup(lv_obj_t * root, lv_event_cb_t title, lv_button_column_t* columns, int column_count);
void destroy_event_user_data(lv_event_t * e); void destroy_event_user_data(lv_event_t * e);
void lv_on_destroy_free_data(lv_obj_t * element, void* ptr); void lv_obj_on_destroy_free_data(lv_obj_t * element, const void* ptr);
void lv_create_keyboard_text_entry(lv_event_cb_t keyboard_callback, const char* title = NULL, lv_keyboard_mode_t keyboard_mode = LV_KEYBOARD_MODE_NUMBER, lv_coord_t width = CYD_SCREEN_PANEL_WIDTH_PX / 2, uint8_t max_length = 3, const char* fill_text = "", bool contain_in_panel= true); void lv_create_keyboard_text_entry(lv_event_cb_t keyboard_callback, const char* title = NULL, lv_keyboard_mode_t keyboard_mode = LV_KEYBOARD_MODE_NUMBER, lv_coord_t width = CYD_SCREEN_PANEL_WIDTH_PX / 2, uint8_t max_length = 3, const char* fill_text = "", bool contain_in_panel= true);
void lv_create_custom_menu_entry(const char* label_text, lv_obj_t* object, lv_obj_t* root_panel, bool set_height = true, const char * comment = NULL); void lv_create_custom_menu_entry(const char* label_text, lv_obj_t* object, lv_obj_t* root_panel, bool set_height = true, const char * comment = NULL);
void lv_create_custom_menu_button(const char *label_text, lv_obj_t* root_panel, lv_event_cb_t on_click, const char *btn_text, void * user_data = NULL, const char * comment = NULL); void lv_create_custom_menu_button(const char *label_text, lv_obj_t* root_panel, lv_event_cb_t on_click, const char *btn_text, void * user_data = NULL, const char * comment = NULL);