mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-19 00:42:18 +00:00
Fix device popup, mapping, and status-parse defects
- Allow mapping to EMPTY trays only from the multi-machine send page and keep both panels pickable in the LEFT_AND_RIGHT view - Guard the error-dialog cloud snapshot against stale callbacks and fall back to the local illustration on timeout - Parse the ipcam storage-check ack and axis/chamber pushes defensively - Strip fan-control telemetry, initialize the upgrade error code, restore the .json filter in the model-id scan - Fix best-position popup tray lookup, gradient placement, and colour-list ownership - Cover switch binding sets and invalid-track transients in DevMapping tests
This commit is contained in:
@@ -79,3 +79,117 @@ TEST_CASE("Switch-bound AMS trays map to the left extruder", "[DevMapping]")
|
||||
CHECK(result[0].tray_id == 0);
|
||||
CHECK(result[0].ams_id == "0");
|
||||
}
|
||||
|
||||
TEST_CASE("Without a switch the binding set equals the single bound extruder", "[DevMapping]")
|
||||
{
|
||||
MachineObject obj(nullptr, nullptr, "test", "test_dev", "127.0.0.1");
|
||||
REQUIRE_FALSE(obj.GetFilaSwitch()->IsInstalled());
|
||||
|
||||
// AMS 0: info extruder nibble = MAIN (right). AMS 1: nibble = DEPUTY (left).
|
||||
// AMS 2: no "info" key at all (old X1/P1 firmware) -> must default to MAIN.
|
||||
// tray_exist_bits: bit ams_id*4+tray_id -> 0x111 marks tray 0 of each AMS.
|
||||
json print_push = json::parse(R"({
|
||||
"ams": {
|
||||
"tray_exist_bits": "111",
|
||||
"ams": [
|
||||
{ "id": "0", "info": "00000001", "tray": [ { "id": "0", "tray_color": "FF0000FF" } ] },
|
||||
{ "id": "1", "info": "00000101", "tray": [ { "id": "0", "tray_color": "00FF00FF" } ] },
|
||||
{ "id": "2", "tray": [ { "id": "0", "tray_color": "0000FFFF" } ] }
|
||||
]
|
||||
}
|
||||
})");
|
||||
DevFilaSystemParser::ParseV1_0(print_push, &obj, obj.GetFilaSystem().get(), false);
|
||||
|
||||
// The invariant that keeps the binding-set mapping filter behavior-preserving for
|
||||
// ordinary printers: GetBindedExtruderSet() == { GetExtruderId() }, info key or not.
|
||||
const auto& ams_list = obj.GetFilaSystem()->GetAmsList();
|
||||
REQUIRE(ams_list.count("0") == 1);
|
||||
REQUIRE(ams_list.count("1") == 1);
|
||||
REQUIRE(ams_list.count("2") == 1);
|
||||
for (const char* id : {"0", "1", "2"}) {
|
||||
const auto& ams = ams_list.at(id);
|
||||
INFO("ams " << id);
|
||||
REQUIRE(ams->GetBindedExtruderSet().size() == 1);
|
||||
REQUIRE(ams->GetBindedExtruderSet().count(ams->GetExtruderId()) == 1);
|
||||
}
|
||||
REQUIRE(ams_list.at("0")->GetExtruderId() == MAIN_EXTRUDER_ID);
|
||||
REQUIRE(ams_list.at("1")->GetExtruderId() == DEPUTY_EXTRUDER_ID);
|
||||
REQUIRE(ams_list.at("2")->GetExtruderId() == MAIN_EXTRUDER_ID);
|
||||
|
||||
for (const char* id : {"0", "1", "2"}) {
|
||||
DevAmsTray* tray = obj.GetFilaSystem()->GetAmsTray(id, "0");
|
||||
REQUIRE(tray != nullptr);
|
||||
tray->m_fila_type = "PLA";
|
||||
}
|
||||
|
||||
// A left-only request must exclude the MAIN-bound AMSes: the red filament exactly
|
||||
// matches AMS 0's red tray, so landing anywhere but AMS 1 (or unmapped) means the
|
||||
// exclusion is broken.
|
||||
FilamentInfo fila;
|
||||
fila.id = 0;
|
||||
fila.type = "PLA";
|
||||
fila.color = "FF0000FF";
|
||||
|
||||
std::vector<FilamentInfo> result;
|
||||
std::vector<bool> map_opt(4, false);
|
||||
map_opt[MappingOption::USE_LEFT_AMS] = true;
|
||||
DevMappingUtil::ams_filament_mapping(&obj, {fila}, result, map_opt, {}, false);
|
||||
REQUIRE(result.size() == 1);
|
||||
CHECK(result[0].ams_id != "0");
|
||||
CHECK(result[0].ams_id != "2");
|
||||
|
||||
// The mirrored right-only request maps to the exact-match MAIN-bound AMS.
|
||||
result.clear();
|
||||
map_opt[MappingOption::USE_LEFT_AMS] = false;
|
||||
map_opt[MappingOption::USE_RIGHT_AMS] = true;
|
||||
DevMappingUtil::ams_filament_mapping(&obj, {fila}, result, map_opt, {}, false);
|
||||
REQUIRE(result.size() == 1);
|
||||
CHECK(result[0].ams_id == "0");
|
||||
}
|
||||
|
||||
TEST_CASE("Switch-bound AMS with an invalid track is excluded from mapping", "[DevMapping]")
|
||||
{
|
||||
MachineObject obj(nullptr, nullptr, "test", "test_dev", "127.0.0.1");
|
||||
obj.GetFilaSwitch()->ParseFilaSwitchInfo(json::parse(R"({"aux":"20000000"})"));
|
||||
REQUIRE(obj.GetFilaSwitch()->IsInstalled());
|
||||
|
||||
// info bits 24-27 = 0xF: switch-bound (0xE) but the input track is not yet valid -
|
||||
// the transient while the device is still homing the switch. The AMS must survive
|
||||
// (display keeps working) with an EMPTY binding set that excludes it from mapping.
|
||||
json print_push = json::parse(R"({
|
||||
"ams": {
|
||||
"tray_exist_bits": "1",
|
||||
"ams": [ { "id": "0", "info": "0F000E01", "tray": [ { "id": "0", "tray_color": "FF0000FF" } ] } ]
|
||||
}
|
||||
})");
|
||||
DevFilaSystemParser::ParseV1_0(print_push, &obj, obj.GetFilaSystem().get(), false);
|
||||
|
||||
const auto& ams_list = obj.GetFilaSystem()->GetAmsList();
|
||||
REQUIRE(ams_list.count("0") == 1);
|
||||
REQUIRE(ams_list.at("0")->GetBindedExtruderSet().empty());
|
||||
REQUIRE_FALSE(ams_list.at("0")->GetSwitcherPos().has_value());
|
||||
REQUIRE_FALSE(obj.GetFilaSwitch()->IsReady());
|
||||
|
||||
DevAmsTray* tray = obj.GetFilaSystem()->GetAmsTray("0", "0");
|
||||
REQUIRE(tray != nullptr);
|
||||
tray->m_fila_type = "PLA";
|
||||
|
||||
FilamentInfo fila;
|
||||
fila.id = 0;
|
||||
fila.type = "PLA";
|
||||
fila.color = "FF0000FF";
|
||||
|
||||
std::vector<FilamentInfo> result;
|
||||
std::vector<bool> map_opt(4, false);
|
||||
map_opt[MappingOption::USE_LEFT_AMS] = true;
|
||||
map_opt[MappingOption::USE_RIGHT_AMS] = true;
|
||||
DevMappingUtil::ams_filament_mapping(&obj, {fila}, result, map_opt, {}, false);
|
||||
REQUIRE(result.size() == 1);
|
||||
CHECK(result[0].tray_id == -1);
|
||||
|
||||
// Without the switch, the same 0xE AMS is dropped from the list entirely.
|
||||
MachineObject obj_no_switch(nullptr, nullptr, "test", "test_dev", "127.0.0.1");
|
||||
REQUIRE_FALSE(obj_no_switch.GetFilaSwitch()->IsInstalled());
|
||||
DevFilaSystemParser::ParseV1_0(print_push, &obj_no_switch, obj_no_switch.GetFilaSystem().get(), false);
|
||||
REQUIRE(obj_no_switch.GetFilaSystem()->GetAmsList().count("0") == 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user