Skip to content

Commit

Permalink
Implement klipper custom ui panels
Browse files Browse the repository at this point in the history
  • Loading branch information
suchmememanyskill committed Oct 24, 2024
1 parent 2078a15 commit 6a9023e
Show file tree
Hide file tree
Showing 6 changed files with 204 additions and 11 deletions.
13 changes: 9 additions & 4 deletions CYD-Klipper/src/core/klipper/klipper_printer_integration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ bool KlipperPrinter::send_gcode(const char *gcode, bool wait)
bool KlipperPrinter::move_printer(const char* axis, float amount, bool relative)
{
if (!printer_data.homed_axis || printer_data.state == PrinterStatePrinting)
return true;
return false;

char gcode[64];
const char* extra = (amount > 0) ? "+" : "";
Expand All @@ -86,6 +86,7 @@ bool KlipperPrinter::move_printer(const char* axis, float amount, bool relative)
send_gcode(gcode);

lock_absolute_relative_mode_swap = 2;
return true;
}

bool KlipperPrinter::execute_feature(PrinterFeatures feature)
Expand Down Expand Up @@ -155,8 +156,9 @@ bool KlipperPrinter::execute_feature(PrinterFeatures feature)
return send_gcode("M104 S0\nM140 S0");
default:
LOG_F(("Unsupported printer feature %d", feature));
return false;
}

return false;
}

bool KlipperPrinter::connect()
Expand Down Expand Up @@ -453,6 +455,8 @@ PrinterDataMinimal KlipperPrinter::fetch_min()
data.state = PrinterStateOffline;
data.power_devices = get_power_devices_count();
}

return data;
}

void KlipperPrinter::disconnect()
Expand Down Expand Up @@ -686,8 +690,9 @@ bool KlipperPrinter::start_file(const char *filename)
HTTPClient client;
configure_http_client(client, "/printer/print/start?filename=" + urlEncode(filename), false, 1000);

int httpCode = client.POST("");
LOG_F(("Print start: HTTP %d\n", httpCode))
int http_code = client.POST("");
LOG_F(("Print start: HTTP %d\n", http_code))
return http_code == 200;
}

bool KlipperPrinter::set_target_temperature(PrinterTemperatureDevice device, float temperature)
Expand Down
8 changes: 6 additions & 2 deletions CYD-Klipper/src/core/klipper/klipper_printer_integration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@

#include "../printer_integration.hpp"

class KlipperPrinter : BasePrinter
class KlipperPrinter : public BasePrinter
{
private:
unsigned char lock_absolute_relative_mode_swap{};
unsigned char klipper_request_consecutive_fail_count{};
unsigned int slicer_estimated_print_time_s{};
unsigned int last_slicer_time_query{};
float gcode_offset[3]{};

public:
float gcode_offset[3]{};

KlipperPrinter(int index) : BasePrinter(index)
{
supported_features = PrinterFeatureRestart
Expand All @@ -28,6 +29,8 @@ class KlipperPrinter : BasePrinter

supported_temperature_devices = PrinterTemperatureDeviceBed
| PrinterTemperatureDeviceNozzle1;

init_ui_panels();
}

bool move_printer(const char* axis, float amount, bool relative);
Expand All @@ -49,4 +52,5 @@ class KlipperPrinter : BasePrinter
bool send_gcode(const char* gcode, bool wait = true);
int get_slicer_time_estimate_s();
void configure_http_client(HTTPClient &client, String url_part, bool stream, int timeout);
void init_ui_panels();
};
185 changes: 185 additions & 0 deletions CYD-Klipper/src/core/klipper/klipper_printer_panels.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#include "klipper_printer_integration.hpp"
#include "lvgl.h"
#include "../../ui/ui_utils.h"
#include <stdio.h>


