diff --git a/resources/images/tab_calibration_active.svg b/resources/images/tab_calibration_active.svg
new file mode 100644
index 0000000000..71bfdfc451
--- /dev/null
+++ b/resources/images/tab_calibration_active.svg
@@ -0,0 +1,4 @@
+
diff --git a/resources/images/tab_multi_active.svg b/resources/images/tab_multi_active.svg
new file mode 100644
index 0000000000..dc776469e5
--- /dev/null
+++ b/resources/images/tab_multi_active.svg
@@ -0,0 +1,4 @@
+
diff --git a/resources/images/toolbar_double_directional_arrow.svg b/resources/images/toolbar_double_directional_arrow.svg
new file mode 100644
index 0000000000..4cc9b2ecb3
--- /dev/null
+++ b/resources/images/toolbar_double_directional_arrow.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp
index 9e9b56e9d8..0d5390d38f 100644
--- a/src/libslic3r/AppConfig.cpp
+++ b/src/libslic3r/AppConfig.cpp
@@ -186,6 +186,8 @@ void AppConfig::set_defaults()
if (get("show_hints").empty())
set_bool("show_hints", true);
//#endif
+ if (get("enable_multi_machine").empty())
+ set_bool("enable_multi_machine", false);
if (get("show_gcode_window").empty())
set_bool("show_gcode_window", true);
@@ -359,6 +361,14 @@ void AppConfig::set_defaults()
set("curr_bed_type", "1");
}
+ if (get("sending_interval").empty()) {
+ set("sending_interval", "60");
+ }
+
+ if (get("max_send").empty()) {
+ set("max_send", "10");
+ }
+
// #if BBL_RELEASE_TO_PUBLIC
if (get("iot_environment").empty()) {
set("iot_environment", "3");
diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp
index e1503604bb..7a0e381e50 100644
--- a/src/libslic3r/PresetBundle.cpp
+++ b/src/libslic3r/PresetBundle.cpp
@@ -1964,7 +1964,8 @@ std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle
if (printer_it->name.find(nozzle_diameter_str) != std::string::npos) printer_names.insert(printer_it->name);
}
- assert(printer_names.size() == 1);
+
+ //assert(printer_names.size() == 1);
for (auto& printer_name : printer_names) {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " printer name: " << printer_name;
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index fa808b4ac5..d5048a5c07 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -208,6 +208,8 @@ set(SLIC3R_GUI_SOURCES
GUI/Plater.hpp
GUI/PartPlate.cpp
GUI/PartPlate.hpp
+ GUI/UserNotification.cpp
+ GUI/UserNotification.hpp
GUI/PresetComboBoxes.hpp
GUI/PresetComboBoxes.cpp
GUI/BitmapComboBox.hpp
@@ -467,6 +469,24 @@ set(SLIC3R_GUI_SOURCES
Utils/json_diff.cpp
GUI/KBShortcutsDialog.hpp
GUI/KBShortcutsDialog.cpp
+ GUI/MultiMachine.hpp
+ GUI/MultiMachine.cpp
+ GUI/MultiMachinePage.hpp
+ GUI/MultiMachinePage.cpp
+ GUI/MultiMachineManagerPage.cpp
+ GUI/MultiMachineManagerPage.hpp
+ GUI/MultiPrintJob.cpp
+ GUI/MultiPrintJob.hpp
+ GUI/MultiSendMachineModel.hpp
+ GUI/MultiSendMachineModel.cpp
+ GUI/MultiTaskManagerPage.hpp
+ GUI/MultiTaskManagerPage.cpp
+ GUI/MultiTaskModel.hpp
+ GUI/MultiTaskModel.cpp
+ GUI/SendMultiMachinePage.hpp
+ GUI/SendMultiMachinePage.cpp
+ GUI/TaskManager.cpp
+ GUI/TaskManager.hpp
Utils/Http.cpp
Utils/Http.hpp
Utils/FixModelByWin10.cpp
diff --git a/src/slic3r/GUI/AmsMappingPopup.cpp b/src/slic3r/GUI/AmsMappingPopup.cpp
index f1308efec5..492926b952 100644
--- a/src/slic3r/GUI/AmsMappingPopup.cpp
+++ b/src/slic3r/GUI/AmsMappingPopup.cpp
@@ -412,6 +412,48 @@ void AmsMapingPopup::on_left_down(wxMouseEvent &evt)
}
}
+void AmsMapingPopup::update_ams_data_multi_machines()
+{
+ m_has_unmatch_filament = false;
+ for (auto& ams_container : m_amsmapping_container_list) {
+ ams_container->Hide();
+ }
+
+ for (wxWindow* mitem : m_mapping_item_list) {
+ mitem->Destroy();
+ mitem = nullptr;
+ }
+ m_mapping_item_list.clear();
+
+ if (m_amsmapping_container_sizer_list.size() > 0) {
+ for (wxBoxSizer* siz : m_amsmapping_container_sizer_list) {
+ siz->Clear(true);
+ }
+ }
+
+ int m_amsmapping_container_list_index = 0;
+ std::vector tray_datas;
+
+ for (int i = 0; i < 4; ++i) {
+ TrayData td;
+ td.id = i;
+ td.type = EMPTY;
+ td.colour = wxColour(166, 169, 170);
+ td.name = "";
+ td.filament_type = "";
+ td.ctype = 0;
+ tray_datas.push_back(td);
+ }
+
+ m_amsmapping_container_list[m_amsmapping_container_list_index]->Show();
+ add_ams_mapping(tray_datas, m_amsmapping_container_list[m_amsmapping_container_list_index], m_amsmapping_container_sizer_list[m_amsmapping_container_list_index]);
+
+ m_warning_text->Show(m_has_unmatch_filament);
+
+ Layout();
+ Fit();
+}
+
void AmsMapingPopup::update_ams_data(std::map amsList)
{
m_has_unmatch_filament = false;
diff --git a/src/slic3r/GUI/AmsMappingPopup.hpp b/src/slic3r/GUI/AmsMappingPopup.hpp
index e8e78b2578..75f274ba0b 100644
--- a/src/slic3r/GUI/AmsMappingPopup.hpp
+++ b/src/slic3r/GUI/AmsMappingPopup.hpp
@@ -157,6 +157,7 @@ public:
void update_materials_list(std::vector list);
void set_tag_texture(std::string texture);
void update_ams_data(std::map amsList);
+ void update_ams_data_multi_machines();
void add_ams_mapping(std::vector tray_data, wxWindow* container, wxBoxSizer* sizer);
void set_current_filament_id(int id){m_current_filament_id = id;};
int get_current_filament_id(){return m_current_filament_id;};
diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp
index de792404f7..9e3cb574b1 100644
--- a/src/slic3r/GUI/DeviceManager.cpp
+++ b/src/slic3r/GUI/DeviceManager.cpp
@@ -20,6 +20,8 @@
#include "fast_float/fast_float.h"
#define CALI_DEBUG
+#define MINUTE_30 1800000 //ms
+#define TIME_OUT 5000 //ms
namespace pt = boost::property_tree;
@@ -335,15 +337,15 @@ wxString HMSItem::get_module_name(ModuleID module_id)
switch (module_id)
{
case MODULE_MC:
- return _L("MC");
+ return "MC";
case MODULE_MAINBOARD:
- return _L("MainBoard");
+ return "MainBoard";
case MODULE_AMS:
- return _L("AMS");
+ return "AMS";
case MODULE_TH:
- return _L("TH");
+ return "TH";
case MODULE_XCAM:
- return _L("XCam");
+ return "XCam";
default:
wxString text = _L("Unknown") + wxString::Format("0x%x", (unsigned)module_id);
return text;
@@ -452,7 +454,7 @@ void MachineObject::erase_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->save();
+ //GUI::wxGetApp().app_config->save();
}
}
@@ -2243,6 +2245,7 @@ int MachineObject::command_start_flow_ratio_calibration(const X1CCalibInfos& cal
j["print"]["tray_id"] = calib_data.calib_datas[0].tray_id;
j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(calib_data.calib_datas[0].nozzle_diameter);
+ std::string filament_ids;
for (int i = 0; i < calib_data.calib_datas.size(); ++i) {
j["print"]["filaments"][i]["tray_id"] = calib_data.calib_datas[i].tray_id;
j["print"]["filaments"][i]["bed_temp"] = calib_data.calib_datas[i].bed_temp;
@@ -2251,6 +2254,10 @@ int MachineObject::command_start_flow_ratio_calibration(const X1CCalibInfos& cal
j["print"]["filaments"][i]["nozzle_temp"] = calib_data.calib_datas[i].nozzle_temp;
j["print"]["filaments"][i]["def_flow_ratio"] = std::to_string(calib_data.calib_datas[i].flow_rate);
j["print"]["filaments"][i]["max_volumetric_speed"] = std::to_string(calib_data.calib_datas[i].max_volumetric_speed);
+
+ if (i > 0)
+ filament_ids += ",";
+ filament_ids += calib_data.calib_datas[i].filament_id;
}
BOOST_LOG_TRIVIAL(trace) << "flowrate_cali: " << j.dump();
@@ -2652,7 +2659,7 @@ static ENUM enum_index_of(char const *key, char const **enum_names, int enum_cou
return defl;
}
-int MachineObject::parse_json(std::string payload)
+int MachineObject::parse_json(std::string payload, bool key_field_only)
{
CNumericLocalesSetter locales_setter;
@@ -2730,8 +2737,79 @@ int MachineObject::parse_json(std::string payload)
}
uint64_t t_utc = j.value("t_utc", 0ULL);
- if (t_utc > 0)
+ if (t_utc > 0) {
last_utc_time = std::chrono::system_clock::time_point(t_utc * 1ms);
+ std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
+ auto millisec_since_epoch = std::chrono::duration_cast(now.time_since_epoch()).count();
+ auto delay = millisec_since_epoch - t_utc; //ms
+
+ std::string message_type = is_lan_mode_printer() ? "Local Mqtt" : is_tunnel_mqtt ? "Tunnel Mqtt" : "Cloud Mqtt";
+ if (!message_delay.empty()) {
+ const auto& [first_type, first_time_stamp, first_delay] = message_delay.front();
+ const auto& [last_type, last_time_stap, last_delay] = message_delay.back();
+
+ BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ", message delay, last time stamp: " << last_time_stap;
+ if (last_time_stap - first_time_stamp >= MINUTE_30) {
+ // record, excluding current data
+ int total = message_delay.size();
+ int local_mqtt = 0;
+ int tunnel_mqtt = 0;
+ int cloud_mqtt = 0;
+
+ int local_mqtt_timeout = 0;
+ int tunnel_mqtt_timeout = 0;
+ int cloud_mqtt_timeout = 0;
+
+ for (const auto& [type, time_stamp, delay] : message_delay) {
+ if (type == "Local Mqtt") {
+ local_mqtt++;
+ if (delay >= TIME_OUT) {
+ local_mqtt_timeout++;
+ }
+ }
+ else if (type == "Tunnel Mqtt") {
+ tunnel_mqtt++;
+ if (delay >= TIME_OUT) {
+ tunnel_mqtt_timeout++;
+ }
+ }
+ else if (type == "Cloud Mqtt"){
+ cloud_mqtt++;
+ if (delay >= TIME_OUT) {
+ cloud_mqtt_timeout++;
+ }
+ }
+ }
+
+ 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();
+ }
+ }
+ message_delay.push_back(std::make_tuple(message_type, t_utc, delay));
+ }
else
last_utc_time = last_update_time;
@@ -2807,179 +2885,181 @@ int MachineObject::parse_json(std::string payload)
}
}
+ if (key_field_only) {
+ if (!DeviceManager::EnableMultiMachine) {
+ if (jj.contains("support_tunnel_mqtt")) {
+ if (jj["support_tunnel_mqtt"].is_boolean()) {
+ is_support_tunnel_mqtt = jj["support_tunnel_mqtt"].get();
+ }
+ }
+ }
+ } else {
+ //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();
+ }
+ }
- //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();
+ 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_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_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_ai_monitoring")) {
+ if (jj["support_ai_monitoring"].is_boolean()) {
+ is_support_ai_monitoring = jj["support_ai_monitoring"].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_lidar_calibration")) {
+ if (jj["support_lidar_calibration"].is_boolean()) {
+ is_support_lidar_calibration = jj["support_lidar_calibration"].get();
+ }
}
- }
-
- if (jj.contains("support_build_plate_marker_detect")) {
- if (jj["support_build_plate_marker_detect"].is_boolean()) {
- is_support_build_plate_marker_detect = jj["support_build_plate_marker_detect"].get();
- }
- }
- if (jj.contains("support_flow_calibration")) {
- if (jj["support_flow_calibration"].is_boolean()) {
- is_support_flow_calibration = jj["support_flow_calibration"].get();
+ if (jj.contains("support_build_plate_marker_detect")) {
+ if (jj["support_build_plate_marker_detect"].is_boolean()) {
+ is_support_build_plate_marker_detect = jj["support_build_plate_marker_detect"].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_flow_calibration")) {
+ if (jj["support_flow_calibration"].is_boolean()) {
+ is_support_flow_calibration = jj["support_flow_calibration"].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_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_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_print_all")) {
+ if (jj["support_print_all"].is_boolean()) {
+ is_support_print_all = jj["support_print_all"].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_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_chamber_fan")) {
- if (jj["support_chamber_fan"].is_boolean()) {
- is_support_chamber_fan = jj["support_chamber_fan"].get();
- }
- }
-
- if (jj.contains("support_filament_backup")) {
- if (jj["support_filament_backup"].is_boolean()) {
- is_support_filament_backup = jj["support_filament_backup"].get();
- }
- }
- if (jj.contains("support_update_remain")) {
- if (jj["support_update_remain"].is_boolean()) {
- is_support_update_remain = jj["support_update_remain"].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_auto_leveling")) {
- if (jj["support_auto_leveling"].is_boolean()) {
- is_support_auto_leveling = jj["support_auto_leveling"].get();
+ if (jj.contains("support_chamber_fan")) {
+ if (jj["support_chamber_fan"].is_boolean()) {
+ is_support_chamber_fan = jj["support_chamber_fan"].get();
+ }
}
- }
- if (jj.contains("support_auto_recovery_step_loss")) {
- if (jj["support_auto_recovery_step_loss"].is_boolean()) {
- is_support_auto_recovery_step_loss = jj["support_auto_recovery_step_loss"].get();
+ if (jj.contains("support_filament_backup")) {
+ if (jj["support_filament_backup"].is_boolean()) {
+ is_support_filament_backup = jj["support_filament_backup"].get();
+ }
}
- }
-
- if (jj.contains("support_ams_humidity")) {
- if (jj["support_ams_humidity"].is_boolean()) {
- is_support_ams_humidity = jj["support_ams_humidity"].get();
- }
- }
-
- if (jj.contains("support_prompt_sound")) {
- if (jj["support_prompt_sound"].is_boolean()) {
- is_support_prompt_sound = jj["support_prompt_sound"].get();
- }
- }
-
- //if (jj.contains("support_filament_tangle_detect")) {
- // if (jj["support_filament_tangle_detect"].is_boolean()) {
- // is_support_filament_tangle_detect = jj["support_filament_tangle_detect"].get();
- // }
- //}
- if (jj.contains("support_1080dpi")) {
- if (jj["support_1080dpi"].is_boolean()) {
- is_support_1080dpi = jj["support_1080dpi"].get();
+ if (jj.contains("support_update_remain")) {
+ if (jj["support_update_remain"].is_boolean()) {
+ is_support_update_remain = jj["support_update_remain"].get();
+ }
}
- }
-
- if (jj.contains("support_cloud_print_only")) {
- if (jj["support_cloud_print_only"].is_boolean()) {
- is_support_cloud_print_only = jj["support_cloud_print_only"].get();
- }
- }
-
- if (jj.contains("support_command_ams_switch")) {
- if (jj["support_command_ams_switch"].is_boolean()) {
- is_support_command_ams_switch = jj["support_command_ams_switch"].get();
- }
- }
-
- if (jj.contains("support_mqtt_alive")) {
- if (jj["support_mqtt_alive"].is_boolean()) {
- is_support_mqtt_alive = jj["support_mqtt_alive"].get();
- }
- }
-
- if (jj.contains("support_tunnel_mqtt")) {
- if (jj["support_tunnel_mqtt"].is_boolean()) {
- is_support_tunnel_mqtt = jj["support_tunnel_mqtt"].get();
- }
- }
- if (jj.contains("support_motor_noise_cali")) {
- if (jj["support_motor_noise_cali"].is_boolean()) {
- is_support_motor_noise_cali = jj["support_motor_noise_cali"].get();
+ if (jj.contains("support_auto_leveling")) {
+ if (jj["support_auto_leveling"].is_boolean()) {
+ is_support_auto_leveling = jj["support_auto_leveling"].get();
+ }
}
- }
- if (jj.contains("support_timelapse")) {
- if (jj["support_timelapse"].is_boolean()) {
- is_support_timelapse = jj["support_timelapse"].get();
+ if (jj.contains("support_auto_recovery_step_loss")) {
+ if (jj["support_auto_recovery_step_loss"].is_boolean()) {
+ is_support_auto_recovery_step_loss = jj["support_auto_recovery_step_loss"].get();
+ }
}
- }
- if (jj.contains("support_user_preset")) {
- if (jj["support_user_preset"].is_boolean()) {
- is_support_user_preset = jj["support_user_preset"].get();
+ if (jj.contains("support_ams_humidity")) {
+ if (jj["support_ams_humidity"].is_boolean()) {
+ is_support_ams_humidity = jj["support_ams_humidity"].get();
+ }
}
- }
- if (jj.contains("nozzle_max_temperature")) {
- if (jj["nozzle_max_temperature"].is_number_integer()) {
- nozzle_max_temperature = jj["nozzle_max_temperature"].get();
+ if (jj.contains("support_prompt_sound")) {
+ if (jj["support_prompt_sound"].is_boolean()) {
+ is_support_prompt_sound = jj["support_prompt_sound"].get();
+ }
}
- }
- if (jj.contains("bed_temperature_limit")) {
- if (jj["bed_temperature_limit"].is_number_integer()) {
- bed_temperature_limit = jj["bed_temperature_limit"].get();
+ //if (jj.contains("support_filament_tangle_detect")) {
+ // if (jj["support_filament_tangle_detect"].is_boolean()) {
+ // is_support_filament_tangle_detect = jj["support_filament_tangle_detect"].get();
+ // }
+ //}
+
+ if (jj.contains("support_1080dpi")) {
+ if (jj["support_1080dpi"].is_boolean()) {
+ is_support_1080dpi = jj["support_1080dpi"].get();
+ }
+ }
+
+ if (jj.contains("support_cloud_print_only")) {
+ if (jj["support_cloud_print_only"].is_boolean()) {
+ is_support_cloud_print_only = jj["support_cloud_print_only"].get();
+ }
+ }
+
+ if (jj.contains("support_command_ams_switch")) {
+ if (jj["support_command_ams_switch"].is_boolean()) {
+ is_support_command_ams_switch = jj["support_command_ams_switch"].get();
+ }
+ }
+
+ if (jj.contains("support_mqtt_alive")) {
+ if (jj["support_mqtt_alive"].is_boolean()) {
+ is_support_mqtt_alive = jj["support_mqtt_alive"].get();
+ }
+ }
+
+ if (jj.contains("support_motor_noise_cali")) {
+ if (jj["support_motor_noise_cali"].is_boolean()) {
+ is_support_motor_noise_cali = jj["support_motor_noise_cali"].get();
+ }
+ }
+
+ if (jj.contains("support_timelapse")) {
+ if (jj["support_timelapse"].is_boolean()) {
+ is_support_timelapse = jj["support_timelapse"].get();
+ }
+ }
+
+ if (jj.contains("support_user_preset")) {
+ if (jj["support_user_preset"].is_boolean()) {
+ is_support_user_preset = jj["support_user_preset"].get();
+ }
+ }
+
+ if (jj.contains("nozzle_max_temperature")) {
+ if (jj["nozzle_max_temperature"].is_number_integer()) {
+ nozzle_max_temperature = jj["nozzle_max_temperature"].get();
+ }
+ }
+
+ if (jj.contains("bed_temperature_limit")) {
+ if (jj["bed_temperature_limit"].is_number_integer()) {
+ bed_temperature_limit = jj["bed_temperature_limit"].get();
+ }
}
}
@@ -2991,7 +3071,7 @@ int MachineObject::parse_json(std::string payload)
if (jj["errno"].is_number()) {
if (jj["errno"].get() == -2) {
wxString text = _L("The current chamber temperature or the target chamber temperature exceeds 45\u2103.In order to avoid extruder clogging,low temperature filament(PLA/PETG/TPU) is not allowed to be loaded.");
- GUI::wxGetApp().show_dialog(text);
+ GUI::wxGetApp().push_notification(text);
}
}
}
@@ -3011,7 +3091,7 @@ int MachineObject::parse_json(std::string payload)
#if __WXOSX__
set_ctt_dlg(text);
#else
- GUI::wxGetApp().show_dialog(text);
+ GUI::wxGetApp().push_notification(text);
#endif
}
}
@@ -3027,21 +3107,6 @@ int MachineObject::parse_json(std::string payload)
if (jj.contains("print_type")) {
print_type = jj["print_type"].get();
}
-
- if (jj.contains("home_flag")) {
- home_flag = jj["home_flag"].get();
- parse_status(home_flag);
- }
- if (jj.contains("hw_switch_state")) {
- hw_switch_state = jj["hw_switch_state"].get();
- }
-
- if (jj.contains("mc_remaining_time")) {
- if (jj["mc_remaining_time"].is_string())
- mc_left_time = stoi(j["print"]["mc_remaining_time"].get()) * 60;
- else if (jj["mc_remaining_time"].is_number_integer())
- mc_left_time = j["print"]["mc_remaining_time"].get() * 60;
- }
if (jj.contains("mc_percent")) {
if (jj["mc_percent"].is_string())
mc_print_percent = stoi(j["print"]["mc_percent"].get());
@@ -3062,74 +3127,69 @@ int MachineObject::parse_json(std::string payload)
if (jj.contains("mc_print_error_code")) {
if (jj["mc_print_error_code"].is_number())
mc_print_error_code = jj["mc_print_error_code"].get();
-
}
- if (jj.contains("mc_print_line_number")) {
- if (jj["mc_print_line_number"].is_string() && !jj["mc_print_line_number"].is_null())
- mc_print_line_number = atoi(jj["mc_print_line_number"].get().c_str());
+ if (jj.contains("mc_remaining_time")) {
+ if (jj["mc_remaining_time"].is_string())
+ mc_left_time = stoi(j["print"]["mc_remaining_time"].get()) * 60;
+ else if (jj["mc_remaining_time"].is_number_integer())
+ mc_left_time = j["print"]["mc_remaining_time"].get() * 60;
}
if (jj.contains("print_error")) {
if (jj["print_error"].is_number())
print_error = jj["print_error"].get();
}
-
+ if (!key_field_only) {
+ if (jj.contains("home_flag")) {
+ home_flag = jj["home_flag"].get();
+ parse_status(home_flag);
+ }
+ if (jj.contains("hw_switch_state")) {
+ hw_switch_state = jj["hw_switch_state"].get();
+ }
+ if (jj.contains("mc_print_line_number")) {
+ if (jj["mc_print_line_number"].is_string() && !jj["mc_print_line_number"].is_null())
+ mc_print_line_number = atoi(jj["mc_print_line_number"].get().c_str());
+ }
+ }
#pragma endregion
#pragma region online
- // parse online info
- try {
- if (jj.contains("online")) {
- if (jj["online"].contains("ahb")) {
- if (jj["online"]["ahb"].get()) {
- online_ahb = true;
- } else {
- online_ahb = false;
+ if (!key_field_only) {
+ // parse online info
+ try {
+ if (jj.contains("online")) {
+ if (jj["online"].contains("ahb")) {
+ if (jj["online"]["ahb"].get()) {
+ online_ahb = true;
+ } else {
+ online_ahb = false;
+ }
+ }
+ if (jj["online"].contains("rfid")) {
+ if (jj["online"]["rfid"].get()) {
+ online_rfid = true;
+ } else {
+ online_rfid = false;
+ }
+ }
+ std::string str = jj.dump();
+ if (jj["online"].contains("version")) {
+ online_version = jj["online"]["version"].get();
+ }
+ if (last_online_version != online_version) {
+ last_online_version = online_version;
+ GUI::wxGetApp().CallAfter([this] {
+ this->command_get_version();
+ });
}
}
- if (jj["online"].contains("rfid")) {
- if (jj["online"]["rfid"].get()) {
- online_rfid = true;
- } else {
- online_rfid = false;
- }
- }
- std::string str = jj.dump();
- if (jj["online"].contains("version")) {
- online_version = jj["online"]["version"].get();
- }
- if (last_online_version != online_version) {
- last_online_version = online_version;
- GUI::wxGetApp().CallAfter([this] {
- this->command_get_version();
- });
- }
+ } catch (...) {
+ ;
}
- } catch (...) {
- ;
}
#pragma endregion
#pragma region print_task
- if (jj.contains("printer_type")) {
- printer_type = parse_printer_type(jj["printer_type"].get());
- }
-
- if (jj.contains("subtask_name")) {
- subtask_name = jj["subtask_name"].get();
- }
- if (jj.contains("layer_num")) {
- curr_layer = jj["layer_num"].get();
- }
- if (jj.contains("total_layer_num")) {
- total_layers = jj["total_layer_num"].get();
- if (total_layers == 0)
- is_support_layer_num = false;
- else
- is_support_layer_num = true;
- } else {
- is_support_layer_num = false;
- }
-
if (jj.contains("gcode_state")) {
this->set_print_state(jj["gcode_state"].get());
}
@@ -3141,26 +3201,52 @@ int MachineObject::parse_json(std::string payload)
is_support_wait_sending_finish = false;
}
- if (jj.contains("queue_number")) {
- this->queue_number = jj["queue_number"].get();
- } else {
- this->queue_number = 0;
+ if (jj.contains("subtask_name")) {
+ subtask_name = jj["subtask_name"].get();
}
- if (jj.contains("task_id")) {
- this->task_id_ = jj["task_id"].get();
- }
+ if (!key_field_only) {
+ if (jj.contains("printer_type")) {
+ printer_type = parse_printer_type(jj["printer_type"].get());
+ }
- if (jj.contains("gcode_file"))
- this->m_gcode_file = jj["gcode_file"].get();
- if (jj.contains("gcode_file_prepare_percent")) {
- std::string percent_str = jj["gcode_file_prepare_percent"].get();
- if (!percent_str.empty()) {
- try{
- this->gcode_file_prepare_percent = atoi(percent_str.c_str());
- } catch(...) {}
+ if (jj.contains("layer_num")) {
+ curr_layer = jj["layer_num"].get();
+ }
+ if (jj.contains("total_layer_num")) {
+ total_layers = jj["total_layer_num"].get();
+ if (total_layers == 0)
+ is_support_layer_num = false;
+ else
+ is_support_layer_num = true;
+ }
+ else {
+ is_support_layer_num = false;
+ }
+ if (jj.contains("queue_number")) {
+ this->queue_number = jj["queue_number"].get();
+ }
+ else {
+ this->queue_number = 0;
+ }
+
+ if (jj.contains("task_id")) {
+ this->task_id_ = jj["task_id"].get();
+ }
+
+ if (jj.contains("gcode_file"))
+ this->m_gcode_file = jj["gcode_file"].get();
+ if (jj.contains("gcode_file_prepare_percent")) {
+ std::string percent_str = jj["gcode_file_prepare_percent"].get();
+ if (!percent_str.empty()) {
+ try {
+ this->gcode_file_prepare_percent = atoi(percent_str.c_str());
+ }
+ catch (...) {}
+ }
}
}
+
if (jj.contains("project_id")
&& jj.contains("profile_id")
&& jj.contains("subtask_id")
@@ -3199,99 +3285,104 @@ int MachineObject::parse_json(std::string payload)
#pragma endregion
#pragma region status
- /* temperature */
- if (jj.contains("bed_temper")) {
- if (jj["bed_temper"].is_number()) {
- bed_temp = jj["bed_temper"].get();
+ 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();
+ if (jj.contains("bed_target_temper")) {
+ if (jj["bed_target_temper"].is_number()) {
+ bed_temp_target = jj["bed_target_temper"].get();
+ }
}
- }
- if (jj.contains("frame_temper")) {
- if (jj["frame_temper"].is_number()) {
- frame_temp = jj["frame_temper"].get();
+ 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()) {
- nozzle_temp = jj["nozzle_temper"].get();
+ if (jj.contains("nozzle_temper")) {
+ if (jj["nozzle_temper"].is_number()) {
+ nozzle_temp = jj["nozzle_temper"].get();
+ }
}
- }
- if (jj.contains("nozzle_target_temper")) {
- if (jj["nozzle_target_temper"].is_number()) {
- nozzle_temp_target = jj["nozzle_target_temper"].get();
+ if (jj.contains("nozzle_target_temper")) {
+ if (jj["nozzle_target_temper"].is_number()) {
+ nozzle_temp_target = jj["nozzle_target_temper"].get();
+ }
}
- }
- if (jj.contains("chamber_temper")) {
- if (jj["chamber_temper"].is_number()) {
- chamber_temp = jj["chamber_temper"].get();
+ if (jj.contains("chamber_temper")) {
+ if (jj["chamber_temper"].is_number()) {
+ chamber_temp = jj["chamber_temper"].get();
+ }
}
- }
- if (jj.contains("ctt")) {
- if (jj["ctt"].is_number()) {
- chamber_temp_target = jj["ctt"].get();
+ if (jj.contains("ctt")) {
+ if (jj["ctt"].is_number()) {
+ chamber_temp_target = jj["ctt"].get();
+ }
}
- }
- /* signals */
- if (jj.contains("link_th_state"))
- link_th = jj["link_th_state"].get();
- if (jj.contains("link_ams_state"))
- link_ams = jj["link_ams_state"].get();
- if (jj.contains("wifi_signal"))
- wifi_signal = jj["wifi_signal"].get();
+ /* signals */
+ if (jj.contains("link_th_state"))
+ link_th = jj["link_th_state"].get();
+ if (jj.contains("link_ams_state"))
+ link_ams = jj["link_ams_state"].get();
+ if (jj.contains("wifi_signal"))
+ 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) );
+ /* 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 {
- cooling_fan_speed = 0;
+ 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("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) );
+ if (jj.contains("heatbreak_fan_speed")) {
+ heatbreak_fan_speed = stoi(jj["heatbreak_fan_speed"].get());
}
- 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());
- }
- /* parse speed */
- try {
- if (jj.contains("spd_lvl")) {
- printing_speed_lvl = (PrintingSpeedLevel)jj["spd_lvl"].get();
+ /* parse speed */
+ 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());
+ }
}
- if (jj.contains("spd_mag")) {
- printing_speed_mag = jj["spd_mag"].get();
+ catch (...) {
+ ;
}
}
- catch (...) {
- ;
- }
try {
if (jj.contains("stg")) {
@@ -3312,115 +3403,119 @@ int MachineObject::parse_json(std::string payload)
;
}
- /*get filam_bak*/
- try {
- if (jj.contains("filam_bak")) {
- is_support_show_filament_backup = true;
- filam_bak.clear();
- if (jj["filam_bak"].is_array()) {
- for (auto it = jj["filam_bak"].begin(); it != jj["filam_bak"].end(); it++) {
- filam_bak.push_back(it.value().get());
+ if (!key_field_only) {
+ /*get filam_bak*/
+ try {
+ if (jj.contains("filam_bak")) {
+ is_support_show_filament_backup = true;
+ filam_bak.clear();
+ if (jj["filam_bak"].is_array()) {
+ for (auto it = jj["filam_bak"].begin(); it != jj["filam_bak"].end(); it++) {
+ filam_bak.push_back(it.value().get());
+ }
}
}
- }
- else {
- is_support_show_filament_backup = false;
- }
- }
- catch (...) {
- ;
- }
-
- /* get fimware type */
- try {
- if (jj.contains("mess_production_state")) {
- if (jj["mess_production_state"].get() == "engineer")
- firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER;
- else if (jj["mess_production_state"].get() == "product")
- firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION;
- }
- }
- catch (...) {
- ;
- }
-
- try {
- if (jj.contains("lifecycle")) {
- if (jj["lifecycle"].get() == "engineer")
- lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER;
- else if (jj["lifecycle"].get() == "product")
- lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION;
- }
- }
- catch (...) {
- ;
- }
-
- try {
- 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());
- }
- }
- }
- catch (...) {
- ;
- }
- // media
- try {
- if (jj.contains("sdcard")) {
- if (jj["sdcard"].get())
- sdcard_state = MachineObject::SdcardState::HAS_SDCARD_NORMAL;
- else
- sdcard_state = MachineObject::SdcardState::NO_SDCARD;
- } else {
- //do not check sdcard if no sdcard field
- sdcard_state = MachineObject::SdcardState::NO_SDCARD;
- }
- }
- catch (...) {
- ;
- }
-#pragma endregion
- try {
- if (jj.contains("nozzle_diameter")) {
-
- if (nozzle_setting_hold_count > 0) {
- nozzle_setting_hold_count--;
- } else {
- 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());
- }
- }
-
-
- }
- }
- catch(...) {
- ;
- }
-
- try {
- if (jj.contains("nozzle_type")) {
-
- if (nozzle_setting_hold_count > 0) {
- nozzle_setting_hold_count--;
- }
else {
- if (jj["nozzle_type"].is_string()) {
- nozzle_type = jj["nozzle_type"].get();
+ is_support_show_filament_backup = false;
+ }
+ }
+ catch (...) {
+ ;
+ }
+
+ /* get fimware type */
+ try {
+ if (jj.contains("mess_production_state")) {
+ if (jj["mess_production_state"].get() == "engineer")
+ firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER;
+ else if (jj["mess_production_state"].get() == "product")
+ firmware_type = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION;
+ }
+ }
+ catch (...) {
+ ;
+ }
+ }
+ if (!key_field_only) {
+ try {
+ if (jj.contains("lifecycle")) {
+ if (jj["lifecycle"].get() == "engineer")
+ lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_ENGINEER;
+ else if (jj["lifecycle"].get() == "product")
+ lifecycle = PrinterFirmwareType::FIRMWARE_TYPE_PRODUCTION;
+ }
+ }
+ catch (...) {
+ ;
+ }
+
+ try {
+ 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());
}
}
}
+ catch (...) {
+ ;
+ }
+ // media
+ try {
+ if (jj.contains("sdcard")) {
+ if (jj["sdcard"].get())
+ sdcard_state = MachineObject::SdcardState::HAS_SDCARD_NORMAL;
+ else
+ sdcard_state = MachineObject::SdcardState::NO_SDCARD;
+ } else {
+ //do not check sdcard if no sdcard field
+ sdcard_state = MachineObject::SdcardState::NO_SDCARD;
+ }
+ }
+ catch (...) {
+ ;
+ }
}
- catch (...) {
- ;
+#pragma endregion
+ if (!key_field_only) {
+ try {
+ if (jj.contains("nozzle_diameter")) {
+ if (nozzle_setting_hold_count > 0) {
+ nozzle_setting_hold_count--;
+ } else {
+ 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());
+ }
+ }
+
+
+ }
+ }
+ catch(...) {
+ ;
+ }
+
+ try {
+ if (jj.contains("nozzle_type")) {
+
+ if (nozzle_setting_hold_count > 0) {
+ nozzle_setting_hold_count--;
+ }
+ else {
+ if (jj["nozzle_type"].is_string()) {
+ nozzle_type = jj["nozzle_type"].get();
+ }
+ }
+ }
+ }
+ catch (...) {
+ ;
+ }
}
#pragma region upgrade
@@ -3521,147 +3616,151 @@ int MachineObject::parse_json(std::string payload)
#pragma endregion
#pragma region camera
- // parse camera info
- try {
- if (jj.contains("ipcam")) {
- json const & ipcam = jj["ipcam"];
- if (ipcam.contains("ipcam_record")) {
- if (camera_recording_hold_count > 0)
- camera_recording_hold_count--;
- else {
- if (ipcam["ipcam_record"].get() == "enable") {
- camera_recording_when_printing = true;
- }
+ if (!key_field_only) {
+ // parse camera info
+ try {
+ if (jj.contains("ipcam")) {
+ json const & ipcam = jj["ipcam"];
+ if (ipcam.contains("ipcam_record")) {
+ if (camera_recording_hold_count > 0)
+ camera_recording_hold_count--;
else {
- camera_recording_when_printing = false;
- }
- }
- }
- if (ipcam.contains("timelapse")) {
- if (camera_timelapse_hold_count > 0)
- camera_timelapse_hold_count--;
- else {
- if (ipcam["timelapse"].get() == "enable") {
- camera_timelapse = true;
- }
- else {
- camera_timelapse = false;
- }
- }
- }
- if (ipcam.contains("ipcam_dev")) {
- if (ipcam["ipcam_dev"].get() == "1") {
- has_ipcam = true;
- } else {
- has_ipcam = false;
- }
- }
- if (ipcam.contains("resolution")) {
- if (camera_resolution_hold_count > 0)
- camera_resolution_hold_count--;
- else {
- camera_resolution = ipcam["resolution"].get();
- }
- }
- if (ipcam.contains("resolution_supported")) {
- std::vector resolution_supported;
- for (auto res : ipcam["resolution_supported"])
- resolution_supported.emplace_back(res.get());
- camera_resolution_supported.swap(resolution_supported);
- }
- if (ipcam.contains("liveview")) {
- char const *local_protos[] = {"none", "disabled", "local", "rtsps", "rtsp"};
- liveview_local = enum_index_of(ipcam["liveview"].value("local", "none").c_str(), local_protos, 5, LiveviewLocal::LVL_None);
- liveview_remote = ipcam["liveview"].value("remote", "disabled") == "enabled";
- }
- if (ipcam.contains("file")) {
- file_local = ipcam["file"].value("local", "disabled") == "enabled";
- file_remote = ipcam["file"].value("remote", "disabled") == "enabled";
- file_model_download = ipcam["file"].value("model_download", "disabled") == "enabled";
- }
- virtual_camera = ipcam.value("virtual_camera", "disabled") == "enabled";
- if (ipcam.contains("rtsp_url")) {
- local_rtsp_url = ipcam["rtsp_url"].get();
- liveview_local = local_rtsp_url.empty() ? LVL_None : local_rtsp_url == "disable"
- ? LVL_Disable : boost::algorithm::starts_with(local_rtsp_url, "rtsps") ? LVL_Rtsps : LVL_Rtsp;
- }
- if (ipcam.contains("tutk_server")) {
- tutk_state = ipcam["tutk_server"].get();
- }
- }
- }
- catch (...) {
- ;
- }
-
- try {
- if (jj.contains("xcam")) {
- if (xcam_ai_monitoring_hold_count > 0)
- xcam_ai_monitoring_hold_count--;
- else {
- if (jj["xcam"].contains("printing_monitor")) {
- // new protocol
- xcam_ai_monitoring = jj["xcam"]["printing_monitor"].get();
- } else {
- // old version protocol
- if (jj["xcam"].contains("spaghetti_detector")) {
- xcam_ai_monitoring = jj["xcam"]["spaghetti_detector"].get();
- if (jj["xcam"].contains("print_halt")) {
- bool print_halt = jj["xcam"]["print_halt"].get();
- if (print_halt) { xcam_ai_monitoring_sensitivity = "medium"; }
+ if (ipcam["ipcam_record"].get() == "enable") {
+ camera_recording_when_printing = true;
+ }
+ else {
+ camera_recording_when_printing = false;
}
}
}
- if (jj["xcam"].contains("halt_print_sensitivity")) {
- xcam_ai_monitoring_sensitivity = jj["xcam"]["halt_print_sensitivity"].get();
+ if (ipcam.contains("timelapse")) {
+ if (camera_timelapse_hold_count > 0)
+ camera_timelapse_hold_count--;
+ else {
+ if (ipcam["timelapse"].get() == "enable") {
+ camera_timelapse = true;
+ }
+ else {
+ camera_timelapse = false;
+ }
+ }
}
- }
-
- if (xcam_first_layer_hold_count > 0)
- xcam_first_layer_hold_count--;
- else {
- if (jj["xcam"].contains("first_layer_inspector")) {
- xcam_first_layer_inspector = jj["xcam"]["first_layer_inspector"].get();
+ if (ipcam.contains("ipcam_dev")) {
+ if (ipcam["ipcam_dev"].get() == "1") {
+ has_ipcam = true;
+ } else {
+ has_ipcam = false;
+ }
}
- }
-
- if (xcam_buildplate_marker_hold_count > 0)
- xcam_buildplate_marker_hold_count--;
- else {
- if (jj["xcam"].contains("buildplate_marker_detector")) {
- xcam_buildplate_marker_detector = jj["xcam"]["buildplate_marker_detector"].get();
- is_support_build_plate_marker_detect = true;
- } else {
- is_support_build_plate_marker_detect = false;
+ if (ipcam.contains("resolution")) {
+ if (camera_resolution_hold_count > 0)
+ camera_resolution_hold_count--;
+ else {
+ camera_resolution = ipcam["resolution"].get();
+ }
+ }
+ if (ipcam.contains("resolution_supported")) {
+ std::vector resolution_supported;
+ for (auto res : ipcam["resolution_supported"])
+ resolution_supported.emplace_back(res.get());
+ camera_resolution_supported.swap(resolution_supported);
+ }
+ if (ipcam.contains("liveview")) {
+ char const *local_protos[] = {"none", "disabled", "local", "rtsps", "rtsp"};
+ liveview_local = enum_index_of(ipcam["liveview"].value("local", "none").c_str(), local_protos, 5, LiveviewLocal::LVL_None);
+ liveview_remote = ipcam["liveview"].value("remote", "disabled") == "enabled";
+ }
+ if (ipcam.contains("file")) {
+ file_local = ipcam["file"].value("local", "disabled") == "enabled";
+ file_remote = ipcam["file"].value("remote", "disabled") == "enabled";
+ file_model_download = ipcam["file"].value("model_download", "disabled") == "enabled";
+ }
+ virtual_camera = ipcam.value("virtual_camera", "disabled") == "enabled";
+ if (ipcam.contains("rtsp_url")) {
+ local_rtsp_url = ipcam["rtsp_url"].get();
+ liveview_local = local_rtsp_url.empty() ? LVL_None : local_rtsp_url == "disable"
+ ? LVL_Disable : boost::algorithm::starts_with(local_rtsp_url, "rtsps") ? LVL_Rtsps : LVL_Rtsp;
+ }
+ if (ipcam.contains("tutk_server")) {
+ tutk_state = ipcam["tutk_server"].get();
}
}
}
- }
- catch (...) {
- ;
+ catch (...) {
+ ;
+ }
+
+ try {
+ if (jj.contains("xcam")) {
+ if (xcam_ai_monitoring_hold_count > 0)
+ xcam_ai_monitoring_hold_count--;
+ else {
+ if (jj["xcam"].contains("printing_monitor")) {
+ // new protocol
+ xcam_ai_monitoring = jj["xcam"]["printing_monitor"].get();
+ } else {
+ // old version protocol
+ if (jj["xcam"].contains("spaghetti_detector")) {
+ xcam_ai_monitoring = jj["xcam"]["spaghetti_detector"].get();
+ if (jj["xcam"].contains("print_halt")) {
+ bool print_halt = jj["xcam"]["print_halt"].get();
+ if (print_halt) { xcam_ai_monitoring_sensitivity = "medium"; }
+ }
+ }
+ }
+ if (jj["xcam"].contains("halt_print_sensitivity")) {
+ xcam_ai_monitoring_sensitivity = jj["xcam"]["halt_print_sensitivity"].get();
+ }
+ }
+
+ if (xcam_first_layer_hold_count > 0)
+ xcam_first_layer_hold_count--;
+ else {
+ if (jj["xcam"].contains("first_layer_inspector")) {
+ xcam_first_layer_inspector = jj["xcam"]["first_layer_inspector"].get();
+ }
+ }
+
+ if (xcam_buildplate_marker_hold_count > 0)
+ xcam_buildplate_marker_hold_count--;
+ else {
+ if (jj["xcam"].contains("buildplate_marker_detector")) {
+ xcam_buildplate_marker_detector = jj["xcam"]["buildplate_marker_detector"].get();
+ is_support_build_plate_marker_detect = true;
+ } else {
+ is_support_build_plate_marker_detect = false;
+ }
+ }
+ }
+ }
+ catch (...) {
+ ;
+ }
}
#pragma endregion
#pragma region hms
- // 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);
+ 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);
}
- hms_list.push_back(item);
}
}
}
- }
- catch (...) {
- ;
+ catch (...) {
+ ;
+ }
}
#pragma endregion
@@ -3704,459 +3803,460 @@ int MachineObject::parse_json(std::string payload)
if (jj["ams"].contains("tray_exist_bits")) {
tray_exist_bits = stol(jj["ams"]["tray_exist_bits"].get(), nullptr, 16);
}
- 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);
- ams_support_use_ams = true;
- }
- 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_now")) {
- this->_parse_tray_now(jj["ams"]["tray_now"].get());
- }
- if (jj["ams"].contains("tray_tar")) {
- m_tray_tar = jj["ams"]["tray_tar"].get();
- }
- if (jj["ams"].contains("ams_rfid_status"))
- ams_rfid_status = jj["ams"]["ams_rfid_status"].get();
- if (jj["ams"].contains("humidity")) {
- if (jj["ams"]["humidity"].is_string()) {
- std::string humidity_str = jj["ams"]["humidity"].get();
- try {
- ams_humidity = atoi(humidity_str.c_str());
- } catch (...) {
- ;
- }
+ 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("insert_flag") || jj["ams"].contains("power_on_flag")
- || jj["ams"].contains("calibrate_remain_flag")) {
- if (ams_user_setting_hold_count > 0) {
- ams_user_setting_hold_count--;
- } else {
- 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 (jj["ams"].contains("tray_reading_bits")) {
+ tray_reading_bits = stol(jj["ams"]["tray_reading_bits"].get(), nullptr, 16);
+ ams_support_use_ams = true;
}
- }
- if (ams_exist_bits != last_ams_exist_bits
- || last_tray_exist_bits != last_tray_exist_bits
- || tray_is_bbl_bits != last_is_bbl_bits
- || tray_read_done_bits != last_read_done_bits
- || last_ams_version != 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();
- 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);
- try {
- if (!ams_id.empty()) {
- int ams_id_int = atoi(ams_id.c_str());
- new_ams->is_exists = (ams_exist_bits & (1 << ams_id_int)) != 0 ? true : false;
- }
- }
- catch (...) {
- ;
- }
- amsList.insert(std::make_pair(ams_id, new_ams));
- // new ams added event
- curr_ams = new_ams;
- } else {
- curr_ams = ams_it->second;
+ if (jj["ams"].contains("tray_is_bbl_bits")) {
+ tray_is_bbl_bits = stol(jj["ams"]["tray_is_bbl_bits"].get(), nullptr, 16);
}
- if (!curr_ams) continue;
-
- if (it->contains("humidity")) {
- std::string humidity = (*it)["humidity"].get();
-
- try {
- curr_ams->humidity = atoi(humidity.c_str());
- }
- catch (...) {
- ;
- }
+ if (jj["ams"].contains("version")) {
+ if (jj["ams"]["version"].is_number())
+ ams_version = jj["ams"]["version"].get();
}
-
-
- 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;
- }
- if (filament_list.find(curr_tray->setting_id) == filament_list.end()) {
- wxColour color = *wxWHITE;
- char col_buf[10];
- sprintf(col_buf, "%02X%02X%02XFF", (int) color.Red(), (int) color.Green(), (int) color.Blue());
- try {
- this->command_ams_filament_settings(std::stoi(ams_id), std::stoi(tray_id), "", "", std::string(col_buf), "", 0, 0);
- continue;
- } catch (...) {
- BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << " stoi error and ams_id: " << ams_id << " tray_id" << tray_id;
- }
- }
- } 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 (curr_tray->nozzle_temp_min != "" && curr_tray->nozzle_temp_max != "") {
- try {
- std::string preset_setting_id;
- bool is_equation = preset_bundle->check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray(
- MachineObject::get_preset_printer_model_name(this->printer_type), nozzle_diameter_str, curr_tray->setting_id,
- curr_tray->tag_uid, curr_tray->nozzle_temp_min, curr_tray->nozzle_temp_max, preset_setting_id);
- if (!is_equation) {
- command_ams_filament_settings(std::stoi(ams_id), std::stoi(tray_id), curr_tray->setting_id, preset_setting_id,
- curr_tray->color, curr_tray->type,
- std::stoi(curr_tray->nozzle_temp_min),
- std::stoi(curr_tray->nozzle_temp_max));
- }
- } catch (...) {
- BOOST_LOG_TRIVIAL(info) << "check fail and curr_tray ams_id" << ams_id << " curr_tray tray_id"<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;
+ if (jj["ams"].contains("tray_now")) {
+ this->_parse_tray_now(jj["ams"]["tray_now"].get());
+ }
+ if (jj["ams"].contains("tray_tar")) {
+ m_tray_tar = jj["ams"]["tray_tar"].get();
+ }
+ if (jj["ams"].contains("ams_rfid_status"))
+ ams_rfid_status = jj["ams"]["ams_rfid_status"].get();
+ if (jj["ams"].contains("humidity")) {
+ if (jj["ams"]["humidity"].is_string()) {
+ std::string humidity_str = jj["ams"]["humidity"].get();
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());
- curr_tray->is_exists = (tray_exist_bits & (1 << (ams_id_int * 4 + tray_id_int))) != 0 ? true : false;
+ ams_humidity = atoi(humidity_str.c_str());
+ } catch (...) {
+ ;
+ }
+ }
+ }
+
+ if (jj["ams"].contains("insert_flag") || jj["ams"].contains("power_on_flag")
+ || jj["ams"].contains("calibrate_remain_flag")) {
+ if (ams_user_setting_hold_count > 0) {
+ ams_user_setting_hold_count--;
+ } else {
+ if (jj["ams"].contains("insert_flag")) {
+ ams_insert_flag = jj["ams"]["insert_flag"].get