OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::DevFilaSystemParser Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/DeviceCore/DevFilaSystem.h>

Static Public Member Functions

static void ParseV1_0 (const nlohmann::json &print_json, MachineObject *obj, DevFilaSystem *system, bool key_field_only)
static void ParseAgentFilament (const nlohmann::json &data, MachineObject *obj, DevFilaSystem *system)

Detailed Description

DevFilaSystemParser - Parses printer JSON messages to populate DevFilaSystem.

This is the bridge between NetworkAgent's raw JSON data and the structured DevFilaSystem/DevAms/DevAmsTray hierarchy.

Called from MachineObject::parse_json() when AMS-related fields are present in printer status messages received via MQTT or LAN communication.

See also
MachineObject::parse_json() - Entry point for JSON parsing
DevFilaSystem - Target data structure

Member Function Documentation

◆ ParseAgentFilament()

void Slic3r::DevFilaSystemParser::ParseAgentFilament ( const nlohmann::json & data,
MachineObject * obj,
DevFilaSystem * system )
static
880{
881 if (!system || !data.is_object())
882 return;
883
884 // --- AMS units ---
885 if (data.contains("units") && data["units"].is_array())
886 {
887 std::set<std::string> seen_units;
888
889 for (const auto& u : data["units"])
890 {
891 if (!u.is_object() || !u.contains("id"))
892 continue;
893 const std::string ams_id = u.value("id", std::string());
894 if (ams_id.empty())
895 continue;
896 seen_units.insert(ams_id);
897
898 const int ext_id = u.value("extruder", MAIN_EXTRUDER_ID);
899 const DevAms::AmsType type = ams_type_from_string(u.value("type", std::string("ams")));
900
901 DevAms* ams = nullptr;
902 auto it = system->amsList.find(ams_id);
903 if (it == system->amsList.end())
904 {
905 ams = new DevAms(ams_id, ext_id, type);
906 system->amsList.insert(std::make_pair(ams_id, ams));
907 }
908 else
909 {
910 ams = it->second;
911 ams->m_ext_id = ext_id;
912 ams->SetAmsType(type);
913 }
914
915 ams->m_exist = true;
916 ams->m_current_temperature = u.value("temperature", (float) INVALID_AMS_TEMPERATURE);
917 ams->m_humidity_percent = u.value("humidity_percent", -1);
918 ams->m_left_dry_time = u.value("dry_time_min", 0);
919
920 // --- slots / trays ---
921 std::set<std::string> seen_slots;
922 if (u.contains("slots") && u["slots"].is_array())
923 {
924 for (const auto& s : u["slots"])
925 {
926 if (!s.is_object())
927 continue;
928 const std::string tray_id = std::to_string(s.value("index", -1));
929 seen_slots.insert(tray_id);
930
931 DevAmsTray* tray = nullptr;
932 auto tit = ams->m_trays.find(tray_id);
933 if (tit == ams->m_trays.end())
934 {
935 tray = new DevAmsTray(tray_id);
936 ams->m_trays.insert(std::make_pair(tray_id, tray));
937 }
938 else
939 {
940 tray = tit->second;
941 }
942
943 tray->is_exists = s.value("loaded", false);
944 tray->m_fila_type = s.value("material", std::string());
945 tray->setting_id = s.value("preset_id", std::string());
946 tray->UpdateColorFromStr(s.value("color", std::string()));
947 tray->nozzle_temp_min = std::to_string(s.value("nozzle_temp_min", 0));
948 tray->nozzle_temp_max = std::to_string(s.value("nozzle_temp_max", 0));
949 tray->remain = s.value("remain_percent", -1);
950 tray->k = s.value("k", 0.0f);
951 if (s.contains("diameter_mm") && s["diameter_mm"].is_number())
952 tray->diameter = std::to_string(s["diameter_mm"].get<double>());
953 if (s.contains("weight_g") && s["weight_g"].is_number())
954 tray->weight = std::to_string(s["weight_g"].get<int>());
955
956 tray->cols.clear();
957 if (s.contains("colors") && s["colors"].is_array())
958 {
959 for (const auto& c : s["colors"])
960 if (c.is_string())
961 tray->cols.push_back(c.get<std::string>());
962 }
963 tray->ctype = tray->cols.size() > 1 ? 1 : 0;
964 }
965 }
966
967 // prune trays no longer reported
968 for (auto tit = ams->m_trays.begin(); tit != ams->m_trays.end();)
969 {
970 if (seen_slots.count(tit->first) == 0)
971 {
972 delete tit->second;
973 tit = ams->m_trays.erase(tit);
974 }
975 else
976 {
977 ++tit;
978 }
979 }
980 }
981
982 // prune units no longer reported
983 for (auto it = system->amsList.begin(); it != system->amsList.end();)
984 {
985 if (seen_units.count(it->first) == 0)
986 {
987 delete it->second;
988 it = system->amsList.erase(it);
989 }
990 else
991 {
992 ++it;
993 }
994 }
995 }
996
997 // --- external / direct spools -> obj->vt_slot ---
998 // extruder 0 -> main virtual slot, extruder >0 -> deputy.
999 if (obj && data.contains("external") && data["external"].is_array())
1000 {
1001 obj->vt_slot.clear();
1002 for (const auto& e : data["external"])
1003 {
1004 if (!e.is_object())
1005 continue;
1006 const int ext = e.value("extruder", MAIN_EXTRUDER_ID);
1007 const int vt_id = (ext == MAIN_EXTRUDER_ID) ? VIRTUAL_TRAY_MAIN_ID : VIRTUAL_TRAY_DEPUTY_ID;
1008 DevAmsTray tray(std::to_string(vt_id));
1009 tray.is_exists = e.value("loaded", false);
1010 tray.m_fila_type = e.value("material", std::string());
1011 tray.setting_id = e.value("preset_id", std::string());
1012 tray.UpdateColorFromStr(e.value("color", std::string()));
1013 tray.nozzle_temp_min = std::to_string(e.value("nozzle_temp_min", 0));
1014 tray.nozzle_temp_max = std::to_string(e.value("nozzle_temp_max", 0));
1015 tray.remain = e.value("remain_percent", -1);
1016 obj->vt_slot.push_back(tray);
1017 }
1018 }
1019}
#define INVALID_AMS_TEMPERATURE
Definition DevDefs.h:98
#define VIRTUAL_TRAY_DEPUTY_ID
Definition DevDefs.h:90
#define VIRTUAL_TRAY_MAIN_ID
Definition DevDefs.h:89
#define MAIN_EXTRUDER_ID
Definition DevDefs.h:101
DevAmsType AmsType
Definition DevFilaSystem.h:142
static DevAms::AmsType ams_type_from_string(const std::string &s)
Definition DevFilaSystem.cpp:871

