From 96092ef2d3a88de5375cc58e6528fab354cca407 Mon Sep 17 00:00:00 2001 From: Ian Chua Date: Tue, 18 Aug 2026 19:05:17 +0800 Subject: [PATCH] feat: update qidi to use subscription based filament sync mode --- src/slic3r/Utils/CrealityPrintAgent.cpp | 5 +- src/slic3r/Utils/CrealityPrintAgent.hpp | 3 +- src/slic3r/Utils/IPrinterAgent.hpp | 2 +- src/slic3r/Utils/MoonrakerPrinterAgent.cpp | 41 ++++++++- src/slic3r/Utils/MoonrakerPrinterAgent.hpp | 8 +- src/slic3r/Utils/NetworkAgent.cpp | 4 +- src/slic3r/Utils/NetworkAgent.hpp | 2 +- src/slic3r/Utils/QidiPrinterAgent.cpp | 87 ++++++++++++------- src/slic3r/Utils/QidiPrinterAgent.hpp | 5 +- src/slic3r/Utils/SnapmakerPrinterAgent.cpp | 5 +- src/slic3r/Utils/SnapmakerPrinterAgent.hpp | 2 +- .../PrinterAgentPluginCapability.hpp | 62 +++++++------ ...PrinterAgentPluginCapabilityTrampoline.hpp | 2 +- 13 files changed, 151 insertions(+), 77 deletions(-) diff --git a/src/slic3r/Utils/CrealityPrintAgent.cpp b/src/slic3r/Utils/CrealityPrintAgent.cpp index 55d99ff07b..b235d9f4e0 100644 --- a/src/slic3r/Utils/CrealityPrintAgent.cpp +++ b/src/slic3r/Utils/CrealityPrintAgent.cpp @@ -233,8 +233,11 @@ bool CrealityPrintAgent::parse_cfs_response(const std::string& response, return true; } -bool CrealityPrintAgent::fetch_filament_info(std::string dev_id) +bool CrealityPrintAgent::fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode) { + if (sync_mode != get_filament_sync_mode()) + return false; + if (device_info.dev_ip.empty()) { BOOST_LOG_TRIVIAL(warning) << "CrealityPrintAgent::fetch_filament_info: no device IP, falling back to base agent"; diff --git a/src/slic3r/Utils/CrealityPrintAgent.hpp b/src/slic3r/Utils/CrealityPrintAgent.hpp index e1096db536..3b925c5d21 100644 --- a/src/slic3r/Utils/CrealityPrintAgent.hpp +++ b/src/slic3r/Utils/CrealityPrintAgent.hpp @@ -1,6 +1,7 @@ #ifndef __CREALITY_PRINT_AGENT_HPP__ #define __CREALITY_PRINT_AGENT_HPP__ +#include "IPrinterAgent.hpp" #include "MoonrakerPrinterAgent.hpp" #include @@ -41,7 +42,7 @@ public: static AgentInfo get_agent_info_static(); AgentInfo get_agent_info() override { return get_agent_info_static(); } - bool fetch_filament_info(std::string dev_id) override; + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) override; // Parse the boxsInfo JSON returned by CrealityPrint::query_boxes_info() into // a flat list of loaded slots, plus the count of CFS boxes the printer reports. diff --git a/src/slic3r/Utils/IPrinterAgent.hpp b/src/slic3r/Utils/IPrinterAgent.hpp index df52ac0da8..5853b0e398 100644 --- a/src/slic3r/Utils/IPrinterAgent.hpp +++ b/src/slic3r/Utils/IPrinterAgent.hpp @@ -304,7 +304,7 @@ public: * Should only be called when get_filament_sync_mode() returns FilamentSyncMode::pull. * Populates the MachineObject's DevFilaSystem with fetched filament data. */ - virtual bool fetch_filament_info(std::string dev_id) { return false; } + virtual bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) { return false; } }; } // namespace Slic3r diff --git a/src/slic3r/Utils/MoonrakerPrinterAgent.cpp b/src/slic3r/Utils/MoonrakerPrinterAgent.cpp index dea4a4b8f6..c89a34ed19 100644 --- a/src/slic3r/Utils/MoonrakerPrinterAgent.cpp +++ b/src/slic3r/Utils/MoonrakerPrinterAgent.cpp @@ -1,5 +1,6 @@ #include "MoonrakerPrinterAgent.hpp" #include "Http.hpp" +#include "IPrinterAgent.hpp" #include "libslic3r/Preset.hpp" #include "libslic3r/PresetBundle.hpp" #include "slic3r/GUI/GUI_App.hpp" @@ -117,6 +118,13 @@ MoonrakerPrinterAgent::MoonrakerPrinterAgent(std::string log_dir) : m_cloud_agen MoonrakerPrinterAgent::~MoonrakerPrinterAgent() { + // Detached fetch_filament_info() threads (see QidiPrinterAgent::fetch_filament_info) + // hold a raw `this` with no other lifetime protection — wait for them to finish before + // any part of this object is torn down, so they never touch freed memory. + while (filament_fetch_in_flight.load() > 0) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + { std::lock_guard lock(connect_mutex); device_info = MoonrakerDeviceInfo{}; @@ -570,13 +578,28 @@ int MoonrakerPrinterAgent::set_queue_on_main_fn(QueueOnMainFn fn) void MoonrakerPrinterAgent::build_ams_payload(int ams_count, int max_lane_index, const std::vector& trays) { + // This may be called from a background thread (e.g. run_status_stream's read loop, + // for subscription-mode agents) as well as from the GUI thread (Sidebar's pull-mode + // path). Everything below touches MachineObject/DevFilaSystem, which the GUI thread + // reads without locking — so the actual mutation must run on the main thread. Snapshot + // queue_on_main_fn and the two device_info fields we need up front, then defer the rest, + // mirroring dispatch_message's existing queue_fn ? queue_fn(x) : x() idiom. + QueueOnMainFn queue_fn; + { + std::lock_guard lock(state_mutex); + queue_fn = queue_on_main_fn; + } + std::string dev_id = device_info.dev_id; + std::string model_id = device_info.model_id; + + auto apply = [dev_id, model_id, ams_count, max_lane_index, trays]() { // Look up MachineObject via DeviceManager auto* dev_manager = GUI::wxGetApp().getDeviceManager(); if (!dev_manager) { return; } - MachineObject* obj = dev_manager->get_my_machine(device_info.dev_id); + MachineObject* obj = dev_manager->get_my_machine(dev_id); if (!obj) { return; } @@ -661,7 +684,7 @@ void MoonrakerPrinterAgent::build_ams_payload(int ams_count, int max_lane_index, // Set printer_type so update_sync_status() can match it against the preset's printer type. // Without this, the comparison fails and all sync badges are cleared. - obj->printer_type = device_info.model_id; + obj->printer_type = model_id; // Set push counters so is_info_ready() returns true for pull-mode agents. if (obj->m_push_count == 0) { @@ -684,10 +707,20 @@ void MoonrakerPrinterAgent::build_ams_payload(int ams_count, int max_lane_index, ota_info.sw_ver = "1.0.0"; // Placeholder version for Moonraker printers obj->module_vers.emplace("ota", ota_info); } + }; + + if (queue_fn) { + queue_fn(apply); + } else { + apply(); + } } -bool MoonrakerPrinterAgent::fetch_filament_info(std::string dev_id) +bool MoonrakerPrinterAgent::fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode) { + if (sync_mode != get_filament_sync_mode()) + return false; + std::vector trays; int max_lane_index = 0; @@ -2068,6 +2101,8 @@ void MoonrakerPrinterAgent::run_status_stream(std::string dev_id, std::string ba std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count()); const auto last_ms = ws_last_emit_ms.load(); if (last_ms == 0 || now_ms - last_ms >= 10000) { + fetch_filament_info(dev_id, FilamentSyncMode::subscription); + nlohmann::json message; { std::lock_guard lock(payload_mutex); diff --git a/src/slic3r/Utils/MoonrakerPrinterAgent.hpp b/src/slic3r/Utils/MoonrakerPrinterAgent.hpp index 86513b8931..29ebefdc4b 100644 --- a/src/slic3r/Utils/MoonrakerPrinterAgent.hpp +++ b/src/slic3r/Utils/MoonrakerPrinterAgent.hpp @@ -76,7 +76,7 @@ public: // Pull-mode agent (on-demand filament sync) FilamentSyncMode get_filament_sync_mode() const override { return FilamentSyncMode::pull; } - bool fetch_filament_info(std::string dev_id) override; + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) override; protected: struct MoonrakerDeviceInfo @@ -114,6 +114,12 @@ protected: // State access for derived classes mutable std::recursive_mutex state_mutex; + // Counts detached fetch_filament_info() background threads currently touching `this` + // (see QidiPrinterAgent::fetch_filament_info). Those threads hold a raw `this` with no + // other lifetime protection, so the destructor waits for this to reach 0 before any part + // of the object is torn down — see ~MoonrakerPrinterAgent(). + std::atomic filament_fetch_in_flight{0}; + // Helpers bool is_numeric(const std::string& value); std::string normalize_base_url(std::string host, const std::string& port); diff --git a/src/slic3r/Utils/NetworkAgent.cpp b/src/slic3r/Utils/NetworkAgent.cpp index 34566c0dfa..4687b77772 100644 --- a/src/slic3r/Utils/NetworkAgent.cpp +++ b/src/slic3r/Utils/NetworkAgent.cpp @@ -949,10 +949,10 @@ FilamentSyncMode NetworkAgent::get_filament_sync_mode() const return FilamentSyncMode::none; } -bool NetworkAgent::fetch_filament_info(std::string dev_id) +bool NetworkAgent::fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode) { if (m_printer_agent) { - return m_printer_agent->fetch_filament_info(dev_id); + return m_printer_agent->fetch_filament_info(dev_id, sync_mode); } return false; } diff --git a/src/slic3r/Utils/NetworkAgent.hpp b/src/slic3r/Utils/NetworkAgent.hpp index 53660edc72..48ae7268f1 100644 --- a/src/slic3r/Utils/NetworkAgent.hpp +++ b/src/slic3r/Utils/NetworkAgent.hpp @@ -168,7 +168,7 @@ public: int start_local_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn); int start_sdcard_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn); FilamentSyncMode get_filament_sync_mode() const; - bool fetch_filament_info(std::string dev_id); + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull); int request_bind_ticket(std::string* ticket); int get_hms_snapshot(std::string dev_id, std::string file_name, std::function callback); diff --git a/src/slic3r/Utils/QidiPrinterAgent.cpp b/src/slic3r/Utils/QidiPrinterAgent.cpp index 6da7d3e2ec..bcc3b7723d 100644 --- a/src/slic3r/Utils/QidiPrinterAgent.cpp +++ b/src/slic3r/Utils/QidiPrinterAgent.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace Slic3r { @@ -25,6 +26,15 @@ bool has_visible_base_preset(const PresetCollection& filaments, const std::strin return false; } +// RAII decrement for MoonrakerPrinterAgent::filament_fetch_in_flight — guarantees the +// counter drops back down on every exit path (early return or fall-through) inside the +// detached fetch thread below, so ~MoonrakerPrinterAgent()'s wait loop can't stall forever. +struct InFlightGuard +{ + std::atomic& counter; + ~InFlightGuard() { counter.fetch_sub(1, std::memory_order_relaxed); } +}; + } // anonymous namespace const std::string QidiPrinterAgent_VERSION = "0.0.1"; @@ -38,39 +48,56 @@ AgentInfo QidiPrinterAgent::get_agent_info_static() return AgentInfo{"qidi", "Qidi", QidiPrinterAgent_VERSION, "Qidi printer agent"}; } -bool QidiPrinterAgent::fetch_filament_info(std::string dev_id) +bool QidiPrinterAgent::fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode) { - std::string error; - - // 1. Fetch device info and infer series_id - std::string series_id; - { - MoonrakerDeviceInfo info; - if (fetch_device_info(device_info.base_url, device_info.api_key, info, error)) { - series_id = infer_series_id(info.model_id, info.dev_name); - } - } - if (series_id.empty()) { - // Fall back to the configured Orca model if Moonraker doesn't expose a usable identifier. - series_id = infer_series_id(device_info.model_id, device_info.model_name); - } - - // 2. Fetch filament dictionary - QidiFilamentDict dict; - if (!fetch_filament_dict(device_info.base_url, device_info.api_key, dict, error)) { - BOOST_LOG_TRIVIAL(warning) << "QidiPrinterAgent::fetch_filament_info: Failed to fetch filament dict: " << error; - } - - // 3. Fetch slot info and build AmsTrayData directly - std::vector trays; - int box_count = 0; - if (!fetch_slot_info(device_info.base_url, device_info.api_key, dict, series_id, trays, box_count, error)) { - BOOST_LOG_TRIVIAL(warning) << "QidiPrinterAgent::fetch_filament_info: Failed to fetch slot info: " << error; + if (sync_mode != get_filament_sync_mode()) return false; - } - // 4. Build the AMS payload - build_ams_payload(box_count, box_count * 4 - 1, trays); + // Snapshot only what the fetch needs, rather than reading device_info live from the + // background thread below — device_info can be concurrently rewritten by a reconnect + // on another thread while this fetch is still in flight. + std::string base_url = device_info.base_url; + std::string api_key = device_info.api_key; + std::string model_id = device_info.model_id; + std::string model_name = device_info.model_name; + + filament_fetch_in_flight.fetch_add(1, std::memory_order_relaxed); + + std::thread([this, base_url, api_key, model_id, model_name]() { + InFlightGuard guard{filament_fetch_in_flight}; + + std::string error; + + // 1. Fetch device info and infer series_id + std::string series_id; + { + MoonrakerDeviceInfo info; + if (fetch_device_info(base_url, api_key, info, error)) { + series_id = infer_series_id(info.model_id, info.dev_name); + } + } + if (series_id.empty()) { + // Fall back to the configured Orca model if Moonraker doesn't expose a usable identifier. + series_id = infer_series_id(model_id, model_name); + } + + // 2. Fetch filament dictionary + QidiFilamentDict dict; + if (!fetch_filament_dict(base_url, api_key, dict, error)) { + BOOST_LOG_TRIVIAL(warning) << "QidiPrinterAgent::fetch_filament_info: Failed to fetch filament dict: " << error; + } + + // 3. Fetch slot info and build AmsTrayData directly + std::vector trays; + int box_count = 0; + if (!fetch_slot_info(base_url, api_key, dict, series_id, trays, box_count, error)) { + BOOST_LOG_TRIVIAL(warning) << "QidiPrinterAgent::fetch_filament_info: Failed to fetch slot info: " << error; + return; + } + + // 4. Build the AMS payload + build_ams_payload(box_count, box_count * 4 - 1, trays); + }).detach(); return true; } diff --git a/src/slic3r/Utils/QidiPrinterAgent.hpp b/src/slic3r/Utils/QidiPrinterAgent.hpp index 4064c9e7b5..05697fc66d 100644 --- a/src/slic3r/Utils/QidiPrinterAgent.hpp +++ b/src/slic3r/Utils/QidiPrinterAgent.hpp @@ -1,6 +1,7 @@ #ifndef __QIDI_PRINTER_AGENT_HPP__ #define __QIDI_PRINTER_AGENT_HPP__ +#include "IPrinterAgent.hpp" #include "MoonrakerPrinterAgent.hpp" #include "nlohmann/json_fwd.hpp" @@ -20,7 +21,7 @@ public: AgentInfo get_agent_info() override { return get_agent_info_static(); } // Override filament sync (Qidi-specific implementation) - bool fetch_filament_info(std::string dev_id) override; + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) override; static bool parse_slot_response(const std::string& response_body, nlohmann::json& status, @@ -33,6 +34,8 @@ public: int start_local_print_with_record(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override; int start_sdcard_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override; + FilamentSyncMode get_filament_sync_mode() const override { return FilamentSyncMode::subscription; } + private: // Push enable_box + value_t SAVE_VARIABLEs before a print starts. // Returns false if any command fails (caller should abort the print). diff --git a/src/slic3r/Utils/SnapmakerPrinterAgent.cpp b/src/slic3r/Utils/SnapmakerPrinterAgent.cpp index dee1d5ba50..f516f30e77 100644 --- a/src/slic3r/Utils/SnapmakerPrinterAgent.cpp +++ b/src/slic3r/Utils/SnapmakerPrinterAgent.cpp @@ -169,8 +169,11 @@ std::string SnapmakerPrinterAgent::combine_filament_type(const std::string& type return base; } -bool SnapmakerPrinterAgent::fetch_filament_info(std::string dev_id) +bool SnapmakerPrinterAgent::fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode) { + if (sync_mode != get_filament_sync_mode()) + return false; + std::string url = join_url(device_info.base_url, "/printer/objects/query?print_task_config&filament_detect"); std::string response_body; diff --git a/src/slic3r/Utils/SnapmakerPrinterAgent.hpp b/src/slic3r/Utils/SnapmakerPrinterAgent.hpp index 2d0bbee640..04b67cd573 100644 --- a/src/slic3r/Utils/SnapmakerPrinterAgent.hpp +++ b/src/slic3r/Utils/SnapmakerPrinterAgent.hpp @@ -15,7 +15,7 @@ public: static AgentInfo get_agent_info_static(); AgentInfo get_agent_info() override { return get_agent_info_static(); } - bool fetch_filament_info(std::string dev_id) override; + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) override; int command_start_camera(std::string dev_id) override; protected: diff --git a/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapability.hpp b/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapability.hpp index 33ad211b9c..39ca7c2dfd 100644 --- a/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapability.hpp +++ b/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapability.hpp @@ -30,54 +30,50 @@ public: AgentInfo get_agent_info() override = 0; - int connect_printer( - std::string dev_id, std::string dev_ip, std::string username, std::string password, bool use_ssl) override = 0; - int send_message(std::string dev_id, std::string json_str, int qos, int flag) override = 0; - int send_message_to_printer(std::string dev_id, std::string json_str, int qos, int flag) override = 0; - bool start_discovery(bool start, bool sending) override = 0; - int bind_detect(std::string dev_ip, std::string sec_link, detectResult& detect) override = 0; - std::string get_user_selected_machine() override = 0; - int set_user_selected_machine(std::string dev_id) override = 0; - int start_send_gcode_to_sdcard(PrintParams params, - OnUpdateStatusFn update_fn, - WasCancelledFn cancel_fn, - OnWaitFn wait_fn) override = 0; - int start_local_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override = 0; - FilamentSyncMode get_filament_sync_mode() const override = 0; - bool fetch_filament_info(std::string dev_id) override = 0; + int connect_printer(std::string dev_id, std::string dev_ip, std::string username, std::string password, bool use_ssl) override = 0; + int send_message(std::string dev_id, std::string json_str, int qos, int flag) override = 0; + int send_message_to_printer(std::string dev_id, std::string json_str, int qos, int flag) override = 0; + bool start_discovery(bool start, bool sending) override = 0; + int bind_detect(std::string dev_ip, std::string sec_link, detectResult& detect) override = 0; + std::string get_user_selected_machine() override = 0; + int set_user_selected_machine(std::string dev_id) override = 0; + int start_send_gcode_to_sdcard(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override = 0; + int start_local_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override = 0; + FilamentSyncMode get_filament_sync_mode() const override = 0; + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) override = 0; - int check_cert() override = 0; - void install_device_cert(std::string dev_id, bool lan_only) override = 0; - int ping_bind(std::string ping_code) override = 0; + int check_cert() override = 0; + void install_device_cert(std::string dev_id, bool lan_only) override = 0; + int ping_bind(std::string ping_code) override = 0; int bind(std::string dev_ip, std::string dev_id, std::string dev_model, std::string sec_link, std::string timezone, bool improved, - OnUpdateStatusFn update_fn) override = 0; - int unbind(std::string dev_id) override = 0; + OnUpdateStatusFn update_fn) override = 0; + int unbind(std::string dev_id) override = 0; // request_bind_ticket has a std::string* out-param that cannot round-trip through a // pybind11 override directly; the trampoline wraps it (the Python plugin returns a // (result, ticket) tuple), so it stays pure here like the rest. - int request_bind_ticket(std::string* ticket) override = 0; + int request_bind_ticket(std::string* ticket) override = 0; int get_hms_snapshot(std::string dev_id, std::string file_name, std::function callback) override = 0; - int set_server_callback(OnServerErrFn fn) override = 0; - int start_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override = 0; + int set_server_callback(OnServerErrFn fn) override = 0; + int start_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn) override = 0; int start_local_print_with_record(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, - OnWaitFn wait_fn) override = 0; - int start_sdcard_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override = 0; + OnWaitFn wait_fn) override = 0; + int start_sdcard_print(PrintParams params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn) override = 0; - int set_on_ssdp_msg_fn(OnMsgArrivedFn fn) override = 0; - int set_on_printer_connected_fn(OnPrinterConnectedFn fn) override = 0; - int set_on_subscribe_failure_fn(GetSubscribeFailureFn fn) override = 0; - int set_on_message_fn(OnMessageFn fn) override = 0; - int set_on_user_message_fn(OnMessageFn fn) override = 0; - int set_on_local_connect_fn(OnLocalConnectedFn fn) override = 0; - int set_on_local_message_fn(OnMessageFn fn) override = 0; - int set_queue_on_main_fn(QueueOnMainFn fn) override = 0; + int set_on_ssdp_msg_fn(OnMsgArrivedFn fn) override = 0; + int set_on_printer_connected_fn(OnPrinterConnectedFn fn) override = 0; + int set_on_subscribe_failure_fn(GetSubscribeFailureFn fn) override = 0; + int set_on_message_fn(OnMessageFn fn) override = 0; + int set_on_user_message_fn(OnMessageFn fn) override = 0; + int set_on_local_connect_fn(OnLocalConnectedFn fn) override = 0; + int set_on_local_message_fn(OnMessageFn fn) override = 0; + int set_queue_on_main_fn(QueueOnMainFn fn) override = 0; }; } // namespace Slic3r diff --git a/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp b/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp index 226ea04650..83c2d95e8e 100644 --- a/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp +++ b/src/slic3r/plugin/pluginTypes/printerAgent/PrinterAgentPluginCapabilityTrampoline.hpp @@ -96,7 +96,7 @@ public: get_filament_sync_mode); } - bool fetch_filament_info(std::string dev_id) override + bool fetch_filament_info(std::string dev_id, FilamentSyncMode sync_mode = FilamentSyncMode::pull) override { ORCA_PY_OVERRIDE_AUDITED( ::Slic3r::PluginAuditManager::AuditMode::Loading, [] {}, PYBIND11_OVERRIDE_PURE, bool, PrinterAgentPluginCapability, fetch_filament_info, dev_id);