Skip to content

Commit

Permalink
Start print in bambu integration
Browse files Browse the repository at this point in the history
  • Loading branch information
suchmememanyskill committed Dec 21, 2024
1 parent 093dd5e commit 161c10a
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 20 deletions.
6 changes: 1 addition & 5 deletions CYD-Klipper/src/core/bambu/bambu_printer_integration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ bool BambuPrinter::publish_mqtt_command(const char* command)
char auth[48] = {0};
sprintf(auth, "device/%s/request", printer_config->printer_auth);

LOG_F(("Publishing MQTT Command: %s", command));
return client.publish(auth, command);
}

Expand Down Expand Up @@ -298,11 +299,6 @@ Files BambuPrinter::get_files()
return files;
}

bool BambuPrinter::start_file(const char* filename)
{
return false;
}

Thumbnail BambuPrinter::get_32_32_png_image_thumbnail(const char* gcode_filename)
{
Thumbnail thumbnail = {0};
Expand Down
22 changes: 12 additions & 10 deletions CYD-Klipper/src/core/bambu/bambu_printer_integration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,6 @@ class BambuPrinter : public BasePrinter
unsigned int ignore_error = 0;
unsigned long print_start;

union {
struct {
bool chamber_light_available : 1;
bool chamber_light_on : 1;
bool work_light_available : 1;
bool work_light_on : 1;
};
unsigned char bambu_misc;
};

protected:
void parse_state(JsonDocument& in);
void init_ui_panels();
Expand All @@ -39,6 +29,17 @@ class BambuPrinter : public BasePrinter
float chamber_fan_speed;
BambuSpeedProfile speed_profile = BambuSpeedProfileNormal;

union {
struct {
bool chamber_light_available : 1;
bool chamber_light_on : 1;
bool work_light_available : 1;
bool work_light_on : 1;
bool has_ams : 1;
};
unsigned char bambu_misc;
};

BambuPrinter(int index) : BasePrinter(index)
{
supported_features = PrinterFeatureHome
Expand All @@ -63,6 +64,7 @@ class BambuPrinter : public BasePrinter
print_start = millis();

init_ui_panels();
no_confirm_print_file = true;
}

bool move_printer(const char* axis, float amount, bool relative);
Expand Down
115 changes: 115 additions & 0 deletions CYD-Klipper/src/core/bambu/bambu_printer_panels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
const char* speed_profiles[] = { "Silent (50%)", "Normal (100%)", "Sport (124%)", "Ludicrous (166%)" };
const BambuSpeedProfile speed_profile_values[] = { BambuSpeedProfileSilent, BambuSpeedProfileNormal, BambuSpeedProfileSport, BambuSpeedProfileLudicrous };
const char* COMMAND_SET_PRINT_SPEED = "{\"print\":{\"command\":\"print_speed\",\"param\":\"%d\"}}";
const char* COMMAND_START_PRINT_3MF = "{\"print\":{\"command\":\"project_file\",\"param\":\"Metadata/plate_1.gcode\",\"project_id\":\"0\",\"profile_id\":\"0\",\"task_id\":\"0\",\"subtask_id\":\"0\",\"subtask_name\":\"CYD-Klipper Print Job\",\"url\":\"file:///sdcard/%s\",\"timelapse\":%s,\"bed_type\":\"auto\",\"bed_leveling\":%s,\"flow_cali\":%s,\"vibration_cali\":%s,\"layer_inspect\":%s,\"ams_mapping\":[],\"use_ams\":%s}}";

enum FanIndex
{
Expand Down Expand Up @@ -139,4 +140,118 @@ void BambuPrinter::init_ui_panels()
{
custom_menus_count = 4;
custom_menus = bambu_ui_panels;
}

struct
{
const char* bambu_current_file;

union
{
struct
{
bool bambu_option_use_ams : 1;
bool bambu_option_timelapse : 1;
bool bambu_option_bed_leveling : 1;
bool bambu_option_flow_calibration : 1;
bool bambu_option_vibration_compensation : 1;
bool bambu_option_layer_inspect : 1;
};
unsigned char bambu_options_raw;
};
} __internal_bambu_file_state = {};

#define SET_BOOL_STATE(bool_name, func_name) static void func_name (lv_event_t * e) { auto state = lv_obj_get_state(lv_event_get_target(e)); bool_name = (state & LV_STATE_CHECKED == LV_STATE_CHECKED); }

SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_use_ams, set_bambu_option_use_ams)
SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_timelapse, set_bambu_option_timelapse)
SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_bed_leveling, set_bambu_option_bed_leveling)
SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_flow_calibration, set_bambu_option_flow_calibration)
SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_vibration_compensation, set_bambu_option_vibration_compensation)
SET_BOOL_STATE(__internal_bambu_file_state.bambu_option_layer_inspect, set_bambu_option_layer_inspect)