References Slic3r::ams_type_from_string(), Slic3r::DevFilaSystem::amsList, Slic3r::DevAmsTray::cols, Slic3r::DevAmsTray::ctype, Slic3r::DevAmsTray::diameter, INVALID_AMS_TEMPERATURE, Slic3r::DevAmsTray::is_exists, Slic3r::DevAmsTray::k, Slic3r::DevAms::m_current_temperature, Slic3r::DevAms::m_exist, Slic3r::DevAms::m_ext_id, Slic3r::DevAmsTray::m_fila_type, Slic3r::DevAms::m_humidity_percent, Slic3r::DevAms::m_left_dry_time, Slic3r::DevAms::m_trays, MAIN_EXTRUDER_ID, Slic3r::DevAmsTray::nozzle_temp_max, Slic3r::DevAmsTray::nozzle_temp_min, Slic3r::DevAmsTray::remain, Slic3r::DevAms::SetAmsType(), Slic3r::DevAmsTray::setting_id, Slic3r::DevAmsTray::UpdateColorFromStr(), VIRTUAL_TRAY_DEPUTY_ID, VIRTUAL_TRAY_MAIN_ID, Slic3r::MachineObject::vt_slot, and Slic3r::DevAmsTray::weight.

Here is the call graph for this function:

◆ ParseV1_0()

