From 4a787f6ff85e14b0250b485662b69b169ed4acab Mon Sep 17 00:00:00 2001 From: "xin.zhang" Date: Fri, 1 Aug 2025 17:34:35 +0800 Subject: [PATCH] ENH: clean codes about device JIRA: [STUDIO-13609] Change-Id: I591de7033360b9570600006cfbce2148a8d031d5 (cherry picked from commit e9c774be8f4c89b8dafa14ef56913612fb68bd0c) --- localization/i18n/list.txt | 43 + src/libslic3r/CMakeLists.txt | 1 + src/libslic3r/CommonDefs.hpp | 21 + src/libslic3r/PrintConfig.hpp | 11 +- src/slic3r/CMakeLists.txt | 1 + src/slic3r/GUI/AMSMaterialsSetting.cpp | 67 +- src/slic3r/GUI/AmsMappingPopup.cpp | 117 +- src/slic3r/GUI/AmsMappingPopup.hpp | 2 +- src/slic3r/GUI/AmsWidgets.cpp | 17 +- src/slic3r/GUI/BindDialog.cpp | 19 +- src/slic3r/GUI/CaliHistoryDialog.cpp | 11 +- src/slic3r/GUI/Calibration.cpp | 16 +- src/slic3r/GUI/CalibrationPanel.cpp | 14 +- src/slic3r/GUI/CalibrationWizard.cpp | 16 +- src/slic3r/GUI/CalibrationWizardCaliPage.cpp | 12 +- src/slic3r/GUI/CalibrationWizardPage.cpp | 4 +- .../GUI/CalibrationWizardPresetPage.cpp | 98 +- src/slic3r/GUI/CameraPopup.cpp | 5 +- src/slic3r/GUI/ConnectPrinter.cpp | 6 +- src/slic3r/GUI/DeviceCore/CMakeLists.txt | 52 + src/slic3r/GUI/DeviceCore/DevBed.cpp | 25 + src/slic3r/GUI/DeviceCore/DevBed.h | 30 + src/slic3r/GUI/DeviceCore/DevConfig.cpp | 54 + src/slic3r/GUI/DeviceCore/DevConfig.h | 77 + src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp | 167 + src/slic3r/GUI/DeviceCore/DevConfigUtil.h | 174 + src/slic3r/GUI/DeviceCore/DevCtrl.cpp | 26 + src/slic3r/GUI/DeviceCore/DevCtrl.h | 26 + src/slic3r/GUI/DeviceCore/DevDefs.h | 99 + .../GUI/DeviceCore/DevExtruderSystem.cpp | 287 ++ src/slic3r/GUI/DeviceCore/DevExtruderSystem.h | 189 + .../GUI/DeviceCore/DevExtruderSystemCtrl.cpp | 22 + src/slic3r/GUI/DeviceCore/DevFan.cpp | 219 + src/slic3r/GUI/DeviceCore/DevFan.h | 150 + .../GUI/DeviceCore/DevFilaAmsSetting.cpp | 13 + src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h | 35 + .../GUI/DeviceCore/DevFilaBlackList.cpp | 259 ++ src/slic3r/GUI/DeviceCore/DevFilaBlackList.h | 17 + src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp | 719 ++++ src/slic3r/GUI/DeviceCore/DevFilaSystem.h | 190 + src/slic3r/GUI/DeviceCore/DevFirmware.cpp | 2 + src/slic3r/GUI/DeviceCore/DevFirmware.h | 57 + src/slic3r/GUI/DeviceCore/DevHMS.cpp | 67 + src/slic3r/GUI/DeviceCore/DevHMS.h | 84 + src/slic3r/GUI/DeviceCore/DevInfo.cpp | 7 + src/slic3r/GUI/DeviceCore/DevInfo.h | 37 + src/slic3r/GUI/DeviceCore/DevLamp.cpp | 18 + src/slic3r/GUI/DeviceCore/DevLamp.h | 42 + src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp | 64 + src/slic3r/GUI/DeviceCore/DevManager.cpp | 876 ++++ src/slic3r/GUI/DeviceCore/DevManager.h | 125 + src/slic3r/GUI/DeviceCore/DevMapping.cpp | 364 ++ src/slic3r/GUI/DeviceCore/DevMapping.h | 33 + src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp | 129 + src/slic3r/GUI/DeviceCore/DevNozzleSystem.h | 50 + src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp | 280 ++ src/slic3r/GUI/DeviceCore/DevPrintOptions.h | 91 + .../GUI/DeviceCore/DevPrintTaskInfo.cpp | 1 + src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h | 24 + src/slic3r/GUI/DeviceCore/DevStorage.cpp | 34 + src/slic3r/GUI/DeviceCore/DevStorage.h | 36 + src/slic3r/GUI/DeviceCore/DevUtil.cpp | 114 + src/slic3r/GUI/DeviceCore/DevUtil.h | 71 + src/slic3r/GUI/DeviceManager.cpp | 3734 ++--------------- src/slic3r/GUI/DeviceManager.hpp | 1067 +---- .../GUI/DeviceTab/uiAmsHumidityPopup.cpp | 2 +- src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h | 4 +- .../GUI/DeviceTab/uiDeviceUpdateVersion.cpp | 2 +- .../GUI/DeviceTab/uiDeviceUpdateVersion.h | 2 +- src/slic3r/GUI/GUI_App.cpp | 56 +- src/slic3r/GUI/HMS.cpp | 17 +- src/slic3r/GUI/HMSPanel.cpp | 14 +- src/slic3r/GUI/HMSPanel.hpp | 10 +- src/slic3r/GUI/Jobs/BindJob.cpp | 2 + src/slic3r/GUI/Jobs/PrintJob.cpp | 5 +- src/slic3r/GUI/MainFrame.cpp | 2 + src/slic3r/GUI/MediaFilePanel.cpp | 9 +- src/slic3r/GUI/MediaFilePanel.h | 2 +- src/slic3r/GUI/MediaPlayCtrl.cpp | 6 +- src/slic3r/GUI/Monitor.cpp | 22 +- src/slic3r/GUI/MultiMachine.cpp | 8 +- src/slic3r/GUI/MultiMachineManagerPage.cpp | 12 +- src/slic3r/GUI/MultiMachinePage.cpp | 12 +- src/slic3r/GUI/MultiSendMachineModel.cpp | 2 +- src/slic3r/GUI/MultiTaskManagerPage.cpp | 8 +- src/slic3r/GUI/Plater.cpp | 121 +- src/slic3r/GUI/Plater.hpp | 2 +- src/slic3r/GUI/Preferences.cpp | 13 - src/slic3r/GUI/PresetComboBoxes.cpp | 4 +- src/slic3r/GUI/PrintOptionsDialog.cpp | 32 +- src/slic3r/GUI/Printer/PrinterFileSystem.cpp | 4 + src/slic3r/GUI/ReleaseNote.cpp | 25 +- src/slic3r/GUI/ReleaseNote.hpp | 2 +- src/slic3r/GUI/SelectMachine.cpp | 248 +- src/slic3r/GUI/SelectMachine.hpp | 16 +- src/slic3r/GUI/SelectMachinePop.cpp | 32 +- src/slic3r/GUI/SendMultiMachinePage.cpp | 17 +- src/slic3r/GUI/SendToPrinter.cpp | 37 +- src/slic3r/GUI/StatusPanel.cpp | 667 ++- src/slic3r/GUI/StatusPanel.hpp | 8 +- src/slic3r/GUI/SyncAmsInfoDialog.cpp | 104 +- src/slic3r/GUI/SyncAmsInfoDialog.hpp | 6 +- src/slic3r/GUI/Tab.cpp | 8 +- src/slic3r/GUI/TaskManager.hpp | 3 + src/slic3r/GUI/UpgradePanel.cpp | 102 +- src/slic3r/GUI/UpgradePanel.hpp | 4 +- src/slic3r/GUI/UserManager.cpp | 2 + src/slic3r/GUI/Widgets/AMSControl.cpp | 199 +- src/slic3r/GUI/Widgets/AMSControl.hpp | 6 +- src/slic3r/GUI/Widgets/AMSItem.cpp | 72 +- src/slic3r/GUI/Widgets/AMSItem.hpp | 8 +- src/slic3r/GUI/Widgets/FanControl.cpp | 26 +- src/slic3r/GUI/Widgets/FanControl.hpp | 2 +- src/slic3r/GUI/Widgets/SideTools.cpp | 2 +- src/slic3r/Utils/CalibUtils.cpp | 43 +- 115 files changed, 7238 insertions(+), 5492 deletions(-) create mode 100644 src/libslic3r/CommonDefs.hpp create mode 100644 src/slic3r/GUI/DeviceCore/CMakeLists.txt create mode 100644 src/slic3r/GUI/DeviceCore/DevBed.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevBed.h create mode 100644 src/slic3r/GUI/DeviceCore/DevConfig.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevConfig.h create mode 100644 src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevConfigUtil.h create mode 100644 src/slic3r/GUI/DeviceCore/DevCtrl.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevCtrl.h create mode 100644 src/slic3r/GUI/DeviceCore/DevDefs.h create mode 100644 src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevExtruderSystem.h create mode 100644 src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevFan.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevFan.h create mode 100644 src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h create mode 100644 src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevFilaBlackList.h create mode 100644 src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevFilaSystem.h create mode 100644 src/slic3r/GUI/DeviceCore/DevFirmware.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevFirmware.h create mode 100644 src/slic3r/GUI/DeviceCore/DevHMS.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevHMS.h create mode 100644 src/slic3r/GUI/DeviceCore/DevInfo.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevInfo.h create mode 100644 src/slic3r/GUI/DeviceCore/DevLamp.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevLamp.h create mode 100644 src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevManager.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevManager.h create mode 100644 src/slic3r/GUI/DeviceCore/DevMapping.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevMapping.h create mode 100644 src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevNozzleSystem.h create mode 100644 src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevPrintOptions.h create mode 100644 src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h create mode 100644 src/slic3r/GUI/DeviceCore/DevStorage.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevStorage.h create mode 100644 src/slic3r/GUI/DeviceCore/DevUtil.cpp create mode 100644 src/slic3r/GUI/DeviceCore/DevUtil.h diff --git a/localization/i18n/list.txt b/localization/i18n/list.txt index 78fd545f2b..0236e89a41 100644 --- a/localization/i18n/list.txt +++ b/localization/i18n/list.txt @@ -1,4 +1,47 @@ src/libslic3r/PresetBundle.cpp +src/slic3r/GUI/DeviceCore/DevBed.cpp +src/slic3r/GUI/DeviceCore/DevBed.h +src/slic3r/GUI/DeviceCore/DevConfig.h +src/slic3r/GUI/DeviceCore/DevConfig.cpp +src/slic3r/GUI/DeviceCore/DevConfigUtil.h +src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp +src/slic3r/GUI/DeviceCore/DevCtrl.h +src/slic3r/GUI/DeviceCore/DevCtrl.cpp +src/slic3r/GUI/DeviceCore/DevDefs.h +src/slic3r/GUI/DeviceCore/DevExtruderSystem.h +src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp +src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp +src/slic3r/GUI/DeviceCore/DevFan.cpp +src/slic3r/GUI/DeviceCore/DevFan.h +src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h +src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp +src/slic3r/GUI/DeviceCore/DevFilaBlackList.h +src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp +src/slic3r/GUI/DeviceCore/DevFilaSystem.h +src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp +src/slic3r/GUI/DeviceCore/DevFirmware.h +src/slic3r/GUI/DeviceCore/DevFirmware.cpp +src/slic3r/GUI/DeviceCore/DevPrintOptions.h +src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp +src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h +src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp +src/slic3r/GUI/DeviceCore/DevHMS.h +src/slic3r/GUI/DeviceCore/DevHMS.cpp +src/slic3r/GUI/DeviceCore/DevStorage.h +src/slic3r/GUI/DeviceCore/DevStorage.cpp +src/slic3r/GUI/DeviceCore/DevInfo.h +src/slic3r/GUI/DeviceCore/DevInfo.cpp +src/slic3r/GUI/DeviceCore/DevLamp.h +src/slic3r/GUI/DeviceCore/DevLamp.cpp +src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp +src/slic3r/GUI/DeviceCore/DevManager.h +src/slic3r/GUI/DeviceCore/DevManager.cpp +src/slic3r/GUI/DeviceCore/DevMapping.h +src/slic3r/GUI/DeviceCore/DevMapping.cpp +src/slic3r/GUI/DeviceCore/DevNozzleSystem.h +src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp +src/slic3r/GUI/DeviceCore/DevUtil.h +src/slic3r/GUI/DeviceCore/DevUtil.cpp src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 0397322108..23914b59e1 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -95,6 +95,7 @@ set(lisbslic3r_sources ClipperZUtils.hpp Color.cpp Color.hpp + CommonDefs.hpp Config.cpp Config.hpp CustomGCode.cpp diff --git a/src/libslic3r/CommonDefs.hpp b/src/libslic3r/CommonDefs.hpp new file mode 100644 index 0000000000..0c909bcc9e --- /dev/null +++ b/src/libslic3r/CommonDefs.hpp @@ -0,0 +1,21 @@ +#pragma once + +// CommonDefs.hpp +// --------------- +// This header provides common definitions and enumerations shared across multiple libraries. +// It is intended for use in projects that require consistent type definitions, such as nozzle types. +// The contents of this file are designed to be reusable and maintainable for cross-library integration. + +namespace Slic3r +{ + // BBS + enum NozzleType + { + ntUndefine = 0, + ntHardenedSteel, + ntStainlessSteel, + ntTungstenCarbide, + ntBrass, + ntCount + }; +} \ No newline at end of file diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index e6217accda..9939193924 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -17,6 +17,7 @@ #define slic3r_PrintConfig_hpp_ #include "libslic3r.h" +#include "CommonDefs.hpp" #include "Config.hpp" #include "Polygon.hpp" #include @@ -309,16 +310,6 @@ enum LayerSeq { flsCustomize }; -// BBS -enum NozzleType { - ntUndefine = 0, - ntHardenedSteel, - ntStainlessSteel, - ntTungstenCarbide, - ntBrass, - ntCount -}; - static std::unordered_mapNozzleTypeEumnToStr = { {NozzleType::ntUndefine, "undefine"}, {NozzleType::ntHardenedSteel, "hardened_steel"}, diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 9c7cdfbec3..f398c88ed2 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -614,6 +614,7 @@ set(SLIC3R_GUI_SOURCES Utils/WxFontUtils.hpp ) +add_subdirectory(GUI/DeviceCore) add_subdirectory(GUI/DeviceTab) if (WIN32) diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index 2186372320..8805cff557 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -11,6 +11,15 @@ #include "../Utils/ColorSpaceConvert.hpp" #include "EncodedFilament.hpp" + +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevExtruderSystem.h" +#include "DeviceCore/DevFilaBlackList.h" +#include "DeviceCore/DevFilaSystem.h" + +#define FILAMENT_MAX_TEMP 300 +#define FILAMENT_MIN_TEMP 120 + namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SELECTED_COLOR, wxCommandEvent); @@ -534,7 +543,7 @@ void AMSMaterialsSetting::on_select_reset(wxCommandEvent& event) { select_index_info.tray_id = tray_id; select_index_info.ams_id = ams_id; select_index_info.slot_id = slot_id; - select_index_info.nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + select_index_info.nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); select_index_info.cali_idx = -1; select_index_info.filament_id = selected_ams_id; CalibUtils::select_PA_calib_result(select_index_info); @@ -571,7 +580,7 @@ void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event) if (vendor && (vendor->values.size() > 0)) { std::string vendor_name = vendor->values[0]; - DeviceManager::check_filaments_in_blacklist(obj->printer_type, vendor_name, filamnt_type, it->filament_id, ams_id, slot_id, it->name, in_blacklist, action, info); + DevFilaBlacklist::check_filaments_in_blacklist(obj->printer_type, vendor_name, filamnt_type, it->filament_id, ams_id, slot_id, it->name, in_blacklist, action, info); } if (in_blacklist) { @@ -659,7 +668,7 @@ void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event) select_index_info.tray_id = vt_tray; select_index_info.ams_id = ams_id; select_index_info.slot_id = 0; - select_index_info.nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + select_index_info.nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); auto cali_select_id = m_comboBox_cali_result->GetSelection(); if (m_pa_profile_items.size() > 0 && cali_select_id >= 0) { @@ -700,7 +709,7 @@ void AMSMaterialsSetting::on_select_ok(wxCommandEvent &event) select_index_info.tray_id = cali_tray_id; select_index_info.ams_id = ams_id; select_index_info.slot_id = slot_id; - select_index_info.nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + select_index_info.nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); auto cali_select_id = m_comboBox_cali_result->GetSelection(); if (m_pa_profile_items.size() > 0 && cali_select_id > 0) { @@ -784,14 +793,7 @@ void AMSMaterialsSetting::on_clr_picker(wxMouseEvent &event) } std::vector ams_colors; - for (auto ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ++ams_it) { - for (auto tray_id = ams_it->second->trayList.begin(); tray_id != ams_it->second->trayList.end(); ++tray_id) { - std::vector::iterator iter = find(ams_colors.begin(), ams_colors.end(), AmsTray::decode_color(tray_id->second->color)); - if (iter == ams_colors.end()) { - ams_colors.push_back(AmsTray::decode_color(tray_id->second->color)); - } - } - } + obj->GetFilaSystem()->CollectAmsColors(ams_colors); wxPoint img_pos = m_clr_picker->ClientToScreen(wxPoint(0, 0)); wxPoint popup_pos(img_pos.x - m_color_picker_popup.GetSize().x - FromDIP(95), img_pos.y - FromDIP(65)); @@ -882,9 +884,9 @@ void AMSMaterialsSetting::Popup(wxString filament, wxString sn, wxString temp_mi std::set filament_id_set; PresetBundle * preset_bundle = wxGetApp().preset_bundle; std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << obj->m_extder_data.extders[0].current_nozzle_diameter; + stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); std::string nozzle_diameter_str = stream.str(); - std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(MachineObject::get_preset_printer_model_name(obj->printer_type), nozzle_diameter_str); + std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(DevPrinterConfigUtil::get_printer_display_name(obj->printer_type), nozzle_diameter_str); if (preset_bundle) { BOOST_LOG_TRIVIAL(trace) << "system_preset_bundle filament number=" << preset_bundle->filaments.size(); @@ -1121,9 +1123,9 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) if (preset_bundle) { std::ostringstream stream; if (obj) - stream << std::fixed << std::setprecision(1) << obj->m_extder_data.extders[0].current_nozzle_diameter; + stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); std::string nozzle_diameter_str = stream.str(); - std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(MachineObject::get_preset_printer_model_name(obj->printer_type), + std::set printer_names = preset_bundle->get_printer_names_by_printer_type_and_nozzle(DevPrinterConfigUtil::get_printer_display_name(obj->printer_type), nozzle_diameter_str); for (auto it = preset_bundle->filaments.begin(); it != preset_bundle->filaments.end(); it++) { if (!m_comboBox_filament->GetValue().IsEmpty()) { @@ -1242,13 +1244,13 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) }; int extruder_id = obj->get_extruder_id_by_ams_id(std::to_string(ams_id)); - if (obj->is_nozzle_flow_type_supported() && (obj->get_nozzle_flow_type(extruder_id) == NozzleFlowType::NONE_FLOWTYPE)) + if (obj->is_nozzle_flow_type_supported() && (obj->GetExtderSystem()->GetNozzleFlowType(extruder_id) == NozzleFlowType::NONE_FLOWTYPE)) { MessageDialog dlg(nullptr, _L("The nozzle flow is not set. Please set the nozzle flow rate before editing the filament.\n'Device -> Print parts'"), _L("Warning"), wxICON_WARNING | wxOK); dlg.ShowModal(); } - NozzleFlowType nozzle_flow_type = obj->get_nozzle_flow_type(extruder_id); + NozzleFlowType nozzle_flow_type = obj->GetExtderSystem()->GetNozzleFlowType(extruder_id); NozzleVolumeType nozzle_volume_type = NozzleVolumeType::nvtStandard; if (nozzle_flow_type != NozzleFlowType::NONE_FLOWTYPE) { @@ -1260,7 +1262,7 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) PACalibResult default_item; default_item.cali_idx = -1; default_item.filament_id = ams_filament_id; - if (obj->is_support_auto_flow_calibration) { + if (obj->GetConfig()->SupportCalibrationPA_FlowAuto()) { default_item.k_value = -1; default_item.n_coef = -1; } @@ -1302,21 +1304,20 @@ void AMSMaterialsSetting::on_select_filament(wxCommandEvent &evt) } else { if (from_printer && (*from_printer == 1)) { - if (this->obj->amsList.find(std::to_string(ams_id)) != this->obj->amsList.end()) { - Ams* selected_ams = this->obj->amsList[std::to_string(ams_id)]; - if (!selected_ams) - return; - AmsTray* selected_tray = selected_ams->trayList[std::to_string(slot_id)]; - if (!selected_tray) - return; - cali_select_idx = CalibUtils::get_selected_calib_idx(m_pa_profile_items, selected_tray->cali_idx); - if (cali_select_idx < 0) { - BOOST_LOG_TRIVIAL(info) << "extrusion_cali_status_error: cannot find pa profile, ams_id = " << ams_id - << ", slot_id = " << slot_id << ", cali_idx = " << selected_tray->cali_idx; - cali_select_idx = 0; - } - m_comboBox_cali_result->SetSelection(cali_select_idx); + DevAmsTray* selected_tray = this->obj->GetFilaSystem()->GetAmsTray(std::to_string(ams_id), std::to_string(slot_id)); + if (!selected_tray) + { + return; } + + cali_select_idx = CalibUtils::get_selected_calib_idx(m_pa_profile_items, selected_tray->cali_idx); + if (cali_select_idx < 0) + { + BOOST_LOG_TRIVIAL(info) << "extrusion_cali_status_error: cannot find pa profile, ams_id = " << ams_id + << ", slot_id = " << slot_id << ", cali_idx = " << selected_tray->cali_idx; + cali_select_idx = 0; + } + m_comboBox_cali_result->SetSelection(cali_select_idx); } else { int index = get_cali_index(m_comboBox_filament->GetLabel().ToStdString()); diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp index 5bc288c352..f11bffb00a 100644 --- a/src/slic3r/GUI/AmsMappingPopup.cpp +++ b/src/slic3r/GUI/AmsMappingPopup.cpp @@ -23,6 +23,8 @@ #include "BitmapCache.hpp" #include "BindDialog.hpp" +#include "DeviceCore/DevFilaSystem.h" + namespace Slic3r { namespace GUI { #define MATERIAL_ITEM_SIZE wxSize(FromDIP(65), FromDIP(50)) #define MATERIAL_REC_WHEEL_SIZE wxSize(FromDIP(17), FromDIP(16)) @@ -1038,12 +1040,12 @@ void AmsMapingPopup::update_items_check_state(const std::vector& a void AmsMapingPopup::update(MachineObject* obj, const std::vector& ams_mapping_result) { - //BOOST_LOG_TRIVIAL(info) << "ams_mapping nozzle count " << obj->m_extder_data.nozzle.size(); - BOOST_LOG_TRIVIAL(info) << "ams_mapping total count " << obj->amsList.size(); + //BOOST_LOG_TRIVIAL(info) << "ams_mapping nozzle count " << obj->get_extder_system()->nozzle.size(); + BOOST_LOG_TRIVIAL(info) << "ams_mapping total count " << obj->GetFilaSystem()->GetAmsCount(); if (!obj) {return;} - m_ams_remain_detect_flag = obj->ams_calibrate_remain_flag; + m_ams_remain_detect_flag = obj->GetFilaSystem()->IsDetectRemainEnabled(); for (auto& ams_container : m_amsmapping_container_list) { ams_container->Destroy(); @@ -1068,7 +1070,7 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& //const auto& full_config = wxGetApp().preset_bundle->full_config(); //size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); - size_t nozzle_nums = obj->m_extder_data.total_extder_count; + size_t nozzle_nums = obj->GetExtderSystem()->GetTotalExtderCount(); if (nozzle_nums == 1) { m_left_marea_panel->Hide(); @@ -1121,7 +1123,7 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& for (int i = 0; i < obj->vt_slot.size(); i++) { - AmsTray* tray_data = &obj->vt_slot[i]; + DevAmsTray* tray_data = &obj->vt_slot[i]; TrayData td; td.id = std::stoi(tray_data->id); @@ -1141,12 +1143,12 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& else { td.type = NORMAL; td.remain = tray_data->remain; - td.colour = AmsTray::decode_color(tray_data->color); + td.colour = DevAmsTray::decode_color(tray_data->color); td.name = tray_data->get_display_filament_type(); td.filament_type = tray_data->get_filament_type(); td.ctype = tray_data->ctype; for (auto col : tray_data->cols) { - td.material_cols.push_back(AmsTray::decode_color(col)); + td.material_cols.push_back(DevAmsTray::decode_color(col)); } } @@ -1167,15 +1169,16 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& std::list right_one_slot_containers; std::vector left_four_slots_containers; std::vector right_four_slot_containers; - for (std::map::iterator ams_iter = obj->amsList.begin(); ams_iter != obj->amsList.end(); ams_iter++) { + + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + for (auto ams_iter = ams_list.begin(); ams_iter != ams_list.end(); ams_iter++) { int ams_indx = atoi(ams_iter->first.c_str()); - int ams_type = ams_iter->second->type; - int nozzle_id = ams_iter->second->nozzle; + int nozzle_id = ams_iter->second->GetExtruderId(); auto sizer_mapping_list = new wxBoxSizer(wxHORIZONTAL); - auto ams_mapping_item_container = new MappingContainer(nozzle_id == 0 ? m_right_marea_panel : m_left_marea_panel, ams_iter->second->get_ams_device_name(), - ams_iter->second->trayList.size()); + auto ams_mapping_item_container = new MappingContainer(nozzle_id == 0 ? m_right_marea_panel : m_left_marea_panel, ams_iter->second->GetDisplayName(), + ams_iter->second->GetSlotCount()); ams_mapping_item_container->SetName(nozzle_id == 0 ? m_right_marea_panel->GetName() : m_left_marea_panel->GetName()); ams_mapping_item_container->SetSizer(sizer_mapping_list); ams_mapping_item_container->Layout(); @@ -1184,19 +1187,20 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& BOOST_LOG_TRIVIAL(trace) << "ams_mapping ams id " << ams_iter->first.c_str(); - Ams * ams_group = ams_iter->second; + DevAms* ams_group = ams_iter->second; + auto ams_type = ams_group->GetAmsType(); std::vector tray_datas; - std::map::iterator tray_iter; - - for (tray_iter = ams_group->trayList.begin(); tray_iter != ams_group->trayList.end(); tray_iter++) { - AmsTray *tray_data = tray_iter->second; + std::map::const_iterator tray_iter; + for (tray_iter = ams_group->GetTrays().cbegin(); tray_iter != ams_group->GetTrays().cend(); tray_iter++) + { + DevAmsTray *tray_data = tray_iter->second; TrayData td; if (ams_type == AMSModel::GENERIC_AMS || ams_type == AMSModel::AMS_LITE || ams_type == AMSModel::N3F_AMS) { td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str()); } else if (ams_type == AMSModel::N3S_AMS) { td.id = ams_indx + atoi(tray_data->id.c_str()); } - td.ams_id = std::stoi(ams_iter->second->id); + td.ams_id = std::stoi(ams_iter->second->GetAmsId()); td.slot_id = std::stoi(tray_iter->second->id); if (!tray_data->is_exists) { @@ -1207,11 +1211,11 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& } else { td.type = NORMAL; td.remain = tray_data->remain; - td.colour = AmsTray::decode_color(tray_data->color); + td.colour = DevAmsTray::decode_color(tray_data->color); td.name = tray_data->get_display_filament_type(); td.filament_type = tray_data->get_filament_type(); td.ctype = tray_data->ctype; - for (auto col : tray_data->cols) { td.material_cols.push_back(AmsTray::decode_color(col)); } + for (auto col : tray_data->cols) { td.material_cols.push_back(DevAmsTray::decode_color(col)); } } } @@ -1219,7 +1223,7 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& } ams_mapping_item_container->Show(); - add_ams_mapping(tray_datas, obj->ams_calibrate_remain_flag, ams_mapping_item_container, sizer_mapping_list); + add_ams_mapping(tray_datas, obj->GetFilaSystem()->IsDetectRemainEnabled(), ams_mapping_item_container, sizer_mapping_list); m_amsmapping_container_sizer_list.push_back(sizer_mapping_list); m_amsmapping_container_list.push_back(ams_mapping_item_container); @@ -1253,22 +1257,22 @@ void AmsMapingPopup::update(MachineObject* obj, const std::vector& Refresh(); } -std::vector AmsMapingPopup::parse_ams_mapping(std::map amsList) +std::vector AmsMapingPopup::parse_ams_mapping(std::map amsList) { std::vector m_tray_data; - std::map::iterator ams_iter; + std::map::iterator ams_iter; for (ams_iter = amsList.begin(); ams_iter != amsList.end(); ams_iter++) { BOOST_LOG_TRIVIAL(trace) << "ams_mapping ams id " << ams_iter->first.c_str(); auto ams_indx = atoi(ams_iter->first.c_str()); - Ams* ams_group = ams_iter->second; + DevAms* ams_group = ams_iter->second; std::vector tray_datas; - std::map::iterator tray_iter; + std::map::const_iterator tray_iter; - for (tray_iter = ams_group->trayList.begin(); tray_iter != ams_group->trayList.end(); tray_iter++) { - AmsTray* tray_data = tray_iter->second; + for (tray_iter = ams_group->GetTrays().cbegin(); tray_iter != ams_group->GetTrays().cend(); tray_iter++) { + DevAmsTray* tray_data = tray_iter->second; TrayData td; td.id = ams_indx * AMS_TOTAL_COUNT + atoi(tray_data->id.c_str()); @@ -1283,7 +1287,7 @@ std::vector AmsMapingPopup::parse_ams_mapping(std::mapremain; - td.colour = AmsTray::decode_color(tray_data->color); + td.colour = DevAmsTray::decode_color(tray_data->color); td.name = tray_data->get_display_filament_type(); td.filament_type = tray_data->get_filament_type(); } @@ -2258,7 +2262,7 @@ void AmsReplaceMaterialDialog::update_machine_obj(MachineObject* obj) if (obj) { m_obj = obj; - if (obj->m_extder_data.total_extder_count > 1) + if (obj->GetExtderSystem()->GetTotalExtderCount() > 1) { m_nozzle_btn_panel->updateState("right"); m_nozzle_btn_panel->Show(); @@ -2268,7 +2272,7 @@ void AmsReplaceMaterialDialog::update_machine_obj(MachineObject* obj) m_nozzle_btn_panel->Hide(); } - update_to_nozzle(MAIN_NOZZLE_ID); + update_to_nozzle(MAIN_EXTRUDER_ID); } } @@ -2321,7 +2325,7 @@ void AmsReplaceMaterialDialog::update_to_nozzle(int nozzle_id) return; } - if (m_obj->m_extder_data.extders.size() < nozzle_id) + if (m_obj->GetExtderSystem()->GetTotalExtderCount() < nozzle_id) { return; } @@ -2329,38 +2333,40 @@ void AmsReplaceMaterialDialog::update_to_nozzle(int nozzle_id) //update group int group_index = 0; m_groups_sizer->Clear(true); - if (m_obj->is_support_filament_backup && m_obj->ams_auto_switch_filament_flag) + if (m_obj->is_support_filament_backup && m_obj->GetFilaSystem()->IsAutoRefillEnabled()) { // traverse the amd list - std::unordered_map id2tray;// tray id to tray + std::unordered_map id2tray;// tray id to tray try { - for (const auto& ams_info : m_obj->amsList) + for (const auto& ams_info : m_obj->GetFilaSystem()->GetAmsList()) { int ams_device_id = atoi(ams_info.first.c_str()); if (ams_device_id < 128) { int ams_base_id = ams_device_id * 4; - for (auto tray_info : ams_info.second->trayList) + for (auto tray_info : ams_info.second->GetTrays()) { int tray_offset = atoi(tray_info.first.c_str()); id2tray[ams_base_id + tray_offset] = tray_info.second; } } - else if (ams_info.second->trayList.size() == 1)/*n3f*/ + else if (ams_info.second->GetTrays().size() == 1)/*n3f*/ { - id2tray[ams_device_id] = ams_info.second->trayList.begin()->second; + id2tray[ams_device_id] = ams_info.second->GetTrays().begin()->second; } } } catch (...) {} - const Extder& extder = m_obj->m_extder_data.extders[nozzle_id]; - for (int filam : extder.filam_bak) + const auto& extder = m_obj->GetExtderSystem()->GetExtderById(nozzle_id); + if (extder) { - std::map group_info; - std::string group_material; - bool is_in_tray = false; + for (int filam : extder->GetFilamBackup()) + { + std::map group_info; + std::string group_material; + bool is_in_tray = false; //get color & material const auto& trayid_group = _GetBackupStatus(filam); @@ -2368,7 +2374,7 @@ void AmsReplaceMaterialDialog::update_to_nozzle(int nozzle_id) { if (elem.second) { - AmsTray* cur_tray = id2tray[elem.first]; + DevAmsTray* cur_tray = id2tray[elem.first]; if (cur_tray) { auto tray_name = wxGetApp().transition_tridid(elem.first).ToStdString(); @@ -2378,21 +2384,22 @@ void AmsReplaceMaterialDialog::update_to_nozzle(int nozzle_id) is_in_tray = true; } - group_info[tray_name] = AmsTray::decode_color(cur_tray->color); - group_material = cur_tray->get_display_filament_type(); + group_info[tray_name] = DevAmsTray::decode_color(cur_tray->color); + group_material = cur_tray->get_display_filament_type(); + } } } - } - if (group_info.size() < 2) /* do not show refill if there is one tray*/ - { - continue; - } + if (group_info.size() < 2) /* do not show refill if there is one tray*/ + { + continue; + } - if (is_in_tray || m_tray_used.size() <= 0) - { - m_groups_sizer->Add(create_backup_group(wxString::Format("%s%d", _L("Group"), group_index + 1), group_info, group_material), 0, wxALL, FromDIP(10)); - group_index++; + if (is_in_tray || m_tray_used.size() <= 0) + { + m_groups_sizer->Add(create_backup_group(wxString::Format("%s%d", _L("Group"), group_index + 1), group_info, group_material), 0, wxALL, FromDIP(10)); + group_index++; + } } } } @@ -2430,7 +2437,7 @@ void AmsReplaceMaterialDialog::update_to_nozzle(int nozzle_id) { label_txt->SetLabel(_L("The printer does not currently support auto refill.")); } - else if (!m_obj->ams_auto_switch_filament_flag) + else if (!m_obj->GetFilaSystem()->IsAutoRefillEnabled()) { label_txt->SetLabelText(_L("AMS filament backup is not enabled, please enable it in the AMS settings.")); } diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp index 1ffc85e8bc..9a06bca0d0 100644 --- a/src/slic3r/GUI/AmsMappingPopup.hpp +++ b/src/slic3r/GUI/AmsMappingPopup.hpp @@ -278,7 +278,7 @@ public: void paintEvent(wxPaintEvent &evt); void set_parent_item(MaterialItem* item) {m_parent_item = item;}; void set_show_type(ShowType type) { m_show_type = type; }; - std::vector parse_ams_mapping(std::map amsList); + std::vector parse_ams_mapping(std::map amsList); using ResetCallback = std::function; void reset_ams_info(); diff --git a/src/slic3r/GUI/AmsWidgets.cpp b/src/slic3r/GUI/AmsWidgets.cpp index 14a5210936..5102f1127f 100644 --- a/src/slic3r/GUI/AmsWidgets.cpp +++ b/src/slic3r/GUI/AmsWidgets.cpp @@ -10,6 +10,8 @@ #include "Widgets/Label.hpp" #include "format.hpp" +#include "DeviceCore/DevFilaSystem.h" + namespace Slic3r { namespace GUI { @@ -139,16 +141,19 @@ void TrayListModel::update(MachineObject* obj) m_saturabilityColValues.clear(); m_transmittanceColValues.clear(); - std::map::iterator ams_it; - std::map::iterator tray_it; + std::map::iterator ams_it; + std::map::const_iterator tray_it; int tray_index = 0; - for (ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ams_it++) { + + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + for (auto ams_it = ams_list.begin(); ams_it != ams_list.end(); ams_it++) + { if (ams_it->second) { - for (tray_it = ams_it->second->trayList.begin(); tray_it != ams_it->second->trayList.end(); tray_it++) { - AmsTray* tray = tray_it->second; + for (tray_it = ams_it->second->GetTrays().cbegin(); tray_it != ams_it->second->GetTrays().cend(); tray_it++) { + DevAmsTray* tray = tray_it->second; if (tray) { tray_index++; - wxString title_text = wxString::Format("tray %s(ams %s)", tray->id, ams_it->second->id); + wxString title_text = wxString::Format("tray %s(ams %s)", tray->id, ams_it->second->GetAmsId()); m_titleColValues.push_back(title_text); wxString color_text = wxString::Format("%s", tray->wx_color.GetAsString()); m_colorColValues.push_back(color_text); diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index 14f0de7960..a1ed91d2fc 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -18,6 +18,8 @@ #include "Jobs/PlaterWorker.hpp" #include "Widgets/WebView.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -847,7 +849,7 @@ PingCodeBindDialog::~PingCodeBindDialog() { EndModal(wxID_OK); MessageDialog msg_wingow(nullptr, _L("Log in successful."), "", wxAPPLY | wxOK); msg_wingow.ShowModal(); - if(m_machine_info) wxGetApp().on_start_subscribe_again(m_machine_info->dev_id); + if(m_machine_info) wxGetApp().on_start_subscribe_again(m_machine_info->get_dev_id()); } void BindMachineDialog::on_bind_printer(wxCommandEvent &event) @@ -863,7 +865,7 @@ PingCodeBindDialog::~PingCodeBindDialog() { if (m_machine_info == nullptr || m_machine_info == NULL) return; //check dev_id - if (m_machine_info->dev_id.empty()) return; + if (m_machine_info->get_dev_id().empty()) return; // update ota version NetworkAgent* agent = wxGetApp().getAgent(); @@ -871,7 +873,8 @@ PingCodeBindDialog::~PingCodeBindDialog() { agent->track_update_property("dev_ota_version", m_machine_info->get_ota_version()); m_simplebook->SetSelection(0); - auto m_bind_job = std::make_unique(m_machine_info->dev_id, m_machine_info->dev_ip, m_machine_info->bind_sec_link, m_machine_info->bind_ssdp_version); + auto m_bind_job = std::make_unique( + m_machine_info->get_dev_id(), m_machine_info->get_dev_ip(), m_machine_info->bind_sec_link, m_machine_info->bind_ssdp_version); if (m_machine_info && (m_machine_info->get_printer_series() == PrinterSeries::SERIES_X1)) { m_bind_job->set_improved(false); @@ -921,7 +924,7 @@ void BindMachineDialog::on_show(wxShowEvent &event) m_printer_img->Refresh(); m_printer_img->Show(); - m_printer_name->SetLabelText(from_u8(m_machine_info->dev_name)); + m_printer_name->SetLabelText(from_u8(m_machine_info->get_dev_name())); if (wxGetApp().is_user_login()) { wxString username_text = from_u8(wxGetApp().getAgent()->get_user_nickanme()); @@ -1099,16 +1102,16 @@ void UnBindMachineDialog::on_unbind_printer(wxCommandEvent &event) } m_machine_info->set_access_code(""); - int result = wxGetApp().request_user_unbind(m_machine_info->dev_id); + int result = wxGetApp().request_user_unbind(m_machine_info->get_dev_id()); if (result == 0) { DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; // clean local machine access code info - MachineObject* obj = dev->get_local_machine(m_machine_info->dev_id); + MachineObject* obj = dev->get_local_machine(m_machine_info->get_dev_id()); if (obj) { obj->set_access_code(""); } - dev->erase_user_machine(m_machine_info->dev_id); + dev->erase_user_machine(m_machine_info->get_dev_id()); m_status_text->SetLabelText(_L("Log out successful.")); m_button_cancel->SetLabel(_L("Close")); @@ -1138,7 +1141,7 @@ void UnBindMachineDialog::on_show(wxShowEvent &event) m_printer_img->Refresh(); m_printer_img->Show(); - m_printer_name->SetLabelText(from_u8(m_machine_info->dev_name)); + m_printer_name->SetLabelText(from_u8(m_machine_info->get_dev_name())); if (wxGetApp().is_user_login()) { diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp index 062323781b..b07e0878e3 100644 --- a/src/slic3r/GUI/CaliHistoryDialog.cpp +++ b/src/slic3r/GUI/CaliHistoryDialog.cpp @@ -9,6 +9,9 @@ #include "slic3r/Utils/CalibUtils.hpp" #include +#include "DeviceCore/DevExtruderSystem.h" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -225,7 +228,7 @@ void HistoryWindow::on_device_connected(MachineObject* obj) int selection = 1; for (int i = 0; i < nozzle_diameter_list.size(); i++) { m_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i])); - if (abs(curr_obj->m_extder_data.extders[0].current_nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + if (abs(curr_obj->GetExtderSystem()->GetNozzleDiameter(0) - nozzle_diameter_list[i]) < 1e-3) { selection = i; } } @@ -645,7 +648,7 @@ wxArrayString NewCalibrationHistoryDialog::get_all_filaments(const MachineObject std::set filament_id_set; std::set printer_names; std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << obj->m_extder_data.extders[0].current_nozzle_diameter; + stream << std::fixed << std::setprecision(1) << obj->GetExtderSystem()->GetNozzleDiameter(0); std::string nozzle_diameter_str = stream.str(); for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) { @@ -659,7 +662,7 @@ wxArrayString NewCalibrationHistoryDialog::get_all_filaments(const MachineObject continue; // use printer_model as printer type - if (printer_model_str->value != MachineObject::get_preset_printer_model_name(obj->printer_type)) + if (printer_model_str->value != DevPrinterConfigUtil::get_printer_display_name(obj->printer_type)) continue; if (printer_it->name.find(nozzle_diameter_str) != std::string::npos) @@ -789,7 +792,7 @@ NewCalibrationHistoryDialog::NewCalibrationHistoryDialog(wxWindow *parent, const static std::array nozzle_diameter_list = {0.2f, 0.4f, 0.6f, 0.8f}; for (int i = 0; i < nozzle_diameter_list.size(); i++) { m_comboBox_nozzle_diameter->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i])); - if (abs(obj->m_extder_data.extders[0].current_nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + if (abs(obj->GetExtderSystem()->GetNozzleDiameter(0) - nozzle_diameter_list[i]) < 1e-3) { m_comboBox_nozzle_diameter->SetSelection(i); } } diff --git a/src/slic3r/GUI/Calibration.cpp b/src/slic3r/GUI/Calibration.cpp index d0d6d70a0a..85cdf15aa6 100644 --- a/src/slic3r/GUI/Calibration.cpp +++ b/src/slic3r/GUI/Calibration.cpp @@ -11,6 +11,8 @@ #include "Widgets/RoundedRectangle.hpp" #include "Widgets/StaticBox.hpp" +#include "DeviceCore/DevConfig.h" + static wxColour FG_COLOR = wxColour(0x32, 0x3A, 0x3D); static wxColour BG_COLOR = wxColour(0xF8, 0xF8, 0xF8); @@ -214,7 +216,8 @@ wxWindow* CalibrationDialog::create_check_option(wxString title, wxWindow* paren void CalibrationDialog::update_cali(MachineObject *obj) { if (!obj) return; - if (obj->is_support_ai_monitoring && obj->is_support_lidar_calibration) { + if (obj->GetConfig()->SupportAIMonitor() && obj->GetConfig()->SupportCalibrationLidar()) + { select_xcam_cali->Show(); } else { select_xcam_cali->Hide(); @@ -235,19 +238,16 @@ void CalibrationDialog::update_cali(MachineObject *obj) m_checkbox_list["motor_noise"]->SetValue(false); } - if (obj->is_support_nozzle_offset_cali) { + if (obj->GetConfig()->SupportCalibrationNozzleOffset()) { select_nozzle_cali->Show(); } else { select_nozzle_cali->Hide(); m_checkbox_list["nozzle_cali"]->SetValue(false); } - if (obj->is_support_high_tempbed_cali) - { + if (obj->GetConfig()->SupportCalibrationHighTempBed()) { select_heatbed_cali->Show(); - } - else - { + } else { select_heatbed_cali->Hide(); m_checkbox_list["bed_cali"]->SetValue(false); } @@ -277,7 +277,7 @@ void CalibrationDialog::update_cali(MachineObject *obj) // change items if stage_list_info changed m_calibration_flow->DeleteAllItems(); for (int i = 0; i < obj->stage_list_info.size(); i++) { - m_calibration_flow->AppendItem(get_stage_string(obj->stage_list_info[i])); + m_calibration_flow->AppendItem(Slic3r::get_stage_string(obj->stage_list_info[i])); } } int index = obj->get_curr_stage_idx(); diff --git a/src/slic3r/GUI/CalibrationPanel.cpp b/src/slic3r/GUI/CalibrationPanel.cpp index 0e61c0c67e..9b9aa2bfbd 100644 --- a/src/slic3r/GUI/CalibrationPanel.cpp +++ b/src/slic3r/GUI/CalibrationPanel.cpp @@ -7,6 +7,8 @@ #include "SelectMachine.hpp" #include "SelectMachinePop.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { #define REFRESH_INTERVAL 1000 @@ -112,7 +114,7 @@ void MObjectPanel::doRender(wxDC& dc) dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900)); wxString dev_name = ""; if (m_info) { - dev_name = from_u8(m_info->dev_name); + dev_name = from_u8(m_info->get_dev_name()); if (m_state == PrinterState::IN_LAN) { dev_name += _L("(LAN)"); @@ -170,13 +172,13 @@ void MObjectPanel::on_mouse_left_up(wxMouseEvent& evt) if (m_info->has_access_right() && m_info->is_avaliable()) { Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; - dev->set_selected_machine(m_info->dev_id); + dev->set_selected_machine(m_info->get_dev_id()); } } else { Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; - dev->set_selected_machine(m_info->dev_id); + dev->set_selected_machine(m_info->get_dev_id()); } wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST); event.SetEventObject(this->GetParent()->GetParent()); @@ -335,7 +337,7 @@ void SelectMObjectPopup::update_user_devices() std::sort(user_machine_list.begin(), user_machine_list.end(), [&](auto& a, auto& b) { if (a.second && b.second) { - return a.second->dev_name.compare(b.second->dev_name) < 0; + return a.second->get_dev_name().compare(b.second->get_dev_name()) < 0; } return false; }); @@ -538,7 +540,7 @@ void CalibrationPanel::update_all() { obj = dev->get_selected_machine(); // check valid machine - if (obj && dev->get_my_machine(obj->dev_id) == nullptr) { + if (obj && dev->get_my_machine(obj->get_dev_id()) == nullptr) { dev->set_selected_machine(""); if (m_agent) m_agent->set_user_selected_machine(""); show_status((int) MONITOR_NO_PRINTER); @@ -642,7 +644,7 @@ bool CalibrationPanel::Show(bool show) { dev->load_last_machine(); obj = dev->get_selected_machine(); if (obj) - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); } else { obj->reset_update_time(); diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index 7a070b5a1c..ee0060a7d5 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -184,7 +184,7 @@ void CalibrationWizard::on_device_connected(MachineObject* obj) recover_preset_info(obj); BOOST_LOG_TRIVIAL(info) << "on_device_connected - machine object status:" - << " dev_id = " << obj->dev_id + << " dev_id = " << obj->get_dev_id() << ", print_type = " << obj->printer_type << ", printer_status = " << obj->print_status << ", cali_finished = " << obj->cali_finished @@ -417,8 +417,8 @@ void CalibrationWizard::recover_preset_info(MachineObject *obj) { std::vector back_infos = wxGetApp().app_config->get_printer_cali_infos(); for (const auto& back_info : back_infos) { - if (obj && (obj->dev_id == back_info.dev_id) ) { - obj->dev_id = back_info.dev_id; + if (obj && (obj->get_dev_id() == back_info.dev_id) ) { + obj->set_dev_id(back_info.dev_id); obj->cali_finished = back_info.cali_finished; obj->cache_flow_ratio = back_info.cache_flow_ratio; obj->selected_cali_preset = back_info.selected_presets; @@ -433,7 +433,7 @@ void CalibrationWizard::back_preset_info(MachineObject *obj, bool cali_finish, b return; PrinterCaliInfo printer_cali_info; - printer_cali_info.dev_id = obj->dev_id; + printer_cali_info.dev_id = obj->get_dev_id(); printer_cali_info.cali_finished = cali_finish; printer_cali_info.cache_flow_ratio = obj->cache_flow_ratio; printer_cali_info.selected_presets = obj->selected_cali_preset; @@ -599,7 +599,7 @@ void PressureAdvanceWizard::update(MachineObject* obj) if (obj->cali_version != -1 && obj->cali_version != cali_version) { cali_version = obj->cali_version; PACalibExtruderInfo cali_info; - cali_info.nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + cali_info.nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); cali_info.use_extruder_id = false; cali_info.use_nozzle_volume_type = false; CalibUtils::emit_get_PA_calib_infos(cali_info); @@ -751,7 +751,7 @@ void PressureAdvanceWizard::on_cali_start() int selected_tray_id = 0; CalibInfo calib_info; - calib_info.dev_id = curr_obj->dev_id; + calib_info.dev_id = curr_obj->get_dev_id(); get_tray_ams_and_slot_id(curr_obj, selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id, selected_tray_id); calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); @@ -1205,7 +1205,7 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) { CalibrationFlowCoarseSavePage* coarse_page = (static_cast(coarse_save_step->page)); CalibInfo calib_info; - calib_info.dev_id = curr_obj->dev_id; + calib_info.dev_id = curr_obj->get_dev_id(); Preset* temp_filament_preset = nullptr; int cali_stage = -1; wxString wx_err_string; @@ -1635,7 +1635,7 @@ void MaxVolumetricSpeedWizard::on_cali_start() CalibInfo calib_info; calib_info.params = params; - calib_info.dev_id = curr_obj->dev_id; + calib_info.dev_id = curr_obj->get_dev_id(); if (!selected_filaments.empty()) { int selected_tray_id = 0; get_tray_ams_and_slot_id(curr_obj, selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id, selected_tray_id); diff --git a/src/slic3r/GUI/CalibrationWizardCaliPage.cpp b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp index 587e182848..c906f0ab14 100644 --- a/src/slic3r/GUI/CalibrationWizardCaliPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardCaliPage.cpp @@ -3,6 +3,8 @@ #include "I18N.hpp" #include "Widgets/Label.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { static const wxString NA_STR = _L("N/A"); @@ -167,7 +169,7 @@ void CalibrationCaliPage::update(MachineObject* obj) if (obj) { if (obj->print_status != "RUNNING") { BOOST_LOG_TRIVIAL(info) << "on_show_cali_page - machine object status:" - << " dev_id = " << obj->dev_id + << " dev_id = " << obj->get_dev_id() << ", print_type = " << obj->printer_type << ", printer_status = " << obj->print_status << ", is_connected = " << obj->is_connected() @@ -190,8 +192,8 @@ void CalibrationCaliPage::update(MachineObject* obj) // enable calibration when finished bool enable_cali = false; if (obj) { - if (obj->m_extder_data.current_extder_id != m_cur_extruder_id) { - m_cur_extruder_id = obj->m_extder_data.current_extder_id; + if (obj->GetExtderSystem()->GetCurrentExtderId() != m_cur_extruder_id) { + m_cur_extruder_id = obj->GetExtderSystem()->GetCurrentExtderId(); set_cali_img(); } @@ -521,8 +523,8 @@ float CalibrationCaliPage::get_selected_calibration_nozzle_dia(MachineObject* ob return obj->cali_selected_nozzle_dia; // return default nozzle if nozzle diameter is set - if (obj->m_extder_data.extders[0].current_nozzle_diameter > 1e-3 && obj->m_extder_data.extders[0].current_nozzle_diameter < 10.0f) - return obj->m_extder_data.extders[0].current_nozzle_diameter; + if (obj->GetExtderSystem()->GetNozzleDiameter(0) > 1e-3 && obj->GetExtderSystem()->GetNozzleDiameter(0) < 10.0f) + return obj->GetExtderSystem()->GetNozzleDiameter(0); // return 0.4 by default return 0.4; diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp index 7819e61ca2..fc5b8699b3 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPage.cpp @@ -3,6 +3,8 @@ #include "Widgets/Label.hpp" #include "MsgDialog.hpp" +#include "DeviceCore/DevFilaSystem.h" + namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_CALI_ACTION, wxCommandEvent); @@ -310,7 +312,7 @@ void FilamentComboBox::load_tray_from_ams(int id, DynamicPrintConfig& tray) m_tray_id = id; m_tray_name = m_comboBox->get_tray_name(); - m_is_bbl_filamnet = MachineObject::is_bbl_filament(m_comboBox->get_tag_uid()); + m_is_bbl_filamnet = DevFilaSystem::IsBBL_Filament(m_comboBox->get_tag_uid()); Enable(m_comboBox->is_tray_exist()); if (m_comboBox->is_tray_exist()) { diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 560d4ff13d..824df5ab0a 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -5,6 +5,13 @@ #include "MsgDialog.hpp" #include "libslic3r/Print.hpp" +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevExtruderSystem.h" +#include "DeviceCore/DevFilaBlackList.h" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevStorage.h" + #define CALIBRATION_LABEL_SIZE wxSize(FromDIP(150), FromDIP(24)) #define SYNC_BUTTON_SIZE (wxSize(FromDIP(50), FromDIP(50))) #define CALIBRATION_TEXT_INPUT_Y_SIZE FromDIP(20) @@ -16,11 +23,6 @@ namespace Slic3r { namespace GUI { static int PA_LINE = 0; static int PA_PATTERN = 1; -static bool is_virtual_slot(int ams_id) -{ - return ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID; -} - CaliPresetCaliStagePanel::CaliPresetCaliStagePanel( wxWindow* parent, wxWindowID id, @@ -578,7 +580,7 @@ void CalibrationPresetPage::create_selection_panel(wxWindow* parent) return; } BOOST_LOG_TRIVIAL(info) << "CalibrationPresetPage: sync_nozzle_info - machine object status:" - << " dev_id = " << curr_obj->dev_id + << " dev_id = " << curr_obj->get_dev_id() << ", print_type = " << curr_obj->printer_type << ", printer_status = " << curr_obj->print_status << ", cali_finished = " << curr_obj->cali_finished @@ -596,10 +598,10 @@ void CalibrationPresetPage::create_selection_panel(wxWindow* parent) << ", name = " << preset_info.name; } - for (auto extruder : curr_obj->m_extder_data.extders) { - if (extruder.current_nozzle_type == NozzleType::ntUndefine) { + for (const auto& extruder : curr_obj->GetExtderSystem()->GetExtruders()) { + if (extruder.GetNozzleType() == NozzleType::ntUndefine) { wxString name = _L("left"); - if (extruder.id == 0) { name = _L("right"); } + if (extruder.GetExtId() == 0) { name = _L("right"); } wxString msg = wxString::Format(_L("Printer %s nozzle information has not been set. Please configure it before proceeding with the calibration."), name); MessageDialog msg_dlg(nullptr, msg, wxEmptyString, wxICON_WARNING | wxOK); msg_dlg.ShowModal(); @@ -1462,7 +1464,7 @@ bool CalibrationPresetPage::is_filament_in_blacklist(int tray_id, Preset* preset auto vendor = dynamic_cast (preset->config.option("filament_vendor")); if (vendor && (vendor->values.size() > 0)) { std::string vendor_name = vendor->values[0]; - DeviceManager::check_filaments_in_blacklist(curr_obj->printer_type, vendor_name, filamnt_type, preset->filament_id, ams_id, slot_id, "", in_blacklist, action, info); + DevFilaBlacklist::check_filaments_in_blacklist(curr_obj->printer_type, vendor_name, filamnt_type, preset->filament_id, ams_id, slot_id, "", in_blacklist, action, info); } if (in_blacklist) { @@ -1479,7 +1481,7 @@ bool CalibrationPresetPage::is_filament_in_blacklist(int tray_id, Preset* preset return true; } } - if (is_virtual_slot(ams_id)) { + if (devPrinterUtil::IsVirtualSlot(ams_id)) { if (m_cali_mode == CalibMode::Calib_PA_Line && m_cali_method == CalibrationMethod::CALI_METHOD_AUTO) { std::string filamnt_type; preset->get_filament_type(filamnt_type); @@ -1606,7 +1608,7 @@ bool CalibrationPresetPage::is_blocking_printing() auto target_model = obj_->printer_type; if (source_model != target_model) { - std::vector compatible_machine = dev->get_compatible_machine(target_model); + std::vector compatible_machine = obj_->get_compatible_machine(); vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); if (it == compatible_machine.end()) { return true; @@ -1652,9 +1654,9 @@ void CalibrationPresetPage::update_sync_button_status() if (curr_obj->is_multi_extruders()) { std::vector machine_obj_nozzle_infos; machine_obj_nozzle_infos.resize(2); - for (Extder extruder : curr_obj->m_extder_data.extders) { - machine_obj_nozzle_infos[extruder.id].nozzle_diameter = extruder.current_nozzle_diameter; - machine_obj_nozzle_infos[extruder.id].nozzle_volume_type = int(extruder.current_nozzle_flow_type) - 1; + for (const DevExtder& extruder : curr_obj->GetExtderSystem()->GetExtruders()) { + machine_obj_nozzle_infos[extruder.GetExtId()].nozzle_diameter = extruder.GetNozzleDiameter(); + machine_obj_nozzle_infos[extruder.GetExtId()].nozzle_volume_type = int(extruder.GetNozzleFlowType()) - 1; } std::vector cali_nozzle_infos; @@ -1672,7 +1674,7 @@ void CalibrationPresetPage::update_sync_button_status() } } else { - if (abs(curr_obj->m_extder_data.extders[0].current_nozzle_diameter - get_nozzle_diameter(0)) < EPSILON) { + if (abs(curr_obj->GetExtderSystem()->GetNozzleDiameter(0) - get_nozzle_diameter(0)) < EPSILON) { set_status(true); } else { @@ -1754,17 +1756,17 @@ void CalibrationPresetPage::update_show_status() // check sdcard when if lan mode printer if (obj_->is_lan_mode_printer()) { - if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { show_status(CaliPresetPageStatus::CaliPresetStatusLanModeNoSdcard); return; - } - else if (obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_ABNORMAL - || obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_READONLY) { + } else if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL || + obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_READONLY) { show_status(CaliPresetPageStatus::CaliPresetStatusLanModeSDcardNotAvailable); return; } } - else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { + else if (!obj_->GetConfig()->SupportPrintWithoutSD() && (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD)) + { show_status(CaliPresetPageStatus::CaliPresetStatusNoSdcard); return; } @@ -2065,7 +2067,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) auto get_nozzle_diameter_list_index = [&obj](int extruder_id) -> int { for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { - if (abs(obj->m_extder_data.extders[extruder_id].current_nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + if (abs(obj->GetExtderSystem()->GetNozzleDiameter(extruder_id) - nozzle_diameter_list[i]) < 1e-3) { return i; } } @@ -2077,7 +2079,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) // set nozzle value from machine bool nozzle_is_set = false; for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { - if (abs(obj->m_extder_data.extders[0].current_nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + if (abs(obj->GetExtderSystem()->GetNozzleDiameter(0) - nozzle_diameter_list[i]) < 1e-3) { if (m_comboBox_nozzle_dia->GetCount() > i) { m_comboBox_nozzle_dia->SetSelection(i); nozzle_is_set = true; @@ -2098,7 +2100,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) } if (obj->is_multi_extruders()) { - for (size_t i = 0; i < obj->m_extder_data.extders.size(); ++i) { + for (size_t i = 0; i < obj->GetExtderSystem()->GetTotalExtderCount(); ++i) { if (i == LEFT_EXTRUDER_ID) { int index = get_nozzle_diameter_list_index(LEFT_EXTRUDER_ID); if ((index != -1) && m_left_comboBox_nozzle_dia->GetCount() > index) { @@ -2114,8 +2116,8 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) m_left_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); } - if (obj->m_extder_data.extders[i].current_nozzle_flow_type != NozzleFlowType::NONE_FLOWTYPE) { - m_left_comboBox_nozzle_volume->SetSelection(obj->m_extder_data.extders[i].current_nozzle_flow_type - 1); + if (obj->GetExtderSystem()->GetNozzleFlowType(i) != NozzleFlowType::NONE_FLOWTYPE) { + m_left_comboBox_nozzle_volume->SetSelection(obj->GetExtderSystem()->GetNozzleFlowType(i) - 1); } else { m_left_comboBox_nozzle_volume->SetSelection(0); } @@ -2134,8 +2136,8 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) m_right_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); } - if (obj->m_extder_data.extders[i].current_nozzle_flow_type != NozzleFlowType::NONE_FLOWTYPE) { - m_right_comboBox_nozzle_volume->SetSelection(obj->m_extder_data.extders[i].current_nozzle_flow_type - 1); + if (obj->GetExtderSystem()->GetNozzleFlowType(i) != NozzleFlowType::NONE_FLOWTYPE) { + m_right_comboBox_nozzle_volume->SetSelection(obj->GetExtderSystem()->GetNozzleFlowType(i) - 1); } else { m_right_comboBox_nozzle_volume->SetSelection(0); } @@ -2199,12 +2201,12 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) // sync filament_ams_list from obj ams list filament_ams_list.clear(); - for (auto& ams_item : obj->amsList) { - for (auto& tray_item: ams_item.second->trayList) { + for (auto& ams_item : obj->GetFilaSystem()->GetAmsList()) { + for (auto& tray_item: ams_item.second->GetTrays()) { int tray_id = -1; if (!tray_item.second->id.empty()) { try { - tray_id = stoi(tray_item.second->id) + stoi(ams_item.second->id) * 4; + tray_id = stoi(tray_item.second->id) + stoi(ams_item.second->GetAmsId()) * 4; } catch (...) { ; @@ -2228,16 +2230,16 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) // update filament from panel, display only obj has ams // update multi ams panel, display only obj has multi ams - if (obj->has_ams()) { + if (obj->HasAms()) { if (obj->is_multi_extruders()) { bool main_done = false; bool deputy_done = false; - for (auto &ams_item : obj->amsList) { - if (ams_item.second->nozzle == 0 && !main_done) { - update_multi_extruder_filament_combobox(ams_item.second->id, ams_item.second->nozzle); + for (auto &ams_item : obj->GetFilaSystem()->GetAmsList()) { + if (ams_item.second->GetExtruderId() == 0 && !main_done) { + update_multi_extruder_filament_combobox(ams_item.second->GetAmsId(), ams_item.second->GetExtruderId()); main_done = true; - } else if (ams_item.second->nozzle == 1 && !deputy_done) { - update_multi_extruder_filament_combobox(ams_item.second->id, ams_item.second->nozzle); + } else if (ams_item.second->GetExtruderId() == 1 && !deputy_done) { + update_multi_extruder_filament_combobox(ams_item.second->GetAmsId(), ams_item.second->GetExtruderId()); deputy_done = true; } } @@ -2249,11 +2251,11 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_DEPUTY_ID), 1); } else { - if (obj->amsList.size() > 1) { - on_switch_ams(obj->amsList.begin()->first); + if (obj->GetFilaSystem()->GetAmsList().size() > 1) { + on_switch_ams(obj->GetFilaSystem()->GetAmsList().begin()->first); } else { - if (!obj->amsList.empty()) - update_filament_combobox(obj->amsList.begin()->first); + if (!obj->GetFilaSystem()->GetAmsList().empty()) + update_filament_combobox(obj->GetFilaSystem()->GetAmsList().begin()->first); } } } @@ -2270,11 +2272,13 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) std::vector ams_info; std::vector main_ams_info; std::vector deputy_ams_info; - for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) { + + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + for (auto ams = ams_list.begin(); ams != ams_list.end(); ams++) { AMSinfo info; info.ams_id = ams->first; - if (ams->second->is_exists - && info.parse_ams_info(obj, ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) { + if (ams->second->IsExist() + && info.parse_ams_info(obj, ams->second, obj->GetFilaSystem()->IsDetectRemainEnabled(), obj->is_support_ams_humidity)) { ams_info.push_back(info); if (info.nozzle_id == 0) { main_ams_info.push_back(info); @@ -2319,7 +2323,7 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) // update vt slot preview list { - for (const AmsTray& vt_tray : obj->vt_slot) { + for (const DevAmsTray& vt_tray : obj->vt_slot) { if (vt_tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { AMSinfo info; info.parse_ext_info(obj, vt_tray); @@ -2360,7 +2364,7 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) } } - for (const AmsTray &vt_tray : obj->vt_slot) { + for (const DevAmsTray &vt_tray : obj->vt_slot) { if (vt_tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { AMSinfo info; info.parse_ext_info(obj, vt_tray); @@ -2392,7 +2396,7 @@ void CalibrationPresetPage::select_default_compatible_filament() if (ams_id.empty()) return; - if (!is_virtual_slot(stoi(ams_id))) { + if (!devPrinterUtil::IsVirtualSlot(ams_id)) { std::map selected_filament; for (size_t i = 0; i < 4; ++i) { auto &fcb = m_filament_comboBox_list[i]; diff --git a/src/slic3r/GUI/CameraPopup.cpp b/src/slic3r/GUI/CameraPopup.cpp index 3155a1bb98..6d38182e33 100644 --- a/src/slic3r/GUI/CameraPopup.cpp +++ b/src/slic3r/GUI/CameraPopup.cpp @@ -10,6 +10,9 @@ #include "GUI_App.hpp" #include +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevStorage.h" + namespace Slic3r { namespace GUI { @@ -214,7 +217,7 @@ void CameraPopup::set_custom_cam_button_state(bool state) void CameraPopup::on_switch_recording(wxCommandEvent& event) { if (!m_obj) return; - if (m_obj->sdcard_state != MachineObject::SdcardState::HAS_SDCARD_NORMAL) { + if (m_obj->GetStorage()->get_sdcard_state() != DevStorage::SdcardState::HAS_SDCARD_NORMAL) { sdcard_absent_hint(); return; } diff --git a/src/slic3r/GUI/ConnectPrinter.cpp b/src/slic3r/GUI/ConnectPrinter.cpp index b21a32d340..b6ad6b5042 100644 --- a/src/slic3r/GUI/ConnectPrinter.cpp +++ b/src/slic3r/GUI/ConnectPrinter.cpp @@ -4,6 +4,8 @@ #include #include "libslic3r/AppConfig.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { ConnectPrinterDialog::ConnectPrinterDialog(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &pos, const wxSize &size, long style) : DPIDialog(parent, id, _L("Connect Printer (LAN)"), pos, size, style) @@ -118,7 +120,7 @@ void ConnectPrinterDialog::init_bitmap() std::string language = config->get("language"); if (m_obj) { - std::string img_str = DeviceManager::get_printer_diagram_img(m_obj->printer_type); + std::string img_str = DevPrinterConfigUtil::get_printer_connect_help_img(m_obj->printer_type); if(img_str.empty()){img_str = "input_access_code_x1"; } if (language == "zh_CN") { @@ -181,7 +183,7 @@ void ConnectPrinterDialog::on_button_confirm(wxCommandEvent &event) if (m_obj) { m_obj->set_user_access_code(code.ToStdString()); if (m_need_connect) { - wxGetApp().getDeviceManager()->set_selected_machine(m_obj->dev_id); + wxGetApp().getDeviceManager()->set_selected_machine(m_obj->get_dev_id()); } } EndModal(wxID_OK); diff --git a/src/slic3r/GUI/DeviceCore/CMakeLists.txt b/src/slic3r/GUI/DeviceCore/CMakeLists.txt new file mode 100644 index 0000000000..caa29364ed --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/CMakeLists.txt @@ -0,0 +1,52 @@ +# GUI/DeviceCore +# usage -- none GUI structure about device +# date -- 2025.07.14 +# status -- Building + +list(APPEND SLIC3R_GUI_SOURCES + GUI/DeviceCore/DevBed.cpp + GUI/DeviceCore/DevBed.h + GUI/DeviceCore/DevConfig.h + GUI/DeviceCore/DevConfig.cpp + GUI/DeviceCore/DevConfigUtil.h + GUI/DeviceCore/DevConfigUtil.cpp + GUI/DeviceCore/DevCtrl.h + GUI/DeviceCore/DevCtrl.cpp + GUI/DeviceCore/DevDefs.h + GUI/DeviceCore/DevExtruderSystem.h + GUI/DeviceCore/DevExtruderSystem.cpp + GUI/DeviceCore/DevExtruderSystemCtrl.cpp + GUI/DeviceCore/DevFan.cpp + GUI/DeviceCore/DevFan.h + GUI/DeviceCore/DevFilaAmsSetting.h + GUI/DeviceCore/DevFilaAmsSetting.cpp + GUI/DeviceCore/DevFilaBlackList.h + GUI/DeviceCore/DevFilaBlackList.cpp + GUI/DeviceCore/DevFilaSystem.h + GUI/DeviceCore/DevFilaSystem.cpp + GUI/DeviceCore/DevFirmware.h + GUI/DeviceCore/DevFirmware.cpp + GUI/DeviceCore/DevPrintOptions.h + GUI/DeviceCore/DevPrintOptions.cpp + GUI/DeviceCore/DevPrintTaskInfo.h + GUI/DeviceCore/DevPrintTaskInfo.cpp + GUI/DeviceCore/DevHMS.h + GUI/DeviceCore/DevHMS.cpp + GUI/DeviceCore/DevStorage.h + GUI/DeviceCore/DevStorage.cpp + GUI/DeviceCore/DevInfo.h + GUI/DeviceCore/DevInfo.cpp + GUI/DeviceCore/DevLamp.h + GUI/DeviceCore/DevLamp.cpp + GUI/DeviceCore/DevLampCtrl.cpp + GUI/DeviceCore/DevManager.h + GUI/DeviceCore/DevManager.cpp + GUI/DeviceCore/DevMapping.h + GUI/DeviceCore/DevMapping.cpp + GUI/DeviceCore/DevNozzleSystem.h + GUI/DeviceCore/DevNozzleSystem.cpp + GUI/DeviceCore/DevUtil.h + GUI/DeviceCore/DevUtil.cpp + +) +set(SLIC3R_GUI_SOURCES ${SLIC3R_GUI_SOURCES} PARENT_SCOPE) \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevBed.cpp b/src/slic3r/GUI/DeviceCore/DevBed.cpp new file mode 100644 index 0000000000..09fd553159 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevBed.cpp @@ -0,0 +1,25 @@ +#include "DevBed.h" +#include "slic3r/GUI/DeviceManager.hpp" + +namespace Slic3r { + +void DevBed::ParseV1_0(const json &print_json, DevBed *system) +{ + if (print_json.contains("bed_temper")) { + if (print_json["bed_temper"].is_number()) { system->bed_temp = print_json["bed_temper"].get(); } + } + if (print_json.contains("bed_target_temper")) { + if (print_json["bed_target_temper"].is_number()) { system->bed_temp_target = print_json["bed_target_temper"].get(); } + } +} + +void DevBed::ParseV2_0(const json &print_json, DevBed *system) +{ + if (print_json.contains("bed_temp") && print_json["bed_temp"].is_number()) { + int bed_temp_bits = print_json["bed_temp"].get(); + system->bed_temp = system->m_owner->get_flag_bits(bed_temp_bits, 0, 16); + system->bed_temp_target = system->m_owner->get_flag_bits(bed_temp_bits, 16, 16); + } +} + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevBed.h b/src/slic3r/GUI/DeviceCore/DevBed.h new file mode 100644 index 0000000000..dcdb698449 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevBed.h @@ -0,0 +1,30 @@ +#pragma once +#include +#include "slic3r/Utils/json_diff.hpp" + +namespace Slic3r { + +class MachineObject; + +class DevBed +{ +public: + DevBed(MachineObject *obj) : m_owner(obj), bed_temp(0.0f), bed_temp_target(0.0f) {} + + float GetBedTemp() { return bed_temp; }; + float GetBedTempTarget() { return bed_temp_target; }; + +public: + + static void ParseV1_0(const json &print_json, DevBed *system); + static void ParseV2_0(const json &print_json, DevBed *system); + +private: + + float bed_temp; + float bed_temp_target; + + MachineObject* m_owner = nullptr; +}; + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevConfig.cpp b/src/slic3r/GUI/DeviceCore/DevConfig.cpp new file mode 100644 index 0000000000..0ec43fa44d --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevConfig.cpp @@ -0,0 +1,54 @@ +#include + +#include "DevConfig.h" +#include "DevUtil.h" + +using namespace nlohmann; + +namespace Slic3r +{ + +void DevConfig::ParseConfig(const json& print_json) +{ + ParseChamberConfig(print_json); + ParsePrintOptionsConfig(print_json); + ParseCalibrationConfig(print_json); + +} + +void DevConfig::ParseChamberConfig(const json& print_json) +{ + DevJsonValParser::ParseVal(print_json, "support_chamber_temp_edit", m_support_chamber_edit); + if (m_support_chamber_edit) + { + if (print_json.contains("support_chamber_temp_edit_range")) + { + const auto &support_champer_range = print_json["support_chamber_temp_edit_range"]; + if (support_champer_range.is_array() && support_champer_range.size() > 1) { + m_chamber_temp_edit_min = support_champer_range[0]; + m_chamber_temp_edit_max = support_champer_range[1]; + } + } + + DevJsonValParser::ParseVal(print_json, "support_chamber_temp_switch_heating", m_chamber_temp_switch_heat); + } +} + +void DevConfig::ParsePrintOptionsConfig(const json& print_json) +{ + DevJsonValParser::ParseVal(print_json, "support_first_layer_inspect", m_support_first_layer_inspect); + DevJsonValParser::ParseVal(print_json, "support_save_remote_print_file_to_storage", m_support_save_remote_print_file_to_storage); + DevJsonValParser::ParseVal(print_json, "support_ai_monitoring", m_support_ai_monitor); + DevJsonValParser::ParseVal(print_json, "support_print_without_sd", m_support_print_without_sd); + DevJsonValParser::ParseVal(print_json, "support_print_all", m_support_print_all); +} + +void DevConfig::ParseCalibrationConfig(const json& print_json) +{ + DevJsonValParser::ParseVal(print_json, "support_lidar_calibration", m_support_calibration_lidar); + DevJsonValParser::ParseVal(print_json, "support_nozzle_offset_calibration", m_support_calibration_nozzle_offset); + DevJsonValParser::ParseVal(print_json, "support_high_tempbed_calibration", m_support_calibration_high_temp_bed); + DevJsonValParser::ParseVal(print_json, "support_pa_calibration_auto", m_support_calibration_pa_flow_auto); +} + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevConfig.h b/src/slic3r/GUI/DeviceCore/DevConfig.h new file mode 100644 index 0000000000..cd125c381c --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevConfig.h @@ -0,0 +1,77 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" + +#include "slic3r/Utils/json_diff.hpp" +#include + + +namespace Slic3r +{ + +//Previous definitions +class MachineObject; + + +class DevConfig +{ +public: + DevConfig(MachineObject* obj) : m_obj(obj) {}; + ~DevConfig() = default; + +public: + // chamber + bool SupportChamberEdit() const { return m_support_chamber_edit; } + int GetChamberTempEditMin() const { return m_chamber_temp_edit_min; } + int GetChamberTempEditMax() const { return m_chamber_temp_edit_max; } + int GetChamberTempSwitchHeat() const { return m_chamber_temp_switch_heat; } + + // print options + bool SupportFirstLayerInspect() const { return m_support_first_layer_inspect; } + bool SupportSaveRemotePrintFileToStorage() const { return m_support_save_remote_print_file_to_storage; } + bool SupportAIMonitor() const { return m_support_ai_monitor; } + + bool SupportPrintWithoutSD() const { return m_support_print_without_sd; } + bool SupportPrintAllPlates() const { return m_support_print_all; } + + // calibration options + bool SupportCalibrationLidar() const { return m_support_calibration_lidar; } + bool SupportCalibrationNozzleOffset() const { return m_support_calibration_nozzle_offset; } + bool SupportCalibrationHighTempBed() const { return m_support_calibration_high_temp_bed; } + + bool SupportCalibrationPA_FlowAuto() const { return m_support_calibration_pa_flow_auto; } + +public: + /*Setters*/ + void ParseConfig(const json& print_json); + + void ParseChamberConfig(const json& print_json); // chamber + void ParsePrintOptionsConfig(const json& print_json); // print options + void ParseCalibrationConfig(const json& print_json); //cali + +private: + MachineObject* m_obj; + + /*configure vals*/ + // chamber + bool m_support_chamber_edit = false; + int m_chamber_temp_edit_min = 0; + int m_chamber_temp_edit_max = 60; + int m_chamber_temp_switch_heat = LONG_MAX; /* the min temp to start heating, default to LONG_MAX */ + + // print options + bool m_support_first_layer_inspect = false; + bool m_support_save_remote_print_file_to_storage = false; + bool m_support_ai_monitor = false; + + bool m_support_print_without_sd = false; + bool m_support_print_all = false; + + // calibration options + bool m_support_calibration_lidar = false; + bool m_support_calibration_nozzle_offset = false; + bool m_support_calibration_high_temp_bed = false; // High-temperature Heatbed Calibration + + bool m_support_calibration_pa_flow_auto = false;// PA flow calibration. used in SendPrint +}; + +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp b/src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp new file mode 100644 index 0000000000..f28b64a514 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp @@ -0,0 +1,167 @@ +#include "DevConfigUtil.h" + +#include + +using namespace nlohmann; + +namespace Slic3r +{ + +std::string DevPrinterConfigUtil::m_resource_file_path = ""; + + +std::map DevPrinterConfigUtil::get_all_model_id_with_name() +{ + { + std::map models; + + wxDir dir(m_resource_file_path + "/printers/"); + if (!dir.IsOpened()) + { + return models; + } + + wxString filename; + std::vector m_files; + bool hasFile = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES); + while (hasFile) + { + m_files.push_back(filename); + hasFile = dir.GetNext(&filename); + } + + for (wxString file : m_files) + { + if (!file.Lower().ends_with(".json")) continue; + + std::string config_file = m_resource_file_path + "/printers/" + file.ToStdString(); + boost::nowide::ifstream json_file(config_file.c_str()); + + try + { + json jj; + if (json_file.is_open()) + { + json_file >> jj; + if (jj.contains("00.00.00.00")) + { + json const& printer = jj["00.00.00.00"]; + + std::string model_id; + std::string display_name; + if (printer.contains("model_id")) { model_id = printer["model_id"].get(); } + if (printer.contains("display_name")) { display_name = printer["display_name"].get(); } + models[display_name] = model_id; + } + } + } + catch (...) {} + } + + return models; + } +} + +PrinterArch DevPrinterConfigUtil::get_printer_arch(std::string type_str) +{ + const std::string& arch_str = get_value_from_config(type_str, "printer_arch"); + if (arch_str == "i3") + { + return PrinterArch::ARCH_I3; + } + else if (arch_str == "core_xy") + { + return PrinterArch::ARCH_CORE_XY; + } + + return PrinterArch::ARCH_CORE_XY; +} + +std::string DevPrinterConfigUtil::get_printer_ext_img(const std::string& type_str, int pos) +{ + const auto& vec = get_value_from_config>(type_str, "printer_ext_image"); + return (vec.size() > pos) ? vec[pos] : std::string(); +}; + +std::string DevPrinterConfigUtil::get_fan_text(const std::string& type_str, const std::string& key) +{ + std::vector filaments; + std::string config_file = m_resource_file_path + "/printers/" + type_str + ".json"; + boost::nowide::ifstream json_file(config_file.c_str()); + try + { + json jj; + if (json_file.is_open()) + { + json_file >> jj; + if (jj.contains("00.00.00.00")) + { + json const& printer = jj["00.00.00.00"]; + if (printer.contains("fan") && printer["fan"].contains(key)) + { + return printer["fan"][key].get(); + } + } + } + } + catch (...) {} + return std::string(); +} + +std::map> DevPrinterConfigUtil::get_all_subseries(std::string type_str) +{ + std::map> subseries; + std::vector m_files; + + wxDir dir(m_resource_file_path + "/printers/"); + if (!dir.IsOpened()) { return subseries; } + + wxString filename; + bool hasFile = dir.GetFirst(&filename, "*.json", wxDIR_FILES); + while (hasFile) + { + m_files.push_back(filename); + hasFile = dir.GetNext(&filename); + } + + for (wxString file : m_files) + { + std::string config_file = m_resource_file_path + "/printers/" + file.ToStdString(); + boost::nowide::ifstream json_file(config_file.c_str()); + + try + { + json jj; + if (json_file.is_open()) + { + json_file >> jj; + if (jj.contains("00.00.00.00")) + { + + json const& printer = jj["00.00.00.00"]; + if (printer.contains("subseries")) + { + std::vector subs; + + std::string model_id = printer["model_id"].get(); + if (model_id == type_str || type_str.empty()) + { + for (auto res : printer["subseries"]) + { + subs.emplace_back(res.get()); + } + } + subseries.insert(make_pair(model_id, subs)); + } + + + } + } + } + catch (...) {} + } + + return subseries; +} + +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevConfigUtil.h b/src/slic3r/GUI/DeviceCore/DevConfigUtil.h new file mode 100644 index 0000000000..e1b4fa2fd1 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevConfigUtil.h @@ -0,0 +1,174 @@ +/** +* @file DevConfigUtil.h +* @brief Parses configuration files and provides access to printer options. +* +* This class loads a configuration file and allows querying options by key. +* The configuration file format is expected to be key-value pairs (e.g., INI or simple text). +*/ + +#pragma once + +#include +#include +#include + +#include +#include + +#include + +#include "slic3r/GUI/DeviceCore/DevDefs.h" + +namespace Slic3r +{ + +class dePrinterConfigFactory +{ +public: + dePrinterConfigFactory() = default; + ~dePrinterConfigFactory() = default; +}; + + +class DevPrinterConfigUtil +{ +public: + DevPrinterConfigUtil() = default; + ~DevPrinterConfigUtil() = default; + +public: + static void InitFilePath(const std::string& res_file_path) { m_resource_file_path = res_file_path; }; + + /*printer*/ + // info + static std::map get_all_model_id_with_name(); + static std::string get_printer_type(const std::string& type_str) { return get_value_from_config(type_str, "printer_type"); } + static std::string get_printer_display_name(const std::string& type_str) { return get_value_from_config(type_str, "display_name"); } + static std::string get_printer_series_str(std::string type_str) { return get_value_from_config(type_str, "printer_series"); } + static PrinterArch get_printer_arch(std::string type_str); + + // images + static std::string get_printer_thumbnail_img(const std::string& type_str) { return get_value_from_config(type_str, "printer_thumbnail_image"); } + static std::string get_printer_connect_help_img(const std::string& type_str) { return get_value_from_config(type_str, "printer_connect_help_image"); } + static std::string get_printer_auto_pa_cali_image(const std::string& type_str) { return get_value_from_config(type_str, "auto_pa_cali_thumbnail_image"); } + + /*media*/ + static std::string get_ftp_folder(std::string type_str) { return get_value_from_config(type_str, "ftp_folder"); } + static std::vector get_resolution_supported(std::string type_str) { return get_value_from_config>(type_str, "camera_resolution"); } + static std::vector get_compatible_machine(std::string type_str) { return get_value_from_config>(type_str, "compatible_machine"); } + static std::map> get_all_subseries(std::string type_str = ""); + + /*ams*/ + static std::string get_printer_use_ams_type(std::string type_str) { return get_value_from_config(type_str, "use_ams_type"); } + static std::string get_printer_ams_img(const std::string& type_str) { return get_value_from_config(type_str, "printer_use_ams_image"); } + static std::string get_printer_ext_img(const std::string& type_str, int pos);//printer_ext_image + + /*fan*/ + static std::string get_fan_text(const std::string& type_str, const std::string& key); + + /*extruder*/ + static bool get_printer_can_set_nozzle(std::string type_str) { return get_value_from_config(type_str, "enable_set_nozzle_info"); }// can set nozzle from studio + + /*calibration*/ + static std::vector get_unsupport_auto_cali_filaments(std::string type_str) { return get_value_from_config>(type_str, "auto_cali_not_support_filaments"); } + + /*detection*/ + static bool support_wrapping_detection(const std::string& type_str) { return get_value_from_config(type_str, "support_wrapping_deteciton"); } + +public: + template + static T get_value_from_config(const std::string& type_str, const std::string& item) + { + std::string config_file = m_resource_file_path + "/printers/" + type_str + ".json"; + boost::nowide::ifstream json_file(config_file.c_str()); + try + { + nlohmann::json jj; + if (json_file.is_open()) + { + json_file >> jj; + if (jj.contains("00.00.00.00")) + { + nlohmann::json const& printer = jj["00.00.00.00"]; + if (printer.contains(item)) + { + return printer[item].get(); + } + } + } + } + catch (...) { assert(0 && "get_value_from_config failed"); BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " failed"; }// there are file errors + return T(); + }; + + static nlohmann::json get_json_from_config(const std::string& type_str, const std::string& key1, const std::string& key2 = std::string()) + { + std::string config_file = m_resource_file_path + "/printers/" + type_str + ".json"; + boost::nowide::ifstream json_file(config_file.c_str()); + try + { + nlohmann::json jj; + if (json_file.is_open()) + { + json_file >> jj; + if (jj.contains("00.00.00.00")) + { + nlohmann::json const& printer = jj["00.00.00.00"]; + if (printer.contains(key1)) + { + nlohmann::json const& key1_item = printer[key1]; + if (key2.empty()) + { + return key1_item; + } + + if (key1_item.contains(key2)) + { + return key1_item[key2]; + } + } + } + } + } + catch (...) { assert(0 && "get_json_from_config failed"); BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " failed"; }// there are file errors + return nlohmann::json(); + } + +private: + static std::string m_resource_file_path; // Path to the configuration file +}; + +/*special transform*/ +static std::string _parse_printer_type(const std::string& type_str) +{ + if (type_str.compare("3DPrinter-X1") == 0) + { + return "BL-P002"; + } + else if (type_str.compare("3DPrinter-X1-Carbon") == 0) + { + return "BL-P001"; + } + else if (type_str.compare("BL-P001") == 0) + { + return type_str; + } + else if (type_str.compare("BL-P002") == 0) + { + return type_str; + } + else + { + std::string result = DevPrinterConfigUtil::get_printer_type(type_str); + if (!result.empty()) + { + return result; + } + } + + assert(0 && __FUNCTION__); + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " Unsupported printer type: " << type_str; + return type_str; +} + +};// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevCtrl.cpp b/src/slic3r/GUI/DeviceCore/DevCtrl.cpp new file mode 100644 index 0000000000..e3a162ac7a --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevCtrl.cpp @@ -0,0 +1,26 @@ +#include +#include "DevCtrl.h" + +// TODO: remove this include +#include "DevUtil.h" +#include "slic3r/GUI/DeviceManager.hpp" + +using namespace nlohmann; + +namespace Slic3r +{ + int DevCtrl::command_select_extruder(int id) + { + json j; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["command"] = "select_extruder"; + j["print"]["extruder_index"] = id; + int rtn = m_obj->publish_json(j, 1); + if (rtn == 0) + { + m_obj->targ_nozzle_id_from_pc = id; + } + + return rtn; + } +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevCtrl.h b/src/slic3r/GUI/DeviceCore/DevCtrl.h new file mode 100644 index 0000000000..686ac0f61c --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevCtrl.h @@ -0,0 +1,26 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" + +#include "slic3r/Utils/json_diff.hpp" +#include + +namespace Slic3r +{ + +//Previous definitions +class MachineObject; + + +class DevCtrl +{ + MachineObject* m_obj; +public: + DevCtrl(MachineObject* obj) : m_obj(obj) {}; + ~DevCtrl() = default; + +public: + /*extruder system*/ + int command_select_extruder(int id); +}; + +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevDefs.h b/src/slic3r/GUI/DeviceCore/DevDefs.h new file mode 100644 index 0000000000..468ed0184a --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevDefs.h @@ -0,0 +1,99 @@ +/** +* @file DevDefs.h +* @brief Common definitions, macros, and constants for printer modules. +* Enhance building and including. +* +* This file provides shared macros, constants, and enumerations for all printer-related +* modules, including printer types, status, binding states, connection types, and error codes. +* It is intended to be included wherever printer-specific definitions are required. +*/ + +#pragma once +#include + +enum PrinterArch +{ + ARCH_CORE_XY, + ARCH_I3, +}; + +enum PrinterSeries +{ + SERIES_X1 = 0, + SERIES_P1P, + SERIES_UNKNOWN, +}; + +namespace Slic3r +{ + +/*AMS*/ +enum AmsStatusMain +{ + AMS_STATUS_MAIN_IDLE = 0x00, + AMS_STATUS_MAIN_FILAMENT_CHANGE = 0x01, + AMS_STATUS_MAIN_RFID_IDENTIFYING = 0x02, + AMS_STATUS_MAIN_ASSIST = 0x03, + AMS_STATUS_MAIN_CALIBRATION = 0x04, + AMS_STATUS_MAIN_SELF_CHECK = 0x10, + AMS_STATUS_MAIN_DEBUG = 0x20, + AMS_STATUS_MAIN_UNKNOWN = 0xFF, +}; + +// Slots and Tray +#define VIRTUAL_TRAY_MAIN_ID 255 +#define VIRTUAL_TRAY_DEPUTY_ID 254 + +#define VIRTUAL_AMS_MAIN_ID_STR "255" +#define VIRTUAL_AMS_DEPUTY_ID_STR "254" + +#define INVALID_AMS_TEMPERATURE std::numeric_limits::min() + +/* Extruder*/ +#define MAIN_EXTRUDER_ID 0 +#define DEPUTY_EXTRUDER_ID 1 +#define UNIQUE_EXTRUDER_ID MAIN_EXTRUDER_ID +#define INVALID_EXTRUDER_ID -1 + + +/* Nozzle*/ +enum NozzleFlowType +{ + NONE_FLOWTYPE, + S_FLOW, + H_FLOW +}; + +/*Print speed*/ +enum DevPrintingSpeedLevel +{ + SPEED_LEVEL_INVALID = 0, + SPEED_LEVEL_SILENCE = 1, + SPEED_LEVEL_NORMAL = 2, + SPEED_LEVEL_RAPID = 3, + SPEED_LEVEL_RAMPAGE = 4, + SPEED_LEVEL_COUNT +}; + +/*Upgrade*/ +enum class DevFirmwareUpgradingState : int +{ + DC = -1, + UpgradingUnavaliable = 0, + UpgradingAvaliable = 1, + UpgradingInProgress = 2, + UpgradingFinished = 3 +}; + +class devPrinterUtil +{ +public: + devPrinterUtil() = delete; + ~devPrinterUtil() = delete; + +public: + static bool IsVirtualSlot(int ams_id) { return (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID);} + static bool IsVirtualSlot(const std::string& ams_id) { return (ams_id == VIRTUAL_AMS_MAIN_ID_STR || ams_id == VIRTUAL_AMS_DEPUTY_ID_STR); } +}; + +};// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp b/src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp new file mode 100644 index 0000000000..bb07b6b888 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp @@ -0,0 +1,287 @@ +#include +#include "DevExtruderSystem.h" +#include "DevNozzleSystem.h" + +// TODO: remove this include +#include "slic3r/GUI/DeviceManager.hpp" +#include "slic3r/GUI/I18N.hpp" + +#include "DevUtil.h" + +using namespace nlohmann; + +namespace Slic3r +{ + wxString DevExtder::GetDisplayLoc() const + { + if (system->GetTotalExtderCount() == 2) + { + if (m_ext_id == MAIN_EXTRUDER_ID) + { + return _L("right"); + } + else + { + return _L("left"); + } + } + + return wxEmptyString; + } + + wxString DevExtder::GetDisplayName() const + { + if (system->GetTotalExtderCount() == 2) + { + if (m_ext_id == MAIN_EXTRUDER_ID) + { + return _L("right extruder"); + } + else + { + return _L("left extruder"); + } + } + + return _L("extruder"); + } + + NozzleType DevExtder::GetNozzleType() const + { + return system->Owner()->GetNozzleSystem()->GetNozzle(m_current_nozzle_id).m_nozzle_type; + } + + NozzleFlowType DevExtder::GetNozzleFlowType() const + { + return system->Owner()->GetNozzleSystem()->GetNozzle(m_current_nozzle_id).m_nozzle_flow; + } + + float DevExtder::GetNozzleDiameter() const + { + return system->Owner()->GetNozzleSystem()->GetNozzle(m_current_nozzle_id).m_diameter; + } + + DevExtderSystem::DevExtderSystem(MachineObject* obj) + : m_owner(obj) + { + // default to have one extruder + m_total_extder_count = 1; + DevExtder ext(this, MAIN_EXTRUDER_ID); + m_extders.emplace_back(ext); + } + + bool DevExtderSystem::CanQuitSwitching() const + { + if (!IsSwitchingFailed()) + { + return false; + } + return !m_owner->is_in_printing() && !m_owner->is_in_printing_pause(); + } + + std::optional DevExtderSystem::GetCurrentExtder() const + { + return GetExtderById(m_current_extder_id); + } + + std::optional DevExtderSystem::GetLoadingExtder() const + { + if (m_current_loading_extder_id != INVALID_EXTRUDER_ID) + { + return GetExtderById(m_current_loading_extder_id); + } + + return std::nullopt; + } + + std::optional DevExtderSystem::GetExtderById(int extder_id) const + { + if (extder_id >= m_extders.size()) + { + assert(false && "Invalid extruder ID"); + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "No extruder found for " << extder_id; + return std::nullopt; + } + + return m_extders[extder_id]; + } + + std::string DevExtderSystem::GetCurrentAmsId() const + { + auto cur_extder = GetCurrentExtder(); + return cur_extder ? cur_extder->GetSlotNow().ams_id : DevAmsSlotInfo().ams_id; + } + + std::string DevExtderSystem::GetCurrentSlotId() const + { + auto cur_extder = GetCurrentExtder(); + return cur_extder ? GetCurrentExtder()->GetSlotNow().slot_id : DevAmsSlotInfo().slot_id; + } + + std::string DevExtderSystem::GetTargetAmsId() const + { + auto cur_extder = GetCurrentExtder(); + return cur_extder ? GetCurrentExtder()->GetSlotTarget().ams_id : DevAmsSlotInfo().ams_id; + } + + std::string DevExtderSystem::GetTargetSlotId() const + { + auto cur_extder = GetCurrentExtder(); + return cur_extder ? GetCurrentExtder()->GetSlotTarget().slot_id : DevAmsSlotInfo().slot_id; + } + + bool DevExtderSystem::HasFilamentBackup() const + { + for (const auto& ext : m_extders) + { + if (ext.HasFilamBackup()) + { + return true; + } + } + + return false; + } + + void ExtderSystemParser::ParseV1_0(const nlohmann::json& print_json, DevExtderSystem* system) + { + if (system->GetTotalExtderCount() != 1) + { + return; + } + + if (print_json.contains("nozzle_temper") && print_json["nozzle_temper"].is_number()) + { + system->m_extders[MAIN_EXTRUDER_ID].m_cur_temp = print_json["nozzle_temper"].get(); + } + + if (print_json.contains("nozzle_target_temper") && print_json["nozzle_target_temper"].is_number()) + { + system->m_extders[MAIN_EXTRUDER_ID].m_target_temp = print_json["nozzle_target_temper"].get(); + } + + if (print_json.contains("ams") && print_json["ams"].contains("tray_tar")) + { + const std::string& tray_tar = print_json["ams"]["tray_tar"].get(); + if (!tray_tar.empty()) + { + int tray_tar_int = atoi(tray_tar.c_str()); + if (tray_tar_int == VIRTUAL_TRAY_MAIN_ID || tray_tar_int == VIRTUAL_TRAY_DEPUTY_ID) + { + system->m_extders[MAIN_EXTRUDER_ID].m_star.ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); + system->m_extders[MAIN_EXTRUDER_ID].m_star.slot_id = "0"; + } + else + { + if (tray_tar_int >= 0x80 && tray_tar_int <= 0x87) + { + system->m_extders[MAIN_EXTRUDER_ID].m_star.ams_id = std::to_string(tray_tar_int); + } + else + { + system->m_extders[MAIN_EXTRUDER_ID].m_star.ams_id = std::to_string(tray_tar_int >> 2); + } + + system->m_extders[MAIN_EXTRUDER_ID].m_star.slot_id = std::to_string(tray_tar_int & 0x3); + } + } + } + + if (print_json.contains("ams") && print_json["ams"].contains("tray_now")) + { + const std::string& tray_now = print_json["ams"]["tray_now"].get(); + if (!tray_now.empty()) + { + int tray_now_int = atoi(tray_now.c_str()); + if (tray_now_int == VIRTUAL_TRAY_MAIN_ID || tray_now_int == VIRTUAL_TRAY_DEPUTY_ID) + { + system->m_extders[MAIN_EXTRUDER_ID].m_snow.ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); + system->m_extders[MAIN_EXTRUDER_ID].m_snow.slot_id = "0"; + } + else + { + if (tray_now_int >= 0x80 && tray_now_int <= 0x87) + { + system->m_extders[MAIN_EXTRUDER_ID].m_snow.ams_id = std::to_string(tray_now_int); + } + else + { + system->m_extders[MAIN_EXTRUDER_ID].m_snow.ams_id = std::to_string(tray_now_int >> 2); + } + + system->m_extders[MAIN_EXTRUDER_ID].m_snow.slot_id = std::to_string(tray_now_int & 0x3); + } + } + } + + system->m_current_busy_for_loading = false; + system->m_current_loading_extder_id = INVALID_EXTRUDER_ID; + if (!system->m_extders[MAIN_EXTRUDER_ID].m_star.ams_id.empty()) + { + system->m_current_busy_for_loading = (system->m_extders[MAIN_EXTRUDER_ID].m_snow == system->m_extders[MAIN_EXTRUDER_ID].m_star); + if (system->m_current_busy_for_loading) + { + system->m_current_loading_extder_id = MAIN_EXTRUDER_ID; + } + } + } + + void ExtderSystemParser::ParseV2_0(const nlohmann::json& extruder_json, DevExtderSystem* system) + { + system->m_total_extder_count = DevUtil::get_flag_bits(extruder_json["state"].get(), 0, 4); + if (system->m_current_extder_id != DevUtil::get_flag_bits(extruder_json["state"].get(), 4, 4)) + { + system->Owner()->targ_nozzle_id_from_pc = INVALID_EXTRUDER_ID; + system->m_current_extder_id = DevUtil::get_flag_bits(extruder_json["state"].get(), 4, 4); + } + else if (system->m_switch_extder_state == ES_SWITCHING_FAILED) + { + system->Owner()->targ_nozzle_id_from_pc = INVALID_EXTRUDER_ID; + } + + system->m_target_extder_id = DevUtil::get_flag_bits(extruder_json["state"].get(), 8, 4); + system->m_switch_extder_state = (DevExtderSwitchState)DevUtil::get_flag_bits(extruder_json["state"].get(), 12, 3); + system->m_current_loading_extder_id = DevUtil::get_flag_bits(extruder_json["state"].get(), 15, 4); + system->m_current_busy_for_loading = DevUtil::get_flag_bits(extruder_json["state"].get(), 19); + + system->m_extders.clear(); + for (auto it = extruder_json["info"].begin(); it != extruder_json["info"].cend(); it++) + { + + DevExtder extder_obj(system); + + const auto& njon = it.value(); + extder_obj.SetExtId(njon["id"].get()); + + extder_obj.m_filam_bak.clear(); + const json& filam_bak_items = njon["filam_bak"]; + for (const auto& filam_bak_item : filam_bak_items) + { + const auto& filam_bak_val = filam_bak_item.get(); + extder_obj.m_filam_bak.emplace_back(filam_bak_val); + } + + extder_obj.m_ext_has_filament = (DevUtil::get_flag_bits(njon["info"].get(), 1) != 0); + extder_obj.m_buffer_has_filament = (DevUtil::get_flag_bits(njon["info"].get(), 2) != 0); + extder_obj.m_has_nozzle = (DevUtil::get_flag_bits(njon["info"].get(), 3) != 0); + extder_obj.m_cur_temp = DevUtil::get_flag_bits(njon["temp"].get(), 0, 16); + extder_obj.m_target_temp = DevUtil::get_flag_bits(njon["temp"].get(), 16, 16); + + extder_obj.m_spre.slot_id = std::to_string(DevUtil::get_flag_bits(njon["spre"].get(), 0, 8)); + extder_obj.m_spre.ams_id = std::to_string(DevUtil::get_flag_bits(njon["spre"].get(), 8, 8)); + + extder_obj.m_snow.slot_id = std::to_string(DevUtil::get_flag_bits(njon["snow"].get(), 0, 8)); + extder_obj.m_snow.ams_id = std::to_string(DevUtil::get_flag_bits(njon["snow"].get(), 8, 8)); + + extder_obj.m_star.slot_id = std::to_string(DevUtil::get_flag_bits(njon["star"].get(), 0, 8)); + extder_obj.m_star.ams_id = std::to_string(DevUtil::get_flag_bits(njon["star"].get(), 8, 8)); + + extder_obj.m_ams_stat = DevUtil::get_flag_bits(njon["stat"].get(), 0, 16); + extder_obj.m_rfid_stat = DevUtil::get_flag_bits(njon["stat"].get(), 16, 16); + + //current nozzle info + extder_obj.m_current_nozzle_id = njon["hnow"].get(); + system->m_extders.push_back(extder_obj); + } + } +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevExtruderSystem.h b/src/slic3r/GUI/DeviceCore/DevExtruderSystem.h new file mode 100644 index 0000000000..1f7ca6bd84 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevExtruderSystem.h @@ -0,0 +1,189 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" + +#include "slic3r/Utils/json_diff.hpp" +#include + +#include "DevDefs.h" + +namespace Slic3r +{ + +//Previous definitions +class MachineObject; +class DevExtderSystem; + +struct DevAmsSlotInfo +{ + std::string ams_id; + std::string slot_id; + +public: + bool operator==(const DevAmsSlotInfo& other) const { return ams_id == other.ams_id && slot_id == other.slot_id;} +}; + +enum DevExtderSwitchState +{ + ES_IDLE = 0, + ES_BUSY, + ES_SWITCHING, + ES_SWITCHING_FAILED +}; + +class DevExtder +{ + friend class MachineObject; + friend class ExtderSystemParser; +public: + DevExtder(DevExtderSystem* owner/*should not be nullptr*/, int id = -1) : system(owner), m_ext_id(id){}; + +public: + // Ext + int GetExtId() const { return m_ext_id; } + + // display + wxString GetDisplayLoc() const; + wxString GetDisplayName() const; + + // installed nozzle info + bool HasNozzleInstalled() const = delete;//{ return m_has_nozzle; } + + int GetNozzleId() const { return m_current_nozzle_id; } + int GetTargetNozzleId() const = delete;//{ return m_target_nozzle_id; } + NozzleType GetNozzleType() const; + NozzleFlowType GetNozzleFlowType() const; + float GetNozzleDiameter() const; + + // temperature + int GetCurrentTemp() const { return m_cur_temp; } + int GetTargetTemp() const { return m_target_temp; } + + // filament + bool HasFilamentInExt() const { return m_ext_has_filament; } + bool HasFilamentInBuffer() const = delete; //{ return m_buffer_has_filament; } + bool HasFilamBackup() const { return !m_filam_bak.empty(); } + std::vector GetFilamBackup() const { return m_filam_bak; } + + // ams binding on current extruder + const DevAmsSlotInfo& GetSlotPre() const { return m_spre; } + const DevAmsSlotInfo& GetSlotNow() const { return m_snow; } + const DevAmsSlotInfo& GetSlotTarget() const { return m_star; } + +private: + void SetExtId(int val) { m_ext_id = val; } + +private: + DevExtderSystem* system = nullptr; + + // extruder id + int m_ext_id; // 0-right 1-left + + // current nozzle + bool m_has_nozzle = false; + int m_current_nozzle_id = 0; // nozzle id now. for some machine, the extruder may have serveral nozzles + int m_target_nozzle_id = 0; // target nozzle id + + // temperature + int m_cur_temp = 0; + int m_target_temp = 0; + + // filament + bool m_ext_has_filament = false; + bool m_buffer_has_filament = false; + std::vector m_filam_bak;// the refill filam + + // binded ams + DevAmsSlotInfo m_spre; // tray_pre + DevAmsSlotInfo m_snow; // tray_now + DevAmsSlotInfo m_star; // tray_tar + + int m_ams_stat = 0; + int m_rfid_stat = 0; +}; + +// ExtderSystem is the extruder management system for the device. +// It consists of multiple extruders (Extder) and nozzles. +// Each extruder can be associated with different nozzles, and the number of extruders +// does not necessarily equal the number of nozzles. +// Note: The IDs of extruders and nozzles may not match or correspond one-to-one. +class DevExtderSystem +{ + friend class MachineObject; + friend class ExtderSystemParser; +public: + DevExtderSystem(MachineObject* obj); + ~DevExtderSystem() = default; + +public: + MachineObject* Owner() const { return m_owner; } + + // access extder info + int GetTotalExtderCount() const { assert(m_extders.size() == m_total_extder_count); return m_total_extder_count; } + int GetTotalExtderSize() const { return static_cast(m_extders.size()); } + int GetCurrentExtderId() const { return m_current_extder_id; } + int GetTargetExtderId() const = delete;//{ return m_target_extder_id; } + + // switching + DevExtderSwitchState GetSwitchState() const { return m_switch_extder_state; } + bool IsSwitching() const { return m_switch_extder_state == DevExtderSwitchState::ES_SWITCHING;}; + bool IsSwitchingFailed() const { return m_switch_extder_state == DevExtderSwitchState::ES_SWITCHING_FAILED; }; + bool CanQuitSwitching() const; + bool CanRetrySwitching() const { return IsSwitchingFailed(); }; + + int CtrlRetrySwitching(); + int CtrlQuitSwitching(); + + std::optional GetCurrentExtder() const; + std::optional GetLoadingExtder() const; + std::optional GetExtderById(int extder_id) const; + const std::vector& GetExtruders() const { return m_extders;}; + + // get nozzle info which is installed on the extruder + NozzleType GetNozzleType(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetNozzleType() : NozzleType::ntUndefine; } + NozzleFlowType GetNozzleFlowType(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetNozzleFlowType() : NozzleFlowType::NONE_FLOWTYPE;; } + float GetNozzleDiameter(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetNozzleDiameter() : 0.0; } + int GetNozzleTempCurrent(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetCurrentTemp() : 0; } + int GetNozzleTempTarget(int extder_id) const { return GetExtderById(extder_id) ? GetExtderById(extder_id)->GetTargetTemp() : 0; } + + // get slot info which is connected to the extruder + std::string GetCurrentAmsId() const; + std::string GetCurrentSlotId() const; + std::string GetTargetAmsId() const; + std::string GetTargetSlotId() const; + + // filament + bool IsBusyLoading() const { return m_current_busy_for_loading; } + int GetLoadingExtderId() const { return m_current_loading_extder_id; } + bool HasFilamentBackup() const; + bool HasFilamentInExt(int exter_id) { return GetExtderById(exter_id) ? GetExtderById(exter_id)->HasFilamentInExt() : false; } + +protected: + void AddExtder(const DevExtder& ext) { m_extders[ext.GetExtId()] = ext; }; + +private: + MachineObject* m_owner = nullptr; + + // extruders + int m_total_extder_count = 1; + std::vector m_extders; + + // current extruder and swtching info + int m_current_extder_id = MAIN_EXTRUDER_ID; + + // switching + DevExtderSwitchState m_switch_extder_state = DevExtderSwitchState::ES_IDLE; + int m_target_extder_id = MAIN_EXTRUDER_ID; + + // loading extruder + bool m_current_busy_for_loading{ false }; + int m_current_loading_extder_id = INVALID_EXTRUDER_ID; +}; + +class ExtderSystemParser +{ +public: + static void ParseV1_0(const nlohmann::json& extruder_json, DevExtderSystem* system); + static void ParseV2_0(const nlohmann::json& extruder_json, DevExtderSystem* system); +}; + +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp b/src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp new file mode 100644 index 0000000000..38513a2274 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp @@ -0,0 +1,22 @@ +#include +#include "DevExtruderSystem.h" + +#include "slic3r/GUI/DeviceManager.hpp" + + +using namespace nlohmann; + +namespace Slic3r +{ + int DevExtderSystem::CtrlRetrySwitching() + { + if (m_owner) { return m_owner->command_ams_control("resume"); } + return -1; + } + + int DevExtderSystem::CtrlQuitSwitching() + { + if (m_owner) { return m_owner->command_ams_control("abort"); } + return -1; + } +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFan.cpp b/src/slic3r/GUI/DeviceCore/DevFan.cpp new file mode 100644 index 0000000000..f6b0fb904c --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFan.cpp @@ -0,0 +1,219 @@ +#include +#include "DevFan.h" +#include +#include "slic3r/GUI/DeviceManager.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +using namespace nlohmann; + +void Slic3r::DevFan::converse_to_duct(bool is_suppt_part_fun, bool is_suppt_aux_fun, bool is_suppt_cham_fun) +{ + m_air_duct_data.modes.clear(); + m_air_duct_data.parts.clear(); + m_air_duct_data.curren_mode = -1; // def mode + + if (is_suppt_part_fun) { + AirParts part_fan; + part_fan.type = int(AirDuctType::AIR_FAN_TYPE); + part_fan.id = int(AIR_FUN::FAN_COOLING_0_AIRDOOR); + part_fan.func = int(AIR_FUN::FAN_COOLING_0_AIRDOOR); + part_fan.state = 0; + part_fan.range_start = 0; + part_fan.range_end = 100; + m_air_duct_data.parts.push_back(part_fan); + } + + if (is_suppt_aux_fun) { + AirParts aux_fan; + aux_fan.type = int(AirDuctType::AIR_FAN_TYPE); + aux_fan.id = int(AIR_FUN::FAN_REMOTE_COOLING_0_IDX); + aux_fan.func = int(AIR_FUN::FAN_REMOTE_COOLING_0_IDX); + aux_fan.state = 0; + aux_fan.range_start = 0; + aux_fan.range_end = 100; + m_air_duct_data.parts.push_back(aux_fan); + } + + if (is_suppt_aux_fun) { + AirParts chamber_fan; + chamber_fan.type = int(AirDuctType::AIR_FAN_TYPE); + chamber_fan.id = int(AIR_FUN::FAN_CHAMBER_0_IDX); + chamber_fan.func = int(AIR_FUN::FAN_CHAMBER_0_IDX); + chamber_fan.state = 0; + chamber_fan.range_start = 0; + chamber_fan.range_end = 100; + m_air_duct_data.parts.push_back(chamber_fan); + } +} + +static std::string _get_string_from_fantype(int type) +{ + switch (type) { + case 1: return "cooling_fan"; + case 2: return "big_cooling_fan"; + case 3: return "chamber_fan"; + default: return ""; + } + return ""; +} + +// Old protocol +int Slic3r::DevFan::command_control_fan(int fan_type, int val) +{ + std::string gcode = (boost::format("M106 P%1% S%2% \n") % (int) fan_type % (val)).str(); + return m_owner->publish_gcode(gcode); +} + +// New protocol +int Slic3r::DevFan::command_control_fan_new(int fan_id, int val) +{ + BOOST_LOG_TRIVIAL(info) << "New protocol of fan setting(set speed), fan_id = " << fan_id; + json j; + j["print"]["command"] = "set_fan"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["fan_index"] = fan_id; + + j["print"]["speed"] = val; + BOOST_LOG_TRIVIAL(info) << "MachineObject::command_control_fan_val, set the speed of fan, fan_id = " << fan_id; + return m_owner->publish_json(j); +} + + +int Slic3r::DevFan::command_handle_response(const json &response) +{ + if (!response.contains("sequence_id")) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ", error reponse."; + return -1; + } + + std::string reply = response["sequence_id"].get(); + auto it = m_callback_list.find(reply); + if (it != m_callback_list.end()) { + if (it->second) it->second(response); + m_callback_list.erase(it); + } + return 0; +} + +int Slic3r::DevFan::command_control_air_duct(int mode_id, int submode, const CommandCallBack& cb) +{ + BOOST_LOG_TRIVIAL(info) << "MachineObject::command_control_air_duct, set air duct, d = " << mode_id; + m_callback_list[std::to_string(m_owner->m_sequence_id)] = cb; + json j; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["command"] = "set_airduct"; + j["print"]["modeId"] = mode_id; + j["print"]["submode"] = submode; + + return m_owner->publish_json(j); +} + +void Slic3r::DevFan::ParseV1_0(const json &print_json) +{ + if (print_json.contains("fan_gear")) { + fan_gear = print_json["fan_gear"].get(); + big_fan2_speed = (int) ((fan_gear & 0x00FF0000) >> 16); + big_fan1_speed = (int) ((fan_gear & 0x0000FF00) >> 8); + cooling_fan_speed = (int) ((fan_gear & 0x000000FF) >> 0); + } else { + if (print_json.contains("cooling_fan_speed")) { + cooling_fan_speed = stoi(print_json["cooling_fan_speed"].get()); + cooling_fan_speed = round(floor(cooling_fan_speed / float(1.5)) * float(25.5)); + } else { + cooling_fan_speed = 0; + } + if (print_json.contains("big_fan1_speed")) { + big_fan1_speed = stoi(print_json["big_fan1_speed"].get()); + big_fan1_speed = round(floor(big_fan1_speed / float(1.5)) * float(25.5)); + } else { + big_fan1_speed = 0; + } + if (print_json.contains("big_fan2_speed")) { + big_fan2_speed = stoi(print_json["big_fan2_speed"].get()); + big_fan2_speed = round(floor(big_fan2_speed / float(1.5)) * float(25.5)); + } else { + big_fan2_speed = 0; + } + } + + if (print_json.contains("heatbreak_fan_speed")) { heatbreak_fan_speed = stoi(print_json["heatbreak_fan_speed"].get()); } + + + +} + +void Slic3r::DevFan::ParseV2_0(const json &print_json) { + + if (print_json.contains("support_aux_fan")) { + if (print_json["support_aux_fan"].is_boolean()) + is_support_aux_fan = print_json["support_aux_fan"].get(); + } + + if (print_json.contains("support_chamber_fan")) { + if (print_json["support_chamber_fan"].is_boolean()) + is_support_chamber_fan = print_json["support_chamber_fan"].get(); + } +} + + + + + void Slic3r::DevFan::ParseV3_0(const json &device) +{ + if (device.contains("airduct")) { + m_air_duct_data.curren_mode = -1; + m_air_duct_data.modes.clear(); + m_air_duct_data.parts.clear(); + + m_air_duct_data.curren_mode = device["airduct"]["modeCur"].get(); + + const json &airduct = device["airduct"]; + if (airduct.contains("modeCur")) { m_air_duct_data.curren_mode = airduct["modeCur"].get(); } + if (airduct.contains("subMode")) { m_air_duct_data.m_sub_mode = airduct["subMode"].get(); } + if (airduct.contains("modeList") && airduct["modeList"].is_array()) { + auto list = airduct["modeList"].get>(); + + for (int i = 0; i < list.size(); ++i) { + // only show 2 mode for o + if (m_owner->is_series_o() && i >= 2) { break; } + + json mode_json = list[i]; + AirMode mode; + if (mode_json.contains("modeId")) mode.id = mode_json["modeId"].get(); + if (mode_json.contains("ctrl")) { + for (auto it_mode_ctrl = mode_json["ctrl"].begin(); it_mode_ctrl != mode_json["ctrl"].end(); it_mode_ctrl++) { + mode.ctrl.push_back((*it_mode_ctrl).get() >> 4); + } + } + + if (mode_json.contains("off")) { + for (auto it_mode_off = mode_json["off"].begin(); it_mode_off != mode_json["off"].end(); *it_mode_off++) { + mode.off.push_back((*it_mode_off).get() >> 4); + } + } + + if (AIR_DUCT(mode.id) == AIR_DUCT::AIR_DUCT_EXHAUST) { continue; } /*STUDIO-12796*/ + m_air_duct_data.modes[mode.id] = mode; + } + } + + if (airduct.contains("parts") && airduct["parts"].is_array()) { + for (auto it_part = airduct["parts"].begin(); it_part != airduct["parts"].end(); it_part++) { + int state = (*it_part)["state"].get(); + int range = (*it_part)["range"].get(); + + AirParts part; + part.type = m_owner->get_flag_bits((*it_part)["id"].get(), 0, 4); + part.id = m_owner->get_flag_bits((*it_part)["id"].get(), 4, 9); + part.func = (*it_part)["func"].get(); + part.state = m_owner->get_flag_bits(state, 0, 8); + part.range_start = m_owner->get_flag_bits(range, 0, 16); + part.range_end = m_owner->get_flag_bits(range, 16, 16); + + m_air_duct_data.parts.push_back(part); + } + } + } + + } + diff --git a/src/slic3r/GUI/DeviceCore/DevFan.h b/src/slic3r/GUI/DeviceCore/DevFan.h new file mode 100644 index 0000000000..b3b58d6627 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFan.h @@ -0,0 +1,150 @@ +#pragma once +#include +#include "slic3r/Utils/json_diff.hpp" + +namespace Slic3r { + +class MachineObject; + +enum AirDuctType { AIR_FAN_TYPE, AIR_DOOR_TYPE }; +typedef std::function CommandCallBack; + + + +enum AIR_FUN { + FAN_HEAT_BREAK_0_IDX = 0, + FAN_COOLING_0_AIRDOOR = 1, + FAN_REMOTE_COOLING_0_IDX = 2, + FAN_CHAMBER_0_IDX = 3, + FAN_HEAT_BREAK_1_IDX = 4, + FAN_MC_BOARD_0_IDX = 5, + FAN_INNNER_LOOP_FAN_0_IDX = 6, + FAN_TOTAL_COUNT = 7 +}; + +enum AIR_DOOR { AIR_DOOR_FUNC_CHAMBER = 0, AIR_DOOR_FUNC_INNERLOOP, AIR_DOOR_FUNC_TOP }; + + +enum AIR_DUCT { + AIR_DUCT_NONE = -1, + AIR_DUCT_COOLING_FILT = 0, + AIR_DUCT_HEATING_INTERNAL_FILT, + AIR_DUCT_EXHAUST, + AIR_DUCT_FULL_COOLING, + AIR_DUCT_INIT = 0xFF // Initial mode, only used within mc +}; + +struct AirParts +{ + int type{0}; + int id{0}; + int func{0}; + int state{0}; // 100% + int range_start{0}; // 100% + int range_end{0}; // 100% + +public: + bool operator ==(const AirParts& other) const + { + return (type == other.type) && (id == other.id) && (func == other.func) && (state == other.state) && (range_start == other.range_start) && (range_end == other.range_end); + }; +}; + +struct AirMode +{ + int id{-1}; + std::vector ctrl; + // If the fan is off, it cannot be controlled and is displayed as off + std::vector off; + // If the fan is not off or ctrl, it will be displayed as auto + +public: + bool operator ==(const AirMode& other) const + { + return (id == other.id) && (ctrl == other.ctrl) && (off == other.off); + }; +}; + +struct AirDuctData +{ + int curren_mode{0}; + std::unordered_map modes; + std::vector parts; + + int m_sub_mode = -1;// the submode of airduct, for cooling: 0-filter, 1-cooling + bool m_support_cooling_filter = false;// support switch filter on cooling mode or not + +public: + bool operator ==(const AirDuctData& other) const + { + return (curren_mode == other.curren_mode) && (modes == other.modes) && (parts == other.parts) && + (m_sub_mode == other.m_sub_mode) && (m_support_cooling_filter == other.m_support_cooling_filter); + }; + + bool operator !=(const AirDuctData& other) const + { + return !(operator==(other)); + }; + + bool IsSupportCoolingFilter() const { return m_support_cooling_filter; } + bool IsCoolingFilerOn() const { return m_sub_mode == 0; } +}; + +class DevFan +{ +public: + DevFan(MachineObject *obj) : m_owner(obj){}; +public: + + enum FanType {//if have devPrinter , delete? + COOLING_FAN = 1, + BIG_COOLING_FAN = 2, + CHAMBER_FAN = 3, + EXHAUST_FAN, + FILTER_FAN, + }; + + bool is_at_heating_mode() const { return m_air_duct_data.curren_mode == AIR_DUCT_HEATING_INTERNAL_FILT; }; + + void SetSupportCoolingFilter(bool enable) { m_air_duct_data.m_support_cooling_filter = enable; } + AirDuctData GetAirDuctData() { return m_air_duct_data; }; + + void converse_to_duct(bool is_suppt_part_fun, bool is_suppt_aux_fun, bool is_suppt_cham_fun); // Convert the data to duct type to make the newand old protocols consistent + int command_handle_response(const json &response); + int command_control_fan(int fan_type, int val); // Old protocol + int command_control_fan_new(int fan_id, int val); // New protocol + int command_control_air_duct(int mode_id, int submode, const CommandCallBack& cb); + + void ParseV1_0(const json &print_json); + void ParseV2_0(const json &print_json); + void ParseV3_0(const json &print_json); + + public: + bool GetSupportAuxFanData() { return is_support_aux_fan; }; + bool GetSupportChamberFan() { return is_support_aux_fan; }; + int GetHeatBreakFanSpeed() { return heatbreak_fan_speed; } + int GetCoolingFanSpeed() { return cooling_fan_speed; } + int GetBigFan1Speed() { return big_fan1_speed; } + int GetBigFan2Speed() { return big_fan2_speed; } + uint32_t GetFanGear() { return fan_gear; } + + +private: + AirDuctData m_air_duct_data; + + bool is_support_aux_fan{false}; + bool is_support_chamber_fan{false}; + + int heatbreak_fan_speed = 0; + int cooling_fan_speed = 0; + int big_fan1_speed = 0; + int big_fan2_speed = 0; + uint32_t fan_gear = 0; + + std::map m_callback_list; + + MachineObject *m_owner = nullptr; +}; + + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp b/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp new file mode 100644 index 0000000000..2b0043bffe --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp @@ -0,0 +1,13 @@ +#include "DevFilaAmsSetting.h" + +namespace Slic3r { + +void DevAmsSystemSetting::Reset() +{ + SetDetectOnInsertEnabled(false); + SetDetectOnPowerupEnabled(false); + SetDetectRemainEnabled(false); + SetAutoRefillEnabled(false); +} + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h b/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h new file mode 100644 index 0000000000..87989322a8 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h @@ -0,0 +1,35 @@ +#pragma once + +namespace Slic3r +{ + +class DevFilaSystem; +class DevAmsSystemSetting +{ +public: + DevAmsSystemSetting(DevFilaSystem* owner) : m_owner(owner) {}; + +public: + // getters + bool IsDetectOnInsertEnabled() const { return m_enable_detect_on_insert; }; + bool IsDetectOnPowerupEnabled() const { return m_enable_detect_on_powerup; } + bool IsDetectRemainEnabled() const { return m_enable_detect_remain; } + bool IsAutoRefillEnabled() const { return m_enable_auto_refill; } + + // setters + void Reset(); + void SetDetectOnInsertEnabled(bool enable) { m_enable_detect_on_insert = enable; } + void SetDetectOnPowerupEnabled(bool enable) { m_enable_detect_on_powerup = enable; } + void SetDetectRemainEnabled(bool enable) { m_enable_detect_remain = enable; } + void SetAutoRefillEnabled(bool enable) { m_enable_auto_refill = enable; } + +private: + DevFilaSystem* m_owner = nullptr; + + bool m_enable_detect_on_insert = false; + bool m_enable_detect_on_powerup = false; + bool m_enable_detect_remain = false; + bool m_enable_auto_refill = false; +}; + +}// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp b/src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp new file mode 100644 index 0000000000..74c73be032 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp @@ -0,0 +1,259 @@ +#include + +#include "DevFilaBlackList.h" +#include "DevFilaSystem.h" +#include "DevManager.h" + +#include "libslic3r/Utils.hpp" + +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" + +using namespace nlohmann; + +namespace Slic3r { + +json DevFilaBlacklist::filaments_blacklist = json::object(); + + +bool DevFilaBlacklist::load_filaments_blacklist_config() +{ + if (!filaments_blacklist.empty()) + { + return false; + } + + filaments_blacklist = json::object(); + + std::string config_file = Slic3r::resources_dir() + "/printers/filaments_blacklist.json"; + boost::nowide::ifstream json_file(config_file.c_str()); + + try { + if (json_file.is_open()) { + json_file >> filaments_blacklist; + return true; + } + else { + BOOST_LOG_TRIVIAL(error) << "load filaments blacklist config failed"; + } + } + catch (...) { + BOOST_LOG_TRIVIAL(error) << "load filaments blacklist config failed"; + return false; + } + return true; +} + + + +static std::string _get_filament_name_from_ams(int ams_id, int slot_id) +{ + std::string name; + DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { return name; } + + MachineObject* obj = dev->get_selected_machine(); + if (obj == nullptr) { return name; } + + if (ams_id < 0 || slot_id < 0) + { + return name; + } + + const auto tray = obj->GetFilaSystem()->GetAmsTray(std::to_string(ams_id), std::to_string(slot_id)); + if (!tray) { return name; } + + std::string filament_id = tray->setting_id; + + PresetBundle* preset_bundle = GUI::wxGetApp().preset_bundle; + auto option = preset_bundle->get_filament_by_filament_id(filament_id); + name = option ? option->filament_name : ""; + return name; +} + +// moved from tao.wang and zhimin.zeng +void check_filaments(std::string model_id, + std::string tag_vendor, + std::string tag_type, + int ams_id, + int slot_id, + std::string tag_name, + bool& in_blacklist, + std::string& ac, + wxString& info, + wxString& wiki_url) +{ + if (tag_name.empty()) + { + tag_name = _get_filament_name_from_ams(ams_id, slot_id); + } + + in_blacklist = false; + std::transform(tag_vendor.begin(), tag_vendor.end(), tag_vendor.begin(), ::tolower); + std::transform(tag_type.begin(), tag_type.end(), tag_type.begin(), ::tolower); + std::transform(tag_name.begin(), tag_name.end(), tag_name.begin(), ::tolower); + + DevFilaBlacklist::load_filaments_blacklist_config(); + if (DevFilaBlacklist::filaments_blacklist.contains("blacklist")) + { + for (auto filament_item : DevFilaBlacklist::filaments_blacklist["blacklist"]) + { + + std::string vendor = filament_item.contains("vendor") ? filament_item["vendor"].get() : ""; + std::string type = filament_item.contains("type") ? filament_item["type"].get() : ""; + std::string type_suffix = filament_item.contains("type_suffix") ? filament_item["type_suffix"].get() : ""; + std::string name = filament_item.contains("name") ? filament_item["name"].get() : ""; + std::string slot = filament_item.contains("slot") ? filament_item["slot"].get() : ""; + std::vector model_ids = filament_item.contains("model_id") ? filament_item["model_id"].get>() : std::vector(); + std::string action = filament_item.contains("action") ? filament_item["action"].get() : ""; + std::string description = filament_item.contains("description") ? filament_item["description"].get() : ""; + + // check model id + if (!model_ids.empty() && std::find(model_ids.begin(), model_ids.end(), model_id) == model_ids.end()) { continue; } + + // check vendor + std::transform(vendor.begin(), vendor.end(), vendor.begin(), ::tolower); + if (!vendor.empty()) + { + if ((vendor == "bambu lab" && (tag_vendor == vendor)) || + (vendor == "third party" && (tag_vendor != "bambu lab"))) + { + // Do nothing + } + else + { + continue; + } + } + + // check type + std::transform(type.begin(), type.end(), type.begin(), ::tolower); + if (!type.empty() && (type != tag_type)) { continue; } + + // check type suffix + std::transform(type_suffix.begin(), type_suffix.end(), type_suffix.begin(), ::tolower); + if (!type_suffix.empty()) + { + if (tag_type.length() < type_suffix.length()) { continue; } + if ((tag_type.substr(tag_type.length() - type_suffix.length()) != type_suffix)) { continue; } + } + + // check name + std::transform(name.begin(), name.end(), name.begin(), ::tolower); + if (!name.empty() && (name != tag_name)) { continue; } + + // check loc + if (!slot.empty()) + { + bool is_virtual_slot = devPrinterUtil::IsVirtualSlot(ams_id); + bool check_virtual_slot = (slot == "ext"); + bool check_ams_slot = (slot == "ams"); + if (is_virtual_slot && !check_virtual_slot) + { + continue; + } + else if (!is_virtual_slot && !check_ams_slot) + { + continue; + } + } + + if (GUI::wxGetApp().app_config->get("skip_ams_blacklist_check") == "true") { + action = "warning"; + } + + in_blacklist = true; + ac = action; + info = _L(description); + wiki_url = filament_item.contains("wiki") ? filament_item["wiki"].get() : ""; + return; + + // Using in description + L("TPU is not supported by AMS."); + L("Damp PVA will become flexible and get stuck inside AMS, please take care to dry it before use."); + L("Damp PVA is flexible and may get stuck in extruder. Dry it before use."); + L("The rough surface of PLA Glow can accelerate wear on the AMS system, particularly on the internal components of the AMS Lite."); + L("CF/GF filaments are hard and brittle, it's easy to break or get stuck in AMS, please use with caution."); + L("PPS-CF is brittle and could break in bended PTFE tube above Toolhead."); + L("PPA-CF is brittle and could break in bended PTFE tube above Toolhead."); + } + } +} + + + +void DevFilaBlacklist::check_filaments_in_blacklist(std::string model_id, + std::string tag_vendor, + std::string tag_type, + const std::string& filament_id, + int ams_id, + int slot_id, + std::string tag_name, + bool& in_blacklist, + std::string& ac, + wxString& info) +{ + wxString wiki_url; + check_filaments_in_blacklist_url(model_id, tag_vendor, tag_type, filament_id, ams_id, slot_id, tag_name, in_blacklist, ac, info, wiki_url); +} + + +bool check_filaments_printable(const std::string &tag_vendor, const std::string &tag_type, const std::string& filament_id, int ams_id, bool &in_blacklist, std::string &ac, wxString &info) +{ + DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) { + return true; + } + + MachineObject *obj = dev->get_selected_machine(); + if (obj == nullptr || !obj->is_multi_extruders()) { + return true; + } + + Preset *printer_preset = GUI::get_printer_preset(obj); + if (!printer_preset) + return true; + + ConfigOptionInts *physical_extruder_map_op = dynamic_cast(printer_preset->config.option("physical_extruder_map")); + if (!physical_extruder_map_op) + return true; + std::vector physical_extruder_maps = physical_extruder_map_op->values; + int obj_extruder_id = obj->get_extruder_id_by_ams_id(std::to_string(ams_id)); + int extruder_idx = obj_extruder_id; + for (int index = 0; index < physical_extruder_maps.size(); ++index) { + if (physical_extruder_maps[index] == obj_extruder_id) { + extruder_idx = index; + break; + } + } + + PresetBundle *preset_bundle = GUI::wxGetApp().preset_bundle; + std::optional filament_info = preset_bundle->get_filament_by_filament_id(filament_id, printer_preset->name); + if (filament_info.has_value() && !(filament_info->filament_printable >> extruder_idx & 1)) { + wxString extruder_name = extruder_idx == 0 ? _L("left") : _L("right"); + ac = "prohibition"; + info = wxString::Format(_L("%s is not supported by %s extruder."), tag_type, extruder_name); + in_blacklist = true; + return false; + } + + return true; +} + +void DevFilaBlacklist::check_filaments_in_blacklist_url(std::string model_id, std::string tag_vendor, std::string tag_type, const std::string& filament_id, int ams_id, int slot_id, std::string tag_name, bool& in_blacklist, std::string& ac, wxString& info, wxString& wiki_url) +{ + if (ams_id < 0 || slot_id < 0) + { + return; + } + + if (!check_filaments_printable(tag_vendor, tag_type, filament_id, ams_id, in_blacklist, ac, info)) + { + return; + } + + check_filaments(model_id, tag_vendor, tag_type, ams_id, slot_id, tag_name, in_blacklist, ac, info, wiki_url); +} + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFilaBlackList.h b/src/slic3r/GUI/DeviceCore/DevFilaBlackList.h new file mode 100644 index 0000000000..b77d8e8b1e --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFilaBlackList.h @@ -0,0 +1,17 @@ +#pragma once +#include "slic3r/Utils/json_diff.hpp" + +namespace Slic3r +{ +class DevFilaBlacklist +{ +public: + static bool load_filaments_blacklist_config(); + static void check_filaments_in_blacklist(std::string model_id, std::string tag_vendor, std::string tag_type, const std::string& filament_id, int ams_id, int slot_id, std::string tag_name, bool& in_blacklist, std::string& ac, wxString& info); + static void check_filaments_in_blacklist_url(std::string model_id, std::string tag_vendor, std::string tag_type, const std::string& filament_id, int ams_id, int slot_id, std::string tag_name, bool& in_blacklist, std::string& ac, wxString& info, wxString& wiki_url); + +public: + static json filaments_blacklist; +};// class DevFilaBlacklist + +}// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp b/src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp new file mode 100644 index 0000000000..8076cb9094 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp @@ -0,0 +1,719 @@ +#include +#include "DevFilaSystem.h" + +// TODO: remove this include +#include "slic3r/GUI/DeviceManager.hpp" +#include "slic3r/GUI/I18N.hpp" + +#include "DevUtil.h" + +using namespace nlohmann; + +namespace Slic3r { +static int _hex_digit_to_int(const char c) { return (c >= '0' && c <= '9') ? c - '0' : (c >= 'A' && c <= 'F') ? c - 'A' + 10 : (c >= 'a' && c <= 'f') ? c - 'a' + 10 : -1; } + +wxColour DevAmsTray::decode_color(const std::string &color) +{ + std::array ret = {0, 0, 0, 0}; + const char * c = color.data(); + if (color.size() == 8) { + for (size_t j = 0; j < 4; ++j) { + int digit1 = _hex_digit_to_int(*c++); + int digit2 = _hex_digit_to_int(*c++); + if (digit1 == -1 || digit2 == -1) break; + ret[j] = static_cast(digit1 * 16 + digit2); + } + } else { return wxColour(255, 255, 255, 255); } + + return wxColour(ret[0], ret[1], ret[2], ret[3]); +} + +void DevAmsTray::UpdateColorFromStr(const std::string& color) +{ + if (color.empty()) return; + if (this->color != color) + { + wx_color = "#" + wxString::FromUTF8(color); + this->color = color; + } +} + +wxColour DevAmsTray::get_color() { return decode_color(color); } + +void DevAmsTray::reset() +{ + tag_uid = ""; + setting_id = ""; + filament_setting_id = ""; + type = ""; + sub_brands = ""; + color = ""; + weight = ""; + diameter = ""; + temp = ""; + time = ""; + bed_temp_type = ""; + bed_temp = ""; + nozzle_temp_max = ""; + nozzle_temp_min = ""; + xcam_info = ""; + uuid = ""; + k = 0.0f; + n = 0.0f; + is_bbl = false; + hold_count = 0; + remain = 0; +} + + +bool DevAmsTray::is_tray_info_ready() +{ + if (color.empty()) return false; + if (type.empty()) return false; + //if (setting_id.empty()) return false; + return true; +} + +bool DevAmsTray::is_unset_third_filament() +{ + if (this->is_bbl) return false; + return (color.empty() || type.empty()); +} + +std::string DevAmsTray::get_display_filament_type() +{ + if (type == "PLA-S") return "Sup.PLA"; + if (type == "PA-S") return "Sup.PA"; + if (type == "ABS-S") return "Sup.ABS"; + return type; +} + +std::string DevAmsTray::get_filament_type() +{ + if (type == "Sup.PLA") { return "PLA-S"; } + if (type == "Sup.PA") { return "PA-S"; } + if (type == "Sup.ABS") { return "ABS-S"; } + if (type == "Support W") { return "PLA-S"; } + if (type == "Support G") { return "PA-S"; } + if (type == "Support") { if (setting_id == "GFS00") { type = "PLA-S"; } else if (setting_id == "GFS01") { type = "PA-S"; } else { return "PLA-S"; } } + + return type; +} + + +DevAms::DevAms(const std::string& ams_id, int extruder_id, AmsType type) +{ + m_ams_id = ams_id; + m_ext_id = extruder_id; + m_ams_type = type; +} + +DevAms::DevAms(const std::string& ams_id, int nozzle_id, int type) +{ + m_ams_id = ams_id; + m_ext_id = nozzle_id; + m_ams_type = (AmsType)type; + assert(DUMMY < type && m_ams_type <= N3S); +} + +DevAms::~DevAms() +{ + for (auto it = m_trays.begin(); it != m_trays.end(); it++) + { + if (it->second) + { + delete it->second; + it->second = nullptr; + } + } + m_trays.clear(); +} + +static unordered_map s_ams_display_formats = { + {DevAms::AMS, "AMS-%d"}, + {DevAms::AMS_LITE, "AMS Lite-%d"}, + {DevAms::N3F, "AMS 2 PRO-%d"}, + {DevAms::N3S, "AMS HT-%d"} +}; + +wxString DevAms::GetDisplayName() const +{ + wxString ams_display_format; + auto iter = s_ams_display_formats.find(m_ams_type); + if (iter != s_ams_display_formats.end()) + { + ams_display_format = iter->second; + } + else + { + assert(0 && __FUNCTION__); + ams_display_format = "AMS-%d"; + } + + int num_id; + try + { + num_id = std::stoi(GetAmsId()); + } + catch (const std::exception& e) + { + assert(0 && __FUNCTION__); + BOOST_LOG_TRIVIAL(error) << "Invalid AMS ID: " << GetAmsId() << ", error: " << e.what(); + num_id = 0; + } + + int loc = (num_id > 127) ? (num_id - 127) : (num_id + 1); + return wxString::Format(ams_display_format, loc); +} + +int DevAms::GetSlotCount() const +{ + if (m_ams_type == AMS || m_ams_type == AMS_LITE || m_ams_type == N3F) + { + return 4; + } + else if (m_ams_type == N3S) + { + return 1; + } + + return 1; +} + +DevAmsTray* DevAms::GetTray(const std::string& tray_id) const +{ + auto it = m_trays.find(tray_id); + if (it != m_trays.end()) + { + return it->second; + } + + return nullptr; +} + +DevFilaSystem::~DevFilaSystem() +{ + for (auto it = amsList.begin(); it != amsList.end(); it++) + { + if (it->second) + { + delete it->second; + it->second = nullptr; + } + } + amsList.clear(); +} + +DevAms* DevFilaSystem::GetAmsById(const std::string& ams_id) const +{ + auto it = amsList.find(ams_id); + if (it != amsList.end()) + { + return it->second; + } + + return nullptr; +} + +DevAmsTray* DevFilaSystem::GetAmsTray(const std::string& ams_id, const std::string& tray_id) const +{ + auto it = amsList.find(ams_id); + if (it == amsList.end()) return nullptr; + if (!it->second) return nullptr; + return it->second->GetTray(tray_id);; +} + +void DevFilaSystem::CollectAmsColors(std::vector& ams_colors) const +{ + ams_colors.clear(); + ams_colors.reserve(amsList.size()); + for (auto ams = amsList.begin(); ams != amsList.end(); ams++) + { + for (auto tray = ams->second->GetTrays().begin(); tray != ams->second->GetTrays().end(); tray++) + { + if (tray->second->is_tray_info_ready()) + { + auto ams_color = DevAmsTray::decode_color(tray->second->color); + ams_colors.emplace_back(ams_color); + } + } + } +} + +int DevFilaSystem::GetExtruderIdByAmsId(const std::string& ams_id) const +{ + auto it = amsList.find(ams_id); + if (it != amsList.end()) + { + return it->second->GetExtruderId(); + } + else if (stoi(ams_id) == VIRTUAL_TRAY_MAIN_ID) + { + return MAIN_EXTRUDER_ID; + } + else if (stoi(ams_id) == VIRTUAL_TRAY_DEPUTY_ID) + { + return DEPUTY_EXTRUDER_ID; + } + + assert(false && __FUNCTION__); + return 0; // not found +} + +bool DevFilaSystem::IsAmsSettingUp() const +{ + int setting_up_stat = DevUtil::get_flag_bits(m_ams_cali_stat, 0, 8); + if (setting_up_stat == 0x01 || setting_up_stat == 0x02 || setting_up_stat == 0x03 || setting_up_stat == 0x04) + { + return true; + } + + return false; +} + +bool DevFilaSystem::IsBBL_Filament(std::string tag_uid) +{ + if (tag_uid.empty()) + { + return false; + } + + for (int i = 0; i < tag_uid.length(); i++) + { + if (tag_uid[i] != '0') { return true; } + } + + return false; +} + +void DevFilaSystemParser::ParseV1_0(const json& jj, MachineObject* obj, DevFilaSystem* system, bool key_field_only) +{ + if (jj.contains("ams")) + { + if (jj["ams"].contains("ams")) + { + if (jj["ams"].contains("ams_exist_bits")) + { + obj->ams_exist_bits = stol(jj["ams"]["ams_exist_bits"].get(), nullptr, 16); + } + + if (jj["ams"].contains("tray_exist_bits")) + { + obj->tray_exist_bits = stol(jj["ams"]["tray_exist_bits"].get(), nullptr, 16); + } + + if (jj["ams"].contains("cali_stat")) { system->m_ams_cali_stat = jj["ams"]["cali_stat"].get(); } + + if (!key_field_only) + { + if (jj["ams"].contains("tray_read_done_bits")) + { + obj->tray_read_done_bits = stol(jj["ams"]["tray_read_done_bits"].get(), nullptr, 16); + } + if (jj["ams"].contains("tray_reading_bits")) + { + obj->tray_reading_bits = stol(jj["ams"]["tray_reading_bits"].get(), nullptr, 16); + } + if (jj["ams"].contains("tray_is_bbl_bits")) + { + obj->tray_is_bbl_bits = stol(jj["ams"]["tray_is_bbl_bits"].get(), nullptr, 16); + } + if (jj["ams"].contains("version")) + { + if (jj["ams"]["version"].is_number()) + { + obj->ams_version = jj["ams"]["version"].get(); + } + } + +#if 0 + if (jj["ams"].contains("ams_rfid_status")) { } +#endif + + if (time(nullptr) - obj->ams_user_setting_start > HOLD_TIME_3SEC) + { + if (jj["ams"].contains("insert_flag")) + { + system->m_ams_system_setting.SetDetectOnInsertEnabled(jj["ams"]["insert_flag"].get()); + } + if (jj["ams"].contains("power_on_flag")) + { + system->m_ams_system_setting.SetDetectOnPowerupEnabled(jj["ams"]["power_on_flag"].get()); + } + if (jj["ams"].contains("calibrate_remain_flag")) + { + system->m_ams_system_setting.SetDetectRemainEnabled(jj["ams"]["calibrate_remain_flag"].get()); + } + } + + json j_ams = jj["ams"]["ams"]; + std::set ams_id_set; + + for (auto it = system->amsList.begin(); it != system->amsList.end(); it++) + { + ams_id_set.insert(it->first); + } + + for (auto it = j_ams.begin(); it != j_ams.end(); it++) + { + if (!it->contains("id")) continue; + std::string ams_id = (*it)["id"].get(); + + int extuder_id = MAIN_EXTRUDER_ID; // Default nozzle id + int type_id = 1; // 0:dummy 1:ams 2:ams-lite 3:n3f 4:n3s + + /*ams info*/ + if (it->contains("info")) + { + const std::string& info = (*it)["info"].get(); + type_id = DevUtil::get_flag_bits(info, 0, 4); + extuder_id = DevUtil::get_flag_bits(info, 8, 4); + } + + /*AMS without initialization*/ + if (extuder_id == 0xE) + { + ams_id_set.erase(ams_id); + system->amsList.erase(ams_id); + continue; + } + + ams_id_set.erase(ams_id); + DevAms* curr_ams = nullptr; + auto ams_it = system->amsList.find(ams_id); + if (ams_it == system->amsList.end()) + { + DevAms* new_ams = new DevAms(ams_id, extuder_id, type_id); + system->amsList.insert(std::make_pair(ams_id, new_ams)); + // new ams added event + curr_ams = new_ams; + } + else + { + if (extuder_id != ams_it->second->GetExtruderId()) + { + ams_it->second->m_ext_id = extuder_id; + } + + curr_ams = ams_it->second; + } + if (!curr_ams) continue; + + /*set ams type flag*/ + curr_ams->SetAmsType(type_id); + + + /*set ams exist flag*/ + try + { + if (!ams_id.empty()) + { + int ams_id_int = atoi(ams_id.c_str()); + + if (type_id < 4) + { + curr_ams->m_exist = (obj->ams_exist_bits & (1 << ams_id_int)) != 0 ? true : false; + } + else + { + curr_ams->m_exist = DevUtil::get_flag_bits(obj->ams_exist_bits, 4 + (ams_id_int - 128)); + } + } + } + catch (...) + { + ; + } + + if (it->contains("dry_time") && (*it)["dry_time"].is_number()) + { + curr_ams->m_left_dry_time = (*it)["dry_time"].get(); + } + + if (it->contains("humidity")) + { + std::string humidity = (*it)["humidity"].get(); + + try + { + curr_ams->m_humidity_level = atoi(humidity.c_str()); + } + catch (...) + { + ; + } + } + + if (it->contains("humidity_raw")) + { + std::string humidity_raw = (*it)["humidity_raw"].get(); + + try + { + curr_ams->m_humidity_percent = atoi(humidity_raw.c_str()); + } + catch (...) + { + ; + } + + if (curr_ams->GetHumidityPercent() != -1) + { + if (curr_ams->GetHumidityPercent() < 20) + { + curr_ams->m_humidity_level = 5; + } + else if (curr_ams->GetHumidityPercent() < 40) + { + curr_ams->m_humidity_level = 4; + } + else if (curr_ams->GetHumidityPercent() < 60) + { + curr_ams->m_humidity_level = 3; + } + else if (curr_ams->GetHumidityPercent() < 80) + { + curr_ams->m_humidity_level = 2; + } + else + { + curr_ams->m_humidity_level = 1; + } + } + } + + + if (it->contains("temp")) + { + std::string temp = (*it)["temp"].get(); + try + { + curr_ams->m_current_temperature = DevUtil::string_to_float(temp); + } + catch (...) + { + curr_ams->m_current_temperature = INVALID_AMS_TEMPERATURE; + } + } + + if (it->contains("tray")) + { + std::set tray_id_set; + for (auto it = curr_ams->GetTrays().cbegin(); it != curr_ams->GetTrays().cend(); it++) + { + tray_id_set.insert(it->first); + } + for (auto tray_it = (*it)["tray"].begin(); tray_it != (*it)["tray"].end(); tray_it++) + { + if (!tray_it->contains("id")) continue; + std::string tray_id = (*tray_it)["id"].get(); + tray_id_set.erase(tray_id); + // compare tray_list + DevAmsTray* curr_tray = nullptr; + auto tray_iter = curr_ams->GetTrays().find(tray_id); + if (tray_iter == curr_ams->GetTrays().end()) + { + DevAmsTray* new_tray = new DevAmsTray(tray_id); + curr_ams->m_trays.insert(std::make_pair(tray_id, new_tray)); + curr_tray = new_tray; + } + else + { + curr_tray = tray_iter->second; + } + if (!curr_tray) continue; + + if (curr_tray->hold_count > 0) + { + curr_tray->hold_count--; + continue; + } + + curr_tray->id = (*tray_it)["id"].get(); + if (tray_it->contains("tag_uid")) + curr_tray->tag_uid = (*tray_it)["tag_uid"].get(); + else + curr_tray->tag_uid = "0"; + if (tray_it->contains("tray_info_idx") && tray_it->contains("tray_type")) + { + curr_tray->setting_id = (*tray_it)["tray_info_idx"].get(); + //std::string type = (*tray_it)["tray_type"].get(); + std::string type = MachineObject::setting_id_to_type(curr_tray->setting_id, (*tray_it)["tray_type"].get()); + if (curr_tray->setting_id == "GFS00") + { + curr_tray->type = "PLA-S"; + } + else if (curr_tray->setting_id == "GFS01") + { + curr_tray->type = "PA-S"; + } + else + { + curr_tray->type = type; + } + } + else + { + curr_tray->setting_id = ""; + curr_tray->type = ""; + } + if (tray_it->contains("tray_sub_brands")) + curr_tray->sub_brands = (*tray_it)["tray_sub_brands"].get(); + else + curr_tray->sub_brands = ""; + if (tray_it->contains("tray_weight")) + curr_tray->weight = (*tray_it)["tray_weight"].get(); + else + curr_tray->weight = ""; + if (tray_it->contains("tray_diameter")) + curr_tray->diameter = (*tray_it)["tray_diameter"].get(); + else + curr_tray->diameter = ""; + if (tray_it->contains("tray_temp")) + curr_tray->temp = (*tray_it)["tray_temp"].get(); + else + curr_tray->temp = ""; + if (tray_it->contains("tray_time")) + curr_tray->time = (*tray_it)["tray_time"].get(); + else + curr_tray->time = ""; + if (tray_it->contains("bed_temp_type")) + curr_tray->bed_temp_type = (*tray_it)["bed_temp_type"].get(); + else + curr_tray->bed_temp_type = ""; + if (tray_it->contains("bed_temp")) + curr_tray->bed_temp = (*tray_it)["bed_temp"].get(); + else + curr_tray->bed_temp = ""; + if (tray_it->contains("tray_color")) + { + auto color = (*tray_it)["tray_color"].get(); + curr_tray->UpdateColorFromStr(color); + } + else + { + curr_tray->color = ""; + } + if (tray_it->contains("nozzle_temp_max")) + { + curr_tray->nozzle_temp_max = (*tray_it)["nozzle_temp_max"].get(); + } + else + curr_tray->nozzle_temp_max = ""; + if (tray_it->contains("nozzle_temp_min")) + curr_tray->nozzle_temp_min = (*tray_it)["nozzle_temp_min"].get(); + else + curr_tray->nozzle_temp_min = ""; + if (tray_it->contains("xcam_info")) + curr_tray->xcam_info = (*tray_it)["xcam_info"].get(); + else + curr_tray->xcam_info = ""; + if (tray_it->contains("tray_uuid")) + curr_tray->uuid = (*tray_it)["tray_uuid"].get(); + else + curr_tray->uuid = "0"; + + if (tray_it->contains("ctype")) + curr_tray->ctype = (*tray_it)["ctype"].get(); + else + curr_tray->ctype = 0; + curr_tray->cols.clear(); + if (tray_it->contains("cols")) + { + if ((*tray_it)["cols"].is_array()) + { + for (auto it = (*tray_it)["cols"].begin(); it != (*tray_it)["cols"].end(); it++) + { + curr_tray->cols.push_back(it.value().get()); + } + } + } + + if (tray_it->contains("remain")) + { + curr_tray->remain = (*tray_it)["remain"].get(); + } + else + { + curr_tray->remain = -1; + } + int ams_id_int = 0; + int tray_id_int = 0; + try + { + if (!ams_id.empty() && !curr_tray->id.empty()) + { + ams_id_int = atoi(ams_id.c_str()); + tray_id_int = atoi(curr_tray->id.c_str()); + + if (type_id < 4) + { + curr_tray->is_exists = (obj->tray_exist_bits & (1 << (ams_id_int * 4 + tray_id_int))) != 0 ? true : false; + } + else + { + curr_tray->is_exists = DevUtil::get_flag_bits(obj->tray_exist_bits, 16 + (ams_id_int - 128)); + } + + } + } + catch (...) + { + } + if (tray_it->contains("setting_id")) + { + curr_tray->filament_setting_id = (*tray_it)["setting_id"].get(); + } + auto curr_time = std::chrono::system_clock::now(); + auto diff = std::chrono::duration_cast(curr_time - obj->extrusion_cali_set_hold_start); + if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 + || ams_id_int != (obj->extrusion_cali_set_tray_id / 4) + || tray_id_int != (obj->extrusion_cali_set_tray_id % 4)) + { + if (tray_it->contains("k")) + { + curr_tray->k = (*tray_it)["k"].get(); + } + if (tray_it->contains("n")) + { + curr_tray->n = (*tray_it)["n"].get(); + } + } + + std::string temp = tray_it->dump(); + + if (tray_it->contains("cali_idx")) + { + curr_tray->cali_idx = (*tray_it)["cali_idx"].get(); + } + } + // remove not in trayList + for (auto tray_it = tray_id_set.begin(); tray_it != tray_id_set.end(); tray_it++) + { + std::string tray_id = *tray_it; + auto tray = curr_ams->GetTrays().find(tray_id); + if (tray != curr_ams->GetTrays().end()) + { + curr_ams->m_trays.erase(tray_id); + BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id << ", tray_id=" << tray_id; + } + } + } + } + // remove not in amsList + for (auto it = ams_id_set.begin(); it != ams_id_set.end(); it++) + { + std::string ams_id = *it; + auto ams = system->amsList.find(ams_id); + if (ams != system->amsList.end()) + { + BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id; + system->amsList.erase(ams_id); + } + } + } + } + } +} + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFilaSystem.h b/src/slic3r/GUI/DeviceCore/DevFilaSystem.h new file mode 100644 index 0000000000..7dce2f1d89 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFilaSystem.h @@ -0,0 +1,190 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" +#include "slic3r/Utils/json_diff.hpp" + +#include "DevDefs.h" +#include "DevFilaAmsSetting.h" + +#include +#include +#include + +#define HOLD_COUNT_MAX 3 + +namespace Slic3r +{ +class MachineObject; + +class DevAmsTray +{ +public: + DevAmsTray(std::string tray_id) + { + is_bbl = false; + id = tray_id; + } + + static wxColour decode_color(const std::string& color); + + bool operator==(DevAmsTray const& o) const + { + return id == o.id && type == o.type && filament_setting_id == o.filament_setting_id && color == o.color; + } + bool operator!=(DevAmsTray const& o) const { return !operator==(o); } + + std::string id; + std::string tag_uid; // tag_uid + std::string setting_id; // tray_info_idx + std::string filament_setting_id; // setting_id + std::string type; + std::string sub_brands; + std::string color; + std::vector cols; + std::string weight; + std::string diameter; + std::string temp; + std::string time; + std::string bed_temp_type; + std::string bed_temp; + std::string nozzle_temp_max; + std::string nozzle_temp_min; + std::string xcam_info; + std::string uuid; + int ctype = 0; + float k = 0.0f; // k range: 0 ~ 0.5 + float n = 0.0f; // k range: 0.6 ~ 2.0 + int cali_idx = -1; // - 1 means default + + wxColour wx_color; + bool is_bbl; + bool is_exists = false; + int hold_count = 0; + int remain = 0; // filament remain: 0 ~ 100 + + void set_hold_count() { hold_count = HOLD_COUNT_MAX; } + void UpdateColorFromStr(const std::string& color); + wxColour get_color(); + + void reset(); + + bool is_tray_info_ready(); + bool is_unset_third_filament(); + std::string get_display_filament_type(); + std::string get_filament_type(); +}; + +class DevAms +{ + friend class DevFilaSystemParser; +public: + enum AmsType : int + { + DUMMY = 0, + AMS = 1, // AMS + AMS_LITE = 2, // AMS-Lite + N3F = 3, // N3F + N3S = 4, // N3S + }; + +public: + DevAms(const std::string& ams_id, int extruder_id, AmsType type); + DevAms(const std::string& ams_id, int nozzle_id, int type); + ~DevAms(); + +public: + std::string GetAmsId() const { return m_ams_id; } + wxString GetDisplayName() const; // display + + void SetAmsType(int type) { m_ams_type = (AmsType)type; } + void SetAmsType(AmsType type) { m_ams_type = type; } + AmsType GetAmsType() const { return m_ams_type; } + + // exist or not + bool IsExist() const { return m_exist; } + + // slots + int GetSlotCount() const; + DevAmsTray* GetTray(const std::string& tray_id) const; + const std::map& GetTrays() const { return m_trays; } + + // installed on the extruder + int GetExtruderId() const { return m_ext_id; } + + // temperature and humidity + float GetCurrentTemperature() const { return m_current_temperature; } + + bool SupportHumidity() const { return (m_ams_type == AMS) || (m_ams_type == N3F) || (m_ams_type == N3S);} + int GetHumidityLevel() const { return m_humidity_level; } + int GetHumidityPercent() const { return m_humidity_percent; } + + bool SupportDrying() const { return m_ams_type > AMS_LITE; } + int GetLeftDryTime() const { return m_left_dry_time; } + +private: + AmsType m_ams_type = AmsType::AMS; + std::string m_ams_id; + int m_ext_id;//extruder id + bool m_exist = false; + + // slots and trays + std::map m_trays;//id -> DevAmsTray* + + // temperature and humidity + float m_current_temperature = INVALID_AMS_TEMPERATURE; // the temperature + int m_humidity_level = 5; + int m_humidity_percent = -1; // the percentage, -1 means invalid. eg. 100 means 100% + int m_left_dry_time = 0; +}; + +class DevFilaSystem +{ + friend class DevFilaSystemParser; +public: + DevFilaSystem(MachineObject* owner) { m_owner = owner;}; + ~DevFilaSystem(); + +public: + bool HasAms() const { return !amsList.empty(); } + bool IsAmsSettingUp() const; + + /* ams */ + DevAms* GetAmsById(const std::string& ams_id) const; + std::map& GetAmsList() { return amsList; } + int GetAmsCount() const { return amsList.size(); } + + /* tray*/ + DevAmsTray* GetAmsTray(const std::string& ams_id, const std::string& tray_id) const; + void CollectAmsColors(std::vector& ams_colors) const; + + // extruder + int GetExtruderIdByAmsId(const std::string& ams_id) const; + + /* AMS settings*/ + DevAmsSystemSetting& GetAmsSystemSetting() { return m_ams_system_setting; } + bool IsDetectOnInsertEnabled() const { return m_ams_system_setting.IsDetectOnInsertEnabled(); }; + bool IsDetectOnPowerupEnabled() const { return m_ams_system_setting.IsDetectOnPowerupEnabled(); } + bool IsDetectRemainEnabled() const { return m_ams_system_setting.IsDetectRemainEnabled(); } + bool IsAutoRefillEnabled() const { return m_ams_system_setting.IsAutoRefillEnabled(); } + +public: + static bool IsBBL_Filament(std::string tag_uid); + +private: + MachineObject* m_owner; + + /* ams properties */ + int m_ams_cali_stat = 0; + + std::map amsList; // key: ams[id], start with 0 + + DevAmsSystemSetting m_ams_system_setting{ this }; +};// class DevFilaSystem + + +class DevFilaSystemParser +{ +public: + static void ParseV1_0(const json& print_json, MachineObject* obj, DevFilaSystem* system, bool key_field_only); +}; + +}// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevFirmware.cpp b/src/slic3r/GUI/DeviceCore/DevFirmware.cpp new file mode 100644 index 0000000000..1975bbe41a --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFirmware.cpp @@ -0,0 +1,2 @@ +#include "DevFirmware.h" +#include "slic3r/GUI/DeviceManager.hpp" diff --git a/src/slic3r/GUI/DeviceCore/DevFirmware.h b/src/slic3r/GUI/DeviceCore/DevFirmware.h new file mode 100644 index 0000000000..c89ed470d8 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevFirmware.h @@ -0,0 +1,57 @@ +#pragma once +#include +#include "slic3r/Utils/json_diff.hpp" + +namespace Slic3r { + +//Previous definitions +class MachineObject; + +enum PrinterFirmwareType +{ + FIRMWARE_TYPE_ENGINEER = 0, + FIRMWARE_TYPE_PRODUCTION, + FIRMEARE_TYPE_UKNOWN, +}; + + +class FirmwareInfo +{ +public: + std::string module_type; // ota or ams + std::string version; + std::string url; + std::string name; + std::string description; +}; + + +class DevFirmwareVersionInfo +{ +public: + std::string name; + wxString product_name; + std::string sn; + std::string hw_ver; + std::string sw_ver; + std::string sw_new_ver; + int firmware_flag = 0; + +public: + bool isValid() const { return !sn.empty(); } + bool isAirPump() const { return product_name.Contains("Air Pump"); } + bool isLaszer() const { return product_name.Contains("Laser"); } + bool isCuttingModule() const { return product_name.Contains("Cutting Module"); } +}; + + +class DevFirmware +{ +public: + DevFirmware(MachineObject* obj) : m_owner(obj) {} + +private: + MachineObject* m_owner = nullptr; +}; + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevHMS.cpp b/src/slic3r/GUI/DeviceCore/DevHMS.cpp new file mode 100644 index 0000000000..639421c815 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevHMS.cpp @@ -0,0 +1,67 @@ +//#include "D:/dev/bamboo_slicer/build_release/src/slic3r/CMakeFiles/libslic3r_gui.dir/Release/cmake_pch.hxx" +#include "DevHMS.h" + +namespace Slic3r +{ + +bool DevHMSItem::parse_hms_info(unsigned attr, unsigned code) +{ + bool result = true; + unsigned int model_id_int = (attr >> 24) & 0xFF; + this->m_module_id = (ModuleID)model_id_int; + this->m_module_num = (attr >> 16) & 0xFF; + this->m_part_id = (attr >> 8) & 0xFF; + this->m_reserved = (attr >> 0) & 0xFF; + unsigned msg_level_int = code >> 16; + if (msg_level_int < (unsigned)HMS_MSG_LEVEL_MAX) + { + this->m_msg_level = (HMSMessageLevel)msg_level_int; + } + else + { + this->m_msg_level = HMS_UNKNOWN; + } + + this->m_msg_code = code & 0xFFFF; + return result; +} + +std::string DevHMSItem::get_long_error_code() const +{ + char buf[64]; + ::sprintf(buf, "%02X%02X%02X00000%1X%04X", + this->m_module_id, + this->m_module_num, + this->m_part_id, + (int)this->m_msg_level, + this->m_msg_code); + return std::string(buf); +} + +void DevHMS::ParseHMSItems(const json& hms_json) +{ + m_hms_list.clear(); + + try + { + if (hms_json.is_array()) + { + for (auto it = hms_json.begin(); it != hms_json.end(); it++) + { + DevHMSItem item; + if ((*it).contains("attr") && (*it).contains("code")) + { + unsigned attr = (*it)["attr"].get(); + unsigned code = (*it)["code"].get(); + item.parse_hms_info(attr, code); + } + m_hms_list.push_back(item); + } + } + } + catch (const std::exception&) + { + assert(false && "Parse HMS items failed"); + } +} +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevHMS.h b/src/slic3r/GUI/DeviceCore/DevHMS.h new file mode 100644 index 0000000000..205cad77b3 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevHMS.h @@ -0,0 +1,84 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" + +#include "slic3r/Utils/json_diff.hpp" +#include +#include + +namespace Slic3r +{ +// Previous definitions +class MachineObject; +class DevHMSItem; + +class DevHMS +{ +public: + DevHMS(MachineObject* obj) : m_object(obj) {} + +public: + void ParseHMSItems(const json& hms_json); + const std::vector& GetHMSItems() const { return m_hms_list; }; + +private: + MachineObject* m_object = nullptr; + + // all hms for this machine + std::vector m_hms_list; +}; + +enum HMSMessageLevel +{ + HMS_UNKNOWN = 0, + HMS_FATAL = 1, + HMS_SERIOUS = 2, + HMS_COMMON = 3, + HMS_INFO = 4, + HMS_MSG_LEVEL_MAX, +}; + +enum ModuleID +{ + MODULE_UKNOWN = 0x00, + MODULE_01 = 0x01, + MODULE_02 = 0x02, + MODULE_MC = 0x03, + MODULE_04 = 0x04, + MODULE_MAINBOARD = 0x05, + MODULE_06 = 0x06, + MODULE_AMS = 0x07, + MODULE_TH = 0x08, + MODULE_09 = 0x09, + MODULE_10 = 0x0A, + MODULE_11 = 0x0B, + MODULE_XCAM = 0x0C, + MODULE_13 = 0x0D, + MODULE_14 = 0x0E, + MODULE_15 = 0x0F, + MODULE_MAX = 0x10 +}; + +class DevHMSItem +{ +public: + std::string get_long_error_code() const; + HMSMessageLevel get_level() const { return m_msg_level; } + + void set_read() { m_already_read = true; }; + bool has_read() const { return m_already_read; }; + +protected: + friend void DevHMS::ParseHMSItems(const json& hms_json); + bool parse_hms_info(unsigned attr, unsigned code); + +private: + ModuleID m_module_id; + unsigned m_module_num; + unsigned m_part_id; + unsigned m_reserved; + HMSMessageLevel m_msg_level = HMS_UNKNOWN; + int m_msg_code = 0; + bool m_already_read = false; +}; + +};// End of namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevInfo.cpp b/src/slic3r/GUI/DeviceCore/DevInfo.cpp new file mode 100644 index 0000000000..4c97ee36f5 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevInfo.cpp @@ -0,0 +1,7 @@ +#include "DevInfo.h" +#include "slic3r/GUI/DeviceManager.hpp" + +namespace Slic3r +{ + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevInfo.h b/src/slic3r/GUI/DeviceCore/DevInfo.h new file mode 100644 index 0000000000..bc48e6cf1d --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevInfo.h @@ -0,0 +1,37 @@ +#pragma once +#include +#include "slic3r/Utils/json_diff.hpp" +#include + +namespace Slic3r { + +class MachineObject; + +/* some static info of machine*/ /*TODO*/ +class DevInfo +{ +public: + DevInfo(MachineObject* obj) : m_owner(obj) {}; + +public: + //std::string GetDevName() const { return m_dev_name; } + //std::string GetDevId() const { return m_dev_id; } + //std::string GetDevIP() const { return m_dev_ip; } + //std::string GetPrinterTypeStr() const { return m_printer_type_str; } + //std::string GetPrinterSignal() const { return m_printer_signal; } + //std::string GetConnectType() const { return m_connect_type; } + //std::string GetBindState() const { return m_bind_state; } + +private: + //std::string m_dev_name; + //std::string m_dev_id; + //std::string m_dev_ip; + //std::string m_printer_type_str; + //std::string m_printer_signal; + //std::string m_connect_type; + //std::string m_bind_state; + + MachineObject* m_owner = nullptr; +}; + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevLamp.cpp b/src/slic3r/GUI/DeviceCore/DevLamp.cpp new file mode 100644 index 0000000000..19fd83e421 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevLamp.cpp @@ -0,0 +1,18 @@ +#include "DevLamp.h" + +static Slic3r::DevLamp::LIGHT_EFFECT _light_effect_parse(std::string effect_str) +{ + if (effect_str.compare("on") == 0) + return Slic3r::DevLamp::LIGHT_EFFECT_ON; + else if (effect_str.compare("off") == 0) + return Slic3r::DevLamp::LIGHT_EFFECT_OFF; + else if (effect_str.compare("flashing") == 0) + return Slic3r::DevLamp::LIGHT_EFFECT_FLASHING; + + return Slic3r::DevLamp::LIGHT_EFFECT_UNKOWN; +} + +void Slic3r::DevLamp::SetChamberLight(const std::string& status) +{ + m_chamber_light = _light_effect_parse(status); +} diff --git a/src/slic3r/GUI/DeviceCore/DevLamp.h b/src/slic3r/GUI/DeviceCore/DevLamp.h new file mode 100644 index 0000000000..437d7cf896 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevLamp.h @@ -0,0 +1,42 @@ +#pragma once + +namespace Slic3r +{ + + class MachineObject; + class DevLamp + { + public: + DevLamp(MachineObject* obj) : m_owner(obj) {}; + + public: + enum LIGHT_EFFECT + { + LIGHT_EFFECT_ON, + LIGHT_EFFECT_OFF, + LIGHT_EFFECT_FLASHING, + LIGHT_EFFECT_UNKOWN, + }; + + public: + void SetChamberLight(const std::string& status); + void SetChamberLight(LIGHT_EFFECT effect) { m_chamber_light = effect; } + bool IsChamberLightOn() const { return m_chamber_light == LIGHT_EFFECT_ON || m_chamber_light == LIGHT_EFFECT_FLASHING; } + + void SetLampCloseRecheck(bool enable) { m_lamp_close_recheck = enable;}; + bool HasLampCloseRecheck() const { return m_lamp_close_recheck; } + + public: + void CtrlSetChamberLight(LIGHT_EFFECT effect); + + private: + int command_set_chamber_light(LIGHT_EFFECT effect, int on_time = 500, int off_time = 500, int loops = 1, int interval = 1000); + int command_set_chamber_light2(LIGHT_EFFECT effect, int on_time = 500, int off_time = 500, int loops = 1, int interval = 1000); + + private: + MachineObject* m_owner = nullptr; + + bool m_lamp_close_recheck = false; + LIGHT_EFFECT m_chamber_light = LIGHT_EFFECT_UNKOWN; + }; +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp b/src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp new file mode 100644 index 0000000000..b35adc5cb3 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp @@ -0,0 +1,64 @@ +#include +#include "DevLamp.h" + +// TODO: remove this include +#include "slic3r/GUI/DeviceManager.hpp" + +using namespace nlohmann; + +namespace Slic3r +{ + + +static std::string _light_effect_str(DevLamp::LIGHT_EFFECT effect) +{ + switch (effect) + { + case Slic3r::DevLamp::LIGHT_EFFECT_ON: + return "on"; + case Slic3r::DevLamp::LIGHT_EFFECT_OFF: + return "off"; + case Slic3r::DevLamp::LIGHT_EFFECT_FLASHING: + return "flashing"; + default: + return "unknown"; + } + return "unknown"; +} + +void DevLamp::CtrlSetChamberLight(LIGHT_EFFECT effect) +{ + // copied from others, TODO CHECK + command_set_chamber_light(effect); + command_set_chamber_light2(effect); +} + +int DevLamp::command_set_chamber_light(LIGHT_EFFECT effect, int on_time, int off_time, int loops, int interval) +{ + json j; + j["system"]["command"] = "ledctrl"; + j["system"]["led_node"] = "chamber_light"; + j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["system"]["led_mode"] = _light_effect_str(effect); + j["system"]["led_on_time"] = on_time; + j["system"]["led_off_time"] = off_time; + j["system"]["loop_times"] = loops; + j["system"]["interval_time"] = interval; + return m_owner->publish_json(j); +} + +int DevLamp::command_set_chamber_light2(LIGHT_EFFECT effect, int on_time, int off_time, int loops, int interval) +{ + json j; + j["system"]["command"] = "ledctrl"; + j["system"]["led_node"] = "chamber_light2"; + j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["system"]["led_mode"] = _light_effect_str(effect); + j["system"]["led_on_time"] = on_time; + j["system"]["led_off_time"] = off_time; + j["system"]["loop_times"] = loops; + j["system"]["interval_time"] = interval; + return m_owner->publish_json(j); +} + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp new file mode 100644 index 0000000000..f3d6dac53e --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -0,0 +1,876 @@ +#include +#include "DevManager.h" +#include "DevUtil.h" + +// TODO: remove this include +#include "slic3r/GUI/DeviceManager.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" + +#include "libslic3r/Time.hpp" + +using namespace nlohmann; + +namespace Slic3r +{ + DeviceManager::DeviceManager(NetworkAgent* agent) + { + m_agent = agent; + m_refresher = new DeviceManagerRefresher(this); + + DevPrinterConfigUtil::InitFilePath(resources_dir()); + + // Load saved local machines + if (agent) { + AppConfig* config = GUI::wxGetApp().app_config; + const auto local_machines = config->get_local_machines(); + for (auto& it : local_machines) { + const auto& m = it.second; + MachineObject* obj = new MachineObject(this, m_agent, m.dev_name, m.dev_id, m.dev_ip); + obj->printer_type = m.printer_type; + obj->dev_connection_type = "lan"; + obj->bind_state = "free"; + obj->bind_sec_link = "secure"; + obj->m_is_online = true; + obj->last_alive = Slic3r::Utils::get_current_time_utc(); + obj->set_access_code(config->get("access_code", m.dev_id), false); + obj->set_user_access_code(config->get("user_access_code", m.dev_id), false); + if (obj->has_access_right()) { + localMachineList.insert(std::make_pair(m.dev_id, obj)); + } else { + config->erase_local_machine(m.dev_id); + delete obj; + } + } + } + } + + void DeviceManager::update_local_machine(const MachineObject& m) + { + AppConfig* config = GUI::wxGetApp().app_config; + if (config) { + if (m.is_lan_mode_printer()) { + if (m.has_access_right()) { + BBLocalMachine local_machine; + local_machine.dev_id = m.get_dev_id(); + local_machine.dev_name = m.get_dev_name(); + local_machine.dev_ip = m.get_dev_ip(); + local_machine.printer_type = m.printer_type; + config->update_local_machine(local_machine); + } + } else { + config->erase_local_machine(m.get_dev_id()); + } + } + } + + DeviceManager::~DeviceManager() + { + delete m_refresher; + + for (auto it = localMachineList.begin(); it != localMachineList.end(); it++) + { + if (it->second) + { + delete it->second; + it->second = nullptr; + } + } + localMachineList.clear(); + + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + if (it->second) + { + delete it->second; + it->second = nullptr; + } + } + userMachineList.clear(); + } + + + void DeviceManager::EnableMultiMachine(bool enable) + { + m_agent->enable_multi_machine(enable); + m_enable_mutil_machine = enable; + } + + void DeviceManager::start_refresher() { m_refresher->Start(); } + void DeviceManager::stop_refresher() { m_refresher->Stop(); } + + + void DeviceManager::keep_alive() + { + MachineObject* obj = this->get_selected_machine(); + if (obj) + { + if (obj->keep_alive_count == 0) + { + obj->last_keep_alive = std::chrono::system_clock::now(); + } + obj->keep_alive_count++; + std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); + auto internal = std::chrono::duration_cast(start - obj->last_keep_alive); + if (internal.count() > TIMEOUT_FOR_KEEPALIVE && (internal.count() < 1000 * 60 * 60 * 300)) + { + BOOST_LOG_TRIVIAL(info) << "keep alive = " << internal.count() << ", count = " << obj->keep_alive_count; + obj->command_request_push_all(); + obj->last_keep_alive = start; + } + else if (obj->m_push_count == 0) + { + BOOST_LOG_TRIVIAL(info) << "keep alive = " << internal.count() << ", push_count = 0, count = " << obj->keep_alive_count; + obj->command_request_push_all(); + obj->last_keep_alive = start; + } + } + } + + void DeviceManager::check_pushing() + { + keep_alive(); + MachineObject* obj = this->get_selected_machine(); + + std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); + auto internal = std::chrono::duration_cast(start - obj->last_update_time); + + if (obj && !obj->is_support_mqtt_alive) + { + if (internal.count() > TIMEOUT_FOR_STRAT && internal.count() < 1000 * 60 * 60 * 300) + { + BOOST_LOG_TRIVIAL(info) << "command_pushing: diff = " << internal.count(); + obj->command_pushing("start"); + } + } + } + + void DeviceManager::on_machine_alive(std::string json_str) + { + try { + json j = json::parse(json_str); + std::string dev_name = j["dev_name"].get(); + std::string dev_id = j["dev_id"].get(); + std::string dev_ip = j["dev_ip"].get(); + std::string printer_type_str= j["dev_type"].get(); + std::string printer_signal = j["dev_signal"].get(); + std::string connect_type = j["connect_type"].get(); + std::string bind_state = j["bind_state"].get(); + + if (connect_type == "farm") { + connect_type ="lan"; + bind_state = "free"; + } + + std::string sec_link = ""; + std::string ssdp_version = ""; + if (j.contains("sec_link")) { + sec_link = j["sec_link"].get(); + } + if (j.contains("ssdp_version")) { + ssdp_version = j["ssdp_version"].get(); + } + std::string connection_name = ""; + if (j.contains("connection_name")) { + connection_name = j["connection_name"].get(); + } + + MachineObject* obj; + + /* update userMachineList info */ + auto it = userMachineList.find(dev_id); + if (it != userMachineList.end()) { + if (it->second->get_dev_ip() != dev_ip || + it->second->bind_state != bind_state || + it->second->bind_sec_link != sec_link || + it->second->dev_connection_type != connect_type || + it->second->bind_ssdp_version != ssdp_version) + { + if (it->second->bind_state != bind_state) { + OnMachineBindStateChanged(it->second, bind_state); + } + + it->second->set_dev_ip(dev_ip); + it->second->bind_state = bind_state; + it->second->bind_sec_link = sec_link; + it->second->dev_connection_type = connect_type; + it->second->bind_ssdp_version = ssdp_version; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " UpdateUserMachineInfo" + << ", dev_id= " << dev_id + << ", ip = " <get_dev_ip() + << " to " << dev_ip; + obj->set_dev_ip(dev_ip); + } + else { + if ( obj->dev_connection_name.empty() || obj->dev_connection_name.compare(connection_name) == 0) { + BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << obj->get_dev_ip() + << " to " << dev_ip << " connection_name is " << connection_name; + if(obj->dev_connection_name.empty()){obj->dev_connection_name = connection_name;} + obj->set_dev_ip(dev_ip); + } + } + /* ip changed reconnect mqtt */ + } + + if (obj->wifi_signal != printer_signal || + obj->dev_connection_type != connect_type || + obj->bind_state != bind_state || + obj->bind_sec_link != sec_link || + obj->bind_ssdp_version != ssdp_version || + obj->printer_type != _parse_printer_type(printer_type_str)) + { + if (obj->dev_connection_type != connect_type || + obj->bind_state != bind_state || + obj->bind_sec_link != sec_link || + obj->bind_ssdp_version != ssdp_version || + obj->printer_type != _parse_printer_type(printer_type_str)) + { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " UpdateLocalMachineInfo" + << ", dev_id= " << dev_id + << ", ip = " << dev_ip + << ", printer_name= " << dev_name + << ", con_type= " << connect_type << ", signal= " << printer_signal + << ", bind_state= " << bind_state; + } + else + { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " UpdateLocalMachineInfo_WIFI" + << ", dev_id= " << dev_id + << ", ip = " << dev_ip + << ", printer_name= " << dev_name + << ", con_type= " << connect_type << ", signal= " << printer_signal + << ", bind_state= " << bind_state; + } + + obj->wifi_signal = printer_signal; + obj->dev_connection_type = connect_type; + obj->bind_state = bind_state; + obj->bind_sec_link = sec_link; + obj->bind_ssdp_version = ssdp_version; + obj->printer_type = _parse_printer_type(printer_type_str); + } + + // U0 firmware + if (obj->dev_connection_type.empty() && obj->bind_state.empty()) + obj->bind_state = "free"; + + obj->last_alive = Slic3r::Utils::get_current_time_utc(); + obj->m_is_online = true; + + /* if (!obj->dev_ip.empty()) { + Slic3r::GUI::wxGetApp().app_config->set_str("ip_address", obj->dev_id, obj->dev_ip); + Slic3r::GUI::wxGetApp().app_config->save(); + }*/ + } + else { + /* insert a new machine */ + obj = new MachineObject(this, m_agent, dev_name, dev_id, dev_ip); + obj->printer_type = _parse_printer_type(printer_type_str); + obj->wifi_signal = printer_signal; + obj->dev_connection_type = connect_type; + obj->bind_state = bind_state; + obj->bind_sec_link = sec_link; + obj->dev_connection_name = connection_name; + obj->bind_ssdp_version = ssdp_version; + obj->m_is_online = true; + + //load access code + AppConfig* config = Slic3r::GUI::wxGetApp().app_config; + if (config) { + obj->set_access_code(Slic3r::GUI::wxGetApp().app_config->get("access_code", dev_id), false); + obj->set_user_access_code(Slic3r::GUI::wxGetApp().app_config->get("user_access_code", dev_id), false); + } + localMachineList.insert(std::make_pair(dev_id, obj)); + + /* if (!obj->dev_ip.empty()) { + Slic3r::GUI::wxGetApp().app_config->set_str("ip_address", obj->dev_id, obj->dev_ip); + Slic3r::GUI::wxGetApp().app_config->save(); + }*/ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " New Machine, dev_id= " << dev_id + << ", ip = " << dev_ip <<", printer_name = " << dev_name + << ", con_type= " << connect_type <<", signal= " << printer_signal << ", bind_state= " << bind_state; + } + update_local_machine(*obj); + } + catch (...) { + ; + } + } + + MachineObject* DeviceManager::insert_local_device(const BBLocalMachine& machine, std::string connection_type, std::string bind_state, std::string version, std::string access_code) + { + MachineObject* obj; + auto it = localMachineList.find(machine.dev_id); + if (it != localMachineList.end()) { + obj = it->second; + } else { + obj = new MachineObject(this, m_agent, machine.dev_name, machine.dev_id, machine.dev_ip); + localMachineList.insert(std::make_pair(machine.dev_id, obj)); + } + obj->printer_type = _parse_printer_type(machine.printer_type); + obj->dev_connection_type = connection_type == "farm" ? "lan":connection_type; + obj->bind_state = connection_type == "farm" ? "free":bind_state; + obj->bind_sec_link = "secure"; + obj->bind_ssdp_version = version; + obj->m_is_online = true; + obj->last_alive = Slic3r::Utils::get_current_time_utc(); + obj->set_access_code(access_code, false); + obj->set_user_access_code(access_code, false); + + update_local_machine(*obj); + + return obj; + } + + int DeviceManager::query_bind_status(std::string& msg) + { + if (!m_agent) + { + msg = ""; + return -1; + } + + BOOST_LOG_TRIVIAL(trace) << "DeviceManager::query_bind_status"; + std::map::iterator it; + std::vector query_list; + for (it = localMachineList.begin(); it != localMachineList.end(); it++) + { + query_list.push_back(it->first); + } + + unsigned int http_code; + std::string http_body; + int result = m_agent->query_bind_status(query_list, &http_code, &http_body); + + if (result < 0) + { + msg = (boost::format("code=%1%,body=%2") % http_code % http_body).str(); + } + else + { + msg = ""; + try + { + json j = json::parse(http_body); + if (j.contains("bind_list")) + { + + for (auto& item : j["bind_list"]) + { + auto it = localMachineList.find(item["dev_id"].get()); + if (it != localMachineList.end()) + { + if (!item["user_id"].is_null()) + it->second->bind_user_id = item["user_id"].get(); + if (!item["user_name"].is_null()) + it->second->bind_user_name = item["user_name"].get(); + else + it->second->bind_user_name = "Free"; + } + } + } + } + catch (...) + { + ; + } + } + return result; + } + + MachineObject* DeviceManager::get_user_machine(std::string dev_id) + { + if (!m_agent || !m_agent->is_user_login()) + { + return nullptr; + } + + std::map::iterator it = userMachineList.find(dev_id); + if (it == userMachineList.end()) return nullptr; + return it->second; + } + + MachineObject* DeviceManager::get_my_machine(std::string dev_id) + { + auto list = get_my_machine_list(); + auto it = list.find(dev_id); + if (it != list.end()) + { + return it->second; + } + return nullptr; + } + + void DeviceManager::clean_user_info() + { + BOOST_LOG_TRIVIAL(trace) << "DeviceManager::clean_user_info"; + // reset selected_machine + selected_machine = ""; + local_selected_machine = ""; + + // clean user list + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + if (it->second) + { + it->second->set_access_code(""); + delete it->second; + it->second = nullptr; + } + } + userMachineList.clear(); + } + + bool DeviceManager::set_selected_machine(std::string dev_id) + { + BOOST_LOG_TRIVIAL(info) << "set_selected_machine=" << dev_id; + auto my_machine_list = get_my_machine_list(); + auto it = my_machine_list.find(dev_id); + + // disconnect last + auto last_selected = my_machine_list.find(selected_machine); + if (last_selected != my_machine_list.end()) + { + if (last_selected->second->connection_type() == "lan") + { + m_agent->disconnect_printer(); + } + } + + // connect curr + if (it != my_machine_list.end()) + { + if (selected_machine == dev_id) + { + if (it->second->connection_type() != "lan") + { + // only reset update time + it->second->reset_update_time(); + + // check subscribe state + Slic3r::GUI::wxGetApp().on_start_subscribe_again(dev_id); + + return true; + } + else + { + // lan mode printer reconnect printer + if (m_agent) + { + m_agent->disconnect_printer(); + it->second->reset(); + +#if !BBL_RELEASE_TO_PUBLIC + it->second->connect(Slic3r::GUI::wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false); +#else + it->second->connect(it->second->local_use_ssl_for_mqtt); +#endif + it->second->set_lan_mode_connection_state(true); + } + } + } + else + { + if (m_agent) + { + if (it->second->connection_type() != "lan" || it->second->connection_type().empty()) + { + if (m_agent->get_user_selected_machine() == dev_id) + { + it->second->reset_update_time(); + } + else + { + BOOST_LOG_TRIVIAL(info) << "static: set_selected_machine: same dev_id = " << dev_id; + m_agent->set_user_selected_machine(dev_id); + it->second->reset(); + } + } + else + { + BOOST_LOG_TRIVIAL(info) << "static: set_selected_machine: same dev_id = empty"; + it->second->reset(); +#if !BBL_RELEASE_TO_PUBLIC + it->second->connect(Slic3r::GUI::wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false); +#else + it->second->connect(it->second->local_use_ssl_for_mqtt); +#endif + m_agent->set_user_selected_machine(dev_id); + it->second->set_lan_mode_connection_state(true); + } + } + } + for (auto& data : it->second->m_nozzle_filament_data) + { + data.second.checked_filament.clear(); + } + } + selected_machine = dev_id; + return true; + } + + MachineObject* DeviceManager::get_selected_machine() + { + if (selected_machine.empty()) return nullptr; + + MachineObject* obj = get_user_machine(selected_machine); + if (obj) + return obj; + + // return local machine has access code + auto it = localMachineList.find(selected_machine); + if (it != localMachineList.end()) + { + if (it->second->has_access_right()) + return it->second; + } + return nullptr; + } + + void DeviceManager::add_user_subscribe() + { + /* user machine */ + std::vector dev_list; + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + dev_list.push_back(it->first); + BOOST_LOG_TRIVIAL(trace) << "add_user_subscribe: " << it->first; + } + m_agent->add_subscribe(dev_list); + } + + + void DeviceManager::del_user_subscribe() + { + /* user machine */ + std::vector dev_list; + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + dev_list.push_back(it->first); + BOOST_LOG_TRIVIAL(trace) << "del_user_subscribe: " << it->first; + } + m_agent->del_subscribe(dev_list); + } + + void DeviceManager::subscribe_device_list(std::vector dev_list) + { + std::vector unsub_list; + subscribe_list_cache.clear(); + for (auto& it : subscribe_list_cache) + { + if (it != selected_machine) + { + unsub_list.push_back(it); + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: unsub dev id = " << it; + } + } + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: unsub_list size = " << unsub_list.size(); + + if (!selected_machine.empty()) + { + subscribe_list_cache.push_back(selected_machine); + } + for (auto& it : dev_list) + { + subscribe_list_cache.push_back(it); + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: sub dev id = " << it; + } + BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: sub_list size = " << subscribe_list_cache.size(); + if (!unsub_list.empty()) + m_agent->del_subscribe(unsub_list); + if (!dev_list.empty()) + m_agent->add_subscribe(subscribe_list_cache); + } + + std::map DeviceManager::get_my_machine_list() + { + std::map result; + + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + if (it->second && !it->second->is_lan_mode_printer()) + { + result.insert(std::make_pair(it->first, it->second)); + } + } + + for (auto it = localMachineList.begin(); it != localMachineList.end(); it++) + { + if (it->second && it->second->has_access_right() && it->second->is_avaliable() && it->second->is_lan_mode_printer()) + { + // remove redundant in userMachineList + if (result.find(it->first) == result.end()) + { + result.emplace(std::make_pair(it->first, it->second)); + } + } + } + return result; + } + + std::map DeviceManager::get_my_cloud_machine_list() + { + std::map result; + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + if (it->second && !it->second->is_lan_mode_printer()) { result.emplace(*it); } + } + return result; + } + + std::string DeviceManager::get_first_online_user_machine() const + { + for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) + { + if (it->second && it->second->is_online()) + { + return it->second->get_dev_id(); + } + } + return ""; + } + + void DeviceManager::modify_device_name(std::string dev_id, std::string dev_name) + { + BOOST_LOG_TRIVIAL(trace) << "modify_device_name"; + if (m_agent) + { + int result = m_agent->modify_printer_name(dev_id, dev_name); + if (result == 0) + { + update_user_machine_list_info(); + } + } + } + + void DeviceManager::parse_user_print_info(std::string body) + { + if (device_subseries.size() <= 0) { + device_subseries = DevPrinterConfigUtil::get_all_subseries(); + if (device_subseries.size() <= 0) { + device_subseries.insert(std::pair>("", std::vector())); + } + } + + BOOST_LOG_TRIVIAL(trace) << "DeviceManager::parse_user_print_info"; + std::lock_guard lock(listMutex); + std::set new_list; + try + { + json j = json::parse(body); + +#if !BBL_RELEASE_TO_PUBLIC + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": " << j; +#endif + + if (j.contains("devices") && !j["devices"].is_null()) + { + for (auto& elem : j["devices"]) + { + MachineObject* obj = nullptr; + std::string dev_id; + if (!elem["dev_id"].is_null()) + { + dev_id = elem["dev_id"].get(); + new_list.insert(dev_id); + } + std::map::iterator iter = userMachineList.find(dev_id); + if (iter != userMachineList.end()) + { + /* update field */ + obj = iter->second; + obj->set_dev_id(dev_id); + } + else + { + obj = new MachineObject(this, m_agent, "", "", ""); + if (m_agent) + { + obj->set_bind_status(m_agent->get_user_name()); + } + + if (obj->get_dev_ip().empty()) + { + obj->get_dev_ip() = Slic3r::GUI::wxGetApp().app_config->get("ip_address", dev_id); + } + userMachineList.insert(std::make_pair(dev_id, obj)); + } + + if (!obj) continue; + + if (!elem["dev_id"].is_null()) + obj->set_dev_id(elem["dev_id"].get()); + if (!elem["dev_name"].is_null()) + obj->set_dev_name(elem["dev_name"].get()); + if (!elem["dev_online"].is_null()) + obj->m_is_online = elem["dev_online"].get(); + if (elem.contains("dev_model_name") && !elem["dev_model_name"].is_null()) { + auto printer_type = elem["dev_model_name"].get(); + for (const std::pair> &pair : device_subseries) { + auto it = std::find(pair.second.begin(), pair.second.end(), printer_type); + if (it != pair.second.end()) + { + obj->printer_type = Slic3r::_parse_printer_type(pair.first); + break; + } + else + { + obj->printer_type = Slic3r::_parse_printer_type(printer_type); + } + } + } + if (!elem["task_status"].is_null()) + obj->iot_print_status = elem["task_status"].get(); + if (elem.contains("dev_product_name") && !elem["dev_product_name"].is_null()) + obj->dev_product_name = elem["dev_product_name"].get(); + if (elem.contains("dev_access_code") && !elem["dev_access_code"].is_null()) + { + std::string acc_code = elem["dev_access_code"].get(); + acc_code.erase(std::remove(acc_code.begin(), acc_code.end(), '\n'), acc_code.end()); + obj->set_access_code(acc_code); + } + } + + //remove MachineObject from userMachineList + std::map::iterator iterat; + for (iterat = userMachineList.begin(); iterat != userMachineList.end(); ) + { + if (new_list.find(iterat->first) == new_list.end()) + { + iterat = userMachineList.erase(iterat); + } + else + { + iterat++; + } + } + } + } + catch (std::exception& e) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << " exception=" << e.what(); + } + } + + void DeviceManager::update_user_machine_list_info() + { + if (!m_agent) return; + + BOOST_LOG_TRIVIAL(debug) << "update_user_machine_list_info"; + unsigned int http_code; + std::string body; + int result = m_agent->get_user_print_info(&http_code, &body); + if (result == 0) + { + parse_user_print_info(body); + } + } + + void DeviceManager::load_last_machine() + { + // Get all available machines, include cloud machines and lan machines that have access right + auto all_machines = get_my_machine_list(); + if (all_machines.empty()) + return; + + // Then connect to the machine we last selected if available + const std::string last_monitor_machine = m_agent ? m_agent->get_user_selected_machine() : ""; + const auto last_machine = all_machines.find(last_monitor_machine); + if (last_machine != all_machines.end()) { + this->set_selected_machine(last_machine->second->get_dev_id()); + } else { + // If not, then select the first available one + this->set_selected_machine(all_machines.begin()->second->get_dev_id()); + } + } + + void DeviceManager::OnMachineBindStateChanged(MachineObject* obj, const std::string& new_state) + { + if (!obj) { return; } + if (obj->get_dev_id() == selected_machine) + { + if (new_state == "free") { OnSelectedMachineLost(); } + } + } + + void DeviceManager::OnSelectedMachineLost() + { + GUI::wxGetApp().sidebar().update_sync_status(nullptr); + GUI::wxGetApp().sidebar().load_ams_list(string(), nullptr); + } + + void DeviceManager::reload_printer_settings() + { + for (auto obj : this->userMachineList) { obj.second->reload_printer_settings(); }; + } + + + DeviceManagerRefresher::DeviceManagerRefresher(DeviceManager* manger) : wxObject() + { + m_manager = manger; + m_timer = new wxTimer(); + m_timer->Bind(wxEVT_TIMER, &DeviceManagerRefresher::on_timer, this); + } + + DeviceManagerRefresher::~DeviceManagerRefresher() + { + m_timer->Stop(); + delete m_timer; + } + + void DeviceManagerRefresher::on_timer(wxTimerEvent& event) + { + if (!m_manager) { return; } + + NetworkAgent* agent = m_manager->get_agent(); + if (!agent) { return; } + + // reset to active + Slic3r::GUI::wxGetApp().reset_to_active(); + + MachineObject* obj = m_manager->get_selected_machine(); + if (!obj) { return; } + + // check valid machine + if (obj && m_manager->get_my_machine(obj->get_dev_id()) == nullptr) + { + m_manager->set_selected_machine(""); + agent->set_user_selected_machine(""); + return; + } + + // do some refresh + if (Slic3r::GUI::wxGetApp().is_user_login()) + { + m_manager->check_pushing(); + try + { + agent->refresh_connection(); + } + catch (...) + { + ; + } + } + + // certificate + agent->install_device_cert(obj->get_dev_id(), obj->is_lan_mode_printer()); + } +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevManager.h b/src/slic3r/GUI/DeviceCore/DevManager.h new file mode 100644 index 0000000000..0679b18579 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevManager.h @@ -0,0 +1,125 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" + +#include "slic3r/Utils/json_diff.hpp" +#include + +namespace Slic3r +{ +//Previous definitions +struct BBLocalMachine; +class MachineObject; +class NetworkAgent; + +class DeviceManagerRefresher; +class DeviceManager +{ + friend class GUI_App; + friend class DeviceManagerRefresher; +private: + NetworkAgent* m_agent{ nullptr }; + DeviceManagerRefresher* m_refresher{ nullptr }; + + bool m_enable_mutil_machine = false; + + std::mutex listMutex; + std::string selected_machine; /* dev_id */ + std::string local_selected_machine; /* dev_id */ + std::map localMachineList; /* dev_id -> MachineObject*, localMachine SSDP */ + std::map userMachineList; /* dev_id -> MachineObject* cloudMachine of User */ + +public: + DeviceManager(NetworkAgent* agent = nullptr); + ~DeviceManager(); + +public: + NetworkAgent* get_agent() const { return m_agent; } + void set_agent(NetworkAgent* agent) { m_agent = agent; } + + void start_refresher(); + void stop_refresher(); + + MachineObject* get_selected_machine(); + bool set_selected_machine(std::string dev_id); + + // local machine + void set_local_selected_machine(std::string dev_id) { local_selected_machine = dev_id; }; + MachineObject* get_local_selected_machine() const { return get_local_machine(local_selected_machine); } + + // local machine list + void erase_local_machine(std::string dev_id) { localMachineList.erase(dev_id); } + std::map get_local_machinelist() const { return localMachineList; } + MachineObject* get_local_machine(std::string dev_id) const + { + auto it = localMachineList.find(dev_id); + return (it != localMachineList.end()) ? it->second : nullptr; + } + + // user machine + std::map get_user_machinelist() const { return userMachineList; } + std::string get_first_online_user_machine() const; + void erase_user_machine(std::string dev_id) { userMachineList.erase(dev_id); } + void clean_user_info(); + + void load_last_machine(); + void update_user_machine_list_info(); + void parse_user_print_info(std::string body); + void reload_printer_settings(); + + MachineObject* get_user_machine(std::string dev_id); + + // subscribe + void add_user_subscribe(); + void del_user_subscribe(); + void subscribe_device_list(std::vector dev_list); + + /* my machine*/ + MachineObject* get_my_machine(std::string dev_id); + std::map get_my_machine_list(); + std::map get_my_cloud_machine_list(); + void modify_device_name(std::string dev_id, std::string dev_name); + + /* create machine or update machine properties */ + void on_machine_alive(std::string json_str); + int query_bind_status(std::string& msg); + + // mutil-device + void EnableMultiMachine(bool enable = true); + bool IsMultiMachineEnabled() const { return m_enable_mutil_machine; } + std::vector subscribe_list_cache;//multiple machine subscribe list cache + std::map> device_subseries; + +private: + void keep_alive(); + void check_pushing(); + + void OnMachineBindStateChanged(MachineObject* obj, const std::string& new_state); + void OnSelectedMachineLost(); + + + /*TODO*/ +public: + // to remove + MachineObject* insert_local_device(const BBLocalMachine& machine, std::string connection_type, std::string bind_state, std::string version, std::string access_code); + static void update_local_machine(const MachineObject& m); +}; + +class DeviceManagerRefresher : public wxObject +{ + wxTimer* m_timer{ nullptr }; + int m_timer_interval_msec = 1000; + + DeviceManager* m_manager{ nullptr }; + +public: + DeviceManagerRefresher(DeviceManager* manger); + ~DeviceManagerRefresher(); + +public: + void Start() { m_timer->Start(m_timer_interval_msec); } + void Stop() { m_timer->Stop(); } + +protected: + virtual void on_timer(wxTimerEvent& event); +}; +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevMapping.cpp b/src/slic3r/GUI/DeviceCore/DevMapping.cpp new file mode 100644 index 0000000000..52d324c646 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevMapping.cpp @@ -0,0 +1,364 @@ +#include +#include "DevMapping.h" +#include "DevFilaSystem.h" +#include "DevUtil.h" + +// TODO: remove this include +#include "slic3r/GUI/DeviceManager.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/GuiColor.hpp" + +using namespace nlohmann; + +namespace Slic3r +{ + bool DevMappingUtil::is_valid_mapping_result(const MachineObject* obj, std::vector& result, bool check_empty_slot) + { + if (result.empty()) return false; + + for (int i = 0; i < result.size(); i++) + { + // invalid mapping result + if (result[i].tray_id < 0) + { + if (result[i].ams_id.empty() && result[i].slot_id.empty()) + { + return false; + } + } + else + { + + auto ams_item = obj->GetFilaSystem()->GetAmsById(result[i].ams_id); + if (ams_item == nullptr) + { + if ((result[i].ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) && + (result[i].ams_id != std::to_string(VIRTUAL_TRAY_DEPUTY_ID))) + { + result[i].tray_id = -1; + return false; + } + } + else + { + if (check_empty_slot) + { + auto tray_item = ams_item->GetTrays().find(result[i].slot_id); + if (tray_item == ams_item->GetTrays().end()) + { + result[i].tray_id = -1; + return false; + } + else + { + if (!tray_item->second->is_exists) + { + result[i].tray_id = -1; + return false; + } + } + } + } + } + } + return true; + } + + // calc distance map + struct DisValue { + int tray_id; + float distance; + bool is_same_color = true; + bool is_type_match = true; + }; + + static void _parse_tray_info(int ams_id, int slot_id, DevAmsTray tray, FilamentInfo& result) + { + result.color = tray.color; + result.type = tray.get_filament_type(); + result.filament_id = tray.setting_id; + result.ctype = tray.ctype; + result.colors = tray.cols; + + /*for new ams mapping*/ + result.ams_id = std::to_string(ams_id); + result.slot_id = std::to_string(slot_id); + + if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID) + { + result.tray_id = atoi(tray.id.c_str()); + result.id = atoi(tray.id.c_str()); + } + else + { + result.id = ams_id * 4 + slot_id; + } + } + + int DevMappingUtil::ams_filament_mapping(const MachineObject* obj, const std::vector& filaments, std::vector& result, std::vector map_opt, std::vector exclude_id, bool nozzle_has_ams_then_ignore_ext) + { + if (filaments.empty()) + return -1; + + ///////////////////////// + // Step 1: collect filaments in machine + std::map tray_filaments; // tray_index : tray_color + bool left_nozzle_has_ams = false, right_nozzle_has_ams = false; + + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + for (auto ams = ams_list.begin(); ams != ams_list.end(); ams++) + { + std::string ams_id = ams->second->GetAmsId(); + auto ams_type = ams->second->GetAmsType(); + for (auto tray = ams->second->GetTrays().begin(); tray != ams->second->GetTrays().end(); tray++) + { + int ams_id = atoi(ams->first.c_str()); + int tray_id = atoi(tray->first.c_str()); + int tray_index = 0; + if (ams_type == DevAms::AMS || ams_type == DevAms::AMS_LITE || ams_type == DevAms::N3F) + { + tray_index = ams_id * 4 + tray_id; + } + else if (ams_type == DevAms::N3S) + { + tray_index = ams_id + tray_id; + } + else + { + assert(0); + } + + // skip exclude id + for (int i = 0; i < exclude_id.size(); i++) + { + if (tray_index == exclude_id[i]) + continue; + } + // push + FilamentInfo info; + if (tray->second->is_tray_info_ready()) + { + _parse_tray_info(ams_id, tray_id, *(tray->second), info); + } + + //first: left,nozzle=1,map=1 second: right,nozzle=0,map=2 + bool right_ams_valid = ams->second->GetExtruderId() == 0 && map_opt[MappingOption::USE_RIGHT_AMS]; + bool left_ams_valid = ams->second->GetExtruderId() == 1 && map_opt[MappingOption::USE_LEFT_AMS]; + if (right_ams_valid || left_ams_valid) + { + tray_filaments.emplace(std::make_pair(tray_index, info)); + if (right_ams_valid) + { + right_nozzle_has_ams = true; + } + if (left_ams_valid) + { + left_nozzle_has_ams = true; + } + } + } + } + + if (map_opt[MappingOption::USE_RIGHT_EXT] || map_opt[MappingOption::USE_LEFT_EXT]) + { + for (auto tray : obj->vt_slot) + { + bool right_ext_valid = (tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID) && map_opt[MappingOption::USE_RIGHT_EXT]); + bool left_ext_valid = (tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID) && map_opt[MappingOption::USE_LEFT_EXT]); + if (right_ext_valid || left_ext_valid) + { + if (nozzle_has_ams_then_ignore_ext) + { + if (right_ext_valid && right_nozzle_has_ams) + { + continue; + } + if (left_ext_valid && left_nozzle_has_ams) + { + continue; + } + } + FilamentInfo info; + _parse_tray_info(atoi(tray.id.c_str()), 0, tray, info); + tray_filaments.emplace(std::make_pair(info.tray_id, info)); + } + } + } + + ///////////////////////// + // Step 2: collect the distances of filaments_in_slicing to filaments_in_machine + char buffer[256]; + std::vector> distance_map; + + // print title + ::sprintf(buffer, "F(id)"); + std::string line = std::string(buffer); + for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++) + { + ::sprintf(buffer, " AMS%02d", tray->second.id + 1); + line += std::string(buffer); + } + BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line;// Print the collected filaments + + for (int i = 0; i < filaments.size(); i++) + { + std::vector rol; + ::sprintf(buffer, "F(%02d)", filaments[i].id + 1); + line = std::string(buffer); + for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++) + { + DisValue val; + val.tray_id = tray->second.id; + wxColour c = wxColour(filaments[i].color); + wxColour tray_c = DevAmsTray::decode_color(tray->second.color); + val.distance = GUI::calc_color_distance(c, tray_c); + if (filaments[i].type != tray->second.type) + { + val.distance = 999999; + val.is_type_match = false; + } + else + { + if (c.Alpha() != tray_c.Alpha()) + val.distance = 999999; + val.is_type_match = true; + } + ::sprintf(buffer, " %6.0f", val.distance); + line += std::string(buffer); + rol.push_back(val); + } + BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line; + distance_map.push_back(rol); + } + + ///////////////////////// + // Step 3: do mapping algorithm + + // setup the mapping result + for (int i = 0; i < filaments.size(); i++) + { + FilamentInfo info; + info.id = filaments[i].id; + info.tray_id = -1; + info.type = filaments[i].type; + info.filament_id = filaments[i].filament_id; + result.push_back(info); + } + + // traverse the mapping + std::set picked_src; + std::set picked_tar; + for (int k = 0; k < distance_map.size(); k++) + { + float min_val = INT_MAX; + int picked_src_idx = -1; + int picked_tar_idx = -1; + for (int i = 0; i < distance_map.size(); i++) + { + if (picked_src.find(i) != picked_src.end()) + continue; + + // try to mapping to different tray + for (int j = 0; j < distance_map[i].size(); j++) + { + if (picked_tar.find(j) != picked_tar.end()) + { + if (distance_map[i][j].is_same_color + && distance_map[i][j].is_type_match + && distance_map[i][j].distance < (float)0.0001) + { + min_val = distance_map[i][j].distance; + picked_src_idx = i; + picked_tar_idx = j; + tray_filaments[picked_tar_idx].distance = min_val; + } + continue; + } + + if (distance_map[i][j].is_same_color + && distance_map[i][j].is_type_match) + { + if (min_val > distance_map[i][j].distance) + { + + min_val = distance_map[i][j].distance; + picked_src_idx = i; + picked_tar_idx = j; + tray_filaments[picked_tar_idx].distance = min_val; + } + else if (min_val == distance_map[i][j].distance && filaments[picked_src_idx].filament_id != tray_filaments[picked_tar_idx].filament_id && filaments[i].filament_id == tray_filaments[j].filament_id) + { + + picked_src_idx = i; + picked_tar_idx = j; + } + } + } + + // take a retry to mapping to used tray + if (picked_src_idx < 0 || picked_tar_idx < 0) + { + for (int j = 0; j < distance_map[i].size(); j++) + { + if (distance_map[i][j].is_same_color && distance_map[i][j].is_type_match) + { + if (min_val > distance_map[i][j].distance) + { + min_val = distance_map[i][j].distance; + picked_src_idx = i; + picked_tar_idx = j; + tray_filaments[picked_tar_idx].distance = min_val; + } + else if (min_val == distance_map[i][j].distance && filaments[picked_src_idx].filament_id != tray_filaments[picked_tar_idx].filament_id && filaments[i].filament_id == tray_filaments[j].filament_id) + { + picked_src_idx = i; + picked_tar_idx = j; + } + } + } + } + } + + if (picked_src_idx >= 0 && picked_tar_idx >= 0) + { + auto tray = tray_filaments.find(distance_map[k][picked_tar_idx].tray_id); + + if (tray != tray_filaments.end()) + { + result[picked_src_idx].tray_id = tray->first; + + result[picked_src_idx].color = tray->second.color; + result[picked_src_idx].type = tray->second.type; + result[picked_src_idx].distance = tray->second.distance; + result[picked_src_idx].filament_id = tray->second.filament_id; + result[picked_src_idx].ctype = tray->second.ctype; + result[picked_src_idx].colors = tray->second.colors; + + /*for new ams mapping*/ + result[picked_src_idx].ams_id = tray->second.ams_id; + result[picked_src_idx].slot_id = tray->second.slot_id; + } + + ::sprintf(buffer, "ams_mapping, picked F(%02d) AMS(%02d), distance=%6.0f", picked_src_idx + 1, picked_tar_idx + 1, + distance_map[picked_src_idx][picked_tar_idx].distance); + BOOST_LOG_TRIVIAL(info) << std::string(buffer); + picked_src.insert(picked_src_idx); + picked_tar.insert(picked_tar_idx); + } + } + + //check ams mapping result + if (DevMappingUtil::is_valid_mapping_result(obj, result, true)) + { + return 0; + } + + /* for (auto it = result.begin(); it != result.end(); it++) {//This code has never been effective before 2025.03.18 + if (it->distance >= 6000) { + it->tray_id = -1; + } + }*/ + return 0; + } + +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevMapping.h b/src/slic3r/GUI/DeviceCore/DevMapping.h new file mode 100644 index 0000000000..e3169a03eb --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevMapping.h @@ -0,0 +1,33 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" +#include "libslic3r/ProjectTask.hpp" + +#include "slic3r/Utils/json_diff.hpp" +#include + +namespace Slic3r +{ +//Previous definitions +class MachineObject; + +enum MappingOption +{ + USE_LEFT_AMS = 0, + USE_RIGHT_AMS, + USE_LEFT_EXT, + USE_RIGHT_EXT +}; + +class DevMappingUtil +{ +public: + DevMappingUtil() = delete; + ~DevMappingUtil() = delete; + +public: + static bool is_valid_mapping_result(const MachineObject* obj, std::vector& result, bool check_empty_slot = false); + + static int ams_filament_mapping(const MachineObject* obj, const std::vector& filaments, std::vector& result, std::vector map_opt, std::vector exclude_id = std::vector(), bool nozzle_has_ams_then_ignore_ext = false); +}; + +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp b/src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp new file mode 100644 index 0000000000..0fbfa4766a --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp @@ -0,0 +1,129 @@ +#include "DevExtruderSystem.h" +#include "DevNozzleSystem.h" +#include "DevUtil.h" + +#include "slic3r/GUI/DeviceManager.hpp" + +namespace Slic3r +{ + +DevNozzle DevNozzleSystem::GetNozzle(int id) const +{ + if (m_nozzles.find(id) != m_nozzles.end()) + { + return m_nozzles.at(id); + } + + return DevNozzle(); +} + +void DevNozzleSystem::Reset() +{ + m_nozzles.clear(); + m_extder_exist = 0; + m_state = 0; // idle state +} + + +static unordered_map _str2_nozzle_flow_type = { + {"S", NozzleFlowType::S_FLOW}, + {"H", NozzleFlowType::H_FLOW}, + {"A", NozzleFlowType::S_FLOW}, + {"X", NozzleFlowType::S_FLOW} +}; + +static unordered_map _str2_nozzle_type = { + {"00", NozzleType::ntStainlessSteel}, + {"01", NozzleType::ntHardenedSteel}, + {"05", NozzleType::ntTungstenCarbide} +}; + +static void s_parse_nozzle_type(const std::string& nozzle_type_str, DevNozzle& nozzle) +{ + if (NozzleTypeStrToEumn.count(nozzle_type_str) != 0) + { + nozzle.m_nozzle_type = NozzleTypeStrToEumn[nozzle_type_str]; + } + else if (nozzle_type_str.length() >= 4) + { + const std::string& flow_type_str = nozzle_type_str.substr(1, 1); + if (_str2_nozzle_flow_type.count(flow_type_str) != 0) + { + nozzle.m_nozzle_flow = _str2_nozzle_flow_type[flow_type_str]; + } + const std::string& type_str = nozzle_type_str.substr(2, 2); + if (_str2_nozzle_type.count(type_str) != 0) + { + nozzle.m_nozzle_type = _str2_nozzle_type[type_str]; + } + } +} + + +void DevNozzleSystemParser::ParseV1_0(const nlohmann::json& nozzletype_json, + const nlohmann::json& diameter_json, + DevNozzleSystem* system) +{ + //Since both the old and new protocols push data. + // assert(system->m_nozzles.size() < 2); + DevNozzle nozzle; + nozzle.m_nozzle_id = 0; + nozzle.m_nozzle_flow = NozzleFlowType::S_FLOW; // default flow type + + { + float nozzle_diameter = 0.0f; + if (diameter_json.is_number_float()) + { + nozzle_diameter = diameter_json.get(); + } + else if (diameter_json.is_string()) + { + nozzle_diameter = DevUtil::string_to_float(diameter_json.get()); + } + + if (nozzle_diameter == 0.0f) + { + nozzle.m_diameter = 0.0f; + } + else + { + nozzle.m_diameter = round(nozzle_diameter * 10) / 10; + } + } + + { + if (nozzletype_json.is_string()) + { + s_parse_nozzle_type(nozzletype_json.get(), nozzle); + } + } + + system->m_nozzles.emplace(0, nozzle); +} + + +void DevNozzleSystemParser::ParseV2_0(const json& nozzle_json, DevNozzleSystem* system) +{ + system->Reset(); + + if (nozzle_json.contains("exist")) + { + system->m_extder_exist = DevUtil::get_flag_bits(nozzle_json["exist"].get(), 0, 16); + } + + if (nozzle_json.contains("state")) + { + system->m_state = DevUtil::get_flag_bits(nozzle_json["state"].get(), 0, 4); + } + + for (auto it = nozzle_json["info"].begin(); it != nozzle_json["info"].end(); it++) + { + DevNozzle nozzle_obj; + const auto& njon = it.value(); + nozzle_obj.m_nozzle_id = njon["id"].get(); + nozzle_obj.m_diameter = njon["diameter"].get(); + s_parse_nozzle_type(njon["type"].get(), nozzle_obj); + system->m_nozzles[nozzle_obj.m_nozzle_id] = nozzle_obj; + } +} +} \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevNozzleSystem.h b/src/slic3r/GUI/DeviceCore/DevNozzleSystem.h new file mode 100644 index 0000000000..d6d7ed9db4 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevNozzleSystem.h @@ -0,0 +1,50 @@ +#pragma once +#include "libslic3r/CommonDefs.hpp" +#include "slic3r/Utils/json_diff.hpp" + +#include +#include + +namespace Slic3r +{ + // Previous definitions + class MachineObject; + + struct DevNozzle + { + int m_nozzle_id = -1; + NozzleFlowType m_nozzle_flow = NozzleFlowType::S_FLOW;// 0-common 1-high flow + NozzleType m_nozzle_type = NozzleType::ntUndefine;// 0-stainless_steel 1-hardened_steel 5-tungsten_carbide + float m_diameter = 0.4f;// 0.2mm 0.4mm 0.6mm 0.8mm + }; + + class DevNozzleSystem + { + friend class DevNozzleSystemParser; + public: + DevNozzleSystem(MachineObject* owner) : m_owner(owner) {} + + public: + bool ContainsNozzle(int id) const { return m_nozzles.find(id) != m_nozzles.end(); } + DevNozzle GetNozzle(int id) const; + const std::map& GetNozzles() const { return m_nozzles;} + + private: + void Reset(); + + private: + MachineObject* m_owner = nullptr; + + int m_extder_exist = 0; //0- none exist 1-exist, unused + int m_state = 0; //0-idle 1-checking, unused + std::map m_nozzles; + + }; + + class DevNozzleSystemParser + { + public: + static void ParseV1_0(const nlohmann::json& nozzletype_json, const nlohmann::json& diameter_json, DevNozzleSystem* system); + static void ParseV2_0(const json& nozzle_json, DevNozzleSystem* system); + }; +}; \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp b/src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp new file mode 100644 index 0000000000..9083c758ca --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp @@ -0,0 +1,280 @@ +#include "DevPrintOptions.h" +#include "DevUtil.h" + +#include "slic3r/GUI/DeviceManager.hpp" + +namespace Slic3r +{ + +void DevPrintOptionsParser::Parse(DevPrintOptions* opts, const nlohmann::json& print_json) +{ + try + { + if (print_json.contains("spd_lvl")) + { + opts->m_speed_level = static_cast(print_json["spd_lvl"].get()); + } + + if (print_json.contains("cfg")) + { + const std::string& cfg = print_json["cfg"].get(); + opts->m_speed_level = (DevPrintingSpeedLevel)DevUtil::get_flag_bits(cfg, 8, 3); + } + } + catch (const std::exception& e) + { + BOOST_LOG_TRIVIAL(error) << "DevPrintOptionsParser::Parse: Failed to parse print options from JSON." << e.what(); + } +} + +void DevPrintOptionsParser::ParseDetectionV1_0(DevPrintOptions *opts, MachineObject *obj, const nlohmann::json &print_json) +{ + try { + if (print_json.contains("xcam")) { + if (time(nullptr) - opts->xcam_ai_monitoring_hold_start > HOLD_TIME_3SEC) { + if (print_json["xcam"].contains("printing_monitor")) { + // new protocol + opts->xcam_ai_monitoring = print_json["xcam"]["printing_monitor"].get(); + } else { + // old version protocol + if (print_json["xcam"].contains("spaghetti_detector")) { + opts->xcam_ai_monitoring = print_json["xcam"]["spaghetti_detector"].get(); + if (print_json["xcam"].contains("print_halt")) { + bool print_halt = print_json["xcam"]["print_halt"].get(); + if (print_halt) { opts->xcam_ai_monitoring_sensitivity = "medium"; } + } + } + } + if (print_json["xcam"].contains("halt_print_sensitivity")) { + opts->xcam_ai_monitoring_sensitivity = print_json["xcam"]["halt_print_sensitivity"].get(); + } + } + + if (time(nullptr) - opts->xcam_first_layer_hold_start > HOLD_TIME_3SEC) { + if (print_json["xcam"].contains("first_layer_inspector")) { opts->xcam_first_layer_inspector = print_json["xcam"]["first_layer_inspector"].get(); } + } + + if (time(nullptr) - opts->xcam_buildplate_marker_hold_start > HOLD_TIME_3SEC) { + if (print_json["xcam"].contains("buildplate_marker_detector")) { + opts->xcam_buildplate_marker_detector = print_json["xcam"]["buildplate_marker_detector"].get(); + obj->is_support_build_plate_marker_detect = true; + } else { + obj->is_support_build_plate_marker_detect = false; + } + } + } + } catch (...) { + ; + } + +} + +void DevPrintOptionsParser::ParseDetectionV1_1(DevPrintOptions *opts, MachineObject *obj, const nlohmann::json &print_json,bool enable) +{ + if (print_json["module_name"].get() == "first_layer_inspector") { + if (time(nullptr) - opts->xcam_first_layer_hold_start > HOLD_TIME_3SEC) { + opts->xcam_first_layer_inspector = enable; + } + } else if (print_json["module_name"].get() == "buildplate_marker_detector") { + if (time(nullptr) - opts->xcam_buildplate_marker_hold_start > HOLD_TIME_3SEC) { + opts->xcam_buildplate_marker_detector = enable; + } + } else if (print_json["module_name"].get() == "printing_monitor") { + if (time(nullptr) - opts->xcam_ai_monitoring_hold_start > HOLD_TIME_3SEC) { + opts->xcam_ai_monitoring = enable; + if (print_json.contains("halt_print_sensitivity")) { + opts->xcam_ai_monitoring_sensitivity = print_json["halt_print_sensitivity"].get(); + } + } + } else if (print_json["module_name"].get() == "spaghetti_detector") { + if (time(nullptr) - opts->xcam_ai_monitoring_hold_start > HOLD_TIME_3SEC) { + // old protocol + opts->xcam_ai_monitoring = enable; + if (print_json.contains("print_halt")) { + if (print_json["print_halt"].get()) { opts->xcam_ai_monitoring_sensitivity = "medium"; } + } + } + } +} + +void DevPrintOptionsParser::ParseDetectionV1_2(DevPrintOptions *opts, MachineObject *obj, const nlohmann::json &print_json) { + + try { + if (print_json.contains("option")) { + if (print_json["option"].is_number()) { + int option = print_json["option"].get(); + if (time(nullptr) - opts->xcam_auto_recovery_hold_start > HOLD_TIME_3SEC) { opts->xcam_auto_recovery_step_loss = ((option & 0x01) != 0); } + } + } + + + if (time(nullptr) - opts->xcam_auto_recovery_hold_start > HOLD_TIME_3SEC) { + if (print_json.contains("auto_recovery")) { opts->xcam_auto_recovery_step_loss = print_json["auto_recovery"].get(); } + } + } catch (...) {} + +} + +void DevPrintOptionsParser::ParseDetectionV2_0(DevPrintOptions *opts, std::string print_json) +{ + + if (time(nullptr) - opts->xcam_first_layer_hold_start > HOLD_TIME_3SEC) { + opts->xcam_first_layer_inspector = DevUtil::get_flag_bits(print_json, 12); + } + + if (time(nullptr) - opts->xcam_ai_monitoring_hold_start > HOLD_COUNT_MAX) { + opts->xcam_ai_monitoring = DevUtil::get_flag_bits(print_json, 15); + + switch (DevUtil::get_flag_bits(print_json, 13, 2)) { + case 0: opts->xcam_ai_monitoring_sensitivity = "never_halt"; break; + case 1: opts->xcam_ai_monitoring_sensitivity = "low"; break; + case 2: opts->xcam_ai_monitoring_sensitivity = "medium"; break; + case 3: opts->xcam_ai_monitoring_sensitivity = "high"; break; + default: break; + } + } + + if (time(nullptr) - opts->xcam_auto_recovery_hold_start > HOLD_COUNT_MAX){ + opts->xcam_auto_recovery_step_loss =DevUtil::get_flag_bits(print_json, 16); + } + + if (time(nullptr) - opts->xcam_prompt_sound_hold_start > HOLD_TIME_3SEC) { + opts->xcam_allow_prompt_sound = DevUtil::get_flag_bits(print_json, 22); + } + + if (time(nullptr) - opts->xcam_filament_tangle_detect_hold_start > HOLD_TIME_3SEC) { + opts->xcam_filament_tangle_detect = DevUtil::get_flag_bits(print_json, 23); + } + +} + +void DevPrintOptions::SetPrintingSpeedLevel(DevPrintingSpeedLevel speed_level) +{ + if (speed_level >= SPEED_LEVEL_INVALID && speed_level < SPEED_LEVEL_COUNT) + { + m_speed_level = speed_level; + } + else + { + m_speed_level = SPEED_LEVEL_INVALID; // Reset to invalid if out of range + } +} + +int DevPrintOptions::command_xcam_control_ai_monitoring(bool on_off, std::string lvl) +{ + bool print_halt = (lvl == "never_halt") ? false : true; + + xcam_ai_monitoring = on_off; + xcam_ai_monitoring_hold_start = time(nullptr); + xcam_ai_monitoring_sensitivity = lvl; + return command_xcam_control("printing_monitor", on_off, m_obj, lvl); + +} +int DevPrintOptions::command_xcam_control_buildplate_marker_detector(bool on_off) +{ + xcam_buildplate_marker_detector = on_off; + xcam_buildplate_marker_hold_start = time(nullptr); + return command_xcam_control("buildplate_marker_detector", on_off ,m_obj); +} + +int DevPrintOptions::command_xcam_control_first_layer_inspector(bool on_off, bool print_halt) +{ + xcam_first_layer_inspector = on_off; + xcam_first_layer_hold_start = time(nullptr); + return command_xcam_control("first_layer_inspector", on_off, m_obj); +} + +int DevPrintOptions::command_xcam_control_auto_recovery_step_loss(bool on_off) +{ + xcam_auto_recovery_step_loss = on_off; + xcam_auto_recovery_hold_start = time(nullptr); + return command_set_printing_option(on_off, m_obj); +} + +int DevPrintOptions::command_xcam_control_allow_prompt_sound(bool on_off) +{ + xcam_allow_prompt_sound = on_off; + xcam_prompt_sound_hold_start = time(nullptr); + return command_set_prompt_sound(on_off, m_obj); +} + +int DevPrintOptions::command_xcam_control_filament_tangle_detect(bool on_off) +{ + xcam_filament_tangle_detect = on_off; + xcam_filament_tangle_detect_hold_start = time(nullptr); + return command_set_filament_tangle_detect(on_off, m_obj); +} + +void DevPrintOptions::parse_auto_recovery_step_loss_status(int flag) { + if (time(nullptr) - xcam_auto_recovery_hold_start > HOLD_TIME_3SEC) { + xcam_auto_recovery_step_loss = ((flag >> 4) & 0x1) != 0; + } +} + +void DevPrintOptions::parse_allow_prompt_sound_status(int flag) +{ + if (time(nullptr) - xcam_prompt_sound_hold_start > HOLD_TIME_3SEC) { + xcam_allow_prompt_sound = ((flag >> 17) & 0x1) != 0; + } +} + +void DevPrintOptions::parse_filament_tangle_detect_status(int flag) +{ + if (time(nullptr) - xcam_filament_tangle_detect_hold_start > HOLD_TIME_3SEC) { + xcam_filament_tangle_detect = ((flag >> 20) & 0x1) != 0; + } +} + +int DevPrintOptions::command_xcam_control(std::string module_name, bool on_off , MachineObject *obj, std::string lvl) +{ + json j; + j["xcam"]["command"] = "xcam_control_set"; + j["xcam"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["xcam"]["module_name"] = module_name; + j["xcam"]["control"] = on_off; + j["xcam"]["enable"] = on_off; // old protocol + j["xcam"]["print_halt"] = true; // old protocol + if (!lvl.empty()) { j["xcam"]["halt_print_sensitivity"] = lvl; } + BOOST_LOG_TRIVIAL(info) << "command:xcam_control_set" << ", module_name:" << module_name << ", control:" << on_off << ", halt_print_sensitivity:" << lvl; + return obj->publish_json(j); +} + +int DevPrintOptions::command_set_printing_option(bool auto_recovery, MachineObject *obj) +{ + json j; + j["print"]["command"] = "print_option"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["option"] = (int) auto_recovery; + j["print"]["auto_recovery"] = auto_recovery; + + return obj->publish_json(j); +} + +int DevPrintOptions::command_set_prompt_sound(bool prompt_sound, MachineObject *obj) +{ + json j; + j["print"]["command"] = "print_option"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["sound_enable"] = prompt_sound; + + return obj->publish_json(j); +} + +int DevPrintOptions::command_set_filament_tangle_detect(bool filament_tangle_detect, MachineObject *obj) +{ + json j; + j["print"]["command"] = "print_option"; + j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["print"]["filament_tangle_detect"] = filament_tangle_detect; + + return obj->publish_json(j); +} + + + + + + + +} +// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevPrintOptions.h b/src/slic3r/GUI/DeviceCore/DevPrintOptions.h new file mode 100644 index 0000000000..0de681b7b2 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevPrintOptions.h @@ -0,0 +1,91 @@ +#pragma once +#include +#include "slic3r/Utils/json_diff.hpp" +#include + +#include "DevDefs.h" + +namespace Slic3r { + +class MachineObject; + +class DevPrintOptions +{ + friend class DevPrintOptionsParser; +public: + DevPrintOptions(MachineObject* obj): m_obj(obj) {} + + +public: + void SetPrintingSpeedLevel(DevPrintingSpeedLevel speed_level); + DevPrintingSpeedLevel GetPrintingSpeedLevel() const { return m_speed_level;} + + // detect options + int command_xcam_control_ai_monitoring(bool on_off, std::string lvl); + int command_xcam_control_first_layer_inspector(bool on_off, bool print_halt); + int command_xcam_control_buildplate_marker_detector(bool on_off); + int command_xcam_control_auto_recovery_step_loss(bool on_off); + int command_xcam_control_allow_prompt_sound(bool on_off); + int command_xcam_control_filament_tangle_detect(bool on_off); + + + int command_xcam_control(std::string module_name, bool on_off, MachineObject *obj ,std::string lvl = ""); + // set print option + int command_set_printing_option(bool auto_recovery, MachineObject *obj); + // set prompt sound + int command_set_prompt_sound(bool prompt_sound, MachineObject *obj); + // set fliament tangle detect + int command_set_filament_tangle_detect(bool fliament_tangle_detect, MachineObject *obj); + + + void parse_auto_recovery_step_loss_status(int flag); + void parse_allow_prompt_sound_status(int flag); + void parse_filament_tangle_detect_status(int flag); + + bool GetAiMonitoring() const { return xcam_ai_monitoring; }; + bool GetFirstLayerInspector() const{ return xcam_first_layer_inspector; }; + bool GetBuildplateMarkerDetector() const { return xcam_buildplate_marker_detector; }; + bool GetAutoRecoveryStepLoss() const { return xcam_auto_recovery_step_loss; }; + bool GetAllowPromptSound() const { return xcam_allow_prompt_sound; }; + bool GetFilamentTangleDetect() const { return xcam_filament_tangle_detect; }; + + string GetAiMonitoringSensitivity() const { return xcam_ai_monitoring_sensitivity; }; + + +private: + // print option + DevPrintingSpeedLevel m_speed_level = SPEED_LEVEL_INVALID; + + // detect options + bool xcam_ai_monitoring{false}; + + std::string xcam_ai_monitoring_sensitivity; + bool xcam_buildplate_marker_detector{false}; + bool xcam_first_layer_inspector{false}; + bool xcam_auto_recovery_step_loss{false}; + bool xcam_allow_prompt_sound{false}; + bool xcam_filament_tangle_detect{false}; + time_t xcam_ai_monitoring_hold_start = 0; + time_t xcam_buildplate_marker_hold_start = 0; + time_t xcam_first_layer_hold_start = 0; + time_t xcam_auto_recovery_hold_start = 0; + time_t xcam_prompt_sound_hold_start = 0; + time_t xcam_filament_tangle_detect_hold_start = 0; + + MachineObject* m_obj;/*owner*/ +}; + +class DevPrintOptionsParser +{ +public: + static void Parse(DevPrintOptions* opts, const nlohmann::json& print_json); + + //V1 stands for parse_json; V2 stands for parse_new_json + static void ParseDetectionV1_0(DevPrintOptions *opts, MachineObject *obj, const nlohmann::json &print_json); + static void ParseDetectionV1_1(DevPrintOptions *opts, MachineObject *obj, const nlohmann::json &print_json, bool enable); + static void ParseDetectionV1_2(DevPrintOptions *opts, MachineObject *obj, const nlohmann::json &print_json); + + static void ParseDetectionV2_0(DevPrintOptions *opts, std::string print_json); +}; + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp b/src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp new file mode 100644 index 0000000000..a2d6391077 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp @@ -0,0 +1 @@ +#include "DevPrintTaskInfo.h" \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h b/src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h new file mode 100644 index 0000000000..0dba522deb --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h @@ -0,0 +1,24 @@ +#pragma once + +// TODO classes to handle dev print task management and ratings + +namespace Slic3r +{ + +struct DevPrintTaskRatingInfo +{ + bool request_successful; + int http_code; + int rating_id; + int start_count; + bool success_printed; + std::string content; + std::vector image_url_paths; +}; + +class DevPrintTaskInfo +{ + +}; + +}// end namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevStorage.cpp b/src/slic3r/GUI/DeviceCore/DevStorage.cpp new file mode 100644 index 0000000000..14623b0958 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevStorage.cpp @@ -0,0 +1,34 @@ +#include "DevStorage.h" +#include "slic3r/GUI/DeviceManager.hpp" + + +namespace Slic3r { + +DevStorage::SdcardState Slic3r::DevStorage::set_sdcard_state(int state) + +{ + if (state < DevStorage::NO_SDCARD || state > DevStorage::SDCARD_STATE_NUM) { + m_sdcard_state = DevStorage::NO_SDCARD; + } else { + m_sdcard_state = DevStorage::SdcardState(state); + } + return m_sdcard_state; +} + + void DevStorage::ParseV1_0(const json &print_json, DevStorage *system) +{ + if (system) + { + if (print_json.contains("sdcard")) { + if (print_json["sdcard"].get()) + system->m_sdcard_state = DevStorage::SdcardState::HAS_SDCARD_NORMAL; + else + system->m_sdcard_state = DevStorage::SdcardState::NO_SDCARD; + } else { + system->m_sdcard_state = DevStorage::SdcardState::NO_SDCARD; + } + } +} + + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevStorage.h b/src/slic3r/GUI/DeviceCore/DevStorage.h new file mode 100644 index 0000000000..e64be278b7 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevStorage.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include "slic3r/Utils/json_diff.hpp" + +namespace Slic3r { + +class MachineObject; + + +class DevStorage +{ +public: + DevStorage(MachineObject *obj) : m_owner(obj){} + +public: + + enum SdcardState : int { + NO_SDCARD = 0, + HAS_SDCARD_NORMAL = 1, + HAS_SDCARD_ABNORMAL = 2, + HAS_SDCARD_READONLY = 3, + SDCARD_STATE_NUM = 4 + }; + + /* sdcard */ + SdcardState get_sdcard_state() const { return m_sdcard_state; }; + SdcardState set_sdcard_state(int state); + + static void ParseV1_0(const json &print_json, DevStorage *system); + +private: + MachineObject *m_owner; + SdcardState m_sdcard_state { NO_SDCARD }; +}; + +} // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevUtil.cpp b/src/slic3r/GUI/DeviceCore/DevUtil.cpp new file mode 100644 index 0000000000..27cec11160 --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevUtil.cpp @@ -0,0 +1,114 @@ +#include "DevUtil.h" +#include "fast_float/fast_float.h" + +namespace Slic3r +{ + +int DevUtil::get_flag_bits(std::string str, int start, int count) +{ + try + { + unsigned long long decimal_value = std::stoull(str, nullptr, 16); + unsigned long long mask = (1ULL << count) - 1; + int flag = (decimal_value >> start) & mask; + return flag; + } + catch (const std::exception& e) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + catch (...) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": failed"; + } + + return 0; +} + +int DevUtil::get_flag_bits(int num, int start, int count, int base) +{ + try + { + unsigned long long mask = (1ULL << count) - 1; + unsigned long long value; + if (base == 10) + { + value = static_cast(num); + } + else if (base == 16) + { + value = static_cast(std::stoul(std::to_string(num), nullptr, 16)); + } + else + { + throw std::invalid_argument("Unsupported base"); + } + + int flag = (value >> start) & mask; + return flag; + } + catch (const std::exception& e) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + catch (...) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": failed"; + } + + return 0; +} + +float DevUtil::string_to_float(const std::string& str_value) +{ + float value = 0.0f; + + try + { + fast_float::from_chars(str_value.c_str(), str_value.c_str() + str_value.size(), value); + } + catch (const std::exception& e) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + catch (...) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": failed"; + } + + return value; +} + +std::string DevUtil::convertToIp(long long ip) +{ + std::stringstream ss; + ss << ((ip >> 0) & 0xFF) << "." << ((ip >> 8) & 0xFF) << "." << ((ip >> 16) & 0xFF) << "." << ((ip >> 24) & 0xFF); + return ss.str(); +} + +std::string DevJsonValParser::get_longlong_val(const nlohmann::json& j) +{ + try + { + if (j.is_number()) + { + return std::to_string(j.get()); + } + else if (j.is_string()) + { + return j.get(); + } + } + catch (const nlohmann::json::exception& e) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + catch (const std::exception& e) + { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + + return std::string(); +} + +};// namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceCore/DevUtil.h b/src/slic3r/GUI/DeviceCore/DevUtil.h new file mode 100644 index 0000000000..6b734898fd --- /dev/null +++ b/src/slic3r/GUI/DeviceCore/DevUtil.h @@ -0,0 +1,71 @@ +/** + * @file DevUtil.h + * @brief Provides common static utility methods for general use. + * + * This class offers a collection of static helper functions such as string manipulation, + * file operations, and other frequently used utilities. + */ + +#pragma once +#include +#include +#include + +#include "nlohmann/json.hpp" + +namespace Slic3r +{ + +class DevUtil +{ +public: + DevUtil() = delete; + DevUtil(const DevUtil&) = delete; + DevUtil& operator=(const DevUtil&) = delete; + +public: + static int get_flag_bits(std::string str, int start, int count = 1); + static int get_flag_bits(int num, int start, int count = 1, int base = 10); + + static float string_to_float(const std::string& str_value); + + static std::string convertToIp(long long ip); +}; + + +class DevJsonValParser +{ +public: + template + static void ParseVal(const nlohmann::json& j, const std::string& key, T& val) + { + try + { + if (j.contains(key)) { val = j[key].get(); } + } + catch (const nlohmann::json::exception& e) + { + assert(0 && __FUNCTION__); + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + } + + template + static void ParseVal(const nlohmann::json& j, const std::string& key, T& val, T default_val) + { + try + { + j.contains(key) ? (val = j[key].get()) : (val = default_val); + } + catch (const nlohmann::json::exception& e) + { + assert(0 && __FUNCTION__); + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": " << e.what(); + } + } + +public: + static std::string get_longlong_val(const nlohmann::json& j); +}; + +}; // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 24e65abed5..202d4eb161 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -2,6 +2,7 @@ #include "DeviceManager.hpp" #include "libslic3r/Time.hpp" #include "libslic3r/Thread.hpp" +#include "slic3r/Utils/NetworkAgent.hpp" #include "GuiColor.hpp" #include "GUI_App.hpp" @@ -21,7 +22,25 @@ #include #include "fast_float/fast_float.h" -#include "Widgets/AMSItem.hpp" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevExtruderSystem.h" +#include "DeviceCore/DevNozzleSystem.h" +#include "DeviceCore/DevBed.h" +#include "DeviceCore/DevLamp.h" +#include "DeviceCore/DevFan.h" +#include "DeviceCore/DevStorage.h" + +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevCtrl.h" +#include "DeviceCore/DevInfo.h" +#include "DeviceCore/DevPrintOptions.h" +#include "DeviceCore/DevPrintTaskInfo.h" +#include "DeviceCore/DevHMS.h" + +#include "DeviceCore/DevMapping.h" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevUtil.h" + #define CALI_DEBUG #define MINUTE_30 1800000 //ms @@ -37,7 +56,16 @@ float string_to_float(const std::string& str_value) { return value; } -wxString get_stage_string(int stage) +int get_tray_id_by_ams_id_and_slot_id(int ams_id, int slot_id) +{ + if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID) { + return ams_id; + } else { + return ams_id * 4 + slot_id; + } +} + +wxString Slic3r::get_stage_string(int stage) { switch(stage) { case 0: @@ -247,7 +275,7 @@ void split_string(std::string s, std::vector& v) { v.push_back(t); } -wxString generate_nozzle_id(NozzleVolumeType nozzle_type, const std::string& diameter) +static wxString _generate_nozzle_id(NozzleVolumeType nozzle_type, const std::string& diameter) { // HS00-0.4 std::string nozzle_id = "H"; @@ -284,261 +312,18 @@ NozzleVolumeType convert_to_nozzle_type(const std::string &str) return res; } -PrinterArch get_printer_arch_by_str(std::string arch_str) +wxString MachineObject::get_printer_type_display_str() const { - if (arch_str == "i3") { - return PrinterArch::ARCH_I3; - } - else if (arch_str == "core_xy") { - return PrinterArch::ARCH_CORE_XY; - } - - return PrinterArch::ARCH_CORE_XY; -} - -bool check_filaments_printable(const std::string &tag_vendor, const std::string &tag_type, const std::string& filament_id, int ams_id, bool &in_blacklist, std::string &ac, wxString &info) -{ - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) { - return true; - } - - MachineObject *obj = dev->get_selected_machine(); - if (obj == nullptr || !obj->is_multi_extruders()) { - return true; - } - - Preset *printer_preset = GUI::get_printer_preset(obj); - if (!printer_preset) - return true; - - ConfigOptionInts *physical_extruder_map_op = dynamic_cast(printer_preset->config.option("physical_extruder_map")); - if (!physical_extruder_map_op) - return true; - std::vector physical_extruder_maps = physical_extruder_map_op->values; - int extruder_idx = obj->get_extruder_id_by_ams_id(std::to_string(ams_id)); - for (int index = 0; index < physical_extruder_maps.size(); ++index) { - if (physical_extruder_maps[index] == extruder_idx) { - extruder_idx = index; - break; - } - } - - PresetBundle *preset_bundle = GUI::wxGetApp().preset_bundle; - std::optional filament_info = preset_bundle->get_filament_by_filament_id(filament_id, printer_preset->name); - if (filament_info.has_value() && !(filament_info->filament_printable >> extruder_idx & 1)) { - wxString extruder_name = extruder_idx == 0 ? _L("left") : _L("right"); - ac = "prohibition"; - info = wxString::Format(_L("%s is not supported by %s extruder."), tag_type, extruder_name); - in_blacklist = true; - return false; - } - - return true; -} - -void AmsTray::update_color_from_str(std::string color) -{ - if (color.empty()) return; - - if (this->color.compare(color) == 0) - return; - - wx_color = "#" + wxString::FromUTF8(color); - this->color = color; -} - -wxColour AmsTray::get_color() -{ - return AmsTray::decode_color(color); -} - -void AmsTray::reset() -{ - tag_uid = ""; - setting_id = ""; - filament_setting_id = ""; - type = ""; - sub_brands = ""; - color = ""; - weight = ""; - diameter = ""; - temp = ""; - time = ""; - bed_temp_type = ""; - bed_temp = ""; - nozzle_temp_max = ""; - nozzle_temp_min = ""; - xcam_info = ""; - uuid = ""; - k = 0.0f; - n = 0.0f; - is_bbl = false; - hold_count = 0; - remain = 0; -} - - -bool AmsTray::is_tray_info_ready() -{ - if (color.empty()) - return false; - if (type.empty()) - return false; - //if (setting_id.empty()) - //return false; - return true; -} - -bool AmsTray::is_unset_third_filament() -{ - if (this->is_bbl) - return false; - - if (color.empty() || type.empty()) - return true; - return false; -} - -std::string AmsTray::get_display_filament_type() -{ - if (type == "PLA-S") - return "Sup.PLA"; - else if (type == "PA-S") - return "Sup.PA"; - else - return type; - return type; -} - -std::string AmsTray::get_filament_type() -{ - if (type == "Sup.PLA") { - return "PLA-S"; - } else if (type == "Sup.PA") { - return "PA-S"; - } else if (type == "Support W") { - return "PLA-S"; - } else if (type == "Support G") { - return "PA-S"; - } else if (type == "Support") { - if (setting_id == "GFS00") { - type = "PLA-S"; - } else if (setting_id == "GFS01") { - type = "PA-S"; - } else { - return "PLA-S"; - } - } else { - return type; - } - return type; -} - -bool HMSItem::parse_hms_info(unsigned attr, unsigned code) -{ - bool result = true; - unsigned int model_id_int = (attr >> 24) & 0xFF; - this->module_id = (ModuleID)model_id_int; - this->module_num = (attr >> 16) & 0xFF; - this->part_id = (attr >> 8) & 0xFF; - this->reserved = (attr >> 0) & 0xFF; - unsigned msg_level_int = code >> 16; - if (msg_level_int < (unsigned)HMS_MSG_LEVEL_MAX) - this->msg_level = (HMSMessageLevel)msg_level_int; - else - this->msg_level = HMS_UNKNOWN; - this->msg_code = code & 0xFFFF; - return result; -} - -std::string HMSItem::get_long_error_code() -{ - char buf[64]; - ::sprintf(buf, "%02X%02X%02X00000%1X%04X", - this->module_id, - this->module_num, - this->part_id, - (int)this->msg_level, - this->msg_code); - return std::string(buf); -} - -wxString HMSItem::get_module_name(ModuleID module_id) -{ - switch (module_id) - { - case MODULE_MC: - return "MC"; - case MODULE_MAINBOARD: - return "MainBoard"; - case MODULE_AMS: - return "AMS"; - case MODULE_TH: - return "TH"; - case MODULE_XCAM: - return "XCam"; - default: - wxString text = _L("Unknown") + wxString::Format("0x%x", (unsigned)module_id); - return text; - } - return ""; -} - -wxString HMSItem::get_hms_msg_level_str(HMSMessageLevel level) -{ - switch(level) { - case HMS_FATAL: - return _L("Fatal"); - case HMS_SERIOUS: - return _L("Serious"); - case HMS_COMMON: - return _L("Common"); - case HMS_INFO: - return _L("Info"); - default: - return _L("Unknown"); - } - return ""; -} - -std::string MachineObject::parse_printer_type(std::string type_str) -{ - if (type_str.compare("3DPrinter-X1") == 0) { - return "BL-P002"; - } else if (type_str.compare("3DPrinter-X1-Carbon") == 0) { - return "BL-P001"; - } else if (type_str.compare("BL-P001") == 0) { - return type_str; - } else if (type_str.compare("BL-P002") == 0) { - return type_str; - } else { - return DeviceManager::parse_printer_type(type_str); - } - return ""; -} -std::string MachineObject::get_preset_printer_model_name(std::string printer_type) -{ - return DeviceManager::get_printer_display_name(printer_type); -} - -std::string MachineObject::get_preset_printer_thumbnail_img(std::string printer_type) -{ - return DeviceManager::get_printer_thumbnail_img(printer_type); -} - -wxString MachineObject::get_printer_type_display_str() -{ - std::string display_name = get_preset_printer_model_name(printer_type); + std::string display_name = DevPrinterConfigUtil::get_printer_display_name(printer_type); if (!display_name.empty()) return display_name; else return _L("Unknown"); } -std::string MachineObject::get_printer_thumbnail_img_str() +std::string MachineObject::get_printer_thumbnail_img_str() const { - std::string img_str = get_preset_printer_thumbnail_img(printer_type); + std::string img_str = DevPrinterConfigUtil::get_printer_thumbnail_img(printer_type); std::string img_url; if (!img_str.empty()) { @@ -557,9 +342,14 @@ std::string MachineObject::get_printer_thumbnail_img_str() return img_url; } +std::string MachineObject::get_auto_pa_cali_thumbnail_img_str() const +{ + return DevPrinterConfigUtil::get_printer_auto_pa_cali_image(printer_type); +} + std::string MachineObject::get_ftp_folder() { - return DeviceManager::get_ftp_folder(printer_type); + return DevPrinterConfigUtil::get_ftp_folder(printer_type); } std::string MachineObject::get_access_code() const @@ -576,10 +366,10 @@ void MachineObject::set_access_code(std::string code, bool only_refresh) AppConfig* config = GUI::wxGetApp().app_config; if (config) { if (!code.empty()) { - GUI::wxGetApp().app_config->set_str("access_code", dev_id, code); + GUI::wxGetApp().app_config->set_str("access_code", get_dev_id(), code); DeviceManager::update_local_machine(*this); } else { - GUI::wxGetApp().app_config->erase("access_code", dev_id); + GUI::wxGetApp().app_config->erase("access_code", get_dev_id()); } } } @@ -590,7 +380,7 @@ void MachineObject::erase_user_access_code() this->user_access_code = ""; AppConfig* config = GUI::wxGetApp().app_config; if (config) { - GUI::wxGetApp().app_config->erase("user_access_code", dev_id); + GUI::wxGetApp().app_config->erase("user_access_code", get_dev_id()); //GUI::wxGetApp().app_config->save(); } } @@ -601,7 +391,7 @@ void MachineObject::set_user_access_code(std::string code, bool only_refresh) if (only_refresh && !code.empty()) { AppConfig* config = GUI::wxGetApp().app_config; if (config && !code.empty()) { - GUI::wxGetApp().app_config->set_str("user_access_code", dev_id, code); + GUI::wxGetApp().app_config->set_str("user_access_code", get_dev_id(), code); DeviceManager::update_local_machine(*this); } } @@ -611,26 +401,11 @@ std::string MachineObject::get_user_access_code() const { AppConfig* config = GUI::wxGetApp().app_config; if (config) { - return GUI::wxGetApp().app_config->get("user_access_code", dev_id); + return GUI::wxGetApp().app_config->get("user_access_code", get_dev_id()); } return ""; } -bool MachineObject::is_lan_mode_printer() const -{ - bool result = false; - if (!dev_connection_type.empty() && dev_connection_type == "lan") - return true; - return result; -} - -std::string MachineObject::convertToIp(long long ip) -{ - std::stringstream ss; - ss << ((ip >> 0) & 0xFF) << "." << ((ip >> 8) & 0xFF) << "." << ((ip >> 16) & 0xFF) << "." << ((ip >> 24) & 0xFF); - return ss.str(); -} - std::string MachineObject::get_show_printer_type() const { std::string printer_type = this->printer_type; @@ -638,10 +413,9 @@ std::string MachineObject::get_show_printer_type() const printer_type = "C12"; return printer_type; } - PrinterSeries MachineObject::get_printer_series() const { - std::string series = DeviceManager::get_printer_series(printer_type); + std::string series = DevPrinterConfigUtil::get_printer_series_str(printer_type); if (series == "series_x1" || series == "series_o") return PrinterSeries::SERIES_X1; else if (series == "series_p1p") @@ -652,17 +426,12 @@ PrinterSeries MachineObject::get_printer_series() const PrinterArch MachineObject::get_printer_arch() const { - return DeviceManager::get_printer_arch(printer_type); + return DevPrinterConfigUtil::get_printer_arch(printer_type); } std::string MachineObject::get_printer_ams_type() const { - return DeviceManager::get_printer_ams_type(printer_type); -} - -bool MachineObject::get_printer_is_enclosed() const -{ - return DeviceManager::get_printer_is_enclosed(printer_type); + return DevPrinterConfigUtil::get_printer_use_ams_type(printer_type); } bool MachineObject::is_series_n(const std::string& series_str) { return series_str == "series_n"; } @@ -670,12 +439,12 @@ bool MachineObject::is_series_p(const std::string& series_str) { return series_s bool MachineObject::is_series_x(const std::string& series_str) { return series_str == "series_x1"; } bool MachineObject::is_series_o(const std::string& series_str) { return series_str == "series_o"; } -bool MachineObject::is_series_n() const { return is_series_n(DeviceManager::get_printer_series(printer_type)); } -bool MachineObject::is_series_p() const { return is_series_p(DeviceManager::get_printer_series(printer_type)); } -bool MachineObject::is_series_x() const { return is_series_x(DeviceManager::get_printer_series(printer_type)); } -bool MachineObject::is_series_o() const { return is_series_o(DeviceManager::get_printer_series(printer_type)); } +bool MachineObject::is_series_n() const { return is_series_n(DevPrinterConfigUtil::get_printer_series_str(printer_type)); } +bool MachineObject::is_series_p() const { return is_series_p(DevPrinterConfigUtil::get_printer_series_str(printer_type)); } +bool MachineObject::is_series_x() const { return is_series_x(DevPrinterConfigUtil::get_printer_series_str(printer_type)); } +bool MachineObject::is_series_o() const { return is_series_o(DevPrinterConfigUtil::get_printer_series_str(printer_type)); } -std::string MachineObject::get_printer_series_str() const{ return DeviceManager::get_printer_series(printer_type);}; +std::string MachineObject::get_printer_series_str() const{ return DevPrinterConfigUtil::get_printer_series_str(printer_type);}; void MachineObject::reload_printer_settings() { @@ -683,7 +452,7 @@ void MachineObject::reload_printer_settings() parse_json("cloud", "{}"); } -MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string id, std::string ip) +MachineObject::MachineObject(DeviceManager* manager, NetworkAgent* agent, std::string name, std::string id, std::string ip) :dev_name(name), dev_id(id), dev_ip(ip), @@ -692,13 +461,13 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string slice_info(nullptr), m_is_online(false) { + m_manager = manager; m_agent = agent; reset(); /* temprature fields */ - bed_temp = 0.0f; - bed_temp_target = 0.0f; + chamber_temp = 0.0f; chamber_temp_target = 0.0f; frame_temp = 0.0f; @@ -707,11 +476,6 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string ams_exist_bits = 0; tray_exist_bits = 0; tray_is_bbl_bits = 0; - ams_rfid_status = 0; - is_ams_need_update = false; - ams_insert_flag = false; - ams_power_on_flag = false; - ams_calibrate_remain_flag = false; /* signals */ wifi_signal = ""; @@ -721,12 +485,6 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string upgrade_new_version = false; upgrade_consistency_request = false; - /* cooling */ - heatbreak_fan_speed = 0; - cooling_fan_speed = 0; - big_fan1_speed = 0; - big_fan2_speed = 0; - fan_gear = 0; /* printing */ mc_print_stage = 0; @@ -738,22 +496,27 @@ MachineObject::MachineObject(NetworkAgent* agent, std::string name, std::string mc_left_time = 0; home_flag = -1; hw_switch_state = 0; - printing_speed_lvl = PrintingSpeedLevel::SPEED_LEVEL_INVALID; has_ipcam = true; // default true - auto vslot = AmsTray(std::to_string(VIRTUAL_TRAY_MAIN_ID)); + auto vslot = DevAmsTray(std::to_string(VIRTUAL_TRAY_MAIN_ID)); vt_slot.push_back(vslot); - m_extder_data.current_extder_id = MAIN_NOZZLE_ID; - m_extder_data.target_extder_id = MAIN_NOZZLE_ID; - m_extder_data.total_extder_count = 1; - Extder nozzle; - nozzle.id = MAIN_NOZZLE_ID; - nozzle.nozzle_id = MAIN_NOZZLE_ID; - nozzle.target_nozzle_id = MAIN_NOZZLE_ID; - m_extder_data.extders.push_back(nozzle); + { + m_lamp = new DevLamp(this); + m_fan = new DevFan(this); + m_bed = new DevBed(this); + m_storage = new DevStorage(this); + m_extder_system = new DevExtderSystem(this); + m_nozzle_system = new DevNozzleSystem(this); + m_fila_system = new DevFilaSystem(this); + m_hms_system = new DevHMS(this); + m_config = new DevConfig(this); + + m_ctrl = new DevCtrl(this); + m_print_options = new DevPrintOptions(this); + } } MachineObject::~MachineObject() @@ -770,35 +533,40 @@ MachineObject::~MachineObject() free_slice_info(); - for (auto it = amsList.begin(); it != amsList.end(); it++) { - for (auto tray_it = it->second->trayList.begin(); tray_it != it->second->trayList.end(); tray_it++) { - if (tray_it->second) { - delete tray_it->second; - tray_it->second = nullptr; - } - } - it->second->trayList.clear(); - } - amsList.clear(); - while (!m_command_error_code_dlgs.empty()) { delete *m_command_error_code_dlgs.begin();/*element will auto remove from m_command_error_code_dlgs on deleted*/ } -} -bool MachineObject::check_valid_ip() -{ - if (dev_ip.empty()) { - return false; - } + { + delete m_lamp; + m_lamp = nullptr; - return true; -} + delete m_fan; + m_fan = nullptr; -void MachineObject::_parse_print_option_ack(int option) -{ - if (time(nullptr) - xcam_auto_recovery_hold_start > HOLD_TIME_3SEC) { - xcam_auto_recovery_step_loss = ((option >> (int)PRINT_OP_AUTO_RECOVERY) & 0x01) != 0; + delete m_bed; + m_bed = nullptr; + + delete m_extder_system; + m_extder_system = nullptr; + + delete m_nozzle_system; + m_nozzle_system = nullptr; + + delete m_ctrl; + m_ctrl = nullptr; + + delete m_fila_system; + m_fila_system = nullptr; + + delete m_hms_system; + m_hms_system = nullptr; + + delete m_config; + m_config = nullptr; + + delete m_print_options; + m_print_options = nullptr; } } @@ -836,94 +604,26 @@ bool MachineObject::is_extrusion_cali_finished() return false; } -void MachineObject::_parse_tray_now(std::string tray_now) + +DevAmsTray *MachineObject::get_curr_tray() { - if (tray_now.empty()) { - return; - } else { - try { - int tray_now_int = atoi(tray_now.c_str()); - - if (tray_now_int == VIRTUAL_TRAY_MAIN_ID) { - m_ams_id = "0"; - m_tray_id = "0"; - m_extder_data.extders[MAIN_NOZZLE_ID].snow.ams_id = ""; - m_extder_data.extders[MAIN_NOZZLE_ID].snow.slot_id = ""; - - if (m_tray_now == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_extder_data.extders[MAIN_NOZZLE_ID].snow.ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); - m_extder_data.extders[MAIN_NOZZLE_ID].snow.slot_id = "0"; - } - } - else if (tray_now_int == VIRTUAL_TRAY_DEPUTY_ID) { - m_extder_data.extders[MAIN_NOZZLE_ID].snow.ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); - m_extder_data.extders[MAIN_NOZZLE_ID].snow.slot_id = "0"; - } - else { - if (tray_now_int >= 0x80 && tray_now_int <= 0x87) { - m_ams_id = std::to_string(tray_now_int); - } else { - m_ams_id = std::to_string(tray_now_int >> 2); - } - - m_tray_id = std::to_string(tray_now_int & 0x3); - m_extder_data.extders[MAIN_NOZZLE_ID].snow.ams_id = m_ams_id; - m_extder_data.extders[MAIN_NOZZLE_ID].snow.slot_id = m_tray_id; - } - } - catch(...) { - } - } - - m_tray_now = tray_now; -} - -Ams *MachineObject::get_curr_Ams() -{ - auto it = amsList.find(m_ams_id); - if (it != amsList.end()) - return it->second; - return nullptr; -} - -AmsTray *MachineObject::get_curr_tray() -{ - if (m_tray_now.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { + const std::string& cur_ams_id = m_extder_system->GetCurrentAmsId(); + if (cur_ams_id.compare(std::to_string(VIRTUAL_TRAY_MAIN_ID)) == 0) { return &vt_slot[0]; } - Ams* curr_ams = get_curr_Ams(); + DevAms* curr_ams = get_curr_Ams(); if (!curr_ams) return nullptr; - try { - int tray_index = atoi(m_tray_now.c_str()); - int ams_index = atoi(curr_ams->id.c_str()); - - std::string tray_now_index = std::to_string(tray_index - ams_index * 4); - auto it = curr_ams->trayList.find(tray_now_index); - if (it != curr_ams->trayList.end()) - return it->second; - } - catch (...) { - ; + auto it = curr_ams->GetTrays().find(m_extder_system->GetCurrentSlotId()); + if (it != curr_ams->GetTrays().end()) + { + return it->second; } return nullptr; } -AmsTray *MachineObject::get_ams_tray(std::string ams_id, std::string tray_id) -{ - auto it = amsList.find(ams_id); - if (it == amsList.end()) return nullptr; - if (!it->second) return nullptr; - - auto iter = it->second->trayList.find(tray_id); - if (iter != it->second->trayList.end()) - return iter->second; - else - return nullptr; -} - std::string MachineObject::get_filament_id(std::string ams_id, std::string tray_id) const { return this->get_tray(ams_id, tray_id).setting_id; } @@ -960,428 +660,19 @@ void MachineObject::_parse_ams_status(int ams_status) bool MachineObject::can_unload_filament() { bool result = false; - if (!has_ams()) + if (!HasAms()) return true; - if (ams_status_main == AMS_STATUS_MAIN_IDLE && hw_switch_state == 1 && m_tray_now == "255") { + if (ams_status_main == AMS_STATUS_MAIN_IDLE && hw_switch_state == 1 && m_extder_system->GetCurrentAmsId() == "255") { return true; } return result; } -bool MachineObject::is_support_amx_ext_mix_mapping() { - return true; -} - -bool MachineObject::is_ams_on_settingup() const -{ - int setting_up_stat = this->get_flag_bits(ams_cali_stat, 0, 8); - if (setting_up_stat == 0x01 || setting_up_stat == 0x02 || setting_up_stat == 0x03 || setting_up_stat == 0x04) - { - return true; - } - - return false; -} - void MachineObject::get_ams_colors(std::vector &ams_colors) { - ams_colors.clear(); - ams_colors.reserve(amsList.size()); - for (auto ams = amsList.begin(); ams != amsList.end(); ams++) { - for (auto tray = ams->second->trayList.begin(); tray != ams->second->trayList.end(); tray++) { - if (tray->second->is_tray_info_ready()) { - auto ams_color = AmsTray::decode_color(tray->second->color); - ams_colors.emplace_back(ams_color); - } - } - } + m_fila_system->CollectAmsColors(ams_colors); } -void MachineObject::parse_tray_info(int ams_id, int slot_id, AmsTray tray, FilamentInfo& result) { - result.color = tray.color; - result.type = tray.get_filament_type(); - result.filament_id = tray.setting_id; - result.ctype = tray.ctype; - result.colors = tray.cols; - - /*for new ams mapping*/ - result.ams_id = std::to_string(ams_id); - result.slot_id = std::to_string(slot_id); - - if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID){ - result.tray_id = atoi(tray.id.c_str()); - result.id = atoi(tray.id.c_str()); - } - else{ - result.id = ams_id * 4 + slot_id; - } - -} - -int MachineObject::ams_filament_mapping( - std::vector filaments, std::vector &result, std::vector map_opt, std::vector exclude_id, bool nozzle_has_ams_then_ignore_ext) -{ - if (filaments.empty()) - return -1; - - ///////////////////////// - // Step 1: collect filaments in machine - std::map tray_filaments; // tray_index : tray_color - bool left_nozzle_has_ams = false, right_nozzle_has_ams = false; - for (auto ams = amsList.begin(); ams != amsList.end(); ams++) { - std::string ams_id = ams->second->id; - int ams_type = ams->second->type; - for (auto tray = ams->second->trayList.begin(); tray != ams->second->trayList.end(); tray++) { - int ams_id = atoi(ams->first.c_str()); - int tray_id = atoi(tray->first.c_str()); - int tray_index = 0; - if (ams_type == GUI::AMSModel::GENERIC_AMS || ams_type == GUI::AMSModel::AMS_LITE || ams_type == GUI::AMSModel::N3F_AMS) { - tray_index = ams_id * 4 + tray_id; - } else if (ams_type == GUI::AMSModel::N3S_AMS) { - tray_index = ams_id + tray_id; - } - // skip exclude id - for (int i = 0; i < exclude_id.size(); i++) { - if (tray_index == exclude_id[i]) - continue; - } - // push - FilamentInfo info; - if (tray->second->is_tray_info_ready()) - parse_tray_info(ams_id, tray_id, *(tray->second), info); - - //first: left,nozzle=1,map=1 second: right,nozzle=0,map=2 - bool right_ams_valid = ams->second->nozzle == 0 && map_opt[MappingOption::USE_RIGHT_AMS]; - bool left_ams_valid = ams->second->nozzle == 1 && map_opt[MappingOption::USE_LEFT_AMS]; - if (right_ams_valid || left_ams_valid) { - tray_filaments.emplace(std::make_pair(tray_index, info)); - if (right_ams_valid) { - right_nozzle_has_ams = true; - } - if (left_ams_valid) { - left_nozzle_has_ams = true; - } - } - } - } - - if (map_opt[MappingOption::USE_RIGHT_EXT] || map_opt[MappingOption::USE_LEFT_EXT]){ - for (auto tray : vt_slot){ - bool right_ext_valid = (tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID) && map_opt[MappingOption::USE_RIGHT_EXT]); - bool left_ext_valid = (tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID) && map_opt[MappingOption::USE_LEFT_EXT]); - if (right_ext_valid || left_ext_valid) { - if (nozzle_has_ams_then_ignore_ext) { - if (right_ext_valid && right_nozzle_has_ams) { - continue; - } - if (left_ext_valid && left_nozzle_has_ams) { - continue; - } - } - FilamentInfo info; - parse_tray_info(atoi(tray.id.c_str()), 0, tray, info); - tray_filaments.emplace(std::make_pair(info.tray_id, info)); - } - } - } - - ///////////////////////// - // Step 2: collect the distances of filaments_in_slicing to filaments_in_machine - char buffer[256]; - std::vector> distance_map; - - // print title - ::sprintf(buffer, "F(id)"); - std::string line = std::string(buffer); - for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++) { - ::sprintf(buffer, " AMS%02d", tray->second.id+1); - line += std::string(buffer); - } - BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line;// Print the collected filaments - - for (int i = 0; i < filaments.size(); i++) { - std::vector rol; - ::sprintf(buffer, "F(%02d)", filaments[i].id+1); - line = std::string(buffer); - for (auto tray = tray_filaments.begin(); tray != tray_filaments.end(); tray++) { - DisValue val; - val.tray_id = tray->second.id; - wxColour c = wxColour(filaments[i].color); - wxColour tray_c = AmsTray::decode_color(tray->second.color); - val.distance = GUI::calc_color_distance(c, tray_c); - if (filaments[i].type != tray->second.type) { - val.distance = 999999; - val.is_type_match = false; - } else { - if (c.Alpha() != tray_c.Alpha()) - val.distance = 999999; - val.is_type_match = true; - } - ::sprintf(buffer, " %6.0f", val.distance); - line += std::string(buffer); - rol.push_back(val); - } - BOOST_LOG_TRIVIAL(info) << "ams_mapping_distance:" << line; - distance_map.push_back(rol); - } - - ///////////////////////// - // Step 3: do mapping algorithm - - // setup the mapping result - for (int i = 0; i < filaments.size(); i++) { - FilamentInfo info; - info.id = filaments[i].id; - info.tray_id = -1; - info.type = filaments[i].type; - info.filament_id = filaments[i].filament_id; - result.push_back(info); - } - - // traverse the mapping - std::set picked_src; - std::set picked_tar; - for (int k = 0; k < distance_map.size(); k++) { - float min_val = INT_MAX; - int picked_src_idx = -1; - int picked_tar_idx = -1; - for (int i = 0; i < distance_map.size(); i++) { - if (picked_src.find(i) != picked_src.end()) - continue; - - // try to mapping to different tray - for (int j = 0; j < distance_map[i].size(); j++) { - if (picked_tar.find(j) != picked_tar.end()){ - if (distance_map[i][j].is_same_color - && distance_map[i][j].is_type_match - && distance_map[i][j].distance < (float)0.0001) { - min_val = distance_map[i][j].distance; - picked_src_idx = i; - picked_tar_idx = j; - tray_filaments[picked_tar_idx].distance = min_val; - } - continue; - } - - if (distance_map[i][j].is_same_color - && distance_map[i][j].is_type_match) { - if (min_val > distance_map[i][j].distance) { - - min_val = distance_map[i][j].distance; - picked_src_idx = i; - picked_tar_idx = j; - tray_filaments[picked_tar_idx].distance = min_val; - } - else if (min_val == distance_map[i][j].distance&& filaments[picked_src_idx].filament_id!= tray_filaments[picked_tar_idx].filament_id && filaments[i].filament_id == tray_filaments[j].filament_id) { - - picked_src_idx = i; - picked_tar_idx = j; - } - } - } - - // take a retry to mapping to used tray - if (picked_src_idx < 0 || picked_tar_idx < 0) { - for (int j = 0; j < distance_map[i].size(); j++) { - if (distance_map[i][j].is_same_color && distance_map[i][j].is_type_match) { - if (min_val > distance_map[i][j].distance) { - min_val = distance_map[i][j].distance; - picked_src_idx = i; - picked_tar_idx = j; - tray_filaments[picked_tar_idx].distance = min_val; - } else if (min_val == distance_map[i][j].distance && filaments[picked_src_idx].filament_id != tray_filaments[picked_tar_idx].filament_id && filaments[i].filament_id == tray_filaments[j].filament_id) { - picked_src_idx = i; - picked_tar_idx = j; - } - } - } - } - } - - if (picked_src_idx >= 0 && picked_tar_idx >= 0) { - auto tray = tray_filaments.find(distance_map[k][picked_tar_idx].tray_id); - - if (tray != tray_filaments.end()) { - result[picked_src_idx].tray_id = tray->first; - - result[picked_src_idx].color = tray->second.color; - result[picked_src_idx].type = tray->second.type; - result[picked_src_idx].distance = tray->second.distance; - result[picked_src_idx].filament_id = tray->second.filament_id; - result[picked_src_idx].ctype = tray->second.ctype; - result[picked_src_idx].colors = tray->second.colors; - - /*for new ams mapping*/ - result[picked_src_idx].ams_id = tray->second.ams_id; - result[picked_src_idx].slot_id = tray->second.slot_id; - } - - ::sprintf(buffer, "ams_mapping, picked F(%02d) AMS(%02d), distance=%6.0f", picked_src_idx+1, picked_tar_idx+1, - distance_map[picked_src_idx][picked_tar_idx].distance); - BOOST_LOG_TRIVIAL(info) << std::string(buffer); - picked_src.insert(picked_src_idx); - picked_tar.insert(picked_tar_idx); - } - } - - //check ams mapping result - if (is_valid_mapping_result(result, true)) { - return 0; - } - - /* for (auto it = result.begin(); it != result.end(); it++) {//This code has never been effective before 2025.03.18 - if (it->distance >= 6000) { - it->tray_id = -1; - } - }*/ - return 0; -} - -bool MachineObject::is_valid_mapping_result(std::vector& result, bool check_empty_slot) -{ - bool valid_ams_mapping_result = true; - if (result.empty()) return false; - - for (int i = 0; i < result.size(); i++) { - // invalid mapping result - if (result[i].tray_id < 0) { - if (result[i].ams_id.empty() && result[i].slot_id.empty()) { - valid_ams_mapping_result = false; - } - } - else { - auto ams_item = amsList.find(result[i].ams_id); - if (ams_item == amsList.end()) { - if ( (result[i].ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID)) && - (result[i].ams_id != std::to_string(VIRTUAL_TRAY_DEPUTY_ID))) { - result[i].tray_id = -1; - valid_ams_mapping_result = false; - } - } else { - if (check_empty_slot) { - auto tray_item = ams_item->second->trayList.find(result[i].slot_id); - if (tray_item == ams_item->second->trayList.end()) { - result[i].tray_id = -1; - valid_ams_mapping_result = false; - } else { - if (!tray_item->second->is_exists) { - result[i].tray_id = -1; - valid_ams_mapping_result = false; - } - } - } - } - } - } - return valid_ams_mapping_result; -} - -bool MachineObject::is_mapping_exceed_filament(std::vector & result, int &exceed_index) -{ - bool is_exceed = false; - for (int i = 0; i < result.size(); i++) { - int ams_id = result[i].tray_id / 4; - if (amsList.find(std::to_string(ams_id)) == amsList.end()) { - exceed_index = result[i].tray_id; - result[i].tray_id = -1; - is_exceed = true; - break; - } - if (result[i].mapping_result == MappingResult::MAPPING_RESULT_EXCEED) { - exceed_index = result[i].id; - is_exceed = true; - break; - } - } - return is_exceed; -} - -void MachineObject::reset_mapping_result(std::vector& result) -{ - for (int i = 0; i < result.size(); i++) { - result[i].tray_id = -1; - result[i].distance = 99999; - result[i].mapping_result = 0; - } -} - -bool MachineObject::is_main_extruder_on_left() const -{ - // only means the extruder is on the left hand when extruder id is 0 - return false; -} - -bool MachineObject::is_multi_extruders() const -{ - return m_extder_data.total_extder_count > 1; -} - -bool MachineObject::need_SD_card() const -{ - // todo: check whether need SD card - return !is_multi_extruders(); -} - -int MachineObject::get_extruder_id_by_ams_id(const std::string &ams_id) -{ - if (ams_id.empty() || (ams_id == "-1")) - return 0; - - auto it = amsList.find(ams_id); - if (it != amsList.end()) - return it->second->nozzle; - else if (stoi(ams_id) == VIRTUAL_TRAY_MAIN_ID) - return 0; - else if (stoi(ams_id) == VIRTUAL_TRAY_DEPUTY_ID) - return 1; - - assert(false); - return 0; -} - -bool MachineObject::is_bbl_filament(std::string tag_uid) -{ - if (tag_uid.empty()) - return false; - - for (int i = 0; i < tag_uid.length(); i++) { - if (tag_uid[i] != '0') - return true; - } - - return false; -} - -std::string MachineObject::light_effect_str(LIGHT_EFFECT effect) -{ - switch (effect) - { - case LIGHT_EFFECT::LIGHT_EFFECT_ON: - return "on"; - case LIGHT_EFFECT::LIGHT_EFFECT_OFF: - return "off"; - case LIGHT_EFFECT::LIGHT_EFFECT_FLASHING: - return "flashing"; - default: - return "unknown"; - } - return "unknown"; -} - -MachineObject::LIGHT_EFFECT MachineObject::light_effect_parse(std::string effect_str) -{ - if (effect_str.compare("on") == 0) - return LIGHT_EFFECT::LIGHT_EFFECT_ON; - else if (effect_str.compare("off") == 0) - return LIGHT_EFFECT::LIGHT_EFFECT_OFF; - else if (effect_str.compare("flashing") == 0) - return LIGHT_EFFECT::LIGHT_EFFECT_FLASHING; - else - return LIGHT_EFFECT::LIGHT_EFFECT_UNKOWN; - return LIGHT_EFFECT::LIGHT_EFFECT_UNKOWN; -} - - std::string MachineObject::get_firmware_type_str() { /*if (firmware_type == PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER) @@ -1408,12 +699,12 @@ std::string MachineObject::get_lifecycle_type_str() bool MachineObject::is_in_upgrading() { - return upgrade_display_state == (int)UpgradingInProgress; + return upgrade_display_state == DevFirmwareUpgradingState::UpgradingInProgress; } bool MachineObject::is_upgrading_avalable() { - return upgrade_display_state == (int)UpgradingAvaliable; + return upgrade_display_state == DevFirmwareUpgradingState::UpgradingAvaliable; } int MachineObject::get_upgrade_percent() @@ -1475,10 +766,10 @@ wxString MachineObject::get_upgrade_result_str(int err_code) return ""; } -std::map MachineObject::get_ams_version() +std::map MachineObject::get_ams_version() { std::vector multi_tray_ams_type = {"ams", "n3f"}; - std::map result; + std::map result; for (int i = 0; i < 8; i++) { std::string ams_id; for (auto type : multi_tray_ams_type) @@ -1506,24 +797,19 @@ std::map MachineObject::get_ams_version() void MachineObject::clear_version_info() { - air_pump_version_info = ModuleVersionInfo(); - laser_version_info = ModuleVersionInfo(); - cutting_module_version_info = ModuleVersionInfo(); + air_pump_version_info = DevFirmwareVersionInfo(); + laser_version_info = DevFirmwareVersionInfo(); + cutting_module_version_info = DevFirmwareVersionInfo(); module_vers.clear(); } -void MachineObject::store_version_info(const ModuleVersionInfo& info) +void MachineObject::store_version_info(const DevFirmwareVersionInfo& info) { - if (info.isAirPump()) - { + if (info.isAirPump()) { air_pump_version_info = info; - } - else if (info.isLaszer()) - { + } else if (info.isLaszer()) { laser_version_info = info; - } - else if (info.isCuttingModule()) - { + } else if (info.isCuttingModule()) { cutting_module_version_info = info; } @@ -1556,9 +842,9 @@ bool MachineObject::is_axis_at_home(std::string axis) if (axis == "X") { return (home_flag & 1) == 1; } else if (axis == "Y") { - return (home_flag >> 1 & 1) == 1; + return ((home_flag >> 1) & 1) == 1; } else if (axis == "Z") { - return (home_flag >> 2 & 1) == 1; + return ((home_flag >> 2) & 1) == 1; } else { return true; } @@ -1646,14 +932,16 @@ void MachineObject::parse_status(int flag) if (time(nullptr) - ams_user_setting_start > HOLD_COUNT_MAX) { - ams_calibrate_remain_flag = ((flag >> 7) & 0x1) != 0; + m_fila_system->GetAmsSystemSetting().SetDetectRemainEnabled(((flag >> 7) & 0x1) != 0); } - sdcard_state = MachineObject::SdcardState(get_flag_bits(flag, 8, 2)); + // sdcard_state = MachineObject::SdcardState(get_flag_bits(flag, 8, 2)); + m_storage->set_sdcard_state(get_flag_bits(flag, 8, 2)); + if (time(nullptr) - ams_switch_filament_start > HOLD_TIME_3SEC) { - ams_auto_switch_filament_flag = ((flag >> 10) & 0x1) != 0; + m_fila_system->GetAmsSystemSetting().SetAutoRefillEnabled(((flag >> 10) & 0x1) != 0); } is_support_flow_calibration = ((flag >> 15) & 0x1) != 0; @@ -1709,14 +997,6 @@ void MachineObject::parse_status(int flag) is_support_tunnel_mqtt = false; } -PrintingSpeedLevel MachineObject::_parse_printing_speed_lvl(int lvl) -{ - if (lvl < (int)SPEED_LEVEL_COUNT) - return PrintingSpeedLevel(lvl); - - return PrintingSpeedLevel::SPEED_LEVEL_INVALID; -} - int MachineObject::get_bed_temperature_limit() { if (get_printer_series() == PrinterSeries::SERIES_X1) { @@ -1734,17 +1014,17 @@ int MachineObject::get_bed_temperature_limit() bool MachineObject::is_filament_installed() { - if (m_extder_data.extders.size() > 0) { + if (m_extder_system->GetTotalExtderCount() > 0) { // right//or single - auto ext = m_extder_data.extders[MAIN_NOZZLE_ID]; - if (ext.ext_has_filament) { + auto ext = m_extder_system->m_extders[MAIN_EXTRUDER_ID]; + if (ext.m_ext_has_filament) { return true; } } /*left*/ - if (m_extder_data.extders.size() > 1) { - auto ext = m_extder_data.extders[DEPUTY_NOZZLE_ID]; - if (ext.ext_has_filament) { + if (m_extder_system->GetTotalExtderCount() > 1) { + auto ext = m_extder_system->m_extders[DEPUTY_EXTRUDER_ID]; + if (ext.m_ext_has_filament) { return true; } } @@ -1771,10 +1051,7 @@ bool MachineObject::is_sdcard_printing() return false; } -MachineObject::SdcardState MachineObject::get_sdcard_state() -{ - return sdcard_state; -} + bool MachineObject::is_timelapse() { @@ -1845,12 +1122,12 @@ bool MachineObject::canEnableTimelapse(wxString &error_message) const return true; } - if (sdcard_state != MachineObject::SdcardState::HAS_SDCARD_NORMAL) { - if (sdcard_state == MachineObject::SdcardState::NO_SDCARD) { + if (m_storage->get_sdcard_state() != DevStorage::SdcardState::HAS_SDCARD_NORMAL) { + if (m_storage->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { error_message = _L("Timelapse is not supported while the storage does not exist."); - } else if (sdcard_state == MachineObject::SdcardState::HAS_SDCARD_ABNORMAL) { + } else if (m_storage->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL) { error_message = _L("Timelapse is not supported while the storage is unavailable."); - } else if (sdcard_state == MachineObject::SdcardState::HAS_SDCARD_READONLY) { + } else if (m_storage->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_READONLY) { error_message = _L("Timelapse is not supported while the storage is readonly."); } @@ -1860,23 +1137,6 @@ bool MachineObject::canEnableTimelapse(wxString &error_message) const return true; } -int MachineObject::command_select_extruder(int id) -{ - BOOST_LOG_TRIVIAL(info) << "select_extruder"; - - json j; - j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["print"]["command"] = "select_extruder"; - j["print"]["extruder_index"] = id; - int rtn = this->publish_json(j.dump(), 1); - if (rtn == 0) - { - targ_nozzle_id_from_pc = id; - } - - return rtn; -} - int MachineObject::command_get_version(bool with_retry) { BOOST_LOG_TRIVIAL(info) << "command_get_version"; @@ -1885,7 +1145,7 @@ int MachineObject::command_get_version(bool with_retry) j["info"]["command"] = "get_version"; if (with_retry) get_version_retry = GET_VERSION_RETRYS; - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_get_access_code() { @@ -1894,7 +1154,7 @@ int MachineObject::command_get_access_code() { j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["system"]["command"] = "get_access_code"; - return this->publish_json(j.dump()); + return this->publish_json(j); } @@ -1922,7 +1182,7 @@ int MachineObject::command_request_push_all(bool request_now) j["pushing"]["command"] = "pushall"; j["pushing"]["version"] = 1; j["pushing"]["push_target"] = 1; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_pushing(std::string cmd) @@ -1942,7 +1202,7 @@ int MachineObject::command_pushing(std::string cmd) json j; j["pushing"]["command"] = cmd; j["pushing"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump()); + return this->publish_json(j); } return -1; } @@ -1956,7 +1216,7 @@ int MachineObject::command_clean_print_error(std::string subtask_id, int print_e j["print"]["subtask_id"] = subtask_id; j["print"]["print_error"] = print_error; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_clean_print_error_uiop(int print_error) @@ -1974,7 +1234,7 @@ int MachineObject::command_clean_print_error_uiop(int print_error) ::sprintf(buf, "%08X", print_error); j["system"]["err"] = std::string(buf); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_upgrade_confirm() @@ -1984,7 +1244,7 @@ int MachineObject::command_upgrade_confirm() j["upgrade"]["command"] = "upgrade_confirm"; j["upgrade"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["upgrade"]["src_id"] = 1; // 1 for slicer - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_consistency_upgrade_confirm() @@ -1994,7 +1254,7 @@ int MachineObject::command_consistency_upgrade_confirm() j["upgrade"]["command"] = "consistency_confirm"; j["upgrade"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["upgrade"]["src_id"] = 1; // 1 for slicer - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_upgrade_firmware(FirmwareInfo info) @@ -2011,7 +1271,7 @@ int MachineObject::command_upgrade_firmware(FirmwareInfo info) j["upgrade"]["version"] = info.version; j["upgrade"]["src_id"] = 1; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_upgrade_module(std::string url, std::string module_type, std::string version) @@ -2024,7 +1284,7 @@ int MachineObject::command_upgrade_module(std::string url, std::string module_ty j["upgrade"]["version"] = version; j["upgrade"]["src_id"] = 1; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_xyz_abs() @@ -2048,42 +1308,7 @@ int MachineObject::command_go_home2() json j; j["print"]["command"] = "back_to_center"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump()); -} - -// Old protocol -int MachineObject::command_control_fan(int fan_type, int val) -{ - std::string gcode = (boost::format("M106 P%1% S%2% \n") % (int)fan_type % (val)).str(); - return this->publish_gcode(gcode); -} - -// New protocol -int MachineObject::command_control_fan_new(int fan_id, int val, const CommandCallBack &cb) -{ - BOOST_LOG_TRIVIAL(info) << "New protocol of fan setting(set speed), fan_id = " << fan_id; - m_callback_list[std::to_string(m_sequence_id)] = cb; - json j; - j["print"]["command"] = "set_fan"; - j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["print"]["fan_index"] = fan_id; - - j["print"]["speed"] = val; - BOOST_LOG_TRIVIAL(info) << "MachineObject::command_control_fan_val, set the speed of fan, fan_id = " << fan_id; - return this->publish_json(j.dump()); -} - -int MachineObject::command_control_air_duct(int mode_id, int submode, const CommandCallBack &cb) -{ - BOOST_LOG_TRIVIAL(info) << "MachineObject::command_control_air_duct, set air duct, d = " << mode_id; - m_callback_list[std::to_string(m_sequence_id)] = cb; - json j; - j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["print"]["command"] = "set_airduct"; - j["print"]["modeId"] = mode_id; - j["print"]["submode"] = submode; - - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_task_abort() @@ -2094,7 +1319,7 @@ int MachineObject::command_task_abort() j["print"]["param"] = ""; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_task_cancel(std::string job_id) @@ -2106,7 +1331,7 @@ int MachineObject::command_task_cancel(std::string job_id) j["print"]["job_id"] = job_id; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_task_pause() @@ -2116,7 +1341,7 @@ int MachineObject::command_task_pause() j["print"]["param"] = ""; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_task_resume() @@ -2128,7 +1353,7 @@ int MachineObject::command_task_resume() j["print"]["param"] = ""; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_hms_idle_ignore(const std::string &error_str, int type) @@ -2140,7 +1365,7 @@ int MachineObject::command_hms_idle_ignore(const std::string &error_str, int typ j["print"]["err"] = error_str; j["print"]["type"] = type; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_hms_resume(const std::string& error_str, const std::string& job_id) @@ -2154,7 +1379,7 @@ int MachineObject::command_hms_resume(const std::string& error_str, const std::s j["print"]["job_id"] = job_id; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_hms_ignore(const std::string& error_str, const std::string& job_id) @@ -2168,7 +1393,7 @@ int MachineObject::command_hms_ignore(const std::string& error_str, const std::s j["print"]["job_id"] = job_id; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_hms_stop(const std::string &error_str, const std::string &job_id) { @@ -2179,7 +1404,7 @@ int MachineObject::command_hms_stop(const std::string &error_str, const std::str j["print"]["job_id"] = job_id; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_stop_buzzer() @@ -2189,7 +1414,7 @@ int MachineObject::command_stop_buzzer() j["print"]["mode"] = 0; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_set_bed(int temp) @@ -2200,7 +1425,7 @@ int MachineObject::command_set_bed(int temp) j["print"]["command"] = "set_bed_temp"; j["print"]["temp"] = temp; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump()); + return this->publish_json(j); } std::string gcode_str = (boost::format("M140 S%1%\n") % temp).str(); @@ -2223,7 +1448,7 @@ int MachineObject::command_set_nozzle_new(int nozzle_id, int temp) j["print"]["extruder_index"] = nozzle_id; j["print"]["target_temp"] = temp; - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::command_set_chamber(int temp) @@ -2233,7 +1458,7 @@ int MachineObject::command_set_chamber(int temp) j["print"]["command"] = "set_ctt"; j["print"]["ctt_val"] = temp; - return this->publish_json(j.dump(), 1); + return this->publish_json(j, 1); } int MachineObject::check_resume_condition() @@ -2256,7 +1481,6 @@ int MachineObject::command_ams_change_filament(bool load, std::string ams_id, st if (ams_id == "254") ams_id = "255"; - j["print"]["command"] = "ams_change_filament"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["curr_temp"] = old_temp; @@ -2276,9 +1500,9 @@ int MachineObject::command_ams_change_filament(bool load, std::string ams_id, st j["print"]["slot_id"] = atoi(slot_id.c_str()); } - } catch (const std::exception &) {} - return this->publish_json(j.dump()); + } catch (const std::exception &) {} + return this->publish_json(j); } int MachineObject::command_ams_user_settings(int ams_id, bool start_read_opt, bool tray_read_opt, bool remain_flag) @@ -2291,12 +1515,12 @@ int MachineObject::command_ams_user_settings(int ams_id, bool start_read_opt, bo j["print"]["tray_read_option"] = tray_read_opt; j["print"]["calibrate_remain_flag"] = remain_flag; - ams_insert_flag = tray_read_opt; - ams_power_on_flag = start_read_opt; - ams_calibrate_remain_flag = remain_flag; + m_fila_system->GetAmsSystemSetting().SetDetectOnInsertEnabled(tray_read_opt); + m_fila_system->GetAmsSystemSetting().SetDetectOnPowerupEnabled(start_read_opt); + m_fila_system->GetAmsSystemSetting().SetDetectRemainEnabled(remain_flag); ams_user_setting_start = time(nullptr); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ams_calibrate(int ams_id) @@ -2336,7 +1560,7 @@ int MachineObject::command_ams_filament_settings(int ams_id, int slot_id, std::s j["print"]["nozzle_temp_max"] = nozzle_temp_max; j["print"]["tray_type"] = tray_type; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ams_refresh_rfid(std::string tray_id) @@ -2353,7 +1577,7 @@ int MachineObject::command_ams_refresh_rfid2(int ams_id, int slot_id) j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["ams_id"] = ams_id; j["print"]["slot_id"] = slot_id; - return this->publish_json(j.dump()); + return this->publish_json(j); } @@ -2374,7 +1598,7 @@ int MachineObject::command_ams_control(std::string action) j["print"]["command"] = "ams_control"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["param"] = action; - return this->publish_json(j.dump()); + return this->publish_json(j); } return -1; } @@ -2387,78 +1611,6 @@ int MachineObject::command_ams_drying_stop() return this->publish_json(j); } -int MachineObject::command_set_chamber_light(LIGHT_EFFECT effect, int on_time, int off_time, int loops, int interval) -{ - json j; - j["system"]["command"] = "ledctrl"; - j["system"]["led_node"] = "chamber_light"; - j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["system"]["led_mode"] = light_effect_str(effect); - j["system"]["led_on_time"] = on_time; - j["system"]["led_off_time"] = off_time; - j["system"]["loop_times"] = loops; - j["system"]["interval_time"] = interval; - return this->publish_json(j.dump()); -} - - -int MachineObject::command_set_chamber_light2(LIGHT_EFFECT effect, int on_time /*= 500*/, int off_time /*= 500*/, int loops /*= 1*/, int interval /*= 1000*/) -{ - json j; - j["system"]["command"] = "ledctrl"; - j["system"]["led_node"] = "chamber_light2"; - j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["system"]["led_mode"] = light_effect_str(effect); - j["system"]["led_on_time"] = on_time; - j["system"]["led_off_time"] = off_time; - j["system"]["loop_times"] = loops; - j["system"]["interval_time"] = interval; - return this->publish_json(j.dump()); -} - -int MachineObject::command_set_printer_nozzle(std::string nozzle_type, float diameter) -{ - nozzle_setting_hold_count = HOLD_COUNT_MAX * 2; - BOOST_LOG_TRIVIAL(info) << "command_set_printer_nozzle, nozzle_type = " << nozzle_type << " diameter = " << diameter; - json j; - j["system"]["command"] = "set_accessories"; - j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["system"]["accessory_type"] = "nozzle"; - j["system"]["nozzle_type"] = nozzle_type; - j["system"]["nozzle_diameter"] = diameter; - return this->publish_json(j.dump()); -} - -int MachineObject::command_set_printer_nozzle2(int id, std::string nozzle_type, float diameter) -{ - nozzle_setting_hold_count = HOLD_COUNT_MAX * 2; - BOOST_LOG_TRIVIAL(info) << "command_set_printer_nozzle2, nozzle_type = " << nozzle_type << " diameter = " << diameter; - json j; - j["print"]["command"] = "set_nozzle"; - j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["print"]["id"] = id; - j["print"]["type"] = nozzle_type; - j["print"]["diameter"] = diameter; - j["print"]["wear"] = 0; - return this->publish_json(j.dump()); -} - - -int MachineObject::command_set_work_light(LIGHT_EFFECT effect, int on_time, int off_time, int loops, int interval) -{ - json j; - j["system"]["command"] = "ledctrl"; - j["system"]["led_node"] = "work_light"; - j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - j["system"]["led_mode"] = light_effect_str(effect); - j["system"]["led_on_time"] = on_time; - j["system"]["led_off_time"] = off_time; - j["system"]["loop_times"] = loops; - j["system"]["interval_time"] = interval; - - return this->publish_json(j.dump()); -} - int MachineObject::command_start_extrusion_cali(int tray_index, int nozzle_temp, int bed_temp, float max_volumetric_speed, std::string setting_id) { BOOST_LOG_TRIVIAL(trace) << "extrusion_cali: tray_id = " << tray_index << ", nozzle_temp = " << nozzle_temp << ", bed_temp = " << bed_temp @@ -2477,7 +1629,7 @@ int MachineObject::command_start_extrusion_cali(int tray_index, int nozzle_temp, // enter extusion cali last_extrusion_cali_start_time = std::chrono::system_clock::now(); BOOST_LOG_TRIVIAL(trace) << "extrusion_cali: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_stop_extrusion_cali() @@ -2507,18 +1659,18 @@ int MachineObject::command_extrusion_cali_set(int tray_index, std::string settin j["print"]["nozzle_temp"] = nozzle_temp; j["print"]["max_volumetric_speed"] = max_volumetric_speed; } - return this->publish_json(j.dump()); + return this->publish_json(j); } -int MachineObject::command_set_printing_speed(PrintingSpeedLevel lvl) +int MachineObject::command_set_printing_speed(DevPrintingSpeedLevel lvl) { json j; j["print"]["command"] = "print_speed"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["param"] = std::to_string((int)lvl); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_set_printing_option(bool auto_recovery) @@ -2530,7 +1682,7 @@ int MachineObject::command_set_printing_option(bool auto_recovery) j["print"]["option"] = print_option; j["print"]["auto_recovery"] = auto_recovery; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_nozzle_blob_detect(bool nozzle_blob_detect) @@ -2541,7 +1693,7 @@ int MachineObject::command_nozzle_blob_detect(bool nozzle_blob_detect) j["print"]["nozzle_blob_detect"] = nozzle_blob_detect; nozzle_blob_detection_enabled = nozzle_blob_detect; nozzle_blob_detection_hold_start = time(nullptr); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_set_prompt_sound(bool prompt_sound){ @@ -2550,7 +1702,7 @@ int MachineObject::command_set_prompt_sound(bool prompt_sound){ j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["sound_enable"] = prompt_sound; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_set_filament_tangle_detect(bool filament_tangle_detect) { @@ -2559,7 +1711,7 @@ int MachineObject::command_set_filament_tangle_detect(bool filament_tangle_detec j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["filament_tangle_detect"] = filament_tangle_detect; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ams_switch_filament(bool switch_filament) @@ -2569,11 +1721,11 @@ int MachineObject::command_ams_switch_filament(bool switch_filament) j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["auto_switch_filament"] = switch_filament; - ams_auto_switch_filament_flag = switch_filament; + m_fila_system->GetAmsSystemSetting().SetAutoRefillEnabled(switch_filament); BOOST_LOG_TRIVIAL(trace) << "command_ams_filament_settings:" << switch_filament; ams_switch_filament_start = time(nullptr); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ams_air_print_detect(bool air_print_detect) @@ -2586,7 +1738,7 @@ int MachineObject::command_ams_air_print_detect(bool air_print_detect) ams_air_print_status = air_print_detect; BOOST_LOG_TRIVIAL(trace) << "command_ams_air_print_detect:" << air_print_detect; - return this->publish_json(j.dump()); + return this->publish_json(j); } @@ -2600,7 +1752,7 @@ int MachineObject::command_axis_control(std::string axis, double unit, double in j["print"]["dir"] = input_val > 0 ? 1 : -1; j["print"]["mode"] = (std::abs(input_val) >= 10) ? 1 : 0; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump()); + return this->publish_json(j); } double value = input_val; @@ -2619,7 +1771,6 @@ int MachineObject::command_axis_control(std::string axis, double unit, double in } else if (axis.compare("E") == 0) { sprintf(cmd, "M83 \nG0 %s%0.1f F%d\n", axis.c_str(), value * unit, speed); - extruder_axis_status = (value >= 0.0f)? LOAD : UNLOAD; } else { return -1; @@ -2636,7 +1787,7 @@ int MachineObject::command_extruder_control(int nozzle_id, double val) j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["extruder_index"] = nozzle_id; j["print"]["length"] = (int)val; - return this->publish_json(j.dump()); + return this->publish_json(j); } bool MachineObject::is_support_command_calibration() @@ -2659,7 +1810,7 @@ int MachineObject::command_start_calibration(bool vibration, bool bed_leveling, j["print"]["command"] = "gcode_file"; j["print"]["param"] = "/usr/etc/print/auto_cali_for_user.gcode"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return this->publish_json(j.dump()); + return this->publish_json(j); } else { json j; j["print"]["command"] = "calibration"; @@ -2670,7 +1821,7 @@ int MachineObject::command_start_calibration(bool vibration, bool bed_leveling, + (vibration ? 1 << 2 : 0) + (bed_leveling ? 1 << 1 : 0) + (xcam_cali ? 1 << 0 : 0); - return this->publish_json(j.dump()); + return this->publish_json(j); } } @@ -2695,7 +1846,7 @@ int MachineObject::command_start_pa_calibration(const X1CCalibInfos &pa_data, in j["print"]["filaments"][i]["nozzle_temp"] = pa_data.calib_datas[i].nozzle_temp; j["print"]["filaments"][i]["ams_id"] = pa_data.calib_datas[i].ams_id; j["print"]["filaments"][i]["slot_id"] = pa_data.calib_datas[i].slot_id; - j["print"]["filaments"][i]["nozzle_id"] = generate_nozzle_id(pa_data.calib_datas[i].nozzle_volume_type,to_string_nozzle_diameter(pa_data.calib_datas[i].nozzle_diameter)).ToStdString(); + j["print"]["filaments"][i]["nozzle_id"] = _generate_nozzle_id(pa_data.calib_datas[i].nozzle_volume_type,to_string_nozzle_diameter(pa_data.calib_datas[i].nozzle_diameter)).ToStdString(); j["print"]["filaments"][i]["nozzle_diameter"] = to_string_nozzle_diameter(pa_data.calib_datas[i].nozzle_diameter); j["print"]["filaments"][i]["max_volumetric_speed"] = std::to_string(pa_data.calib_datas[i].max_volumetric_speed); @@ -2705,17 +1856,7 @@ int MachineObject::command_start_pa_calibration(const X1CCalibInfos &pa_data, in BOOST_LOG_TRIVIAL(info) << "extrusion_cali: " << j.dump(); - try { - json js; - js["cali_type"] = "cali_pa_auto"; - js["nozzle_diameter"] = pa_data.calib_datas[0].nozzle_diameter; - js["filament_id"] = filament_ids; - js["printer_type"] = this->printer_type; - NetworkAgent *agent = GUI::wxGetApp().getAgent(); - if (agent) agent->track_event("cali", js.dump()); - } catch (...) {} - - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_set_pa_calibration(const std::vector &pa_calib_values, bool is_auto_cali) @@ -2735,7 +1876,7 @@ int MachineObject::command_set_pa_calibration(const std::vector & j["print"]["filaments"][i]["cali_idx"] = pa_calib_values[i].cali_idx; j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id; j["print"]["filaments"][i]["extruder_id"] = pa_calib_values[i].extruder_id; - j["print"]["filaments"][i]["nozzle_id"] = generate_nozzle_id(pa_calib_values[i].nozzle_volume_type, to_string_nozzle_diameter(pa_calib_values[i].nozzle_diameter)).ToStdString(); + j["print"]["filaments"][i]["nozzle_id"] = _generate_nozzle_id(pa_calib_values[i].nozzle_volume_type, to_string_nozzle_diameter(pa_calib_values[i].nozzle_diameter)).ToStdString(); j["print"]["filaments"][i]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib_values[i].nozzle_diameter); j["print"]["filaments"][i]["ams_id"] = pa_calib_values[i].ams_id; j["print"]["filaments"][i]["slot_id"] = pa_calib_values[i].slot_id; @@ -2750,7 +1891,7 @@ int MachineObject::command_set_pa_calibration(const std::vector & } BOOST_LOG_TRIVIAL(info) << "extrusion_cali_set: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } return -1; @@ -2762,13 +1903,13 @@ int MachineObject::command_delete_pa_calibration(const PACalibIndexInfo& pa_cali j["print"]["command"] = "extrusion_cali_del"; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["extruder_id"] = pa_calib.extruder_id; - j["print"]["nozzle_id"] = generate_nozzle_id(pa_calib.nozzle_volume_type, to_string_nozzle_diameter(pa_calib.nozzle_diameter)).ToStdString(); + j["print"]["nozzle_id"] = _generate_nozzle_id(pa_calib.nozzle_volume_type, to_string_nozzle_diameter(pa_calib.nozzle_diameter)).ToStdString(); j["print"]["filament_id"] = pa_calib.filament_id; j["print"]["cali_idx"] = pa_calib.cali_idx; j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib.nozzle_diameter); BOOST_LOG_TRIVIAL(info) << "extrusion_cali_del: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_get_pa_calibration_tab(const PACalibExtruderInfo &calib_info) @@ -2782,12 +1923,12 @@ int MachineObject::command_get_pa_calibration_tab(const PACalibExtruderInfo &cal if (calib_info.use_extruder_id) j["print"]["extruder_id"] = calib_info.extruder_id; if (calib_info.use_nozzle_volume_type) - j["print"]["nozzle_id"] = generate_nozzle_id(calib_info.nozzle_volume_type, to_string_nozzle_diameter(calib_info.nozzle_diameter)).ToStdString(); + j["print"]["nozzle_id"] = _generate_nozzle_id(calib_info.nozzle_volume_type, to_string_nozzle_diameter(calib_info.nozzle_diameter)).ToStdString(); j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(calib_info.nozzle_diameter); BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get: " << j.dump(); request_tab_from_bbs = true; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_get_pa_calibration_result(float nozzle_diameter) @@ -2798,7 +1939,7 @@ int MachineObject::command_get_pa_calibration_result(float nozzle_diameter) j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(nozzle_diameter); BOOST_LOG_TRIVIAL(info) << "extrusion_cali_get_result: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::commnad_select_pa_calibration(const PACalibIndexInfo& pa_calib_info) @@ -2814,7 +1955,7 @@ int MachineObject::commnad_select_pa_calibration(const PACalibIndexInfo& pa_cali j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib_info.nozzle_diameter); BOOST_LOG_TRIVIAL(info) << "extrusion_cali_sel: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_start_flow_ratio_calibration(const X1CCalibInfos& calib_data) @@ -2847,7 +1988,7 @@ int MachineObject::command_start_flow_ratio_calibration(const X1CCalibInfos& cal } BOOST_LOG_TRIVIAL(info) << "flowrate_cali: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } return -1; } @@ -2860,7 +2001,7 @@ int MachineObject::command_get_flow_ratio_calibration_result(float nozzle_diamet j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(nozzle_diameter); BOOST_LOG_TRIVIAL(info) << "flowrate_get_result: " << j.dump(); - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ipcam_record(bool on_off) @@ -2872,7 +2013,7 @@ int MachineObject::command_ipcam_record(bool on_off) j["camera"]["control"] = on_off ? "enable" : "disable"; camera_recording_ctl_start = time(nullptr); this->camera_recording_when_printing = on_off; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ipcam_timelapse(bool on_off) @@ -2884,7 +2025,7 @@ int MachineObject::command_ipcam_timelapse(bool on_off) j["camera"]["control"] = on_off ? "enable" : "disable"; camera_timelapse_hold_count = HOLD_COUNT_CAMERA; this->camera_timelapse = on_off; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_ipcam_resolution_set(std::string resolution) @@ -2897,7 +2038,7 @@ int MachineObject::command_ipcam_resolution_set(std::string resolution) camera_resolution_hold_count = HOLD_COUNT_CAMERA; camera_recording_ctl_start = time(nullptr); this->camera_resolution = resolution; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_xcam_control(std::string module_name, bool on_off, std::string lvl) @@ -2917,7 +2058,7 @@ int MachineObject::command_xcam_control(std::string module_name, bool on_off, st // get_flag_bits(cfg, 11, 2); BOOST_LOG_TRIVIAL(info) << "command:xcam_control_set" << ", module_name:" << module_name << ", control:" << on_off << ", halt_print_sensitivity:" << lvl; - return this->publish_json(j.dump()); + return this->publish_json(j); } int MachineObject::command_xcam_control_ai_monitoring(bool on_off, std::string lvl) @@ -2961,7 +2102,6 @@ int MachineObject::command_xcam_control_nozzleclumping_detection(bool on_off, st return command_xcam_control("clump_detector", on_off, lvl); } - int MachineObject::command_xcam_control_airprinting_detection(bool on_off, std::string lvl) { bool print_halt = (lvl == "never_halt") ? false : true; @@ -2972,7 +2112,6 @@ int MachineObject::command_xcam_control_airprinting_detection(bool on_off, std:: return command_xcam_control("airprint_detector", on_off, lvl); } - int MachineObject::command_xcam_control_buildplate_marker_detector(bool on_off) { xcam_buildplate_marker_detector = on_off; @@ -3130,7 +2269,6 @@ void MachineObject::reset() print_status = ""; last_mc_print_stage = -1; m_new_ver_list_exist = false; - extruder_axis_status = LOAD; network_wired = false; dev_connection_name = ""; job_id_ = ""; @@ -3158,13 +2296,13 @@ void MachineObject::set_print_state(std::string status) int MachineObject::connect(bool use_openssl) { - if (dev_ip.empty()) return -1; + if (get_dev_ip().empty()) return -1; std::string username = "bblp"; std::string password = get_access_code(); if (m_agent) { try { - return m_agent->connect_printer(dev_id, dev_ip, username, password, use_openssl); + return m_agent->connect_printer(get_dev_id(), get_dev_ip(), username, password, use_openssl); } catch (...) { ; } @@ -3212,13 +2350,22 @@ void MachineObject::set_online_state(bool on_off) bool MachineObject::is_info_ready(bool check_version) const { if (check_version && module_vers.empty()) + { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": not ready, failed to check version"; return false; + } std::chrono::system_clock::time_point curr_time = std::chrono::system_clock::now(); auto diff = std::chrono::duration_cast(last_push_time - curr_time); if (m_full_msg_count > 0 && m_push_count > 0 && diff.count() < PUSHINFO_TIMEOUT) { return true; } + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ + << ": not ready, m_full_msg_count=" << m_full_msg_count + << ", m_push_count=" << m_push_count + << ", diff.count()=" << diff.count() + << ", dev_id=" << dev_id; return false; } @@ -3230,7 +2377,7 @@ std::vector MachineObject::get_resolution_supported() std::vector MachineObject::get_compatible_machine() { - return DeviceManager::get_compatible_machine(printer_type); + return DevPrinterConfigUtil::get_compatible_machine(printer_type); } bool MachineObject::is_camera_busy_off() @@ -3240,19 +2387,19 @@ bool MachineObject::is_camera_busy_off() return false; } -int MachineObject::publish_json(std::string json_str, int qos, int flag) +int MachineObject::publish_json(const json& json_item, int qos, int flag) { int rtn = 0; if (is_lan_mode_printer()) { - rtn = local_publish_json(json_str, qos, flag); + rtn = local_publish_json(json_item.dump(), qos, flag); } else { - rtn = cloud_publish_json(json_str, qos, flag); + rtn = cloud_publish_json(json_item.dump(), qos, flag); } if (rtn == 0) { - BOOST_LOG_TRIVIAL(info) << "publish_json: " << json_str << " code: " << rtn; + BOOST_LOG_TRIVIAL(info) << "publish_json: " << json_item.dump() << " code: " << rtn; } else { - BOOST_LOG_TRIVIAL(error) << "publish_json: " << json_str << " code: " << rtn; + BOOST_LOG_TRIVIAL(error) << "publish_json: " << json_item.dump() << " code: " << rtn; } return rtn; @@ -3262,7 +2409,7 @@ int MachineObject::cloud_publish_json(std::string json_str, int qos, int flag) { int result = -1; if (m_agent) - result = m_agent->send_message(dev_id, json_str, qos, flag); + result = m_agent->send_message(get_dev_id(), json_str, qos, flag); return result; } @@ -3271,7 +2418,7 @@ int MachineObject::local_publish_json(std::string json_str, int qos, int flag) { int result = -1; if (m_agent) { - result = m_agent->send_message_to_printer(dev_id, json_str, qos, flag); + result = m_agent->send_message_to_printer(get_dev_id(), json_str, qos, flag); } return result; } @@ -3452,27 +2599,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ", message delay, message total: " << total; - try { - if (m_agent) { - json j_message; - - // Convert timestamp to time - std::time_t t = time_t(last_time_stap / 1000); //s - std::tm* now_tm = std::localtime(&t); - char buffer[80]; - std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", now_tm); - - std::string time_str = std::string(buffer); - j_message["time"] = time_str; - j_message["total"] = total; - j_message["local_mqtt"] = std::to_string(local_mqtt_timeout) + "/" + std::to_string(local_mqtt); - j_message["tunnel_mqtt"] = std::to_string(tunnel_mqtt_timeout) + "/" + std::to_string(tunnel_mqtt); - j_message["cloud_mqtt"] = std::to_string(cloud_mqtt_timeout) + "/" + std::to_string(cloud_mqtt); - - m_agent->track_event("message_delay", j_message.dump()); - } - } - catch (...) {} message_delay.clear(); message_delay.shrink_to_fit(); @@ -3500,7 +2626,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ json j_module = j["info"]["module"]; clear_version_info(); for (auto it = j_module.begin(); it != j_module.end(); it++) { - ModuleVersionInfo ver_info; + DevFirmwareVersionInfo ver_info; ver_info.name = (*it)["name"].get(); if ((*it).contains("product_name")) ver_info.product_name = wxString::FromUTF8((*it)["product_name"].get()); @@ -3516,13 +2642,13 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if ((*it).contains("hw_ver")) ver_info.hw_ver = (*it)["hw_ver"].get(); if((*it).contains("flag")) - ver_info.firmware_status= (*it)["flag"].get(); + ver_info.firmware_flag= (*it)["flag"].get(); store_version_info(ver_info); if (ver_info.name == "ota") { NetworkAgent* agent = GUI::wxGetApp().getAgent(); if (agent) { - std::string dev_ota_str = "dev_ota_ver:" + this->dev_id; + std::string dev_ota_str = "dev_ota_ver:" + this->get_dev_id(); agent->track_update_property(dev_ota_str, ver_info.sw_ver); } } @@ -3572,7 +2698,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } if (!key_field_only) { - if (!DeviceManager::EnableMultiMachine && !is_support_agora) { + if (!m_manager->IsMultiMachineEnabled() && !is_support_agora) { if (jj.contains("support_tunnel_mqtt")) { if (jj["support_tunnel_mqtt"].is_boolean()) { is_support_tunnel_mqtt = jj["support_tunnel_mqtt"].get(); @@ -3601,67 +2727,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } //supported function - if (jj.contains("support_chamber_temp_edit")) { - if (jj["support_chamber_temp_edit"].is_boolean()) { - is_support_chamber_edit = jj["support_chamber_temp_edit"].get(); - } - - const auto& support_champer_range = jj["support_chamber_temp_edit_range"]; - if (support_champer_range.is_array() && !support_champer_range.empty()) - { - chamber_temp_edit_min = support_champer_range[0]; - chamber_temp_edit_max = support_champer_range[1]; - } - - if (jj.contains("support_chamber_temp_switch_heating")) - { - const auto& support_chamber_temp_switch_heating = jj["support_chamber_temp_switch_heating"]; - if (support_chamber_temp_switch_heating.is_number()) - { - chamber_temp_switch_heat = support_chamber_temp_switch_heating.get(); - } - } - } - - if (jj.contains("support_extrusion_cali")) { - if (jj["support_extrusion_cali"].is_boolean()) { - is_support_extrusion_cali = jj["support_extrusion_cali"].get(); - } - } - - if (jj.contains("support_first_layer_inspect")) { - if (jj["support_first_layer_inspect"].is_boolean()) { - is_support_first_layer_inspect = jj["support_first_layer_inspect"].get(); - } - } - - if (jj.contains("support_save_remote_print_file_to_storage")) { - if (jj["support_save_remote_print_file_to_storage"].is_boolean()) { - is_support_save_remote_print_file_to_storage = jj["support_save_remote_print_file_to_storage"].get(); - } - } - - if (jj.contains("support_ai_monitoring")) { - if (jj["support_ai_monitoring"].is_boolean()) { - is_support_ai_monitoring = jj["support_ai_monitoring"].get(); - } - } - - if (jj.contains("support_lidar_calibration")) { - if (jj["support_lidar_calibration"].is_boolean()) { - is_support_lidar_calibration = jj["support_lidar_calibration"].get(); - } - } - - if (jj.contains("support_nozzle_offset_calibration") && jj["support_nozzle_offset_calibration"].is_boolean()) - { - is_support_nozzle_offset_cali = jj["support_nozzle_offset_calibration"].get(); - } - - if (jj.contains("support_high_tempbed_calibration") && jj["support_high_tempbed_calibration"].is_boolean()) - { - is_support_high_tempbed_cali = jj["support_high_tempbed_calibration"].get(); - } + m_config->ParseConfig(jj); if (jj.contains("support_build_plate_marker_detect")) { if (jj["support_build_plate_marker_detect"].is_boolean()) { @@ -3678,39 +2744,13 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ is_support_pa_calibration = jj["support_flow_calibration"].get(); } - if (jj.contains("support_auto_flow_calibration") && jj["support_auto_flow_calibration"].is_boolean()) - { - is_support_auto_flow_calibration = jj["support_auto_flow_calibration"].get(); - } - - if (jj.contains("support_print_without_sd")) { - if (jj["support_print_without_sd"].is_boolean()) { - is_support_print_without_sd = jj["support_print_without_sd"].get(); - } - } - - if (jj.contains("support_print_all")) { - if (jj["support_print_all"].is_boolean()) { - is_support_print_all = jj["support_print_all"].get(); - } - } if (jj.contains("support_send_to_sd")) { if (jj["support_send_to_sd"].is_boolean()) { is_support_send_to_sdcard = jj["support_send_to_sd"].get(); } } - if (jj.contains("support_aux_fan")) { - if (jj["support_aux_fan"].is_boolean()) { - is_support_aux_fan = jj["support_aux_fan"].get(); - } - } - - if (jj.contains("support_chamber_fan")) { - if (jj["support_chamber_fan"].is_boolean()) { - is_support_chamber_fan = jj["support_chamber_fan"].get(); - } - } + m_fan->ParseV2_0(jj); if (jj.contains("support_filament_backup")) { if (jj["support_filament_backup"].is_boolean()) { @@ -3897,14 +2937,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ print_error = jj["print_error"].get(); } - if (jj.contains("sdcard")) { - if (jj["sdcard"].get()) - sdcard_state = MachineObject::SdcardState::HAS_SDCARD_NORMAL; - else - sdcard_state = MachineObject::SdcardState::NO_SDCARD; - } else { - sdcard_state = MachineObject::SdcardState::NO_SDCARD; - } + DevStorage::ParseV1_0(jj, m_storage); if (!key_field_only) { if (jj.contains("home_flag")) { @@ -3915,7 +2948,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ /*the param is invalid in np for Yeshu*/ if (jj.contains("hw_switch_state")) { hw_switch_state = jj["hw_switch_state"].get(); - m_extder_data.extders[MAIN_NOZZLE_ID].ext_has_filament = hw_switch_state; + m_extder_system->m_extders[MAIN_EXTRUDER_ID].m_ext_has_filament = hw_switch_state; } if (jj.contains("mc_print_line_number")) { if (jj["mc_print_line_number"].is_string() && !jj["mc_print_line_number"].is_null()) @@ -3942,7 +2975,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (tmp_dev_ip == 0) continue ; else { - set_dev_ip(convertToIp(tmp_dev_ip)); + set_dev_ip(DevUtil::convertToIp(tmp_dev_ip)); } } else { break; @@ -3996,7 +3029,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } if (jj.contains("job_id")) { is_support_wait_sending_finish = true; - this->job_id_ = JsonValParser::get_longlong_val(jj["job_id"]); + this->job_id_ = DevJsonValParser::get_longlong_val(jj["job_id"]); } else { is_support_wait_sending_finish = false; @@ -4008,7 +3041,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (!key_field_only) { if (jj.contains("printer_type")) { - printer_type = parse_printer_type(jj["printer_type"].get()); + printer_type = _parse_printer_type(jj["printer_type"].get()); } if (jj.contains("layer_num")) { @@ -4091,35 +3124,17 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ #pragma region status if (!key_field_only) { /* temperature */ - if (jj.contains("bed_temper")) { - if (jj["bed_temper"].is_number()) { - bed_temp = jj["bed_temper"].get(); - } - } - if (jj.contains("bed_target_temper")) { - if (jj["bed_target_temper"].is_number()) { - bed_temp_target = jj["bed_target_temper"].get(); - } - } + + DevBed::ParseV1_0(jj,m_bed); + if (jj.contains("frame_temper")) { if (jj["frame_temper"].is_number()) { frame_temp = jj["frame_temper"].get(); } } - if (jj.contains("nozzle_temper")) { - if (jj["nozzle_temper"].is_number()) { - if (m_extder_data.extders.size() == 1) { - m_extder_data.extders[MAIN_NOZZLE_ID].temp = jj["nozzle_temper"].get(); - } - } - } - if (jj.contains("nozzle_target_temper")) { - if (jj["nozzle_target_temper"].is_number()) { - if (m_extder_data.extders.size() == 1) { - m_extder_data.extders[MAIN_NOZZLE_ID].target_temp = jj["nozzle_target_temper"].get(); - } - } - } + + ExtderSystemParser::ParseV1_0(jj, m_extder_system); + if (jj.contains("chamber_temper")) { if (jj["chamber_temper"].is_number()) { chamber_temp = jj["chamber_temper"].get(); @@ -4139,51 +3154,15 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ wifi_signal = jj["wifi_signal"].get(); /* cooling */ - if (jj.contains("fan_gear")) { - fan_gear = jj["fan_gear"].get(); - big_fan2_speed = (int)((fan_gear & 0x00FF0000) >> 16); - big_fan1_speed = (int)((fan_gear & 0x0000FF00) >> 8); - cooling_fan_speed = (int)((fan_gear & 0x000000FF) >> 0); - } - else { - if (jj.contains("cooling_fan_speed")) { - cooling_fan_speed = stoi(jj["cooling_fan_speed"].get()); - cooling_fan_speed = round(floor(cooling_fan_speed / float(1.5)) * float(25.5)); - } - else { - cooling_fan_speed = 0; - } - if (jj.contains("big_fan1_speed")) { - big_fan1_speed = stoi(jj["big_fan1_speed"].get()); - big_fan1_speed = round( floor(big_fan1_speed / float(1.5)) * float(25.5) ); - } - else { - big_fan1_speed = 0; - } - if (jj.contains("big_fan2_speed")) { - big_fan2_speed = stoi(jj["big_fan2_speed"].get()); - big_fan2_speed = round( floor(big_fan2_speed / float(1.5)) * float(25.5) ); - } - else { - big_fan2_speed = 0; - } - } - - if (jj.contains("heatbreak_fan_speed")) { - heatbreak_fan_speed = stoi(jj["heatbreak_fan_speed"].get()); - } + m_fan->ParseV1_0(jj); /* parse speed */ + DevPrintOptionsParser::Parse(m_print_options, jj); + try { - if (jj.contains("spd_lvl")) { - printing_speed_lvl = (PrintingSpeedLevel)jj["spd_lvl"].get(); - } if (jj.contains("spd_mag")) { printing_speed_mag = jj["spd_mag"].get(); } - if (jj.contains("heatbreak_fan_speed")) { - heatbreak_fan_speed = stoi(jj["heatbreak_fan_speed"].get()); - } } catch (...) { ; @@ -4212,20 +3191,16 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (!key_field_only) { /*get filam_bak*/ try { - m_extder_data.extders[MAIN_NOZZLE_ID].filam_bak.clear(); + m_extder_system->m_extders[MAIN_EXTRUDER_ID].m_filam_bak.clear(); if (jj.contains("filam_bak")) { - is_support_show_filament_backup = true; if (jj["filam_bak"].is_array()) { for (auto it = jj["filam_bak"].begin(); it != jj["filam_bak"].end(); it++) { const auto& filam_bak_val = it.value().get(); - m_extder_data.extders[MAIN_NOZZLE_ID].filam_bak.push_back(filam_bak_val); + m_extder_system->m_extders[MAIN_EXTRUDER_ID].m_filam_bak.push_back(filam_bak_val); } } } - else { - is_support_show_filament_backup = false; - } } catch (...) { ; @@ -4261,9 +3236,9 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (jj.contains("lights_report") && jj["lights_report"].is_array()) { for (auto it = jj["lights_report"].begin(); it != jj["lights_report"].end(); it++) { if ((*it)["node"].get().compare("chamber_light") == 0) - chamber_light = light_effect_parse((*it)["mode"].get()); - if ((*it)["node"].get().compare("work_light") == 0) - work_light = light_effect_parse((*it)["mode"].get()); + { + m_lamp->SetChamberLight((*it)["mode"].get()); + } } } } @@ -4273,49 +3248,10 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } #pragma endregion if (!key_field_only) { - try { - if (jj.contains("nozzle_diameter")) { - if (nozzle_setting_hold_count > 0) { - nozzle_setting_hold_count--; - } else { - float nozzle_diameter = 0.0f; - if (jj["nozzle_diameter"].is_number_float()) { - nozzle_diameter = jj["nozzle_diameter"].get(); - } - else if (jj["nozzle_diameter"].is_string()) { - nozzle_diameter = string_to_float(jj["nozzle_diameter"].get()); - } - if (nozzle_diameter == 0.0f) {m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter = 0.0f;} - else { m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter = round(nozzle_diameter * 10) / 10;} - } - } - } - catch(...) { - ; - } - - try { - if (jj.contains("nozzle_type")) { - - if (nozzle_setting_hold_count > 0) { - nozzle_setting_hold_count--; - } - else { - if (jj["nozzle_type"].is_string()) { - auto nozzle_type = jj["nozzle_type"].get(); - if (nozzle_type.empty()) { - m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_type = NozzleType::ntUndefine; - } - else { - m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_type = NozzleTypeStrToEumn[nozzle_type]; - } - } - } - } - } - catch (...) { - ; + if (jj.contains("nozzle_diameter") && jj.contains("nozzle_type")) + { + DevNozzleSystemParser::ParseV1_0(jj["nozzle_type"], jj["nozzle_diameter"], m_nozzle_system); } } @@ -4345,7 +3281,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (jj["upgrade_state"].contains("err_code")) upgrade_err_code = jj["upgrade_state"]["err_code"].get(); if (jj["upgrade_state"].contains("dis_state")) { - if (upgrade_display_state != jj["upgrade_state"]["dis_state"].get() + if ((int)upgrade_display_state != jj["upgrade_state"]["dis_state"].get() && jj["upgrade_state"]["dis_state"].get() == 3) { GUI::wxGetApp().CallAfter([this] { this->command_get_version(); @@ -4357,10 +3293,10 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } else { - upgrade_display_state = jj["upgrade_state"]["dis_state"].get(); - if ((upgrade_display_state == 1) && is_lan_mode_printer()) + upgrade_display_state = (DevFirmwareUpgradingState)jj["upgrade_state"]["dis_state"].get(); + if ((upgrade_display_state == DevFirmwareUpgradingState::UpgradingAvaliable) && is_lan_mode_printer()) { - upgrade_display_state = (int) UpgradingDisplayState::UpgradingUnavaliable; + upgrade_display_state = DevFirmwareUpgradingState::UpgradingUnavaliable; } } } @@ -4374,21 +3310,21 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ || upgrade_status == "UPGRADE_REQUEST" || upgrade_status == "PRE_FLASH_START" || upgrade_status == "PRE_FLASH_SUCCESS") { - upgrade_display_state = (int)UpgradingDisplayState::UpgradingInProgress; + upgrade_display_state = DevFirmwareUpgradingState::UpgradingInProgress; } else if (upgrade_status == "UPGRADE_SUCCESS" || upgrade_status == "DOWNLOAD_FAIL" || upgrade_status == "FLASH_FAIL" || upgrade_status == "PRE_FLASH_FAIL" || upgrade_status == "UPGRADE_FAIL") { - upgrade_display_state = (int)UpgradingDisplayState::UpgradingFinished; + upgrade_display_state = DevFirmwareUpgradingState::UpgradingFinished; } else { if (upgrade_new_version) { - upgrade_display_state = (int)UpgradingDisplayState::UpgradingAvaliable; + upgrade_display_state = DevFirmwareUpgradingState::UpgradingAvaliable; } else { - upgrade_display_state = (int)UpgradingDisplayState::UpgradingUnavaliable; + upgrade_display_state = DevFirmwareUpgradingState::UpgradingUnavaliable; } } } @@ -4398,7 +3334,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ m_new_ver_list_exist = true; new_ver_list.clear(); for (auto ver_item = jj["upgrade_state"]["new_ver_list"].begin(); ver_item != jj["upgrade_state"]["new_ver_list"].end(); ver_item++) { - ModuleVersionInfo ver_info; + DevFirmwareVersionInfo ver_info; if (ver_item->contains("name")) ver_info.name = (*ver_item)["name"].get(); else @@ -4590,27 +3526,8 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ #pragma endregion #pragma region hms - if (!key_field_only) { - // parse hms msg - try { - hms_list.clear(); - if (jj.contains("hms")) { - if (jj["hms"].is_array()) { - for (auto it = jj["hms"].begin(); it != jj["hms"].end(); it++) { - HMSItem item; - if ((*it).contains("attr") && (*it).contains("code")) { - unsigned attr = (*it)["attr"].get(); - unsigned code = (*it)["code"].get(); - item.parse_hms_info(attr, code); - } - hms_list.push_back(item); - } - } - } - } - catch (...) { - ; - } + if (!key_field_only && jj.contains("hms")) { + m_hms_system->ParseHMSItems(jj["hms"]); } #pragma endregion @@ -4637,389 +3554,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ update_printer_preset_name(); update_filament_list(); if (jj.contains("ams")) { - if (jj["ams"].contains("ams")) { - long int last_ams_exist_bits = ams_exist_bits; - long int last_tray_exist_bits = tray_exist_bits; - long int last_is_bbl_bits = tray_is_bbl_bits; - long int last_read_done_bits = tray_read_done_bits; - long int last_ams_version = ams_version; - if (jj["ams"].contains("ams_exist_bits")) { - ams_exist_bits = stol(jj["ams"]["ams_exist_bits"].get(), nullptr, 16); - } - - if (jj["ams"].contains("tray_exist_bits")) { - tray_exist_bits = stol(jj["ams"]["tray_exist_bits"].get(), nullptr, 16); - } - - if (jj["ams"].contains("cali_id")) - { - ams_cali_id = jj["ams"]["cali_id"].get(); - } - - if (jj["ams"].contains("cali_stat")) - { - ams_cali_stat = jj["ams"]["cali_stat"].get(); - } - - if (!key_field_only) { - if (jj["ams"].contains("tray_read_done_bits")) { - tray_read_done_bits = stol(jj["ams"]["tray_read_done_bits"].get(), nullptr, 16); - } - if (jj["ams"].contains("tray_reading_bits")) { - tray_reading_bits = stol(jj["ams"]["tray_reading_bits"].get(), nullptr, 16); - } - if (jj["ams"].contains("tray_is_bbl_bits")) { - tray_is_bbl_bits = stol(jj["ams"]["tray_is_bbl_bits"].get(), nullptr, 16); - } - if (jj["ams"].contains("version")) { - if (jj["ams"]["version"].is_number()) - ams_version = jj["ams"]["version"].get(); - } - if (jj["ams"].contains("tray_tar")) { - m_tray_tar = jj["ams"]["tray_tar"].get(); - } - if (jj["ams"].contains("tray_now")) { - _parse_tray_now(jj["ams"]["tray_now"].get()); - } - if (jj["ams"].contains("ams_rfid_status")) - ams_rfid_status = jj["ams"]["ams_rfid_status"].get(); - - if (jj["ams"].contains("insert_flag") || jj["ams"].contains("power_on_flag") - || jj["ams"].contains("calibrate_remain_flag")) { - if (time(nullptr) - ams_user_setting_start > HOLD_TIME_3SEC) - { - if (jj["ams"].contains("insert_flag")) { - ams_insert_flag = jj["ams"]["insert_flag"].get(); - } - if (jj["ams"].contains("power_on_flag")) { - ams_power_on_flag = jj["ams"]["power_on_flag"].get(); - } - if (jj["ams"].contains("calibrate_remain_flag")) { - ams_calibrate_remain_flag = jj["ams"]["calibrate_remain_flag"].get(); - } - } - } - if (ams_exist_bits != last_ams_exist_bits - || tray_exist_bits != last_tray_exist_bits - || tray_is_bbl_bits != last_is_bbl_bits - || tray_read_done_bits != last_read_done_bits - || ams_version != last_ams_version) { - is_ams_need_update = true; - } - else { - is_ams_need_update = false; - } - - json j_ams = jj["ams"]["ams"]; - std::set ams_id_set; - - for (auto it = amsList.begin(); it != amsList.end(); it++) { - ams_id_set.insert(it->first); - } - - for (auto it = j_ams.begin(); it != j_ams.end(); it++) { - if (!it->contains("id")) continue; - std::string ams_id = (*it)["id"].get(); - - int nozzle_id = MAIN_NOZZLE_ID; // Default nozzle id - int type_id = 1; // 0:dummy 1:ams 2:ams-lite 3:n3f 4:n3s - - /*ams info*/ - std::string info; - if (it->contains("info")) { - info = (*it)["info"].get(); - type_id = get_flag_bits(info, 0, 4); - nozzle_id = get_flag_bits(info, 8, 4); - } - - /*AMS without initialization*/ - if (nozzle_id == 0xE) { - ams_id_set.erase(ams_id); - amsList.erase(ams_id); - continue; - } - - ams_id_set.erase(ams_id); - Ams* curr_ams = nullptr; - auto ams_it = amsList.find(ams_id); - if (ams_it == amsList.end()) { - Ams* new_ams = new Ams(ams_id, nozzle_id, type_id); - new_ams->info = info; - amsList.insert(std::make_pair(ams_id, new_ams)); - // new ams added event - curr_ams = new_ams; - } else { - - if (nozzle_id != ams_it->second->nozzle) { - ams_it->second->nozzle = nozzle_id; - } - - curr_ams = ams_it->second; - } - if (!curr_ams) continue; - - /*set ams type flag*/ - curr_ams->type = type_id; - - - /*set ams exist flag*/ - try { - if (!ams_id.empty()) { - int ams_id_int = atoi(ams_id.c_str()); - - if (type_id < 4) { - curr_ams->is_exists = (ams_exist_bits & (1 << ams_id_int)) != 0 ? true : false; - } else { - curr_ams->is_exists = get_flag_bits(ams_exist_bits, 4 + (ams_id_int - 128)); - } - } - } catch (...) { - ; - } - - if (it->contains("dry_time") && (*it)["dry_time"].is_number()) - { - curr_ams->left_dry_time = (*it)["dry_time"].get(); - } - - if (it->contains("humidity")) { - std::string humidity = (*it)["humidity"].get(); - - try { - curr_ams->humidity = atoi(humidity.c_str()); - } - catch (...) { - ; - } - } - - if (it->contains("humidity_raw")) - { - std::string humidity_raw = (*it)["humidity_raw"].get(); - - try { - curr_ams->humidity_raw = atoi(humidity_raw.c_str()); - } catch (...) { - ; - } - - if (curr_ams->humidity_raw != -1) - { - if (curr_ams->humidity_raw < 20) - { - curr_ams->humidity = 5; - } - else if (curr_ams->humidity_raw < 40) - { - curr_ams->humidity = 4; - } - else if (curr_ams->humidity_raw < 60) - { - curr_ams->humidity = 3; - } - else if (curr_ams->humidity_raw < 80) - { - curr_ams->humidity = 2; - } - else - { - curr_ams->humidity = 1; - } - } - } - - - if (it->contains("temp")) - { - std::string temp = (*it)["temp"].get(); - try - { - curr_ams->current_temperature = string_to_float(temp); - } - catch (...) - { - curr_ams->current_temperature = INVALID_AMS_TEMPERATURE; - } - } - - if (it->contains("tray")) { - std::set tray_id_set; - for (auto it = curr_ams->trayList.begin(); it != curr_ams->trayList.end(); it++) { - tray_id_set.insert(it->first); - } - for (auto tray_it = (*it)["tray"].begin(); tray_it != (*it)["tray"].end(); tray_it++) { - if (!tray_it->contains("id")) continue; - std::string tray_id = (*tray_it)["id"].get(); - tray_id_set.erase(tray_id); - // compare tray_list - AmsTray* curr_tray = nullptr; - auto tray_iter = curr_ams->trayList.find(tray_id); - if (tray_iter == curr_ams->trayList.end()) { - AmsTray* new_tray = new AmsTray(tray_id); - curr_ams->trayList.insert(std::make_pair(tray_id, new_tray)); - curr_tray = new_tray; - } - else { - curr_tray = tray_iter->second; - } - if (!curr_tray) continue; - - if (curr_tray->hold_count > 0) { - curr_tray->hold_count--; - continue; - } - - curr_tray->id = (*tray_it)["id"].get(); - if (tray_it->contains("tag_uid")) - curr_tray->tag_uid = (*tray_it)["tag_uid"].get(); - else - curr_tray->tag_uid = "0"; - if (tray_it->contains("tray_info_idx") && tray_it->contains("tray_type")) { - curr_tray->setting_id = (*tray_it)["tray_info_idx"].get(); - //std::string type = (*tray_it)["tray_type"].get(); - std::string type = setting_id_to_type(curr_tray->setting_id, (*tray_it)["tray_type"].get()); - if (curr_tray->setting_id == "GFS00") { - curr_tray->type = "PLA-S"; - } - else if (curr_tray->setting_id == "GFS01") { - curr_tray->type = "PA-S"; - } else { - curr_tray->type = type; - } - } else { - curr_tray->setting_id = ""; - curr_tray->type = ""; - } - if (tray_it->contains("tray_sub_brands")) - curr_tray->sub_brands = (*tray_it)["tray_sub_brands"].get(); - else - curr_tray->sub_brands = ""; - if (tray_it->contains("tray_weight")) - curr_tray->weight = (*tray_it)["tray_weight"].get(); - else - curr_tray->weight = ""; - if (tray_it->contains("tray_diameter")) - curr_tray->diameter = (*tray_it)["tray_diameter"].get(); - else - curr_tray->diameter = ""; - if (tray_it->contains("tray_temp")) - curr_tray->temp = (*tray_it)["tray_temp"].get(); - else - curr_tray->temp = ""; - if (tray_it->contains("tray_time")) - curr_tray->time = (*tray_it)["tray_time"].get(); - else - curr_tray->time = ""; - if (tray_it->contains("bed_temp_type")) - curr_tray->bed_temp_type = (*tray_it)["bed_temp_type"].get(); - else - curr_tray->bed_temp_type = ""; - if (tray_it->contains("bed_temp")) - curr_tray->bed_temp = (*tray_it)["bed_temp"].get(); - else - curr_tray->bed_temp = ""; - if (tray_it->contains("tray_color")) { - auto color = (*tray_it)["tray_color"].get(); - curr_tray->update_color_from_str(color); - } else { - curr_tray->color = ""; - } - if (tray_it->contains("nozzle_temp_max")) { - curr_tray->nozzle_temp_max = (*tray_it)["nozzle_temp_max"].get(); - } - else - curr_tray->nozzle_temp_max = ""; - if (tray_it->contains("nozzle_temp_min")) - curr_tray->nozzle_temp_min = (*tray_it)["nozzle_temp_min"].get(); - else - curr_tray->nozzle_temp_min = ""; - if (tray_it->contains("xcam_info")) - curr_tray->xcam_info = (*tray_it)["xcam_info"].get(); - else - curr_tray->xcam_info = ""; - if (tray_it->contains("tray_uuid")) - curr_tray->uuid = (*tray_it)["tray_uuid"].get(); - else - curr_tray->uuid = "0"; - - if (tray_it->contains("ctype")) - curr_tray->ctype = (*tray_it)["ctype"].get(); - else - curr_tray->ctype = 0; - curr_tray->cols.clear(); - if (tray_it->contains("cols")) { - if ((*tray_it)["cols"].is_array()) { - for (auto it = (*tray_it)["cols"].begin(); it != (*tray_it)["cols"].end(); it++) { - curr_tray->cols.push_back(it.value().get()); - } - } - } - - if (tray_it->contains("remain")) { - curr_tray->remain = (*tray_it)["remain"].get(); - } else { - curr_tray->remain = -1; - } - int ams_id_int = 0; - int tray_id_int = 0; - try { - if (!ams_id.empty() && !curr_tray->id.empty()) { - ams_id_int = atoi(ams_id.c_str()); - tray_id_int = atoi(curr_tray->id.c_str()); - - if (type_id < 4) { - curr_tray->is_exists = (tray_exist_bits & (1 << (ams_id_int * 4 + tray_id_int))) != 0 ? true : false; - } - else { - curr_tray->is_exists = get_flag_bits(tray_exist_bits, 16 + (ams_id_int - 128)); - } - - } - } - catch (...) { - } - if (tray_it->contains("setting_id")) { - curr_tray->filament_setting_id = (*tray_it)["setting_id"].get(); - } - auto curr_time = std::chrono::system_clock::now(); - auto diff = std::chrono::duration_cast(curr_time - extrusion_cali_set_hold_start); - if (diff.count() > HOLD_TIMEOUT || diff.count() < 0 - || ams_id_int != (extrusion_cali_set_tray_id / 4) - || tray_id_int != (extrusion_cali_set_tray_id % 4)) { - if (tray_it->contains("k")) { - curr_tray->k = (*tray_it)["k"].get(); - } - if (tray_it->contains("n")) { - curr_tray->n = (*tray_it)["n"].get(); - } - } - - if (tray_it->contains("cali_idx")) { - curr_tray->cali_idx = (*tray_it)["cali_idx"].get(); - } - } - // remove not in trayList - for (auto tray_it = tray_id_set.begin(); tray_it != tray_id_set.end(); tray_it++) { - std::string tray_id = *tray_it; - auto tray = curr_ams->trayList.find(tray_id); - if (tray != curr_ams->trayList.end()) { - curr_ams->trayList.erase(tray_id); - BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id << ", tray_id=" << tray_id; - } - } - } - } - // remove not in amsList - for (auto it = ams_id_set.begin(); it != ams_id_set.end(); it++) { - std::string ams_id = *it; - auto ams = amsList.find(ams_id); - if (ams != amsList.end()) { - BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id; - amsList.erase(ams_id); - } - } - } - } + DevFilaSystemParser::ParseV1_0(jj, this, m_fila_system, key_field_only); } /* vitrual tray*/ @@ -5033,22 +3568,18 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (vslot.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { auto it = std::next(vt_slot.begin(), 0); if (it != vt_slot.end()) { - is_ams_need_update |= vt_slot[0] != vslot; vt_slot[0] = vslot; } else { - is_ams_need_update = true; vt_slot.push_back(vslot); } } else if (vslot.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { auto it = std::next(vt_slot.begin(), 1); if (it != vt_slot.end()) { - is_ams_need_update |= vt_slot[1] != vslot; vt_slot[1] = vslot; } else { - is_ams_need_update = true; vt_slot.push_back(vslot); } } @@ -5062,17 +3593,14 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ auto it = std::next(vt_slot.begin(), 0); if (it != vt_slot.end()) { - is_ams_need_update |= vt_slot[0] != main_slot; vt_slot[0] = main_slot; } else { - is_ams_need_update = true; vt_slot.push_back(main_slot); } } else { ams_support_virtual_tray = false; - is_support_extrusion_cali = false; } } catch (...) { @@ -5093,7 +3621,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ BOOST_LOG_TRIVIAL(info) << "parse_json, ack of project_prepare = " << j.dump(4); if (m_agent) { if (jj.contains("job_id")) { - this->job_id_ = JsonValParser::get_longlong_val(jj["job_id"]); + this->job_id_ = DevJsonValParser::get_longlong_val(jj["job_id"]); } } @@ -5109,16 +3637,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } } } else if (jj["command"].get() == "ams_filament_setting" && !key_field_only) { - if (jj.contains("result") && jj.contains("reason")) { - if (jj["result"].get() == "fail") { - if (jj.contains("err_code")) { - auto err_code = jj["err_code"].get(); - print_error = err_code; - } - } - } - - // BBS trigger ams UI update ams_version = -1; @@ -5139,11 +3657,11 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ // delay update vt_slot[0].set_hold_count(); } else { - auto ams_it = amsList.find(std::to_string(ams_id)); - if (ams_it != amsList.end()) { + auto ams = m_fila_system->GetAmsById(std::to_string(ams_id)); + if (ams) { tray_id = jj["tray_id"].get(); - auto tray_it = ams_it->second->trayList.find(std::to_string(tray_id)); - if (tray_it != ams_it->second->trayList.end()) { + auto tray_it = ams->GetTrays().find(std::to_string(tray_id)); + if (tray_it != ams->GetTrays().end()) { BOOST_LOG_TRIVIAL(trace) << "ams_filament_setting, parse tray info"; tray_it->second->nozzle_temp_max = std::to_string(jj["nozzle_temp_max"].get()); tray_it->second->nozzle_temp_min = std::to_string(jj["nozzle_temp_min"].get()); @@ -5219,7 +3737,9 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (jj.contains("option")) { if (jj["option"].is_number()) { int option = jj["option"].get(); - _parse_print_option_ack(option); + if (time(nullptr) - xcam_auto_recovery_hold_start > HOLD_TIME_3SEC) { + xcam_auto_recovery_step_loss = ((option >> (int)PRINT_OP_AUTO_RECOVERY) & 0x01) != 0; + } } } @@ -5260,18 +3780,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } } } else if (jj["command"].get() == "extrusion_cali_set") { - if (jj.contains("result") && jj.contains("reason")) { - if (jj["result"].get() == "fail") { - if (jj.contains("err_code")) { - auto err_code = jj["err_code"].get(); - print_error = err_code; - } - } - } -#ifdef CALI_DEBUG - std::string str = jj.dump(); - BOOST_LOG_TRIVIAL(info) << "extrusion_cali_set: " << str; -#endif int ams_id = -1; int tray_id = -1; int curr_tray_id = -1; @@ -5297,10 +3805,11 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (jj.contains("n_coef")) vt_slot[0].n = jj["n_coef"].get(); } else { - auto ams_item = this->amsList.find(std::to_string(ams_id)); - if (ams_item != this->amsList.end()) { - auto tray_item = ams_item->second->trayList.find(std::to_string(tray_id)); - if (tray_item != ams_item->second->trayList.end()) { + + auto ams_item = m_fila_system->GetAmsById(std::to_string(ams_id)); + if (ams_item) { + auto tray_item = ams_item->GetTrays().find(std::to_string(tray_id)); + if (tray_item != ams_item->GetTrays().end()) { if (jj.contains("k_value")) tray_item->second->k = jj["k_value"].get(); if (jj.contains("n_coef")) @@ -5312,19 +3821,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ extrusion_cali_set_hold_start = std::chrono::system_clock::now(); } else if (jj["command"].get() == "extrusion_cali_sel") { - if (jj.contains("result") && jj.contains("reason")) { - if (jj["result"].get() == "fail") { - if (jj.contains("err_code")) { - auto err_code = jj["err_code"].get(); - print_error = err_code; - } - } - } - -#ifdef CALI_DEBUG - std::string str = jj.dump(); - BOOST_LOG_TRIVIAL(info) << "extrusion_cali_sel: " << str; -#endif int ams_id = -1; int slot_id = -1; int tray_id = -1; @@ -5357,25 +3853,23 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (ams_id == VIRTUAL_TRAY_MAIN_ID && vt_slot.size() > 0) { - vt_slot[MAIN_NOZZLE_ID].cali_idx = jj["cali_idx"].get(); - vt_slot[MAIN_NOZZLE_ID].set_hold_count(); + vt_slot[MAIN_EXTRUDER_ID].cali_idx = jj["cali_idx"].get(); + vt_slot[MAIN_EXTRUDER_ID].set_hold_count(); } else if (ams_id == VIRTUAL_TRAY_DEPUTY_ID && vt_slot.size() > 1) { - vt_slot[DEPUTY_NOZZLE_ID].cali_idx = jj["cali_idx"].get(); - vt_slot[DEPUTY_NOZZLE_ID].set_hold_count(); + vt_slot[DEPUTY_EXTRUDER_ID].cali_idx = jj["cali_idx"].get(); + vt_slot[DEPUTY_EXTRUDER_ID].set_hold_count(); } } else { - auto ams_item = this->amsList.find(std::to_string(ams_id)); - if (ams_item != this->amsList.end()) { - auto tray_item = ams_item->second->trayList.find(std::to_string(slot_id)); - if (tray_item != ams_item->second->trayList.end()) { - tray_item->second->cali_idx = jj["cali_idx"].get(); - tray_item->second->set_hold_count(); - } + auto tray_item = m_fila_system->GetAmsTray(std::to_string(ams_id), std::to_string(slot_id)); + if (tray_item) + { + tray_item->cali_idx = jj["cali_idx"].get(); + tray_item->set_hold_count(); } } } @@ -5390,10 +3884,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ bool is_succeed = true; if (jj.contains("result") && jj.contains("reason")) { if (jj["result"].get() == "fail") { - if (jj.contains("err_code")) { - auto err_code = jj["err_code"].get(); - print_error = err_code; - } is_succeed = false; } is_succeed = false; @@ -5453,8 +3943,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } } // notify cali history to update - } else { - BOOST_LOG_TRIVIAL(info) << "printer extrusion_cali_get: " << str; } } else if (jj["command"].get() == "extrusion_cali_get_result") { @@ -5465,8 +3953,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (jj.contains("result") && jj.contains("reason")) { if (jj["result"].get() == "fail") { if (jj.contains("err_code")) { - auto err_code = jj["err_code"].get(); - print_error = err_code; is_succeed = false; } } @@ -5479,7 +3965,6 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ try { for (auto it = jj["filaments"].begin(); it != jj["filaments"].end(); it++) { PACalibResult pa_calib_result; - pa_calib_result.tray_id = (*it)["tray_id"].get(); pa_calib_result.filament_id = (*it)["filament_id"].get(); if ((*it).contains("setting_id")) { @@ -5532,6 +4017,11 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ pa_calib_result.confidence = 0; } + if (this->is_support_new_auto_cali_method) + pa_calib_result.tray_id = get_tray_id_by_ams_id_and_slot_id(pa_calib_result.ams_id, pa_calib_result.slot_id); + else + pa_calib_result.tray_id = (*it)["tray_id"].get(); + if (check_pa_result_validation(pa_calib_result)) pa_calib_results.push_back(pa_calib_result); else { @@ -5574,7 +4064,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ } catch (...) {} } } - command_handle_response(jj); + m_fan->command_handle_response(jj); } } @@ -5619,7 +4109,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (j.contains("upgrade")) { if (j["upgrade"].contains("command")) { if (j["upgrade"]["command"].get() == "upgrade_confirm") { - this->upgrade_display_state = UpgradingInProgress; + this->upgrade_display_state = DevFirmwareUpgradingState::UpgradingInProgress; upgrade_display_hold_count = HOLD_COUNT_MAX; BOOST_LOG_TRIVIAL(info) << "ack of upgrade_confirm"; } @@ -5652,21 +4142,11 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_ if (!key_field_only) { BOOST_LOG_TRIVIAL(trace) << "parse_json m_active_state =" << m_active_state; - //if (m_active_state == Active && !is_camera_busy_off()) { - // if (is_support_tunnel_mqtt && connection_type() != "lan") { - // m_active_state = UpdateToDate; - // m_agent->start_subscribe("tunnel"); - // } - //} else if (m_active_state == UpdateToDate && is_camera_busy_off()) { - // m_active_state = Active; - // m_agent->stop_subscribe("tunnel"); - //} - parse_state_changed_event(); } } catch (...) { - BOOST_LOG_TRIVIAL(trace) << "parse_json failed! dev_id=" << this->dev_id <<", payload = " << payload; + BOOST_LOG_TRIVIAL(trace) << "parse_json failed! dev_id=" << this->get_dev_id() <<", payload = " << payload; } std::chrono::system_clock::time_point clock_stop = std::chrono::system_clock::now(); @@ -5705,7 +4185,7 @@ int MachineObject::publish_gcode(std::string gcode_str) j["print"]["param"] = gcode_str; j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); - return publish_json(j.dump()); + return publish_json(j); } BBLSubTask* MachineObject::get_subtask() @@ -5770,7 +4250,7 @@ void MachineObject::update_model_task() res = m_agent->get_model_mall_rating_result(curr_instance_id, rating_result, http_code, http_error); request_model_result++; BOOST_LOG_TRIVIAL(info) << "request times: " << request_model_result << " http code: " << http_code; - auto rating_info = new RatingInfo(); + auto rating_info = new DevPrintTaskRatingInfo(); rating_info->http_code = http_code; if (0 == res && 200 == http_code) { try { @@ -5955,7 +4435,7 @@ void MachineObject::get_firmware_info() unsigned int http_code; std::string http_body; if (!m_agent) return; - result = m_agent->get_printer_firmware(dev_id, &http_code, &http_body); + result = m_agent->get_printer_firmware(get_dev_id(), &http_code, &http_body); if (result < 0) { // get upgrade list failed return; @@ -5965,7 +4445,7 @@ void MachineObject::get_firmware_info() if (j.contains("devices") && !j["devices"].is_null()) { firmware_list.clear(); for (json::iterator it = j["devices"].begin(); it != j["devices"].end(); it++) { - if ((*it)["dev_id"].get() == this->dev_id) { + if ((*it)["dev_id"].get() == this->get_dev_id()) { try { json firmware = (*it)["firmware"]; for (json::iterator firmware_it = firmware.begin(); firmware_it != firmware.end(); firmware_it++) { @@ -6033,86 +4513,10 @@ bool MachineObject::is_firmware_info_valid() return m_firmware_valid; } -std::string MachineObject::get_string_from_fantype(int type) + +DevAmsTray MachineObject::parse_vt_tray(json vtray) { - switch (type) { - case 1: - return "cooling_fan"; - case 2: - return "big_cooling_fan"; - case 3: - return "chamber_fan"; - default: - return ""; - } - return ""; -} - -NozzleFlowType MachineObject::get_nozzle_flow_type(int extruder_id) const -{ - if (is_nozzle_flow_type_supported() && m_extder_data.extders.size() > extruder_id) - { - return m_extder_data.extders[extruder_id].current_nozzle_flow_type; - } - - return NozzleFlowType::NONE_FLOWTYPE; -} - -const Extder& MachineObject::get_current_extruder() const -{ - if (m_extder_data.extders.size() <= m_extder_data.current_extder_id) - { - BOOST_LOG_TRIVIAL(error) << "get_current_extruder() failed"; - return Extder(); - } - - return m_extder_data.extders[m_extder_data.current_extder_id]; -} - -void MachineObject::converse_to_duct(bool is_suppt_part_fun, bool is_suppt_aux_fun, bool is_suppt_cham_fun) -{ - m_air_duct_data.modes.clear(); - m_air_duct_data.parts.clear(); - m_air_duct_data.curren_mode = -1; //def mode - - - if (is_suppt_part_fun) { - AirParts part_fan; - part_fan.type = int(AirDuctType::AIR_FAN_TYPE); - part_fan.id = int(AIR_FUN::FAN_COOLING_0_AIRDOOR); - part_fan.func = int(AIR_FUN::FAN_COOLING_0_AIRDOOR); - part_fan.state = 0; - part_fan.range_start = 0; - part_fan.range_end = 100; - m_air_duct_data.parts.push_back(part_fan); - } - - if (is_suppt_aux_fun) { - AirParts aux_fan; - aux_fan.type = int(AirDuctType::AIR_FAN_TYPE); - aux_fan.id = int(AIR_FUN::FAN_REMOTE_COOLING_0_IDX); - aux_fan.func = int(AIR_FUN::FAN_REMOTE_COOLING_0_IDX); - aux_fan.state = 0; - aux_fan.range_start = 0; - aux_fan.range_end = 100; - m_air_duct_data.parts.push_back(aux_fan); - } - - if (is_suppt_aux_fun) { - AirParts chamber_fan; - chamber_fan.type = int(AirDuctType::AIR_FAN_TYPE); - chamber_fan.id = int(AIR_FUN::FAN_CHAMBER_0_IDX); - chamber_fan.func = int(AIR_FUN::FAN_CHAMBER_0_IDX); - chamber_fan.state = 0; - chamber_fan.range_start = 0; - chamber_fan.range_end = 100; - m_air_duct_data.parts.push_back(chamber_fan); - } -} - -AmsTray MachineObject::parse_vt_tray(json vtray) -{ - auto vt_tray = AmsTray(std::to_string(VIRTUAL_TRAY_MAIN_ID)); + auto vt_tray = DevAmsTray(std::to_string(VIRTUAL_TRAY_MAIN_ID)); if (vtray.contains("id")) vt_tray.id = vtray["id"].get(); @@ -6183,7 +4587,7 @@ AmsTray MachineObject::parse_vt_tray(json vtray) vt_tray.bed_temp = ""; if (vtray.contains("tray_color")) { auto color = vtray["tray_color"].get(); - vt_tray.update_color_from_str(color); + vt_tray.UpdateColorFromStr(color); } else { vt_tray.color = ""; @@ -6240,11 +4644,8 @@ AmsTray MachineObject::parse_vt_tray(json vtray) bool MachineObject::contains_tray(const std::string &ams_id, const std::string &tray_id) const { if (ams_id != VIRTUAL_AMS_MAIN_ID_STR && ams_id != VIRTUAL_AMS_DEPUTY_ID_STR) { - auto ams_iter = amsList.find(ams_id); - if (ams_iter != amsList.end()) { - auto tray_iter = ams_iter->second->trayList.find(tray_id); - if (tray_iter != ams_iter->second->trayList.end()) { return true;} - } + + return m_fila_system->GetAmsTray(ams_id, tray_id) != nullptr; } else { for (const auto& tray : vt_slot) { if (tray.id == ams_id) { return true; } @@ -6254,14 +4655,16 @@ bool MachineObject::contains_tray(const std::string &ams_id, const std::string & return false; } -AmsTray MachineObject::get_tray(const std::string &ams_id, const std::string &tray_id) const +DevAmsTray MachineObject::get_tray(const std::string &ams_id, const std::string &tray_id) const { + if (ams_id.empty() && tray_id.empty()) + { + return DevAmsTray(tray_id); + } + if (ams_id != VIRTUAL_AMS_MAIN_ID_STR && ams_id != VIRTUAL_AMS_DEPUTY_ID_STR) { - auto ams_iter = amsList.find(ams_id); - if (ams_iter != amsList.end()) { - auto tray_iter = ams_iter->second->trayList.find(tray_id); - if (tray_iter != ams_iter->second->trayList.end()) { return *tray_iter->second; } - } + auto tray = m_fila_system->GetAmsTray(ams_id, tray_id); + if (tray) { return *tray;}; } else { for (const auto &tray : vt_slot) { @@ -6270,7 +4673,7 @@ AmsTray MachineObject::get_tray(const std::string &ams_id, const std::string &tr } assert(0);/*use contains_tray() check first*/ - return AmsTray(tray_id); + return DevAmsTray(tray_id); } bool MachineObject::check_enable_np(const json& print) const @@ -6301,14 +4704,12 @@ void MachineObject::parse_new_info(json print) if(!cfg.empty()){ if (camera_resolution_hold_count > 0) camera_resolution_hold_count--; if (camera_timelapse_hold_count > 0) camera_timelapse_hold_count--; - //if (xcam_buildplate_marker_hold_count > 0) xcam_buildplate_marker_hold_count--;first_layer_inspector - if (nozzle_setting_hold_count > 0)nozzle_setting_hold_count--; if (time(nullptr) - ams_user_setting_start > HOLD_COUNT_MAX) { - ams_insert_flag = get_flag_bits(cfg, 0); - ams_power_on_flag = get_flag_bits(cfg, 1); + m_fila_system->GetAmsSystemSetting().SetDetectOnInsertEnabled(get_flag_bits(cfg, 0)); + m_fila_system->GetAmsSystemSetting().SetDetectOnPowerupEnabled(get_flag_bits(cfg, 1)); } upgrade_force_upgrade = get_flag_bits(cfg, 2); @@ -6337,8 +4738,7 @@ void MachineObject::parse_new_info(json print) } tutk_state = get_flag_bits(cfg, 6) == 1 ? "disable" : ""; - chamber_light = get_flag_bits(cfg, 7) == 1 ? LIGHT_EFFECT::LIGHT_EFFECT_ON : LIGHT_EFFECT::LIGHT_EFFECT_OFF; - printing_speed_lvl = (PrintingSpeedLevel)get_flag_bits(cfg, 8, 3); + m_lamp->SetChamberLight(get_flag_bits(cfg, 7) == 1 ? DevLamp::LIGHT_EFFECT_ON : DevLamp::LIGHT_EFFECT_OFF); //is_support_build_plate_marker_detect = get_flag_bits(cfg, 12); todo yangcong if (time(nullptr) - xcam_first_layer_hold_start > HOLD_TIME_3SEC) { @@ -6364,11 +4764,11 @@ void MachineObject::parse_new_info(json print) } if (time(nullptr) - ams_user_setting_start > HOLD_COUNT_MAX){ - ams_calibrate_remain_flag = get_flag_bits(cfg, 17); + m_fila_system->GetAmsSystemSetting().SetDetectRemainEnabled(get_flag_bits(cfg, 17)); } if (time(nullptr) - ams_switch_filament_start > HOLD_TIME_3SEC){ - ams_auto_switch_filament_flag = get_flag_bits(cfg, 18); + m_fila_system->GetAmsSystemSetting().SetAutoRefillEnabled(get_flag_bits(cfg, 18)); } if (time(nullptr) - xcam__save_remote_print_file_to_storage_start_time > HOLD_TIME_3SEC){ @@ -6420,13 +4820,12 @@ void MachineObject::parse_new_info(json print) is_support_brtc = get_flag_bits(fun, 31); m_support_mqtt_axis_control = get_flag_bits(fun, 38); m_support_mqtt_bet_ctrl = get_flag_bits(fun, 39); - + is_support_new_auto_cali_method = get_flag_bits(fun, 40); is_support_spaghetti_detection = get_flag_bits(fun, 42); is_support_purgechutepileup_detection = get_flag_bits(fun, 43); is_support_nozzleclumping_detection = get_flag_bits(fun, 44); is_support_airprinting_detection = get_flag_bits(fun, 45); - - m_air_duct_data.m_support_cooling_filter = get_flag_bits(fun, 46); + m_fan->SetSupportCoolingFilter(get_flag_bits(fun, 46)); is_support_ext_change_assist = get_flag_bits(fun, 48); } @@ -6436,7 +4835,8 @@ void MachineObject::parse_new_info(json print) BOOST_LOG_TRIVIAL(info) << "new print data aux = " << aux; if (!aux.empty()) { - sdcard_state = MachineObject::SdcardState(get_flag_bits(aux, 12, 2)); + m_storage->set_sdcard_state(get_flag_bits(aux, 12, 2)); + //sdcard_state = MachineObject::SdcardState(get_flag_bits(aux, 12, 2)); } /*stat*/ @@ -6446,260 +4846,38 @@ void MachineObject::parse_new_info(json print) if (!stat.empty()) { camera_recording = get_flag_bits(stat, 7); - m_lamp_close_recheck = (get_flag_bits(stat, 36) == 1); + m_lamp->SetLampCloseRecheck((get_flag_bits(stat, 36) == 1)); } /*device*/ if (print.contains("device")) { json const& device = print["device"]; + //new fan data - if (device.contains("airduct")) { - m_air_duct_data.curren_mode = -1; - m_air_duct_data.modes.clear(); - m_air_duct_data.parts.clear(); - - const json& airduct = device["airduct"]; - if (airduct.contains("modeCur")) { m_air_duct_data.curren_mode = airduct["modeCur"].get();} - if (airduct.contains("subMode")) { m_air_duct_data.m_sub_mode = airduct["subMode"].get(); } - if (airduct.contains("modeList") && airduct["modeList"].is_array()) { - auto list = airduct["modeList"].get>(); - - for (int i = 0; i < list.size(); ++i) { - // only show 2 mode for o - if (is_series_o() && i >= 2) { break; } - - json mode_json = list[i]; - AirMode mode; - if (mode_json.contains("modeId")) - mode.id = mode_json["modeId"].get(); - if (mode_json.contains("ctrl")) { - for (auto it_mode_ctrl = mode_json["ctrl"].begin(); it_mode_ctrl != mode_json["ctrl"].end(); it_mode_ctrl++) { - mode.ctrl.push_back((*it_mode_ctrl).get() >> 4); - } - } - - if (mode_json.contains("off")) { - for (auto it_mode_off = mode_json["off"].begin(); it_mode_off != mode_json["off"].end(); *it_mode_off++) { - mode.off.push_back((*it_mode_off).get() >> 4); - } - } - - if (AIR_DUCT(mode.id) == AIR_DUCT::AIR_DUCT_EXHAUST) { continue; } /*STUDIO-12796*/ - m_air_duct_data.modes[mode.id] = mode; - } - } - - if (airduct.contains("parts") && airduct["parts"].is_array()) { - for (auto it_part = airduct["parts"].begin(); it_part != airduct["parts"].end(); it_part++) { - int state = (*it_part)["state"].get(); - int range = (*it_part)["range"].get(); - - AirParts part; - part.type = get_flag_bits((*it_part)["id"].get(), 0, 4); - part.id = get_flag_bits((*it_part)["id"].get(), 4, 9); - part.func = (*it_part)["func"].get(); - part.state = get_flag_bits(state, 0, 8); - part.range_start = get_flag_bits(range, 0, 16); - part.range_end = get_flag_bits(range, 16, 16); - - m_air_duct_data.parts.push_back(part); - } - } - } + m_fan->ParseV3_0(device); if (device.contains("type")) { m_device_mode = (DeviceMode)device["type"].get();// FDM:1<<0 Laser:1<< Cut:1<<2 } - if (device.contains("bed_temp")) { - bed_temp = get_flag_bits(device["bed_temp"].get(), 0, 16); - bed_temp_target = get_flag_bits(device["bed_temp"].get(), 16, 16); - } + DevBed::ParseV2_0(device,m_bed); - if (device.contains("nozzle")) { - json const &nozzle = device["nozzle"]; - - m_nozzle_data = NozzleData(); - - m_nozzle_data.extder_exist = get_flag_bits(nozzle["exist"].get(), 0, 16); - m_nozzle_data.cut_exist = get_flag_bits(nozzle["exist"].get(), 16, 16); - m_nozzle_data.state = get_flag_bits(nozzle["state"].get(), 0, 4); - - for (auto it = nozzle["info"].begin(); it != nozzle["info"].end(); it++) { - Nozzle nozzle_obj; - auto njon = it.value(); - std::string type = njon["type"].get(); - nozzle_obj.id = njon["id"].get(); - - if (type.length() >= 4) { - if (type.substr(0, 1) == std::string("H")) { - nozzle_obj.tool_type = NozzleToolType::H_TOOL; - } - else if (type.substr(0, 1) == std::string("C")) { - nozzle_obj.tool_type = NozzleToolType::C_TOOL; - } - - if (type.substr(1, 1) == std::string("S")) { - nozzle_obj.nozzle_flow = NozzleFlowType::S_FLOW; - } else if (type.substr(1, 1) == std::string("H")) { - nozzle_obj.nozzle_flow = NozzleFlowType::H_FLOW; - } else if (type.substr(1, 1) == std::string("A")) { - nozzle_obj.nozzle_flow = NozzleFlowType::S_FLOW; - } else if (type.substr(1, 1) == std::string("X")) { - nozzle_obj.nozzle_flow = NozzleFlowType::S_FLOW; - } - - if (type.substr(2, 2) == std::string("00")) { - nozzle_obj.nozzle_type = NozzleType::ntStainlessSteel; - } else if (type.substr(2, 2) == std::string("01")) { - nozzle_obj.nozzle_type = NozzleType::ntHardenedSteel; - } else if (type.substr(2, 2) == std::string("05")) { - nozzle_obj.nozzle_type = NozzleType::ntTungstenCarbide; - } - } else { - nozzle_obj.tool_type = NozzleToolType::NONE_TOOLTYPE; - nozzle_obj.nozzle_flow = NozzleFlowType::NONE_FLOWTYPE; - nozzle_obj.nozzle_type = NozzleType::ntUndefine; - } - - nozzle_obj.diameter = njon["diameter"].get(); - nozzle_obj.max_temp = njon["tm"].get(); - nozzle_obj.wear = njon["wear"].get(); - if (nozzle_obj.diameter == 0.0f) {nozzle_obj.diameter = 0.4f;} - m_nozzle_data.nozzles.push_back(nozzle_obj); - } - } - - if (device.contains("extruder")) { - json const& extruder = device["extruder"]; - - auto extder_data = ExtderData(); - extder_data.total_extder_count = get_flag_bits(extruder["state"].get(), 0, 4); - - - extder_data.current_extder_id = get_flag_bits(extruder["state"].get(), 4, 4); - extder_data.target_extder_id = get_flag_bits(extruder["state"].get(), 8, 4); - extder_data.switch_extder_state = (ExtruderSwitchState) get_flag_bits(extruder["state"].get(), 12, 3); - - if (m_extder_data.current_extder_id != extder_data.current_extder_id) - { - flag_update_nozzle = true; - targ_nozzle_id_from_pc = INVALID_NOZZLE_ID; - } - else if (extder_data.switch_extder_state == ES_SWITCHING_FAILED) - { - flag_update_nozzle = true; - targ_nozzle_id_from_pc = INVALID_NOZZLE_ID; - } - - extder_data.current_loading_extder_id = get_flag_bits(extruder["state"].get(), 15, 4); - extder_data.current_busy_for_loading = get_flag_bits(extruder["state"].get(), 19); - - for (auto it = extruder["info"].begin(); it != extruder["info"].end(); it++) { - - Extder extder_obj; - auto njon = it.value(); - - extder_obj.id = njon["id"].get(); - - extder_obj.filam_bak.clear(); - is_support_show_filament_backup = njon.contains("filam_bak"); - if (is_support_show_filament_backup) - { - const json& filam_bak_items = njon["filam_bak"]; - for (const auto& filam_bak_item : filam_bak_items) - { - const auto& filam_bak_val = filam_bak_item.get(); - extder_obj.filam_bak.emplace_back(filam_bak_val); - } - } - - extder_obj.ext_has_filament = get_flag_bits(njon["info"].get(), 1); - extder_obj.buffer_has_filament = get_flag_bits(njon["info"].get(), 2); - extder_obj.nozzle_exist = get_flag_bits(njon["info"].get(), 3); - extder_obj.temp = get_flag_bits(njon["temp"].get(), 0, 16); - extder_obj.target_temp = get_flag_bits(njon["temp"].get(), 16, 16); - - AmsSlot spre; - spre.slot_id = std::to_string(get_flag_bits(njon["spre"].get(), 0, 8)); - spre.ams_id = std::to_string(get_flag_bits(njon["spre"].get(), 8, 8)); - - AmsSlot snow; - snow.slot_id = std::to_string(get_flag_bits(njon["snow"].get(), 0, 8)); - snow.ams_id = std::to_string(get_flag_bits(njon["snow"].get(), 8, 8)); - - AmsSlot star; - star.slot_id = std::to_string(get_flag_bits(njon["star"].get(), 0, 8)); - star.ams_id = std::to_string(get_flag_bits(njon["star"].get(), 8, 8)); - - extder_obj.nozzle_id = njon["hnow"].get(); - extder_obj.target_nozzle_id = njon["htar"].get(); - - extder_obj.spre = spre; - extder_obj.snow = snow; - extder_obj.star = star; - extder_obj.ams_stat = get_flag_bits(njon["stat"].get(), 0, 16); - extder_obj.rfid_stat = get_flag_bits(njon["stat"].get(), 16, 16); - - //current nozzle info - if (extder_obj.nozzle_id == 0xff) { - extder_obj.current_nozzle_type = NozzleType::ntUndefine; - extder_obj.current_nozzle_diameter = 0.4f; - extder_obj.current_nozzle_flow_type = NozzleFlowType::NONE_FLOWTYPE; - } else { - for (auto i = 0; i < m_nozzle_data.nozzles.size(); i++) { - if (m_nozzle_data.nozzles[i].id == extder_obj.nozzle_id) { - extder_obj.current_nozzle_type = m_nozzle_data.nozzles[i].nozzle_type; - extder_obj.current_nozzle_diameter = m_nozzle_data.nozzles[i].diameter; - extder_obj.current_nozzle_flow_type = m_nozzle_data.nozzles[i].nozzle_flow; - } - } - } - extder_data.extders.push_back(extder_obj); - } - - if (extder_data.extders.size() <= 0) { - // def data - extder_data.current_extder_id = 0; - extder_data.target_extder_id = 0; - extder_data.total_extder_count = 1; - Extder nozzle; - extder_data.extders.push_back(nozzle); - } - - m_extder_data = extder_data; - } + if (device.contains("nozzle")) { DevNozzleSystemParser::ParseV2_0(device["nozzle"], m_nozzle_system); } + if (device.contains("extruder")) { ExtderSystemParser::ParseV2_0(device["extruder"], m_extder_system);} if (device.contains("ctc")) { json const& ctc = device["ctc"]; int state = get_flag_bits(ctc["state"].get(), 0, 4); - if (ctc.contains("info")) { json const &info = ctc["info"]; chamber_temp = get_flag_bits(info["temp"].get(), 0, 16); chamber_temp_target = get_flag_bits(info["temp"].get(), 16, 16); } - - } } } -bool MachineObject::is_nozzle_data_invalid() -{ - for (const auto &ext : m_extder_data.extders) - { - if (ext.current_nozzle_type == NozzleType::ntUndefine || - ext.current_nozzle_diameter <= 0.0f || - ext.current_nozzle_flow_type == NozzleFlowType::NONE_FLOWTYPE) { - return true; - } - } - - return false; -} - int MachineObject::get_flag_bits(std::string str, int start, int count) const { try { @@ -6803,10 +4981,10 @@ void MachineObject::update_printer_preset_name() BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << "start update preset_name"; PresetBundle * preset_bundle = Slic3r::GUI::wxGetApp().preset_bundle; if (!preset_bundle) return; - auto printer_model = MachineObject::get_preset_printer_model_name(this->printer_type); + auto printer_model = DevPrinterConfigUtil::get_printer_display_name(this->printer_type); std::set diameter_set; - for (auto &nozzle : m_extder_data.extders) { - float diameter = nozzle.current_nozzle_diameter; + for (auto &nozzle : m_extder_system->m_extders) { + float diameter = nozzle.GetNozzleDiameter(); std::ostringstream stream; stream << std::fixed << std::setprecision(1) << diameter; std::string nozzle_diameter_str = stream.str(); @@ -6838,16 +5016,16 @@ void MachineObject::update_printer_preset_name() void MachineObject::check_ams_filament_valid() { PresetBundle * preset_bundle = Slic3r::GUI::wxGetApp().preset_bundle; - auto printer_model = MachineObject::get_preset_printer_model_name(this->printer_type); + auto printer_model = DevPrinterConfigUtil::get_printer_display_name(this->printer_type); std::map> need_checked_filament_id; - for (auto &ams_pair : amsList) { + for (auto &ams_pair : m_fila_system->GetAmsList()) { auto ams_id = ams_pair.first; auto &ams = ams_pair.second; std::ostringstream stream; - if (ams->nozzle < 0 || ams->nozzle >= m_extder_data.extders.size()) { + if (ams->GetExtruderId() < 0 || ams->GetExtruderId() >= m_extder_system->GetTotalExtderCount()) { return; } - stream << std::fixed << std::setprecision(1) << m_extder_data.extders[ams->nozzle].current_nozzle_diameter; + stream << std::fixed << std::setprecision(1) << m_extder_system->GetNozzleDiameter(ams->GetExtruderId()); std::string nozzle_diameter_str = stream.str(); assert(nozzle_diameter_str.size() == 3); if (m_nozzle_filament_data.find(nozzle_diameter_str) == m_nozzle_filament_data.end()) { @@ -6857,7 +5035,7 @@ void MachineObject::check_ams_filament_valid() auto &data = m_nozzle_filament_data[nozzle_diameter_str]; auto &filament_list = data.filament_list; auto &checked_filament = data.checked_filament; - for (const auto &[slot_id, curr_tray] : ams->trayList) { + for (const auto &[slot_id, curr_tray] : ams->GetTrays()) { if (curr_tray->setting_id.size() == 8 && curr_tray->setting_id[0] == 'P' && filament_list.find(curr_tray->setting_id) == filament_list.end()) { if (checked_filament.find(curr_tray->setting_id) != checked_filament.end()) { @@ -6905,11 +5083,11 @@ void MachineObject::check_ams_filament_valid() for (auto vt_tray : vt_slot) { int vt_id = std::stoi(vt_tray.id); int index = 255 - vt_id; - if (index >= m_extder_data.total_extder_count) { - BOOST_LOG_TRIVIAL(error) << " vt_tray id map for nozzle id is not exist, index is: " << index << " nozzle count" << m_extder_data.total_extder_count; + if (index >= m_extder_system->GetTotalExtderCount()) { + BOOST_LOG_TRIVIAL(error) << " vt_tray id map for nozzle id is not exist, index is: " << index << " nozzle count" << m_extder_system->GetTotalExtderCount(); continue; } - auto diameter = m_extder_data.extders[index].current_nozzle_diameter; + auto diameter = m_extder_system->GetNozzleDiameter(index); std::ostringstream stream; stream << std::fixed << std::setprecision(1) << diameter; std::string nozzle_diameter_str = stream.str(); @@ -6941,9 +5119,9 @@ void MachineObject::check_ams_filament_valid() std::string preset_setting_id; PresetBundle * preset_bundle = Slic3r::GUI::wxGetApp().preset_bundle; std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter; + stream << std::fixed << std::setprecision(1) << m_extder_system->GetNozzleDiameter(MAIN_EXTRUDER_ID); std::string nozzle_diameter_str = stream.str(); - bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray(MachineObject::get_preset_printer_model_name( + bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray(DevPrinterConfigUtil::get_printer_display_name( this->printer_type), nozzle_diameter_str, vt_tray.setting_id, vt_tray.tag_uid, vt_tray.nozzle_temp_min, @@ -6971,23 +5149,6 @@ void MachineObject::check_ams_filament_valid() } } -int MachineObject::command_handle_response(const json &response) -{ - if (!response.contains("sequence_id")) { - BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ", error reponse."; - return -1; - } - - std::string reply = response["sequence_id"].get(); - auto it = m_callback_list.find(reply); - if (it != m_callback_list.end()) { - if (it->second) - it->second(response); - m_callback_list.erase(it); - } - - return 0; -} void MachineObject::command_set_door_open_check(DoorOpenCheckState state) { @@ -7002,7 +5163,7 @@ void MachineObject::command_set_door_open_check(DoorOpenCheckState state) default: assert(0); return; } - if (publish_json(j.dump()) == 0) + if (publish_json(j) == 0) { xcam_door_open_check = state; xcam_door_open_check_start_time = time(nullptr); @@ -7019,7 +5180,7 @@ void MachineObject::command_set_save_remote_print_file_to_storage(bool save) j["system"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["system"]["config"] = save ? true : false; - if (publish_json(j.dump()) == 0) + if (publish_json(j) == 0) { xcam__save_remote_print_file_to_storage = save; xcam__save_remote_print_file_to_storage_start_time = time(nullptr); @@ -7032,7 +5193,7 @@ wxString MachineObject::get_nozzle_replace_url() const const wxString& strLanguage = GUI::wxGetApp().app_config->get("language"); const wxString& lan_code = strLanguage.BeforeFirst('_'); - const json& link_map = DeviceManager::get_json_from_config(printer_type, "print", "nozzle_replace_wiki"); + const json& link_map = DevPrinterConfigUtil::get_json_from_config(printer_type, "print", "nozzle_replace_wiki"); if (link_map.contains(lan_code.ToStdString())) { return link_map[lan_code.ToStdString()].get(); } @@ -7075,1198 +5236,44 @@ void MachineObject::add_command_error_code_dlg(int command_err) }; } -bool DeviceManager::EnableMultiMachine = false; -bool DeviceManager::key_field_only = false; - -std::vector nozzle_diameter_list{ 0.2f,0.4f,0.6f,0.8f }; -std::vector nozzle_type_list {"hardened_steel", "stainless_steel", "tungsten_carbide"}; - -DeviceManager::DeviceManager(NetworkAgent* agent) +bool MachineObject::is_multi_extruders() const { - m_agent = agent; - m_refresher = new DeviceManagerRefresher(this); - - // Load saved local machines - if (agent) { - AppConfig* config = GUI::wxGetApp().app_config; - const auto local_machines = config->get_local_machines(); - for (auto& it : local_machines) { - const auto& m = it.second; - MachineObject* obj = new MachineObject(m_agent, m.dev_name, m.dev_id, m.dev_ip); - obj->printer_type = m.printer_type; - obj->dev_connection_type = "lan"; - obj->bind_state = "free"; - obj->bind_sec_link = "secure"; - obj->m_is_online = true; - obj->last_alive = Slic3r::Utils::get_current_time_utc(); - obj->set_access_code(config->get("access_code", m.dev_id), false); - obj->set_user_access_code(config->get("user_access_code", m.dev_id), false); - if (obj->has_access_right()) { - localMachineList.insert(std::make_pair(m.dev_id, obj)); - } else { - config->erase_local_machine(m.dev_id); - delete obj; - } - } - } + return m_extder_system->GetTotalExtderCount() > 1; } -void DeviceManager::update_local_machine(const MachineObject& m) +int MachineObject::get_extruder_id_by_ams_id(const std::string& ams_id) { - AppConfig* config = GUI::wxGetApp().app_config; - if (config) { - if (m.is_lan_mode_printer()) { - if (m.has_access_right()) { - BBLocalMachine local_machine; - local_machine.dev_id = m.dev_id; - local_machine.dev_name = m.dev_name; - local_machine.dev_ip = m.dev_ip; - local_machine.printer_type = m.printer_type; - config->update_local_machine(local_machine); - } - } else { - config->erase_local_machine(m.dev_id); - } - } + return m_fila_system->GetExtruderIdByAmsId(ams_id); } -DeviceManager::~DeviceManager() +Slic3r::DevPrintingSpeedLevel MachineObject::GetPrintingSpeedLevel() const { - delete m_refresher; - - for (auto it = localMachineList.begin(); it != localMachineList.end(); it++) { - if (it->second) { - delete it->second; - it->second = nullptr; - } - } - localMachineList.clear(); - - for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { - if (it->second) { - delete it->second; - it->second = nullptr; - } - } - userMachineList.clear(); + return m_print_options->GetPrintingSpeedLevel(); } - -float DeviceManager::nozzle_diameter_conver(int diame) +bool MachineObject::is_ams_unload() { - if (diame < nozzle_diameter_list.size() && diame >= 0) { - return nozzle_diameter_list[diame]; - } - return 0.4f; + return m_extder_system->GetTargetAmsId().compare("255") == 0; } -int DeviceManager::nozzle_diameter_conver(float diame) +Slic3r::DevAms* MachineObject::get_curr_Ams() { - int index = -1; - for (int i = 0; i < nozzle_diameter_list.size(); i++) { - if (nozzle_diameter_list[i] == diame) { - index = i; - } - } - return index; + return m_fila_system->GetAmsById(m_extder_system->GetCurrentAmsId()); } -std::string DeviceManager::nozzle_type_conver(int type) +Slic3r::DevAmsTray* MachineObject::get_ams_tray(std::string ams_id, std::string tray_id) { - if (type < nozzle_type_list.size() && type >= 0) { - return nozzle_type_list[type]; - } - return ""; + return m_fila_system->GetAmsTray(ams_id, tray_id); } -int DeviceManager::nozzle_type_conver(std::string& type) +bool MachineObject::HasAms() const { - int index = -1; - for (int i = 0; i < nozzle_type_list.size(); i++) { - if (nozzle_type_list[i] == type) { - index = i; - } - } - return index; + return m_fila_system->HasAms(); } -void DeviceManager::set_agent(NetworkAgent* agent) +bool MachineObject::IsDetectOnInsertEnabled() const { - m_agent = agent; -} - -void DeviceManager::start_refresher() { m_refresher->Start(); } -void DeviceManager::stop_refresher() { m_refresher->Stop(); } -void DeviceManager::keep_alive() -{ - MachineObject* obj = this->get_selected_machine(); - if (obj) { - if (obj->keep_alive_count == 0) { - obj->last_keep_alive = std::chrono::system_clock::now(); - } - obj->keep_alive_count++; - std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); - auto internal = std::chrono::duration_cast(start - obj->last_keep_alive); - if (internal.count() > TIMEOUT_FOR_KEEPALIVE && (internal.count() < 1000 * 60 * 60 * 300) ) { - BOOST_LOG_TRIVIAL(info) << "keep alive = " << internal.count() << ", count = " << obj->keep_alive_count; - obj->command_request_push_all(); - obj->last_keep_alive = start; - } - else if(obj->m_push_count == 0){ - BOOST_LOG_TRIVIAL(info) << "keep alive = " << internal.count() << ", push_count = 0, count = " << obj->keep_alive_count; - obj->command_request_push_all(); - obj->last_keep_alive = start; - } - } -} - -void DeviceManager::check_pushing() -{ - keep_alive(); - MachineObject* obj = this->get_selected_machine(); - - std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); - auto internal = std::chrono::duration_cast(start - obj->last_update_time); - - if (obj && !obj->is_support_mqtt_alive) { - if (internal.count() > TIMEOUT_FOR_STRAT && internal.count() < 1000 * 60 * 60 * 300) { - BOOST_LOG_TRIVIAL(info) << "command_pushing: diff = " << internal.count(); - obj->command_pushing("start"); - } - } -} - -void DeviceManager::on_machine_alive(std::string json_str) -{ - try { - //BOOST_LOG_TRIVIAL(trace) << "DeviceManager::SsdpDiscovery, json" << json_str; - json j = json::parse(json_str); - std::string dev_name = j["dev_name"].get(); - std::string dev_id = j["dev_id"].get(); - std::string dev_ip = j["dev_ip"].get(); - std::string printer_type_str= j["dev_type"].get(); - std::string printer_signal = j["dev_signal"].get(); - std::string connect_type = j["connect_type"].get(); - std::string bind_state = j["bind_state"].get(); - - if (connect_type == "farm") { - connect_type ="lan"; - bind_state = "free"; - } - - std::string sec_link = ""; - std::string ssdp_version = ""; - if (j.contains("sec_link")) { - sec_link = j["sec_link"].get(); - } - if (j.contains("ssdp_version")) { - ssdp_version = j["ssdp_version"].get(); - } - std::string connection_name = ""; - if (j.contains("connection_name")) { - connection_name = j["connection_name"].get(); - } - - MachineObject* obj; - - /* update userMachineList info */ - auto it = userMachineList.find(dev_id); - if (it != userMachineList.end()) { - if (it->second->dev_ip != dev_ip || - it->second->bind_state != bind_state || - it->second->bind_sec_link != sec_link || - it->second->dev_connection_type != connect_type || - it->second->bind_ssdp_version != ssdp_version) - { - if (it->second->bind_state != bind_state) { - OnMachineBindStateChanged(it->second, bind_state); - } - - it->second->dev_ip = dev_ip; - it->second->bind_state = bind_state; - it->second->bind_sec_link = sec_link; - it->second->dev_connection_type = connect_type; - it->second->bind_ssdp_version = ssdp_version; - BOOST_LOG_TRIVIAL(trace) << "DeviceManager::SsdpDiscovery, update userMachineList json" << json_str; - } - } - - /* update localMachineList */ - it = localMachineList.find(dev_id); - if (it != localMachineList.end()) { - // update properties - /* ip changed */ - obj = it->second; - - if (obj->dev_ip.compare(dev_ip) != 0) { - if ( connection_name.empty() ) { - BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << Slic3r::GUI::wxGetApp().format_IP(obj->dev_ip) << " to " << Slic3r::GUI::wxGetApp().format_IP(dev_ip); - obj->dev_ip = dev_ip; - } - else { - if ( obj->dev_connection_name.empty() || obj->dev_connection_name.compare(connection_name) == 0) { - BOOST_LOG_TRIVIAL(info) << "MachineObject IP changed from " << Slic3r::GUI::wxGetApp().format_IP(obj->dev_ip) << " to " << Slic3r::GUI::wxGetApp().format_IP(dev_ip) << " connection_name is " << connection_name; - if(obj->dev_connection_name.empty()){obj->dev_connection_name = connection_name;} - obj->dev_ip = dev_ip; - } - - } - /* ip changed reconnect mqtt */ - } - - if (obj->wifi_signal != printer_signal || - obj->dev_connection_type != connect_type || - obj->bind_state != bind_state || - obj->bind_sec_link != sec_link || - obj->bind_ssdp_version != ssdp_version || - obj->printer_type != MachineObject::parse_printer_type(printer_type_str)) - { - obj->wifi_signal = printer_signal; - obj->dev_connection_type = connect_type; - obj->bind_state = bind_state; - obj->bind_sec_link = sec_link; - obj->bind_ssdp_version = ssdp_version; - obj->printer_type = MachineObject::parse_printer_type(printer_type_str); - BOOST_LOG_TRIVIAL(trace) << "DeviceManager::SsdpDiscovery, update localMachineList json" << json_str; - } - - // U0 firmware - if (obj->dev_connection_type.empty() && obj->bind_state.empty()) - obj->bind_state = "free"; - - //BOOST_LOG_TRIVIAL(debug) << "SsdpDiscovery:: Update Machine Info, printer_sn = " << dev_id << ", signal = " << printer_signal; - obj->last_alive = Slic3r::Utils::get_current_time_utc(); - obj->m_is_online = true; - - /* if (!obj->dev_ip.empty()) { - Slic3r::GUI::wxGetApp().app_config->set_str("ip_address", obj->dev_id, obj->dev_ip); - Slic3r::GUI::wxGetApp().app_config->save(); - }*/ - } - else { - /* insert a new machine */ - obj = new MachineObject(m_agent, dev_name, dev_id, dev_ip); - obj->printer_type = MachineObject::parse_printer_type(printer_type_str); - obj->wifi_signal = printer_signal; - obj->dev_connection_type = connect_type; - obj->bind_state = bind_state; - obj->bind_sec_link = sec_link; - obj->dev_connection_name = connection_name; - obj->bind_ssdp_version = ssdp_version; - obj->m_is_online = true; - - //load access code - AppConfig* config = Slic3r::GUI::wxGetApp().app_config; - if (config) { - obj->set_access_code(Slic3r::GUI::wxGetApp().app_config->get("access_code", dev_id)); - obj->set_user_access_code(Slic3r::GUI::wxGetApp().app_config->get("user_access_code", dev_id)); - } - localMachineList.insert(std::make_pair(dev_id, obj)); - - /* if (!obj->dev_ip.empty()) { - Slic3r::GUI::wxGetApp().app_config->set_str("ip_address", obj->dev_id, obj->dev_ip); - Slic3r::GUI::wxGetApp().app_config->save(); - }*/ - BOOST_LOG_TRIVIAL(info) << "SsdpDiscovery::New Machine, ip = " << Slic3r::GUI::wxGetApp().format_IP(dev_ip) << ", printer_name= " << dev_name << ", printer_type = " << printer_type_str << ", signal = " << printer_signal; - } - update_local_machine(*obj); - } - catch (...) { - ; - } -} - -MachineObject* DeviceManager::insert_local_device(const BBLocalMachine& machine, std::string connection_type, std::string bind_state, std::string version, std::string access_code) -{ - MachineObject* obj; - auto it = localMachineList.find(machine.dev_id); - if (it != localMachineList.end()) { - obj = it->second; - } else { - obj = new MachineObject(m_agent, machine.dev_name, machine.dev_id, machine.dev_ip); - localMachineList.insert(std::make_pair(machine.dev_id, obj)); - } - obj->printer_type = MachineObject::parse_printer_type(machine.printer_type); - obj->dev_connection_type = connection_type == "farm" ? "lan":connection_type; - obj->bind_state = connection_type == "farm" ? "free":bind_state; - obj->bind_sec_link = "secure"; - obj->bind_ssdp_version = version; - obj->m_is_online = true; - obj->last_alive = Slic3r::Utils::get_current_time_utc(); - obj->set_access_code(access_code, false); - obj->set_user_access_code(access_code, false); - - update_local_machine(*obj); - - return obj; -} - -void DeviceManager::disconnect_all() -{ - -} - -int DeviceManager::query_bind_status(std::string &msg) -{ - if (!m_agent) { - msg = ""; - return -1; - } - - BOOST_LOG_TRIVIAL(trace) << "DeviceManager::query_bind_status"; - std::map::iterator it; - std::vector query_list; - for (it = localMachineList.begin(); it != localMachineList.end(); it++) { - query_list.push_back(it->first); - } - - unsigned int http_code; - std::string http_body; - int result = m_agent->query_bind_status(query_list, &http_code, &http_body); - - if (result < 0) { - msg = (boost::format("code=%1%,body=%2") % http_code % http_body).str(); - } else { - msg = ""; - try { - json j = json::parse(http_body); - if (j.contains("bind_list")) { - - for (auto& item : j["bind_list"]) { - auto it = localMachineList.find(item["dev_id"].get()); - if (it != localMachineList.end()) { - if (!item["user_id"].is_null()) - it->second->bind_user_id = item["user_id"].get(); - if (!item["user_name"].is_null()) - it->second->bind_user_name = item["user_name"].get(); - else - it->second->bind_user_name = "Free"; - } - } - } - } catch(...) { - ; - } - } - return result; -} - -MachineObject* DeviceManager::get_local_selected_machine() -{ - return get_local_machine(local_selected_machine); -} - -void DeviceManager::reload_printer_settings() -{ - for (auto obj : this->userMachineList) - obj.second->reload_printer_settings(); -} - -MachineObject* DeviceManager::get_default_machine() { - - std::string dev_id; - if (m_agent) { - m_agent->get_user_selected_machine(); - } - if (dev_id.empty()) return nullptr; - - auto it = userMachineList.find(dev_id); - if (it == userMachineList.end()) return nullptr; - return it->second; -} - -MachineObject* DeviceManager::get_local_machine(std::string dev_id) -{ - if (dev_id.empty()) return nullptr; - auto it = localMachineList.find(dev_id); - if (it == localMachineList.end()) return nullptr; - return it->second; -} - -void DeviceManager::erase_user_machine(std::string dev_id) -{ - userMachineList.erase(dev_id); -} - -MachineObject* DeviceManager::get_user_machine(std::string dev_id) -{ - if (!Slic3r::GUI::wxGetApp().is_user_login()) - return nullptr; - - std::map::iterator it = userMachineList.find(dev_id); - if (it == userMachineList.end()) return nullptr; - return it->second; -} - -MachineObject* DeviceManager::get_my_machine(std::string dev_id) -{ - auto list = get_my_machine_list(); - auto it = list.find(dev_id); - if (it != list.end()) { - return it->second; - } - return nullptr; -} - -void DeviceManager::clean_user_info() -{ - BOOST_LOG_TRIVIAL(trace) << "DeviceManager::clean_user_info"; - // reset selected_machine - selected_machine = ""; - local_selected_machine = ""; - - // clean access code - for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { - it->second->set_access_code(""); - } - // clean user list - for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { - if (it->second) { - delete it->second; - it->second = nullptr; - } - } - userMachineList.clear(); -} - -bool DeviceManager::set_selected_machine(std::string dev_id) -{ - BOOST_LOG_TRIVIAL(info) << "set_selected_machine=" << dev_id; - auto my_machine_list = get_my_machine_list(); - auto it = my_machine_list.find(dev_id); - - // disconnect last - auto last_selected = my_machine_list.find(selected_machine); - if (last_selected != my_machine_list.end()) { - last_selected->second->m_active_state = MachineObject::NotActive; - if (last_selected->second->connection_type() == "lan") { - m_agent->disconnect_printer(); - } - } - - // connect curr - if (it != my_machine_list.end()) { - if (selected_machine == dev_id) { - if (it->second->connection_type() != "lan") { - // only reset update time - it->second->reset_update_time(); - - // check subscribe state - Slic3r::GUI::wxGetApp().on_start_subscribe_again(dev_id); - - return true; - } else { - // lan mode printer reconnect printer - if (m_agent) { - m_agent->disconnect_printer(); - it->second->reset(); -#if !BBL_RELEASE_TO_PUBLIC - it->second->connect(Slic3r::GUI::wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false); -#else - it->second->connect(it->second->local_use_ssl_for_mqtt); -#endif - it->second->set_lan_mode_connection_state(true); - } - } - } else { - if (m_agent) { - if (it->second->connection_type() != "lan" || it->second->connection_type().empty()) { - if (m_agent->get_user_selected_machine() == dev_id) { - it->second->reset_update_time(); - } - else { - BOOST_LOG_TRIVIAL(info) << "static: set_selected_machine: same dev_id = " << dev_id; - m_agent->set_user_selected_machine(dev_id); - it->second->reset(); - } - } else { - BOOST_LOG_TRIVIAL(info) << "static: set_selected_machine: same dev_id = empty"; - it->second->reset(); -#if !BBL_RELEASE_TO_PUBLIC - it->second->connect(Slic3r::GUI::wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false); -#else - it->second->connect(it->second->local_use_ssl_for_mqtt); -#endif - m_agent->set_user_selected_machine(dev_id); - it->second->set_lan_mode_connection_state(true); - } - } - } - for (auto& data : it->second->m_nozzle_filament_data) { - data.second.checked_filament.clear(); - } - } - selected_machine = dev_id; - return true; -} - -MachineObject* DeviceManager::get_selected_machine() -{ - if (selected_machine.empty()) return nullptr; - - MachineObject* obj = get_user_machine(selected_machine); - if (obj) - return obj; - - // return local machine has access code - auto it = localMachineList.find(selected_machine); - if (it != localMachineList.end()) { - if (it->second->has_access_right()) - return it->second; - } - return nullptr; -} - -void DeviceManager::subscribe_device_list(std::vector dev_list) -{ - std::vector unsub_list; - subscribe_list_cache.clear(); - for (auto& it : subscribe_list_cache) { - if (it != selected_machine) { - unsub_list.push_back(it); - BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: unsub dev id = " << it; - } - } - BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: unsub_list size = " << unsub_list.size(); - - if (!selected_machine.empty()) { - subscribe_list_cache.push_back(selected_machine); - } - for (auto& it : dev_list) { - subscribe_list_cache.push_back(it); - BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: sub dev id = " << it; - } - BOOST_LOG_TRIVIAL(trace) << "subscribe_device_list: sub_list size = " << subscribe_list_cache.size(); - if (!unsub_list.empty()) - m_agent->del_subscribe(unsub_list); - if (!dev_list.empty()) - m_agent->add_subscribe(subscribe_list_cache); -} - -std::map DeviceManager::get_my_machine_list() -{ - std::map result; - - for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { - if (!it->second) - continue; - if (!it->second->is_lan_mode_printer()) - result.insert(std::make_pair(it->first, it->second)); - } - - for (auto it = localMachineList.begin(); it != localMachineList.end(); it++) { - if (!it->second) - continue; - - if (it->second->has_access_right() && it->second->is_avaliable() && it->second->is_lan_mode_printer()) { - // remove redundant in userMachineList - if (result.find(it->first) == result.end()) { - result.emplace(std::make_pair(it->first, it->second)); - } - } - } - return result; -} - -std::map DeviceManager::get_my_cloud_machine_list() -{ - std::map result; - - for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { - if (!it->second) - continue; - if (!it->second->is_lan_mode_printer()) - result.emplace(*it); - } - return result; -} - -std::string DeviceManager::get_first_online_user_machine() { - for (auto it = userMachineList.begin(); it != userMachineList.end(); it++) { - if (it->second && it->second->is_online()) { - return it->second->dev_id; - } - } - return ""; -} - -void DeviceManager::modify_device_name(std::string dev_id, std::string dev_name) -{ - BOOST_LOG_TRIVIAL(trace) << "modify_device_name"; - if (m_agent) { - int result = m_agent->modify_printer_name(dev_id, dev_name); - if (result == 0) { - update_user_machine_list_info(); - } - } -} - -void DeviceManager::parse_user_print_info(std::string body) -{ - BOOST_LOG_TRIVIAL(trace) << "DeviceManager::parse_user_print_info"; - std::lock_guard lock(listMutex); - std::set new_list; - try { - json j = json::parse(body); - if (j.contains("devices") && !j["devices"].is_null()) { - for (auto& elem : j["devices"]) { - MachineObject* obj = nullptr; - std::string dev_id; - if (!elem["dev_id"].is_null()) { - dev_id = elem["dev_id"].get(); - new_list.insert(dev_id); - } - std::map::iterator iter = userMachineList.find(dev_id); - if (iter != userMachineList.end()) { - /* update field */ - obj = iter->second; - obj->dev_id = dev_id; - } - else { - obj = new MachineObject(m_agent, "", "", ""); - if (m_agent) { - obj->set_bind_status(m_agent->get_user_name()); - } - - if (obj->dev_ip.empty()) { - obj->dev_ip = Slic3r::GUI::wxGetApp().app_config->get("ip_address", dev_id); - } - userMachineList.insert(std::make_pair(dev_id, obj)); - } - - if (!obj) continue; - - if (!elem["dev_id"].is_null()) - obj->dev_id = elem["dev_id"].get(); - if (!elem["dev_name"].is_null()) - obj->dev_name = elem["dev_name"].get(); - if (!elem["dev_online"].is_null()) - obj->m_is_online = elem["dev_online"].get(); - if (elem.contains("dev_model_name") && !elem["dev_model_name"].is_null()) - obj->printer_type = elem["dev_model_name"].get(); - if (!elem["task_status"].is_null()) - obj->iot_print_status = elem["task_status"].get(); - if (elem.contains("dev_product_name") && !elem["dev_product_name"].is_null()) - obj->product_name = elem["dev_product_name"].get(); - if (elem.contains("dev_access_code") && !elem["dev_access_code"].is_null()) { - std::string acc_code = elem["dev_access_code"].get(); - acc_code.erase(std::remove(acc_code.begin(), acc_code.end(), '\n'), acc_code.end()); - obj->set_access_code(acc_code); - } - } - - //remove MachineObject from userMachineList - std::map::iterator iterat; - for (iterat = userMachineList.begin(); iterat != userMachineList.end(); ) { - if (new_list.find(iterat->first) == new_list.end()) { - iterat = userMachineList.erase(iterat); - } - else { - iterat++; - } - } - } - } - catch (std::exception&) { - ; - } -} - -void DeviceManager::update_user_machine_list_info() -{ - if (!m_agent) return; - - BOOST_LOG_TRIVIAL(debug) << "update_user_machine_list_info"; - unsigned int http_code; - std::string body; - int result = m_agent->get_user_print_info(&http_code, &body); - if (result == 0) { - parse_user_print_info(body); - } -} - - -std::map DeviceManager::get_local_machine_list() -{ - std::map result; - std::map::iterator it; - - for (it = localMachineList.begin(); it != localMachineList.end(); it++) { - if (it->second->m_is_online) { - result.insert(std::make_pair(it->first, it->second)); - } - } - - return result; -} - -void DeviceManager::load_last_machine() -{ - // Get all available machines, include cloud machines and lan machines that have access right - auto all_machines = get_my_machine_list(); - if (all_machines.empty()) - return; - - // Then connect to the machine we last selected if available - const std::string last_monitor_machine = m_agent ? m_agent->get_user_selected_machine() : ""; - const auto last_machine = all_machines.find(last_monitor_machine); - if (last_machine != all_machines.end()) { - this->set_selected_machine(last_machine->second->dev_id); - } else { - // If not, then select the first available one - this->set_selected_machine(all_machines.begin()->second->dev_id); - } -} - -json DeviceManager::filaments_blacklist = json::object(); - - -std::string DeviceManager::parse_printer_type(std::string type_str) -{ - return get_value_from_config(type_str, "printer_type"); -} -std::string DeviceManager::get_printer_display_name(std::string type_str) -{ - return get_value_from_config(type_str, "display_name"); -} -std::string DeviceManager::get_ftp_folder(std::string type_str) -{ - return get_value_from_config(type_str, "ftp_folder"); -} -PrinterArch DeviceManager::get_printer_arch(std::string type_str) -{ - return get_printer_arch_by_str(get_value_from_config(type_str, "printer_arch")); -} -std::string DeviceManager::get_printer_thumbnail_img(std::string type_str) -{ - return get_value_from_config(type_str, "printer_thumbnail_image"); -} -std::string DeviceManager::get_printer_ams_type(std::string type_str) -{ - return get_value_from_config(type_str, "use_ams_type"); -} -std::string DeviceManager::get_printer_series(std::string type_str) -{ - return get_value_from_config(type_str, "printer_series"); -} -std::string DeviceManager::get_printer_diagram_img(std::string type_str) -{ - return get_value_from_config(type_str, "printer_connect_help_image"); -} -std::string DeviceManager::get_printer_ams_img(std::string type_str) -{ - return get_value_from_config(type_str, "printer_use_ams_image"); } - -std::string DeviceManager::get_printer_ext_img(std::string type_str, int pos) { - const auto& vec = get_value_from_config>(type_str, "printer_ext_image"); - if (vec.size() > pos) { return vec[pos];} - return std::string(); -} - -bool DeviceManager::support_wrapping_detection(const std::string &type_str) -{ - return get_value_from_config(type_str, "support_wrapping_deteciton"); -} - -bool DeviceManager::get_printer_is_enclosed(std::string type_str) { - return get_value_from_config(type_str, "printer_is_enclosed"); } - -bool DeviceManager::get_printer_can_set_nozzle(std::string type_str) -{ - return get_value_from_config(type_str, "enable_set_nozzle_info"); -} - -std::vector DeviceManager::get_resolution_supported(std::string type_str) -{ - std::vector resolution_supported; - - std::string config_file = Slic3r::resources_dir() + "/printers/" + type_str + ".json"; - boost::nowide::ifstream json_file(config_file.c_str()); - try { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const& printer = jj["00.00.00.00"]; - if (printer.contains("camera_resolution")) { - for (auto res : printer["camera_resolution"]) - resolution_supported.emplace_back(res.get()); - } - } - } - } - catch (...) {} - return resolution_supported; -} - -std::vector DeviceManager::get_compatible_machine(std::string type_str) -{ - std::vector compatible_machine; - std::string config_file = Slic3r::resources_dir() + "/printers/" + type_str + ".json"; - boost::nowide::ifstream json_file(config_file.c_str()); - try { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const& printer = jj["00.00.00.00"]; - if (printer.contains("compatible_machine")) { - for (auto res : printer["compatible_machine"]) - compatible_machine.emplace_back(res.get()); - } - } - } - } - catch (...) {} - return compatible_machine; -} - -std::vector DeviceManager::get_unsupport_auto_cali_filaments(std::string type_str) -{ - std::vector filaments; - std::string config_file = Slic3r::resources_dir() + "/printers/" + type_str + ".json"; - boost::nowide::ifstream json_file(config_file.c_str()); - try { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const &printer = jj["00.00.00.00"]; - if (printer.contains("auto_cali_not_support_filaments")) { - for (auto res : printer["auto_cali_not_support_filaments"]) - filaments.emplace_back(res.get()); - } - } - } - } catch (...) {} - return filaments; -} - -boost::bimaps::bimap DeviceManager::get_all_model_id_with_name() -{ - boost::bimaps::bimap models; - std::vector m_files; - - wxDir dir(Slic3r::resources_dir() + "/printers/"); - if (!dir.IsOpened()) { - return models; - } - - wxString filename; - bool hasFile = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES); - while (hasFile) { - m_files.push_back(filename); - hasFile = dir.GetNext(&filename); - } - - for (wxString file : m_files) { - if (!file.Lower().ends_with(".json")) continue; - - std::string config_file = Slic3r::resources_dir() + "/printers/" + file.ToStdString(); - boost::nowide::ifstream json_file(config_file.c_str()); - - try { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const &printer = jj["00.00.00.00"]; - - std::string model_id; - std::string display_name; - if (printer.contains("model_id")) {model_id = printer["model_id"].get();} - if (printer.contains("display_name")) {display_name = printer["display_name"].get();} - - if (!model_id.empty() && !display_name.empty()) { - models.left.insert(make_pair(model_id, display_name)); - } - } - } - } catch (...) {} - } - - return models; -} - -bool DeviceManager::load_filaments_blacklist_config() -{ - filaments_blacklist = json::object(); - - std::string config_file = Slic3r::resources_dir() + "/printers/filaments_blacklist.json"; - boost::nowide::ifstream json_file(config_file.c_str()); - - try { - if (json_file.is_open()) { - json_file >> filaments_blacklist; - return true; - } - else { - BOOST_LOG_TRIVIAL(error) << "load filaments blacklist config failed, file = " << config_file; - } - } - catch (...) { - BOOST_LOG_TRIVIAL(error) << "load filaments blacklist config failed, file = " << config_file; - return false; - } - return true; -} - -string DeviceManager::get_fan_text(const std::string& type_str, const std::string& key) -{ - std::vector filaments; - std::string config_file = Slic3r::resources_dir() + "/printers/" + type_str + ".json"; - boost::nowide::ifstream json_file(config_file.c_str()); - try - { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const& printer = jj["00.00.00.00"]; - if (printer.contains("fan") && printer["fan"].contains(key)) { - return printer["fan"][key].get(); - } - } - } - } - catch (...) {} - return string(); -} - -bool DeviceManager::is_virtual_slot(int ams_id) -{ - if (ams_id == VIRTUAL_TRAY_MAIN_ID || ams_id == VIRTUAL_TRAY_DEPUTY_ID) - return true; - return false; -} - -std::string DeviceManager::get_filament_name_from_ams(int ams_id, int slot_id) -{ - std::string name; - DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); - if (!dev) { return name; } - - MachineObject *obj = dev->get_selected_machine(); - if (obj == nullptr) { return name; } - - if (ams_id < 0 || slot_id < 0 ) { - return name; - } - - if (obj->amsList.find(std::to_string(ams_id)) == obj->amsList.end()) {return name;} - - if (obj->amsList[std::to_string(ams_id)]->trayList.find(std::to_string(slot_id)) == obj->amsList[std::to_string(ams_id)]->trayList.end()) { return name; } - - std::string filament_id = obj->amsList[std::to_string(ams_id)]->trayList[std::to_string(slot_id)]->setting_id; - - PresetBundle *preset_bundle = GUI::wxGetApp().preset_bundle; - auto option = preset_bundle->get_filament_by_filament_id(filament_id); - name = option ? option->filament_name : ""; - return name; -} - -void DeviceManager::OnMachineBindStateChanged(MachineObject *obj, const std::string &new_state) { - if (!obj) { return; } - if (obj->dev_id == selected_machine) { - if (new_state == "free") { OnSelectedMachineLost();} - } -} - -void DeviceManager::OnSelectedMachineLost() { - GUI::wxGetApp().sidebar().update_sync_status(nullptr); - GUI::wxGetApp().sidebar().load_ams_list(string(), nullptr); -} - - -void check_filaments(std::string model_id, - std::string tag_vendor, - std::string tag_type, - int ams_id, - int slot_id, - std::string tag_name, - bool& in_blacklist, - std::string& ac, - wxString& info, - wxString& wiki_url) -{ - if (tag_name.empty()) - { - tag_name = DeviceManager::get_filament_name_from_ams(ams_id, slot_id); - } - - in_blacklist = false; - - std::transform(tag_vendor.begin(), tag_vendor.end(), tag_vendor.begin(), ::tolower); - std::transform(tag_type.begin(), tag_type.end(), tag_type.begin(), ::tolower); - std::transform(tag_name.begin(), tag_name.end(), tag_name.begin(), ::tolower); - if (DeviceManager::filaments_blacklist.contains("blacklist")) { - for (auto filament_item : DeviceManager::filaments_blacklist["blacklist"]) { - - std::string vendor = filament_item.contains("vendor") ? filament_item["vendor"].get() : ""; - std::string type = filament_item.contains("type") ? filament_item["type"].get() : ""; - std::string type_suffix = filament_item.contains("type_suffix") ? filament_item["type_suffix"].get() : ""; - std::string name = filament_item.contains("name") ? filament_item["name"].get() : ""; - std::string slot = filament_item.contains("slot") ? filament_item["slot"].get() : ""; - std::vector model_ids = filament_item.contains("model_id") ? filament_item["model_id"].get>() : std::vector(); - std::string action = filament_item.contains("action") ? filament_item["action"].get() : ""; - std::string description = filament_item.contains("description") ? filament_item["description"].get() : ""; - - // check model id - if (!model_ids.empty() && std::find(model_ids.begin(), model_ids.end(), model_id) == model_ids.end()) { continue;} - - // check vendor - std::transform(vendor.begin(), vendor.end(), vendor.begin(), ::tolower); - if (!vendor.empty()) { - if ((vendor == "bambu lab" && (tag_vendor == vendor)) || - (vendor == "third party" && (tag_vendor != "bambu lab"))){ - // Do nothing - } else { - continue; - } - } - - // check type - std::transform(type.begin(), type.end(), type.begin(), ::tolower); - if (!type.empty() && (type != tag_type)) { continue; } - - // check type suffix - std::transform(type_suffix.begin(), type_suffix.end(), type_suffix.begin(), ::tolower); - if (!type_suffix.empty()) { - if (tag_type.length() < type_suffix.length()) { continue; } - if ((tag_type.substr(tag_type.length() - type_suffix.length()) != type_suffix)) { continue; } - } - - // check name - std::transform(name.begin(), name.end(), name.begin(), ::tolower); - if (!name.empty() && (name != tag_name)) { continue;} - - // check loc - if (!slot.empty()) { - bool is_virtual_slot = DeviceManager::is_virtual_slot(ams_id); - bool check_virtual_slot = (slot == "ext"); - bool check_ams_slot = (slot == "ams"); - if (is_virtual_slot && !check_virtual_slot) { - continue; - } else if (!is_virtual_slot && !check_ams_slot) { - continue; - } - } - - if (GUI::wxGetApp().app_config->get("skip_ams_blacklist_check") == "true") { - action = "warning"; - } - - in_blacklist = true; - ac = action; - info = _L(description); - wiki_url = filament_item.contains("wiki") ? filament_item["wiki"].get() : ""; - return; - - // Using in description - L("TPU is not supported by AMS."); - L("Damp PVA will become flexible and get stuck inside AMS, please take care to dry it before use."); - L("The rough surface of PLA Glow can accelerate wear on the AMS system, particularly on the internal components of the AMS Lite."); - L("CF/GF filaments are hard and brittle, it's easy to break or get stuck in AMS, please use with caution."); - L("PPS-CF is brittle and could break in bended PTFE tube above Toolhead."); - L("PPA-CF is brittle and could break in bended PTFE tube above Toolhead."); - } - } -} - - - -void DeviceManager::check_filaments_in_blacklist(std::string model_id, - std::string tag_vendor, - std::string tag_type, - const std::string &filament_id, - int ams_id, - int slot_id, - std::string tag_name, - bool &in_blacklist, - std::string &ac, - wxString &info) -{ - wxString wiki_url; - check_filaments_in_blacklist_url(model_id, tag_vendor, tag_type, filament_id, ams_id, slot_id, tag_name, in_blacklist, ac, info, wiki_url); -} - -void DeviceManager::check_filaments_in_blacklist_url(std::string model_id, std::string tag_vendor, std::string tag_type, const std::string& filament_id, int ams_id, int slot_id, std::string tag_name, bool& in_blacklist, std::string& ac, wxString& info, wxString& wiki_url) -{ - if (ams_id < 0 || slot_id < 0) - { - return; - } - - if (!check_filaments_printable(tag_vendor, tag_type, filament_id, ams_id, in_blacklist, ac, info)) - { - return; - } - - check_filaments(model_id, tag_vendor, tag_type, ams_id, slot_id, tag_name, in_blacklist, ac, info, wiki_url); -} - -std::string DeviceManager::load_gcode(std::string type_str, std::string gcode_file) -{ - std::string gcode_full_path = Slic3r::resources_dir() + "/printers/" + gcode_file; - std::ifstream gcode(encode_path(gcode_full_path.c_str()).c_str()); - try { - std::stringstream gcode_str; - if (gcode.is_open()) { - gcode_str << gcode.rdbuf(); - gcode.close(); - return gcode_str.str(); - } - } catch(...) { - BOOST_LOG_TRIVIAL(error) << "load gcode file failed, file = " << gcode_file << ", path = " << gcode_full_path; - } - - - return ""; -} - -DeviceManagerRefresher::DeviceManagerRefresher(DeviceManager *manger) : wxObject() { - m_manager = manger; - m_timer = new wxTimer(); - m_timer->Bind(wxEVT_TIMER, &DeviceManagerRefresher::on_timer, this); -} - -DeviceManagerRefresher::~DeviceManagerRefresher() { - m_timer->Stop(); - delete m_timer; -} - -void DeviceManagerRefresher::on_timer(wxTimerEvent &event) { - if (!m_manager) { return;} - - NetworkAgent *agent = m_manager->get_agent(); - if (!agent) { return; } - - // reset to active - Slic3r::GUI::wxGetApp().reset_to_active(); - - MachineObject *obj = m_manager->get_selected_machine(); - if (!obj) { return; } - - // check valid machine - if (obj && m_manager->get_my_machine(obj->dev_id) == nullptr) { - m_manager->set_selected_machine(""); - agent->set_user_selected_machine(""); - return; - } - - // do some refresh - if (Slic3r::GUI::wxGetApp().is_user_login()) - { - m_manager->check_pushing(); - try { - agent->refresh_connection(); - } catch (...) { - ; - } - } - - // certificate - agent->install_device_cert(obj->dev_id, obj->is_lan_mode_printer()); + return m_fila_system->GetAmsSystemSetting().IsDetectOnInsertEnabled(); } void change_the_opacity(wxColour& colour) @@ -8276,27 +5283,4 @@ void change_the_opacity(wxColour& colour) } } - -//************************************ -// Method: get_longlong_val -// FullName: Slic3r::JsonValParser::get_longlong_val -// Access: public static -// Returns: std::string -// Qualifier: -// Parameter: const json & j -//************************************ -std::string JsonValParser::get_longlong_val(const json& j) -{ - if (j.is_number()) - { - return std::to_string(j.get()); - } - else if (j.is_string()) - { - return j.get(); - } - - return string(); -} - } // namespace Slic3r diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 1903cd92a6..17fe7e784b 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -13,11 +13,15 @@ #include "nlohmann/json.hpp" #include "libslic3r/ProjectTask.hpp" #include "slic3r/Utils/json_diff.hpp" -#include "slic3r/Utils/NetworkAgent.hpp" #include "boost/bimap/bimap.hpp" #include "libslic3r/calib.hpp" #include "libslic3r/Utils.hpp" +#include "DeviceCore/DevDefs.h" +#include "DeviceCore/DevConfigUtil.h" +#include "DeviceCore/DevFirmware.h" + + #include #include #include @@ -33,9 +37,6 @@ #define EXTRUSION_OMIT_TIME 20000.f // milliseconds #define HOLD_TIMEOUT 10000.f // milliseconds -#define FILAMENT_MAX_TEMP 300 -#define FILAMENT_DEF_TEMP 220 -#define FILAMENT_MIN_TEMP 120 #define BED_TEMP_LIMIT 120 #define HOLD_COUNT_MAX 3 @@ -47,496 +48,24 @@ #define GET_VERSION_RETRYS 10 #define RETRY_INTERNAL 2000 -#define MAIN_NOZZLE_ID 0 -#define DEPUTY_NOZZLE_ID 1 -#define UNIQUE_NOZZLE_ID MAIN_NOZZLE_ID -#define INVALID_NOZZLE_ID -1 - -#define VIRTUAL_TRAY_MAIN_ID 255 -#define VIRTUAL_TRAY_DEPUTY_ID 254 - -#define VIRTUAL_AMS_MAIN_ID_STR "255" -#define VIRTUAL_AMS_DEPUTY_ID_STR "254" - #define START_SEQ_ID 20000 #define END_SEQ_ID 30000 #define SUBSCRIBE_RETRY_COUNT 5 -inline int correct_filament_temperature(int filament_temp) -{ - int temp = std::min(filament_temp, FILAMENT_MAX_TEMP); - temp = std::max(temp, FILAMENT_MIN_TEMP); - return temp; -} - -wxString get_stage_string(int stage); - using namespace nlohmann; - namespace Slic3r { -namespace GUI { - class DeviceErrorDialog; // Previous definitions +namespace GUI +{ +class DeviceErrorDialog; // Previous definitions } -struct BBLocalMachine; -class SecondaryCheckDialog; -enum PrinterArch { - ARCH_CORE_XY, - ARCH_I3, -}; - -enum PrinterSeries { - SERIES_X1 = 0, - SERIES_P1P, - SERIES_UNKNOWN, -}; - -enum PrinterFunction { - FUNC_MAX -}; - - -enum PrintingSpeedLevel { - SPEED_LEVEL_INVALID = 0, - SPEED_LEVEL_SILENCE = 1, - SPEED_LEVEL_NORMAL = 2, - SPEED_LEVEL_RAPID = 3, - SPEED_LEVEL_RAMPAGE = 4, - SPEED_LEVEL_COUNT -}; - class NetworkAgent; - - -enum AmsRfidState { - AMS_RFID_INIT, - AMS_RFID_LOADING, - AMS_REID_DONE, -}; - -enum AmsStep { - AMS_STEP_INIT, - AMS_STEP_HEAT_EXTRUDER, - AMS_STEP_LOADING, - AMS_STEP_COMPLETED, -}; - -enum AmsRoadPosition { - AMS_ROAD_POSITION_TRAY, // filament at tray - AMS_ROAD_POSITION_TUBE, // filament at tube - AMS_ROAD_POSITION_HOTEND, // filament at hotend -}; - -enum AmsStatusMain { - AMS_STATUS_MAIN_IDLE = 0x00, - AMS_STATUS_MAIN_FILAMENT_CHANGE = 0x01, - AMS_STATUS_MAIN_RFID_IDENTIFYING = 0x02, - AMS_STATUS_MAIN_ASSIST = 0x03, - AMS_STATUS_MAIN_CALIBRATION = 0x04, - AMS_STATUS_MAIN_SELF_CHECK = 0x10, - AMS_STATUS_MAIN_DEBUG = 0x20, - AMS_STATUS_MAIN_UNKNOWN = 0xFF, -}; - -enum AmsRfidStatus { - AMS_RFID_IDLE = 0, - AMS_RFID_READING = 1, - AMS_RFID_GCODE_TRANS = 2, - AMS_RFID_GCODE_RUNNING = 3, - AMS_RFID_ASSITANT = 4, - AMS_RFID_SWITCH_FILAMENT= 5, - AMS_RFID_HAS_FILAMENT = 6 -}; - -enum AmsOptionType { - AMS_OP_STARTUP_READ, - AMS_OP_TRAY_READ, - AMS_OP_CALIBRATE_REMAIN -}; - enum ManualPaCaliMethod { PA_LINE = 0, PA_PATTERN, }; -enum ExtruderSwitchState { - ES_IDLE = 0, - ES_BUSY, - ES_SWITCHING, - ES_SWITCHING_FAILED -}; - -enum AirDuctType { - AIR_FAN_TYPE, - AIR_DOOR_TYPE -}; - -enum NozzleFlowType{ - NONE_FLOWTYPE, - S_FLOW, - H_FLOW -}; - -enum NozzleToolType { - NONE_TOOLTYPE, - H_TOOL, - C_TOOL -}; - -struct AmsSlot -{ - std::string ams_id; - std::string slot_id; -}; - -struct Nozzle -{ - int id; - NozzleToolType tool_type; // H nozzle or Cut - NozzleFlowType nozzle_flow; // 0-common 1-high flow - NozzleType nozzle_type; // 0-stainless_steel 1-hardened_steel 5-tungsten_carbide - float diameter = {0.4f}; // 0-0.2mm 1-0.4mm 2-0.6 mm3-0.8mm - int max_temp = 0; - int wear = 0; -}; - -struct NozzleData -{ - int extder_exist; //0- none exist 1-exist - int cut_exist; - int state; //0-idle 1-checking - std::vector nozzles; -}; - -struct Extder -{ - int id; // 0-right 1-left - - int enable_change_nozzle{0}; - int ext_has_filament{0}; - int buffer_has_filament{0}; - int nozzle_exist{0}; - - std::vector filam_bak;// the refill filam - - int temp{0}; - int target_temp{0}; - - AmsSlot spre; // tray_pre - AmsSlot snow; // tray_now - AmsSlot star; // tray_tar - int ams_stat{0}; - - int rfid_stat{0}; - - int nozzle_id; // nozzle id now - int target_nozzle_id; // target nozzle id - - //current nozzle - NozzleType current_nozzle_type{NozzleType::ntUndefine}; // 0-hardened_steel 1-stainless_steel - float current_nozzle_diameter = {0.4f}; // 0-0.2mm 1-0.4mm 2-0.6 mm3-0.8mm - NozzleFlowType current_nozzle_flow_type{NozzleFlowType::NONE_FLOWTYPE};//0-common 1-high flow -}; - -struct ExtderData -{ - int current_extder_id{0}; - int target_extder_id{0}; - int total_extder_count {0}; - int current_loading_extder_id {-1}; - bool current_busy_for_loading{false}; - ExtruderSwitchState switch_extder_state; - std::vector extders; -}; - -struct AirMode -{ - int id{-1}; - std::vector ctrl; - // If the fan is off, it cannot be controlled and is displayed as off - std::vector off; - // If the fan is not off or ctrl, it will be displayed as auto - -public: - bool operator ==(const AirMode& other) const { - return (id == other.id) && (ctrl == other.ctrl) && (off == other.off); - }; -}; - -struct AirParts -{ - int type{ 0 }; - int id{ 0 }; - int func{ 0 }; - int state{ 0 };// 100% - int range_start{ 0 };// 100% - int range_end{ 0 };// 100% - -public: - bool operator ==(const AirParts& other) const { - return (type == other.type) && (id == other.id) && (func == other.func) && (state == other.state) && (range_start == other.range_start) && (range_end == other.range_end); - }; -}; - -struct AirDuctData -{ - int curren_mode{ 0 }; - std::unordered_map modes; - std::vector parts; - - int m_sub_mode = -1;// the submode of airduct, for cooling: 0-filter, 1-cooling - bool m_support_cooling_filter = false;// support switch filter on cooling mode or not - -public: - bool operator ==(const AirDuctData& other) const { - return (curren_mode == other.curren_mode) && (modes == other.modes) && (parts == other.parts) && - (m_sub_mode == other.m_sub_mode) && (m_support_cooling_filter == other.m_support_cooling_filter); - }; - - bool operator !=(const AirDuctData& other) const { - return !(operator==(other)); - }; - - bool IsSupportCoolingFilter() const { return m_support_cooling_filter;} - bool IsCoolingFilerOn() const { return m_sub_mode == 0;} -}; - -struct RatingInfo { - bool request_successful; - int http_code; - int rating_id; - int start_count; - bool success_printed; - std::string content; - std::vector image_url_paths; -}; - -class AmsTray { -public: - AmsTray(std::string tray_id) { - is_bbl = false; - id = tray_id; - road_position = AMS_ROAD_POSITION_TRAY; - step_state = AMS_STEP_INIT; - rfid_state = AMS_RFID_INIT; - } - - static int hex_digit_to_int(const char c) - { - return (c >= '0' && c <= '9') ? int(c - '0') : (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; - } - - static wxColour decode_color(const std::string &color) - { - std::array ret = {0, 0, 0, 0}; - const char * c = color.data(); - if (color.size() == 8) { - for (size_t j = 0; j < 4; ++j) { - int digit1 = hex_digit_to_int(*c++); - int digit2 = hex_digit_to_int(*c++); - if (digit1 == -1 || digit2 == -1) break; - ret[j] = float(digit1 * 16 + digit2); - } - } else { - return wxColour(255, 255, 255, 255); - } - return wxColour(ret[0], ret[1], ret[2], ret[3]); - } - - bool operator==(AmsTray const &o) const - { - return id == o.id && type == o.type && filament_setting_id == o.filament_setting_id && color == o.color; - } - bool operator!=(AmsTray const &o) const { return !operator==(o); } - - std::string id; - std::string tag_uid; // tag_uid - std::string setting_id; // tray_info_idx - std::string filament_setting_id; // setting_id - std::string type; - std::string sub_brands; - std::string color; - std::vector cols; - std::string weight; - std::string diameter; - std::string temp; - std::string time; - std::string bed_temp_type; - std::string bed_temp; - std::string nozzle_temp_max; - std::string nozzle_temp_min; - std::string xcam_info; - std::string uuid; - int ctype = 0; - float k = 0.0f; // k range: 0 ~ 0.5 - float n = 0.0f; // k range: 0.6 ~ 2.0 - int cali_idx = -1; // - 1 means default - - wxColour wx_color; - bool is_bbl; - bool is_exists = false; - int hold_count = 0; - int remain = 0; // filament remain: 0 ~ 100 - - AmsRoadPosition road_position; - AmsStep step_state; - AmsRfidState rfid_state; - - void set_hold_count() { hold_count = HOLD_COUNT_MAX; } - void update_color_from_str(std::string color); - wxColour get_color(); - - void reset(); - - bool is_tray_info_ready(); - bool is_unset_third_filament(); - std::string get_display_filament_type(); - std::string get_filament_type(); -}; - -#define INVALID_AMS_TEMPERATURE std::numeric_limits::min() - -class Ams -{ -public: - Ams(std::string ams_id, int nozzle_id, int type_id) - { - id = ams_id; - nozzle = nozzle_id; - type = type_id; - } - std::string id; - std::string info; - int left_dry_time = 0; - int humidity = 5; - int humidity_raw = -1; // the percentage, -1 means invalid. eg. 100 means 100% - float current_temperature = INVALID_AMS_TEMPERATURE; // the temperature - bool startup_read_opt{true}; - bool tray_read_opt{false}; - bool is_exists{false}; - std::map trayList; - - int nozzle; - int type{1}; // 0:dummy 1:ams 2:ams-lite 3:n3f 4:n3s - -public: - wxString get_ams_device_name() const - { - wxString ams_device_name; - if (type == 1) { - ams_device_name = "AMS-%d"; - } else if (type == 2) { - ams_device_name = "AMS Lite-%d"; - } else if (type == 3) { - ams_device_name = "AMS 2 PRO-%d"; - } else if (type == 4) { - ams_device_name = "AMS HT-%d"; - } else { - assert(0); - ams_device_name = "AMS-%d"; - } - - int num_id; - try { - num_id = std::stoi(id); - } catch (...) {} - - int loc = (num_id > 127) ? (num_id - 127) : (num_id + 1); - return wxString::Format(ams_device_name, loc); - }; -}; - -enum PrinterFirmwareType { - FIRMWARE_TYPE_ENGINEER = 0, - FIRMWARE_TYPE_PRODUCTION, - FIRMEARE_TYPE_UKNOWN, -}; - - -class FirmwareInfo -{ -public: - std::string module_type; // ota or ams - std::string version; - std::string url; - std::string name; - std::string description; -}; - -enum ModuleID { - MODULE_UKNOWN = 0x00, - MODULE_01 = 0x01, - MODULE_02 = 0x02, - MODULE_MC = 0x03, - MODULE_04 = 0x04, - MODULE_MAINBOARD = 0x05, - MODULE_06 = 0x06, - MODULE_AMS = 0x07, - MODULE_TH = 0x08, - MODULE_09 = 0x09, - MODULE_10 = 0x0A, - MODULE_11 = 0x0B, - MODULE_XCAM = 0x0C, - MODULE_13 = 0x0D, - MODULE_14 = 0x0E, - MODULE_15 = 0x0F, - MODULE_MAX = 0x10 -}; - -enum HMSMessageLevel { - HMS_UNKNOWN = 0, - HMS_FATAL = 1, - HMS_SERIOUS = 2, - HMS_COMMON = 3, - HMS_INFO = 4, - HMS_MSG_LEVEL_MAX, -}; - - -enum AIR_FUN { - FAN_HEAT_BREAK_0_IDX = 0, - FAN_COOLING_0_AIRDOOR = 1, - FAN_REMOTE_COOLING_0_IDX = 2, - FAN_CHAMBER_0_IDX = 3, - FAN_HEAT_BREAK_1_IDX = 4, - FAN_MC_BOARD_0_IDX = 5, - FAN_INNNER_LOOP_FAN_0_IDX = 6, - FAN_TOTAL_COUNT = 7 -}; - -enum AIR_DOOR { - AIR_DOOR_FUNC_CHAMBER = 0, - AIR_DOOR_FUNC_INNERLOOP, - AIR_DOOR_FUNC_TOP -}; - -enum AIR_DUCT { - AIR_DUCT_NONE = -1, - AIR_DUCT_COOLING_FILT = 0, - AIR_DUCT_HEATING_INTERNAL_FILT, - AIR_DUCT_EXHAUST, - AIR_DUCT_FULL_COOLING, - AIR_DUCT_INIT = 0xFF //Initial mode, only used within mc -}; - -class HMSItem -{ -public: - ModuleID module_id; - unsigned module_num; - unsigned part_id; - unsigned reserved; - HMSMessageLevel msg_level = HMS_UNKNOWN; - int msg_code = 0; - bool already_read = false; - bool parse_hms_info(unsigned attr, unsigned code); - std::string get_long_error_code(); - - static wxString get_module_name(ModuleID module_id); - static wxString get_hms_msg_level_str(HMSMessageLevel level); -}; - #define UpgradeNoError 0 #define UpgradeDownloadFailed -1 @@ -544,154 +73,115 @@ public: #define UpgradeFlashFailed -3 #define UpgradePrinting -4 -// calc distance map -struct DisValue { - int tray_id; - float distance; - bool is_same_color = true; - bool is_type_match = true; -}; +// Previous definitions +class DevAms; +class DevAmsTray; +class DevBed; +class DevConfig; +class DevCtrl; +class DevExtderSystem; +class DevFan; +class DevFilaSystem; +class DevPrintOptions; +class DevHMS; +class DevLamp; +class DevNozzleSystem; +class DeviceManager; +class DevStorage; +struct DevPrintTaskRatingInfo; + -class Preset; class MachineObject { private: - NetworkAgent * m_agent{nullptr}; + NetworkAgent * m_agent{nullptr}; + DeviceManager* m_manager{ nullptr }; std::shared_ptr m_token = std::make_shared(1); - bool check_valid_ip(); - void _parse_print_option_ack(int option); - + /* properties */ + std::string dev_id; + std::string dev_name; + std::string dev_ip; std::string access_code; std::string user_access_code; // type, time stamp, delay std::vector> message_delay; + /*parts*/ + DevLamp* m_lamp; + DevExtderSystem* m_extder_system; + DevNozzleSystem* m_nozzle_system; + DevFilaSystem* m_fila_system; + DevFan* m_fan; + DevBed * m_bed; + DevStorage* m_storage; + + /*Ctrl*/ + DevCtrl* m_ctrl; + + /*Print Options/Speed*/ + DevPrintOptions* m_print_options; + + /*HMS*/ + DevHMS* m_hms_system; + + /*Config*/ + DevConfig* m_config; + public: + MachineObject(DeviceManager* manager, NetworkAgent* agent, std::string name, std::string id, std::string ip); + ~MachineObject(); - typedef std::function CommandCallBack; - - enum LIGHT_EFFECT { - LIGHT_EFFECT_ON, - LIGHT_EFFECT_OFF, - LIGHT_EFFECT_FLASHING, - LIGHT_EFFECT_UNKOWN, - }; - - enum FanType { - COOLING_FAN = 1, - BIG_COOLING_FAN = 2, - CHAMBER_FAN = 3, - EXHAUST_FAN, - FILTER_FAN, - }; - - enum UpgradingDisplayState { - UpgradingUnavaliable = 0, - UpgradingAvaliable = 1, - UpgradingInProgress = 2, - UpgradingFinished = 3 - }; - - enum ExtruderAxisStatus { - LOAD = 0, - UNLOAD =1, - STATUS_NUMS = 2 - }; - enum ExtruderAxisStatus extruder_axis_status = LOAD; - - enum PrintOption { - PRINT_OP_AUTO_RECOVERY = 0, - PRINT_OP_MAX, - }; - - class ModuleVersionInfo - { - public: - std::string name; - wxString product_name; - std::string sn; - std::string hw_ver; - std::string sw_ver; - std::string sw_new_ver; - int firmware_status; - ModuleVersionInfo() :firmware_status(0) { - - }; - - public: - bool isValid() const { return !sn.empty(); } - bool isAirPump() const { return product_name.Contains("Air Pump"); } - bool isLaszer() const { return product_name.Contains("Laser"); } - bool isCuttingModule() const { return product_name.Contains("Cutting Module"); } - }; - - enum SdcardState { - NO_SDCARD = 0, - HAS_SDCARD_NORMAL = 1, - HAS_SDCARD_ABNORMAL = 2, - HAS_SDCARD_READONLY = 3, - SDCARD_STATE_NUM = 4 - }; - +public: enum ActiveState { NotActive, Active, UpdateToDate }; - enum MappingOption { - USE_LEFT_AMS = 0, - USE_RIGHT_AMS, - USE_LEFT_EXT, - USE_RIGHT_EXT + enum PrintOption { + PRINT_OP_AUTO_RECOVERY = 0, + PRINT_OP_MAX, }; - class ExtrusionRatioInfo - { - public: - std::string name; - std::string setting_id; - float k = 0.0; - float n = 0.0; - }; +public: /* static members and functions */ static inline int m_sequence_id = START_SEQ_ID; - static std::string parse_printer_type(std::string type_str); - static std::string get_preset_printer_model_name(std::string printer_type); - static std::string get_preset_printer_thumbnail_img(std::string printer_type); - static bool is_bbl_filament(std::string tag_uid); - - typedef std::function UploadedFn; - typedef std::function UploadProgressFn; - typedef std::function ErrorFn; - typedef std::function ResultFn; /* properties */ - std::string dev_name; - std::string dev_ip; - std::string dev_id; + std::string get_dev_name() const { return dev_name; } + void set_dev_name(std::string val) { dev_name = val; } + + std::string get_dev_ip() const { return dev_ip; } + void set_dev_ip(std::string ip) { dev_ip = ip; } + + std::string get_dev_id() const { return dev_id; } + void set_dev_id(std::string val) { dev_id = val; } + bool local_use_ssl_for_mqtt { true }; bool local_use_ssl_for_ftp { true }; - bool m_busy_for_select_extruder {false}; + std::string get_ftp_folder(); + int subscribe_counter{3}; + std::string dev_connection_type; /* lan | cloud */ - std::string connection_type() { return dev_connection_type; } + std::string connection_type() const { return dev_connection_type; } + bool is_lan_mode_printer() const { return dev_connection_type == "lan"; } + bool is_cloud_mode_printer() const { return dev_connection_type == "cloud"; } std::string dev_connection_name; /* lan | eth */ - void set_dev_ip(std::string ip) {dev_ip = ip;} - std::string get_ftp_folder(); + + /*access code*/ bool has_access_right() const { return !get_access_code().empty(); } std::string get_access_code() const; - void set_access_code(std::string code, bool only_refresh = true); + + /*user access code*/ void set_user_access_code(std::string code, bool only_refresh = true); void erase_user_access_code(); std::string get_user_access_code() const; - bool is_lan_mode_printer() const; - std::string convertToIp(long long ip); //PRINTER_TYPE printer_type = PRINTER_3DPrinter_UKNOWN; std::string printer_type; /* model_id */ @@ -699,9 +189,12 @@ public: PrinterSeries get_printer_series() const; PrinterArch get_printer_arch() const; std::string get_printer_ams_type() const; - bool get_printer_is_enclosed() const; + wxString get_printer_type_display_str() const; + std::string get_auto_pa_cali_thumbnail_img_str() const; // check printer device series + std::string get_printer_series_str() const; + static bool is_series_n(const std::string& series_str); static bool is_series_p(const std::string& series_str); static bool is_series_x(const std::string& series_str); @@ -712,24 +205,18 @@ public: bool is_series_x() const; bool is_series_o() const; - std::string get_printer_series_str() const; - void reload_printer_settings(); + std::string get_printer_thumbnail_img_str() const; - std::string printer_thumbnail_img; - std::string monitor_upgrade_printer_img; - - wxString get_printer_type_display_str(); - std::string get_printer_thumbnail_img_str(); - - std::string product_name; // set by iot service, get /user/print + std::string dev_product_name; // set by iot service, get /user/print std::string bind_user_name; std::string bind_user_id; - std::string bind_state; /* free | occupied */ std::string bind_sec_link; std::string bind_ssdp_version; + std::string bind_state; /* free | occupied */ bool is_avaliable() { return bind_state == "free"; } + time_t last_alive; bool m_is_online; bool m_lan_mode_connection_state{false}; @@ -749,23 +236,12 @@ public: int m_active_state = 0; // 0 - not active, 1 - active, 2 - update-to-date bool is_tunnel_mqtt = false; - /* ams properties */ - std::map amsList; // key: ams[id], start with 0 - - int ams_cali_id = 0; - int ams_cali_stat = 0; - //AmsTray vt_tray; // virtual tray long ams_exist_bits = 0; long tray_exist_bits = 0; long tray_is_bbl_bits = 0; long tray_read_done_bits = 0; long tray_reading_bits = 0; - int ams_rfid_status = 0; - bool ams_insert_flag { false }; - bool ams_power_on_flag { false }; - bool ams_calibrate_remain_flag { false }; - bool ams_auto_switch_filament_flag { false }; bool ams_air_print_status { false }; bool ams_support_virtual_tray { true }; time_t ams_user_setting_start = 0; @@ -773,10 +249,6 @@ public: AmsStatusMain ams_status_main; int ams_status_sub; int ams_version = 0; - std::string m_ams_id; // local ams : "0" ~ "3" - std::string m_tray_id; // local tray id : "0" ~ "3" - std::string m_tray_now; // tray_now : "0" ~ "15" or "254", "255" - std::string m_tray_tar; // tray_tar : "0" ~ "15" or "255" int extrusion_cali_hold_count = 0; std::chrono::system_clock::time_point last_extrusion_cali_start_time; @@ -784,40 +256,39 @@ public: std::chrono::system_clock::time_point extrusion_cali_set_hold_start; std::string extrusion_cali_filament_name; - bool only_exist_ext_spool() { return amsList.empty(); } bool is_in_extrusion_cali(); bool is_extrusion_cali_finished(); - void _parse_tray_now(std::string tray_now); - bool is_filament_move() { return atoi(m_tray_now.c_str()) == 255 ? false : true; }; - bool is_ams_need_update; - inline bool is_ams_unload() { return m_tray_tar.compare("255") == 0; } - [[nodiscard]] bool is_ams_on_settingup() const; - - Ams* get_curr_Ams(); - AmsTray* get_curr_tray(); - AmsTray *get_ams_tray(std::string ams_id, std::string tray_id); + /* AMS */ + DevAms* get_curr_Ams(); + DevAmsTray* get_curr_tray(); + DevAmsTray* get_ams_tray(std::string ams_id, std::string tray_id);; std::string get_filament_id(std::string ams_id, std::string tray_id) const; std::string get_filament_type(const std::string& ams_id, const std::string& tray_id) const; // parse amsStatusMain and ams_status_sub void _parse_ams_status(int ams_status); - bool has_ams() { return ams_exist_bits != 0; } + + bool is_ams_unload(); bool can_unload_filament(); - bool is_support_amx_ext_mix_mapping(); + bool is_support_amx_ext_mix_mapping() const { return true;} void get_ams_colors(std::vector& ams_colors); - void parse_tray_info(int ams_id, int sot_id, AmsTray tray, FilamentInfo& result); - int ams_filament_mapping(std::vector filaments, std::vector &result, std::vector map_opt, std::vector exclude_id = std::vector(),bool nozzle_has_ams_then_ignore_ext =false); - bool is_valid_mapping_result(std::vector& result, bool check_empty_slot = false); - // exceed index start with 0 - bool is_mapping_exceed_filament(std::vector& result, int &exceed_index); - void reset_mapping_result(std::vector& result); - bool is_main_extruder_on_left() const; + + /*extruder*/ + bool is_main_extruder_on_left() const { return false; } // only means the extruder is on the left hand when extruder id is 0 bool is_multi_extruders() const; - bool need_SD_card() const; - int get_extruder_id_by_ams_id(const std::string &ams_id); + int get_extruder_id_by_ams_id(const std::string& ams_id); + + /* ams settings*/ + bool IsDetectOnInsertEnabled() const;; + //bool IsDetectOnPowerupEnabled() const { return m_enable_detect_on_powerup; } + //bool IsDetectRemainEnabled() const { return m_enable_detect_remain; } + //bool IsAutoRefillEnabled() const { return m_enable_auto_refill; } + + [[nodiscard]] bool is_nozzle_flow_type_supported() const { return is_enable_np; }; + [[nodiscard]] wxString get_nozzle_replace_url() const; /*online*/ bool online_rfid; @@ -826,52 +297,40 @@ public: int last_online_version = -1; /* temperature */ - //float nozzle_temp; - //float nozzle_temp_target; - float bed_temp; - float bed_temp_target; float chamber_temp; float chamber_temp_target; - float chamber_temp_edit_min = 0; - float chamber_temp_edit_max = 60; - long chamber_temp_switch_heat = LONG_MAX;/*default to LONG_MAX*/ float frame_temp; - /* cooling */ - int heatbreak_fan_speed = 0; - int cooling_fan_speed = 0; - int big_fan1_speed = 0; - int big_fan2_speed = 0; - uint32_t fan_gear = 0; - - /*extruder*/ - [[nodiscard]] bool is_nozzle_flow_type_supported() const { return is_enable_np; }; - [[nodiscard]] NozzleFlowType get_nozzle_flow_type(int extruder_id) const; - [[nodiscard]] const Extder& get_current_extruder() const; - [[nodiscard]] wxString get_nozzle_replace_url() const; - - //new fan data - AirDuctData m_air_duct_data; - bool is_at_heating_mode() const { return m_air_duct_data.curren_mode == AIR_DUCT_HEATING_INTERNAL_FILT; }; - void converse_to_duct(bool is_suppt_part_fun, bool is_suppt_aux_fun, bool is_suppt_cham_fun); // Convert the data to duct type to make the newand old protocols consistent - /* signals */ std::string wifi_signal; std::string link_th; std::string link_ams; bool network_wired { false }; - /* lights */ - LIGHT_EFFECT chamber_light; - LIGHT_EFFECT work_light; - std::string light_effect_str(LIGHT_EFFECT effect); - LIGHT_EFFECT light_effect_parse(std::string effect_str); + /* parts */ + DevExtderSystem* GetExtderSystem() const { return m_extder_system; } + DevNozzleSystem* GetNozzleSystem() const { return m_nozzle_system;} + + DevFilaSystem* GetFilaSystem() const { return m_fila_system;} + bool HasAms() const; + + DevLamp* GetLamp() const { return m_lamp; } + DevFan* GetFan() const { return m_fan; } + DevBed * GetBed() const { return m_bed; }; + DevStorage *GetStorage() const { return m_storage; } + + DevCtrl* GetCtrl() const { return m_ctrl; } /* ctrl*/ + DevHMS* GetHMS() const { return m_hms_system; } /* hms*/ + DevConfig* GetConfig() const { return m_config; } /* config*/ + + DevPrintOptions* GetPrintOptions() const { return m_print_options; } /* print options */ + DevPrintingSpeedLevel GetPrintingSpeedLevel() const; /* print speed */ /* upgrade */ bool upgrade_force_upgrade { false }; bool upgrade_new_version { false }; bool upgrade_consistency_request { false }; - int upgrade_display_state = 0; // 0 : upgrade unavailable, 1: upgrade idle, 2: upgrading, 3: upgrade_finished + DevFirmwareUpgradingState upgrade_display_state; int upgrade_display_hold_count = 0; PrinterFirmwareType firmware_type; // engineer|production PrinterFirmwareType lifecycle { PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION }; @@ -884,12 +343,11 @@ public: std::string ahb_new_version_number; int get_version_retry = 0; - ModuleVersionInfo air_pump_version_info; - ModuleVersionInfo laser_version_info; - ModuleVersionInfo cutting_module_version_info; - std::map module_vers; - std::map new_ver_list; - std::map extrusion_ratio_map; + DevFirmwareVersionInfo air_pump_version_info; + DevFirmwareVersionInfo laser_version_info; + DevFirmwareVersionInfo cutting_module_version_info; + std::map module_vers; + std::map new_ver_list; bool m_new_ver_list_exist = false; int upgrade_err_code = 0; std::vector firmware_list; @@ -903,14 +361,14 @@ public: bool check_version_valid(); wxString get_upgrade_result_str(int upgrade_err_code); // key: ams_id start as 0,1,2,3 - std::map get_ams_version(); + std::map get_ams_version(); void clear_version_info(); - void store_version_info(const ModuleVersionInfo& info); + void store_version_info(const DevFirmwareVersionInfo& info); /* printing */ std::string print_type; - float nozzle { 0.0f }; // default is 0.0f as initial value + //float nozzle { 0.0f }; // default is 0.0f as initial value bool is_220V_voltage { false }; int mc_print_stage; @@ -923,6 +381,7 @@ public: int home_flag; int hw_switch_state; bool is_system_printing(); + int print_error; static std::string get_error_code_str(int error_code); std::string get_print_error_str() const { return MachineObject::get_error_code_str(this->print_error); } @@ -936,6 +395,7 @@ public: bool nozzle_blob_detection_enabled{ false }; time_t nozzle_blob_detection_hold_start = 0; + bool is_support_new_auto_cali_method{true}; int last_cali_version = -1; int cali_version = -1; float cali_selected_nozzle_dia { 0.0 }; @@ -984,8 +444,8 @@ public: bool is_filament_at_extruder(); wxString get_curr_stage(); - // return curr stage index of stage list int get_curr_stage_idx(); + bool is_in_calibration(); bool is_calibration_running(); bool is_calibration_done(); @@ -997,15 +457,10 @@ public: std::string print_status; /* enum string: FINISH, SLICING, RUNNING, PAUSE, INIT, FAILED */ int queue_number = 0; std::string iot_print_status; /* iot */ - PrintingSpeedLevel printing_speed_lvl; int printing_speed_mag = 100; - PrintingSpeedLevel _parse_printing_speed_lvl(int lvl); int get_bed_temperature_limit(); bool is_filament_installed(); - /*stat*/ - bool m_lamp_close_recheck = false; - /* camera */ bool has_ipcam { false }; bool camera_recording { false }; @@ -1067,9 +522,6 @@ public: bool file_model_download{false}; bool virtual_camera{false}; - int nozzle_setting_hold_count = 0; - - //refine printer bool xcam_ai_monitoring{ false }; bool xcam_disable_ai_detection_display{false}; bool xcam_spaghetti_detection{false}; @@ -1092,32 +544,22 @@ public: time_t xcam_auto_recovery_hold_start = 0; time_t xcam_prompt_sound_hold_start = 0; time_t xcam_filament_tangle_detect_hold_start = 0; - int nozzle_selected_count = 0; - bool flag_update_nozzle = {true}; /*target from Studio-SwitchBoard, default to INVALID_NOZZLE_ID if no switching control from PC*/ - int targ_nozzle_id_from_pc = INVALID_NOZZLE_ID; + int targ_nozzle_id_from_pc = INVALID_EXTRUDER_ID; //supported features - bool is_support_chamber_edit{false}; - bool is_support_extrusion_cali{false}; - bool is_support_first_layer_inspect{false}; - bool is_support_ai_monitoring {false}; - bool is_support_lidar_calibration {false};// the lidar calibration for 3D Studio bool is_support_build_plate_marker_detect{false}; PlateMakerDectect m_plate_maker_detect_type{ POS_CHECK }; + /*PA flow calibration is using in sending print*/ bool is_support_pa_calibration{false}; bool is_support_flow_calibration{false}; - bool is_support_auto_flow_calibration{false};/*The flag is used to distinguish auto/on/off or on/off */ - bool is_support_print_without_sd{false}; - bool is_support_print_all{false}; + bool is_support_send_to_sdcard {false}; - bool is_support_aux_fan {false}; - bool is_support_chamber_fan{false}; + bool is_support_filament_backup{false}; - bool is_support_show_filament_backup{false};/*the filament is not supported shown in some previous hardware*/ bool is_support_timelapse{false}; bool is_support_update_remain{false}; int is_support_bed_leveling = 0;/*0: false; 1; on/off 2: auto/on/off*/ @@ -1131,11 +573,8 @@ public: bool is_support_mqtt_alive {false}; bool is_support_tunnel_mqtt{false}; bool is_support_motor_noise_cali{false}; - bool is_support_nozzle_offset_cali{ false }; - bool is_support_high_tempbed_cali{ false }; bool is_support_wait_sending_finish{false}; bool is_support_user_preset{false}; - //bool is_support_p1s_plus{false}; bool is_support_nozzle_blob_detection{false}; bool is_support_air_print_detection{false}; bool is_support_agora{false}; @@ -1161,12 +600,7 @@ public: /*temp temp range*/ std::vector bed_temp_range; - /* sdcard */ - MachineObject::SdcardState sdcard_state { NO_SDCARD }; - MachineObject::SdcardState get_sdcard_state(); - /* HMS */ - std::vector hms_list; /* machine mqtt apis */ int connect(bool use_openssl = true); @@ -1189,7 +623,6 @@ public: int jobState_ = 0; /* key: sequence id, value: callback */ - std::map m_callback_list; bool is_makeworld_subtask(); @@ -1202,7 +635,7 @@ public: int gcode_file_prepare_percent = 0; BBLSubTask* subtask_; BBLModelTask *model_task { nullptr }; - RatingInfo* rating_info { nullptr }; + DevPrintTaskRatingInfo* rating_info { nullptr }; int request_model_result = 0; bool get_model_mall_result_need_retry = false; @@ -1217,9 +650,6 @@ public: int get_liveview_remote(); int get_file_remote(); - MachineObject(NetworkAgent* agent, std::string name, std::string id, std::string ip); - ~MachineObject(); - std::string parse_version(); void parse_version_func(); bool is_studio_cmd(int seq); @@ -1236,7 +666,6 @@ public: int command_set_printer_nozzle(std::string nozzle_type, float diameter); int command_set_printer_nozzle2(int id, std::string nozzle_type, float diameter); int command_get_access_code(); - int command_select_extruder(int id); /* command upgrade */ int command_upgrade_confirm(); @@ -1249,9 +678,7 @@ public: int command_auto_leveling(); int command_go_home(); int command_go_home2(); - int command_control_fan(int fan_type, int val); // Old protocol - int command_control_fan_new(int fan_id, int val, const CommandCallBack &cb); // New protocol - int command_control_air_duct(int mode_id, int submode, const CommandCallBack& cb); + int command_task_abort(); /* cancelled the job_id */ int command_task_cancel(std::string job_id); @@ -1284,18 +711,13 @@ public: int command_ams_refresh_rfid(std::string tray_id); int command_ams_refresh_rfid2(int ams_id, int slot_id); int command_ams_control(std::string action); - int command_ams_drying_stop(); - - int command_set_chamber_light(LIGHT_EFFECT effect, int on_time = 500, int off_time = 500, int loops = 1, int interval = 1000); - int command_set_chamber_light2(LIGHT_EFFECT effect, int on_time = 500, int off_time = 500, int loops = 1, int interval = 1000); - int command_set_work_light(LIGHT_EFFECT effect, int on_time = 500, int off_time = 500, int loops = 1, int interval = 1000); int command_start_extrusion_cali(int tray_index, int nozzle_temp, int bed_temp, float max_volumetric_speed, std::string setting_id = ""); int command_stop_extrusion_cali(); int command_extrusion_cali_set(int tray_index, std::string setting_id, std::string name, float k, float n, int bed_temp = -1, int nozzle_temp = -1, float max_volumetric_speed = -1); // set printing speed - int command_set_printing_speed(PrintingSpeedLevel lvl); + int command_set_printing_speed(DevPrintingSpeedLevel lvl); //set prompt sound int command_set_prompt_sound(bool prompt_sound); @@ -1350,7 +772,7 @@ public: int command_xcam_control_filament_tangle_detect(bool on_off); /* common apis */ - inline bool is_local() { return !dev_ip.empty(); } + inline bool is_local() { return !get_dev_ip().empty(); } void set_bind_status(std::string status); std::string get_bind_str(); bool can_print(); @@ -1380,13 +802,14 @@ public: /* Msg for display MsgFn */ typedef std::function MsgFn; - int publish_json(std::string json_str, int qos = 0, int flag = 0); + int publish_json(const json& json_item, int qos = 0, int flag = 0) ; + int publish_json(const std::string& json_str, int qos = 0, int flag = 0) = delete; int cloud_publish_json(std::string json_str, int qos = 0, int flag = 0); int local_publish_json(std::string json_str, int qos = 0, int flag = 0); int parse_json(std::string tunnel, std::string payload, bool key_filed_only = false); int publish_gcode(std::string gcode_str); - std::string setting_id_to_type(std::string setting_id, std::string tray_type); + static std::string setting_id_to_type(std::string setting_id, std::string tray_type); BBLSubTask* get_subtask(); BBLModelTask* get_modeltask(); void set_modeltask(BBLModelTask* task); @@ -1400,27 +823,22 @@ public: bool m_firmware_thread_started { false }; void get_firmware_info(); bool is_firmware_info_valid(); - std::string get_string_from_fantype(int type); /*for more extruder*/ bool is_enable_np{ false }; bool is_enable_ams_np{ false }; - ExtderData m_extder_data; - NozzleData m_nozzle_data; - /*vi slot data*/ - std::vector vt_slot; - AmsTray parse_vt_tray(json vtray); + std::vector vt_slot; + DevAmsTray parse_vt_tray(json vtray); /*get ams slot info*/ bool contains_tray(const std::string &ams_id, const std::string &tray_id) const; - AmsTray get_tray(const std::string &ams_id, const std::string &tray_id) const;/*use contains_tray() check first*/ + DevAmsTray get_tray(const std::string &ams_id, const std::string &tray_id) const;/*use contains_tray() check first*/ /*for parse new info*/ bool check_enable_np(const json& print) const; void parse_new_info(json print); - bool is_nozzle_data_invalid(); int get_flag_bits(std::string str, int start, int count = 1) const; int get_flag_bits(int num, int start, int count = 1, int base = 10) const; @@ -1436,7 +854,7 @@ public: void update_printer_preset_name(); void check_ams_filament_valid(); - int command_handle_response(const json &response); + /* xcam door open check*/ bool support_door_open_check() const { return is_support_door_open_check;}; @@ -1444,7 +862,6 @@ public: void command_set_door_open_check(DoorOpenCheckState state); /* xcam save remove print file to local*/ - bool support_save_remote_print_file_to_storage() const { return is_support_save_remote_print_file_to_storage; }; bool get_save_remote_print_file_to_storage() const { return xcam__save_remote_print_file_to_storage; }; void command_set_save_remote_print_file_to_storage(bool save); @@ -1456,193 +873,13 @@ private: time_t xcam_door_open_check_start_time = 0; /* xcam save remove print file to local*/ - bool is_support_save_remote_print_file_to_storage = false; bool xcam__save_remote_print_file_to_storage = false; time_t xcam__save_remote_print_file_to_storage_start_time = 0; }; -class DeviceManagerRefresher; -class DeviceManager -{ -private: - NetworkAgent* m_agent { nullptr }; - DeviceManagerRefresher* m_refresher{nullptr}; - -public: - static bool EnableMultiMachine; - - DeviceManager(NetworkAgent* agent = nullptr); - ~DeviceManager(); - NetworkAgent *get_agent() const{ return m_agent; } - void set_agent(NetworkAgent* agent); - - std::mutex listMutex; - std::string selected_machine; /* dev_id */ - std::string local_selected_machine; /* dev_id */ - std::map localMachineList; /* dev_id -> MachineObject*, localMachine SSDP */ - std::map userMachineList; /* dev_id -> MachineObject* cloudMachine of User */ - - void start_refresher(); - void stop_refresher(); - - void keep_alive(); - void check_pushing(); - - static float nozzle_diameter_conver(int diame); - static int nozzle_diameter_conver(float diame); - static std::string nozzle_type_conver(int type); - static int nozzle_type_conver(std::string& type); - - MachineObject* get_default_machine(); - MachineObject* get_local_selected_machine(); - MachineObject* get_local_machine(std::string dev_id); - MachineObject* get_user_machine(std::string dev_id); - MachineObject* get_my_machine(std::string dev_id); - void erase_user_machine(std::string dev_id); - void clean_user_info(); - void reload_printer_settings(); - - bool set_selected_machine(std::string dev_id); - MachineObject* get_selected_machine(); - - void subscribe_device_list(std::vector dev_list); - - /* return machine has access code and user machine if login*/ - std::map get_my_machine_list(); - std::map get_my_cloud_machine_list(); - std::string get_first_online_user_machine(); - void modify_device_name(std::string dev_id, std::string dev_name); - void update_user_machine_list_info(); - void parse_user_print_info(std::string body); - - /* create machine or update machine properties */ - void on_machine_alive(std::string json_str); - MachineObject* insert_local_device(const BBLocalMachine& machine, std::string connection_type, std::string bind_state, std::string version, std::string access_code); - /* disconnect all machine connections */ - void disconnect_all(); - int query_bind_status(std::string &msg); - - // get alive machine - std::map get_local_machine_list(); - void load_last_machine(); - - std::vector subscribe_list_cache; - - static void set_key_field_parsing(bool enable) { DeviceManager::key_field_only = enable; } - - static bool key_field_only; - static json function_table; - static json filaments_blacklist; - static json filaments_printable_blacklist; - - template - static T get_value_from_config(std::string type_str, std::string item){ - std::string config_file = Slic3r::resources_dir() + "/printers/" + type_str + ".json"; - boost::nowide::ifstream json_file(config_file.c_str()); - try { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const& printer = jj["00.00.00.00"]; - if (printer.contains(item)) { - return printer[item].get(); - } - } - } - } - catch (...) {} - return T(); - } - - static json get_json_from_config(const std::string& type_str, const std::string& key1, const std::string& key2 = std::string()) { - std::string config_file = Slic3r::resources_dir() + "/printers/" + type_str + ".json"; - boost::nowide::ifstream json_file(config_file.c_str()); - try { - json jj; - if (json_file.is_open()) { - json_file >> jj; - if (jj.contains("00.00.00.00")) { - json const& printer = jj["00.00.00.00"]; - if (printer.contains(key1)) { - json const& key1_item = printer[key1]; - if (key2.empty()) { - return key1_item; - } - - if (key1_item.contains(key2)) { - return key1_item[key2]; - } - } - } - } - } - catch (...) {} - return json(); - } - - static std::string parse_printer_type(std::string type_str); - static std::string get_printer_display_name(std::string type_str); - static std::string get_printer_thumbnail_img(std::string type_str); - static std::string get_printer_ams_type(std::string type_str); - static std::string get_printer_series(std::string type_str); - static std::string get_printer_diagram_img(std::string type_str); - static std::string get_printer_ams_img(std::string type_str); - static std::string get_printer_ext_img(std::string type_str, int pos); - static PrinterArch get_printer_arch(std::string type_str); - static std::string get_ftp_folder(std::string type_str); - static bool get_printer_is_enclosed(std::string type_str); - static bool get_printer_can_set_nozzle(std::string type_str);// can set nozzle from studio - static bool load_filaments_blacklist_config(); - static bool support_wrapping_detection(const std::string& type_str); - - static string get_fan_text(const std::string& type_str, const std::string& key); - - static std::vector get_resolution_supported(std::string type_str); - static std::vector get_compatible_machine(std::string type_str); - static std::vector get_unsupport_auto_cali_filaments(std::string type_str); - static void check_filaments_in_blacklist(std::string model_id, std::string tag_vendor, std::string tag_type, const std::string& filament_id, int ams_id, int slot_id, std::string tag_name, bool &in_blacklist, std::string &ac, wxString &info); - static void check_filaments_in_blacklist_url(std::string model_id, std::string tag_vendor, std::string tag_type, const std::string& filament_id, int ams_id, int slot_id, std::string tag_name, bool& in_blacklist, std::string& ac, wxString& info, wxString& wiki_url); - static boost::bimaps::bimap get_all_model_id_with_name(); - static std::string load_gcode(std::string type_str, std::string gcode_file); - static bool is_virtual_slot(int ams_id); - static std::string get_filament_name_from_ams(int ams_id, int slot_id); - static void update_local_machine(const MachineObject& m); - -private: - void OnMachineBindStateChanged(MachineObject* obj, const std::string &new_state); - void OnSelectedMachineLost(); -}; - -class DeviceManagerRefresher : public wxObject -{ - wxTimer *m_timer{nullptr}; - int m_timer_interval_msec = 1000; - - DeviceManager *m_manager{nullptr}; - -public: - DeviceManagerRefresher(DeviceManager* manger); - ~DeviceManagerRefresher(); - -public: - void Start() { m_timer->Start(m_timer_interval_msec); } - void Stop() { m_timer->Stop(); } - -protected: - virtual void on_timer(wxTimerEvent &event); -}; - - // change the opacity void change_the_opacity(wxColour& colour); - - -class JsonValParser -{ -public: - static std::string get_longlong_val(const json& j); -}; +wxString get_stage_string(int stage); }; // namespace Slic3r diff --git a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp index f6b44c1ada..b752d3cfec 100644 --- a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp +++ b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp @@ -1,6 +1,6 @@ //**********************************************************/ /* File: uiAmsHumidityPopup.cpp -* Description: The popup with Ams Humidity +* Description: The popup with DevAms Humidity * * \n class uiAmsHumidityPopup //**********************************************************/ diff --git a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h index f5a2bc3037..0626175662 100644 --- a/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h +++ b/src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h @@ -1,6 +1,6 @@ //**********************************************************/ /* File: uiAmsHumidityPopup.h -* Description: The popup with Ams Humidity +* Description: The popup with DevAms Humidity * * \n class uiAmsHumidityPopup //**********************************************************/ @@ -28,7 +28,7 @@ struct uiAmsHumidityInfo }; /// -/// Note: The popup of Ams Humidity with percentage and dry time +/// Note: The popup of DevAms Humidity with percentage and dry time /// Author: xin.zhang /// class uiAmsPercentHumidityDryPopup : public wxDialog diff --git a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp index 3d0feac740..d237ad1f2b 100644 --- a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp +++ b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp @@ -28,7 +28,7 @@ uiDeviceUpdateVersion::uiDeviceUpdateVersion(wxWindow* parent, CreateWidgets(); } -void uiDeviceUpdateVersion::UpdateInfo(const MachineObject::ModuleVersionInfo& info) +void uiDeviceUpdateVersion::UpdateInfo(const DevFirmwareVersionInfo& info) { SetName(I18N::translate(info.product_name)); SetSerial(info.sn); diff --git a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h index a4ffc52bb5..100280db62 100644 --- a/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h +++ b/src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h @@ -29,7 +29,7 @@ public: ~uiDeviceUpdateVersion() = default; public: - void UpdateInfo(const MachineObject::ModuleVersionInfo& info); + void UpdateInfo(const DevFirmwareVersionInfo& info); private: void CreateWidgets(); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 9f058f9083..9061184188 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -77,6 +77,8 @@ #include "EncodedFilament.hpp" #include "GeneratedConfig.hpp" +#include "DeviceCore/DevManager.h" + #include "../Utils/PresetUpdater.hpp" #include "../Utils/PrintHost.hpp" #include "../Utils/Process.hpp" @@ -1030,8 +1032,6 @@ void GUI_App::post_init() mainframe->refresh_plugin_tips(); }); - DeviceManager::load_filaments_blacklist_config(); - // remove old log files over LOG_FILES_MAX_NUM std::string log_addr = data_dir(); if (!log_addr.empty()) { @@ -1725,8 +1725,8 @@ void GUI_App::init_networking_callbacks() obj->erase_user_access_code(); obj->command_get_access_code(); if (m_agent) - m_agent->install_device_cert(obj->dev_id, obj->is_lan_mode_printer()); - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + m_agent->install_device_cert(obj->get_dev_id(), obj->is_lan_mode_printer()); + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); } }); }); @@ -1764,8 +1764,8 @@ void GUI_App::init_networking_callbacks() obj->command_request_push_all(true); obj->command_get_version(); event.SetInt(0); - event.SetString(obj->dev_id); - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + event.SetString(obj->get_dev_id()); + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); } else if (state == ConnectStatus::ConnectStatusFailed) { // Orca: avoid showing same error message multiple times until next connection attempt. const auto already_disconnected = m_device_manager->selected_machine.empty(); @@ -1778,7 +1778,7 @@ void GUI_App::init_networking_callbacks() text = wxString::Format(_L("Incorrect password")); wxGetApp().show_dialog(text); } else { - text = wxString::Format(_L("Connect %s failed! [SN:%s, code=%s]"), from_u8(obj->dev_name), obj->dev_id, msg); + text = wxString::Format(_L("Connect %s failed! [SN:%s, code=%s]"), from_u8(obj->get_dev_name()), obj->get_dev_id(), msg); wxGetApp().show_dialog(text); } } @@ -1797,15 +1797,15 @@ void GUI_App::init_networking_callbacks() else { if (state == ConnectStatus::ConnectStatusOk) { event.SetInt(1); - event.SetString(obj->dev_id); + event.SetString(obj->get_dev_id()); } else if(msg == "5") { event.SetInt(5); - event.SetString(obj->dev_id); + event.SetString(obj->get_dev_id()); } else { event.SetInt(-2); - event.SetString(obj->dev_id); + event.SetString(obj->get_dev_id()); } } } @@ -1829,7 +1829,8 @@ void GUI_App::init_networking_callbacks() if (obj) { auto sel = this->m_device_manager->get_selected_machine(); - if (sel && sel->dev_id == dev_id) { + if (sel && sel->get_dev_id() == dev_id) + { obj->parse_json("cloud", msg); } else { @@ -1837,9 +1838,8 @@ void GUI_App::init_networking_callbacks() } - if ((sel == obj || sel == nullptr) && obj->is_ams_need_update) { - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); - obj->is_ams_need_update = false; + if (sel == obj || sel == nullptr) { + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); } } @@ -1881,9 +1881,9 @@ void GUI_App::init_networking_callbacks() MachineObject* obj = m_device_manager->get_my_machine(dev_id); if (obj) { - obj->parse_json("lan", msg, DeviceManager::key_field_only); - if (this->m_device_manager->get_selected_machine() == obj && obj->is_ams_need_update) { - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + obj->parse_json("lan", msg); + if (this->m_device_manager->get_selected_machine() == obj) { + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); } } @@ -1936,11 +1936,16 @@ bool GUI_App::is_blocking_printing(MachineObject *obj_) target_model = obj_->printer_type; } + if (!obj_) + { + return false; + } + PresetBundle *preset_bundle = wxGetApp().preset_bundle; std::string source_model = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); if (source_model != target_model) { - std::vector compatible_machine = dev->get_compatible_machine(target_model); + std::vector compatible_machine = obj_->get_compatible_machine(); vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); if (it == compatible_machine.end()) { return true; @@ -2195,10 +2200,10 @@ void GUI_App::on_start_subscribe_again(std::string dev_id) MachineObject* obj = dev->get_selected_machine(); if (!obj) return; - if ( (dev_id == obj->dev_id) && obj->is_connecting() && obj->subscribe_counter > 0) { + if ( (dev_id == obj->get_dev_id()) && obj->is_connecting() && obj->subscribe_counter > 0) { obj->subscribe_counter--; if(wxGetApp().getAgent()) wxGetApp().getAgent()->set_user_selected_machine(dev_id); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": dev_id=" << obj->dev_id; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": dev_id=" << obj->get_dev_id(); } }); start_subscribe_timer->Start(5000, wxTIMER_ONE_SHOT); @@ -3006,11 +3011,10 @@ __retry: m_task_manager = new Slic3r::TaskManager(m_agent); m_task_manager->start(); } - m_agent->enable_multi_machine(true); - DeviceManager::EnableMultiMachine = true; + + m_device_manager->EnableMultiMachine(true); } else { - m_agent->enable_multi_machine(false); - DeviceManager::EnableMultiMachine = false; + m_device_manager->EnableMultiMachine(false); } //BBS set config dir @@ -5906,10 +5910,10 @@ bool GUI_App::show_modal_ip_address_enter_dialog(bool input_sn, wxString title) BOOST_LOG_TRIVIAL(info) << "User enter IP address is " << ip_address; if (!ip_address.empty()) { - wxGetApp().app_config->set_str("ip_address", obj->dev_id, ip_address.ToStdString()); + wxGetApp().app_config->set_str("ip_address", obj->get_dev_id(), ip_address.ToStdString()); wxGetApp().app_config->save(); - obj->dev_ip = ip_address.ToStdString(); + obj->set_dev_ip(ip_address.ToStdString()); obj->set_user_access_code(access_code.ToStdString()); } } diff --git a/src/slic3r/GUI/HMS.cpp b/src/slic3r/GUI/HMS.cpp index b20d0ac536..1b2b632b2b 100644 --- a/src/slic3r/GUI/HMS.cpp +++ b/src/slic3r/GUI/HMS.cpp @@ -1,5 +1,8 @@ #include "HMS.hpp" + #include "DeviceManager.hpp" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevUtil.h" #include @@ -34,7 +37,7 @@ int get_hms_info_version(std::string& version) try { json j = json::parse(body); if (j.contains("ver")) { - version = JsonValParser::get_longlong_val(j["ver"]); + version = DevJsonValParser::get_longlong_val(j["ver"]); } } catch (...) { ; @@ -89,7 +92,7 @@ int HMSQuery::download_hms_related(const std::string& hms_type, const std::strin return; } - const std::string& remote_ver = JsonValParser::get_longlong_val(j["ver"]); + const std::string& remote_ver = DevJsonValParser::get_longlong_val(j["ver"]); if (remote_ver <= local_version) { return; @@ -202,10 +205,10 @@ int HMSQuery::load_from_local(const std::string& hms_type, const std::string& de } if (j.contains("version")) { - load_version = JsonValParser::get_longlong_val(j["version"]); + load_version = DevJsonValParser::get_longlong_val(j["version"]); } else if (j.contains("ver")) { - load_version = JsonValParser::get_longlong_val(j["ver"]); + load_version = DevJsonValParser::get_longlong_val(j["ver"]); } else { @@ -307,7 +310,7 @@ string HMSQuery::get_dev_id_type(const MachineObject* obj) const { if (obj) { - return obj->dev_id.substr(0, 3); + return obj->get_dev_id().substr(0, 3); } return string(); @@ -640,11 +643,11 @@ std::string get_hms_wiki_url(std::string error_code) MachineObject* obj = dev->get_selected_machine(); if (!obj) return url; - if (!obj->dev_id.empty()) { + if (!obj->get_dev_id().empty()) { url = (boost::format("https://%1%/index.php?e=%2%&d=%3%&s=device_hms&lang=%4%") % hms_host % error_code - % obj->dev_id + % obj->get_dev_id() % lang_code).str(); } return url; diff --git a/src/slic3r/GUI/HMSPanel.cpp b/src/slic3r/GUI/HMSPanel.cpp index 8494faa834..fe99d551e3 100644 --- a/src/slic3r/GUI/HMSPanel.cpp +++ b/src/slic3r/GUI/HMSPanel.cpp @@ -16,7 +16,7 @@ namespace GUI { wxDEFINE_EVENT(EVT_ALREADY_READ_HMS, wxCommandEvent); -HMSNotifyItem::HMSNotifyItem(const std::string& dev_id, wxWindow *parent, HMSItem& item) +HMSNotifyItem::HMSNotifyItem(const std::string& dev_id, wxWindow *parent, DevHMSItem& item) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL) , m_hms_item(item) , dev_id(dev_id) @@ -140,7 +140,7 @@ void HMSNotifyItem::init_bitmaps() { wxBitmap & HMSNotifyItem::get_notify_bitmap() { - switch (m_hms_item.msg_level) { + switch (m_hms_item.get_level()) { case (HMS_FATAL): return m_img_notify_lv1; break; @@ -153,8 +153,6 @@ wxBitmap & HMSNotifyItem::get_notify_bitmap() case (HMS_INFO): //return m_img_notify_lv4; break; - case (HMS_UNKNOWN): - case (HMS_MSG_LEVEL_MAX): default: break; } return wxNullBitmap; @@ -187,7 +185,7 @@ HMSPanel::~HMSPanel() { ; } -void HMSPanel::append_hms_panel(const std::string& dev_id, HMSItem& item) { +void HMSPanel::append_hms_panel(const std::string& dev_id, DevHMSItem& item) { wxString msg = wxGetApp().get_hms_query()->query_hms_msg(dev_id, item.get_long_error_code()); if (!msg.empty()) { HMSNotifyItem *notify_item = new HMSNotifyItem(dev_id, m_scrolledWindow, item); @@ -214,7 +212,7 @@ void HMSPanel::update(MachineObject *obj) this->Freeze(); delete_hms_panels(); wxString hms_text; - for (auto item : obj->hms_list) { + for (auto item : obj->GetHMS()->GetHMSItems()) { if (wxGetApp().get_hms_query()) { auto key = item.get_long_error_code(); @@ -223,14 +221,14 @@ void HMSPanel::update(MachineObject *obj) temp_hms_list[key] = item; } - append_hms_panel(obj->dev_id, item); + append_hms_panel(obj->get_dev_id(), item); } } for (auto it = temp_hms_list.begin(); it != temp_hms_list.end(); ) { auto key = it->second.get_long_error_code(); bool inr = false; - for (auto hms : obj->hms_list) { + for (auto hms : obj->GetHMS()->GetHMSItems()) { if (hms.get_long_error_code() == key) { inr = true; break; diff --git a/src/slic3r/GUI/HMSPanel.hpp b/src/slic3r/GUI/HMSPanel.hpp index 098fb2293b..49910590b8 100644 --- a/src/slic3r/GUI/HMSPanel.hpp +++ b/src/slic3r/GUI/HMSPanel.hpp @@ -9,12 +9,14 @@ #include #include +#include "DeviceCore/DevHMS.h" + namespace Slic3r { namespace GUI { class HMSNotifyItem : public wxPanel { - HMSItem & m_hms_item; + DevHMSItem & m_hms_item; std::string m_url; std::string dev_id; std::string long_error_code; @@ -35,7 +37,7 @@ class HMSNotifyItem : public wxPanel wxBitmap & get_notify_bitmap(); public: - HMSNotifyItem(const std::string& dev_id, wxWindow *parent, HMSItem& item); + HMSNotifyItem(const std::string& dev_id, wxWindow *parent, DevHMSItem& item); ~HMSNotifyItem(); void msw_rescale() {} @@ -50,7 +52,7 @@ protected: int last_status; - void append_hms_panel(const std::string& dev_id, HMSItem &item); + void append_hms_panel(const std::string& dev_id, DevHMSItem &item); void delete_hms_panels(); @@ -69,7 +71,7 @@ public: void clear_hms_tag(); MachineObject *obj { nullptr }; - std::map temp_hms_list; + std::map temp_hms_list; }; wxDECLARE_EVENT(EVT_ALREADY_READ_HMS, wxCommandEvent); diff --git a/src/slic3r/GUI/Jobs/BindJob.cpp b/src/slic3r/GUI/Jobs/BindJob.cpp index deee506ca1..4e7b8821bd 100644 --- a/src/slic3r/GUI/Jobs/BindJob.cpp +++ b/src/slic3r/GUI/Jobs/BindJob.cpp @@ -4,6 +4,8 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index ea0308d4a9..3aa54f79b9 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -9,6 +9,9 @@ #include "slic3r/GUI/format.hpp" #include "bambu_networking.hpp" +#include "slic3r/GUI/DeviceCore/DevManager.h" +#include "slic3r/GUI/DeviceCore/DevUtil.h" + namespace Slic3r { namespace GUI { @@ -459,7 +462,7 @@ void PrintJob::process(Ctl &ctl) try { std::ignore = job_info_j.parse(job_info); if (job_info_j.contains("job_id")) { - curr_job_id = JsonValParser::get_longlong_val(job_info_j["job_id"]); + curr_job_id = DevJsonValParser::get_longlong_val(job_info_j["job_id"]); } BOOST_LOG_TRIVIAL(trace) << "print_job: curr_obj_id=" << curr_job_id; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 2a3dc7c866..becb290162 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -64,6 +64,8 @@ #include "DailyTips.hpp" #include "FilamentMapDialog.hpp" +#include "DeviceCore/DevManager.h" + #ifdef _WIN32 #include #include diff --git a/src/slic3r/GUI/MediaFilePanel.cpp b/src/slic3r/GUI/MediaFilePanel.cpp index c498221198..c497231082 100644 --- a/src/slic3r/GUI/MediaFilePanel.cpp +++ b/src/slic3r/GUI/MediaFilePanel.cpp @@ -11,6 +11,7 @@ #include "Widgets/ProgressDialog.hpp" #include #include +#include "DeviceCore/DevStorage.h" #ifdef __WXMSW__ #include @@ -216,10 +217,10 @@ MediaFilePanel::~MediaFilePanel() void MediaFilePanel::UpdateByObj(MachineObject* obj) { bool sdcard_state_changed = false; - std::string machine = obj ? obj->dev_id : ""; + std::string machine = obj ? obj->get_dev_id() : ""; if (obj) { m_lan_mode = obj->is_lan_mode_printer(); - m_lan_ip = obj->dev_ip; + m_lan_ip = obj->get_dev_ip(); m_lan_passwd = obj->get_access_code(); m_dev_ver = obj->get_ota_version(); m_device_busy = obj->is_camera_busy_off(); @@ -227,8 +228,8 @@ void MediaFilePanel::UpdateByObj(MachineObject* obj) m_remote_proto = obj->get_file_remote(); m_model_download_support = obj->file_model_download; - if (m_sdcard_exist != (obj->sdcard_state == MachineObject::SdcardState::HAS_SDCARD_NORMAL)) { - m_sdcard_exist = obj->sdcard_state == MachineObject::SdcardState::HAS_SDCARD_NORMAL; + if (m_sdcard_exist != (obj->GetStorage()->get_sdcard_state() == DevStorage::HAS_SDCARD_NORMAL)) { + m_sdcard_exist = obj->GetStorage()->get_sdcard_state() == DevStorage::HAS_SDCARD_NORMAL; sdcard_state_changed = true; } } else { diff --git a/src/slic3r/GUI/MediaFilePanel.h b/src/slic3r/GUI/MediaFilePanel.h index 92081d4271..72fbc96a13 100644 --- a/src/slic3r/GUI/MediaFilePanel.h +++ b/src/slic3r/GUI/MediaFilePanel.h @@ -33,7 +33,7 @@ class MediaFilePanel : public wxPanel { public: MediaFilePanel(wxWindow * parent); - + ~MediaFilePanel(); void UpdateByObj(MachineObject * obj); diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 04c4f6b3aa..8b752b5716 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -144,19 +144,19 @@ MediaPlayCtrl::~MediaPlayCtrl() void MediaPlayCtrl::SetMachineObject(MachineObject* obj) { - std::string machine = obj ? obj->dev_id : ""; + std::string machine = obj ? obj->get_dev_id() : ""; if (obj) { m_camera_exists = obj->has_ipcam; m_dev_ver = obj->get_ota_version(); m_lan_mode = obj->is_lan_mode_printer(); m_lan_proto = obj->liveview_local; m_remote_proto = obj->get_liveview_remote(); - m_lan_ip = obj->dev_ip; + m_lan_ip = obj->get_dev_ip(); m_lan_passwd = obj->get_access_code(); m_device_busy = obj->is_camera_busy_off(); m_tutk_state = obj->tutk_state; - if (DeviceManager::get_printer_series(obj->printer_type) == "series_o" && NetworkAgent::use_legacy_network) { + if (DevPrinterConfigUtil::get_printer_series_str(obj->printer_type) == "series_o" && NetworkAgent::use_legacy_network) { // Legacy plugin cannot support remote play for H2D, force using local mode m_remote_proto = MachineObject::LVR_None; } diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index 5e9ebf35e3..59f8ec1267 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -29,6 +29,8 @@ #include "Plater.hpp" #include "BindDialog.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -126,7 +128,7 @@ MonitorPanel::MonitorPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos, auto key = e.GetString().ToStdString(); auto iter = m_hms_panel->temp_hms_list.find(key); if (iter != m_hms_panel->temp_hms_list.end()) { - m_hms_panel->temp_hms_list[key].already_read = true; + m_hms_panel->temp_hms_list[key].set_read(); } update_hms_tag(); @@ -164,7 +166,7 @@ void MonitorPanel::init_timer() if (!dev) return; MachineObject *obj_ = dev->get_selected_machine(); if (obj_) - GUI::wxGetApp().sidebar().load_ams_list(obj_->dev_id, obj_); + GUI::wxGetApp().sidebar().load_ams_list(obj_->get_dev_id(), obj_); } void MonitorPanel::init_tabpanel() @@ -277,7 +279,7 @@ void MonitorPanel::on_select_printer(wxCommandEvent& event) Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) return; - if ( dev->get_selected_machine() && (dev->get_selected_machine()->dev_id != event.GetString().ToStdString()) && m_hms_panel) { + if ( dev->get_selected_machine() && (dev->get_selected_machine()->get_dev_id() != event.GetString().ToStdString()) && m_hms_panel) { m_hms_panel->clear_hms_tag(); } @@ -293,7 +295,7 @@ void MonitorPanel::on_select_printer(wxCommandEvent& event) obj_->reset_pa_cali_history_result(); obj_->reset_pa_cali_result(); Sidebar &sidebar = GUI::wxGetApp().sidebar(); - sidebar.load_ams_list(obj_->dev_id, obj_); + sidebar.load_ams_list(obj_->get_dev_id(), obj_); sidebar.update_sync_status(obj_); sidebar.set_need_auto_sync_after_connect_printer(sidebar.need_auto_sync_extruder_list_after_connect_priner(obj_)); } @@ -379,7 +381,7 @@ void MonitorPanel::update_all() m_media_file_panel->UpdateByObj(obj); } - if (current_page == m_hms_panel || (obj->hms_list.size() != m_hms_panel->temp_hms_list.size())) { + if (current_page == m_hms_panel || (obj->GetHMS()->GetHMSItems().size() != m_hms_panel->temp_hms_list.size())) { m_hms_panel->update(obj); } @@ -392,10 +394,10 @@ void MonitorPanel::update_hms_tag() if (!obj) { break;} - const wxString &msg = wxGetApp().get_hms_query()->query_hms_msg(obj->dev_id, hmsitem.second.get_long_error_code()); + const wxString &msg = wxGetApp().get_hms_query()->query_hms_msg(obj->get_dev_id(), hmsitem.second.get_long_error_code()); if (msg.empty()){ continue;} /*STUDIO-10363 it's hidden message*/ - if (!hmsitem.second.already_read) { + if (!hmsitem.second.has_read()) { //show HMS new tag m_tabpanel->GetBtnsListCtrl()->showNewTag(3, true); return; @@ -428,10 +430,10 @@ bool MonitorPanel::Show(bool show) dev->load_last_machine(); obj = dev->get_selected_machine(); if (obj && obj->is_info_ready(false)) - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); } else { obj->reset_update_time(); - //select_machine(obj->dev_id); + //select_machine(obj->get_dev_id()); } } } else { @@ -448,7 +450,7 @@ void MonitorPanel::show_status(int status) if ((last_status & (int)MonitorStatus::MONITOR_CONNECTING) != 0) { NetworkAgent* agent = wxGetApp().getAgent(); json j; - j["dev_id"] = obj ? obj->dev_id : "obj_nullptr"; + j["dev_id"] = obj ? obj->get_dev_id() : "obj_nullptr"; if ((status & (int)MonitorStatus::MONITOR_DISCONNECTED) != 0) { j["result"] = "failed"; } diff --git a/src/slic3r/GUI/MultiMachine.cpp b/src/slic3r/GUI/MultiMachine.cpp index 220c3cab77..9919d05dfa 100644 --- a/src/slic3r/GUI/MultiMachine.cpp +++ b/src/slic3r/GUI/MultiMachine.cpp @@ -32,7 +32,7 @@ void DeviceItem::sync_state() { if (obj_) { state_online = obj_->is_online(); - state_dev_name = obj_->dev_name; + state_dev_name = obj_->get_dev_name(); //printable if (obj_->print_status == "IDLE") { @@ -115,7 +115,7 @@ bool DeviceItem::is_blocking_printing(MachineObject* obj_) source_model = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); if (source_model != target_model) { - std::vector compatible_machine = dev->get_compatible_machine(target_model); + std::vector compatible_machine = obj_->get_compatible_machine(); vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); if (it == compatible_machine.end()) { return true; @@ -202,8 +202,8 @@ std::vector selected_machines(const std::vector& dev_i std::vector res; for (const auto& item : dev_item_list) { const MachineObject* dev = item->get_obj(); - const std::string& dev_name = dev->dev_name; - const std::string& dev_ip = dev->dev_ip; + const std::string& dev_name = dev->get_dev_name(); + const std::string& dev_ip = dev->get_dev_ip(); auto name_it = dev_name.find(search_text); auto ip_it = dev_ip.find(search_text); diff --git a/src/slic3r/GUI/MultiMachineManagerPage.cpp b/src/slic3r/GUI/MultiMachineManagerPage.cpp index e427195962..11b8ac2d95 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.cpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.cpp @@ -2,6 +2,8 @@ #include "GUI_App.hpp" #include "MainFrame.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -18,7 +20,7 @@ MultiMachineItem::MultiMachineItem(wxWindow* parent, MachineObject* obj) Bind(wxEVT_LEFT_DOWN, &MultiMachineItem::OnLeftDown, this); Bind(wxEVT_MOTION, &MultiMachineItem::OnMove, this); Bind(EVT_MULTI_DEVICE_VIEW, [this, obj](auto& e) { - wxGetApp().mainframe->jump_to_monitor(obj->dev_id); + wxGetApp().mainframe->jump_to_monitor(obj->get_dev_id()); if (wxGetApp().mainframe->m_monitor->get_status_panel()->get_media_play_ctrl()) { wxGetApp().mainframe->m_monitor->get_status_panel()->get_media_play_ctrl()->jump_to_play(); } @@ -152,7 +154,7 @@ void MultiMachineItem::doRender(wxDC& dc) if (obj_) { //dev name - wxString dev_name = wxString::FromUTF8(obj_->dev_name); + wxString dev_name = wxString::FromUTF8(obj_->get_dev_name()); if (!obj_->is_online()) { dev_name = dev_name + "(" + _L("Offline") + ")"; } @@ -235,7 +237,7 @@ void MultiMachineItem::doRender(wxDC& dc) void MultiMachineItem::post_event(wxCommandEvent&& event) { event.SetEventObject(this); - event.SetString(obj_->dev_id); + event.SetString(obj_->get_dev_id()); event.SetInt(state_selected); wxPostEvent(this, event); } @@ -620,8 +622,8 @@ void MultiMachineManagerPage::sync_state(MachineObject* obj_) ObjState state_obj; if (obj_) { - state_obj.dev_id = obj_->dev_id; - state_obj.state_dev_name = obj_->dev_name; + state_obj.dev_id = obj_->get_dev_id(); + state_obj.state_dev_name = obj_->get_dev_name(); if (obj_->print_status == "IDLE") { state_obj.state_device = 0; diff --git a/src/slic3r/GUI/MultiMachinePage.cpp b/src/slic3r/GUI/MultiMachinePage.cpp index 8b4f213cd1..f7cb05a80e 100644 --- a/src/slic3r/GUI/MultiMachinePage.cpp +++ b/src/slic3r/GUI/MultiMachinePage.cpp @@ -2,6 +2,8 @@ #include "GUI_App.hpp" #include "MainFrame.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -279,13 +281,13 @@ void DevicePickItem::doRender(wxDC& dc) left += FromDIP(PICK_LEFT_PRINTABLE); //dev names - DrawTextWithEllipsis(dc, wxString::FromUTF8(get_obj()->dev_name), FromDIP(PICK_LEFT_DEV_NAME), left); + DrawTextWithEllipsis(dc, wxString::FromUTF8(get_obj()->get_dev_name()), FromDIP(PICK_LEFT_DEV_NAME), left); left += FromDIP(PICK_LEFT_DEV_NAME); } void DevicePickItem::post_event(wxCommandEvent&& event) { event.SetEventObject(this); - event.SetString(obj_->dev_id); + event.SetString(obj_->get_dev_id()); event.SetInt(state_selected); wxPostEvent(this, event); } @@ -363,7 +365,7 @@ void MultiMachinePickPage::update_selected_count() int count = 0; for (auto it = m_device_items.begin(); it != m_device_items.end(); it++) { if (it->second->state_selected == 1 ) { - selected_multi_devices.push_back(it->second->obj_->dev_id); + selected_multi_devices.push_back(it->second->obj_->get_dev_id()); count++; } } @@ -423,7 +425,7 @@ void MultiMachinePickPage::refresh_user_device() std::vector subscribe_list; for (auto it = user_machine.begin(); it != user_machine.end(); ++it) { - if (it->second->m_extder_data.total_extder_count > 1) { continue; } + if (it->second->GetExtderSystem()->GetTotalExtderCount() > 1) { continue; } if (it->second->printer_type == "O1D") { continue;} /*maybe total_extder_count is not valid, hard codes here. to be moved to printers json*/ DevicePickItem* di = new DevicePickItem(scroll_macine_list, it->second); @@ -451,7 +453,7 @@ void MultiMachinePickPage::refresh_user_device() } //update selected - auto dev_it = std::find(selected_multi_devices.begin(), selected_multi_devices.end(), it->second->dev_id ); + auto dev_it = std::find(selected_multi_devices.begin(), selected_multi_devices.end(), it->second->get_dev_id() ); if (dev_it != selected_multi_devices.end()) { di->state_selected = 1; } diff --git a/src/slic3r/GUI/MultiSendMachineModel.cpp b/src/slic3r/GUI/MultiSendMachineModel.cpp index b7a21bd417..f7861516e4 100644 --- a/src/slic3r/GUI/MultiSendMachineModel.cpp +++ b/src/slic3r/GUI/MultiSendMachineModel.cpp @@ -22,7 +22,7 @@ void MultiSendMachineModel::Init() wxDataViewItem MultiSendMachineModel::AddMachine(MachineObject* obj) { - wxString name = from_u8(obj->dev_name); + wxString name = from_u8(obj->get_dev_name()); wxDataViewItem new_item; diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp index e66652877d..37321063f8 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.cpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -7,6 +7,8 @@ #include #include +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -176,7 +178,7 @@ void MultiTaskItem::update_info() void MultiTaskItem::onPause() { if (get_obj() && !get_obj()->can_resume()) { - BOOST_LOG_TRIVIAL(info) << "MultiTask: pause current print task dev_id =" << get_obj()->dev_id; + BOOST_LOG_TRIVIAL(info) << "MultiTask: pause current print task dev_id =" << get_obj()->get_dev_id(); get_obj()->command_task_pause(); m_button_pause->Hide(); m_button_resume->Show(); @@ -187,7 +189,7 @@ void MultiTaskItem::onPause() void MultiTaskItem::onResume() { if (get_obj() && get_obj()->can_resume()) { - BOOST_LOG_TRIVIAL(info) << "MultiTask: resume current print task dev_id =" << get_obj()->dev_id; + BOOST_LOG_TRIVIAL(info) << "MultiTask: resume current print task dev_id =" << get_obj()->get_dev_id(); get_obj()->command_task_resume(); m_button_pause->Show(); m_button_resume->Hide(); @@ -198,7 +200,7 @@ void MultiTaskItem::onResume() void MultiTaskItem::onStop() { if (get_obj()) { - BOOST_LOG_TRIVIAL(info) << "MultiTask: abort current print task dev_id =" << get_obj()->dev_id; + BOOST_LOG_TRIVIAL(info) << "MultiTask: abort current print task dev_id =" << get_obj()->get_dev_id(); get_obj()->command_task_abort(); m_button_pause->Hide(); m_button_resume->Hide(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 76b86eaee5..a9d8c2394b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -160,6 +160,9 @@ #include "FilamentMapDialog.hpp" #include "CloneDialog.hpp" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevManager.h" + using boost::optional; namespace fs = boost::filesystem; using Slic3r::_3DScene; @@ -394,7 +397,7 @@ struct ExtruderGroup : StaticGroup void update_ams(); - void sync_ams(MachineObject const *obj, std::vector const &ams4, std::vector const &ams1); + void sync_ams(MachineObject const *obj, std::vector const &ams4, std::vector const &ams1); void Rescale() { @@ -1142,16 +1145,16 @@ void ExtruderGroup::update_ams() sizer->Layout(); } -void ExtruderGroup::sync_ams(MachineObject const *obj, std::vector const &ams4, std::vector const &ams1) +void ExtruderGroup::sync_ams(MachineObject const *obj, std::vector const &ams4, std::vector const &ams1) { if (ams_4.empty() && ams4.empty() && ams_1.empty() && ams1.empty()) return; - auto sync = [obj](std::vector &infos, std::vector const &ams) -> bool { + auto sync = [obj](std::vector &infos, std::vector const &ams) -> bool { std::vector infos2; for (auto a : ams) { AMSinfo ams_info; - ams_info.parse_ams_info(const_cast(obj), a, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity); + ams_info.parse_ams_info(const_cast(obj), a, obj->GetFilaSystem()->IsDetectRemainEnabled(), obj->is_support_ams_humidity); infos2.push_back(ams_info); } if (infos == infos2) @@ -1210,7 +1213,7 @@ bool Sidebar::priv::sync_extruder_list(bool &only_external_material) plater->pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::NOT_CONNECTED, _L("Sync printer information")); return false; } - //if (obj->m_extder_data.extders.size() != 2) {//wxString(obj->get_preset_printer_model_name(machine_print_name)) + //if (obj->get_extder_system()->extders.size() != 2) {//wxString(obj->get_preset_printer_model_name(machine_print_name)) // plater->pop_warning_and_go_to_device_page(printer_name, Plater::PrinterWarningType::INCONSISTENT, _L("Sync printer information")); // return false; //} @@ -1253,17 +1256,17 @@ bool Sidebar::priv::sync_extruder_list(bool &only_external_material) assert(physical_extruder_map->values.size() == extruder_nums); extruder_map = physical_extruder_map->values; } - assert(obj->m_extder_data.extders.size() == extruder_nums); + assert(obj->GetExtderSystem()->GetTotalExtderCount() == extruder_nums); std::vector nozzle_diameters; nozzle_diameters.resize(extruder_nums); for (size_t index = 0; index < extruder_nums; ++index) { int extruder_id = extruder_map[index]; - nozzle_diameters[extruder_id] = obj->m_extder_data.extders[index].current_nozzle_diameter; + nozzle_diameters[extruder_id] = obj->GetExtderSystem()->GetNozzleDiameter(index); NozzleVolumeType target_type = NozzleVolumeType::nvtStandard; auto printer_tab = dynamic_cast(wxGetApp().get_tab(Preset::TYPE_PRINTER)); if (obj->is_nozzle_flow_type_supported()) { - if (obj->m_extder_data.extders[index].current_nozzle_flow_type == NozzleFlowType::NONE_FLOWTYPE) { + if (obj->GetExtderSystem()->GetNozzleFlowType(index) == NozzleFlowType::NONE_FLOWTYPE) { MessageDialog dlg(this->plater, _L("There are unset nozzle types. Please set the nozzle types of all extruders before synchronizing."), _L("Sync extruder infomation"), wxICON_WARNING | wxOK); dlg.ShowModal(); @@ -1271,30 +1274,27 @@ bool Sidebar::priv::sync_extruder_list(bool &only_external_material) } // hack code, only use standard flow for 0.2 if (std::fabs(nozzle_diameters[extruder_id] - 0.2) > EPSILON) - target_type = NozzleVolumeType(obj->m_extder_data.extders[extruder_id].current_nozzle_flow_type - 1); + target_type = NozzleVolumeType(obj->GetExtderSystem()->GetNozzleFlowType(extruder_id) - 1); } printer_tab->set_extruder_volume_type(index, target_type); } int deputy_4 = 0, main_4 = 0, deputy_1 = 0, main_1 = 0; - for (auto ams : obj->amsList) { + for (auto ams : obj->GetFilaSystem()->GetAmsList()) { // Main (first) extruder at right - if (ams.second->nozzle == 0) { - if (ams.second->type == 4) // N3S + if (ams.second->GetExtruderId() == 0) { + if (ams.second->GetAmsType() == DevAms::N3S) // N3S ++main_1; else ++main_4; - } else if (ams.second->nozzle == 1) { - if (ams.second->type == 4) // N3S + } else if (ams.second->GetExtruderId() == 1) { + if (ams.second->GetAmsType() == DevAms::N3S) // N3S ++deputy_1; else ++deputy_4; } } - only_external_material = false; - if (obj->amsList.size() == 0) { - only_external_material = true; - } + only_external_material = !obj->GetFilaSystem()->HasAms(); int main_index = obj->is_main_extruder_on_left() ? 0 : 1; int deputy_index = obj->is_main_extruder_on_left() ? 1 : 0; @@ -1372,8 +1372,8 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) //int nozzle_volue_type{0}; int ams_4{0}; int ams_1{0}; - std::vector ams_v4; - std::vector ams_v1; + std::vector ams_v4; + std::vector ams_v1; bool operator==(const ExtruderInfo &other) const { @@ -1393,7 +1393,7 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) // 2. update extruder status int extruder_nums = preset_bundle->get_printer_extruder_count(); - if (extruder_nums != obj->m_extder_data.extders.size()) + if (extruder_nums != obj->GetExtderSystem()->GetTotalExtderCount()) return; std::vector extruder_infos(extruder_nums); @@ -1429,21 +1429,24 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj) extruder_infos[1].diameter = float(value); } - std::vector machine_extruder_infos(obj->m_extder_data.extders.size()); - for (const Extder &extruder : obj->m_extder_data.extders) { - //machine_extruder_infos[extruder.id].nozzle_volue_type = int(extruder.current_nozzle_flow_type) - 1; - machine_extruder_infos[extruder.id].diameter = extruder.current_nozzle_diameter; + std::vector machine_extruder_infos(obj->GetExtderSystem()->GetTotalExtderCount()); + + const auto& extruders = obj->GetExtderSystem()->GetExtruders(); + for (const DevExtder &extruder : extruders) { + //machine_extruder_infos[extruder.GetExtId()].nozzle_volue_type = int(extruder.GetNozzleFlowType()) - 1; + machine_extruder_infos[extruder.GetExtId()].diameter = extruder.GetNozzleDiameter(); } - for (auto &item : obj->amsList) { - if (item.second->nozzle >= machine_extruder_infos.size()) + for (auto &item : obj->GetFilaSystem()->GetAmsList()) { + if (item.second->GetExtruderId() >= machine_extruder_infos.size()) continue; - if (item.second->type == 4) { // N3S - machine_extruder_infos[item.second->nozzle].ams_1++; - machine_extruder_infos[item.second->nozzle].ams_v1.push_back(item.second); + if (item.second->GetAmsType() == DevAms::N3S) + { // N3S + machine_extruder_infos[item.second->GetExtruderId()].ams_1++; + machine_extruder_infos[item.second->GetExtruderId()].ams_v1.push_back(item.second); } else { - machine_extruder_infos[item.second->nozzle].ams_4++; - machine_extruder_infos[item.second->nozzle].ams_v4.push_back(item.second); + machine_extruder_infos[item.second->GetExtruderId()].ams_4++; + machine_extruder_infos[item.second->GetExtruderId()].ams_v4.push_back(item.second); } } @@ -2909,7 +2912,7 @@ std::map Sidebar::build_filament_ams_list(MachineObject std::map filament_ams_list; if (!obj) return filament_ams_list; - auto build_tray_config = [](AmsTray const &tray, std::string const &name, std::string ams_id, std::string slot_id) { + auto build_tray_config = [](DevAmsTray const &tray, std::string const &name, std::string ams_id, std::string slot_id) { BOOST_LOG_TRIVIAL(info) << boost::format("build_filament_ams_list: name %1% setting_id %2% type %3% color %4%") % name % tray.setting_id % tray.type % tray.color; DynamicPrintConfig tray_config; @@ -2954,11 +2957,11 @@ std::map Sidebar::build_filament_ams_list(MachineObject return std::string(); }; - auto list = obj->amsList; + auto list = obj->GetFilaSystem()->GetAmsList(); for (auto ams : list) { int ams_id = std::stoi(ams.first); - int extruder = ams.second->nozzle ? 0 : 0x10000; // Main (first) extruder at right - for (auto tray : ams.second->trayList) { + int extruder = ams.second->GetExtruderId() ? 0 : 0x10000; // Main (first) extruder at right + for (auto tray : ams.second->GetTrays()) { int slot_id = std::stoi(tray.first); filament_ams_list.emplace(extruder + (ams_id * 4 + slot_id), build_tray_config(*tray.second, get_ams_name(ams_id, slot_id), std::to_string(ams_id), std::to_string(slot_id))); @@ -3035,8 +3038,10 @@ void Sidebar::load_ams_list(std::string const &device, MachineObject* obj) device_change = true; } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": %1% items") % filament_ams_list.size(); - if (wxGetApp().preset_bundle->filament_ams_list == filament_ams_list) + if (wxGetApp().preset_bundle->filament_ams_list == filament_ams_list && !device_change) + { return; + } wxGetApp().preset_bundle->filament_ams_list = filament_ams_list; for (auto c : p->combos_filament){ @@ -3055,7 +3060,7 @@ void Sidebar::sync_ams_list(bool is_from_big_sync_btn) // Force load ams list auto obj = wxGetApp().getDeviceManager()->get_selected_machine(); if (obj) - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); auto & list = wxGetApp().preset_bundle->filament_ams_list; if (list.empty()) { @@ -6158,14 +6163,14 @@ std::vector Plater::priv::load_files(const std::vector& input_ if (dev) { MachineObject *obj = dev->get_selected_machine(); if (obj && obj->is_info_ready()) { - if (obj->m_extder_data.extders.size() > 0) { + if (obj->GetExtderSystem()->GetTotalExtderCount() > 0) { PresetBundle *preset_bundle = wxGetApp().preset_bundle; Preset &printer_preset = preset_bundle->printers.get_selected_preset(); double preset_nozzle_diameter = 0.4; const ConfigOption *opt = printer_preset.config.option("nozzle_diameter"); if (opt) preset_nozzle_diameter = static_cast(opt)->values[0]; - float machine_nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + float machine_nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); std::string machine_type = obj->printer_type; if (obj->is_support_upgrade_kit && obj->installed_upgrade_kit) machine_type = "C12"; @@ -8485,8 +8490,10 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) if (cur_preset.get_printer_type(preset_bundle) == obj->get_show_printer_type()) { double preset_nozzle_diameter = cur_preset.config.option("nozzle_diameter")->values[0]; bool same_nozzle_diameter = true; - for (const Extder &extruder : obj->m_extder_data.extders) { - if (!is_approx(extruder.current_nozzle_diameter, float(preset_nozzle_diameter))) { + + const auto& extruders = obj->GetExtderSystem()->GetExtruders(); + for (const DevExtder &extruder : extruders) { + if (!is_approx(extruder.GetNozzleDiameter(), float(preset_nozzle_diameter))) { same_nozzle_diameter = false; } } @@ -9888,10 +9895,10 @@ bool Plater::priv::check_ams_status_impl(bool is_slice_all) if (preset_bundle && preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle) == obj->get_show_printer_type()) { bool is_same_as_printer = true; auto nozzle_volumes_values = preset_bundle->project_config.option("nozzle_volume_type")->values; - assert(obj->m_extder_data.extders.size() == 2 && nozzle_volumes_values.size() == 2); - if (obj->m_extder_data.extders.size() == 2 && nozzle_volumes_values.size() == 2) { - NozzleVolumeType right_nozzle_type = NozzleVolumeType(obj->m_extder_data.extders[0].current_nozzle_flow_type - 1); - NozzleVolumeType left_nozzle_type = NozzleVolumeType(obj->m_extder_data.extders[1].current_nozzle_flow_type - 1); + assert(obj->GetExtderSystem()->GetTotalExtderCount() == 2 && nozzle_volumes_values.size() == 2); + if (obj->GetExtderSystem()->GetTotalExtderCount() == 2 && nozzle_volumes_values.size() == 2) { + NozzleVolumeType right_nozzle_type = NozzleVolumeType(obj->GetExtderSystem()->GetNozzleFlowType(0) - 1); + NozzleVolumeType left_nozzle_type = NozzleVolumeType(obj->GetExtderSystem()->GetNozzleFlowType(1) - 1); NozzleVolumeType preset_left_type = NozzleVolumeType(nozzle_volumes_values[0]); NozzleVolumeType preset_right_type = NozzleVolumeType(nozzle_volumes_values[1]); is_same_as_printer = (left_nozzle_type == preset_left_type && right_nozzle_type == preset_right_type); @@ -9900,15 +9907,15 @@ bool Plater::priv::check_ams_status_impl(bool is_slice_all) std::vector> ams_count_info; ams_count_info.resize(2); int deputy_4 = 0, main_4 = 0, deputy_1 = 0, main_1 = 0; - for (auto ams : obj->amsList) { + for (auto ams : obj->GetFilaSystem()->GetAmsList()) { // Main (first) extruder at right - if (ams.second->nozzle == 0) { - if (ams.second->type == 4) // N3S + if (ams.second->GetExtruderId() == 0) { + if (ams.second->GetAmsType() == DevAms::N3S) // N3S ++main_1; else ++main_4; - } else if (ams.second->nozzle == 1) { - if (ams.second->type == 4) // N3S + } else if (ams.second->GetExtruderId() == 1) { + if (ams.second->GetAmsType() == DevAms::N3S) // N3S ++deputy_1; else ++deputy_4; @@ -13840,7 +13847,7 @@ Preset *get_printer_preset(const MachineObject *obj) return nullptr; Preset *printer_preset = nullptr; - float machine_nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + float machine_nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); PresetBundle *preset_bundle = wxGetApp().preset_bundle; for (auto printer_it = preset_bundle->printers.begin(); printer_it != preset_bundle->printers.end(); printer_it++) { // only use system printer preset @@ -13866,14 +13873,16 @@ bool Plater::check_printer_initialized(MachineObject *obj, bool only_warning, bo return false; bool has_been_initialized = true; - for (const Extder& extruder : obj->m_extder_data.extders) { + + const auto& extruders = obj->GetExtderSystem()->GetExtruders(); + for (const DevExtder& extruder : extruders) { if (obj->is_multi_extruders()) { - if (extruder.current_nozzle_flow_type == NozzleFlowType::NONE_FLOWTYPE) { + if (extruder.GetNozzleFlowType() == NozzleFlowType::NONE_FLOWTYPE) { has_been_initialized = false; break; } } - if (extruder.current_nozzle_type == NozzleType::ntUndefine) { + if (extruder.GetNozzleFlowType() == NozzleType::ntUndefine) { has_been_initialized = false; break; } @@ -13882,7 +13891,7 @@ bool Plater::check_printer_initialized(MachineObject *obj, bool only_warning, bo if (!has_been_initialized) { if (popup_warning) { if (!only_warning) { - if (DeviceManager::get_printer_can_set_nozzle(obj->get_show_printer_type())) { + if (DevPrinterConfigUtil::get_printer_can_set_nozzle(obj->get_show_printer_type())) { MessageDialog dlg(wxGetApp().plater(), _L("The nozzle type is not set. Please set the nozzle and try again."), _L("Warning"), wxOK | wxICON_WARNING); dlg.ShowModal(); } else { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 901f344a3a..25feae3687 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -52,7 +52,7 @@ class PartPlateList; class SlicingStatusEvent; enum SLAPrintObjectStep : unsigned int; enum class ConversionType : int; -class Ams; +class DevAms; using ModelInstancePtrs = std::vector; diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index ba003f49c0..285ab8ec8d 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -1061,19 +1061,6 @@ PreferencesDialog::PreferencesDialog(wxWindow *parent, wxWindowID id, const wxSt SetBackgroundColour(*wxWHITE); create(); wxGetApp().UpdateDlgDarkUI(this); - Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) { - try { - NetworkAgent* agent = GUI::wxGetApp().getAgent(); - if (agent) { - json j; - std::string value; - value = wxGetApp().app_config->get("auto_calculate_flush"); - j["auto_flushing"] = value; - agent->track_event("preferences_changed", j.dump()); - } - } catch(...) {} - event.Skip(); - }); } void PreferencesDialog::create() diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 6961f672de..5006c5eab0 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -45,6 +45,8 @@ #include "FilamentPickerDialog.hpp" #include "wxExtensions.hpp" +#include "DeviceCore/DevManager.h" + // A workaround for a set of issues related to text fitting into gtk widgets: #if defined(__WXGTK20__) || defined(__WXGTK3__) #include @@ -469,7 +471,7 @@ void PresetComboBox::add_connected_printers(std::string selected, bool alias_nam printer_preset->is_visible = true; auto printer_model = printer_preset->config.opt_string("printer_model"); boost::replace_all(printer_model, "Bambu Lab ", ""); - auto text = iter->second->dev_name + " (" + printer_model + ")"; + auto text = iter->second->get_dev_name() + " (" + printer_model + ")"; int item_id = Append(from_u8(text), wxNullBitmap, &m_first_printer_idx + std::distance(machine_list.begin(), iter)); validate_selection(m_selected_dev_id == iter->first); } diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index 1091bd7a02..adda627924 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -5,6 +5,9 @@ #include "Widgets/SwitchButton.hpp" #include "MsgDialog.hpp" +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevExtruderSystem.h" + static const wxColour STATIC_BOX_LINE_COL = wxColour(238, 238, 238); static const wxColour STATIC_TEXT_CAPTION_COL = wxColour(100, 100, 100); static const wxColour STATIC_TEXT_EXPLAIN_COL = wxColour(100, 100, 100); @@ -254,8 +257,7 @@ void PrintOptionsDialog::update_options(MachineObject* obj_) text_ai_detections_caption->Hide(); } - - if (obj_->is_support_ai_monitoring && !obj_->xcam_disable_ai_detection_display) { + if (obj_->GetConfig()->SupportAIMonitor() && !obj_->xcam_disable_ai_detection_display) { text_ai_monitoring->Show(); m_cb_ai_monitoring->Show(); text_ai_monitoring_caption->Show(); @@ -373,7 +375,7 @@ void PrintOptionsDialog::update_options(MachineObject* obj_) line2->Hide(); } - if (obj_->is_support_first_layer_inspect) { + if (obj_->GetConfig()->SupportFirstLayerInspect()) { text_first_layer->Show(); m_cb_first_layer->Show(); // line3->Show(); @@ -525,7 +527,7 @@ void PrintOptionsDialog::UpdateOptionOpenDoorCheck(MachineObject *obj) { void PrintOptionsDialog::UpdateOptionSavePrintFileToStorage(MachineObject *obj) { - if (obj && obj->support_save_remote_print_file_to_storage()) + if (obj && obj->GetConfig()->SupportSaveRemotePrintFileToStorage()) { m_cb_save_remote_print_file_to_storage->SetValue(obj->get_save_remote_print_file_to_storage()); } @@ -1271,14 +1273,14 @@ bool PrinterPartsDialog::Show(bool show) /*disable editing*/ EnableEditing(false); - assert(DeviceManager::get_printer_can_set_nozzle(obj->printer_type) == false);/*editing is not supported*/ + assert(DevPrinterConfigUtil::get_printer_can_set_nozzle(obj->printer_type) == false);/*editing is not supported*/ - if (obj->m_extder_data.extders.size() <= 1) { + if (obj->GetExtderSystem()->GetTotalExtderSize() <= 1) { single_panel->Show(); multiple_panel->Hide(); - auto type = obj->m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_type; - auto diameter = obj->m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter; + auto type = obj->GetExtderSystem()->GetNozzleType(MAIN_EXTRUDER_ID); + auto diameter = obj->GetExtderSystem()->GetNozzleDiameter(MAIN_EXTRUDER_ID); nozzle_type_checkbox->SetValue(GetString(type)); nozzle_diameter_checkbox->SetValue(GetString(diameter)); @@ -1287,7 +1289,7 @@ bool PrinterPartsDialog::Show(bool show) nozzle_flow_type_checkbox->Show(obj->is_nozzle_flow_type_supported()); if (obj->is_nozzle_flow_type_supported()) { - auto flow_type = obj->m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_flow_type; + auto flow_type = obj->GetExtderSystem()->GetNozzleFlowType(MAIN_EXTRUDER_ID); nozzle_flow_type_checkbox->SetValue(GetString(flow_type)); } } else { @@ -1295,17 +1297,17 @@ bool PrinterPartsDialog::Show(bool show) multiple_panel->Show(); //left - auto type = obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].current_nozzle_type; - auto diameter = obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].current_nozzle_diameter; - auto flow_type = obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].current_nozzle_flow_type; + auto type = obj->GetExtderSystem()->GetNozzleType(DEPUTY_EXTRUDER_ID); + auto diameter = obj->GetExtderSystem()->GetNozzleDiameter(DEPUTY_EXTRUDER_ID); + auto flow_type = obj->GetExtderSystem()->GetNozzleFlowType(DEPUTY_EXTRUDER_ID); multiple_left_nozzle_type_checkbox->SetValue(GetString(type)); multiple_left_nozzle_diameter_checkbox->SetValue(GetString(diameter)); multiple_left_nozzle_flow_checkbox->SetValue(GetString(flow_type)); //right - type = obj->m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_type; - diameter = obj->m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_diameter; - flow_type = obj->m_extder_data.extders[MAIN_NOZZLE_ID].current_nozzle_flow_type; + type = obj->GetExtderSystem()->GetNozzleType(MAIN_EXTRUDER_ID); + diameter = obj->GetExtderSystem()->GetNozzleDiameter(MAIN_EXTRUDER_ID); + flow_type = obj->GetExtderSystem()->GetNozzleFlowType(MAIN_EXTRUDER_ID); multiple_right_nozzle_type_checkbox->SetValue(GetString(type)); multiple_right_nozzle_diameter_checkbox->SetValue(GetString(diameter)); multiple_right_nozzle_flow_checkbox->SetValue(GetString(flow_type)); diff --git a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp index 2d960e938b..e831ef81ce 100644 --- a/src/slic3r/GUI/Printer/PrinterFileSystem.cpp +++ b/src/slic3r/GUI/Printer/PrinterFileSystem.cpp @@ -1067,7 +1067,11 @@ void PrinterFileSystem::SendChangedEvent(wxEventType type, size_t index, std::st void PrinterFileSystem::DumpLog(void * thiz, int, tchar const *msg) { + +#if !BBL_RELEASE_TO_PUBLIC BOOST_LOG_TRIVIAL(info) << "PrinterFileSystem: " << wxString(msg).ToUTF8().data(); +#endif + static_cast(thiz)->Bambu_FreeLogMsg(msg); } diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 8d246f6731..e524044aff 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -25,6 +25,9 @@ #include "BitmapCache.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevStorage.h" + namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_SECONDARY_CHECK_CONFIRM, wxCommandEvent); @@ -1558,9 +1561,9 @@ InputIpAddressDialog::InputIpAddressDialog(wxWindow *parent) m_input_modelID->SetMinSize(wxSize(FromDIP(168), FromDIP(28))); m_input_modelID->SetMaxSize(wxSize(FromDIP(168), FromDIP(28))); - m_models_map = DeviceManager::get_all_model_id_with_name(); + m_models_map = DevPrinterConfigUtil::get_all_model_id_with_name(); for (auto it = m_models_map.begin(); it != m_models_map.end(); ++it) { - m_input_modelID->Append(it->right); + m_input_modelID->Append(it->first); m_input_modelID->SetSelection(0); } @@ -1814,11 +1817,11 @@ void InputIpAddressDialog::update_title(wxString title) void InputIpAddressDialog::set_machine_obj(MachineObject* obj) { m_obj = obj; - m_input_ip->GetTextCtrl()->SetLabelText(m_obj->dev_ip); + m_input_ip->GetTextCtrl()->SetLabelText(m_obj->get_dev_ip()); m_input_access_code->GetTextCtrl()->SetLabelText(m_obj->get_access_code()); - m_input_printer_name->GetTextCtrl()->SetLabelText(m_obj->dev_name); + m_input_printer_name->GetTextCtrl()->SetLabelText(m_obj->get_dev_name()); - std::string img_str = DeviceManager::get_printer_diagram_img(m_obj->printer_type); + std::string img_str = DevPrinterConfigUtil::get_printer_connect_help_img(m_obj->printer_type); auto diagram_bmp = create_scaled_bitmap(img_str + "_en", this, 198); m_img_help->SetBitmap(diagram_bmp); @@ -1907,9 +1910,9 @@ void InputIpAddressDialog::on_ok(wxMouseEvent& evt) std::string str_sn = m_input_sn->GetTextCtrl()->GetValue().Strip(wxString::both).Upper().ToStdString(); std::string str_model_id = ""; - auto it = m_models_map.right.find(m_input_modelID->GetStringSelection().ToStdString()); - if (it != m_models_map.right.end()) { - str_model_id = it->get_left(); + auto it = m_models_map.find(m_input_modelID->GetStringSelection().ToStdString()); + if (it != m_models_map.end()) { + str_model_id = it->second; } m_button_manual_setup->Enable(false); @@ -1968,7 +1971,7 @@ void InputIpAddressDialog::on_send_retry() m_worker->wait_for_idle(); }); - auto m_send_job = std::make_unique(m_obj->dev_id); + auto m_send_job = std::make_unique(m_obj->get_dev_id()); m_send_job->m_dev_ip = ip.ToStdString(); m_send_job->m_access_code = str_access_code.ToStdString(); @@ -1982,7 +1985,7 @@ void InputIpAddressDialog::on_send_retry() m_send_job->connection_type = m_obj->connection_type(); m_send_job->cloud_print_only = true; - m_send_job->has_sdcard = m_obj->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL; + m_send_job->has_sdcard = m_obj->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_NORMAL; m_send_job->set_check_mode(); m_send_job->set_project_name("verify_job"); @@ -2095,7 +2098,7 @@ void InputIpAddressDialog::workerThreadFunc(std::string str_ip, std::string str_ if (m_obj) { m_obj->set_user_access_code(str_access_code); - wxGetApp().getDeviceManager()->set_selected_machine(m_obj->dev_id); + wxGetApp().getDeviceManager()->set_selected_machine(m_obj->get_dev_id()); } diff --git a/src/slic3r/GUI/ReleaseNote.hpp b/src/slic3r/GUI/ReleaseNote.hpp index e9458338f5..d01814e25a 100644 --- a/src/slic3r/GUI/ReleaseNote.hpp +++ b/src/slic3r/GUI/ReleaseNote.hpp @@ -335,7 +335,7 @@ public: int current_input_index {0}; std::shared_ptr m_status_bar; std::unique_ptr m_worker; - boost::bimaps::bimap m_models_map; + std::map m_models_map;// display_name -> model_id void switch_input_panel(int index); void on_cancel(); diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 01b927a77b..2955a97f50 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -18,6 +18,14 @@ #include "Jobs/BoostThreadWorker.hpp" #include "Jobs/PlaterWorker.hpp" +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevNozzleSystem.h" +#include "DeviceCore/DevExtruderSystem.h" +#include "DeviceCore/DevFilaBlackList.h" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevMapping.h" +#include "DeviceCore/DevStorage.h" #include #include @@ -769,8 +777,8 @@ void SelectMachineDialog::init_bind() MachineObject* obj = dev->get_selected_machine(); if (!obj) return; - if (obj->dev_id == e.GetString()) { - m_printer_box->SetPrinterName(wxString::FromUTF8(obj->dev_name) + "(LAN)"); + if (obj->get_dev_id() == e.GetString()) { + m_printer_box->SetPrinterName(wxString::FromUTF8(obj->get_dev_name()) + "(LAN)"); } } }); @@ -967,14 +975,14 @@ void SelectMachineDialog::sync_ams_mapping_result(std::vector &res } if (!f->color.empty()) { - ams_col = AmsTray::decode_color(f->color); + ams_col = DevAmsTray::decode_color(f->color); } else { // default color ams_col = wxColour(0xCE, 0xCE, 0xCE); } std::vector cols; for (auto col : f->colors) { - cols.push_back(AmsTray::decode_color(col)); + cols.push_back(DevAmsTray::decode_color(col)); } m->set_ams_info(ams_col, ams_id,f->ctype, cols); break; @@ -1004,7 +1012,7 @@ void print_ams_mapping_result(std::vector& result) bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) { if (!obj_) return false; - if (!obj_->has_ams()) { use_ams = false;} /*STUDIO-11971*/ + if (!obj_->HasAms()) { use_ams = false;} /*STUDIO-11971*/ obj_->get_ams_colors(m_cur_colors_in_thumbnail); // try color and type mapping @@ -1020,7 +1028,7 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) std::vector map_opt; //four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext if (nozzle_nums > 1){ //get nozzle property, the extders are same? - if (true/*!can_hybrid_mapping(obj_->m_extder_data)*/){ + if (true/*!can_hybrid_mapping(obj_get_extder_data())*/){ std::vector m_ams_mapping_result_left, m_ams_mapping_result_right; std::vector m_filament_left, m_filament_right; for (auto it = m_filaments.begin(); it != m_filaments.end(); it++){ @@ -1039,14 +1047,14 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) } bool has_left_ams = false, has_right_ams = false; - for (auto ams_item : obj_->amsList) { - if (ams_item.second->nozzle == 0) { + for (auto ams_item : obj_->GetFilaSystem()->GetAmsList()) { + if (ams_item.second->GetExtruderId() == 0) { if (obj_->is_main_extruder_on_left()) has_left_ams = true; else has_right_ams = true; } - else if (ams_item.second->nozzle == 1) { + else if (ams_item.second->GetExtruderId() == 1) { if (obj_->is_main_extruder_on_left()) has_right_ams = true; else @@ -1062,13 +1070,13 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) map_opt[0] = false; map_opt[2] = true; } - int result_first = obj_->ams_filament_mapping(m_filament_left, m_ams_mapping_result_left, map_opt); + int result_first = DevMappingUtil::ams_filament_mapping(obj_, m_filament_left, m_ams_mapping_result_left, map_opt); map_opt = { false, true, false, !has_right_ams }; if (!use_ams) { map_opt[1] = false; map_opt[3] = true; } - int result_second = obj_->ams_filament_mapping(m_filament_right, m_ams_mapping_result_right, map_opt); + int result_second = DevMappingUtil::ams_filament_mapping(obj_, m_filament_right, m_ams_mapping_result_right, map_opt); //m_ams_mapping_result.clear(); m_ams_mapping_result.resize(m_ams_mapping_result_left.size() + m_ams_mapping_result_right.size()); @@ -1086,7 +1094,7 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) map_opt[0] = false; map_opt[1] = false; } - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); + filament_result = DevMappingUtil::ams_filament_mapping(obj_, m_filaments, m_ams_mapping_result, map_opt); } //When filaments cannot be matched automatically, whether to use ext for automatic supply //auto_supply_with_ext(obj_->vt_slot); @@ -1100,7 +1108,7 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) map_opt[1] = false; map_opt[3] = true; } - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); + filament_result = DevMappingUtil::ams_filament_mapping(obj_, m_filaments, m_ams_mapping_result, map_opt); //auto_supply_with_ext(obj_->vt_slot); } else { @@ -1109,7 +1117,7 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) map_opt[1] = false; map_opt[3] = true; } - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); + filament_result = DevMappingUtil::ams_filament_mapping(obj_, m_filaments, m_ams_mapping_result, map_opt); } } @@ -1131,10 +1139,10 @@ bool SelectMachineDialog::do_ams_mapping(MachineObject *obj_,bool use_ams) BOOST_LOG_TRIVIAL(info) << "ams_mapping_array2=" << ams_array2; BOOST_LOG_TRIVIAL(info) << "ams_mapping_info=" << mapping_info; } - return obj_->is_valid_mapping_result(m_ams_mapping_result); + return DevMappingUtil::is_valid_mapping_result(obj_, m_ams_mapping_result); } else { // do not support ams mapping try to use order mapping - bool is_valid = obj_->is_valid_mapping_result(m_ams_mapping_result); + bool is_valid = DevMappingUtil::is_valid_mapping_result(obj_, m_ams_mapping_result); if (filament_result != 1 && !is_valid) { //reset invalid result for (int i = 0; i < m_ams_mapping_result.size(); i++) { @@ -1313,22 +1321,22 @@ bool SelectMachineDialog::build_nozzles_info(std::string& nozzles_info) return true; } -bool SelectMachineDialog::can_hybrid_mapping(ExtderData data) { +bool SelectMachineDialog::can_hybrid_mapping(DevExtderSystem data) { // Mixed mappings are not allowed return false; - if (data.total_extder_count <= 1 || data.extders.size() <= 1 || !wxGetApp().preset_bundle) + if (data.GetTotalExtderCount() <= 1 || !wxGetApp().preset_bundle) return false; //The default two extruders are left, right, but the order of the extruders on the machine is right, left. //Therefore, some adjustments need to be made. std::vectorflow_type_of_machine; - for (auto it = data.extders.rbegin(); it != data.extders.rend(); it++){ - //exist field is not updated, wait add - //if (it->exist < 3) return false; - std::string type_str = it->current_nozzle_flow_type ? "High Flow" : "Standard"; + for (const auto& ext : data.GetExtruders()) + { + std::string type_str = ext.GetNozzleFlowType() == NozzleFlowType::H_FLOW ? "High Flow" : "Standard"; flow_type_of_machine.push_back(type_str); } + //get the nozzle type of preset --> flow_types const Preset& current_printer = wxGetApp().preset_bundle->printers.get_selected_preset(); const Preset* base_printer = wxGetApp().preset_bundle->printers.get_preset_base(current_printer); @@ -1348,13 +1356,13 @@ bool SelectMachineDialog::can_hybrid_mapping(ExtderData data) { } //When filaments cannot be matched automatically, whether to use ext for automatic supply -void SelectMachineDialog::auto_supply_with_ext(std::vector slots) { +void SelectMachineDialog::auto_supply_with_ext(std::vector slots) { if (slots.size() <= 0) return; for (int i = 0; i < m_ams_mapping_result.size(); i++) { auto it = m_ams_mapping_result[i]; if (it.ams_id == "") { - AmsTray slot(""); + DevAmsTray slot(""); if (m_filaments_map[it.id] == 1 && slots.size() > 1) slot = slots[1]; else if (m_filaments_map[it.id] == 2) slot = slots[0]; if (slot.id.empty()) continue; @@ -1368,8 +1376,8 @@ void SelectMachineDialog::auto_supply_with_ext(std::vector slots) { } } -bool SelectMachineDialog::is_nozzle_type_match(ExtderData data, wxString& error_message) const { - if (data.total_extder_count <= 1 || data.extders.size() <= 1 || !wxGetApp().preset_bundle) +bool SelectMachineDialog::is_nozzle_type_match(DevExtderSystem data, wxString& error_message) const { + if (data.GetTotalExtderCount() <= 1 || !wxGetApp().preset_bundle) return false; const auto& project_config = wxGetApp().preset_bundle->project_config; @@ -1399,10 +1407,14 @@ bool SelectMachineDialog::is_nozzle_type_match(ExtderData data, wxString& error_ // The default two extruders are left, right, but the order of the extruders on the machine is right, left. std::vector flow_type_of_machine; - for (auto it = data.extders.begin(); it != data.extders.end(); it++) { - if (it->current_nozzle_flow_type == NozzleFlowType::H_FLOW) { + for (const auto& it : data.GetExtruders()) + { + if (it.GetNozzleFlowType() == NozzleFlowType::H_FLOW) + { flow_type_of_machine.push_back(L("High Flow")); - } else if (it->current_nozzle_flow_type == NozzleFlowType::S_FLOW){ + } + else if (it.GetNozzleFlowType() == NozzleFlowType::S_FLOW) + { flow_type_of_machine.push_back(L("Standard")); } } @@ -1415,11 +1427,11 @@ bool SelectMachineDialog::is_nozzle_type_match(ExtderData data, wxString& error_ if (flow_type_of_machine[target_machine_nozzle_id] != used_extruders_flow[it->first]) { wxString pos; - if (target_machine_nozzle_id == DEPUTY_NOZZLE_ID) + if (target_machine_nozzle_id == DEPUTY_EXTRUDER_ID) { pos = _L("left nozzle"); } - else if(target_machine_nozzle_id == MAIN_NOZZLE_ID) + else if(target_machine_nozzle_id == MAIN_EXTRUDER_ID) { pos = _L("right nozzle"); } @@ -1480,7 +1492,7 @@ bool SelectMachineDialog::check_sdcard_for_timelpase(MachineObject* obj) // must set to a status if return true if (m_checkbox_list["timelapse"]->IsShown() && m_checkbox_list["timelapse"]->getValue() == "on") { - if (obj->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { show_status(PrintDialogStatus::PrintStatusTimelapseNoSdcard); return true; } @@ -1614,7 +1626,7 @@ void SelectMachineDialog::show_status(PrintDialogStatus status, std::vectorget_preset_printer_model_name(target_model_id)); + auto target_print_name = wxString(DevPrinterConfigUtil::get_printer_display_name(target_model_id)); target_print_name.Replace(wxT("Bambu Lab "), wxEmptyString); msg_text = wxString::Format(_L("The selected printer (%s) is incompatible with the print file configuration (%s). Please adjust the printer preset in the prepare page or choose a compatible printer on this page."), sourcet_print_name, target_print_name); @@ -1728,7 +1740,7 @@ bool SelectMachineDialog::is_blocking_printing(MachineObject* obj_) } if (source_model != target_model) { - std::vector compatible_machine = dev->get_compatible_machine(target_model); + std::vector compatible_machine = obj_->get_compatible_machine(); vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); if (it == compatible_machine.end()) { return true; @@ -1762,7 +1774,7 @@ static std::unordered_set _get_used_nozzle_idxes() } -static bool _is_nozzle_data_valid(MachineObject* obj_, const ExtderData &ext_data) +static bool _is_nozzle_data_valid(MachineObject* obj_, const DevExtderSystem &ext_data) { if (obj_ == nullptr) return false; @@ -1774,9 +1786,9 @@ static bool _is_nozzle_data_valid(MachineObject* obj_, const ExtderData &ext_dat for (int used_filament_idx : used_filament_idxs) { int used_nozzle_idx = cur_plate->get_physical_extruder_by_filament_id(preset_bundle->full_config(), used_filament_idx); - if (ext_data.extders[used_nozzle_idx].current_nozzle_type == NozzleType::ntUndefine || - ext_data.extders[used_nozzle_idx].current_nozzle_diameter <= 0.0f || - ext_data.extders[used_nozzle_idx].current_nozzle_flow_type == NozzleFlowType::NONE_FLOWTYPE) { + if (ext_data.GetNozzleType(used_nozzle_idx) == NozzleType::ntUndefine || + ext_data.GetNozzleDiameter(used_nozzle_idx) <= 0.0f || + ext_data.GetNozzleFlowType(used_nozzle_idx) == NozzleFlowType::NONE_FLOWTYPE) { return false; } } @@ -1818,7 +1830,7 @@ static bool _is_same_nozzle_diameters(MachineObject* obj, float &tag_nozzle_diam } tag_nozzle_diameter = float(opt_nozzle_diameters->get_at(used_nozzle_idx)); - if (tag_nozzle_diameter != obj->m_extder_data.extders[used_nozzle_idx].current_nozzle_diameter) + if (tag_nozzle_diameter != obj->GetExtderSystem()->GetNozzleDiameter(used_nozzle_idx)) { mismatch_nozzle_id = used_nozzle_idx; return false; @@ -1833,9 +1845,9 @@ static bool _is_same_nozzle_diameters(MachineObject* obj, float &tag_nozzle_diam return true; } -bool SelectMachineDialog::is_nozzle_hrc_matched(const Extder& extruder, std::string& filament_type) const +bool SelectMachineDialog::is_nozzle_hrc_matched(const DevExtder* extruder, std::string& filament_type) const { - auto printer_nozzle_hrc = Print::get_hrc_by_nozzle_type(extruder.current_nozzle_type); + auto printer_nozzle_hrc = Print::get_hrc_by_nozzle_type(extruder->GetNozzleType()); auto preset_bundle = wxGetApp().preset_bundle; MaterialHash::const_iterator iter = m_materialList.begin(); @@ -1864,7 +1876,7 @@ bool SelectMachineDialog::is_same_printer_model() MachineObject* obj_ = dev->get_selected_machine(); - assert(obj_->dev_id == m_printer_last_select); + assert(obj_->get_dev_id() == m_printer_last_select); if (obj_ == nullptr) { return result; } @@ -1972,7 +1984,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) std::string action; wxString info; wxString wiki_url; - DeviceManager::check_filaments_in_blacklist_url(obj_->printer_type, filament_brand, filament_type, m_ams_mapping_result[i].filament_id, ams_id, slot_id, "", in_blacklist, + DevFilaBlacklist::check_filaments_in_blacklist_url(obj_->printer_type, filament_brand, filament_type, m_ams_mapping_result[i].filament_id, ams_id, slot_id, "", in_blacklist, action, info, wiki_url); if (in_blacklist && action == "warning") { confirm_text.push_back(ConfirmBeforeSendInfo(info, wiki_url)); @@ -1984,13 +1996,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) bool has_show_traditional_timelapse_waring = false; for (auto warning : plate->get_slice_result()->warnings) { - if (warning.msg == BED_TEMP_TOO_HIGH_THAN_FILAMENT) { - if ((obj_->get_printer_is_enclosed())){ - // confirm_text.push_back(Plater::get_slice_warning_string(warning) + "\n"); - // has_slice_warnings = true; - } - } - else if (warning.msg == NOT_SUPPORT_TRADITIONAL_TIMELAPSE) { + if (warning.msg == NOT_SUPPORT_TRADITIONAL_TIMELAPSE) { if (!has_show_traditional_timelapse_waring && (m_checkbox_list["timelapse"]->getValue() == "on")) { confirm_text.push_back(ConfirmBeforeSendInfo(Plater::get_slice_warning_string(warning))); has_show_traditional_timelapse_waring = true; @@ -2019,7 +2025,7 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event) //check for unidentified material - auto mapping_result = m_mapping_popup.parse_ams_mapping(obj_->amsList); + auto mapping_result = m_mapping_popup.parse_ams_mapping(obj_->GetFilaSystem()->GetAmsList()); auto has_unknown_filament = false; for (auto i = 0; i < m_ams_mapping_result.size(); i++) { @@ -2248,14 +2254,16 @@ void SelectMachineDialog::update_option_opts(MachineObject *obj) } /*nozzle_offset_cali*/ - if (obj->is_support_nozzle_offset_cali) { + bool support_cali_nozzle_offset = obj->GetConfig()->SupportCalibrationNozzleOffset(); + if (support_cali_nozzle_offset) { m_checkbox_list["nozzle_offset_cali"]->update_options(ops_auto, _L("Calibrate nozzle offsets to enhance print quality.\n*Automatic mode: Check for calibration before printing. Skip if unnecessary.")); } - m_checkbox_list["nozzle_offset_cali"]->Show(obj->is_support_nozzle_offset_cali); + m_checkbox_list["nozzle_offset_cali"]->Show(support_cali_nozzle_offset); /*flow_cali*/ if (obj->is_support_pa_calibration) { - if (obj->is_support_auto_flow_calibration && can_support_auto_cali()) { + if (obj->GetConfig()->SupportCalibrationPA_FlowAuto() && can_support_pa_auto_cali()) + { m_checkbox_list["flow_cali"]->update_options(ops_auto, _L("This process determines the dynamic flow values to improve overall print quality.\n*Automatic mode: Skip if the filament was calibrated recently.")); } else { m_checkbox_list["flow_cali"]->update_options(ops_no_auto, _L("This process determines the dynamic flow values to improve overall print quality.")); @@ -2304,6 +2312,10 @@ bool SelectMachineDialog::is_enable_external_change_assist(std::vectorhas_sdcard = obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL; + m_print_job->has_sdcard = obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_NORMAL; bool timelapse_option = m_checkbox_list["timelapse"]->IsShown()?true:false; @@ -2526,7 +2538,7 @@ void SelectMachineDialog::on_send_print() m_checkbox_list["nozzle_offset_cali"]->getValueInt() ); - if (obj_->has_ams()) { + if (obj_->HasAms()) { bool has_ext = _HasExt(m_ams_mapping_result); bool has_ams = _HasAms(m_ams_mapping_result); @@ -2557,7 +2569,7 @@ void SelectMachineDialog::on_send_print() // update ota version NetworkAgent* agent = wxGetApp().getAgent(); if (agent) { - std::string dev_ota_str = "dev_ota_ver:" + obj_->dev_id; + std::string dev_ota_str = "dev_ota_ver:" + obj_->get_dev_id(); agent->track_update_property(dev_ota_str, obj_->get_ota_version()); } @@ -2716,7 +2728,7 @@ void SelectMachineDialog::reset_timeout() static bool _compare_obj_names(MachineObject* obj1, MachineObject* obj2) { - return obj1->dev_name < obj2->dev_name; + return obj1->get_dev_name() < obj2->get_dev_name(); } /******************************************************************* @@ -2739,7 +2751,7 @@ _collect_sorted_machines(Slic3r::DeviceManager* dev_manager, /* Step 1 :Collect the target and compatible types*/ PresetBundle* preset_bundle = wxGetApp().preset_bundle; const std::string& printer_type = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); - const auto& compatible_types_list = dev_manager->get_compatible_machine(printer_type); + const auto& compatible_types_list = DevPrinterConfigUtil::get_compatible_machine(printer_type); std::set compatible_types_set(compatible_types_list.begin(), compatible_types_list.end()); /* Step 2: collect different machine list*/ @@ -2817,7 +2829,7 @@ void SelectMachineDialog::update_user_printer() m_printer_box->SetPrinters(m_list); if (!m_list.empty()) { - m_printer_last_select = m_list.front()->dev_id; + m_printer_last_select = m_list.front()->get_dev_id(); m_printer_box->GetPrinterComboBox()->SetSelection(0); wxCommandEvent event(wxEVT_COMBOBOX); event.SetEventObject(m_printer_box->GetPrinterComboBox()); @@ -2932,17 +2944,18 @@ void SelectMachineDialog::on_timer(wxTimerEvent &event) MachineObject* obj_ = dev_->get_my_machine(m_printer_last_select); if(!obj_) return; - if (obj_->m_extder_data.total_extder_count > 1) { + if (obj_->GetExtderSystem()->GetTotalExtderCount() > 1) + { change_materialitem_tip(false); /*mapping to both ams and ext, is supported while total_extder_count is 2*/ } else { change_materialitem_tip(true); } - if ( obj_->amsList.empty() + if (!obj_->GetFilaSystem()->HasAms() || obj_->ams_exist_bits == 0 || !obj_->is_support_filament_backup - || !obj_->is_support_show_filament_backup - || !obj_->ams_auto_switch_filament_flag + || !obj_->GetExtderSystem()->HasFilamentBackup() + || !obj_->GetFilaSystem()->IsAutoRefillEnabled() || !_HasAms(m_ams_mapping_result)) { if (m_ams_backup_tip->IsShown()) { m_ams_backup_tip->Hide(); @@ -2998,7 +3011,7 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) m_printer_box->GetPrinterComboBox()->Update(); } - m_printer_last_select = m_list[i]->dev_id; + m_printer_last_select = m_list[i]->get_dev_id(); obj = m_list[i]; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "for send task, current printer id = " << m_printer_last_select << std::endl; @@ -3011,12 +3024,12 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) obj->command_request_push_all(); if (!dev->get_selected_machine()) { dev->set_selected_machine(m_printer_last_select); - }else if (dev->get_selected_machine()->dev_id != m_printer_last_select) { + }else if (dev->get_selected_machine()->get_dev_id() != m_printer_last_select) { dev->set_selected_machine(m_printer_last_select); } // Has changed machine unrecoverably - GUI::wxGetApp().sidebar().load_ams_list(obj->dev_id, obj); + GUI::wxGetApp().sidebar().load_ams_list(obj->get_dev_id(), obj); m_check_flag = false; } else { BOOST_LOG_TRIVIAL(error) << "on_selection_changed dev_id not found"; @@ -3035,7 +3048,7 @@ void SelectMachineDialog::update_ams_check(MachineObject *obj) if (!obj) {return;} if (!obj->is_enable_np) { - if (obj->has_ams()) { + if (obj->HasAms()) { change_materialitem_tip(false); } else { @@ -3080,7 +3093,7 @@ void SelectMachineDialog::update_filament_change_count() int hand_changes_count = curr.filament_change_count - best.filament_change_count; int saving_weight = curr.filament_flush_weight - best.filament_flush_weight; - if (obj->m_extder_data.total_extder_count > 1) { m_link_edit_nozzle->Show(true); } + if (obj->GetExtderSystem()->GetTotalExtderCount() > 1) { m_link_edit_nozzle->Show(true); } if (hand_changes_count > 0 || saving_weight > 0) { m_mapping_sugs_sizer->Show(true); @@ -3123,7 +3136,7 @@ static wxString _check_kval_not_default(const MachineObject* obj, const std::vec static wxString _get_nozzle_name(int total_ext_count, int ext_id) { if (total_ext_count == 2) { - if (ext_id == MAIN_NOZZLE_ID) { + if (ext_id == MAIN_EXTRUDER_ID) { return _L("right nozzle"); } else { return _L("left nozzle"); @@ -3149,7 +3162,7 @@ static wxString _get_ext_loc_str(const std::unordered_set& extruders, int t else if (extruders.size() == 1) { auto iter = extruders.begin(); - if (*iter == MAIN_NOZZLE_ID) + if (*iter == MAIN_EXTRUDER_ID) { return _L("right extruder"); } @@ -3226,7 +3239,8 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) reset_timeout(); /*check print all*/ - if (!obj_->is_support_print_all && m_print_plate_idx == PLATE_ALL_IDX) { + if (!obj_->GetConfig()->SupportPrintAllPlates() && m_print_plate_idx == PLATE_ALL_IDX) + { show_status(PrintDialogStatus::PrintStatusNotSupportedPrintAll); return; } @@ -3289,29 +3303,29 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) } else if (obj_->is_in_printing() || obj_->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { show_status(PrintDialogStatus::PrintStatusInPrinting); return; - } else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { + } else if (!obj_->GetConfig()->SupportPrintWithoutSD() && (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD)) { show_status(PrintDialogStatus::PrintStatusNoSdcard); return; } /*check sdcard when if lan mode printer*/ if (obj_->is_lan_mode_printer()) { - if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { show_status(PrintDialogStatus::PrintStatusLanModeNoSdcard); return; - } else if (obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_ABNORMAL || obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_READONLY) { + } else if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL || obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_READONLY) { show_status(PrintDialogStatus::PrintStatusLanModeSDcardNotAvailable); return; } } - if (!can_support_auto_cali() && m_checkbox_list["flow_cali"]->IsShown() && m_checkbox_list["flow_cali"]->getValue() == "on") { + if (!can_support_pa_auto_cali() && m_checkbox_list["flow_cali"]->IsShown() && m_checkbox_list["flow_cali"]->getValue() == "on") { show_status(PrintDialogStatus::PrintStatusTPUUnsupportAutoCali); return; } /*disable print when there is no mapping*/ - if (obj_->m_extder_data.total_extder_count > 1) { + if (obj_->GetExtderSystem()->GetTotalExtderCount() > 1) { for (auto mres : m_ams_mapping_result) { if (mres.ams_id.empty() && mres.slot_id.empty()) { show_status(PrintDialogStatus::PrintStatusInvalidMapping); @@ -3325,13 +3339,13 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) /*the nozzle type of preset and machine are different*/ if (nozzle_nums > 1 && m_print_type == FROM_NORMAL) { - if (!_is_nozzle_data_valid(obj_, obj_->m_extder_data)) { + if (!_is_nozzle_data_valid(obj_, *obj_->GetExtderSystem())) { show_status(PrintDialogStatus::PrintStatusNozzleDataInvalid); return; } wxString error_message; - if (!is_nozzle_type_match(obj_->m_extder_data, error_message)) { + if (!is_nozzle_type_match(*obj_->GetExtderSystem(), error_message)) { std::vector params{error_message}; params.emplace_back(_L("Tips: If you changed your nozzle of your printer lately, Please go to 'Device -> Printer parts' to change your nozzle setting.")); show_status(PrintDialogStatus::PrintStatusNozzleMatchInvalid, params); @@ -3347,9 +3361,9 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) if (!_is_same_nozzle_diameters(obj_, nozzle_diameter, mismatch_nozzle_id)) { std::vector msg_params; - if (obj_->m_extder_data.total_extder_count == 2) { + if (obj_->GetExtderSystem()->GetTotalExtderCount() == 2) { wxString mismatch_nozzle_str; - if (mismatch_nozzle_id == MAIN_NOZZLE_ID) { + if (mismatch_nozzle_id == MAIN_EXTRUDER_ID) { mismatch_nozzle_str = _L("right nozzle"); } else { mismatch_nozzle_str = _L("left nozzle"); @@ -3358,13 +3372,13 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) const wxString &nozzle_config = wxString::Format(_L("The %s diameter(%.1fmm) of current printer doesn't match with the slicing file (%.1fmm). " "Please make sure the nozzle installed matches with settings in printer, then set the " "corresponding printer preset when slicing."), - mismatch_nozzle_str, obj_->m_extder_data.extders[mismatch_nozzle_id].current_nozzle_diameter, nozzle_diameter); + mismatch_nozzle_str, obj_->GetExtderSystem()->GetNozzleDiameter(mismatch_nozzle_id), nozzle_diameter); msg_params.emplace_back(nozzle_config); } else { const wxString &nozzle_config = wxString::Format(_L("The current nozzle diameter (%.1fmm) doesn't match with the slicing file (%.1fmm). " "Please make sure the nozzle installed matches with settings in printer, then set the " "corresponding printer preset when slicing."), - obj_->m_extder_data.extders[0].current_nozzle_diameter, nozzle_diameter); + obj_->GetExtderSystem()->GetNozzleDiameter(0), nozzle_diameter); msg_params.emplace_back(nozzle_config); } @@ -3374,14 +3388,14 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) } const auto &used_nozzle_idxes = _get_used_nozzle_idxes(); - for (const auto &extder : obj_->m_extder_data.extders) { - if (used_nozzle_idxes.count(extder.nozzle_id) == 0) { continue; } + for (const auto &extder : obj_->GetExtderSystem()->GetExtruders()) { + if (used_nozzle_idxes.count(extder.GetNozzleId()) == 0) { continue; } std::string filament_type; - if (!is_nozzle_hrc_matched(extder, filament_type)) { + if (!is_nozzle_hrc_matched(&extder, filament_type)) { std::vector error_msg; error_msg.emplace_back(wxString::Format(_L("The hardness of current material (%s) exceeds the hardness of %s(%s). Please verify the nozzle or material settings and try again."), - filament_type, _get_nozzle_name(obj_->m_extder_data.total_extder_count, extder.nozzle_id), format_steel_name(extder.current_nozzle_type))); + filament_type, _get_nozzle_name(obj_->GetExtderSystem()->GetTotalExtderCount(), extder.GetNozzleId()), format_steel_name(extder.GetNozzleType()))); show_status(PrintDialogStatus::PrintStatusNozzleTypeMismatch, error_msg); return; } @@ -3397,12 +3411,12 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) } } - if (obj_->is_ams_on_settingup()) { + if (obj_->GetFilaSystem()->IsAmsSettingUp()) { show_status(PrintDialogStatus::PrintStatusAmsOnSettingup); return; } - if (!m_ams_mapping_res && !obj_->is_valid_mapping_result(m_ams_mapping_result)) { + if (!m_ams_mapping_res && !DevMappingUtil::is_valid_mapping_result(obj_, m_ams_mapping_result)) { show_status(PrintDialogStatus::PrintStatusAmsMappingInvalid); return; } @@ -3425,7 +3439,7 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) std::string action; wxString info; wxString wiki_url; - DeviceManager::check_filaments_in_blacklist_url(obj_->printer_type, filament_brand, filament_type, m_ams_mapping_result[i].filament_id, ams_id, slot_id, "", in_blacklist, + DevFilaBlacklist::check_filaments_in_blacklist_url(obj_->printer_type, filament_brand, filament_type, m_ams_mapping_result[i].filament_id, ams_id, slot_id, "", in_blacklist, action, info, wiki_url); if (in_blacklist) { @@ -3452,7 +3466,7 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) if (item.ams_id.empty()) continue; int extruder_id = obj_->get_extruder_id_by_ams_id(item.ams_id); - if (DeviceManager::is_virtual_slot(stoi(item.ams_id))) + if (devPrinterUtil::IsVirtualSlot(item.ams_id)) extruder_status[extruder_id].has_vt_slot = true; else extruder_status[extruder_id].has_ams = true; @@ -3469,7 +3483,7 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) // return; } } else { - if (obj_->is_valid_mapping_result(m_ams_mapping_result)) { + if (DevMappingUtil::is_valid_mapping_result(obj_, m_ams_mapping_result)) { if (!check_sdcard_for_timelpase(obj_)) { if (has_timelapse_warning()) { show_status(PrintDialogStatus::PrintStatusTimelapseWarning); @@ -3490,13 +3504,13 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) } /*Check the tpu at right*/ - if (obj_->m_extder_data.total_extder_count == 2) { + if (obj_->GetExtderSystem()->GetTotalExtderCount() == 2) { for (const FilamentInfo& item : m_ams_mapping_result) { if (item.ams_id.empty()) continue; if (item.type.compare("TPU") != 0 && item.type.compare("TPU-AMS") != 0) { continue; } int extruder_id = obj_->get_extruder_id_by_ams_id(item.ams_id); - if (extruder_id == MAIN_NOZZLE_ID) { + if (extruder_id == MAIN_EXTRUDER_ID) { show_status(PrintDialogStatus::PrintStatusWarningTpuRightColdPulling); break; } @@ -3513,22 +3527,22 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) try { int chamber_temp = chamber_temperatures->values[item.id]; - if (chamber_temp >= obj_->chamber_temp_switch_heat) {// check close door + if (chamber_temp >= obj_->GetConfig()->GetChamberTempSwitchHeat()) {// check close door show_status(PrintDialogStatus::PrintStatusFilamentWarningHighChamberTempCloseDoor); if (PrePrintChecker::is_error(PrintDialogStatus::PrintStatusFilamentWarningHighChamberTempCloseDoor)) { return; } } - for (const auto& extder : obj_->m_extder_data.extders) { // check vitrification - if (extder.ext_has_filament) { - const auto& fila_id = obj_->get_filament_id(extder.snow.ams_id, extder.snow.slot_id); + for (const auto& extder : obj_->GetExtderSystem()->GetExtruders()) { // check vitrification + if (extder.HasFilamentInExt()) { + const auto& fila_id = obj_->get_filament_id(extder.GetSlotNow().ams_id, extder.GetSlotNow().slot_id); auto filament_info = wxGetApp().preset_bundle->get_filament_by_filament_id(fila_id); if (filament_info) { if (filament_info->temperature_vitrification - chamber_temp <= 5) { - known_fila_soften_extruders.insert(extder.id); + known_fila_soften_extruders.insert(extder.GetExtId()); } } else { // the minimum temperature_vitrification of the known filaments is 43 degrees - if (43 - chamber_temp <= 5) { unknown_fila_soften_extruders.insert(extder.id); } + if (43 - chamber_temp <= 5) { unknown_fila_soften_extruders.insert(extder.GetExtId()); } } } } @@ -3538,14 +3552,14 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_) if (!known_fila_soften_extruders.empty()) { const wxString& msg = wxString::Format(_L("The filament on %s may soften. Please unload."), - _get_ext_loc_str(known_fila_soften_extruders, obj_->m_extder_data.total_extder_count)); + _get_ext_loc_str(known_fila_soften_extruders, obj_->GetExtderSystem()->GetTotalExtderCount())); show_status(PrintDialogStatus::PrintStatusFilamentWarningHighChamberTempSoft, std::vector {msg}); if (PrePrintChecker::is_error(PrintDialogStatus::PrintStatusFilamentWarningHighChamberTempSoft)) { return; } } if (!unknown_fila_soften_extruders.empty()) { const wxString& msg = wxString::Format(_L("The filament on %s is unknown and may soften. Please set filament."), - _get_ext_loc_str(unknown_fila_soften_extruders, obj_->m_extder_data.total_extder_count)); + _get_ext_loc_str(unknown_fila_soften_extruders, obj_->GetExtderSystem()->GetTotalExtderCount())); show_status(PrintDialogStatus::PrintStatusFilamentWarningUnknownHighChamberTempSoft, std::vector {msg}); if (PrePrintChecker::is_error(PrintDialogStatus::PrintStatusFilamentWarningUnknownHighChamberTempSoft)) { return; } } @@ -3573,7 +3587,7 @@ bool SelectMachineDialog::has_timelapse_warning(wxString &msg_text) return false; } -bool SelectMachineDialog::can_support_auto_cali() +bool SelectMachineDialog::can_support_pa_auto_cali() { DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (!dev) @@ -3582,7 +3596,7 @@ bool SelectMachineDialog::can_support_auto_cali() if (!obj) return true; - std::vector unsupport_auto_cali_filaments = DeviceManager::get_unsupport_auto_cali_filaments(obj->printer_type); + std::vector unsupport_auto_cali_filaments = DevPrinterConfigUtil::get_unsupport_auto_cali_filaments(obj->printer_type); if (!unsupport_auto_cali_filaments.empty()) { auto iter = std::find_if(m_filaments.begin(), m_filaments.end(), [&unsupport_auto_cali_filaments](const FilamentInfo &item) { @@ -3885,7 +3899,7 @@ void SelectMachineDialog::reset_and_sync_ams_list() size_t nozzle_nums = full_config.option("nozzle_diameter")->values.size(); if (nozzle_nums > 1) { - if (obj_ && can_hybrid_mapping(obj_->m_extder_data)) + if (obj_ && can_hybrid_mapping(*obj_->GetExtderSystem())) { m_mapping_popup.set_show_type(ShowType::LEFT_AND_RIGHT); } @@ -3906,7 +3920,7 @@ void SelectMachineDialog::reset_and_sync_ams_list() pos.y += item->GetRect().height; m_mapping_popup.Move(pos); - if (obj_ && obj_->dev_id == m_printer_last_select) { + if (obj_ && obj_->get_dev_id() == m_printer_last_select) { m_mapping_popup.set_parent_item(item); m_mapping_popup.set_only_show_ext_spool(false); m_mapping_popup.set_current_filament_id(extruder); @@ -4265,7 +4279,7 @@ void SelectMachineDialog::set_default_from_sdcard() MachineObject *obj_ = dev_manager->get_selected_machine(); if (!obj_) { return; }; - m_printer_box->SetPrinterName(wxString::FromUTF8(obj_->dev_name)); + m_printer_box->SetPrinterName(wxString::FromUTF8(obj_->get_dev_name())); m_print_plate_total = m_required_data_plate_data_list.size(); update_page_turn_state(true); @@ -4398,7 +4412,7 @@ void SelectMachineDialog::set_default_from_sdcard() m_mapping_popup.Move(pos); if (diameters_count > 1) { - if (obj_ && can_hybrid_mapping(obj_->m_extder_data)) { + if (obj_ && can_hybrid_mapping(*obj_->GetExtderSystem())) { m_mapping_popup.set_show_type(ShowType::LEFT_AND_RIGHT); } else if (m_filaments_map[m_current_filament_id] == 1) { m_mapping_popup.set_show_type(ShowType::LEFT); @@ -4409,7 +4423,7 @@ void SelectMachineDialog::set_default_from_sdcard() m_mapping_popup.set_show_type(ShowType::RIGHT); } - if (obj_ && obj_->dev_id == m_printer_last_select) + if (obj_ && obj_->get_dev_id() == m_printer_last_select) { m_mapping_popup.set_parent_item(item); m_mapping_popup.set_current_filament_id(fo.id); @@ -5046,13 +5060,13 @@ static wxString _get_tips(MachineObject* obj_) tips = obj_->get_printer_type_display_str(); wxString ext_diameter; - if (obj_->m_extder_data.total_extder_count == 1) { - ext_diameter += wxString::FromDouble(obj_->m_extder_data.extders[0].current_nozzle_diameter); + if (obj_->GetExtderSystem()->GetTotalExtderCount() == 1) { + ext_diameter += wxString::FromDouble(obj_->GetExtderSystem()->GetNozzleDiameter(0)); ext_diameter += "mm"; - } else if (obj_->m_extder_data.total_extder_count == 2) { - ext_diameter += wxString::FromDouble(obj_->m_extder_data.extders[1].current_nozzle_diameter);//Left + } else if (obj_->GetExtderSystem()->GetTotalExtderCount() == 2) { + ext_diameter += wxString::FromDouble(obj_->GetExtderSystem()->GetNozzleDiameter(1));//Left ext_diameter += "/"; - ext_diameter += wxString::FromDouble(obj_->m_extder_data.extders[0].current_nozzle_diameter); + ext_diameter += wxString::FromDouble(obj_->GetExtderSystem()->GetNozzleDiameter(0)); ext_diameter += "mm"; } else { assert(0); @@ -5073,7 +5087,7 @@ void PrinterInfoBox::SetPrinters(const std::vector& sorted_print std::vector drop_items; for (MachineObject* obj : sorted_printers) { - wxString shown_dev_name = wxString::FromUTF8(obj->dev_name); + wxString shown_dev_name = wxString::FromUTF8(obj->get_dev_name()); if (obj->is_lan_mode_printer()) { shown_dev_name += "(LAN)"; } diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index ba35ac5906..0e45f543a6 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -50,6 +50,12 @@ #define PRINT_OPT_BG_GRAY 0xF8F8F8 #define PRINT_OPT_ITEM_BG_GRAY 0xEEEEEE + +// Previous definitions +namespace Slic3r{ + class DevExtder; +} + namespace Slic3r { namespace GUI { std::string get_nozzle_volume_type_cloud_string(NozzleVolumeType nozzle_volume_type); @@ -476,10 +482,10 @@ public: void update_print_error_info(int code, std::string msg, std::string extra); bool has_timelapse_warning(wxString& msg); bool has_timelapse_warning() { wxString msg; return has_timelapse_warning(msg);}; - bool can_support_auto_cali(); + bool can_support_pa_auto_cali(); bool is_same_printer_model(); bool is_blocking_printing(MachineObject* obj_); - bool is_nozzle_hrc_matched(const Extder& extruder, std::string& filament_type) const; + bool is_nozzle_hrc_matched(const DevExtder* extruder, std::string& filament_type) const; bool check_sdcard_for_timelpase(MachineObject* obj); bool is_timeout(); int update_print_required_data(Slic3r::DynamicPrintConfig config, Slic3r::Model model, Slic3r::PlateDataPtrs plate_data_list, std::string file_name, std::string file_path); @@ -489,9 +495,9 @@ public: bool do_ams_mapping(MachineObject *obj_,bool use_ams); bool get_ams_mapping_result(std::string& mapping_array_str, std::string& mapping_array_str2, std::string& ams_mapping_info); bool build_nozzles_info(std::string& nozzles_info); - bool can_hybrid_mapping(ExtderData data); - void auto_supply_with_ext(std::vector slots); - bool is_nozzle_type_match(ExtderData data, wxString& error_message) const; + bool can_hybrid_mapping(DevExtderSystem data); + void auto_supply_with_ext(std::vector slots); + bool is_nozzle_type_match(DevExtderSystem data, wxString& error_message) const; int convert_filament_map_nozzle_id_to_task_nozzle_id(int nozzle_id); PrintFromType get_print_type() {return m_print_type;}; diff --git a/src/slic3r/GUI/SelectMachinePop.cpp b/src/slic3r/GUI/SelectMachinePop.cpp index 8417a1cb46..9fa330b58c 100644 --- a/src/slic3r/GUI/SelectMachinePop.cpp +++ b/src/slic3r/GUI/SelectMachinePop.cpp @@ -28,6 +28,8 @@ #include "BitmapCache.hpp" #include "BindDialog.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_UPDATE_WINDOWS_POSITION, wxCommandEvent); @@ -169,7 +171,7 @@ void MachineObjectPanel::doRender(wxDC &dc) dc.SetTextForeground(StateColor::darkModeColorFor(SELECT_MACHINE_GREY900)); wxString dev_name = ""; if (m_info) { - dev_name = from_u8(m_info->dev_name); + dev_name = from_u8(m_info->get_dev_name()); if (m_state == PrinterState::IN_LAN) { dev_name += _L("(LAN)"); @@ -270,7 +272,7 @@ void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt) GetEventHandler()->ProcessEvent(event); } else { if (m_info) { - wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + wxGetApp().mainframe->jump_to_monitor(m_info->get_dev_id()); } //wxGetApp().mainframe->SetFocus(); wxCommandEvent event(EVT_DISSMISS_MACHINE_LIST); @@ -281,14 +283,14 @@ void MachineObjectPanel::on_mouse_left_up(wxMouseEvent &evt) } if (m_info && m_info->is_lan_mode_printer()) { if (m_info->has_access_right() && m_info->is_avaliable()) { - wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + wxGetApp().mainframe->jump_to_monitor(m_info->get_dev_id()); } else { wxCommandEvent event(EVT_CONNECT_LAN_PRINT); event.SetEventObject(this); wxPostEvent(this, event); } } else { - wxGetApp().mainframe->jump_to_monitor(m_info->dev_id); + wxGetApp().mainframe->jump_to_monitor(m_info->get_dev_id()); } } else { if (m_info && m_info->is_lan_mode_printer()) { @@ -491,7 +493,7 @@ void SelectMachinePopup::update_other_devices() { DeviceManager* dev = wxGetApp().getDeviceManager(); if (!dev) return; - m_free_machine_list = dev->get_local_machine_list(); + m_free_machine_list = dev->get_local_machinelist(); BOOST_LOG_TRIVIAL(trace) << "SelectMachinePopup update_other_devices start"; this->Freeze(); @@ -507,7 +509,7 @@ void SelectMachinePopup::update_other_devices() continue; /* do not show printer in my list */ - auto it = m_bind_machine_list.find(mobj->dev_id); + auto it = m_bind_machine_list.find(mobj->get_dev_id()); if (it != m_bind_machine_list.end()) continue; @@ -559,7 +561,7 @@ void SelectMachinePopup::update_other_devices() ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); dlg.set_machine_object(mobj); if (dlg.ShowModal() == wxID_OK) { - wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); + wxGetApp().mainframe->jump_to_monitor(mobj->get_dev_id()); } } } @@ -570,7 +572,7 @@ void SelectMachinePopup::update_other_devices() dlg.update_machine_info(mobj); int dlg_result = wxID_CANCEL; dlg_result = dlg.ShowModal(); - if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); } + if (dlg_result == wxID_OK) { wxGetApp().mainframe->jump_to_monitor(mobj->get_dev_id()); } }); } @@ -634,7 +636,7 @@ void SelectMachinePopup::update_user_devices() std::sort(user_machine_list.begin(), user_machine_list.end(), [&](auto& a, auto&b) { if (a.second && b.second) { - return a.second->dev_name.compare(b.second->dev_name) < 0; + return a.second->get_dev_name().compare(b.second->get_dev_name()) < 0; } return false; }); @@ -690,7 +692,7 @@ void SelectMachinePopup::update_user_devices() if (mobj) { AppConfig* config = wxGetApp().app_config; if (config) { - config->erase_local_machine(mobj->dev_id); + config->erase_local_machine(mobj->get_dev_id()); } mobj->set_access_code(""); @@ -739,7 +741,7 @@ void SelectMachinePopup::update_user_devices() ConnectPrinterDialog dlg(wxGetApp().mainframe, wxID_ANY, _L("Input access code")); dlg.set_machine_object(mobj); if (dlg.ShowModal() == wxID_OK) { - wxGetApp().mainframe->jump_to_monitor(mobj->dev_id); + wxGetApp().mainframe->jump_to_monitor(mobj->get_dev_id()); } } } @@ -776,14 +778,14 @@ bool SelectMachinePopup::search_for_printer(MachineObject* obj) return true; } - const auto& name = wxString::FromUTF8(obj->dev_name).ToStdString(); + const auto& name = wxString::FromUTF8(obj->get_dev_name()).ToStdString(); const auto& name_it = name.find(search_text); if (name_it != std::string::npos) { return true; } #if !BBL_RELEASE_TO_PUBLIC - const auto& ip_it = obj->dev_ip.find(search_text); + const auto& ip_it = obj->get_dev_ip().find(search_text); if (ip_it != std::string::npos) { return true; } @@ -908,7 +910,7 @@ void EditDevNameDialog::set_machine_obj(MachineObject *obj) { m_info = obj; if (m_info) - m_textCtr->GetTextCtrl()->SetValue(from_u8(m_info->dev_name)); + m_textCtr->GetTextCtrl()->SetValue(from_u8(m_info->get_dev_name())); } void EditDevNameDialog::on_dpi_changed(const wxRect &suggested_rect) @@ -974,7 +976,7 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) auto utf8_str = new_dev_name.ToUTF8(); auto name = std::string(utf8_str.data(), utf8_str.length()); if (m_info) - dev->modify_device_name(m_info->dev_id, name); + dev->modify_device_name(m_info->get_dev_id(), name); } DPIDialog::EndModal(wxID_CLOSE); } diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index 0b647fceb4..0e8a20b695 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -7,6 +7,9 @@ #include "Widgets/RadioBox.hpp" #include +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevStorage.h" + namespace Slic3r { namespace GUI { @@ -203,7 +206,7 @@ void SendDeviceItem::doRender(wxDC& dc) left += FromDIP(SEND_LEFT_PRINTABLE); //dev names - DrawTextWithEllipsis(dc, wxString::FromUTF8(get_obj()->dev_name), FromDIP(SEND_LEFT_DEV_NAME), left); + DrawTextWithEllipsis(dc, wxString::FromUTF8(get_obj()->get_dev_name()), FromDIP(SEND_LEFT_DEV_NAME), left); left += FromDIP(SEND_LEFT_DEV_NAME); //device state @@ -225,7 +228,7 @@ void SendDeviceItem::doRender(wxDC& dc) //AMS - if (!obj_->has_ams()) { + if (!obj_->HasAms()) { DrawTextWithEllipsis(dc, _L("No AMS"), FromDIP(SEND_LEFT_DEV_NAME), left); } else { @@ -241,7 +244,7 @@ void SendDeviceItem::doRender(wxDC& dc) void SendDeviceItem::post_event(wxCommandEvent&& event) { event.SetEventObject(this); - event.SetString(obj_->dev_id); + event.SetString(obj_->get_dev_id()); event.SetInt(state_selected); wxPostEvent(this, event); } @@ -488,9 +491,9 @@ BBL::PrintParams SendMultiMachinePage::request_params(MachineObject* obj) else curr_plate_idx = m_plater->get_partplate_list().get_curr_plate_index() + 1; - params.dev_ip = obj->dev_ip; - params.dev_id = obj->dev_id; - params.dev_name = obj->dev_name; + params.dev_ip = obj->get_dev_ip(); + params.dev_id = obj->get_dev_id(); + params.dev_name = obj->get_dev_name(); params.ftp_folder = obj->get_ftp_folder(); params.connection_type = obj->connection_type(); params.print_type = "from_normal"; @@ -601,7 +604,7 @@ BBL::PrintParams SendMultiMachinePage::request_params(MachineObject* obj) params.comments = "no_ip"; else if (obj->is_support_cloud_print_only) params.comments = "low_version"; - else if (obj->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) + else if (obj->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) params.comments = "no_sdcard"; else if (params.password.empty()) params.comments = "no_password"; diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp index afa488c725..761e942adf 100644 --- a/src/slic3r/GUI/SendToPrinter.cpp +++ b/src/slic3r/GUI/SendToPrinter.cpp @@ -23,6 +23,9 @@ #include #include "BitmapCache.hpp" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevStorage.h" + namespace Slic3r { namespace GUI { @@ -803,7 +806,7 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event) m_comboBox_printer->SetTextLabel(""); return; } - assert(obj_->dev_id == m_printer_last_select); + assert(obj_->get_dev_id() == m_printer_last_select); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", print_job: for send task, current printer id = " << m_printer_last_select << std::endl; show_status(PrintDialogStatus::PrintStatusSending); @@ -960,7 +963,7 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event) } else { auto m_send_job = std::make_unique(m_printer_last_select); - m_send_job->m_dev_ip = obj_->dev_ip; + m_send_job->m_dev_ip = obj_->get_dev_ip(); m_send_job->m_access_code = obj_->get_access_code(); @@ -979,7 +982,7 @@ void SendToPrinterDialog::on_ok(wxCommandEvent &event) #endif m_send_job->connection_type = obj_->connection_type(); m_send_job->cloud_print_only = true; - m_send_job->has_sdcard = obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL; + m_send_job->has_sdcard = obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_NORMAL; m_send_job->set_project_name(m_current_project_name.utf8_string()); enable_prepare_mode = false; @@ -1116,15 +1119,15 @@ void SendToPrinterDialog::update_user_printer() // same machine only appear once for (auto it = option_list.begin(); it != option_list.end(); it++) { if (it->second && (it->second->is_online() || it->second->is_connected())) { - machine_list.push_back(it->second->dev_name); + machine_list.push_back(it->second->get_dev_name()); } } machine_list = sort_string(machine_list); for (auto tt = machine_list.begin(); tt != machine_list.end(); tt++) { for (auto it = option_list.begin(); it != option_list.end(); it++) { - if (it->second->dev_name == *tt) { + if (it->second->get_dev_name() == *tt) { m_list.push_back(it->second); - wxString dev_name_text = from_u8(it->second->dev_name); + wxString dev_name_text = from_u8(it->second->get_dev_name()); if (it->second->is_lan_mode_printer()) { dev_name_text += "(LAN)"; } @@ -1143,7 +1146,7 @@ void SendToPrinterDialog::update_user_printer() } if (obj) { - m_printer_last_select = obj->dev_id; + m_printer_last_select = obj->get_dev_id(); } else { m_printer_last_select = ""; } @@ -1151,14 +1154,14 @@ void SendToPrinterDialog::update_user_printer() if (m_list.size() > 0) { // select a default machine if (m_printer_last_select.empty()) { - m_printer_last_select = m_list[0]->dev_id; + m_printer_last_select = m_list[0]->get_dev_id(); m_comboBox_printer->SetSelection(0); wxCommandEvent event(wxEVT_COMBOBOX); event.SetEventObject(m_comboBox_printer); wxPostEvent(m_comboBox_printer, event); } for (auto i = 0; i < m_list.size(); i++) { - if (m_list[i]->dev_id == m_printer_last_select) { + if (m_list[i]->get_dev_id() == m_printer_last_select) { m_comboBox_printer->SetSelection(i); wxCommandEvent event(wxEVT_COMBOBOX); event.SetEventObject(m_comboBox_printer); @@ -1203,7 +1206,7 @@ void SendToPrinterDialog::on_selection_changed(wxCommandEvent &event) MachineObject* obj = nullptr; for (int i = 0; i < m_list.size(); i++) { if (i == selection) { - m_printer_last_select = m_list[i]->dev_id; + m_printer_last_select = m_list[i]->get_dev_id(); obj = m_list[i]; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "for send task, current printer id = " << m_printer_last_select << std::endl; break; @@ -1216,7 +1219,7 @@ void SendToPrinterDialog::on_selection_changed(wxCommandEvent &event) if (!dev->get_selected_machine()) { dev->set_selected_machine(m_printer_last_select); if (m_file_sys) m_file_sys.reset(); - }else if (dev->get_selected_machine()->dev_id != m_printer_last_select) { + }else if (dev->get_selected_machine()->get_dev_id() != m_printer_last_select) { m_ability_list.clear(); //update_storage_list(std::vector()); dev->set_selected_machine(m_printer_last_select); @@ -1290,7 +1293,7 @@ void SendToPrinterDialog::update_show_status() // check sdcard when if lan mode printer /* if (obj_->is_lan_mode_printer()) { }*/ - if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { show_status(PrintDialogStatus::PrintStatusNoSdcard); return; } @@ -1316,7 +1319,7 @@ void SendToPrinterDialog::update_show_status() show_status(PrintDialogStatus::PrintStatusReadingFinished); return; } else/* if (obj_->connection_type() == "cloud")*/ { - std::string dev_id = obj_->dev_ip; + std::string dev_id = obj_->get_dev_ip(); if (m_file_sys) { if (dev_id == m_device_select) { if ((m_waiting_enable && IsEnabled()) || (m_waiting_support && obj_->get_file_remote())) @@ -1497,7 +1500,7 @@ bool SendToPrinterDialog::is_blocking_printing(MachineObject* obj_) auto target_model = obj_->printer_type; if (source_model != target_model) { - std::vector compatible_machine = dev->get_compatible_machine(target_model); + std::vector compatible_machine = obj_->get_compatible_machine(); vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); if (it == compatible_machine.end()) { return true; @@ -1863,7 +1866,7 @@ void SendToPrinterDialog::fetchUrl(boost::weak_ptr wfs) } std::string dev_ver = obj->get_ota_version(); - std::string dev_id = obj->dev_id; + std::string dev_id = obj->get_dev_id(); int remote_proto = obj->get_file_remote(); if (!remote_proto) { m_waiting_support = true; @@ -1884,7 +1887,7 @@ void SendToPrinterDialog::fetchUrl(boost::weak_ptr wfs) if (agent) { if (m_tcp_try_connect) { - std::string devIP = obj->dev_ip; + std::string devIP = obj->get_dev_ip(); std::string accessCode = obj->get_access_code(); std::string tcp_url = "bambu:///local/" + devIP + "?port=6000&user=" + "bblp" + "&passwd=" + accessCode; CallAfter([=] { @@ -1899,7 +1902,7 @@ void SendToPrinterDialog::fetchUrl(boost::weak_ptr wfs) } else if (m_tutk_try_connect){ std::string protocols[] = {"", "\"tutk\"", "\"agora\"", "\"tutk\",\"agora\""}; - agent->get_camera_url(obj->dev_id + "|" + dev_ver + "|" + protocols[1], [this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) { + agent->get_camera_url(obj->get_dev_id() + "|" + dev_ver + "|" + protocols[1], [this, wfs, m = dev_id, v = agent->get_version(), dv = dev_ver](std::string url) { if (boost::algorithm::starts_with(url, "bambu:///")) { url += "&device=" + m; url += "&net_ver=" + v; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 1902eef463..4e28facc95 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -23,6 +23,17 @@ #include #include +#include "DeviceCore/DevBed.h" +#include "DeviceCore/DevCtrl.h" +#include "DeviceCore/DevFan.h" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevLamp.h" +#include "DeviceCore/DevStorage.h" + +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevPrintTaskInfo.h" + namespace Slic3r { namespace GUI { @@ -417,43 +428,37 @@ void ExtruderSwithingStatus::updateBy(MachineObject *obj) /*do not display while command sended in a mean while*/ if ((time(nullptr) - m_last_ctrl_time) > HOLD_TIME_6SEC) { - updateBy(obj->m_extder_data); + updateBy(obj->GetExtderSystem()); } } } -void ExtruderSwithingStatus::updateBy(const ExtderData& ext_data) +void ExtruderSwithingStatus::updateBy(const DevExtderSystem* ext_system) { - Show(ext_data.total_extder_count > 1); + Show(ext_system->GetTotalExtderCount() > 1); if (!IsShown()) { return; } - updateSwitchingLabel(ext_data.switch_extder_state); - updateBtnGroup(ext_data); -} + auto state = ext_system->GetSwitchState(); + { + if (state == DevExtderSwitchState::ES_SWITCHING) + { + m_switching_status_label->SetLabel(_L("Switching...")); + m_switching_status_label->SetForegroundColour(StateColor::darkModeColorFor("#262E30")); + m_switching_status_label->Show(true); + } + else if (state == DevExtderSwitchState::ES_SWITCHING_FAILED) + { + m_switching_status_label->SetLabel(_L("Switching failed")); + m_switching_status_label->SetForegroundColour(StateColor::darkModeColorFor(*wxRED)); + m_switching_status_label->Show(true); + } + else + { + m_switching_status_label->Show(false); + } + } -void ExtruderSwithingStatus::updateSwitchingLabel(const ExtruderSwitchState &state) -{ - if (state == ExtruderSwitchState::ES_SWITCHING) - { - m_switching_status_label->SetLabel(_L("Switching...")); - m_switching_status_label->SetForegroundColour(StateColor::darkModeColorFor("#262E30")); - m_switching_status_label->Show(true); - } - else if (state == ExtruderSwitchState::ES_SWITCHING_FAILED) - { - m_switching_status_label->SetLabel(_L("Switching failed")); - m_switching_status_label->SetForegroundColour(StateColor::darkModeColorFor(*wxRED)); - m_switching_status_label->Show(true); - } - else - { - m_switching_status_label->Show(false); - } -} - -void ExtruderSwithingStatus::updateBtnGroup(const ExtderData &ext_data) -{ - if (ext_data.switch_extder_state != ExtruderSwitchState::ES_SWITCHING_FAILED) + if (state != DevExtderSwitchState::ES_SWITCHING_FAILED) { showQuitBtn(false); showRetryBtn(false); @@ -1059,6 +1064,10 @@ void PrintingTaskPanel::enable_abort_button(bool enable) void PrintingTaskPanel::update_subtask_name(wxString name) { + if (m_staticText_subtask_value->GetLabelText() != name) + { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": " << name; + } m_staticText_subtask_value->SetLabelText(name); } @@ -2089,13 +2098,18 @@ void StatusBasePanel::expand_filament_loading(wxMouseEvent& e) } else if (obj->is_series_o()) { - if (obj->get_current_extruder().id == MAIN_NOZZLE_ID) + const auto& ext_system = obj->GetExtderSystem(); + if (ext_system->GetTotalExtderCount() == 2) { - m_filament_load_img->SetBitmap(create_scaled_bitmap("filament_load_o_series_right", this, load_img_size)); - } - else if (obj->get_current_extruder().id == DEPUTY_NOZZLE_ID) - { - m_filament_load_img->SetBitmap(create_scaled_bitmap("filament_load_o_series_left", this, load_img_size)); + int cur_extder_id = ext_system->GetCurrentExtderId(); + if (cur_extder_id == MAIN_EXTRUDER_ID) + { + m_filament_load_img->SetBitmap(create_scaled_bitmap("filament_load_o_series_right", this, load_img_size)); + } + else if (cur_extder_id == DEPUTY_EXTRUDER_ID) + { + m_filament_load_img->SetBitmap(create_scaled_bitmap("filament_load_o_series_left", this, load_img_size)); + } } } } @@ -2140,7 +2154,9 @@ void StatusBasePanel::show_filament_load_group(bool show) m_img_filament_loading->SetBitmap(create_scaled_bitmap("filament_load_fold", this, 24)); } m_scale_panel->Show(show); - m_filament_step->SetupSteps(obj->get_current_extruder().ext_has_filament); + + auto cur_ext = obj->GetExtderSystem()->GetCurrentExtder(); + m_filament_step->SetupSteps(cur_ext ? cur_ext->HasFilamentInExt() : false); m_show_filament_group = show; Layout(); @@ -2155,21 +2171,22 @@ void StatusPanel::update_camera_state(MachineObject* obj) if (!obj) return; //sdcard - if (m_last_sdcard != (int)obj->get_sdcard_state()) { - if (obj->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + auto sdcard_state = obj->GetStorage()->get_sdcard_state(); + if (m_last_sdcard != sdcard_state) { + if (sdcard_state == DevStorage::NO_SDCARD) { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_no.bmp()); m_bitmap_sdcard_img->SetToolTip(_L("No Storage")); - } else if (obj->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL) { + } else if (sdcard_state == DevStorage::HAS_SDCARD_NORMAL) { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_normal.bmp()); m_bitmap_sdcard_img->SetToolTip(_L("Storage")); - } else if (obj->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_ABNORMAL) { + } else if (sdcard_state == DevStorage::HAS_SDCARD_ABNORMAL) { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_abnormal.bmp()); m_bitmap_sdcard_img->SetToolTip(_L("Storage Abnormal")); } else { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_normal.bmp()); m_bitmap_sdcard_img->SetToolTip(_L("Storage")); } - m_last_sdcard = (int)obj->get_sdcard_state(); + m_last_sdcard = sdcard_state; } //recording @@ -2264,12 +2281,12 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co if (id == m_tempCtrl_bed->GetType()) { on_set_bed_temp(); } else if (id == m_tempCtrl_nozzle->GetType()) { - if (e.GetString() == wxString::Format("%d", MAIN_NOZZLE_ID)) { - on_set_nozzle_temp(MAIN_NOZZLE_ID); - } else if (e.GetString() == wxString::Format("%d", DEPUTY_NOZZLE_ID)) { - on_set_nozzle_temp(DEPUTY_NOZZLE_ID); + if (e.GetString() == wxString::Format("%d", MAIN_EXTRUDER_ID)) { + on_set_nozzle_temp(MAIN_EXTRUDER_ID); + } else if (e.GetString() == wxString::Format("%d", DEPUTY_EXTRUDER_ID)) { + on_set_nozzle_temp(DEPUTY_EXTRUDER_ID); } else { - on_set_nozzle_temp(UNIQUE_NOZZLE_ID);//there is only one nozzle + on_set_nozzle_temp(UNIQUE_EXTRUDER_ID);//there is only one nozzle } } else if (id == m_tempCtrl_chamber->GetType()) { if (!m_tempCtrl_chamber->IsOnChanging()) { @@ -2485,13 +2502,13 @@ void StatusPanel::on_subtask_pause_resume(wxCommandEvent &event) { if (obj) { if (obj->can_resume()) { - BOOST_LOG_TRIVIAL(info) << "monitor: resume current print task dev_id =" << obj->dev_id; + BOOST_LOG_TRIVIAL(info) << "monitor: resume current print task dev_id =" << obj->get_dev_id(); obj->command_task_resume(); - } + } else { - BOOST_LOG_TRIVIAL(info) << "monitor: pause current print task dev_id =" << obj->dev_id; + BOOST_LOG_TRIVIAL(info) << "monitor: pause current print task dev_id =" << obj->get_dev_id(); obj->command_task_pause(); - } + } if (m_print_error_dlg) { m_print_error_dlg->on_hide(); }if (m_print_error_dlg_no_action) { @@ -2507,8 +2524,8 @@ void StatusPanel::on_subtask_abort(wxCommandEvent &event) abort_dlg = new SecondaryCheckDialog(this->GetParent(), wxID_ANY, _L("Cancel print")); abort_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent &e) { if (obj) { - BOOST_LOG_TRIVIAL(info) << "monitor: stop current print task dev_id =" << obj->dev_id; - obj->command_task_abort(); + BOOST_LOG_TRIVIAL(info) << "monitor: stop current print task dev_id =" << obj->get_dev_id(); + obj->command_task_abort(); } }); } @@ -2660,10 +2677,9 @@ void StatusPanel::update(MachineObject *obj) calibration_dlg->update_cali(obj); } - - - if (obj->is_support_first_layer_inspect - || obj->is_support_ai_monitoring + DevConfig* config = obj->GetConfig(); + if (config->SupportFirstLayerInspect() + || config->SupportAIMonitor() || obj->is_support_build_plate_marker_detect || obj->is_support_auto_recovery_step_loss) { m_options_btn->Show(); @@ -2677,20 +2693,20 @@ void StatusPanel::update(MachineObject *obj) m_parts_btn->Show(); if (!obj->dev_connection_type.empty()) { - auto iter_connect_type = m_print_connect_types.find(obj->dev_id); + auto iter_connect_type = m_print_connect_types.find(obj->get_dev_id()); if (iter_connect_type != m_print_connect_types.end()) { if (iter_connect_type->second != obj->dev_connection_type) { if (iter_connect_type->second == "lan" && obj->dev_connection_type == "cloud") { - m_print_connect_types[obj->dev_id] = obj->dev_connection_type; + m_print_connect_types[obj->get_dev_id()] = obj->dev_connection_type; } if (iter_connect_type->second == "cloud" && obj->dev_connection_type == "lan") { - m_print_connect_types[obj->dev_id] = obj->dev_connection_type; + m_print_connect_types[obj->get_dev_id()] = obj->dev_connection_type; } } } - m_print_connect_types[obj->dev_id] = obj->dev_connection_type; + m_print_connect_types[obj->get_dev_id()] = obj->dev_connection_type; } update_error_message(); @@ -2709,7 +2725,7 @@ void StatusPanel::show_recenter_dialog() { void StatusPanel::show_error_message(MachineObject *obj, bool is_exist, wxString msg, std::string print_error_str, wxString image_url, std::vector used_button) { - const std::string &dev_id = obj ? obj->dev_id : string(); + const std::string &dev_id = obj ? obj->get_dev_id() : string(); if (is_exist && msg.IsEmpty()) { error_info_reset(); @@ -2894,7 +2910,10 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) { if (!obj) return; - m_tempCtrl_bed->SetCurrTemp((int) obj->bed_temp); + DevBed* bed = obj->GetBed(); + int bed_cur_temp = bed->GetBedTemp(); + int bed_target_temp = bed->GetBedTempTarget(); + m_tempCtrl_bed->SetCurrTemp((int) bed_cur_temp); auto limit = obj->get_bed_temperature_limit(); if (obj->bed_temp_range.size() > 1) { @@ -2914,52 +2933,66 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) if (m_temp_bed_timeout > 0) { m_temp_bed_timeout--; } else { - if (!bed_temp_input) { m_tempCtrl_bed->SetTagTemp((int) obj->bed_temp_target); } + if (!bed_temp_input) { m_tempCtrl_bed->SetTagTemp((int) bed_target_temp); } } - if ((obj->bed_temp_target - obj->bed_temp) >= TEMP_THRESHOLD_VAL) { + if ((bed_target_temp - bed_cur_temp) >= TEMP_THRESHOLD_VAL) { m_tempCtrl_bed->SetIconActive(); } else { m_tempCtrl_bed->SetIconNormal(); } bool to_update_layout = false; - int nozzle_num = obj->m_extder_data.total_extder_count; - if (nozzle_num == 1 && obj->m_extder_data.extders.size() > MAIN_NOZZLE_ID) + int nozzle_num = obj->GetExtderSystem()->GetTotalExtderCount(); + if (nozzle_num == 1) { + m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID)); m_tempCtrl_nozzle->SetCurrType(TEMP_OF_NORMAL_TYPE); - m_tempCtrl_nozzle->SetCurrTemp((int)obj->m_extder_data.extders[MAIN_NOZZLE_ID].temp); + + m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_NORMAL_TYPE); + m_tempCtrl_nozzle_deputy->SetLabel(TEMP_BLANK_STR); + m_tempCtrl_nozzle_deputy->Hide(); + if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON) { to_update_layout = true; m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON); } - - m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_NORMAL_TYPE); - m_tempCtrl_nozzle_deputy->SetLabel(TEMP_BLANK_STR); - m_tempCtrl_nozzle_deputy->Hide(); } - else if (nozzle_num == 2 && obj->m_extder_data.extders.size() > 1) + else if (nozzle_num == 2) { m_tempCtrl_nozzle->SetCurrType(TEMP_OF_MAIN_NOZZLE_TYPE); + m_tempCtrl_nozzle->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(MAIN_EXTRUDER_ID)); m_tempCtrl_nozzle->Show(); - m_tempCtrl_nozzle->SetCurrTemp((int)obj->m_extder_data.extders[MAIN_NOZZLE_ID].temp); + + m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_DEPUTY_NOZZLE_TYPE); + m_tempCtrl_nozzle_deputy->SetCurrTemp(obj->GetExtderSystem()->GetNozzleTempCurrent(DEPUTY_EXTRUDER_ID)); + m_tempCtrl_nozzle_deputy->Show(); + if (m_tempCtrl_nozzle->GetMinSize() != TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON) { to_update_layout = true; m_tempCtrl_nozzle->SetMinSize(TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON); } - - m_tempCtrl_nozzle_deputy->SetCurrType(TEMP_OF_DEPUTY_NOZZLE_TYPE); - m_tempCtrl_nozzle_deputy->Show(); - m_tempCtrl_nozzle_deputy->SetCurrTemp((int)obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].temp); } if (m_temp_nozzle_timeout > 0) { m_temp_nozzle_timeout--; } else { if (!nozzle_temp_input) { - m_tempCtrl_nozzle->SetTagTemp((int) obj->m_extder_data.extders[MAIN_NOZZLE_ID].target_temp); + auto main_extder = obj->GetExtderSystem()->GetExtderById(MAIN_EXTRUDER_ID); + if (main_extder) + { + m_tempCtrl_nozzle->SetCurrTemp((int)main_extder->GetCurrentTemp()); + if (main_extder->GetTargetTemp() - main_extder->GetCurrentTemp() > TEMP_THRESHOLD_VAL) + { + m_tempCtrl_nozzle->SetIconActive(); + } + else + { + m_tempCtrl_nozzle->SetIconNormal(); + } + } } } @@ -2968,22 +3001,19 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) } else { if (!nozzle_temp_input && nozzle_num >= 2) { - m_tempCtrl_nozzle_deputy->SetTagTemp((int)obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].target_temp); - } - } - - if ((obj->m_extder_data.extders[MAIN_NOZZLE_ID].target_temp - obj->m_extder_data.extders[MAIN_NOZZLE_ID].temp) >= TEMP_THRESHOLD_VAL) { - m_tempCtrl_nozzle->SetIconActive(); - } else { - m_tempCtrl_nozzle->SetIconNormal(); - } - - if (nozzle_num >= 2 && obj->m_extder_data.extders.size() > 1){ - if ((obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].target_temp - obj->m_extder_data.extders[DEPUTY_NOZZLE_ID].temp) >= TEMP_THRESHOLD_VAL) { - m_tempCtrl_nozzle_deputy->SetIconActive(); - } - else { - m_tempCtrl_nozzle_deputy->SetIconNormal(); + auto deputy_extder = obj->GetExtderSystem()->GetExtderById(DEPUTY_EXTRUDER_ID); + if (deputy_extder) + { + m_tempCtrl_nozzle_deputy->SetCurrTemp((int)deputy_extder->GetCurrentTemp()); + if (deputy_extder->GetTargetTemp() - deputy_extder->GetCurrentTemp() > TEMP_THRESHOLD_VAL) + { + m_tempCtrl_nozzle_deputy->SetIconActive(); + } + else + { + m_tempCtrl_nozzle_deputy->SetIconNormal(); + } + } } } @@ -2998,12 +3028,13 @@ void StatusPanel::update_temp_ctrl(MachineObject *obj) } // support edit chamber temp - if (obj->is_support_chamber_edit) + DevConfig* config = obj->GetConfig(); + if (config->SupportChamberEdit()) { m_tempCtrl_chamber->SetReadOnly(false); m_tempCtrl_chamber->Enable(); - m_tempCtrl_chamber->SetMinTemp(obj->chamber_temp_edit_min); - m_tempCtrl_chamber->SetMaxTemp(obj->chamber_temp_edit_max); + m_tempCtrl_chamber->SetMinTemp(config->GetChamberTempEditMin()); + m_tempCtrl_chamber->SetMaxTemp(config->GetChamberTempEditMax()); m_tempCtrl_chamber->AddTemp(0); // zero is default temp wxCursor cursor(wxCURSOR_IBEAM); m_tempCtrl_chamber->GetTextCtrl()->SetCursor(cursor); @@ -3051,7 +3082,8 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) if (!obj) return; /*extder*/ - m_nozzle_num = obj->m_extder_data.total_extder_count; + auto extder_system = obj->GetExtderSystem(); + m_nozzle_num = extder_system->GetTotalExtderCount(); int select_index = m_nozzle_num - 1; if (m_nozzle_num >= 2) { @@ -3061,41 +3093,37 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) m_nozzle_btn_panel->Show(); m_extruderImage[select_index]->setExtruderCount(m_nozzle_num); - assert(obj->m_extder_data.extders.size() > 1); - if (obj->m_extder_data.extders.size() > 1) + if (obj->GetExtderSystem()->GetTotalExtderSize() > 1) { - const Extder& left_extder = obj->m_extder_data.extders[0]; - const Extder& right_extder = obj->m_extder_data.extders[1]; - m_extruderImage[select_index]->update(get_extder_shown_state(left_extder.ext_has_filament), - get_extder_shown_state(right_extder.ext_has_filament)); + m_extruderImage[select_index]->update(get_extder_shown_state(obj->GetExtderSystem()->HasFilamentInExt(0)), + get_extder_shown_state(obj->GetExtderSystem()->HasFilamentInExt(1))); } /*current*/ /*update when extder position changed or the machine changed*/ - if (obj->flag_update_nozzle || (m_nozzle_btn_panel->GetClientData() != obj)) + if (obj->GetExtderSystem()->GetCurrentExtderId() == 0xf) { - if (obj->m_extder_data.current_extder_id == 0xf) { - m_extruderImage[select_index]->setExtruderUsed(""); - m_nozzle_btn_panel->updateState(""); - } - else if (obj->m_extder_data.current_extder_id == MAIN_NOZZLE_ID) { - m_extruderImage[select_index]->setExtruderUsed("right"); - m_nozzle_btn_panel->updateState("right"); - } - else if (obj->m_extder_data.current_extder_id == DEPUTY_NOZZLE_ID) { - m_extruderImage[select_index]->setExtruderUsed("left"); - m_nozzle_btn_panel->updateState("left"); - } - - obj->flag_update_nozzle = false; - m_nozzle_btn_panel->SetClientData(obj); + m_extruderImage[select_index]->setExtruderUsed(""); + m_nozzle_btn_panel->updateState(""); } + else if (obj->GetExtderSystem()->GetCurrentExtderId() == MAIN_EXTRUDER_ID) + { + m_extruderImage[select_index]->setExtruderUsed("right"); + m_nozzle_btn_panel->updateState("right"); + } + else if (obj->GetExtderSystem()->GetCurrentExtderId() == DEPUTY_EXTRUDER_ID) + { + m_extruderImage[select_index]->setExtruderUsed("left"); + m_nozzle_btn_panel->updateState("left"); + } + + m_nozzle_btn_panel->SetClientData(obj); /*enable status*/ /* Can do switch while printing pause STUDIO-9789*/ if ((obj->is_in_printing() && !obj->is_in_printing_pause()) || obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE || - obj->targ_nozzle_id_from_pc != INVALID_NOZZLE_ID) + obj->targ_nozzle_id_from_pc != INVALID_EXTRUDER_ID) { m_nozzle_btn_panel->Disable(); } @@ -3108,19 +3136,14 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) m_extruder_book->SetSelection(m_nozzle_num); m_extruderImage[select_index]->setExtruderCount(m_nozzle_num); - assert(!obj->m_extder_data.extders.empty()); - if (!obj->m_extder_data.extders.empty()) + if (extder_system->GetTotalExtderSize() > 0) { - const Extder& extder = obj->m_extder_data.extders[0]; - ExtruderState shown_state = get_extder_shown_state(extder.ext_has_filament); + ExtruderState shown_state = get_extder_shown_state(extder_system->HasFilamentInExt(0)); m_extruderImage[select_index]->update(shown_state); } } /*switch extder*/ - /*for (auto i = 0; i < obj->m_extder_data.extders.size(); i++) { - obj->m_extder_data.extders[i].ams_stat; - }*/ m_extruder_switching_status->updateBy(obj); m_extruder_label->Show(!m_extruder_switching_status->has_content_shown());/*hide the label if there are shown infos from m_extruder_switching_status*/ @@ -3138,8 +3161,8 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) if (!m_fan_panel->IsShown()) m_fan_panel->Show(); bool is_suppt_part_fun = true; - bool is_suppt_aux_fun = obj->is_support_aux_fan; - bool is_suppt_cham_fun = obj->is_support_chamber_fan; + bool is_suppt_aux_fun = obj->GetFan()->GetSupportAuxFanData(); + bool is_suppt_cham_fun = obj->GetFan()->GetSupportChamberFan(); if (m_fan_control_popup) { m_fan_control_popup->update_fan_data(obj); } } else { if (m_fan_panel->IsShown()) { @@ -3154,7 +3177,7 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) //update cham fan /*other*/ - bool light_on = obj->chamber_light != MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_OFF; + bool light_on = obj->GetLamp()->IsChamberLightOn(); BOOST_LOG_TRIVIAL(trace) << "light: " << (light_on ? "on" : "off"); if (m_switch_lamp_timeout > 0) m_switch_lamp_timeout--; @@ -3168,7 +3191,7 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj) speed_lvl_timeout--; else { // update speed - this->speed_lvl = obj->printing_speed_lvl; + this->speed_lvl = obj->GetPrintingSpeedLevel(); wxString text_speed = wxString::Format("%d%%", obj->printing_speed_mag); m_switch_speed->SetLabels(text_speed, text_speed); } @@ -3187,9 +3210,9 @@ void StatusPanel::update_ams(MachineObject *obj) if (obj && m_ams_setting_dlg->IsShown()) { update_ams_insert_material(obj); - m_ams_setting_dlg->update_starting_read_mode(obj->ams_power_on_flag); - m_ams_setting_dlg->update_remain_mode(obj->ams_calibrate_remain_flag); - m_ams_setting_dlg->update_switch_filament(obj->ams_auto_switch_filament_flag); + m_ams_setting_dlg->update_starting_read_mode(obj->GetFilaSystem()->IsDetectOnPowerupEnabled()); + m_ams_setting_dlg->update_remain_mode(obj->GetFilaSystem()->IsDetectRemainEnabled()); + m_ams_setting_dlg->update_switch_filament(obj->GetFilaSystem()->IsAutoRefillEnabled()); m_ams_setting_dlg->update_air_printing_detection(obj->ams_air_print_status); } } @@ -3198,7 +3221,7 @@ void StatusPanel::update_ams(MachineObject *obj) if (obj && (obj->last_cali_version != obj->cali_version)) { obj->last_cali_version = obj->cali_version; PACalibExtruderInfo cali_info; - cali_info.nozzle_diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + cali_info.nozzle_diameter = obj->GetExtderSystem()->GetNozzleDiameter(0); cali_info.use_extruder_id = false; cali_info.use_nozzle_volume_type = false; CalibUtils::emit_get_PA_calib_infos(cali_info); @@ -3212,7 +3235,10 @@ void StatusPanel::update_ams(MachineObject *obj) if (obj->get_printer_ams_type() == "f1") { ams_mode = AMSModel::AMS_LITE; } obj->check_ams_filament_valid(); } - if (obj->is_enable_np && obj->amsList.size() > 0) { ams_mode = AMSModel(obj->amsList.begin()->second->type); } + if (obj->is_enable_np && obj->GetFilaSystem()->GetAmsList().size() > 0) { + ams_mode = AMSModel(obj->GetFilaSystem()->GetAmsList().begin()->second->GetAmsType()); + } + if (!obj || !obj->is_connected()) { last_tray_exist_bits = -1; last_ams_exist_bits = -1; @@ -3220,7 +3246,7 @@ void StatusPanel::update_ams(MachineObject *obj) last_read_done_bits = -1; last_reading_bits = -1; last_ams_version = -1; - BOOST_LOG_TRIVIAL(trace) << "machine object" << obj->dev_name << " was disconnected, set show_ams_group is false"; + BOOST_LOG_TRIVIAL(trace) << "machine object" << obj->get_dev_name() << " was disconnected, set show_ams_group is false"; m_ams_control->SetAmsModel(AMSModel::EXT_AMS, ams_mode); show_ams_group(false); @@ -3232,7 +3258,7 @@ void StatusPanel::update_ams(MachineObject *obj) show_ams_group(true); //show_filament_load_group(true); - if (obj->amsList.empty() || obj->ams_exist_bits == 0) { + if (obj->GetFilaSystem()->GetAmsList().empty() || obj->ams_exist_bits == 0) { m_ams_control->show_auto_refill(false); m_ams_control->enable_ams_setting(false); } else { @@ -3244,12 +3270,13 @@ void StatusPanel::update_ams(MachineObject *obj) //if (is_support_virtual_tray) m_ams_control->update_vams_kn_value(obj->vt_slot[0], obj); if (m_filament_setting_dlg) m_filament_setting_dlg->update(); + std::vector ams_info; - ams_info.clear(); - for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) { + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + for (auto ams = ams_list.begin(); ams != ams_list.end(); ams++) { AMSinfo info; info.ams_id = ams->first; - if (ams->second->is_exists && info.parse_ams_info(obj, ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) { + if (ams->second->IsExist() && info.parse_ams_info(obj, ams->second, obj->GetFilaSystem()->IsDetectRemainEnabled(), obj->is_support_ams_humidity)) { if (ams_mode == AMSModel::AMS_LITE) { info.ams_type = AMSModel::AMS_LITE; } ams_info.push_back(info); } @@ -3263,11 +3290,9 @@ void StatusPanel::update_ams(MachineObject *obj) if (ams_mode == AMSModel::AMS_LITE) info.ext_type = AMSModelOriginType::LITE_EXT; ext_info.push_back(info); } - std::string dev_id = obj->dev_id; - ExtderData data = obj->m_extder_data; // must select a current can - m_ams_control->UpdateAms(obj->get_printer_series_str(), obj->printer_type, ams_info, ext_info, data, dev_id, false); + m_ams_control->UpdateAms(obj->get_printer_series_str(), obj->printer_type, ams_info, ext_info, *obj->GetExtderSystem(), obj->get_dev_id(), false); last_tray_exist_bits = obj->tray_exist_bits; last_ams_exist_bits = obj->ams_exist_bits; @@ -3279,7 +3304,7 @@ void StatusPanel::update_ams(MachineObject *obj) std::string curr_ams_id = m_ams_control->GetCurentAms(); std::string curr_can_id = m_ams_control->GetCurrentCan(curr_ams_id); bool is_vt_tray = false; - if (obj->m_tray_tar == std::to_string(VIRTUAL_TRAY_MAIN_ID)) is_vt_tray = true; + if (obj->GetExtderSystem()->GetCurrentAmsId() == std::to_string(VIRTUAL_TRAY_MAIN_ID)) is_vt_tray = true; // set segment 1, 2 //if (!obj->is_enable_np) { @@ -3304,41 +3329,40 @@ void StatusPanel::update_ams(MachineObject *obj) // m_ams_control->SetExtruder(obj->is_filament_at_extruder(), obj->m_extder_data.extders[MAIN_NOZZLE_ID].snow.ams_id, obj->m_extder_data.extders[MAIN_NOZZLE_ID].snow.slot_id); //} else { /*right*/ - if (obj->m_extder_data.extders.size() > 0) { - auto ext = obj->m_extder_data.extders[MAIN_NOZZLE_ID]; - if (ext.ext_has_filament) { - if (ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_ams_control->SetAmsStep(ext.snow.ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); - } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); - } + if (obj->GetExtderSystem()->GetTotalExtderCount() > 0) { + auto ext = obj->GetExtderSystem()->GetExtderById(MAIN_EXTRUDER_ID); + if (ext->HasFilamentInExt()) { + if (ext->GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext->GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); } - m_ams_control->SetExtruder(ext.ext_has_filament, MAIN_NOZZLE_ID, ext.snow.ams_id, ext.snow.slot_id); + } else { + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } + m_ams_control->SetExtruder(ext->HasFilamentInExt(), MAIN_EXTRUDER_ID, ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id); + } - /*left*/ - if (obj->m_extder_data.extders.size() > 1) { - auto ext = obj->m_extder_data.extders[DEPUTY_NOZZLE_ID]; - if (ext.ext_has_filament) { - if (ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_ams_control->SetAmsStep(ext.snow.ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); - } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); - } + /*left*/ + if (obj->GetExtderSystem()->GetTotalExtderCount() > 1) { + auto ext = obj->GetExtderSystem()->GetExtderById(DEPUTY_EXTRUDER_ID); + if (ext->HasFilamentInExt()) { + if (ext->GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext->GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); } - m_ams_control->SetExtruder(ext.ext_has_filament, DEPUTY_NOZZLE_ID, ext.snow.ams_id, ext.snow.slot_id); + } else { + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } - //} + m_ams_control->SetExtruder(ext->HasFilamentInExt(), DEPUTY_EXTRUDER_ID, ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id); + } bool ams_loading_state = false; auto ams_status_sub = obj->ams_status_sub; if (obj->is_enable_np) { - if (obj->m_extder_data.current_busy_for_loading) { + if (obj->GetExtderSystem()->IsBusyLoading()) { ams_loading_state = true; } } else if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { @@ -3347,26 +3371,17 @@ void StatusPanel::update_ams(MachineObject *obj) if (ams_loading_state) { update_load_with_temp(); - m_filament_step->updateID(std::atoi(obj->m_ams_id.c_str()), std::atoi(obj->m_tray_id.c_str())); - bool busy_for_vt_loading = false; - if (!obj->is_enable_np) { - busy_for_vt_loading = (obj->m_tray_tar == "254" && (obj->m_tray_now != "254" || obj->m_tray_now != "255")); - } else { - if (obj->m_extder_data.current_busy_for_loading && obj->m_extder_data.current_loading_extder_id != -1 ) { - auto tar = obj->m_extder_data.extders[obj->m_extder_data.current_loading_extder_id].star; - auto now = obj->m_extder_data.extders[obj->m_extder_data.current_loading_extder_id].snow; - - if ((tar.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || tar.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) && - (tar.slot_id == std::to_string(VIRTUAL_TRAY_MAIN_ID))) { - busy_for_vt_loading = false; - } else if ((tar.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || tar.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) && - ((now.ams_id != std::to_string(VIRTUAL_TRAY_MAIN_ID) || now.ams_id != std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) || (now.ams_id != "255"))) { - busy_for_vt_loading = true; - } - } + const std::string& cur_ams_id = obj->GetExtderSystem()->GetCurrentAmsId(); + const std::string& cur_tray_id = obj->GetExtderSystem()->GetCurrentSlotId(); + if (!cur_ams_id.empty() && !cur_tray_id.empty()) + { + m_filament_step->updateID(std::atoi(cur_ams_id.c_str()), std::atoi(cur_tray_id.c_str())); } + auto loading_ext = obj->GetExtderSystem()->GetLoadingExtder(); + auto tar = loading_ext ? loading_ext->GetSlotTarget() : DevAmsSlotInfo(); + bool busy_for_vt_loading = (tar.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || tar.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)); if (busy_for_vt_loading) { // wait to heat hotend if (ams_status_sub == 0x02) { @@ -3457,11 +3472,12 @@ void StatusPanel::update_ams(MachineObject *obj) show_filament_load_group(ams_loading_state); - for (auto ams_it = obj->amsList.begin(); ams_it != obj->amsList.end(); ams_it++) { + const auto& amslist = obj->GetFilaSystem()->GetAmsList(); + for (auto ams_it = amslist.begin(); ams_it != amslist.end(); ams_it++) { std::string ams_id = ams_it->first; try { int ams_id_int = atoi(ams_id.c_str()); - for (auto tray_it = ams_it->second->trayList.begin(); tray_it != ams_it->second->trayList.end(); tray_it++) { + for (auto tray_it = ams_it->second->GetTrays().begin(); tray_it != ams_it->second->GetTrays().end(); tray_it++) { std::string tray_id = tray_it->first; int tray_id_int = atoi(tray_id.c_str()); // new protocol @@ -3490,10 +3506,10 @@ void StatusPanel::update_ams_insert_material(MachineObject* obj) { std::string extra_ams_str = (boost::format("ams_f1/%1%") % 0).str(); auto extra_ams_it = obj->module_vers.find(extra_ams_str); if (extra_ams_it != obj->module_vers.end()) { - m_ams_setting_dlg->update_insert_material_read_mode(obj->ams_insert_flag, extra_ams_it->second.sw_ver); + m_ams_setting_dlg->update_insert_material_read_mode(obj->GetFilaSystem()->IsDetectOnInsertEnabled(), extra_ams_it->second.sw_ver); } else { - m_ams_setting_dlg->update_insert_material_read_mode(obj->ams_insert_flag, ""); + m_ams_setting_dlg->update_insert_material_read_mode(obj->GetFilaSystem()->IsDetectOnInsertEnabled(), ""); } } @@ -3512,7 +3528,7 @@ void StatusPanel::update_ams_control_state(std::string ams_id, std::string slot_ bool in_switch_filament = false; if (obj->is_enable_np) { - if (obj->m_extder_data.current_busy_for_loading) { in_switch_filament = true; } + if (obj->GetExtderSystem()->IsBusyLoading()) { in_switch_filament = true; } } else if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { in_switch_filament = true; } @@ -3526,29 +3542,35 @@ void StatusPanel::update_ams_control_state(std::string ams_id, std::string slot_ load_error_info = _L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments."); unload_error_info = _L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments."); } else if (ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - for (auto ext : obj->m_extder_data.extders) { - if (ext.snow.ams_id == ams_id && ext.snow.slot_id == slot_id) { + for (auto ext : obj->GetExtderSystem()->GetExtruders()) { + if (ext.GetSlotNow().ams_id == ams_id && ext.GetSlotNow().slot_id == slot_id) + { load_error_info = _L("Current slot has alread been loaded"); } } } else { - for (auto ext : obj->m_extder_data.extders) { - if (ext.snow.ams_id == ams_id && ext.snow.slot_id == slot_id) { + for (auto ext : obj->GetExtderSystem()->GetExtruders()) { + if (ext.GetSlotNow().ams_id == ams_id && ext.GetSlotNow().slot_id == slot_id) + { load_error_info = _L("Current slot has alread been loaded"); } } /*empty*/ - std::map::iterator it = obj->amsList.find(ams_id); - if (it == obj->amsList.end()) { + auto ams_item = obj->GetFilaSystem()->GetAmsById(ams_id); + if (!ams_item) + { load_error_info = _L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments."); - } else { - auto tray_it = it->second->trayList.find(slot_id); - if (tray_it == it->second->trayList.end()) { + } + else + { + auto tray_item = ams_item->GetTray(slot_id); + if (!tray_item) + { load_error_info = _L("Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filaments."); } - - if (!tray_it->second->is_exists) { + else if (!tray_item->is_exists) + { load_error_info = _L("The selected slot is empty."); } } @@ -3655,11 +3677,12 @@ void StatusPanel::update_subtask(MachineObject *obj) if (m_calib_method == CALI_METHOD_AUTO) { if (m_calib_mode == CalibMode::Calib_PA_Line) { if (obj->is_multi_extruders()) { - if (obj->m_extder_data.current_extder_id == 0) { + int cur_ext_id = obj->GetExtderSystem()->GetCurrentExtderId(); + if (cur_ext_id == 0) { png_path = (boost::format("%1%/images/fd_calibration_auto_multi_extruders_right.png") % resources_dir()).str(); } else { - assert(obj->m_extder_data.current_extder_id == 1); + assert(cur_ext_id == 1); png_path = (boost::format("%1%/images/fd_calibration_auto_multi_extruders_left.png") % resources_dir()).str(); } } @@ -4026,10 +4049,10 @@ void StatusPanel::axis_ctrl_e_hint(bool up_down) void StatusPanel::on_axis_ctrl_e_up_10(wxCommandEvent &event) { if (obj) { - auto current_nozzle_id = obj->m_extder_data.current_extder_id; - if (obj->m_extder_data.extders[current_nozzle_id].temp >= TEMP_THRESHOLD_ALLOW_E_CTRL) + auto ext = obj->GetExtderSystem()->GetCurrentExtder(); + if (ext && ext->GetCurrentTemp() >= TEMP_THRESHOLD_ALLOW_E_CTRL) if (obj->is_enable_np) { - obj->command_extruder_control(current_nozzle_id, -10.0f); + obj->command_extruder_control(ext->GetExtId(), -10.0f); } else { obj->command_axis_control("E", 1.0, -10.0f, 900); } @@ -4042,10 +4065,10 @@ void StatusPanel::on_axis_ctrl_e_up_10(wxCommandEvent &event) void StatusPanel::on_axis_ctrl_e_down_10(wxCommandEvent &event) { if (obj) { - auto current_nozzle_id = obj->m_extder_data.current_extder_id; - if (obj->m_extder_data.extders[current_nozzle_id].temp >= TEMP_THRESHOLD_ALLOW_E_CTRL) + auto ext = obj->GetExtderSystem()->GetCurrentExtder(); + if (ext && ext->GetCurrentTemp() >= TEMP_THRESHOLD_ALLOW_E_CTRL) if (obj->is_enable_np) { - obj->command_extruder_control(current_nozzle_id, 10.0f); + obj->command_extruder_control(ext->GetExtId(), 10.0f); } else { obj->command_axis_control("E", 1.0, 10.0f, 900); } @@ -4089,7 +4112,7 @@ void StatusPanel::on_set_nozzle_temp(int nozzle_id) try { long nozzle_temp; - if (nozzle_id == MAIN_NOZZLE_ID) { + if (nozzle_id == MAIN_EXTRUDER_ID) { wxString str = m_tempCtrl_nozzle->GetTextCtrl()->GetValue(); if (str.ToLong(&nozzle_temp) && obj) { set_hold_count(m_temp_nozzle_timeout); @@ -4101,12 +4124,12 @@ void StatusPanel::on_set_nozzle_temp(int nozzle_id) if (m_tempCtrl_nozzle->GetCurrType() == TempInputType::TEMP_OF_NORMAL_TYPE) { obj->command_set_nozzle(nozzle_temp); } else { - obj->command_set_nozzle_new(MAIN_NOZZLE_ID, nozzle_temp); + obj->command_set_nozzle_new(MAIN_EXTRUDER_ID, nozzle_temp); } } } - if (nozzle_id == DEPUTY_NOZZLE_ID) { + if (nozzle_id == DEPUTY_EXTRUDER_ID) { wxString str = m_tempCtrl_nozzle_deputy->GetTextCtrl()->GetValue(); if (str.ToLong(&nozzle_temp) && obj) { set_hold_count(m_temp_nozzle_deputy_timeout); @@ -4115,7 +4138,7 @@ void StatusPanel::on_set_nozzle_temp(int nozzle_id) m_tempCtrl_nozzle_deputy->SetTagTemp(wxString::Format("%d", nozzle_temp)); m_tempCtrl_nozzle_deputy->Warning(false); } - obj->command_set_nozzle_new(DEPUTY_NOZZLE_ID, nozzle_temp); + obj->command_set_nozzle_new(DEPUTY_EXTRUDER_ID, nozzle_temp); } } } catch (...) { @@ -4138,7 +4161,7 @@ void StatusPanel::on_set_chamber_temp() m_tempCtrl_chamber->Warning(false); } - if (!obj->is_at_heating_mode() && chamber_temp >= obj->chamber_temp_switch_heat) + if (!obj->GetFan()->is_at_heating_mode() && chamber_temp >= obj->GetConfig()->GetChamberTempSwitchHeat()) { #ifndef __APPLE__ MessageDialog champer_switch_head_dlg(this, _L("If the chamber temperature exceeds 40\u2103, the system will automatically switch to heating mode. " @@ -4195,7 +4218,7 @@ void StatusPanel::on_ams_load_curr() int old_temp = -1; int new_temp = -1; - AmsTray* curr_tray = &obj->vt_slot[vt_slot_idx]; + DevAmsTray* curr_tray = &obj->vt_slot[vt_slot_idx]; if (!curr_tray) return; @@ -4220,18 +4243,18 @@ void StatusPanel::on_ams_load_curr() } } - std::map::iterator it = obj->amsList.find(curr_ams_id); - if (it == obj->amsList.end()) { + std::map::iterator it = obj->GetFilaSystem()->GetAmsList().find(curr_ams_id); + if (it == obj->GetFilaSystem()->GetAmsList().end()) { BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; return; } - auto tray_it = it->second->trayList.find(curr_can_id); - if (tray_it == it->second->trayList.end()) { + auto tray_it = it->second->GetTrays().find(curr_can_id); + if (tray_it == it->second->GetTrays().end()) { BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; return; } - AmsTray* curr_tray = obj->get_curr_tray(); - AmsTray* targ_tray = obj->get_ams_tray(curr_ams_id, curr_can_id); + DevAmsTray* curr_tray = obj->get_curr_tray(); + DevAmsTray* targ_tray = obj->get_ams_tray(curr_ams_id, curr_can_id); int old_temp = -1; int new_temp = -1; @@ -4277,33 +4300,33 @@ void StatusPanel::on_ams_switch(SimpleEvent &event) if(obj){ /*right*/ - if (obj->m_extder_data.extders.size() > 0) { - auto ext = obj->m_extder_data.extders[MAIN_NOZZLE_ID]; - if (ext.ext_has_filament) { - if (ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_ams_control->SetAmsStep(ext.snow.ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + if (obj->GetExtderSystem()->GetTotalExtderCount() > 0) { + auto ext = obj->GetExtderSystem()->GetExtderById(MAIN_EXTRUDER_ID); + if (ext->HasFilamentInExt()) { + if (ext->GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext->GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); } } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetAmsStep(ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } - m_ams_control->SetExtruder(ext.ext_has_filament, MAIN_NOZZLE_ID, ext.snow.ams_id, ext.snow.slot_id); + m_ams_control->SetExtruder(ext->HasFilamentInExt(), MAIN_EXTRUDER_ID, ext->GetSlotNow().ams_id, ext->GetSlotNow().slot_id); } /*left*/ - if (obj->m_extder_data.extders.size() > 1) { - auto ext = obj->m_extder_data.extders[DEPUTY_NOZZLE_ID]; - if (ext.ext_has_filament) { - if (ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext.snow.ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { - m_ams_control->SetAmsStep(ext.snow.ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); + if (obj->GetExtderSystem()->GetTotalExtderCount() > 1) { + auto ext = obj->GetExtderSystem()->GetExtruders()[DEPUTY_EXTRUDER_ID]; + if (ext.HasFilamentInExt()) { + if (ext.GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ext.GetSlotNow().ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + m_ams_control->SetAmsStep(ext.GetSlotNow().ams_id, "0", AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP3); } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); + m_ams_control->SetAmsStep(ext.GetSlotNow().ams_id, ext.GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_LOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_COMBO_LOAD_STEP2); } } else { - m_ams_control->SetAmsStep(ext.snow.ams_id, ext.snow.slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); + m_ams_control->SetAmsStep(ext.GetSlotNow().ams_id, ext.GetSlotNow().slot_id, AMSPassRoadType::AMS_ROAD_TYPE_UNLOAD, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } - m_ams_control->SetExtruder(ext.ext_has_filament, DEPUTY_NOZZLE_ID, ext.snow.ams_id, ext.snow.slot_id); + m_ams_control->SetExtruder(ext.HasFilamentInExt(), DEPUTY_EXTRUDER_ID, ext.GetSlotNow().ams_id, ext.GetSlotNow().slot_id); } } } @@ -4316,8 +4339,8 @@ void StatusPanel::on_ams_unload(SimpleEvent &event) if (obj->is_enable_np) { try { - for (auto ext : obj->m_extder_data.extders) { - if (ext.snow.ams_id == curr_ams_id && ext.snow.slot_id == curr_can_id) { obj->command_ams_change_filament(false, curr_ams_id, "255"); } + for (auto ext : obj->GetExtderSystem()->GetExtruders()) { + if (ext.GetSlotNow().ams_id == curr_ams_id && ext.GetSlotNow().slot_id == curr_can_id) { obj->command_ams_change_filament(false, curr_ams_id, "255"); } } } catch (...) {} } else { @@ -4340,13 +4363,10 @@ void StatusPanel::on_ams_setting_click(SimpleEvent &event) if (!m_ams_setting_dlg) m_ams_setting_dlg = new AMSSetting((wxWindow *) this, wxID_ANY); if (obj) { update_ams_insert_material(obj); - m_ams_setting_dlg->update_starting_read_mode(obj->ams_power_on_flag); - m_ams_setting_dlg->update_ams_img(DeviceManager::get_printer_ams_img(obj->printer_type)); + m_ams_setting_dlg->update_starting_read_mode(obj->GetFilaSystem()->IsDetectOnPowerupEnabled()); + m_ams_setting_dlg->update_ams_img(DevPrinterConfigUtil::get_printer_ams_img(obj->printer_type)); std::string ams_id = m_ams_control->GetCurentShowAms(); - if (obj->amsList.size() == 0) { - /* wxString txt = _L("AMS settings are not supported for external spool."); - MessageDialog msg_dlg(nullptr, txt, wxEmptyString, wxICON_WARNING | wxOK); - msg_dlg.ShowModal();*/ + if (obj->GetFilaSystem()->GetAmsList().size() == 0) { return; } else { try { @@ -4391,15 +4411,12 @@ void StatusPanel::on_filament_extrusion_cali(wxCommandEvent &event) ams_id_int = atoi(ams_id.c_str()); tray_id_int = atoi(tray_id.c_str()); - auto it = obj->amsList.find(ams_id); - if (it != obj->amsList.end()) { - auto tray_it = it->second->trayList.find(tray_id); - if (tray_it != it->second->trayList.end()) { - if (MachineObject::is_bbl_filament(tray_it->second->tag_uid)) - m_extrusion_cali_dlg->ams_filament_id = tray_it->second->setting_id; - else - m_extrusion_cali_dlg->ams_filament_id = ""; - } + auto tray = obj->GetFilaSystem()->GetAmsTray(ams_id, tray_id); + if (tray) { + if (DevFilaSystem::IsBBL_Filament(tray->tag_uid)) + m_extrusion_cali_dlg->ams_filament_id = tray->setting_id; + else + m_extrusion_cali_dlg->ams_filament_id = ""; } } @@ -4440,34 +4457,37 @@ void StatusPanel::on_filament_edit(wxCommandEvent &event) std::string temp_min; wxString k_val; wxString n_val; - auto it = obj->amsList.find(std::to_string(ams_id)); - if (it != obj->amsList.end()) { - auto tray_it = it->second->trayList.find(std::to_string(slot_id)); - if (tray_it != it->second->trayList.end()) { - k_val = wxString::Format("%.3f", tray_it->second->k); - n_val = wxString::Format("%.3f", tray_it->second->n); - wxColor color = AmsTray::decode_color(tray_it->second->color); - // m_filament_setting_dlg->set_color(color); - std::vector cols; - for (auto col : tray_it->second->cols) { cols.push_back(AmsTray::decode_color(col)); } - m_filament_setting_dlg->set_ctype(tray_it->second->ctype); - m_filament_setting_dlg->ams_filament_id = tray_it->second->setting_id; + auto tray = obj->GetFilaSystem()->GetAmsTray(std::to_string(ams_id), std::to_string(slot_id)); + if (tray) + { + k_val = wxString::Format("%.3f", tray->k); + n_val = wxString::Format("%.3f", tray->n); + wxColor color = DevAmsTray::decode_color(tray->color); + // m_filament_setting_dlg->set_color(color); - if (m_filament_setting_dlg->ams_filament_id.empty()) { - m_filament_setting_dlg->set_empty_color(color); - } else { - m_filament_setting_dlg->set_color(color); - m_filament_setting_dlg->set_colors(cols); - } + std::vector cols; + for (auto col : tray->cols) { cols.push_back(DevAmsTray::decode_color(col)); } + m_filament_setting_dlg->set_ctype(tray->ctype); + m_filament_setting_dlg->ams_filament_id = tray->setting_id; - m_filament_setting_dlg->m_is_third = !MachineObject::is_bbl_filament(tray_it->second->tag_uid); - if (!m_filament_setting_dlg->m_is_third) { - sn_number = tray_it->second->uuid; - filament = tray_it->second->sub_brands; - temp_max = tray_it->second->nozzle_temp_max; - temp_min = tray_it->second->nozzle_temp_min; - } + if (m_filament_setting_dlg->ams_filament_id.empty()) + { + m_filament_setting_dlg->set_empty_color(color); + } + else + { + m_filament_setting_dlg->set_color(color); + m_filament_setting_dlg->set_colors(cols); + } + + m_filament_setting_dlg->m_is_third = !DevFilaSystem::IsBBL_Filament(tray->tag_uid); + if (!m_filament_setting_dlg->m_is_third) + { + sn_number = tray->uuid; + filament = tray->sub_brands; + temp_max = tray->nozzle_temp_max; + temp_min = tray->nozzle_temp_min; } } @@ -4508,12 +4528,12 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) wxString n_val; k_val = wxString::Format("%.3f", obj->vt_slot[nozzle_index].k); n_val = wxString::Format("%.3f", obj->vt_slot[nozzle_index].n); - wxColor color = AmsTray::decode_color(obj->vt_slot[nozzle_index].color); + wxColor color = DevAmsTray::decode_color(obj->vt_slot[nozzle_index].color); m_filament_setting_dlg->ams_filament_id = obj->vt_slot[nozzle_index].setting_id; std::vector cols; for (auto col : obj->vt_slot[nozzle_index].cols) { - cols.push_back(AmsTray::decode_color(col)); + cols.push_back(DevAmsTray::decode_color(col)); } m_filament_setting_dlg->set_ctype(obj->vt_slot[nozzle_index].ctype); @@ -4525,7 +4545,7 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) m_filament_setting_dlg->set_colors(cols); } - m_filament_setting_dlg->m_is_third = !MachineObject::is_bbl_filament(obj->vt_slot[nozzle_index].tag_uid); + m_filament_setting_dlg->m_is_third = !DevFilaSystem::IsBBL_Filament(obj->vt_slot[nozzle_index].tag_uid); if (!m_filament_setting_dlg->m_is_third) { sn_number = obj->vt_slot[nozzle_index].uuid; filament = obj->vt_slot[nozzle_index].sub_brands; @@ -4557,13 +4577,13 @@ void StatusPanel::on_ams_refresh_rfid(wxCommandEvent &event) } std::string curr_can_id = event.GetString().ToStdString(); - std::map::iterator ams_it = obj->amsList.find(curr_ams_id); - if (ams_it == obj->amsList.end()) { + std::map::iterator it = obj->GetFilaSystem()->GetAmsList().find(curr_ams_id); + if (it == obj->GetFilaSystem()->GetAmsList().end()) { BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; return; } - auto slot_it = ams_it->second->trayList.find(curr_can_id); - if (slot_it == ams_it->second->trayList.end()) { + auto slot_it = it->second->GetTrays().find(curr_can_id); + if (slot_it == it->second->GetTrays().end()) { BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; return; } @@ -4573,8 +4593,8 @@ void StatusPanel::on_ams_refresh_rfid(wxCommandEvent &event) if (obj->is_enable_np || obj->is_enable_ams_np) { use_new_command = true; - if (ams_it->second->nozzle < obj->m_extder_data.extders.size()) { - has_filament_at_extruder = obj->m_extder_data.extders[ams_it->second->nozzle].ext_has_filament; + if (it->second->GetExtruderId() < obj->GetExtderSystem()->GetTotalExtderSize()) { + has_filament_at_extruder = obj->GetExtderSystem()->HasFilamentInExt(it->second->GetExtruderId()); } } else { has_filament_at_extruder = obj->is_filament_at_extruder(); @@ -4614,13 +4634,13 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) return; } else { std::string curr_can_id = event.GetString().ToStdString(); - std::map::iterator it = obj->amsList.find(curr_ams_id); - if (it == obj->amsList.end()) { + std::map::iterator it = obj->GetFilaSystem()->GetAmsList().find(curr_ams_id); + if (it == obj->GetFilaSystem()->GetAmsList().end()) { BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_ams_id << " failed"; return; } - auto tray_it = it->second->trayList.find(curr_can_id); - if (tray_it == it->second->trayList.end()) { + auto tray_it = it->second->GetTrays().find(curr_can_id); + if (tray_it == it->second->GetTrays().end()) { BOOST_LOG_TRIVIAL(trace) << "ams: find " << curr_can_id << " failed"; return; } @@ -4768,23 +4788,6 @@ void StatusPanel::on_fan_changed(wxCommandEvent& event) auto type = event.GetInt(); auto speed = atoi(event.GetString().c_str()); set_hold_count(this->m_switch_cham_fan_timeout); - return; - - if (type == MachineObject::FanType::COOLING_FAN) { - set_hold_count(this->m_switch_nozzle_fan_timeout); - /*m_switch_nozzle_fan->SetValue(speed > 0 ? true : false); - m_switch_nozzle_fan->setFanValue(speed * 10);*/ - } - else if (type == MachineObject::FanType::BIG_COOLING_FAN) { - set_hold_count(this->m_switch_printing_fan_timeout); - /*m_switch_printing_fan->SetValue(speed > 0 ? true : false); - m_switch_printing_fan->setFanValue(speed * 10);*/ - } - else if (type == MachineObject::FanType::CHAMBER_FAN) { - set_hold_count(this->m_switch_cham_fan_timeout); - /*m_switch_cham_fan->SetValue(speed > 0 ? true : false); - m_switch_cham_fan->setFanValue(speed * 10);*/ - } } void StatusPanel::on_cham_temp_kill_focus(wxFocusEvent& event) @@ -4852,7 +4855,7 @@ void StatusPanel::on_switch_speed(wxCommandEvent &event) // default speed lvl int selected_item = 1; if (obj) { - int speed_lvl_idx = obj->printing_speed_lvl - 1; + int speed_lvl_idx = obj->GetPrintingSpeedLevel() - 1; if (speed_lvl_idx >= 0 && speed_lvl_idx < 4) { selected_item = speed_lvl_idx; } @@ -4868,7 +4871,7 @@ void StatusPanel::on_switch_speed(wxCommandEvent &event) this->speed_lvl = e.GetInt() + 1; if (obj) { set_hold_count(this->speed_lvl_timeout); - obj->command_set_printing_speed((PrintingSpeedLevel)this->speed_lvl); + obj->command_set_printing_speed((DevPrintingSpeedLevel)this->speed_lvl); } }); popUp->Bind(wxEVT_SHOW, [this, popUp](auto &e) { @@ -4908,12 +4911,12 @@ void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) } if (!obj) { return; } - if (obj->m_air_duct_data.modes.empty()) + if (obj->GetFan()->GetAirDuctData().modes.empty()) { - obj->converse_to_duct(true, obj->is_support_aux_fan, obj->is_support_chamber_fan); + obj->GetFan()->converse_to_duct(true, obj->GetFan()->GetSupportAuxFanData(), obj->GetFan()->GetSupportChamberFan()); } - m_fan_control_popup = new FanControlPopupNew(this, obj, obj->m_air_duct_data); + m_fan_control_popup = new FanControlPopupNew(this, obj, obj->GetFan()->GetAirDuctData()); auto pos = m_switch_fan->GetScreenPosition(); pos.y = pos.y + m_switch_fan->GetSize().y; @@ -4933,22 +4936,6 @@ void StatusPanel::on_nozzle_fan_switch(wxCommandEvent &event) m_fan_control_popup->SetPosition(pos); m_fan_control_popup->ShowModal(); - - - - /*if (!obj) return; - - bool value = m_switch_nozzle_fan->GetValue(); - - if (value) { - obj->command_control_fan(MachineObject::FanType::COOLING_FAN, true); - m_switch_nozzle_fan->SetValue(true); - set_hold_count(this->m_switch_nozzle_fan_timeout); - } else { - obj->command_control_fan(MachineObject::FanType::COOLING_FAN, false); - m_switch_nozzle_fan->SetValue(false); - set_hold_count(this->m_switch_nozzle_fan_timeout); - }*/ } void StatusPanel::on_lamp_switch(wxCommandEvent &event) { @@ -4960,10 +4947,9 @@ void StatusPanel::on_lamp_switch(wxCommandEvent &event) m_switch_lamp->SetValue(true); // do not update when timeout > 0 set_hold_count(this->m_switch_lamp_timeout); - obj->command_set_chamber_light(MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_ON); - obj->command_set_chamber_light2(MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_ON); + obj->GetLamp()->CtrlSetChamberLight(DevLamp::LIGHT_EFFECT_ON); } else { - if (obj->m_lamp_close_recheck) { + if (obj->GetLamp()->HasLampCloseRecheck()){ MessageDialog msg_dlg(nullptr, _L("Turning off the lights during the task will cause the failure of AI monitoring, like spaghetti detection. Please choose carefully."), wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL); msg_dlg.SetButtonLabel(wxID_OK, _L("Keep it On")); msg_dlg.SetButtonLabel(wxID_CANCEL, _L("Turn it Off")); @@ -4974,8 +4960,7 @@ void StatusPanel::on_lamp_switch(wxCommandEvent &event) m_switch_lamp->SetValue(false); set_hold_count(this->m_switch_lamp_timeout); - obj->command_set_chamber_light(MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_OFF); - obj->command_set_chamber_light2(MachineObject::LIGHT_EFFECT::LIGHT_EFFECT_OFF); + obj->GetLamp()->CtrlSetChamberLight(DevLamp::LIGHT_EFFECT_OFF); } } @@ -5112,7 +5097,7 @@ void StatusPanel::on_nozzle_selected(wxCommandEvent &event) } auto nozzle_id = event.GetInt(); - if (obj->command_select_extruder(nozzle_id) == 0) + if (obj->GetCtrl()->command_select_extruder(nozzle_id) == 0) { return; } @@ -5278,11 +5263,11 @@ void StatusPanel::rescale_camera_icons() if (!obj) return; - if (obj->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_no.bmp()); - } else if (obj->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL) { + } else if (obj->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_NORMAL) { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_normal.bmp()); - } else if (obj->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_ABNORMAL) { + } else if (obj->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL) { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_abnormal.bmp()); } else { m_bitmap_sdcard_img->SetBitmap(m_bitmap_sdcard_state_normal.bmp()); @@ -5336,7 +5321,7 @@ void StatusPanel::msw_rescale() m_bpButton_xy->Rescale(); auto size = TEMP_CTRL_MIN_SIZE_ALIGN_ONE_ICON; - if (obj && obj->m_extder_data.total_extder_count >= 2) size = TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON; + if (obj && obj->GetExtderSystem()->GetTotalExtderCount() >= 2) size = TEMP_CTRL_MIN_SIZE_ALIGN_TWO_ICON; m_tempCtrl_nozzle->SetMinSize(size); m_tempCtrl_nozzle->Rescale(); m_tempCtrl_nozzle_deputy->SetMinSize(size); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index f891890a19..4baa729d83 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -39,6 +39,9 @@ class StepIndicator; #define COMMAND_TIMEOUT 5 namespace Slic3r { + +class DevExtderSystem; + namespace GUI { // Previous definitions @@ -156,10 +159,7 @@ public: void msw_rescale(); private: - void updateSwitchingLabel(const ExtruderSwitchState &state); - - void updateBy(const ExtderData& ext_data); - void updateBtnGroup(const ExtderData &ext_data); + void updateBy(const DevExtderSystem* ext_system); void showQuitBtn(bool show); void showRetryBtn(bool show); diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.cpp b/src/slic3r/GUI/SyncAmsInfoDialog.cpp index 4728053a15..1fa9f7b52f 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.cpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.cpp @@ -22,6 +22,12 @@ #include "CapsuleButton.hpp" #include "PrePrintChecker.hpp" +#include "DeviceCore/DevConfig.h" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevManager.h" +#include "DeviceCore/DevMapping.h" +#include "DeviceCore/DevStorage.h" + using namespace Slic3r; using namespace Slic3r::GUI; @@ -333,7 +339,7 @@ wxColour SyncAmsInfoDialog::decode_ams_color(const std::string &color_str) { if (temp_str.size() == 6) { temp_str += "FF"; } - return AmsTray::decode_color(temp_str); + return DevAmsTray::decode_color(temp_str); } void SyncAmsInfoDialog::update_map_when_change_map_mode() @@ -1192,13 +1198,13 @@ void SyncAmsInfoDialog::sync_ams_mapping_result(std::vector &resul } if (!f->color.empty()) { - ams_col = AmsTray::decode_color(f->color); + ams_col = DevAmsTray::decode_color(f->color); } else { // default color ams_col = wxColour(0xCE, 0xCE, 0xCE); } std::vector cols; - for (auto col : f->colors) { cols.push_back(AmsTray::decode_color(col)); } + for (auto col : f->colors) { cols.push_back(DevAmsTray::decode_color(col)); } m->set_ams_info(ams_col, ams_id, f->ctype, cols,true);//sync_ams_mapping_result break; } @@ -1227,19 +1233,19 @@ bool SyncAmsInfoDialog::do_ams_mapping(MachineObject *obj_) std::vector map_opt; // four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext if (nozzle_nums > 1) { map_opt = {true, true, true, true}; // four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt, std::vector(), + filament_result = DevMappingUtil::ams_filament_mapping(obj_, m_filaments, m_ams_mapping_result, map_opt, std::vector(), wxGetApp().app_config->get_bool("ams_sync_match_full_use_color_dist") ? false : true); } // single nozzle else { if (obj_->is_support_amx_ext_mix_mapping()) { map_opt = {false, true, false, true}; // four values: use_left_ams, use_right_ams, use_left_ext, use_right_ext - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt, std::vector(), + filament_result = DevMappingUtil::ams_filament_mapping(obj_, m_filaments, m_ams_mapping_result, map_opt, std::vector(), wxGetApp().app_config->get_bool("ams_sync_match_full_use_color_dist") ? false : true); // auto_supply_with_ext(obj_->vt_slot); } else { map_opt = {false, true, false, false}; - filament_result = obj_->ams_filament_mapping(m_filaments, m_ams_mapping_result, map_opt); + filament_result = DevMappingUtil::ams_filament_mapping(obj_, m_filaments, m_ams_mapping_result, map_opt); } } @@ -1260,11 +1266,11 @@ bool SyncAmsInfoDialog::do_ams_mapping(MachineObject *obj_) } deal_only_exist_ext_spool(obj_); show_thumbnail_page(); - return obj_->is_valid_mapping_result(m_ams_mapping_result); + return DevMappingUtil::is_valid_mapping_result(obj_, m_ams_mapping_result); } else { BOOST_LOG_TRIVIAL(info) << "filament_result != 0"; // do not support ams mapping try to use order mapping - bool is_valid = obj_->is_valid_mapping_result(m_ams_mapping_result); + bool is_valid = DevMappingUtil::is_valid_mapping_result(obj_, m_ams_mapping_result); if (filament_result != 1 && !is_valid) { // reset invalid result for (int i = 0; i < m_ams_mapping_result.size(); i++) { @@ -1285,7 +1291,7 @@ void SyncAmsInfoDialog::deal_only_exist_ext_spool(MachineObject *obj_) { if (!obj_) return; if (!m_append_color_text) { return; } - bool only_exist_ext_spool_flag = m_only_exist_ext_spool_flag = obj_->only_exist_ext_spool(); + bool only_exist_ext_spool_flag = m_only_exist_ext_spool_flag = !obj_->GetFilaSystem()->HasAms(); SetTitle(only_exist_ext_spool_flag ? _L("Synchronize Filament Information") : _L("Synchronize AMS Filament Information")); m_append_color_text->SetLabel(only_exist_ext_spool_flag ? _L("Add unused filaments to filaments list.") : _L("Add unused AMS filaments to filaments list.")); @@ -1442,20 +1448,20 @@ bool SyncAmsInfoDialog::build_nozzles_info(std::string &nozzles_info) return true; } -bool SyncAmsInfoDialog::can_hybrid_mapping(ExtderData data) +bool SyncAmsInfoDialog::can_hybrid_mapping(DevExtderSystem data) { // Mixed mappings are not allowed return false; - if (data.total_extder_count <= 1 || data.extders.size() <= 1 || !wxGetApp().preset_bundle) return false; + if (data.GetTotalExtderCount() <= 1 || !wxGetApp().preset_bundle) return false; // The default two extruders are left, right, but the order of the extruders on the machine is right, left. // Therefore, some adjustments need to be made. std::vector flow_type_of_machine; - for (auto it = data.extders.rbegin(); it != data.extders.rend(); it++) { + for (auto it = data.GetExtruders().rbegin(); it != data.GetExtruders().rend(); it++) { // exist field is not updated, wait add // if (it->exist < 3) return false; - std::string type_str = it->current_nozzle_flow_type ? "High Flow" : "Standard"; + std::string type_str = it->GetNozzleFlowType() ? "High Flow" : "Standard"; flow_type_of_machine.push_back(type_str); } // get the nozzle type of preset --> flow_types @@ -1476,14 +1482,14 @@ bool SyncAmsInfoDialog::can_hybrid_mapping(ExtderData data) } // When filaments cannot be matched automatically, whether to use ext for automatic supply -void SyncAmsInfoDialog::auto_supply_with_ext(std::vector slots) +void SyncAmsInfoDialog::auto_supply_with_ext(std::vector slots) { if (slots.size() <= 0) return; for (int i = 0; i < m_ams_mapping_result.size(); i++) { auto it = m_ams_mapping_result[i]; if (it.ams_id == "") { - AmsTray slot(""); + DevAmsTray slot(""); if (m_filaments_map[it.id] == 1 && slots.size() > 1) slot = slots[1]; else if (m_filaments_map[it.id] == 2) @@ -1499,9 +1505,9 @@ void SyncAmsInfoDialog::auto_supply_with_ext(std::vector slots) } } -bool SyncAmsInfoDialog::is_nozzle_type_match(ExtderData data, wxString &error_message) const +bool SyncAmsInfoDialog::is_nozzle_type_match(DevExtderSystem data, wxString &error_message) const { - if (data.total_extder_count <= 1 || data.extders.size() <= 1 || !wxGetApp().preset_bundle) return false; + if (data.GetTotalExtderCount() <= 1 || !wxGetApp().preset_bundle) return false; const auto &project_config = wxGetApp().preset_bundle->project_config; // check nozzle used @@ -1532,10 +1538,10 @@ bool SyncAmsInfoDialog::is_nozzle_type_match(ExtderData data, wxString &error_me // The default two extruders are left, right, but the order of the extruders on the machine is right, left. std::vector flow_type_of_machine; - for (auto it = data.extders.begin(); it != data.extders.end(); it++) { - if (it->current_nozzle_flow_type == NozzleFlowType::H_FLOW) { + for (auto it = data.GetExtruders().begin(); it != data.GetExtruders().end(); it++) { + if (it->GetNozzleFlowType() == NozzleFlowType::H_FLOW) { flow_type_of_machine.push_back("High Flow"); - } else if (it->current_nozzle_flow_type == NozzleFlowType::S_FLOW) { + } else if (it->GetNozzleFlowType() == NozzleFlowType::S_FLOW) { flow_type_of_machine.push_back("Standard"); } } @@ -1548,9 +1554,9 @@ bool SyncAmsInfoDialog::is_nozzle_type_match(ExtderData data, wxString &error_me if (target_machine_nozzle_id < flow_type_of_machine.size()) { if (flow_type_of_machine[target_machine_nozzle_id] != used_extruders_flow[it->first]) { wxString pos; - if (target_machine_nozzle_id == DEPUTY_NOZZLE_ID) { + if (target_machine_nozzle_id == DEPUTY_EXTRUDER_ID) { pos = _L("left nozzle"); - } else if ((target_machine_nozzle_id == MAIN_NOZZLE_ID)) { + } else if ((target_machine_nozzle_id == MAIN_EXTRUDER_ID)) { pos = _L("right nozzle"); } @@ -1797,7 +1803,7 @@ void SyncAmsInfoDialog::show_status(PrintDialogStatus status, std::vector 0) { target_model_id = m_required_data_plate_data_list[m_print_plate_idx]->printer_model_id; } } - auto target_print_name = wxString(obj_->get_preset_printer_model_name(target_model_id)); + auto target_print_name = wxString(DevPrinterConfigUtil::get_printer_display_name(target_model_id)); target_print_name.Replace(wxT("Bambu Lab "), wxEmptyString); msg_text = wxString::Format(_L("The selected printer (%s) is incompatible with the chosen printer profile in the slicer (%s)."), sourcet_print_name, target_print_name); @@ -1878,7 +1884,7 @@ bool SyncAmsInfoDialog::is_blocking_printing(MachineObject *obj_) } if (source_model != target_model) { - std::vector compatible_machine = dev->get_compatible_machine(target_model); + std::vector compatible_machine = obj_->get_compatible_machine(); vector::iterator it = find(compatible_machine.begin(), compatible_machine.end(), source_model); if (it == compatible_machine.end()) { return true; } } @@ -1907,8 +1913,8 @@ bool SyncAmsInfoDialog::is_same_nozzle_diameters(NozzleType &tag_nozzle_type, fl std::vector preset_nozzle_types(nozzle_type->size()); for (size_t idx = 0; idx < nozzle_type->size(); ++idx) preset_nozzle_types[idx] = NozzleTypeEumnToStr[NozzleType(nozzle_type->values[idx])]; - std::vector machine_nozzle_types(obj_->m_extder_data.extders.size()); - for (size_t idx = 0; idx < obj_->m_extder_data.extders.size(); ++idx) machine_nozzle_types[idx] = obj_->m_extder_data.extders[idx].current_nozzle_type; + std::vector machine_nozzle_types(obj_->GetExtderSystem()->GetTotalExtderCount()); + for (size_t idx = 0; idx < obj_->GetExtderSystem()->GetTotalExtderCount(); ++idx) machine_nozzle_types[idx] = obj_->GetExtderSystem()->GetNozzleType(idx); auto used_filaments = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_used_filaments(); // 1 based auto filament_maps = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_real_filament_maps(preset_bundle->project_config); // 1 based @@ -1921,13 +1927,13 @@ bool SyncAmsInfoDialog::is_same_nozzle_diameters(NozzleType &tag_nozzle_type, fl std::sort(used_extruders.begin(), used_extruders.end()); // TODO [tao wang] : add idx mapping - tag_nozzle_type = obj_->m_extder_data.extders[0].current_nozzle_type; + tag_nozzle_type = obj_->GetExtderSystem()->GetNozzleType(0); if (opt_nozzle_diameters != nullptr) { for (auto i = 0; i < used_extruders.size(); i++) { auto extruder = used_extruders[i]; preset_nozzle_diameters = float(opt_nozzle_diameters->get_at(extruder)); - if (preset_nozzle_diameters != obj_->m_extder_data.extders[0].current_nozzle_diameter) { is_same_nozzle_diameters = false; } + if (preset_nozzle_diameters != obj_->GetExtderSystem()->GetNozzleDiameter(0)) { is_same_nozzle_diameters = false; } } } @@ -1948,7 +1954,7 @@ bool SyncAmsInfoDialog::is_same_nozzle_type(std::string &filament_type, NozzleTy MachineObject *obj_ = dev->get_selected_machine(); if (obj_ == nullptr) return true; - NozzleType nozzle_type = obj_->m_extder_data.extders[0].current_nozzle_type; + NozzleType nozzle_type = obj_->GetExtderSystem()->GetNozzleType(0); auto printer_nozzle_hrc = Print::get_hrc_by_nozzle_type(nozzle_type); auto preset_bundle = wxGetApp().preset_bundle; @@ -1965,7 +1971,7 @@ bool SyncAmsInfoDialog::is_same_nozzle_type(std::string &filament_type, NozzleTy tag_nozzle_type = NozzleType::ntHardenedSteel; return is_same_nozzle_type; } else { - tag_nozzle_type = obj_->m_extder_data.extders[0].current_nozzle_type; + tag_nozzle_type = obj_->GetExtderSystem()->GetNozzleType(0); } iter++; @@ -2189,11 +2195,11 @@ void SyncAmsInfoDialog::update_user_printer() // same machine only appear once for (auto it = option_list.begin(); it != option_list.end(); it++) { - if (it->second && (it->second->is_online() || it->second->is_connected())) { machine_list.push_back(it->second->dev_name); } + if (it->second && (it->second->is_online() || it->second->is_connected())) { machine_list.push_back(it->second->get_dev_name()); } } // lan machine list - auto lan_option_list = dev->get_local_machine_list(); + auto lan_option_list = dev->get_local_machinelist(); for (auto elem : lan_option_list) { MachineObject *mobj = elem.second; @@ -2203,17 +2209,18 @@ void SyncAmsInfoDialog::update_user_printer() if (!mobj->is_online()) continue; if (!mobj->is_lan_mode_printer()) continue; if (!mobj->has_access_right()) { - option_list[mobj->dev_name] = mobj; - machine_list.push_back(mobj->dev_name); + option_list[mobj->get_dev_name()] = mobj; + machine_list.push_back(mobj->get_dev_name()); } } machine_list = sort_string(machine_list); for (auto tt = machine_list.begin(); tt != machine_list.end(); tt++) { for (auto it = option_list.begin(); it != option_list.end(); it++) { - if (it->second->dev_name == *tt) { + if (it->second->get_dev_name() == *tt) + { m_list.push_back(it->second); - wxString dev_name_text = from_u8(it->second->dev_name); + wxString dev_name_text = from_u8(it->second->get_dev_name()); if (it->second->is_lan_mode_printer()) { dev_name_text += "(LAN)"; } machine_list_name.Add(dev_name_text); break; @@ -2243,8 +2250,8 @@ void SyncAmsInfoDialog::on_timer(wxTimerEvent &event) m_check_flag = true; } - if (!obj_ || obj_->amsList.empty() || obj_->ams_exist_bits == 0 || !obj_->is_support_filament_backup || !obj_->is_support_show_filament_backup || - !obj_->ams_auto_switch_filament_flag || m_checkbox_list["use_ams"]->getValue() != "on") { + if (!obj_ || !obj_->GetFilaSystem()->HasAms() || obj_->ams_exist_bits == 0 || !obj_->is_support_filament_backup || !obj_->GetExtderSystem()->HasFilamentBackup() || + !obj_->GetFilaSystem()->IsAutoRefillEnabled() || m_checkbox_list["use_ams"]->getValue() != "on") { if (m_ams_backup_tip && m_ams_backup_tip->IsShown()) { m_ams_backup_tip->Hide(); img_ams_backup->Hide(); @@ -2316,7 +2323,7 @@ void SyncAmsInfoDialog::update_show_status() reset_timeout(); - if (!obj_->is_support_print_all && m_print_plate_idx == PLATE_ALL_IDX) { + if (!obj_->GetConfig()->SupportPrintAllPlates() && m_print_plate_idx == PLATE_ALL_IDX) { show_status(PrintDialogStatus::PrintStatusNotSupportedPrintAll); return; } @@ -2352,17 +2359,17 @@ void SyncAmsInfoDialog::update_show_status() } else if (obj_->is_in_printing() || obj_->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { show_status(PrintDialogStatus::PrintStatusInPrinting); return; - } else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { + } else if (!obj_->GetConfig()->SupportPrintWithoutSD() && (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD)) { show_status(PrintDialogStatus::PrintStatusNoSdcard); return; } // check sdcard when if lan mode printer if (obj_->is_lan_mode_printer()) { - if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { show_status(PrintDialogStatus::PrintStatusLanModeNoSdcard); return; - } else if (obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_ABNORMAL || obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_READONLY) { + } else if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL || obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::HAS_SDCARD_READONLY) { show_status(PrintDialogStatus::PrintStatusLanModeSDcardNotAvailable); return; } @@ -2376,13 +2383,8 @@ void SyncAmsInfoDialog::update_show_status() // the nozzle type of preset and machine are different if (nozzle_nums > 1) { - if (obj_->is_nozzle_data_invalid()) { - show_status(PrintDialogStatus::PrintStatusNozzleDataInvalid); - return; - } - wxString error_message; - if (!is_nozzle_type_match(obj_->m_extder_data, error_message)) { + if (!is_nozzle_type_match(*obj_->GetExtderSystem(), error_message)) { std::vector params{error_message}; params.emplace_back(_L("Tips: If you changed your nozzle of your printer lately, Please go to 'Device -> Printer parts' to change your nozzle setting.")); show_status(PrintDialogStatus::PrintStatusNozzleMatchInvalid, params); @@ -2415,7 +2417,7 @@ void SyncAmsInfoDialog::update_show_status() if (item.ams_id.empty()) continue; int extruder_id = obj_->get_extruder_id_by_ams_id(item.ams_id); - if (DeviceManager::is_virtual_slot(stoi(item.ams_id))) + if (devPrinterUtil::IsVirtualSlot(item.ams_id)) extruder_status[extruder_id].has_vt_slot = true; else extruder_status[extruder_id].has_ams = true; @@ -3250,7 +3252,7 @@ void SyncAmsInfoDialog::update_lan_machine_list() { DeviceManager *dev = wxGetApp().getDeviceManager(); if (!dev) return; - auto m_free_machine_list = dev->get_local_machine_list(); + auto m_free_machine_list = dev->get_local_machinelist(); BOOST_LOG_TRIVIAL(info) << "SelectMachinePopup update_other_devices start"; @@ -3263,7 +3265,7 @@ void SyncAmsInfoDialog::update_lan_machine_list() if (!mobj->is_lan_mode_printer()) continue; if (mobj->has_access_right()) { - auto b = mobj->dev_name; + auto b = mobj->get_dev_name(); // clear machine list diff --git a/src/slic3r/GUI/SyncAmsInfoDialog.hpp b/src/slic3r/GUI/SyncAmsInfoDialog.hpp index 1cdef798f4..3d4bcda175 100644 --- a/src/slic3r/GUI/SyncAmsInfoDialog.hpp +++ b/src/slic3r/GUI/SyncAmsInfoDialog.hpp @@ -213,9 +213,9 @@ public: void show_thumbnail_page(); bool get_ams_mapping_result(std::string &mapping_array_str, std::string &mapping_array_str2, std::string &ams_mapping_info); bool build_nozzles_info(std::string &nozzles_info); - bool can_hybrid_mapping(ExtderData data); - void auto_supply_with_ext(std::vector slots); - bool is_nozzle_type_match(ExtderData data, wxString &error_message) const; + bool can_hybrid_mapping(DevExtderSystem data); + void auto_supply_with_ext(std::vector slots); + bool is_nozzle_type_match(DevExtderSystem data, wxString &error_message) const; int convert_filament_map_nozzle_id_to_task_nozzle_id(int nozzle_id); PrintFromType get_print_type() { return m_print_type; }; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 0dc6fc989e..158bf303a2 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -50,8 +50,8 @@ #include "libslic3r/GCode/Thumbnails.hpp" #include "WipeTowerDialog.hpp" -#include "BedShapeDialog.hpp" -// #include "BonjourDialog.hpp" +#include "DeviceCore/DevManager.h" + #ifdef WIN32 #include #endif // WIN32 @@ -5028,13 +5028,13 @@ void TabPrinter::toggle_options() PresetBundle *preset_bundle = wxGetApp().preset_bundle; std::string printer_type = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); - toggle_line("enable_wrapping_detection", DeviceManager::support_wrapping_detection(printer_type)); + toggle_line("enable_wrapping_detection", DevPrinterConfigUtil::support_wrapping_detection(printer_type)); } if (m_active_page->title() == L("Machine G-code")) { PresetBundle *preset_bundle = wxGetApp().preset_bundle; std::string printer_type = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); - toggle_line("wrapping_detection_gcode", DeviceManager::support_wrapping_detection(printer_type)); + toggle_line("wrapping_detection_gcode", DevPrinterConfigUtil::support_wrapping_detection(printer_type)); } if (m_active_page->title() == L("Multimaterial")) { diff --git a/src/slic3r/GUI/TaskManager.hpp b/src/slic3r/GUI/TaskManager.hpp index 5a2abd5a83..aacdc1095e 100644 --- a/src/slic3r/GUI/TaskManager.hpp +++ b/src/slic3r/GUI/TaskManager.hpp @@ -2,9 +2,12 @@ #define slic3r_TaskManager_hpp_ #include "DeviceManager.hpp" +#include "slic3r/Utils/NetworkAgent.hpp" + #include #include + namespace Slic3r { enum TaskState diff --git a/src/slic3r/GUI/UpgradePanel.cpp b/src/slic3r/GUI/UpgradePanel.cpp index a259e7de9a..3a54a0cf39 100644 --- a/src/slic3r/GUI/UpgradePanel.cpp +++ b/src/slic3r/GUI/UpgradePanel.cpp @@ -8,6 +8,9 @@ #include "GUI_App.hpp" #include "libslic3r/Thread.hpp" +#include "DeviceCore/DevFilaSystem.h" +#include "DeviceCore/DevManager.h" + namespace Slic3r { namespace GUI { @@ -480,22 +483,22 @@ void MachineInfoPanel::update(MachineObject* obj) m_panel_caption->Freeze(); if (!obj->is_connected()) { m_upgrade_status_img->SetBitmap(upgrade_gray_icon.bmp()); - wxString caption_text = wxString::Format("%s(%s)", from_u8(obj->dev_name), _L("Offline")); + wxString caption_text = wxString::Format("%s(%s)", from_u8(obj->get_dev_name()), _L("Offline")); m_caption_text->SetLabelText(caption_text); - show_status(MachineObject::UpgradingDisplayState::UpgradingUnavaliable); + show_status((int)DevFirmwareUpgradingState::UpgradingUnavaliable); } else { - show_status(obj->upgrade_display_state, obj->upgrade_status); - if (obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingUnavaliable) { + show_status((int)obj->upgrade_display_state, obj->upgrade_status); + if (obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingUnavaliable) { if (obj->can_abort()) { - wxString caption_text = wxString::Format("%s(%s)", from_u8(obj->dev_name), _L("Printing")); + wxString caption_text = wxString::Format("%s(%s)", from_u8(obj->get_dev_name()), _L("Printing")); m_caption_text->SetLabelText(caption_text); } else { - wxString caption_text = wxString::Format("%s", from_u8(obj->dev_name)); + wxString caption_text = wxString::Format("%s", from_u8(obj->get_dev_name())); m_caption_text->SetLabelText(caption_text); } m_upgrade_status_img->SetBitmap(upgrade_yellow_icon.bmp()); } else { - wxString caption_text = wxString::Format("%s(%s)", from_u8(obj->dev_name), _L("Idle")); + wxString caption_text = wxString::Format("%s(%s)", from_u8(obj->get_dev_name()), _L("Idle")); m_caption_text->SetLabelText(caption_text); m_upgrade_status_img->SetBitmap(upgrade_green_icon.bmp()); } @@ -516,10 +519,10 @@ void MachineInfoPanel::update(MachineObject* obj) //update progress int upgrade_percent = obj->get_upgrade_percent(); - if (obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingInProgress) { + if (obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingInProgress) { m_upgrade_progress->SetValue(upgrade_percent); m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent)); - } else if (obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) { + } else if (obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingFinished) { wxString result_text = obj->get_upgrade_result_str(obj->upgrade_err_code); m_upgrade_progress->SetValue(upgrade_percent); m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent)); @@ -527,7 +530,7 @@ void MachineInfoPanel::update(MachineObject* obj) wxString model_id_text = obj->get_printer_type_display_str(); m_staticText_model_id_val->SetLabelText(model_id_text); - wxString sn_text = obj->dev_id; + wxString sn_text = obj->get_dev_id(); m_staticText_sn_val->SetLabelText(sn_text.MakeUpper()); this->Layout(); @@ -538,7 +541,7 @@ void MachineInfoPanel::update(MachineObject* obj) void MachineInfoPanel::update_version_text(MachineObject* obj) { - if (obj->upgrade_display_state == (int)MachineObject::UpgradingDisplayState::UpgradingInProgress) { + if (obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingInProgress) { m_staticText_ver_val->SetLabelText("-"); //m_staticText_ams_ver_val->SetLabelText("-"); m_ota_new_version_img->Hide(); @@ -552,11 +555,11 @@ void MachineInfoPanel::update_version_text(MachineObject* obj) && !obj->ota_new_version_number.empty()) { if (it != obj->module_vers.end()) { wxString ver_text= it->second.sw_ver; - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { ver_text+= wxString::Format("(%s)", _L("Beta version")); } ver_text += wxString::Format("->%s", obj->ota_new_version_number); - if (((it->second.firmware_status >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { + if (((it->second.firmware_flag >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { ver_text += wxString::Format("(%s)", _L("Beta version")); } //wxString ver_text = wxString::Format("%s->%s", it->second.sw_ver, obj->ota_new_version_number); @@ -570,7 +573,7 @@ void MachineInfoPanel::update_version_text(MachineObject* obj) else { if (it != obj->module_vers.end()) { wxString ver_text = wxString::Format("%s(%s)", it->second.sw_ver, _L("Latest version")); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { m_staticText_beta_version->Show(); } else { @@ -588,7 +591,7 @@ void MachineInfoPanel::update_version_text(MachineObject* obj) if (ota_it == obj->new_ver_list.end()) { if (it != obj->module_vers.end()) { wxString ver_text = wxString::Format("%s(%s)", it->second.sw_ver, _L("Latest version")); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { m_staticText_beta_version->Show(); } else { @@ -603,11 +606,11 @@ void MachineInfoPanel::update_version_text(MachineObject* obj) wxString ver_text = wxString::Format("%s->%s", ota_it->second.sw_ver, ota_it->second.sw_new_ver); if (it != obj->module_vers.end()) { ver_text = ota_it->second.sw_ver; - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { ver_text += wxString::Format("(%s)", _L("Beta version")); } ver_text += wxString::Format("->%s", ota_it->second.sw_new_ver); - if (((it->second.firmware_status >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { + if (((it->second.firmware_flag >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { ver_text += wxString::Format("(%s)", _L("Beta version")); } } @@ -616,7 +619,7 @@ void MachineInfoPanel::update_version_text(MachineObject* obj) if (it != obj->module_vers.end()) { m_ota_new_version_img->Hide(); wxString ver_text = wxString::Format("%s(%s)", it->second.sw_ver, _L("Latest version")); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { m_staticText_beta_version->Show(); } else { @@ -634,7 +637,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) { bool has_hub_model = false; - bool is_o_series = DeviceManager::get_printer_series(obj->printer_type) == "series_o"; + bool is_o_series = obj->is_series_o(); //hub if (!obj->online_ahb || obj->module_vers.find("ahb") == obj->module_vers.end() || is_o_series) @@ -730,18 +733,18 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) if (has_new_version) { m_extra_ams_panel->m_ams_new_version_img->Show(); ver_text = new_extra_ams_ver->second.sw_ver; - if ((extra_ams_it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((extra_ams_it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { ver_text += wxString::Format("(%s)", _L("Beta version")); } ver_text += wxString::Format("->%s", new_extra_ams_ver->second.sw_new_ver); - if (((extra_ams_it->second.firmware_status >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { + if (((extra_ams_it->second.firmware_flag >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { ver_text += wxString::Format("(%s)", _L("Beta version")); } } else { m_extra_ams_panel->m_ams_new_version_img->Hide(); ver_text = wxString::Format("%s(%s)", extra_ams_it->second.sw_ver, _L("Latest version")); - if ((extra_ams_it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((extra_ams_it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { m_extra_ams_panel->m_staticText_beta_version->Show(); } else { @@ -756,10 +759,10 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) else { show_extra_ams(false); show_ams(true); - std::map ver_list = obj->get_ams_version(); + std::map ver_list = obj->get_ams_version(); - if (obj->amsList.size() != m_amspanel_list.size()) { - int add_count = obj->amsList.size() - m_amspanel_list.size(); + if (obj->GetFilaSystem()->GetAmsList().size() != m_amspanel_list.size()) { + int add_count = obj->GetFilaSystem()->GetAmsList().size() - m_amspanel_list.size(); if (add_count > 0) { for (int i = 0; i < add_count; i++) { auto amspanel = new AmsPanel(this, wxID_ANY); @@ -782,7 +785,8 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) } auto ams_index = 0; - for (std::map::iterator iter = obj->amsList.begin(); iter != obj->amsList.end(); iter++) { + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + for (std::map::const_iterator iter = ams_list.cbegin(); iter != ams_list.cend(); iter++) { wxString ams_name; wxString ams_sn; wxString ams_ver; @@ -796,7 +800,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) continue; } - auto ams_id = std::stoi(iter->second->id); + auto ams_id = std::stoi(iter->second->GetAmsId()); ams_id -= ams_id >= 128 ? 128 : 0; size_t pos = it->second.name.find('/'); @@ -820,7 +824,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) } else { // update ams img - if (m_obj->upgrade_display_state == (int)MachineObject::UpgradingDisplayState::UpgradingInProgress) { + if (m_obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingInProgress) { ams_ver = "-"; amspanel->m_ams_new_version_img->Hide(); } @@ -833,7 +837,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) if (obj->ams_new_version_number.empty()) { ams_ver = wxString::Format("%s", it->second.sw_ver); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { amspanel->m_staticText_beta_version->Show(); } else { @@ -844,7 +848,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) else { //ams_ver = wxString::Format("%s->%s", it->second.sw_ver, obj->ams_new_version_number); ams_ver = it->second.sw_ver; - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { ams_ver += wxString::Format("(%s)", _L("Beta version")); } ams_ver += wxString::Format("->%s", obj->ams_new_version_number); @@ -854,7 +858,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) else { amspanel->m_ams_new_version_img->Hide(); wxString ver_text = wxString::Format("%s", it->second.sw_ver, _L("Latest version")); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { amspanel->m_staticText_beta_version->Show(); } @@ -876,7 +880,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) if (ver_item == obj->new_ver_list.end()) { amspanel->m_ams_new_version_img->Hide(); wxString ver_text = wxString::Format("%s(%s)", it->second.sw_ver, _L("Latest version")); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { amspanel->m_staticText_beta_version->Show(); } else { @@ -889,11 +893,11 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) amspanel->m_ams_new_version_img->Show(); //wxString ver_text = wxString::Format("%s->%s", ver_item->second.sw_ver, ver_item->second.sw_new_ver); wxString ver_text = ver_item->second.sw_ver; - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { ver_text += wxString::Format("(%s)", _L("Beta version")); } ver_text += wxString::Format("->%s", ver_item->second.sw_new_ver); - if (((it->second.firmware_status >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { + if (((it->second.firmware_flag >> 2) & 0x3) == FIRMWARE_STASUS::BETA) { amspanel->m_staticText_beta_version->Show(); } else { @@ -904,7 +908,7 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) else { amspanel->m_ams_new_version_img->Hide(); wxString ver_text = wxString::Format("%s(%s)", ver_item->second.sw_ver, _L("Latest version")); - if ((it->second.firmware_status & 0x3) == FIRMWARE_STASUS::BETA) { + if ((it->second.firmware_flag & 0x3) == FIRMWARE_STASUS::BETA) { amspanel->m_staticText_beta_version->Show(); } else { @@ -972,9 +976,11 @@ void MachineInfoPanel::update_ams_ext(MachineObject *obj) // STUDIO-11572 Update image bool contain_one_slot = false; bool contain_four_slot = false; - auto ams_iter = obj->amsList.begin(); - while (ams_iter != obj->amsList.end()) { - if (ams_iter->second->type == 4) { + const auto& ams_list = obj->GetFilaSystem()->GetAmsList(); + auto ams_iter = ams_list.begin(); + while (ams_iter != ams_list.end()) { + if (ams_iter->second->GetSlotCount() == 1) + { contain_one_slot = true; } else { contain_four_slot = true; @@ -1047,7 +1053,7 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) Freeze(); - if (status == (int)MachineObject::UpgradingDisplayState::UpgradingUnavaliable) { + if (status == (int)DevFirmwareUpgradingState::UpgradingUnavaliable) { m_button_upgrade_firmware->Show(); m_button_upgrade_firmware->Disable(); for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { @@ -1056,14 +1062,14 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) m_upgrade_retry_img->Hide(); m_staticText_upgrading_info->Hide(); m_staticText_upgrading_percent->Hide(); - } else if (status == (int) MachineObject::UpgradingDisplayState::UpgradingAvaliable) { + } else if (status == (int) DevFirmwareUpgradingState::UpgradingAvaliable) { m_button_upgrade_firmware->Show(); m_button_upgrade_firmware->Enable(); for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(false); } m_upgrade_retry_img->Hide(); m_staticText_upgrading_info->Hide(); m_staticText_upgrading_percent->Hide(); - } else if (status == (int) MachineObject::UpgradingDisplayState::UpgradingInProgress) { + } else if (status == (int) DevFirmwareUpgradingState::UpgradingInProgress) { m_button_upgrade_firmware->Disable(); for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } m_upgrade_retry_img->Hide(); @@ -1072,7 +1078,7 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) m_staticText_upgrading_info->SetForegroundColour(TEXT_NORMAL_CLR); m_staticText_upgrading_percent->SetForegroundColour(TEXT_NORMAL_CLR); m_staticText_upgrading_percent->Show(); - } else if (status == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) { + } else if (status == (int) DevFirmwareUpgradingState::UpgradingFinished) { if (upgrade_status_str == "UPGRADE_FAIL") { m_staticText_upgrading_info->SetLabel(_L("Update failed")); m_staticText_upgrading_info->SetForegroundColour(TEXT_FAILED_CLR); @@ -1172,10 +1178,10 @@ void MachineInfoPanel::confirm_upgrade(MachineObject* obj) { if (obj) { obj->command_upgrade_confirm(); - obj->upgrade_display_state = MachineObject::UpgradingDisplayState::UpgradingInProgress; + obj->upgrade_display_state = DevFirmwareUpgradingState::UpgradingInProgress; obj->upgrade_display_hold_count = HOLD_COUNT_MAX; // enter in progress status first - this->show_status(MachineObject::UpgradingDisplayState::UpgradingInProgress); + this->show_status((int)DevFirmwareUpgradingState::UpgradingInProgress); } } @@ -1325,7 +1331,7 @@ void UpgradePanel::update(MachineObject *obj) //force upgrade //unlock hint - if (m_obj && (m_obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) && (last_forced_hint_status != m_obj->upgrade_display_state)) { + if (m_obj && (m_obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingFinished) && (last_forced_hint_status != m_obj->upgrade_display_state)) { last_forced_hint_status = m_obj->upgrade_display_state; m_show_forced_hint = true; } @@ -1337,7 +1343,7 @@ void UpgradePanel::update(MachineObject *obj) force_dlg->Bind(EVT_SECONDARY_CHECK_CONFIRM, [this](wxCommandEvent& e) { if (m_obj) { m_obj->command_upgrade_confirm(); - m_obj->upgrade_display_state = MachineObject::UpgradingDisplayState::UpgradingInProgress; + m_obj->upgrade_display_state = DevFirmwareUpgradingState::UpgradingInProgress; m_obj->upgrade_display_hold_count = HOLD_COUNT_MAX; } }); @@ -1350,7 +1356,7 @@ void UpgradePanel::update(MachineObject *obj) } //consistency upgrade - if (m_obj && (m_obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) && (last_consistency_hint_status != m_obj->upgrade_display_state)) { + if (m_obj && (m_obj->upgrade_display_state == DevFirmwareUpgradingState::UpgradingFinished) && (last_consistency_hint_status != m_obj->upgrade_display_state)) { last_consistency_hint_status = m_obj->upgrade_display_state; m_show_consistency_hint = true; } @@ -1415,7 +1421,7 @@ bool UpgradePanel::Show(bool show) if (show) { DeviceManager* dev = wxGetApp().getDeviceManager(); if (dev) { - MachineObject* obj = dev->get_default_machine(); + MachineObject* obj = dev->get_selected_machine(); refresh_version_and_firmware(obj); } } diff --git a/src/slic3r/GUI/UpgradePanel.hpp b/src/slic3r/GUI/UpgradePanel.hpp index 7e9c84c801..f25ac69b08 100644 --- a/src/slic3r/GUI/UpgradePanel.hpp +++ b/src/slic3r/GUI/UpgradePanel.hpp @@ -226,8 +226,8 @@ protected: bool enable_select_firmware = false; bool m_need_update = false; //hint of force upgrade or consistency upgrade - int last_forced_hint_status = -1; - int last_consistency_hint_status = -1; + DevFirmwareUpgradingState last_forced_hint_status = DevFirmwareUpgradingState::DC; + DevFirmwareUpgradingState last_consistency_hint_status = DevFirmwareUpgradingState::DC; int last_status; bool m_show_forced_hint = true; bool m_show_consistency_hint = true; diff --git a/src/slic3r/GUI/UserManager.cpp b/src/slic3r/GUI/UserManager.cpp index 4d3c1aceb2..8283e709c7 100644 --- a/src/slic3r/GUI/UserManager.cpp +++ b/src/slic3r/GUI/UserManager.cpp @@ -6,6 +6,8 @@ #include "GUI_App.hpp" #include "MsgDialog.hpp" +#include "DeviceCore/DevManager.h" + namespace Slic3r { diff --git a/src/slic3r/GUI/Widgets/AMSControl.cpp b/src/slic3r/GUI/Widgets/AMSControl.cpp index 9f67916ab7..64ffc1bdec 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.cpp +++ b/src/slic3r/GUI/Widgets/AMSControl.cpp @@ -7,6 +7,9 @@ #include "slic3r/GUI/MsgDialog.hpp" #include "slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h" +#include "slic3r/GUI/DeviceCore/DevManager.h" +#include "slic3r/GUI/DeviceCore/DevFilaSystem.h" + #include #include @@ -33,7 +36,6 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons parse_object(obj); } - m_extder_data.total_extder_count = 1; SetBackgroundColour(*wxWHITE); // normal mode //Freeze(); @@ -174,7 +176,7 @@ AMSControl::AMSControl(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons /*option mid*/ - m_extruder = new AMSextruder(m_amswin, wxID_ANY, m_extder_data.total_extder_count, wxDefaultPosition, AMS_EXTRUDER_SIZE); + m_extruder = new AMSextruder(m_amswin, wxID_ANY, m_total_ext_count, wxDefaultPosition, AMS_EXTRUDER_SIZE); m_sizer_option_mid->Add( m_extruder, 0, wxALIGN_CENTER, 0 ); @@ -342,8 +344,8 @@ std::string AMSControl::GetCurrentCan(std::string amsid) } bool AMSControl::IsAmsInRightPanel(std::string ams_id) { - if (m_extder_data.total_extder_count == 2){ - if (m_ams_item_list.find(ams_id) != m_ams_item_list.end() && m_ams_item_list[ams_id]->get_nozzle_id() == MAIN_NOZZLE_ID) { + if (m_total_ext_count == 2){ + if (m_ams_item_list.find(ams_id) != m_ams_item_list.end() && m_ams_item_list[ams_id]->get_nozzle_id() == MAIN_EXTRUDER_ID) { return true; } else{ @@ -351,7 +353,7 @@ bool AMSControl::IsAmsInRightPanel(std::string ams_id) { } } else{ - for (auto id : m_item_ids[MAIN_NOZZLE_ID]){ + for (auto id : m_item_ids[MAIN_EXTRUDER_ID]){ if (id == ams_id){ return true; } @@ -614,17 +616,17 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std //Freeze(); for (auto ams_info = m_ams_info.begin(); ams_info != m_ams_info.end(); ams_info++){ if (ams_info->cans.size() == GENERIC_AMS_SLOT_NUM){ - ams_info->nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(ams_info->ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(ams_info->ams_id); + ams_info->nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(ams_info->ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(ams_info->ams_id); AddAmsPreview(*ams_info, ams_info->ams_type); AddAms(*ams_info); } else if (ams_info->cans.size() == 1){ - if (ams_info->nozzle_id == MAIN_NOZZLE_ID){ + if (ams_info->nozzle_id == MAIN_EXTRUDER_ID){ single_info_right.push_back(*ams_info); if (single_info_right.size() == 2){ - single_info_right[0].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_right[0].ams_id); - single_info_right[1].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_right[1].ams_id); + single_info_right[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[0].ams_id); + single_info_right[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[1].ams_id); AddAms(single_info_right, series_name, printer_type); AddAmsPreview(single_info_right, AMSPanelPos::RIGHT_PANEL); pair_id.push_back(std::make_pair(single_info_right[0].ams_id, single_info_right[1].ams_id)); @@ -634,8 +636,8 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std else if (ams_info->nozzle_id == 1){ single_info_left.push_back(*ams_info); if (single_info_left.size() == 2){ - single_info_left[0].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_left[0].ams_id); - single_info_left[1].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_left[1].ams_id); + single_info_left[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[0].ams_id); + single_info_left[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[1].ams_id); AddAms(single_info_left, series_name, printer_type); AddAmsPreview(single_info_left, AMSPanelPos::LEFT_PANEL); pair_id.push_back(std::make_pair(single_info_left[0].ams_id, single_info_left[1].ams_id)); @@ -660,9 +662,9 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std //wait add - single_info_right[0].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_right[0].ams_id); + single_info_right[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[0].ams_id); if (single_info_right.size() == 2){ - single_info_right[1].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_right[1].ams_id); + single_info_right[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_right[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_right[1].ams_id); pair_id.push_back(std::make_pair(single_info_right[0].ams_id, single_info_right[1].ams_id)); } AddAms(single_info_right, series_name, printer_type); @@ -677,9 +679,9 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std } } //wait add - single_info_left[0].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_left[0].ams_id); + single_info_left[0].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[0].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[0].ams_id); if (single_info_left.size() == 2){ - single_info_left[1].nozzle_id == MAIN_NOZZLE_ID ? m_item_ids[MAIN_NOZZLE_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info_left[1].ams_id); + single_info_left[1].nozzle_id == MAIN_EXTRUDER_ID ? m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info_left[1].ams_id) : m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info_left[1].ams_id); pair_id.push_back(std::make_pair(single_info_left[0].ams_id, single_info_left[1].ams_id)); } AddAmsPreview(single_info_left, AMSPanelPos::LEFT_PANEL); @@ -705,19 +707,19 @@ void AMSControl::CreateAmsDoubleNozzle(const std::string &series_name, const std auto right_init_mode = findFirstMode(AMSPanelPos::RIGHT_PANEL); - m_down_road->UpdateLeft(m_extder_data.total_extder_count, left_init_mode); - m_down_road->UpdateRight(m_extder_data.total_extder_count, right_init_mode); + m_down_road->UpdateLeft(2, left_init_mode); + m_down_road->UpdateRight(2, right_init_mode); - m_extruder->updateNozzleNum(m_extder_data.total_extder_count); + m_extruder->updateNozzleNum(2); - m_current_show_ams_left = m_item_ids[DEPUTY_NOZZLE_ID].size() > 0 ? m_item_ids[DEPUTY_NOZZLE_ID][0] : ""; - m_current_show_ams_right = m_item_ids[MAIN_NOZZLE_ID].size() > 0 ? m_item_ids[MAIN_NOZZLE_ID][0] : ""; + m_current_show_ams_left = m_item_ids[DEPUTY_EXTRUDER_ID].size() > 0 ? m_item_ids[DEPUTY_EXTRUDER_ID][0] : ""; + m_current_show_ams_right = m_item_ids[MAIN_EXTRUDER_ID].size() > 0 ? m_item_ids[MAIN_EXTRUDER_ID][0] : ""; m_current_ams = ""; m_down_road->UpdatePassRoad(AMSPanelPos::LEFT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - m_extruder->OnAmsLoading(false, DEPUTY_NOZZLE_ID); + m_extruder->OnAmsLoading(false, DEPUTY_EXTRUDER_ID); m_down_road->UpdatePassRoad(AMSPanelPos::RIGHT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); - m_extruder->OnAmsLoading(false, MAIN_NOZZLE_ID); + m_extruder->OnAmsLoading(false, MAIN_EXTRUDER_ID); m_amswin->Layout(); m_amswin->Fit(); @@ -735,13 +737,13 @@ void AMSControl::CreateAmsSingleNozzle(const std::string &series_name, const std //add ams data for (auto ams_info = m_ams_info.begin(); ams_info != m_ams_info.end(); ams_info++) { if (ams_info->cans.size() == GENERIC_AMS_SLOT_NUM) { - m_item_ids[DEPUTY_NOZZLE_ID].push_back(ams_info->ams_id); + m_item_ids[DEPUTY_EXTRUDER_ID].push_back(ams_info->ams_id); AddAmsPreview(*ams_info, ams_info->ams_type); AddAms(*ams_info, AMSPanelPos::LEFT_PANEL); //AddExtraAms(*ams_info); } else if (ams_info->cans.size() == 1) { - m_item_ids[DEPUTY_NOZZLE_ID].push_back(ams_info->ams_id); + m_item_ids[DEPUTY_EXTRUDER_ID].push_back(ams_info->ams_id); AddAmsPreview(*ams_info, ams_info->ams_type); AddAms(*ams_info, AMSPanelPos::LEFT_PANEL); @@ -758,8 +760,8 @@ void AMSControl::CreateAmsSingleNozzle(const std::string &series_name, const std } } if (single_info.size() > 0){ - m_item_ids[DEPUTY_NOZZLE_ID].push_back(single_info[0].ams_id); - m_item_nums[DEPUTY_NOZZLE_ID]++; + m_item_ids[DEPUTY_EXTRUDER_ID].push_back(single_info[0].ams_id); + m_item_nums[DEPUTY_EXTRUDER_ID]++; AddAms(single_info, series_name, printer_type, AMSPanelPos::LEFT_PANEL); AddAmsPreview(single_info, AMSPanelPos::LEFT_PANEL); single_info.clear(); @@ -772,7 +774,7 @@ void AMSControl::CreateAmsSingleNozzle(const std::string &series_name, const std } single_info.push_back(m_ext_info[0]); - m_item_ids[MAIN_NOZZLE_ID].push_back(single_info[0].ams_id); + m_item_ids[MAIN_EXTRUDER_ID].push_back(single_info[0].ams_id); AddAms(single_info, series_name, printer_type, AMSPanelPos::RIGHT_PANEL); auto left_init_mode = findFirstMode(AMSPanelPos::LEFT_PANEL); auto right_init_mode = findFirstMode(AMSPanelPos::RIGHT_PANEL); @@ -802,14 +804,14 @@ void AMSControl::CreateAmsSingleNozzle(const std::string &series_name, const std m_down_road->UpdateLeft(1, left_init_mode); m_down_road->UpdateRight(1, right_init_mode); } - m_current_show_ams_left = m_item_ids[DEPUTY_NOZZLE_ID].size() > 0 ? m_item_ids[DEPUTY_NOZZLE_ID][0] : ""; - m_current_show_ams_right = m_item_ids[MAIN_NOZZLE_ID].size() > 0 ? m_item_ids[MAIN_NOZZLE_ID][0] : ""; + m_current_show_ams_left = m_item_ids[DEPUTY_EXTRUDER_ID].size() > 0 ? m_item_ids[DEPUTY_EXTRUDER_ID][0] : ""; + m_current_show_ams_right = m_item_ids[MAIN_EXTRUDER_ID].size() > 0 ? m_item_ids[MAIN_EXTRUDER_ID][0] : ""; m_current_ams = ""; m_down_road->UpdatePassRoad(AMSPanelPos::LEFT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); m_down_road->UpdatePassRoad(AMSPanelPos::RIGHT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); m_extruder->updateNozzleNum(1); - m_extruder->OnAmsLoading(false, MAIN_NOZZLE_ID); + m_extruder->OnAmsLoading(false, MAIN_EXTRUDER_ID); m_amswin->Layout(); m_amswin->Fit(); @@ -911,7 +913,7 @@ void AMSControl::UpdateAms(const std::string &series_name, const std::string &printer_type, std::vector ams_info, std::vector ext_info, - ExtderData data, + DevExtderSystem data, std::string dev_id, bool is_reset, bool test) @@ -921,7 +923,8 @@ void AMSControl::UpdateAms(const std::string &series_name, bool fresh = false; // basic check - if (m_ams_info.size() == ams_info.size() && m_extder_data.total_extder_count == data.total_extder_count && m_dev_id == dev_id && m_ext_info.size() == ext_info.size()) { + if (m_ams_info.size() == ams_info.size() && m_total_ext_count == data.GetTotalExtderCount() && m_dev_id == dev_id && m_ext_info.size() == ext_info.size()) + { for (int i = 0; i < m_ams_info.size(); i++){ if (m_ams_info[i].ams_id != ams_info[i].ams_id){ fresh = true; @@ -938,13 +941,13 @@ void AMSControl::UpdateAms(const std::string &series_name, m_ams_info.clear(); m_ams_info = ams_info; + m_total_ext_count = data.GetTotalExtderCount(); m_ext_info.clear(); m_ext_info = ext_info; - m_extder_data = data; m_dev_id = dev_id; if (fresh){ ClearAms(); - if (m_extder_data.total_extder_count >= 2){ + if (m_total_ext_count >= 2){ CreateAmsDoubleNozzle(series_name, printer_type); }else{ CreateAmsSingleNozzle(series_name, printer_type); @@ -986,77 +989,7 @@ void AMSControl::UpdateAms(const std::string &series_name, { ams_prv.second->Update(item->second->get_ams_info()); } } - - /*if (m_current_show_ams.empty() && !is_reset) { - if (ext_info.size() > 0) { - SwitchAms(ext_info[0].ams_id); - } - }*/ - - //m_simplebook_ams_left->SetSelection(m_simplebook_ams_left->m_first); } - //else - //{ - // static bool first_time = true; - // bool fresh = false; - // static std::vectorams_info; - // int nozzle_num = 2; - // if (first_time){ - // ams_info = GenerateSimulateData(); - // fresh = true; - // first_time = false; - // } - - // //Freeze(); - - // // update item - // m_ams_info.clear(); - // m_ams_info = ams_info; - // m_ext_info.clear(); - // m_ext_info.push_back(ext_info[0]); - // m_ext_info.push_back(ext_info[0]); - // m_ext_info[0].ams_id = std::to_string(VIRTUAL_TRAY_MAIN_ID); - // m_ext_info[0].nozzle_id = MAIN_NOZZLE_ID; - // m_ext_info[1].ams_id = std::to_string(VIRTUAL_TRAY_DEPUTY_ID); - // m_ext_info[1].nozzle_id = DEPUTY_NOZZLE_ID; - // m_extder_data = data; - // if (fresh){ - // ClearAms(); - // if (m_extder_data.total_extder_count >= 2) { - // CreateAmsDoubleNozzle(); - // } - // else { - // CreateAmsSingleNozzle(); - // } - // SetSize(wxSize(FromDIP(578), -1)); - // SetMinSize(wxSize(FromDIP(578), -1)); - // Layout(); - // } - // //Thaw(); - - // // update cans - - // for (auto ams_item : m_ams_item_list) { - // std::string ams_id = ams_item.first; - // AmsItem* cans = ams_item.second; - // if (atoi(cans->get_ams_id().c_str()) >= VIRTUAL_TRAY_DEPUTY_ID) { - // for (auto ifo : m_ext_info) { - // if (ifo.ams_id == ams_id) { - // cans->Update(ifo); - // cans->show_sn_value(m_ams_model == AMSModel::AMS_LITE ? false : true); - // } - // } - // } - // else { - // for (auto ifo : m_ams_info) { - // if (ifo.ams_id == ams_id) { - // cans->Update(ifo); - // cans->show_sn_value(m_ams_model == AMSModel::AMS_LITE ? false : true); - // } - // } - // } - // } - //} /*update humidity popup*/ if (m_percent_humidity_dry_popup->IsShown()) @@ -1079,7 +1012,7 @@ void AMSControl::UpdateAms(const std::string &series_name, } /*update ams extruder*/ - if (m_extruder->updateNozzleNum(m_extder_data.total_extder_count, series_name)) + if (m_extruder->updateNozzleNum(m_total_ext_count, series_name)) { m_amswin->Layout(); } @@ -1089,12 +1022,12 @@ void AMSControl::AddAmsPreview(AMSinfo info, AMSModel type) { AMSPreview *ams_prv = nullptr; - if (info.nozzle_id == MAIN_NOZZLE_ID) + if (info.nozzle_id == MAIN_EXTRUDER_ID) { ams_prv = new AMSPreview(m_panel_prv_right, wxID_ANY, info, type); m_sizer_prv_right->Add(ams_prv, 0, wxALIGN_CENTER | wxLEFT, FromDIP(6)); } - else if (info.nozzle_id == DEPUTY_NOZZLE_ID) + else if (info.nozzle_id == DEPUTY_EXTRUDER_ID) { ams_prv = new AMSPreview(m_panel_prv_left, wxID_ANY, info, type); m_sizer_prv_left->Add(ams_prv, 0, wxALIGN_CENTER | wxLEFT, FromDIP(6)); @@ -1121,11 +1054,11 @@ void AMSControl::createAms(wxSimplebook* parent, int& idx, AMSinfo info, AMSPane AMSRoadShowMode AMSControl::findFirstMode(AMSPanelPos pos) { auto init_mode = AMSRoadShowMode::AMS_ROAD_MODE_NONE; std::string ams_id = ""; - if (pos == AMSPanelPos::LEFT_PANEL && m_item_ids[DEPUTY_NOZZLE_ID].size() > 0){ - ams_id = m_item_ids[DEPUTY_NOZZLE_ID][0]; + if (pos == AMSPanelPos::LEFT_PANEL && m_item_ids[DEPUTY_EXTRUDER_ID].size() > 0){ + ams_id = m_item_ids[DEPUTY_EXTRUDER_ID][0]; } - else if (pos == AMSPanelPos::RIGHT_PANEL && m_item_ids[MAIN_NOZZLE_ID].size() > 0){ - ams_id = m_item_ids[MAIN_NOZZLE_ID][0]; + else if (pos == AMSPanelPos::RIGHT_PANEL && m_item_ids[MAIN_EXTRUDER_ID].size() > 0){ + ams_id = m_item_ids[MAIN_EXTRUDER_ID][0]; } auto item = m_ams_item_list.find(ams_id); @@ -1184,7 +1117,7 @@ void AMSControl::createAmsPanel(wxSimplebook *parent, int &idx, std::vectorAdd(ams1, 0, wxLEFT, (book_panel->GetSize().x - ams1->GetSize().x) / 2); } else{ - auto ext_image = new AMSExtImage(book_panel, pos, &m_extder_data); + auto ext_image = new AMSExtImage(book_panel, pos, m_total_ext_count, false); book_sizer->Add(ams1, 0, wxLEFT, FromDIP(30)); book_sizer->Add(ext_image, 0, wxEXPAND | wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(30)); ext_image->setTotalExtNum(series_name, printer_type, total_ext_num); @@ -1211,15 +1144,15 @@ void AMSControl::createAmsPanel(wxSimplebook *parent, int &idx, std::vector 1){ - if (info.nozzle_id == MAIN_NOZZLE_ID){ + if (m_total_ext_count > 1){ + if (info.nozzle_id == MAIN_EXTRUDER_ID){ createAms(m_simplebook_ams_right, m_right_page_index, info, AMSPanelPos::RIGHT_PANEL); } - else if (info.nozzle_id == DEPUTY_NOZZLE_ID){ + else if (info.nozzle_id == DEPUTY_EXTRUDER_ID){ createAms(m_simplebook_ams_left, m_left_page_index, info, AMSPanelPos::LEFT_PANEL); } } - else if (m_extder_data.total_extder_count == 1){ + else if (m_total_ext_count == 1){ createAms(m_simplebook_ams_left, m_left_page_index, info, AMSPanelPos::LEFT_PANEL); } m_simplebook_ams_left->Layout(); @@ -1252,20 +1185,20 @@ void AMSControl::AddAms(std::vector single_info, const std::string &ser if (single_info.size() <= 0){ return; } - if (m_extder_data.total_extder_count == 2) { - if (single_info[0].nozzle_id == MAIN_NOZZLE_ID) { - createAmsPanel(m_simplebook_ams_right, m_right_page_index, single_info, series_name, printer_type, AMSPanelPos::RIGHT_PANEL, m_extder_data.total_extder_count); + if (m_total_ext_count == 2) { + if (single_info[0].nozzle_id == MAIN_EXTRUDER_ID) { + createAmsPanel(m_simplebook_ams_right, m_right_page_index, single_info, series_name, printer_type, AMSPanelPos::RIGHT_PANEL, m_total_ext_count); } - else if (single_info[0].nozzle_id == DEPUTY_NOZZLE_ID) { - createAmsPanel(m_simplebook_ams_left, m_left_page_index, single_info, series_name, printer_type, AMSPanelPos::LEFT_PANEL, m_extder_data.total_extder_count); + else if (single_info[0].nozzle_id == DEPUTY_EXTRUDER_ID) { + createAmsPanel(m_simplebook_ams_left, m_left_page_index, single_info, series_name, printer_type, AMSPanelPos::LEFT_PANEL, m_total_ext_count); } } - else if (m_extder_data.total_extder_count == 1) { + else if (m_total_ext_count == 1) { if (pos == AMSPanelPos::RIGHT_PANEL) { - createAmsPanel(m_simplebook_ams_right, m_right_page_index, single_info, series_name, printer_type, AMSPanelPos::RIGHT_PANEL, m_extder_data.total_extder_count); + createAmsPanel(m_simplebook_ams_right, m_right_page_index, single_info, series_name, printer_type, AMSPanelPos::RIGHT_PANEL, m_total_ext_count); } else { - createAmsPanel(m_simplebook_ams_left, m_left_page_index, single_info, series_name, printer_type, AMSPanelPos::LEFT_PANEL, m_extder_data.total_extder_count); + createAmsPanel(m_simplebook_ams_left, m_left_page_index, single_info, series_name, printer_type, AMSPanelPos::LEFT_PANEL, m_total_ext_count); } } @@ -1391,7 +1324,7 @@ void AMSControl::SwitchAms(std::string ams_id) for (auto ams_item : m_ams_item_list) { AmsItem* item = ams_item.second; if (item->get_ams_id() == ams_id) { - auto ids = item->get_panel_pos() == AMSPanelPos::LEFT_PANEL ? m_item_ids[DEPUTY_NOZZLE_ID] : m_item_ids[MAIN_NOZZLE_ID]; + auto ids = item->get_panel_pos() == AMSPanelPos::LEFT_PANEL ? m_item_ids[DEPUTY_EXTRUDER_ID] : m_item_ids[MAIN_EXTRUDER_ID]; auto pos = item->get_panel_pos(); for (auto id : ids) { if (id == item->get_ams_id()) { @@ -1399,16 +1332,16 @@ void AMSControl::SwitchAms(std::string ams_id) if (item->get_can_count() == GENERIC_AMS_SLOT_NUM) { if (item->get_ams_model() == AMSModel::AMS_LITE) { if (pos == AMSPanelPos::LEFT_PANEL) { - m_down_road->UpdateLeft(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); + m_down_road->UpdateLeft(m_total_ext_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); } else { - m_down_road->UpdateRight(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); + m_down_road->UpdateRight(m_total_ext_count, AMSRoadShowMode::AMS_ROAD_MODE_AMS_LITE); } } else { if (pos == AMSPanelPos::LEFT_PANEL) { - m_down_road->UpdateLeft(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + m_down_road->UpdateLeft(m_total_ext_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); } else { - m_down_road->UpdateRight(m_extder_data.total_extder_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); + m_down_road->UpdateRight(m_total_ext_count, AMSRoadShowMode::AMS_ROAD_MODE_FOUR); } } } @@ -1424,8 +1357,8 @@ void AMSControl::SwitchAms(std::string ams_id) break; } } - pos == AMSPanelPos::LEFT_PANEL ? m_down_road->UpdateLeft(m_extder_data.total_extder_count, mode) - : m_down_road->UpdateRight(m_extder_data.total_extder_count, mode); + pos == AMSPanelPos::LEFT_PANEL ? m_down_road->UpdateLeft(m_total_ext_count, mode) + : m_down_road->UpdateRight(m_total_ext_count, mode); if (pos == AMSPanelPos::LEFT_PANEL) { m_down_road->UpdatePassRoad(AMSPanelPos::LEFT_PANEL, -1, AMSPassRoadSTEP::AMS_ROAD_STEP_NONE); } else { @@ -1710,12 +1643,12 @@ void AMSControl::on_ams_setting_click(wxMouseEvent &event) } void AMSControl::parse_object(MachineObject* obj) { - if (!obj || obj->amsList.size() == 0) + if (!obj || obj->GetFilaSystem()->GetAmsList().size() == 0) { return; } m_ams_info.clear(); - for (auto ams : obj->amsList) + for (auto ams : obj->GetFilaSystem()->GetAmsList()) { AMSinfo info; info.parse_ams_info(obj, ams.second); diff --git a/src/slic3r/GUI/Widgets/AMSControl.hpp b/src/slic3r/GUI/Widgets/AMSControl.hpp index 891018f6de..31c6b86feb 100644 --- a/src/slic3r/GUI/Widgets/AMSControl.hpp +++ b/src/slic3r/GUI/Widgets/AMSControl.hpp @@ -14,6 +14,8 @@ #include #include +#include "slic3r/GUI/DeviceCore/DevExtruderSystem.h" + namespace Slic3r { namespace GUI { @@ -43,11 +45,11 @@ protected: std::map m_ams_item_list; std::map m_ext_image_list; - ExtderData m_extder_data; std::string m_dev_id; std::vector> m_item_ids{ {}, {} }; std::vector> pair_id; + int m_total_ext_count = 1; AMSextruder *m_extruder{nullptr}; AMSRoadDownPart* m_down_road{ nullptr }; @@ -158,7 +160,7 @@ public: const std::string &printer_type, std::vector ams_info, std::vector ext_info, - ExtderData data, + DevExtderSystem data, std::string dev_id, bool is_reset = true, bool test = false); diff --git a/src/slic3r/GUI/Widgets/AMSItem.cpp b/src/slic3r/GUI/Widgets/AMSItem.cpp index 26dd90aa85..7f03f0d91d 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.cpp +++ b/src/slic3r/GUI/Widgets/AMSItem.cpp @@ -7,6 +7,10 @@ #include "slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h" +#include "slic3r/GUI/DeviceCore/DevFilaSystem.h" +#include "slic3r/GUI/DeviceCore/DevConfig.h" +#include "slic3r/GUI/DeviceCore/DevManager.h" + #include #include @@ -42,30 +46,30 @@ namespace Slic3r { namespace GUI { //#define AMS_SINGLE_CAN_SIZE wxSize(FromDIP(78), 144) #define AMS_CANS_WINDOW_SIZE wxSize(FromDIP(264), FromDIP(174)) #define AMS_SINGLE_CAN_SIZE wxSize(FromDIP(78), FromDIP(174)) -bool AMSinfo::parse_ams_info(MachineObject *obj, Ams *ams, bool remain_flag, bool humidity_flag) +bool AMSinfo::parse_ams_info(MachineObject *obj, DevAms *ams, bool remain_flag, bool humidity_flag) { if (!ams) return false; - this->ams_id = ams->id; + this->ams_id = ams->GetAmsId(); - if (ams->type == 1 || ams->type == 3 || ams->type == N3S_AMS){ - this->ams_humidity = ams->humidity; + if (ams->SupportHumidity()){ + this->ams_humidity = ams->GetHumidityLevel(); } else{ this->ams_humidity = -1; } - this->humidity_raw = ams->humidity_raw; - this->left_dray_time = ams->left_dry_time; - this->current_temperature = ams->current_temperature; - this->ams_type = AMSModel(ams->type); + this->humidity_raw = ams->GetHumidityPercent(); + this->left_dray_time = ams->GetLeftDryTime(); + this->current_temperature = ams->GetCurrentTemperature(); + this->ams_type = AMSModel(ams->GetAmsType()); - nozzle_id = ams->nozzle; + nozzle_id = ams->GetExtruderId(); cans.clear(); - for (int i = 0; i < ams->trayList.size(); i++) { - auto it = ams->trayList.find(std::to_string(i)); + for (int i = 0; i < ams->GetTrays().size(); i++) { + auto it = ams->GetTrays().find(std::to_string(i)); Caninfo info; // tray is exists - if (it != ams->trayList.end() && it->second->is_exists) { + if (it != ams->GetTrays().end() && it->second->is_exists) { if (it->second->is_tray_info_ready()) { info.can_id = it->second->id; info.ctype = it->second->ctype; @@ -73,23 +77,23 @@ bool AMSinfo::parse_ams_info(MachineObject *obj, Ams *ams, bool remain_flag, boo info.cali_idx = it->second->cali_idx; info.filament_id = it->second->setting_id; if (!it->second->color.empty()) { - info.material_colour = AmsTray::decode_color(it->second->color); + info.material_colour = DevAmsTray::decode_color(it->second->color); } else { // set to white by default info.material_colour = AMS_TRAY_DEFAULT_COL; } for (std::string cols:it->second->cols) { - info.material_cols.push_back(AmsTray::decode_color(cols)); + info.material_cols.push_back(DevAmsTray::decode_color(cols)); } - if (MachineObject::is_bbl_filament(it->second->tag_uid)) { + if (DevFilaSystem::IsBBL_Filament(it->second->tag_uid)) { info.material_state = AMSCanType::AMS_CAN_TYPE_BRAND; } else { info.material_state = AMSCanType::AMS_CAN_TYPE_THIRDBRAND; } - if (!MachineObject::is_bbl_filament(it->second->tag_uid) || !remain_flag) { + if (!DevFilaSystem::IsBBL_Filament(it->second->tag_uid) || !remain_flag) { info.material_remain = 100; } else { if(it->second->remain < 0 || it->second->remain > 100) { @@ -128,7 +132,7 @@ bool AMSinfo::parse_ams_info(MachineObject *obj, Ams *ams, bool remain_flag, boo return true; } -void AMSinfo::parse_ext_info(MachineObject* obj, AmsTray tray) { +void AMSinfo::parse_ext_info(MachineObject* obj, DevAmsTray tray) { this->ams_id = tray.id; this->ams_type = AMSModel::EXT_AMS; @@ -147,7 +151,7 @@ void AMSinfo::parse_ext_info(MachineObject* obj, AmsTray tray) { info.cali_idx = tray.cali_idx; info.filament_id = tray.setting_id; if (!tray.color.empty()) { - info.material_colour = AmsTray::decode_color(tray.color); + info.material_colour = DevAmsTray::decode_color(tray.color); } else { // set to white by default @@ -155,7 +159,7 @@ void AMSinfo::parse_ext_info(MachineObject* obj, AmsTray tray) { } for (std::string cols : tray.cols) { - info.material_cols.push_back(AmsTray::decode_color(cols)); + info.material_cols.push_back(DevAmsTray::decode_color(cols)); } info.material_remain = 100; } @@ -575,9 +579,9 @@ AMSextruderImage::~AMSextruderImage() {} Description:AMSExtImage upon ext lib **************************************************/ -AMSExtImage::AMSExtImage(wxWindow* parent, AMSPanelPos ext_pos, ExtderData *data, wxWindowID id, const wxPoint& pos) +AMSExtImage::AMSExtImage(wxWindow* parent, AMSPanelPos ext_pos, int total_ext_num, bool over_ext, wxWindowID id, const wxPoint& pos) { - if (data == nullptr) + if (over_ext) { wxWindow::Create(parent, id, pos); SetMinSize(AMS_HUMIDITY_SIZE); @@ -591,9 +595,9 @@ AMSExtImage::AMSExtImage(wxWindow* parent, AMSPanelPos ext_pos, ExtderData *data SetMaxSize(wxSize(FromDIP(98), FromDIP(99))); m_show_ext = true; - total_ext_num = data->total_extder_count; } + m_ext_num = total_ext_num; m_ext_pos = ext_pos; SetBackgroundColour(StateColor::darkModeColorFor(AMS_CONTROL_DEF_LIB_BK_COLOUR)); @@ -606,7 +610,7 @@ const wxBitmap &AMSExtImage::get_bmp(const std::string &printer_type, bool is_am { int pos_id = 0; if (pos == AMSPanelPos::LEFT_PANEL) { pos_id = 1;} - const std::string &image_name = DeviceManager::get_printer_ext_img(printer_type, pos_id); + const std::string &image_name = DevPrinterConfigUtil::get_printer_ext_img(printer_type, pos_id); if (image_name.empty()) { return wxNullBitmap; } int image_size = is_ams_ext ? 25 : 98; @@ -639,9 +643,9 @@ void AMSExtImage::setShowAmsExt(bool show) void AMSExtImage::setTotalExtNum(const std::string &series_name, const std::string &printer_type, int num) { - if ((total_ext_num != num) || (m_series_name != series_name) || (m_printer_type_name != printer_type)) + if ((m_ext_num != num) || (m_series_name != series_name) || (m_printer_type_name != printer_type)) { - total_ext_num = num; + m_ext_num = num; m_series_name = series_name; m_printer_type_name = printer_type; Refresh(); @@ -701,7 +705,7 @@ void AMSExtImage::doRender(wxDC& dc) } -//Ams Extruder +//DevAms Extruder AMSextruder::AMSextruder(wxWindow *parent, wxWindowID id, int nozzle_num, const wxPoint &pos, const wxSize &size) { create(parent, id, pos, size, nozzle_num); @@ -743,13 +747,13 @@ void AMSextruder::OnAmsLoading(bool load, int nozzle_id, wxColour col /*= AMS_CO if (load) m_current_colur_deputy = col; } else if (m_nozzle_num > 1){ - if (nozzle_id == MAIN_NOZZLE_ID) { + if (nozzle_id == MAIN_EXTRUDER_ID) { m_right_extruder->OnAmsLoading(load, col); if (m_current_colur != col){ if (load) m_current_colur = col; } } - else if(nozzle_id == DEPUTY_NOZZLE_ID) { + else if(nozzle_id == DEPUTY_EXTRUDER_ID) { m_left_extruder->OnAmsLoading(load, col); if (m_current_colur_deputy != col) { if (load) m_current_colur_deputy = col; @@ -1054,7 +1058,7 @@ void AMSLib::render_generic_text(wxDC &dc) show_k_value = false; } else if (m_info.cali_idx == -1 || (m_obj && (CalibUtils::get_selected_calib_idx(m_obj->pa_calib_tab, m_info.cali_idx) == -1))) { - if (m_obj && m_obj->is_support_auto_flow_calibration) + if (m_obj && m_obj->GetConfig()->SupportCalibrationPA_FlowAuto()) show_k_value = false; else get_default_k_n_value(m_info.filament_id, m_info.k, m_info.n); @@ -2224,19 +2228,19 @@ void AMSRoadDownPart::SetPassRoadColour(bool left, wxColour col) { if (left) { - if (m_road_color[DEPUTY_NOZZLE_ID] == col) + if (m_road_color[DEPUTY_EXTRUDER_ID] == col) { return; } - m_road_color[DEPUTY_NOZZLE_ID] = col; + m_road_color[DEPUTY_EXTRUDER_ID] = col; } else { - if (m_road_color[MAIN_NOZZLE_ID] == col) + if (m_road_color[MAIN_EXTRUDER_ID] == col) { return; } - m_road_color[MAIN_NOZZLE_ID] = col; + m_road_color[MAIN_EXTRUDER_ID] = col; } Refresh(); @@ -3057,7 +3061,7 @@ void AmsItem::create(wxWindow *parent) } else{ if (m_ams_model == EXT_AMS){ - m_ext_image = new AMSExtImage(this, m_panel_pos); + m_ext_image = new AMSExtImage(this, m_panel_pos, 1, true); sizer_item->Add(m_ext_image, 0, wxALIGN_CENTER, 0); } } diff --git a/src/slic3r/GUI/Widgets/AMSItem.hpp b/src/slic3r/GUI/Widgets/AMSItem.hpp index a7a5ce2552..77442b042b 100644 --- a/src/slic3r/GUI/Widgets/AMSItem.hpp +++ b/src/slic3r/GUI/Widgets/AMSItem.hpp @@ -257,8 +257,8 @@ public: return true; }; - bool parse_ams_info(MachineObject* obj, Ams *ams, bool remain_flag = false, bool humidity_flag = false); - void parse_ext_info(MachineObject* obj, AmsTray tray); + bool parse_ams_info(MachineObject* obj, DevAms *ams, bool remain_flag = false, bool humidity_flag = false); + void parse_ext_info(MachineObject* obj, DevAmsTray tray); bool support_drying() const { return (ams_type == AMSModel::N3S_AMS) || (ams_type == AMSModel::N3F_AMS); }; Caninfo get_caninfo(const std::string& can_id, bool& found) const; @@ -376,12 +376,12 @@ private: bool m_show_ext = false; AMSPanelPos m_ext_pos; - int total_ext_num = 1; + int m_ext_num = 1; ScalableBitmap m_ext_image; public: - AMSExtImage(wxWindow *parent, AMSPanelPos ext_pos = AMSPanelPos::RIGHT_PANEL, ExtderData *data = nullptr, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition); + AMSExtImage(wxWindow *parent, AMSPanelPos ext_pos, int total_ext_num, bool over_ext, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition); ~AMSExtImage(); void msw_rescale(); diff --git a/src/slic3r/GUI/Widgets/FanControl.cpp b/src/slic3r/GUI/Widgets/FanControl.cpp index 4971bb4db2..9a1026473e 100644 --- a/src/slic3r/GUI/Widgets/FanControl.cpp +++ b/src/slic3r/GUI/Widgets/FanControl.cpp @@ -458,9 +458,9 @@ void FanControlNew::command_control_fan() if (m_obj) { if (!m_obj->is_enable_np){ int speed = floor(m_current_speed * float(25.5)); - m_obj->command_control_fan(m_part_id, speed); + m_obj->GetFan()->command_control_fan(m_part_id, speed); } else { - m_obj->command_control_fan_new(m_part_id, m_current_speed * 10, nullptr); + m_obj->GetFan()->command_control_fan_new(m_part_id, m_current_speed * 10); } post_event(); } @@ -708,9 +708,9 @@ void FanControlPopupNew::CreateDuct() { if (m_obj) { - int cooling_fan_speed = round(m_obj->cooling_fan_speed / float(25.5)); - int big_fan1_speed = round(m_obj->big_fan1_speed / float(25.5)); - int big_fan2_speed = round(m_obj->big_fan2_speed / float(25.5)); + int cooling_fan_speed = round(m_obj->GetFan()->GetCoolingFanSpeed() / float(25.5)); + int big_fan1_speed = round(m_obj->GetFan()->GetBigFan1Speed() / float(25.5)); + int big_fan2_speed = round(m_obj->GetFan()->GetBigFan2Speed() / float(25.5)); update_fan_data(AIR_FUN::FAN_COOLING_0_AIRDOOR, cooling_fan_speed); update_fan_data(AIR_FUN::FAN_REMOTE_COOLING_0_IDX, big_fan1_speed); update_fan_data(AIR_FUN::FAN_CHAMBER_0_IDX, big_fan2_speed); @@ -808,12 +808,12 @@ void FanControlPopupNew::update_fan_data(MachineObject *obj) return; } - if (!obj->m_air_duct_data.modes.empty()) { - update_fan_data(obj->m_air_duct_data); + if (!obj->GetFan()->GetAirDuctData().modes.empty()) { + update_fan_data(obj->GetFan()->GetAirDuctData()); } else { - int cooling_fan_speed = round(obj->cooling_fan_speed / float(25.5)); - int big_fan1_speed = round(obj->big_fan1_speed / float(25.5)); - int big_fan2_speed = round(obj->big_fan2_speed / float(25.5)); + int cooling_fan_speed = round(obj->GetFan()->GetCoolingFanSpeed() / float(25.5)); + int big_fan1_speed = round(obj->GetFan()->GetBigFan1Speed() / float(25.5)); + int big_fan2_speed = round(obj->GetFan()->GetBigFan2Speed() / float(25.5)); update_fan_data(AIR_FUN::FAN_COOLING_0_AIRDOOR, cooling_fan_speed); update_fan_data(AIR_FUN::FAN_REMOTE_COOLING_0_IDX, big_fan1_speed); update_fan_data(AIR_FUN::FAN_CHAMBER_0_IDX, big_fan2_speed); @@ -910,7 +910,7 @@ void FanControlPopupNew::command_control_air_duct(int mode_id, int submode) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ", control air duct, id = " << mode_id; if (m_obj) { - m_obj->command_control_air_duct(mode_id, submode, [](const json& reply) {}); + m_obj->GetFan()->command_control_air_duct(mode_id, submode, [](const json& reply) {}); m_air_duct_time_out = time_out; m_data.curren_mode = mode_id; @@ -1002,13 +1002,13 @@ void FanControlPopupNew::init_names(MachineObject* obj) { // special texts if (obj) { - const std::string& special_cooling_text = DeviceManager::get_fan_text(obj->printer_type, "special_cooling_text"); + const std::string& special_cooling_text = DevPrinterConfigUtil::get_fan_text(obj->printer_type, "special_cooling_text"); if (!special_cooling_text.empty()) { L("Cooling mode is suitable for printing PLA/PETG/TPU materials."); //some potential text, add i18n flags label_text[AIR_DUCT::AIR_DUCT_COOLING_FILT] = special_cooling_text; } - const std::string& special_func_aux_text = DeviceManager::get_fan_text(obj->printer_type, "special_func_aux_text"); + const std::string& special_func_aux_text = DevPrinterConfigUtil::get_fan_text(obj->printer_type, "special_func_aux_text"); if (!special_func_aux_text.empty()) { L_CONTEXT("Right", "air_duct"); fan_func_name[AIR_FUN::FAN_REMOTE_COOLING_0_IDX] = _CTX(special_func_aux_text, "air_duct"); diff --git a/src/slic3r/GUI/Widgets/FanControl.hpp b/src/slic3r/GUI/Widgets/FanControl.hpp index b757cad237..53c0e2658d 100644 --- a/src/slic3r/GUI/Widgets/FanControl.hpp +++ b/src/slic3r/GUI/Widgets/FanControl.hpp @@ -13,7 +13,7 @@ #include #include #include - +#include "../DeviceCore/DevFan.h" namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/Widgets/SideTools.cpp b/src/slic3r/GUI/Widgets/SideTools.cpp index f833c9c356..4288647e53 100644 --- a/src/slic3r/GUI/Widgets/SideTools.cpp +++ b/src/slic3r/GUI/Widgets/SideTools.cpp @@ -459,7 +459,7 @@ void SideTools::update_status(MachineObject* obj) if (!obj) return; /* Update Device Info */ - m_side_tools->set_current_printer_name(obj->dev_name); + m_side_tools->set_current_printer_name(obj->get_dev_name()); // update wifi signal image int wifi_signal_val = 0; diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index f350eba826..86e6fbd1db 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -11,8 +11,13 @@ #include "slic3r/GUI/Jobs/BoostThreadWorker.hpp" #include "slic3r/GUI/Jobs/PlaterWorker.hpp" #include "../GUI/MsgDialog.hpp" -#include "../GUI/Plater.hpp" +#include "../GUI/DeviceCore/DevConfig.h" +#include "../GUI/DeviceCore/DevExtruderSystem.h" +#include "../GUI/DeviceCore/DevManager.h" +#include "../GUI/DeviceCore/DevStorage.h" +#include "libslic3r/FlushVolCalc.hpp" +#include "../GUI/Plater.hpp" namespace Slic3r { namespace GUI { @@ -174,9 +179,9 @@ static bool is_same_nozzle_diameters(const DynamicPrintConfig &full_config, cons for (size_t idx = 0; idx < opt_nozzle_diameters->size(); ++idx) config_nozzle_diameters[idx] = opt_nozzle_diameters->values[idx]; - std::vector machine_nozzle_diameters(obj->m_extder_data.extders.size()); - for (size_t idx = 0; idx < obj->m_extder_data.extders.size(); ++idx) - machine_nozzle_diameters[idx] = obj->m_extder_data.extders[idx].current_nozzle_diameter; + std::vector machine_nozzle_diameters(obj->GetExtderSystem()->GetTotalExtderCount()); + for (size_t idx = 0; idx < obj->GetExtderSystem()->GetTotalExtderCount(); ++idx) + machine_nozzle_diameters[idx] = obj->GetExtderSystem()->GetNozzleDiameter(idx); if (config_nozzle_diameters.size() != machine_nozzle_diameters.size()) { wxString nozzle_in_preset = wxString::Format(_L("nozzle size in preset: %d"), config_nozzle_diameters.size()); @@ -206,7 +211,7 @@ static bool is_same_nozzle_type(const DynamicPrintConfig &full_config, const Mac if (obj == nullptr) return true; - NozzleType nozzle_type = obj->m_extder_data.extders[0].current_nozzle_type; + NozzleType nozzle_type = obj->GetExtderSystem()->GetNozzleType(0); int printer_nozzle_hrc = Print::get_hrc_by_nozzle_type(nozzle_type); if (full_config.has("required_nozzle_HRC")) { @@ -214,7 +219,7 @@ static bool is_same_nozzle_type(const DynamicPrintConfig &full_config, const Mac if (abs(filament_nozzle_hrc) > abs(printer_nozzle_hrc)) { BOOST_LOG_TRIVIAL(info) << "filaments hardness mismatch: printer_nozzle_hrc = " << printer_nozzle_hrc << ", filament_nozzle_hrc = " << filament_nozzle_hrc; std::string filament_type = full_config.opt_string("filament_type", 0); - error_msg = wxString::Format(_L("Printing %1s material with %2s nozzle may cause nozzle damage."), filament_type, to_wstring_name(NozzleTypeEumnToStr[obj->m_extder_data.extders[0].current_nozzle_type])); + error_msg = wxString::Format(_L("Printing %1s material with %2s nozzle may cause nozzle damage."), filament_type, to_wstring_name(NozzleTypeEumnToStr[obj->GetExtderSystem()->GetNozzleType(0)])); error_msg += "\n"; MessageDialog msg_dlg(nullptr, error_msg, wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL); @@ -250,7 +255,7 @@ static bool check_nozzle_diameter_and_type(const DynamicPrintConfig &full_config return false; // P1P/S - if (obj->m_extder_data.extders[0].current_nozzle_type == NozzleType::ntUndefine) + if (obj->GetExtderSystem()->GetNozzleType(0) == NozzleType::ntUndefine) return true; // if (!is_same_nozzle_diameters(full_config, obj, error_msg)) @@ -1138,8 +1143,8 @@ bool CalibUtils::check_printable_status_before_cali(const MachineObject *obj, co bool is_multi_extruder = obj->is_multi_extruders(); std::vector nozzle_volume_types; if (is_multi_extruder) { - for (const Extder& extruder : obj->m_extder_data.extders) { - nozzle_volume_types.emplace_back(extruder.current_nozzle_flow_type); + for (const DevExtder& extruder : obj->GetExtderSystem()->GetExtruders()) { + nozzle_volume_types.emplace_back(extruder.GetNozzleFlowType()); } } @@ -1153,14 +1158,12 @@ bool CalibUtils::check_printable_status_before_cali(const MachineObject *obj, co float cali_diameter = cali_info.nozzle_diameter; int extruder_id = cali_info.extruder_id; - - if (extruder_id >= obj->m_extder_data.extders.size()) { + if (extruder_id >= obj->GetExtderSystem()->GetTotalExtderSize()) { error_message = _L("The number of printer extruders and the printer selected for calibration does not match."); return false; } - float diameter = obj->m_extder_data.extders[extruder_id].current_nozzle_diameter; - + float diameter = obj->GetExtderSystem()->GetNozzleDiameter(extruder_id); if (!is_approx(cali_info.nozzle_diameter, diameter)) { if (is_multi_extruder) error_message = wxString::Format(_L("The currently selected nozzle diameter of %s extruder does not match the actual nozzle diameter.\n" @@ -1198,12 +1201,12 @@ bool CalibUtils::check_printable_status_before_cali(const MachineObject* obj, co const ConfigOptionFloatsNullable *nozzle_diameter_config = cali_info.printer_prest->config.option("nozzle_diameter"); float nozzle_diameter = nozzle_diameter_config->values[0]; - float diameter = obj->m_extder_data.extders[cali_info.extruder_id].current_nozzle_diameter; + float diameter = obj->GetExtderSystem()->GetNozzleDiameter(cali_info.extruder_id); bool is_multi_extruder = obj->is_multi_extruders(); std::vector nozzle_volume_types; if (is_multi_extruder) { - for (const Extder& extruder : obj->m_extder_data.extders) { - nozzle_volume_types.emplace_back(extruder.current_nozzle_flow_type); + for (const DevExtder& extruder : obj->GetExtderSystem()->GetExtruders()) { + nozzle_volume_types.emplace_back(extruder.GetNozzleFlowType()); } } @@ -1469,12 +1472,12 @@ void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_mess return; } - else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { + else if (!obj_->GetConfig()->SupportPrintWithoutSD() && (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD)) { error_message = _L("Storage needs to be inserted before printing."); return; } if (obj_->is_lan_mode_printer()) { - if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) { error_message = _L("Storage needs to be inserted before printing via LAN."); return; } @@ -1483,7 +1486,7 @@ void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_mess print_worker = std::make_unique>(wxGetApp().plater(), std::move(process_bar), "calib_worker"); auto print_job = std::make_unique(dev_id); - print_job->m_dev_ip = obj_->dev_ip; + print_job->m_dev_ip = obj_->get_dev_ip(); print_job->m_ftp_folder = obj_->get_ftp_folder(); print_job->m_access_code = obj_->get_access_code(); @@ -1527,7 +1530,7 @@ void CalibUtils::send_to_print(const CalibInfo &calib_info, wxString &error_mess print_job->m_project_name = get_calib_mode_name(cali_mode, flow_ratio_mode); print_job->set_calibration_task(true); - print_job->has_sdcard = obj_->get_sdcard_state() == MachineObject::SdcardState::HAS_SDCARD_NORMAL; + print_job->has_sdcard = obj_->GetStorage()->get_sdcard_state() == DevStorage::HAS_SDCARD_NORMAL; print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true, false, 0, 0, 0); print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name);