#define BOOLEAN_TO_STRING(b) b ? "true" : "false"

static void print_file_start(lv_event_t * e)
{
BambuPrinter* printer = (BambuPrinter*)get_current_printer();
char buff[713];

if (snprintf(buff, 713, COMMAND_START_PRINT_3MF,
__internal_bambu_file_state.bambu_current_file,
BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_timelapse),
BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_bed_leveling),
BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_flow_calibration),
BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_vibration_compensation),
BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_layer_inspect),
BOOLEAN_TO_STRING(__internal_bambu_file_state.bambu_option_use_ams)) >= 712)
{
LOG_LN("Failed to prepare message to start print");
return;
}

printer->publish_mqtt_command(buff);
}

bool BambuPrinter::start_file(const char* filename){
if (get_current_printer_data()->state != PrinterState::PrinterStateIdle)
{
return false;
}

__internal_bambu_file_state.bambu_current_file = filename;

lv_obj_t * panel = lv_obj_create(lv_scr_act());
lv_obj_set_style_pad_all(panel, CYD_SCREEN_GAP_PX * 2, 0);
lv_layout_flex_column(panel);
lv_obj_set_size(panel, CYD_SCREEN_WIDTH_PX - CYD_SCREEN_GAP_PX * 3, CYD_SCREEN_HEIGHT_PX - CYD_SCREEN_GAP_PX * 2);
lv_obj_align(panel, LV_ALIGN_CENTER, 0, 0);

lv_obj_t * label_print_file = lv_label_create(panel);
lv_obj_set_width(label_print_file, LV_PCT(100));
lv_label_set_long_mode(label_print_file, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_label_set_text_fmt(label_print_file, "Settings for %s", __internal_bambu_file_state.bambu_current_file);

__internal_bambu_file_state.bambu_option_use_ams = ((BambuPrinter*)get_current_printer())->has_ams;
__internal_bambu_file_state.bambu_option_timelapse = false;
__internal_bambu_file_state.bambu_option_bed_leveling = true;
__internal_bambu_file_state.bambu_option_flow_calibration = true;
__internal_bambu_file_state.bambu_option_vibration_compensation = true;
__internal_bambu_file_state.bambu_option_layer_inspect = true;

if (__internal_bambu_file_state.bambu_option_use_ams)
{
lv_create_custom_menu_switch("Use AMS", panel, set_bambu_option_use_ams, __internal_bambu_file_state.bambu_option_use_ams);
}

lv_create_custom_menu_switch("Timelapse", panel, set_bambu_option_timelapse, __internal_bambu_file_state.bambu_option_timelapse);
lv_create_custom_menu_switch("Bed Leveling", panel, set_bambu_option_bed_leveling, __internal_bambu_file_state.bambu_option_bed_leveling);
lv_create_custom_menu_switch("Flow Calibration", panel, set_bambu_option_flow_calibration, __internal_bambu_file_state.bambu_option_flow_calibration);
lv_create_custom_menu_switch("Vibration Compensation", panel, set_bambu_option_vibration_compensation, __internal_bambu_file_state.bambu_option_vibration_compensation);
lv_create_custom_menu_switch("Inspect First Layer", panel, set_bambu_option_layer_inspect, __internal_bambu_file_state.bambu_option_layer_inspect);

lv_obj_t* buttons_panel = lv_create_empty_panel(panel);
lv_layout_flex_row(buttons_panel);
lv_obj_set_size(buttons_panel, LV_PCT(100), CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);

lv_obj_t* btn = lv_btn_create(buttons_panel);
lv_obj_set_flex_grow(btn, 1);
lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel);

lv_obj_t* label = lv_label_create(btn);
lv_label_set_text(label, LV_SYMBOL_CLOSE " Cancel");
lv_obj_center(label);

btn = lv_btn_create(buttons_panel);
lv_obj_set_flex_grow(btn, 1);
lv_obj_set_height(btn, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
lv_obj_add_event_cb(btn, print_file_start, LV_EVENT_CLICKED, panel);
lv_obj_add_event_cb(btn, destroy_event_user_data, LV_EVENT_CLICKED, panel);

label = lv_label_create(btn);
lv_label_set_text(label, LV_SYMBOL_OK " Print");
lv_obj_center(label);

return true;
}
9 changes: 9 additions & 0 deletions CYD-Klipper/src/core/bambu/bambu_printer_parsers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,15 @@ void BambuPrinter::parse_state(JsonDocument& in)
chamber_fan_speed = convert_fan_speed(print["big_fan2_speed"]);
}