void Slic3r::DevFilaSystemParser::ParseV1_0 ( const nlohmann::json & print_json,
MachineObject * obj,
DevFilaSystem * system,
bool key_field_only )
static
383{
384 if (jj.contains("ams"))
385 {
386 if (jj["ams"].contains("ams"))
387 {
388 if (jj["ams"].contains("ams_exist_bits"))
389 {
390 obj->ams_exist_bits = stol(jj["ams"]["ams_exist_bits"].get<std::string>(), nullptr, 16);
391 }
392
393 if (jj["ams"].contains("tray_exist_bits"))
394 {
395 obj->tray_exist_bits = stol(jj["ams"]["tray_exist_bits"].get<std::string>(), nullptr, 16);
396 }
397
398 if (jj["ams"].contains("cali_stat")) { system->m_ams_cali_stat = jj["ams"]["cali_stat"].get<int>(); }
399
400 if (!key_field_only)
401 {
402 // Newer firmware sends the exact filament-change step sequence in ams.cfs, so the
403 // client no longer hardcodes the steps per model. Absent on current firmware, which
404 // keeps the list empty and the legacy hardcoded/ams_status_sub step path in effect.
405 if (jj["ams"].contains("cfs")) {
406 system->m_filament_change_steps = DevJsonValParser::GetVal<std::vector<DevFilamentStep>>(jj["ams"], "cfs");
407 } else {
408 system->m_filament_change_steps.clear();
409 }
410
411 if (jj["ams"].contains("tray_read_done_bits"))
412 {
413 obj->tray_read_done_bits = stol(jj["ams"]["tray_read_done_bits"].get<std::string>(), nullptr, 16);
414 }
415 if (jj["ams"].contains("tray_reading_bits"))
416 {
417 obj->tray_reading_bits = stol(jj["ams"]["tray_reading_bits"].get<std::string>(), nullptr, 16);
418 }
419 if (jj["ams"].contains("tray_is_bbl_bits"))
420 {
421 obj->tray_is_bbl_bits = stol(jj["ams"]["tray_is_bbl_bits"].get<std::string>(), nullptr, 16);
422 }
423 if (jj["ams"].contains("version"))
424 {
425 if (jj["ams"]["version"].is_number())
426 {
427 obj->ams_version = jj["ams"]["version"].get<int>();
428 }
429 }
430
431#if 0
432 if (jj["ams"].contains("ams_rfid_status")) { }
433#endif
434
435 if (time(nullptr) - obj->ams_user_setting_start > HOLD_TIME_3SEC)
436 {
437 if (jj["ams"].contains("insert_flag"))
438 {
439 system->m_ams_system_setting.SetDetectOnInsertEnabled(jj["ams"]["insert_flag"].get<bool>());
440 }
441 if (jj["ams"].contains("power_on_flag"))
442 {
443 system->m_ams_system_setting.SetDetectOnPowerupEnabled(jj["ams"]["power_on_flag"].get<bool>());
444 }
445 if (jj["ams"].contains("calibrate_remain_flag"))
446 {
447 system->m_ams_system_setting.SetDetectRemainEnabled(jj["ams"]["calibrate_remain_flag"].get<bool>());
448 }
449 }
450
451 json j_ams = jj["ams"]["ams"];
452 std::set<std::string> ams_id_set;
453
454 for (auto it = system->amsList.begin(); it != system->amsList.end(); it++)
455 {
456 ams_id_set.insert(it->first);
457 }
458
459 for (auto it = j_ams.begin(); it != j_ams.end(); it++)
460 {
461 if (!it->contains("id")) continue;
462 std::string ams_id = (*it)["id"].get<std::string>();
463
464 int extuder_id = MAIN_EXTRUDER_ID; // Default nozzle id
465 int type_id = 1; // 0:dummy 1:ams 2:ams-lite 3:n3f 4:n3s
466
467 /*ams info*/
468 std::set<int> binded_extruder_set;
469 std::optional<DevFilaSwitch::SwitchPos> binded_switcher_pos;
470 if (it->contains("info")) {
471 const std::string& info = (*it)["info"].get<std::string>();
472 type_id = DevUtil::get_flag_bits(info, 0, 4);
473 extuder_id = DevUtil::get_flag_bits(info, 8, 4);
474 if (extuder_id == 0xE && obj->GetFilaSwitch()->IsInstalled()) {
475 int bind_switch_in = DevUtil::get_flag_bits(info, 24, 4);
476 if (bind_switch_in == 0 || bind_switch_in == 1) {
477 binded_extruder_set = { MAIN_EXTRUDER_ID, DEPUTY_EXTRUDER_ID };
478 }
479
480 if (bind_switch_in == 0) {
481 binded_switcher_pos = DevFilaSwitch::SwitchPos::POS_IN_B;
482 } else if (bind_switch_in == 1) {
483 binded_switcher_pos = DevFilaSwitch::SwitchPos::POS_IN_A;
484 }
485
486 // Orca: the switch feeds every AMS to both extruders; pin a deterministic
487 // single-extruder id so legacy GetExtruderId() consumers keep a valid value
488 // while switch-aware code reads the binding set instead.
489 extuder_id = MAIN_EXTRUDER_ID;
490 } else if (extuder_id != 0xE) {
491 binded_extruder_set = { extuder_id };
492 }
493 } else {
494 if (!obj->is_enable_ams_np && obj->get_printer_ams_type() == "f1") {
495 type_id = DevAms::AMS_LITE;
496 }
497 binded_extruder_set = { MAIN_EXTRUDER_ID };
498 }
499
500 /*AMS without initialization*/
501 // Orca: an AMS reporting extruder 0xE without a Filament Track Switch installed has
502 // no usable extruder binding; drop it, preserving the existing display for
503 // half-initialized printers. With the switch installed the 0xE case is remapped
504 // above to both extruders and falls through to normal handling.
505 if (extuder_id == 0xE)
506 {
507 ams_id_set.erase(ams_id);
508 system->amsList.erase(ams_id);
509 continue;
510 }
511
512 ams_id_set.erase(ams_id);
513 DevAms* curr_ams = nullptr;
514 auto ams_it = system->amsList.find(ams_id);
515 if (ams_it == system->amsList.end())
516 {
517 DevAms* new_ams = new DevAms(ams_id, extuder_id, type_id);
518 system->amsList.insert(std::make_pair(ams_id, new_ams));
519 // new ams added event
520 curr_ams = new_ams;
521 }
522 else
523 {
524 if (extuder_id != ams_it->second->GetExtruderId())
525 {
526 ams_it->second->m_ext_id = extuder_id;
527 }
528
529 curr_ams = ams_it->second;
530 }
531 if (!curr_ams) continue;
532
533 /*set ams type flag*/
534 curr_ams->SetAmsType(type_id);
535
536 // Refresh the switch-aware extruder binding on every push (both create and
537 // update paths) so it can't go stale after an AMS is re-homed to another
538 // extruder. Without the switch the set holds the single bound extruder and
539 // the track position stays empty.
540 curr_ams->m_binded_extruder_set = binded_extruder_set;
541 curr_ams->m_binded_switcher_pos = binded_switcher_pos;
542
543
544 /*set ams exist flag*/
545 try
546 {
547 if (!ams_id.empty())
548 {
549 int ams_id_int = atoi(ams_id.c_str());
550
551 if (type_id < 4)
552 {
553 curr_ams->m_exist = (obj->ams_exist_bits & (1 << ams_id_int)) != 0 ? true : false;
554 }
555 else if (type_id == DevAms::AMS_LITE_MIXED)
556 {
557 // Mixed AMS-Lite (A2L / N9) exist flag lives at bit 12.
558 curr_ams->m_exist = DevUtil::get_flag_bits(obj->ams_exist_bits, 12);
559 }
560 else
561 {
562 curr_ams->m_exist = DevUtil::get_flag_bits(obj->ams_exist_bits, 4 + (ams_id_int - 128));
563 }
564 }
565 }
566 catch (...)
567 {
568 ;
569 }
570
571
572 if (it->contains("temp"))
573 {
574 std::string temp = (*it)["temp"].get<std::string>();
575 try
576 {
577 curr_ams->m_current_temperature = DevUtil::string_to_float(temp);
578 }
579 catch (...)
580 {
581 curr_ams->m_current_temperature = INVALID_AMS_TEMPERATURE;
582 }
583 }
584
585 if (it->contains("humidity"))
586 {
587 try
588 {
589 std::string humidity = (*it)["humidity"].get<std::string>();
590 curr_ams->m_humidity_level = atoi(humidity.c_str());
591 }
592 catch (...)
593 {
594 ;
595 }
596 }
597
598 if (it->contains("humidity_raw"))
599 {
600 try
601 {
602 std::string humidity_raw = (*it)["humidity_raw"].get<std::string>();
603 curr_ams->m_humidity_percent = atoi(humidity_raw.c_str());
604 }
605 catch (...)
606 {
607 ;
608 }
609 }
610
611 if (it->contains("dry_time") && (*it)["dry_time"].is_number())
612 {
613 curr_ams->m_left_dry_time = (*it)["dry_time"].get<int>();
614 }
615
616 // Drying status — only parse if printer supports remote drying
617 if (obj->is_support_remote_dry) {
618 if (it->contains("info")) {
619 const std::string& info = (*it)["info"].get<std::string>();
620 curr_ams->m_dry_status = (DevAms::DryStatus)DevUtil::get_flag_bits(info, 4, 4);
621 curr_ams->m_dry_fan1_status = (DevAms::DryFanStatus)DevUtil::get_flag_bits(info, 18, 2);
622 curr_ams->m_dry_fan2_status = (DevAms::DryFanStatus)DevUtil::get_flag_bits(info, 20, 2);
623 curr_ams->m_dry_sub_status = (DevAms::DrySubStatus)DevUtil::get_flag_bits(info, 22, 2);
624 }
625
626 if (it->contains("dry_setting")) {
627 const auto& j_dry_settings = (*it)["dry_setting"];
628 DevAms::DrySettings dry_settings;
629 DevJsonValParser::ParseVal(j_dry_settings, "dry_filament", dry_settings.dry_filament);
630 DevJsonValParser::ParseVal(j_dry_settings, "dry_temperature", dry_settings.dry_temp);
631 DevJsonValParser::ParseVal(j_dry_settings, "dry_duration", dry_settings.dry_hour);
632 curr_ams->m_dry_settings = dry_settings;
633 }
634
635 if (it->contains("dry_sf_reason")) {
636 curr_ams->m_dry_cannot_reasons = DevJsonValParser::GetVal<std::vector<DevAms::CannotDryReason>>((*it), "dry_sf_reason");
637 }
638 }
639
640 if (it->contains("tray"))
641 {
642 std::set<std::string> tray_id_set;
643 for (auto it = curr_ams->GetTrays().cbegin(); it != curr_ams->GetTrays().cend(); it++)
644 {
645 tray_id_set.insert(it->first);
646 }
647 for (auto tray_it = (*it)["tray"].begin(); tray_it != (*it)["tray"].end(); tray_it++)
648 {
649 if (!tray_it->contains("id")) continue;
650 std::string tray_id = (*tray_it)["id"].get<std::string>();
651 tray_id_set.erase(tray_id);
652 // compare tray_list
653 DevAmsTray* curr_tray = nullptr;
654 auto tray_iter = curr_ams->GetTrays().find(tray_id);
655 if (tray_iter == curr_ams->GetTrays().end())
656 {
657 DevAmsTray* new_tray = new DevAmsTray(tray_id);
658 curr_ams->m_trays.insert(std::make_pair(tray_id, new_tray));
659 curr_tray = new_tray;
660 }
661 else
662 {
663 curr_tray = tray_iter->second;
664 }
665 if (!curr_tray) continue;
666
667 if (curr_tray->hold_count > 0)
668 {
669 curr_tray->hold_count--;
670 continue;
671 }
672
673 curr_tray->id = (*tray_it)["id"].get<std::string>();
674 if (tray_it->contains("tag_uid"))
675 curr_tray->tag_uid = (*tray_it)["tag_uid"].get<std::string>();
676 else
677 curr_tray->tag_uid = "0";
678 if (tray_it->contains("tray_info_idx") && tray_it->contains("tray_type"))
679 {
680 curr_tray->setting_id = (*tray_it)["tray_info_idx"].get<std::string>();
681 //std::string type = (*tray_it)["tray_type"].get<std::string>();
682 std::string type = MachineObject::setting_id_to_type(curr_tray->setting_id, (*tray_it)["tray_type"].get<std::string>());
683 // curr_tray->setting_id is our OF id; GFS00/GFS01 are the printer's own support-filament ids.
684 auto* agent = GUI::wxGetApp().getAgent();
685 const std::string printer_filament_id = agent ? agent->from_orca_filament_id(curr_tray->setting_id) : curr_tray->setting_id;
686 if (printer_filament_id == "GFS00")
687 {
688 curr_tray->m_fila_type = "PLA-S";
689 }
690 else if (printer_filament_id == "GFS01")
691 {
692 curr_tray->m_fila_type = "PA-S";
693 }
694 else
695 {
696 curr_tray->m_fila_type = type;
697 }
698 }
699 else
700 {
701 curr_tray->setting_id = "";
702 curr_tray->m_fila_type = "";
703 }
704 if (tray_it->contains("tray_sub_brands"))
705 curr_tray->sub_brands = (*tray_it)["tray_sub_brands"].get<std::string>();
706 else
707 curr_tray->sub_brands = "";
708 if (tray_it->contains("tray_weight"))
709 curr_tray->weight = (*tray_it)["tray_weight"].get<std::string>();
710 else
711 curr_tray->weight = "";
712 if (tray_it->contains("tray_diameter"))
713 curr_tray->diameter = (*tray_it)["tray_diameter"].get<std::string>();
714 else
715 curr_tray->diameter = "";
716 if (tray_it->contains("tray_temp"))
717 curr_tray->temp = (*tray_it)["tray_temp"].get<std::string>();
718 else
719 curr_tray->temp = "";
720 if (tray_it->contains("tray_time"))
721 curr_tray->time = (*tray_it)["tray_time"].get<std::string>();
722 else
723 curr_tray->time = "";
724 if (tray_it->contains("bed_temp_type"))
725 curr_tray->bed_temp_type = (*tray_it)["bed_temp_type"].get<std::string>();
726 else
727 curr_tray->bed_temp_type = "";
728 if (tray_it->contains("bed_temp"))
729 curr_tray->bed_temp = (*tray_it)["bed_temp"].get<std::string>();
730 else
731 curr_tray->bed_temp = "";
732 if (tray_it->contains("tray_color"))
733 {
734 auto color = (*tray_it)["tray_color"].get<std::string>();
735 curr_tray->UpdateColorFromStr(color);
736 }
737 else
738 {
739 curr_tray->color = "";
740 }
741 if (tray_it->contains("nozzle_temp_max"))
742 {
743 curr_tray->nozzle_temp_max = (*tray_it)["nozzle_temp_max"].get<std::string>();
744 }
745 else
746 curr_tray->nozzle_temp_max = "";
747 if (tray_it->contains("nozzle_temp_min"))
748 curr_tray->nozzle_temp_min = (*tray_it)["nozzle_temp_min"].get<std::string>();
749 else
750 curr_tray->nozzle_temp_min = "";
751 if (tray_it->contains("xcam_info"))
752 curr_tray->xcam_info = (*tray_it)["xcam_info"].get<std::string>();
753 else
754 curr_tray->xcam_info = "";
755 if (tray_it->contains("tray_uuid"))
756 curr_tray->uuid = (*tray_it)["tray_uuid"].get<std::string>();
757 else
758 curr_tray->uuid = "0";
759
760 if (tray_it->contains("ctype"))
761 curr_tray->ctype = (*tray_it)["ctype"].get<int>();
762 else
763 curr_tray->ctype = 0;
764 curr_tray->cols.clear();
765 if (tray_it->contains("cols"))
766 {
767 if ((*tray_it)["cols"].is_array())
768 {
769 for (auto it = (*tray_it)["cols"].begin(); it != (*tray_it)["cols"].end(); it++)
770 {
771 curr_tray->cols.push_back(it.value().get<std::string>());
772 }
773 }
774 }
775
776 if (tray_it->contains("remain"))
777 {
778 curr_tray->remain = (*tray_it)["remain"].get<int>();
779 }
780 else
781 {
782 curr_tray->remain = -1;
783 }
784 // The tray objects are reused across status updates. Reset this
785 // state when a previously empty slot receives a filament again.
786 curr_tray->is_slot_placeholder = tray_it->contains("tray_slot_placeholder");
787 int ams_id_int = 0;
788 int tray_id_int = 0;
789 try
790 {
791 if (!ams_id.empty() && !curr_tray->id.empty())
792 {
793 ams_id_int = atoi(ams_id.c_str());
794 tray_id_int = atoi(curr_tray->id.c_str());
795
796 if (type_id < 4)
797 {
798 curr_tray->is_exists = (obj->tray_exist_bits & (1 << (ams_id_int * 4 + tray_id_int))) != 0 ? true : false;
799 }
800 else if (type_id == DevAms::AMS_LITE_MIXED)
801 {
802 // Mixed AMS-Lite (A2L / N9) trays occupy tray-exist bits 24..27.
803 curr_tray->is_exists = DevUtil::get_flag_bits(obj->tray_exist_bits, AMS_LITE_MIXED_TRAY_INDEX_OFFSET + tray_id_int);
804 }
805 else
806 {
807 curr_tray->is_exists = DevUtil::get_flag_bits(obj->tray_exist_bits, 16 + (ams_id_int - 128));
808 }
809
810 }
811 }
812 catch (...)
813 {
814 }
815 if (tray_it->contains("setting_id"))
816 {
817 curr_tray->filament_setting_id = (*tray_it)["setting_id"].get<std::string>();
818 }
819 auto curr_time = std::chrono::system_clock::now();
820 auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(curr_time - obj->extrusion_cali_set_hold_start);
821 if (diff.count() > HOLD_TIMEOUT || diff.count() < 0
822 || ams_id_int != (obj->extrusion_cali_set_tray_id / 4)
823 || tray_id_int != (obj->extrusion_cali_set_tray_id % 4))
824 {
825 if (tray_it->contains("k"))
826 {
827 curr_tray->k = (*tray_it)["k"].get<float>();
828 }
829 if (tray_it->contains("n"))
830 {
831 curr_tray->n = (*tray_it)["n"].get<float>();
832 }
833 }
834
835 std::string temp = tray_it->dump();
836
837 if (tray_it->contains("cali_idx"))
838 {
839 curr_tray->cali_idx = (*tray_it)["cali_idx"].get<int>();
840 }
841 }
842 // remove not in trayList
843 for (auto tray_it = tray_id_set.begin(); tray_it != tray_id_set.end(); tray_it++)
844 {
845 std::string tray_id = *tray_it;
846 auto tray = curr_ams->GetTrays().find(tray_id);
847 if (tray != curr_ams->GetTrays().end())
848 {
849 curr_ams->m_trays.erase(tray_id);
850 BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id << ", tray_id=" << tray_id;
851 }
852 }
853 }
854 }
855 // remove not in amsList
856 for (auto it = ams_id_set.begin(); it != ams_id_set.end(); it++)
857 {
858 std::string ams_id = *it;
859 auto ams = system->amsList.find(ams_id);
860 if (ams != system->amsList.end())
861 {
862 BOOST_LOG_TRIVIAL(trace) << "parse_json: remove ams_id=" << ams_id;
863 system->amsList.erase(ams_id);
864 }
865 }
866 }
867 }
868 }
869}
#define DEPUTY_EXTRUDER_ID
Definition DevDefs.h:102
#define AMS_LITE_MIXED_TRAY_INDEX_OFFSET
Definition DevDefs.h:96
#define HOLD_TIMEOUT
Definition DeviceManager.hpp:49
#define HOLD_TIME_3SEC
Definition DeviceManager.hpp:56
static constexpr AmsType AMS_LITE_MIXED
Definition DevFilaSystem.h:148
DrySubStatus
Definition DevFilaSystem.h:172
DryStatus
Definition DevFilaSystem.h:160
DryFanStatus
Definition DevFilaSystem.h:179
static constexpr AmsType AMS_LITE
Definition DevFilaSystem.h:145
@ POS_IN_B
Definition DevFilaSwitch.h:35
@ POS_IN_A
Definition DevFilaSwitch.h:36
static void ParseVal(const nlohmann::json &j, const std::string &key, T &val)
Definition DevUtil.h:76
static T GetVal(const nlohmann::json &j, const std::string &key, const T &default_val=T())
Definition DevUtil.h:60
static int get_flag_bits(std::string str, int start, int count=1)
Definition DevUtil.cpp:18
static float string_to_float(const std::string &str_value)
Definition DevUtil.cpp:146
static std::string setting_id_to_type(std::string setting_id, std::string tray_type)
Definition DeviceManager.cpp:2876
T * begin(Slic3r::Mat< N, M, T > &mat)
Definition Point.hpp:838
bool contains(const std::vector< T > &vector, const Point &point)
Definition Geometry.cpp:55
void trace(unsigned int level, const char *message)
Definition utils.cpp:247
nlohmann::json json
Definition AssembleList.cpp:42
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:731

