383{
384 if (jj.contains("ams"))
385 {
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
403
404
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 }
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
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
465 int type_id = 1;
466
467
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>();
474 if (extuder_id == 0xE && obj->GetFilaSwitch()->IsInstalled()) {
476 if (bind_switch_in == 0 || bind_switch_in == 1) {
478 }
479
480 if (bind_switch_in == 0) {
482 } else if (bind_switch_in == 1) {
484 }
485
486
487
488
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") {
496 }
498 }
499
500
501
502
503
504
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
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
534 curr_ams->SetAmsType(type_id);
535
536
537
538
539
540 curr_ams->m_binded_extruder_set = binded_extruder_set;
541 curr_ams->m_binded_switcher_pos = binded_switcher_pos;
542
543
544
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 }
556 {
557
559 }
560 else
561 {
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 {
578 }
579 catch (...)
580 {
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
617 if (obj->is_support_remote_dry) {
618 if (it->contains("info")) {
619 const std::string& info = (*it)["info"].get<std::string>();
624 }
625
626 if (it->contains("dry_setting")) {
627 const auto& j_dry_settings = (*it)["dry_setting"];
628 DevAms::DrySettings dry_settings;
632 curr_ams->m_dry_settings = dry_settings;
633 }
634
635 if (it->contains("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
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
683
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
785
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 }
801 {
802
804 }
805 else
806 {
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);
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
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
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