if (print.containsKey("ams_exist_bits"))
{
const char* ams_exists = print["ams_exist_bits"];
if (!strcmp(ams_exists, "0"))
{
has_ams = true;
}
}

printer_data.extrude_mult = 1;
}

Expand Down
1 change: 1 addition & 0 deletions CYD-Klipper/src/core/printer_integration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ class BasePrinter

public:
short popup_message_timeout_s = 10;
bool no_confirm_print_file = false;

PrinterConfiguration* printer_config{};
PrinterFeatures supported_features{};
Expand Down
19 changes: 15 additions & 4 deletions CYD-Klipper/src/ui/panels/files_panel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,23 @@

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_del(panel);

current_printer_start_file(selected_file);
}

static void btn_print_file_verify(lv_event_t * e){
static void btn_print_file_verify_instant(lv_event_t * e)
{
lv_obj_t * btn = lv_event_get_target(e);
selected_file = (char*)lv_event_get_user_data(e);
current_printer_start_file(selected_file);
}

static void btn_print_file_verify(lv_event_t * e)
{
if (get_current_printer_data()->state != PrinterState::PrinterStateIdle){
return;
}
Expand Down Expand Up @@ -111,10 +120,12 @@ void files_panel_init(lv_obj_t* panel){
lv_obj_t * btn = lv_list_add_btn(list, LV_SYMBOL_FILE, files.available_files[i]);
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_obj_add_event_cb(btn, btn_print_file_verify, LV_EVENT_CLICKED, (void*)(files.available_files[i]));

lv_obj_add_event_cb(btn, (get_current_printer()->no_confirm_print_file) ? btn_print_file_verify_instant : btn_print_file_verify, LV_EVENT_CLICKED, (void*)(files.available_files[i]));
lv_obj_on_destroy_free_data(btn, files.available_files[i]);
}

Expand Down
4 changes: 3 additions & 1 deletion CYD-Klipper/src/ui/ui_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,10 @@ void lv_create_custom_menu_entry(const char* label_text, lv_obj_t* object, lv_ob

lv_obj_set_parent(object, panel);

if (set_height)
if (set_height)
{
lv_obj_set_height(object, CYD_SCREEN_MIN_BUTTON_HEIGHT_PX);
}

if (comment != NULL)
{
Expand Down

0 comments on commit 161c10a

Please sign in to comment.