References Slic3r::MachineObject::ams_exist_bits, Slic3r::DevAms::AMS_LITE, Slic3r::DevAms::AMS_LITE_MIXED, AMS_LITE_MIXED_TRAY_INDEX_OFFSET, Slic3r::MachineObject::ams_user_setting_start, Slic3r::MachineObject::ams_version, Slic3r::DevFilaSystem::amsList, Slic3r::DevAmsTray::bed_temp, Slic3r::DevAmsTray::bed_temp_type, Slic3r::DevAmsTray::cali_idx, Slic3r::DevAmsTray::color, Slic3r::DevAmsTray::cols, Slic3r::Geometry::contains(), Slic3r::DevAmsTray::ctype, DEPUTY_EXTRUDER_ID, Slic3r::DevAmsTray::diameter, Slic3r::diff(), Slic3r::DevAms::DrySettings::dry_filament, Slic3r::DevAms::DrySettings::dry_hour, Slic3r::DevAms::DrySettings::dry_temp, Slic3r::MachineObject::extrusion_cali_set_hold_start, Slic3r::MachineObject::extrusion_cali_set_tray_id, Slic3r::DevAmsTray::filament_setting_id, Slic3r::DevUtil::get_flag_bits(), Slic3r::MachineObject::get_printer_ams_type(), Slic3r::MachineObject::GetFilaSwitch(), Slic3r::DevAms::GetTrays(), Slic3r::DevJsonValParser::GetVal(), Slic3r::DevAmsTray::hold_count, HOLD_TIME_3SEC, HOLD_TIMEOUT, Slic3r::DevAmsTray::id, INVALID_AMS_TEMPERATURE, Slic3r::MachineObject::is_enable_ams_np, Slic3r::DevAmsTray::is_exists, Slic3r::DevAmsTray::is_slot_placeholder, Slic3r::MachineObject::is_support_remote_dry, Slic3r::DevFilaSwitch::IsInstalled(), Slic3r::DevAmsTray::k, Slic3r::DevFilaSystem::m_ams_cali_stat, Slic3r::DevFilaSystem::m_ams_system_setting, Slic3r::DevAms::m_binded_extruder_set, Slic3r::DevAms::m_binded_switcher_pos, Slic3r::DevAms::m_current_temperature, Slic3r::DevAms::m_dry_cannot_reasons, Slic3r::DevAms::m_dry_fan1_status, Slic3r::DevAms::m_dry_fan2_status, Slic3r::DevAms::m_dry_settings, Slic3r::DevAms::m_dry_status, Slic3r::DevAms::m_dry_sub_status, Slic3r::DevAms::m_exist, Slic3r::DevAmsTray::m_fila_type, Slic3r::DevFilaSystem::m_filament_change_steps, Slic3r::DevAms::m_humidity_level, Slic3r::DevAms::m_humidity_percent, Slic3r::DevAms::m_left_dry_time, Slic3r::DevAms::m_trays, MAIN_EXTRUDER_ID, Slic3r::DevAmsTray::n, Slic3r::DevAmsTray::nozzle_temp_max, Slic3r::DevAmsTray::nozzle_temp_min, Slic3r::DevJsonValParser::ParseVal(), Slic3r::DevFilaSwitch::POS_IN_A, Slic3r::DevFilaSwitch::POS_IN_B, Slic3r::DevAmsTray::remain, Slic3r::DevAms::SetAmsType(), Slic3r::DevAmsSystemSetting::SetDetectOnInsertEnabled(), Slic3r::DevAmsSystemSetting::SetDetectOnPowerupEnabled(), Slic3r::DevAmsSystemSetting::SetDetectRemainEnabled(), Slic3r::DevAmsTray::setting_id, Slic3r::MachineObject::setting_id_to_type(), Slic3r::DevUtil::string_to_float(), Slic3r::DevAmsTray::sub_brands, Slic3r::DevAmsTray::tag_uid, Slic3r::DevAmsTray::temp, Slic3r::DevAmsTray::time, Slic3r::trace(), Slic3r::MachineObject::tray_exist_bits, Slic3r::MachineObject::tray_is_bbl_bits, Slic3r::MachineObject::tray_read_done_bits, Slic3r::MachineObject::tray_reading_bits, Slic3r::DevAmsTray::UpdateColorFromStr(), Slic3r::DevAmsTray::uuid, Slic3r::DevAmsTray::weight, and Slic3r::DevAmsTray::xcam_info.

Referenced by Slic3r::MoonrakerPrinterAgent::build_ams_payload(), and Slic3r::MachineObject::parse_json().

Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following files:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/DeviceCore/DevFilaSystem.h
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp