diff --git a/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc b/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc index de0955320..1c4803031 100644 --- a/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc +++ b/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc @@ -2,7 +2,7 @@ RteTest_DFP - RTE test of DFP pack, extraction from ARM.CMSIS + RTE test of DFP pack, extraction from ARM.CMSIS ARM Doc/license.txt http://www.keil.com/pack/ diff --git a/test/packs/ARM/RteTest_DFP/0.2.0/Doc/overview.md b/test/packs/ARM/RteTest_DFP/0.2.0/Doc/overview.md new file mode 100644 index 000000000..7ec8abc95 --- /dev/null +++ b/test/packs/ARM/RteTest_DFP/0.2.0/Doc/overview.md @@ -0,0 +1,5 @@ +# Introduction + +This pack contains: + +Test components and device descriptions diff --git a/tools/projmgr/CMakeLists.txt b/tools/projmgr/CMakeLists.txt index 2a68fc87d..905558662 100644 --- a/tools/projmgr/CMakeLists.txt +++ b/tools/projmgr/CMakeLists.txt @@ -24,8 +24,8 @@ include(FetchContent) FetchContent_Declare( rpc-interface DOWNLOAD_EXTRACT_TIMESTAMP ON - URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.7/csolution-rpc.zip - URL_HASH SHA256=ad004d41e10862eb5b153b509a0e3edde09d0cb69595c96c908bf1f5ab1e65f8 + URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.8/csolution-rpc.zip + URL_HASH SHA256=e347a98b6130c64d942d360ad31ca49899f3bf3113d40d9c460d6cd8f4c07b11 ) FetchContent_MakeAvailable(rpc-interface) diff --git a/tools/projmgr/include/ProjMgrRpcServerData.h b/tools/projmgr/include/ProjMgrRpcServerData.h index d0b19bc3b..eafc304a9 100644 --- a/tools/projmgr/include/ProjMgrRpcServerData.h +++ b/tools/projmgr/include/ProjMgrRpcServerData.h @@ -23,6 +23,7 @@ class RteComponentInstance; class RteComponentAggregate; class RteComponentGroup; class RteDevice; +class RteDeviceItem; class RteBoard; class RteItem; class RteModel; @@ -43,7 +44,7 @@ class RpcDataCollector { void CollectBoardList(RpcArgs::BoardList& boardList, const std::string& namePattern, const std::string& vendor) const; void CollectBoardInfo(RpcArgs::BoardInfo& boardInfo, const std::string& id) const; - RpcArgs::Device FromRteDevice(RteDevice* rteDevice, bool bIncludeProperties) const; + RpcArgs::Device FromRteDevice(RteDeviceItem* rteDevice, bool bIncludeProperties) const; RpcArgs::Board FromRteBoard(RteBoard* rteBoard, bool bIncludeProperties) const; RpcArgs::Component FromRteComponent(const RteComponent* rteComponent) const; diff --git a/tools/projmgr/src/ProjMgrRpcServer.cpp b/tools/projmgr/src/ProjMgrRpcServer.cpp index 2d62cccda..a696a7bb9 100644 --- a/tools/projmgr/src/ProjMgrRpcServer.cpp +++ b/tools/projmgr/src/ProjMgrRpcServer.cpp @@ -83,6 +83,7 @@ class RpcHandler : public RpcMethods { RpcArgs::SuccessResult Resolve(const string& context) override; RpcArgs::SuccessResult LoadPacks(void) override; RpcArgs::SuccessResult LoadSolution(const string& solution, const string& activeTarget) override; + RpcArgs::ContextInfo GetContextInfo(const string& context) override; RpcArgs::UsedItems GetUsedItems(const string& context) override; RpcArgs::PacksInfo GetPacksInfo(const string& context, const bool& all) override; RpcArgs::SuccessResult SelectPack(const string& context, const RpcArgs::PackReference& pack) override; @@ -361,13 +362,39 @@ RpcArgs::SuccessResult RpcHandler::SelectPack(const string& context, const RpcAr return result; } +RpcArgs::ContextInfo RpcHandler::GetContextInfo(const string& context) { + RpcArgs::ContextInfo contextInfo; + RpcDataCollector dc(GetActiveTarget(context)); + contextInfo.success = true; + dc.CollectUsedComponents(contextInfo.components); + // get all references, even if they are not selected , because it is useful for client to remove them from files + contextInfo.packs = GetPackReferences(context); + + auto& contextItem = GetContext(context); + contextInfo.variables = contextItem.variables; + contextInfo.attributes = contextItem.targetAttributes; + contextInfo.pname = contextItem.deviceItem.pname; + + if(contextItem.rteDevice) { + contextInfo.device = dc.FromRteDevice(contextItem.rteDevice, true); + } else { + contextInfo.device.id = contextItem.device; + contextInfo.success = false; + contextInfo.message = "No device is found"; + } + if(contextItem.rteBoard) { + contextInfo.board = dc.FromRteBoard(contextItem.rteBoard, true); + } + return contextInfo; +} + RpcArgs::UsedItems RpcHandler::GetUsedItems(const string& context) { RpcArgs::UsedItems usedItems; - usedItems.success = true; RpcDataCollector dc(GetActiveTarget(context)); dc.CollectUsedComponents(usedItems.components); // get all references, even if they are not selected , because it is useful for client to remove them from files usedItems.packs = GetPackReferences(context); + usedItems.success = true; return usedItems; } @@ -383,6 +410,7 @@ PackReferenceVector RpcHandler::CollectPackReferences(const string& context) { auto contextItem = GetContext(context); for(const auto& packItem : contextItem.packRequirements) { const auto packId = RtePackage::ComposePackageID(packItem.pack.vendor, packItem.pack.name, packItem.pack.version); + RpcArgs::PackReference packRef; packRef.pack = packItem.selectedBy; packRef.resolvedPack = packId; diff --git a/tools/projmgr/src/ProjMgrRpcServerData.cpp b/tools/projmgr/src/ProjMgrRpcServerData.cpp index 1dc56ba7e..0d7bfdb95 100644 --- a/tools/projmgr/src/ProjMgrRpcServerData.cpp +++ b/tools/projmgr/src/ProjMgrRpcServerData.cpp @@ -155,7 +155,7 @@ std::set RpcDataCollector::GetUsedPacks() const { return key_set(usedPacks); } -RpcArgs::Device RpcDataCollector::FromRteDevice( RteDevice* rteDevice, bool bIncludeProperties) const { +RpcArgs::Device RpcDataCollector::FromRteDevice( RteDeviceItem* rteDevice, bool bIncludeProperties) const { RpcArgs::Device d; d.id = rteDevice->GetVendorName() + RteConstants::SUFFIX_CVENDOR + rteDevice->GetName(); d.family = rteDevice->GetEffectiveAttribute("Dfamily"); diff --git a/tools/projmgr/test/src/ProjMgrRpcTests.cpp b/tools/projmgr/test/src/ProjMgrRpcTests.cpp index 118036ee6..54eaa9c22 100644 --- a/tools/projmgr/test/src/ProjMgrRpcTests.cpp +++ b/tools/projmgr/test/src/ProjMgrRpcTests.cpp @@ -695,6 +695,172 @@ TEST_F(ProjMgrRpcTests, RpcSelectBundle) { EXPECT_EQ(responses[6]["error"]["message"], "UnknownCclass: component class not found"); } +TEST_F(ProjMgrRpcTests, RpcGetContextInfoSingleCoreDevice) { + string context = "project+CM0"; + vector contextList = { + context + }; + + auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "CM0", contextList); + requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }})); + + const auto& responses = RunRpcMethods(requests); + + EXPECT_TRUE(responses[2]["result"]["success"]); + auto components = responses[2]["result"]["components"]; + auto packs = responses[2]["result"]["packs"]; + EXPECT_EQ(packs.size(), 2); + EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP"); + EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup"); + EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3"); + + map vars = responses[2]["result"]["variables"]; + EXPECT_EQ(vars["BuildType"], ""); + EXPECT_EQ(vars["Compiler"], "AC6"); + EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0"); + EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/"); + EXPECT_EQ(vars["Pname"], ""); + EXPECT_EQ(vars["Project"], "project"); + EXPECT_EQ(vars["Solution"], "solution"); + EXPECT_EQ(vars["TargetType"], "CM0"); + + EXPECT_FALSE(responses[2]["result"].contains("board")); + EXPECT_EQ(responses[2]["result"]["pname"], ""); + + auto d0 = responses[2]["result"]["device"]; + EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0"); + EXPECT_EQ(d0["family"], "RteTest ARM Cortex M"); + EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0"); + EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(d0["processors"].size(), 1); + EXPECT_EQ(d0["processors"][0]["name"], ""); + EXPECT_EQ(d0["memories"].size(), 2); + EXPECT_TRUE(d0.contains("description")); + + map attrs = responses[2]["result"]["attributes"]; + EXPECT_EQ(attrs["Tcompiler"], "ARMCC"); + EXPECT_EQ(attrs["Toptions"], "AC6"); + EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0"); + EXPECT_EQ(attrs["Dcore"], "Cortex-M0"); + EXPECT_EQ(attrs["Dfpu"], "NO_FPU"); + EXPECT_EQ(attrs["Pname"], ""); +} + +TEST_F(ProjMgrRpcTests, RpcGetContextInfoMultiCoreDevice) { + string context = "project+CM0_Dual"; + vector contextList = { + context + }; + + auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "CM0_Dual", contextList); + requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }})); + + const auto& responses = RunRpcMethods(requests); + + EXPECT_TRUE(responses[2]["result"]["success"]); + auto components = responses[2]["result"]["components"]; + auto packs = responses[2]["result"]["packs"]; + EXPECT_EQ(packs.size(), 2); + EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP"); + EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup"); + EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3"); + + map vars = responses[2]["result"]["variables"]; + EXPECT_EQ(vars["BuildType"], ""); + EXPECT_EQ(vars["Compiler"], "AC6"); + EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0_Dual"); + EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/"); + EXPECT_EQ(vars["Pname"], "cm0_core0"); + EXPECT_EQ(vars["Project"], "project"); + EXPECT_EQ(vars["Solution"], "solution"); + EXPECT_EQ(vars["TargetType"], "CM0_Dual"); + + EXPECT_FALSE(responses[2]["result"].contains("board")); + EXPECT_EQ(responses[2]["result"]["pname"], "cm0_core0"); + + auto d0 = responses[2]["result"]["device"]; + EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0_Dual"); + EXPECT_EQ(d0["family"], "RteTest ARM Cortex M"); + EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0"); + EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(d0["processors"].size(), 2); + EXPECT_EQ(d0["processors"][0]["name"], "cm0_core0"); + EXPECT_EQ(d0["memories"].size(), 4); + EXPECT_TRUE(d0.contains("description")); + + map attrs = responses[2]["result"]["attributes"]; + EXPECT_EQ(attrs["Tcompiler"], "ARMCC"); + EXPECT_EQ(attrs["Toptions"], "AC6"); + EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0_Dual"); + EXPECT_EQ(attrs["Dcore"], "Cortex-M0"); + EXPECT_EQ(attrs["Dfpu"], "NO_FPU"); + EXPECT_EQ(attrs["Pname"], "cm0_core0"); +} + + +TEST_F(ProjMgrRpcTests, RpcGetContextInfoBoard) { + string context = "project+TestBoard"; + vector contextList = { + context + }; + + auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "TestBoard", contextList); + requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }})); + + const auto& responses = RunRpcMethods(requests); + + EXPECT_TRUE(responses[2]["result"]["success"]); + auto components = responses[2]["result"]["components"]; + auto packs = responses[2]["result"]["packs"]; + EXPECT_EQ(packs.size(), 2); + EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP"); + EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup"); + EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3"); + + map vars = responses[2]["result"]["variables"]; + EXPECT_EQ(vars["BuildType"], ""); + EXPECT_EQ(vars["Compiler"], "AC6"); + EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0_Dual"); + EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/"); + EXPECT_EQ(vars["Pname"], "cm0_core0"); + EXPECT_EQ(vars["Project"], "project"); + EXPECT_EQ(vars["Solution"], "solution"); + EXPECT_EQ(vars["TargetType"], "TestBoard"); + + EXPECT_EQ(responses[2]["result"]["pname"], "cm0_core0"); + auto d0 = responses[2]["result"]["device"]; + EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0_Dual"); + EXPECT_EQ(d0["family"], "RteTest ARM Cortex M"); + EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0"); + EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(d0["processors"].size(), 2); + EXPECT_EQ(d0["processors"][0]["name"], "cm0_core0"); + EXPECT_EQ(d0["memories"].size(), 4); + EXPECT_TRUE(d0.contains("description")); + + auto b1 = responses[2]["result"]["board"]; + EXPECT_EQ(b1["id"], "Keil::RteTest Dummy board:1.2.3"); + EXPECT_EQ(b1["pack"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(b1["description"], "uVision Simulator"); + auto devices = b1["devices"]; + EXPECT_EQ(devices.size(), 1); + EXPECT_FALSE(b1.contains("memories")); + auto d1 = devices[0]; + EXPECT_EQ(d1["id"], "ARM::RteTest_ARMCM0_Dual"); + EXPECT_EQ(d1["processors"].size(), 2); + EXPECT_EQ(d1["processors"][0]["name"], "cm0_core0"); + + map attrs = responses[2]["result"]["attributes"]; + EXPECT_EQ(attrs["Tcompiler"], "ARMCC"); + EXPECT_EQ(attrs["Toptions"], "AC6"); + EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0_Dual"); + EXPECT_EQ(attrs["Dcore"], "Cortex-M0"); + EXPECT_EQ(attrs["Dfpu"], "NO_FPU"); + EXPECT_EQ(attrs["Pname"], "cm0_core0"); +} TEST_F(ProjMgrRpcTests, RpcGetUsedItems) { string context = "selectable+CM0"; @@ -779,6 +945,8 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoSimple) { auto& pack = packInfos[1]; EXPECT_EQ(pack["id"], "ARM::RteTest_DFP@0.2.0"); + EXPECT_EQ(pack["doc"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/Doc/overview.md"); + auto& refs = pack["references"]; EXPECT_EQ(refs.size(), 1);