static void set_fan_speed_text(lv_event_t * e) {
lv_obj_t * label = lv_event_get_target(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char data[16];
sprintf(data, "Fan: %.0f%%", printer->printer_data.fan_speed * 100);
lv_label_set_text(label, data);
}

static void set_fan_speed(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[16];
sprintf(gcode, "M106 S%d", speed);
printer->send_gcode(gcode);
}

const char* fan_speeds[] = { "0%", "15%", "25%", "35%" };
const int fan_speeds_values[] = { 0, 38, 64, 90 };

const char* fan_speeds_2[] = { "50%", "75%", "100%"};
const int fan_speeds_values_2[] = { 128, 192, 255 };

lv_button_column_t fan_speed_columns[] = {
{ set_fan_speed, fan_speeds, (const void**)fan_speeds_values, 4},
{ set_fan_speed, fan_speeds_2, (const void**)fan_speeds_values_2, 3}
};

static void set_zoffset_text(lv_event_t * e) {
lv_obj_t * label = lv_event_get_target(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char data[24];
sprintf(data, "Z Offset: %.03f", printer->gcode_offset[2]);
lv_label_set_text(label, data);
}

static void set_zoffset_text_ex(lv_event_t * e) {
lv_obj_t * label = lv_event_get_target(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char data[32];
sprintf(data, "Z Offset: %.03f, Z: %.03f", printer->gcode_offset[2], printer->printer_data.position[2]);
lv_label_set_text(label, data);
}

static void set_zoffset(lv_event_t * e){
char* offset = (char*)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref

char gcode[48];
sprintf(gcode, "SET_GCODE_OFFSET Z_ADJUST=%s MOVE=1", offset);
printer->send_gcode(gcode);
}

static void set_z(lv_event_t * e){
void* ptr = lv_event_get_user_data(e);
float value = *(float *)(&ptr);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref

if (value < 0) {
printer->send_gcode("SET_GCODE_OFFSET Z=0 MOVE=1");
return;
}

printer->move_printer("Z", value, false);
}

const char* zoffsets[] = { "-0.01", "-0.025", "-0.05", "-0.2" };
const char* zoffsets_2[] = { "+0.01", "+0.025", "+0.05", "+0.2" };
const char* zabs[] = { "Z=0", "Z=0.1", "Z=1", "Clear" };
const float zabsvalues[] = { 0, 0.1f, 1.0f, -1.0f };

lv_button_column_t zoffset_columns[] = {
{ set_zoffset, zoffsets, (const void**)zoffsets, 4},
{ set_zoffset, zoffsets_2, (const void**)zoffsets_2, 4},
{ set_z, zabs, (const void**)zabsvalues, 4}
};

static void set_speed_mult_text(lv_event_t * e){
lv_obj_t * label = lv_event_get_target(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char data[16];
sprintf(data, "Speed: %.0f%%", printer->printer_data.speed_mult * 100);
lv_label_set_text(label, data);
}

static void set_speed_mult(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[16];
sprintf(gcode, "M220 S%d", speed);
printer->send_gcode(gcode);
}

static void set_speed_mult_offset(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
float result = printer->printer_data.speed_mult * 100 + speed;
printer->printer_data.speed_mult = result / 100;
char gcode[16];
sprintf(gcode, "M220 S%.0f", result);
printer->send_gcode(gcode);
}

const char* speed_presets[] = { "50%", "100%", "150%", "200%" };
const int speed_presets_values[] = { 50, 100, 150, 200 };
const char* speed_presets_minus[] = { "-1%", "-5%", "-10%", "-25%" };
const int speed_presets_minus_values[] = { -1, -5, -10, -25 };
const char* speed_presets_plus[] = { "+1%", "+5%", "+10%", "+25%" };
const int speed_presets_plus_values[] = { 1, 5, 10, 25 };

lv_button_column_t speed_mult_columns[] = {
{ set_speed_mult, speed_presets, (const void**)speed_presets_values, 4},
{ set_speed_mult_offset, speed_presets_minus, (const void**)speed_presets_minus_values, 4},
{ set_speed_mult_offset, speed_presets_plus, (const void**)speed_presets_plus_values, 4}
};

static void set_extrude_mult_text(lv_event_t * e){
lv_obj_t * label = lv_event_get_target(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char data[16];
sprintf(data, "Flow: %.0f%%", printer->printer_data.extrude_mult * 100);
lv_label_set_text(label, data);
}

static void set_extrude_mult(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
char gcode[16];
sprintf(gcode, "M221 S%d", speed);
printer->send_gcode(gcode);
}

static void set_extrude_mult_offset(lv_event_t * e){
int speed = (int)lv_event_get_user_data(e);
KlipperPrinter* printer = (KlipperPrinter*)get_current_printer(); // TODO: pass by ref
float result = printer->printer_data.extrude_mult * 100 + speed;
printer->printer_data.extrude_mult = result / 100;
char gcode[16];
sprintf(gcode, "M221 S%.0f", result);
printer->send_gcode(gcode);
}

const char* extrude_presets[] = { "95%", "100%", "105%", "110%" };
const int extrude_presets_values[] = { 95, 100, 105, 110 };
const char* extrude_offset[] = { "+5%", "+1%", "-1%", "-5%" };
const int extrude_offset_values[] = { 5, 1, -1, -5 };

lv_button_column_t extrude_mult_columns[] = {
{ set_extrude_mult, extrude_presets, (const void**)extrude_presets_values, 4},
{ set_extrude_mult_offset, extrude_offset, (const void**)extrude_offset_values, 4}
};

static void open_fan_speed_panel(lv_event_t * e){
lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_fan_speed_text, fan_speed_columns, 2);
}

static void open_zoffset_panel(lv_event_t * e){
lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_zoffset_text_ex, zoffset_columns, (get_current_printer()->printer_data.state == PrinterStateIdle) ? 3 : 2);
}

static void open_speed_mult_panel(lv_event_t * e){
lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_speed_mult_text, speed_mult_columns, 3);
}

static void open_extrude_mult_panel(lv_event_t * e){
lv_create_fullscreen_button_matrix_popup(lv_scr_act(), set_extrude_mult_text, extrude_mult_columns, 2);
}

static PrinterUiPanel klipper_ui_panels[4] {
{ .set_label = set_fan_speed_text, .open_panel = open_fan_speed_panel },
{ .set_label = set_zoffset_text, .open_panel = open_zoffset_panel },
{ .set_label = set_speed_mult_text, .open_panel = open_speed_mult_panel },
{ .set_label = set_extrude_mult_text, .open_panel = open_extrude_mult_panel }
};

void KlipperPrinter::init_ui_panels()
{
custom_menus_count = 4;
custom_menus = klipper_ui_panels;
}
5 changes: 2 additions & 3 deletions CYD-Klipper/src/core/printer_integration.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#pragma once
#include "lvgl.h"
#include "../conf/global_config.h"

#define BIT(x) 1 << x
Expand Down Expand Up @@ -125,8 +124,8 @@ typedef struct {
} Files;

typedef struct {
lv_event_cb_t set_label;
lv_event_cb_t open_panel;
void* set_label; // type lv_event_cb_t
void* open_panel; // type lv_event_cb_t
} PrinterUiPanel;

class BasePrinter
Expand Down
2 changes: 1 addition & 1 deletion CYD-Klipper/src/ui/ui_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ void destroy_event_free_data(lv_event_t * e)
free(data);
}

void on_destroy_free_data(lv_obj_t * element, void* ptr)
void lv_on_destroy_free_data(lv_obj_t * element, void* ptr)
{
lv_obj_add_event_cb(element, destroy_event_free_data, LV_EVENT_DELETE, ptr);
}
Expand Down
2 changes: 1 addition & 1 deletion CYD-Klipper/src/ui/ui_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_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 on_destroy_free_data(lv_obj_t * element, void* ptr);
void lv_on_destroy_free_data(lv_obj_t * element, 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_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);
Expand Down

0 comments on commit 6a9023e

Please sign in to comment.