mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-18 13:10:54 +00:00
The Bambu payload rewrite only matched tray_info_idx, filament_id and filamentId. The H2C nozzle rack carries filament ids under cate (the auto nozzle mapping request) and fila_id (the rack status), so the printer got Orca's OF ids for the filaments and its own ids back for the nozzles in the same request, and the device tab could not name a rack nozzle's filament. Add both keys to one shared list used by the rewrite and its pre-check.
105 lines
5.2 KiB
C++
105 lines
5.2 KiB
C++
#include <catch2/catch_all.hpp>
|
|
#include <boost/filesystem.hpp>
|
|
#include <boost/nowide/fstream.hpp>
|
|
#include <nlohmann/json.hpp>
|
|
#include <string>
|
|
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include "libslic3r/Utils.hpp"
|
|
#include "slic3r/Utils/BBLPrinterAgent.hpp"
|
|
#include "slic3r/Utils/OrcaPrinterAgent.hpp"
|
|
|
|
using json = nlohmann::json;
|
|
using namespace Slic3r;
|
|
|
|
namespace {
|
|
|
|
// Point resources_dir() at the repo's own tree for the lifetime of a test and restore it
|
|
// afterwards, mirroring ScopedResourcesDir (which only ever makes a throwaway directory).
|
|
// PROFILES_DIR is <repo>/resources/profiles; the map lives in <repo>/resources/printers.
|
|
struct ScopedRepoResourcesDir
|
|
{
|
|
std::string previous{resources_dir()};
|
|
|
|
ScopedRepoResourcesDir() { set_resources_dir(boost::filesystem::path(PROFILES_DIR).parent_path().string()); }
|
|
~ScopedRepoResourcesDir() { set_resources_dir(previous); }
|
|
|
|
ScopedRepoResourcesDir(const ScopedRepoResourcesDir&) = delete;
|
|
ScopedRepoResourcesDir& operator=(const ScopedRepoResourcesDir&) = delete;
|
|
};
|
|
|
|
std::string orca_id_of(const std::string& bambu_id)
|
|
{
|
|
boost::nowide::ifstream file(resources_dir() + "/printers/bambu_filament_ids.json");
|
|
json doc;
|
|
file >> doc;
|
|
for (const auto& [orca_id, row] : doc["filaments"].items())
|
|
if (row["bambu_id"] == bambu_id)
|
|
return orca_id;
|
|
FAIL("no map row for " << bambu_id);
|
|
return {};
|
|
}
|
|
|
|
} // namespace
|
|
|
|
TEST_CASE("Bambu filament id map is one-to-one and leaves unmapped ids alone", "[BambuFilamentIds]")
|
|
{
|
|
const ScopedRepoResourcesDir repo_resources;
|
|
const BBLPrinterAgent bbl;
|
|
const std::string abs = orca_id_of("GFB00"); // Bambu ABS
|
|
REQUIRE(abs.rfind("OF", 0) == 0);
|
|
CHECK(bbl.from_orca_filament_id(abs) == "GFB00");
|
|
CHECK(bbl.to_orca_filament_id("GFB00") == abs);
|
|
CHECK(bbl.from_orca_filament_id("OFnotarow") == "OFnotarow");
|
|
CHECK(bbl.to_orca_filament_id("GFZZ99") == "GFZZ99"); // Bambu id we do not ship
|
|
CHECK(bbl.to_orca_filament_id("P1234567") == "P1234567"); // user root
|
|
CHECK(bbl.from_orca_filament_id("") == "");
|
|
|
|
// An agent whose printers already speak our ids inherits IPrinterAgent's identity default.
|
|
const OrcaPrinterAgent other{""};
|
|
CHECK(other.from_orca_filament_id(abs) == abs);
|
|
CHECK(other.to_orca_filament_id("GFB00") == "GFB00");
|
|
}
|
|
|
|
TEST_CASE("Payload rewrite covers nested trays, calibration lists and mapping info", "[BambuFilamentIds]")
|
|
{
|
|
const ScopedRepoResourcesDir repo_resources;
|
|
const std::string abs = orca_id_of("GFB00"), pla = orca_id_of("GFA00");
|
|
const std::string status =
|
|
R"({"print":{"ams":{"ams":[{"tray":[{"tray_info_idx":"GFB00"},{"tray_info_idx":"GFZZ99"}]}]},)"
|
|
R"("vt_tray":{"tray_info_idx":"GFA00"},"filaments":[{"filament_id":"GFA00","setting_id":"GFB00"}]}})";
|
|
json inbound = json::parse(BBLPrinterAgent::to_orca_payload(status));
|
|
CHECK(inbound["print"]["ams"]["ams"][0]["tray"][0]["tray_info_idx"] == abs);
|
|
CHECK(inbound["print"]["ams"]["ams"][0]["tray"][1]["tray_info_idx"] == "GFZZ99"); // no row: untouched
|
|
CHECK(inbound["print"]["vt_tray"]["tray_info_idx"] == pla);
|
|
CHECK(inbound["print"]["filaments"][0]["filament_id"] == pla);
|
|
CHECK(inbound["print"]["filaments"][0]["setting_id"] == "GFB00"); // not an id key: has a map row but must stay put
|
|
CHECK(json::parse(BBLPrinterAgent::from_orca_payload(inbound.dump())) == json::parse(status)); // round trip
|
|
|
|
const std::string mapping = R"([{"ams":0,"filamentId":")" + abs + R"(","filamentType":"ABS"}])";
|
|
CHECK(BBLPrinterAgent::from_orca_payload(mapping) == R"([{"ams":0,"filamentId":"GFB00","filamentType":"ABS"}])");
|
|
CHECK(BBLPrinterAgent::from_orca_payload("not json") == "not json");
|
|
CHECK(BBLPrinterAgent::from_orca_payload(R"({"print":{"command":"pushall"}})") == R"({"print":{"command":"pushall"}})");
|
|
}
|
|
|
|
TEST_CASE("Payload rewrite covers the nozzle rack status and the auto nozzle mapping request", "[BambuFilamentIds]")
|
|
{
|
|
const ScopedRepoResourcesDir repo_resources;
|
|
const std::string petg_hf = orca_id_of("GFG96");
|
|
|
|
const std::string rack_status =
|
|
R"({"print":{"device":{"nozzle":{"info":[{"id":16,"fila_id":"GFG96","color_m":"FFFFFFFF"},{"id":17,"fila_id":"P22f54c9"}]}}}})";
|
|
json inbound = json::parse(BBLPrinterAgent::to_orca_payload(rack_status));
|
|
CHECK(inbound["print"]["device"]["nozzle"]["info"][0]["fila_id"] == petg_hf);
|
|
CHECK(inbound["print"]["device"]["nozzle"]["info"][1]["fila_id"] == "P22f54c9"); // user id: untouched
|
|
|
|
const std::string request = R"({"print":{"command":"get_auto_nozzle_mapping","ams_mapping":[65535,65024],)"
|
|
R"("fila_info":[{"id":2,"cate":")" + petg_hf + R"(","color":"FFFFFFFF"}],)"
|
|
R"("nozzle_info":[{"pos":16,"cate":")" + petg_hf + R"(","color":"FFFFFFFF"},{"pos":1,"cate":""}]}})";
|
|
json outbound = json::parse(BBLPrinterAgent::from_orca_payload(request));
|
|
CHECK(outbound["print"]["fila_info"][0]["cate"] == "GFG96");
|
|
CHECK(outbound["print"]["nozzle_info"][0]["cate"] == "GFG96");
|
|
CHECK(outbound["print"]["nozzle_info"][1]["cate"] == ""); // empty nozzle
|
|
CHECK(outbound["print"]["ams_mapping"] == json::parse("[65535,65024]"));
|
|
}
|