Skip to content
Snippets Groups Projects
Commit db4e9563 authored by Tim Übelhör's avatar Tim Übelhör
Browse files

Grpc now with generated files from the vcpkg.

The waitable_queue is unit tested.
parent 194e2c45
Branches
Tags
No related merge requests found
Showing
with 170 additions and 151 deletions
...@@ -63,9 +63,8 @@ ...@@ -63,9 +63,8 @@
<ImportGroup Label="Shared"> <ImportGroup Label="Shared">
<Import Project="..\Simulation\Simulation.vcxitems" Label="Shared" /> <Import Project="..\Simulation\Simulation.vcxitems" Label="Shared" />
<Import Project="..\Files\Files.vcxitems" Label="Shared" /> <Import Project="..\Files\Files.vcxitems" Label="Shared" />
<Import Project="..\Main\Main.vcxitems" Label="Shared" />
<Import Project="..\FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems" Label="Shared" /> <Import Project="..\FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems" Label="Shared" />
<Import Project="..\Network\Network.vcxitems" Label="Shared" /> <Import Project="..\UtilityClasses\UtilityClasses.vcxitems" Label="Shared" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
...@@ -99,17 +98,17 @@ ...@@ -99,17 +98,17 @@
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;C:\boost_1_65_1;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths> <UseFullPaths>true</UseFullPaths>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB -D_WIN32_WINNT=0x0A00 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>C:\boost_1_65_1\stage\lib;$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>C:\boost_1_65_1\stage\lib;$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
...@@ -117,13 +116,15 @@ ...@@ -117,13 +116,15 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;C:\boost_1_65_1;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths> <UseFullPaths>true</UseFullPaths>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB -D_WIN32_WINNT=0x0A00 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
...@@ -131,15 +132,15 @@ ...@@ -131,15 +132,15 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;C:\boost_1_65_1;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths> <UseFullPaths>true</UseFullPaths>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB -D_WIN32_WINNT=0x0A00 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<AdditionalLibraryDirectories>C:\boost_1_65_1\stage\lib;$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>C:\boost_1_65_1\stage\lib;$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
...@@ -149,15 +150,17 @@ ...@@ -149,15 +150,17 @@
<Optimization>MaxSpeed</Optimization> <Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;C:\boost_1_65_1;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths> <UseFullPaths>true</UseFullPaths>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB -D_WIN32_WINNT=0x0A00 %(AdditionalOptions)</AdditionalOptions>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
...@@ -174,6 +177,7 @@ ...@@ -174,6 +177,7 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile> </ClCompile>
<ClCompile Include="SimulatorTest.cpp" /> <ClCompile Include="SimulatorTest.cpp" />
<ClCompile Include="WaitableQueueTest.cpp" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
... ...
......
...@@ -35,5 +35,8 @@ ...@@ -35,5 +35,8 @@
<ClCompile Include="EngineObserver.cpp"> <ClCompile Include="EngineObserver.cpp">
<Filter>Quelldateien</Filter> <Filter>Quelldateien</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="WaitableQueueTest.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
...@@ -15,7 +15,7 @@ namespace BackendTests ...@@ -15,7 +15,7 @@ namespace BackendTests
TEST_METHOD(TestFmuEngine) TEST_METHOD(TestFmuEngine)
{ {
// Basic setup // Basic setup
FmuEngine fmuEngine("TestID"); Simulation fmuEngine("TestID");
auto observer = std::make_shared<EngineObserver>(); auto observer = std::make_shared<EngineObserver>();
// Add & remove observer // Add & remove observer
fmuEngine.AddObserver(observer); fmuEngine.AddObserver(observer);
... ...
......
#include "stdafx.h"
#include "CppUnitTest.h"
#include "WaitableQueue.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace BackendTests
{
TEST_CLASS(WaitableQueueTest)
{
private:
Utility::WaitableQueue<int> _queue;
public:
TEST_METHOD_INITIALIZE(TestWaitableQueueInitialize)
{
// Boost none is expected
Assert::IsTrue(!_queue.pop());
}
void produce(int n)
{
for (int i = 0; i < n; i++)
{
_queue.push(i);
}
}
void consume(int n)
{
for (int i = 0; i < n; i++)
{
Assert::AreEqual(i, _queue.wait_and_pop());
}
}
TEST_METHOD(TestWaitableQueuePush_n_Pop)
{
const int COUNT = 10000;
// Produce one more than consuming
std::thread consumer(std::bind(&WaitableQueueTest::consume, this, COUNT));
std::thread producer(std::bind(&WaitableQueueTest::produce, this, COUNT + 1));
// Wait for the threads
producer.join();
consumer.join();
// One more availabe to test regular pop
Assert::AreEqual(COUNT, _queue.pop().get());
// Nothing available
Assert::IsTrue(!_queue.pop());
}
};
}
\ No newline at end of file
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
<ProjectCapability Include="SourceItemsFromImports" /> <ProjectCapability Include="SourceItemsFromImports" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="$(MSBuildThisFileDirectory)..\ModeliProtocol\ModeliRpc_Cpp\ModeliRpc.grpc.pb.cc" /> <ClInclude Include="$(MSBuildThisFileDirectory)ModeliRpc.grpc.pb.h" />
<ClCompile Include="$(MSBuildThisFileDirectory)..\ModeliProtocol\ModeliRpc_Cpp\ModeliRpc.pb.cc" /> <ClInclude Include="$(MSBuildThisFileDirectory)ModeliRpc.pb.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(MSBuildThisFileDirectory)..\ModeliProtocol\ModeliRpc_Cpp\ModeliRpc.grpc.pb.h" /> <ClCompile Include="$(MSBuildThisFileDirectory)ModeliRpc.grpc.pb.cc" />
<ClInclude Include="$(MSBuildThisFileDirectory)..\ModeliProtocol\ModeliRpc_Cpp\ModeliRpc.pb.h" /> <ClCompile Include="$(MSBuildThisFileDirectory)ModeliRpc.pb.cc" />
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
File moved
File moved
File moved
File moved
...@@ -22,30 +22,36 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BackendTests", "BackendTest ...@@ -22,30 +22,36 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BackendTests", "BackendTest
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CreatedGrpc", "CreatedGrpc\CreatedGrpc.vcxitems", "{9C78546C-04B5-45BB-99C4-9FFBAF846BFE}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CreatedGrpc", "CreatedGrpc\CreatedGrpc.vcxitems", "{9C78546C-04B5-45BB-99C4-9FFBAF846BFE}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Utility", "UtilityClasses\UtilityClasses.vcxitems", "{FD95EBAC-8E33-43D3-88BA-04A2B02D7D9E}"
EndProject
Global Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution GlobalSection(SharedMSBuildProjectFiles) = preSolution
Network\Network.vcxitems*{059b87b7-3153-4b08-b4db-12f671328ebb}*SharedItemsImports = 9 Network\Network.vcxitems*{059b87b7-3153-4b08-b4db-12f671328ebb}*SharedItemsImports = 9
Files\Files.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4 Files\Files.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4
FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4 FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4
Main\Main.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4
Network\Network.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4
Simulation\Simulation.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4 Simulation\Simulation.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4
UtilityClasses\UtilityClasses.vcxitems*{500f1104-28c6-4be4-a180-8028843972ac}*SharedItemsImports = 4
Files\Files.vcxitems*{600c8d4e-39a2-40dd-b779-ac823cd2f5cc}*SharedItemsImports = 9 Files\Files.vcxitems*{600c8d4e-39a2-40dd-b779-ac823cd2f5cc}*SharedItemsImports = 9
CreatedGrpc\CreatedGrpc.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
Files\Files.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4 Files\Files.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4 FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
Main\Main.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4 Main\Main.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
Network\Network.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4 Network\Network.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
Simulation\Simulation.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4 Simulation\Simulation.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
UtilityClasses\UtilityClasses.vcxitems*{661905ce-1efd-4d2b-8cc8-0a8bafb5242f}*SharedItemsImports = 4
Simulation\Simulation.vcxitems*{8510328c-8540-419b-96d9-1e5ff396366f}*SharedItemsImports = 9 Simulation\Simulation.vcxitems*{8510328c-8540-419b-96d9-1e5ff396366f}*SharedItemsImports = 9
CreatedGrpc\CreatedGrpc.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
Files\Files.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4 Files\Files.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4 FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
Main\Main.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4 Main\Main.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
Network\Network.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4 Network\Network.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
Simulation\Simulation.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4 Simulation\Simulation.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
UtilityClasses\UtilityClasses.vcxitems*{87f7a408-7c05-47a8-a1d7-4a53ca350666}*SharedItemsImports = 4
CreatedGrpc\CreatedGrpc.vcxitems*{9c78546c-04b5-45bb-99c4-9ffbaf846bfe}*SharedItemsImports = 9 CreatedGrpc\CreatedGrpc.vcxitems*{9c78546c-04b5-45bb-99c4-9ffbaf846bfe}*SharedItemsImports = 9
FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{b23eb13a-9d85-4f36-8327-543fa7b6a01e}*SharedItemsImports = 9 FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{b23eb13a-9d85-4f36-8327-543fa7b6a01e}*SharedItemsImports = 9
Main\Main.vcxitems*{de14bb19-25d6-4ec9-8878-d5fc8ec737bb}*SharedItemsImports = 9 Main\Main.vcxitems*{de14bb19-25d6-4ec9-8878-d5fc8ec737bb}*SharedItemsImports = 9
FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{f31eeb13-5399-4e96-af1f-b0bcf3119b5f}*SharedItemsImports = 4 FMU-Core\NativeFmuShared\NativeFmuShared.vcxitems*{f31eeb13-5399-4e96-af1f-b0bcf3119b5f}*SharedItemsImports = 4
UtilityClasses\UtilityClasses.vcxitems*{fd95ebac-8e33-43d3-88ba-04a2b02d7d9e}*SharedItemsImports = 9
EndGlobalSection EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM Debug|ARM = Debug|ARM
... ...
......
...@@ -69,6 +69,8 @@ ...@@ -69,6 +69,8 @@
<Import Project="..\Network\Network.vcxitems" Label="Shared" /> <Import Project="..\Network\Network.vcxitems" Label="Shared" />
<Import Project="..\Simulation\Simulation.vcxitems" Label="Shared" /> <Import Project="..\Simulation\Simulation.vcxitems" Label="Shared" />
<Import Project="..\Main\Main.vcxitems" Label="Shared" /> <Import Project="..\Main\Main.vcxitems" Label="Shared" />
<Import Project="..\UtilityClasses\UtilityClasses.vcxitems" Label="Shared" />
<Import Project="..\CreatedGrpc\CreatedGrpc.vcxitems" Label="Shared" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" /> <ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
...@@ -105,7 +107,7 @@ ...@@ -105,7 +107,7 @@
<SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath> <SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath>
</Link> </Link>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation;../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation</AdditionalIncludeDirectories>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB </AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB </AdditionalOptions>
<CppLanguageStandard>c++1y</CppLanguageStandard> <CppLanguageStandard>c++1y</CppLanguageStandard>
</ClCompile> </ClCompile>
...@@ -119,7 +121,7 @@ ...@@ -119,7 +121,7 @@
<SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath> <SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath>
</Link> </Link>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation;../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation</AdditionalIncludeDirectories>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB </AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB </AdditionalOptions>
<CppLanguageStandard>c++1y</CppLanguageStandard> <CppLanguageStandard>c++1y</CppLanguageStandard>
</ClCompile> </ClCompile>
...@@ -133,7 +135,7 @@ ...@@ -133,7 +135,7 @@
<SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath> <SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath>
</Link> </Link>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation;../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation</AdditionalIncludeDirectories>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions>
<CppLanguageStandard>c++1y</CppLanguageStandard> <CppLanguageStandard>c++1y</CppLanguageStandard>
</ClCompile> </ClCompile>
...@@ -151,7 +153,7 @@ ...@@ -151,7 +153,7 @@
<SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath> <SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath>
</Link> </Link>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation;../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation</AdditionalIncludeDirectories>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions>
<CppLanguageStandard>c++1y</CppLanguageStandard> <CppLanguageStandard>c++1y</CppLanguageStandard>
</ClCompile> </ClCompile>
...@@ -169,7 +171,7 @@ ...@@ -169,7 +171,7 @@
<SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath> <SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath>
</Link> </Link>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation;../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation</AdditionalIncludeDirectories>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions>
<CppLanguageStandard>c++1y</CppLanguageStandard> <CppLanguageStandard>c++1y</CppLanguageStandard>
</ClCompile> </ClCompile>
...@@ -183,7 +185,7 @@ ...@@ -183,7 +185,7 @@
<SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath> <SharedLibrarySearchPath>%(SharedLibrarySearchPath)</SharedLibrarySearchPath>
</Link> </Link>
<ClCompile> <ClCompile>
<AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation;../AdditionalIncludes/flatbuffers;../AdditionalIncludes/MC_Protocol;</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>../FMU-Core/NativeFmuShared;../Network;../Files;../Simulation</AdditionalIncludeDirectories>
<AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions> <AdditionalOptions>-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB</AdditionalOptions>
<CppLanguageStandard>c++1y</CppLanguageStandard> <CppLanguageStandard>c++1y</CppLanguageStandard>
</ClCompile> </ClCompile>
... ...
......
...@@ -61,6 +61,8 @@ ...@@ -61,6 +61,8 @@
<Import Project="..\Network\Network.vcxitems" Label="Shared" /> <Import Project="..\Network\Network.vcxitems" Label="Shared" />
<Import Project="..\Simulation\Simulation.vcxitems" Label="Shared" /> <Import Project="..\Simulation\Simulation.vcxitems" Label="Shared" />
<Import Project="..\Main\Main.vcxitems" Label="Shared" /> <Import Project="..\Main\Main.vcxitems" Label="Shared" />
<Import Project="..\UtilityClasses\UtilityClasses.vcxitems" Label="Shared" />
<Import Project="..\CreatedGrpc\CreatedGrpc.vcxitems" Label="Shared" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
...@@ -107,7 +109,7 @@ ...@@ -107,7 +109,7 @@
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<AdditionalDependencies>Winmm.lib;ws2_32.lib;gpr.lib;grpc.lib;grpc++.lib;grpc_unsecure.lib;grpc++_unsecure.lib;libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories> <AdditionalLibraryDirectories>
</AdditionalLibraryDirectories> </AdditionalLibraryDirectories>
</Link> </Link>
...@@ -124,7 +126,7 @@ ...@@ -124,7 +126,7 @@
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<AdditionalDependencies>Winmm.lib;ws2_32.lib;gpr.lib;grpc.lib;grpc++.lib;grpc_unsecure.lib;grpc++_unsecure.lib;libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories> <AdditionalLibraryDirectories>
</AdditionalLibraryDirectories> </AdditionalLibraryDirectories>
</Link> </Link>
...@@ -145,7 +147,7 @@ ...@@ -145,7 +147,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Winmm.lib;ws2_32.lib;gpr.lib;grpc.lib;grpc++.lib;grpc_unsecure.lib;grpc++_unsecure.lib;libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories> <AdditionalLibraryDirectories>
</AdditionalLibraryDirectories> </AdditionalLibraryDirectories>
</Link> </Link>
...@@ -166,7 +168,7 @@ ...@@ -166,7 +168,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Winmm.lib;ws2_32.lib;gpr.lib;grpc.lib;grpc++.lib;grpc_unsecure.lib;grpc++_unsecure.lib;libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories> <AdditionalLibraryDirectories>
</AdditionalLibraryDirectories> </AdditionalLibraryDirectories>
</Link> </Link>
... ...
......
#include "ModeliFile.hpp" #include "ModeliFile.hpp"
#include "FmuEngine.hpp" #include "Simulation.hpp"
#include "ModeliGrpcServer.h" #include "ModeliGrpcServer.h"
#include "grpc++/grpc++.h" #include "grpc++/grpc++.h"
#include <chrono> #include <chrono>
...@@ -42,7 +42,7 @@ int main(int argc, char *argv[]) ...@@ -42,7 +42,7 @@ int main(int argc, char *argv[])
{ {
port = vm["port"].as<unsigned short>(); port = vm["port"].as<unsigned short>();
} }
auto fmuEngine = std::make_shared<Simulation::FmuEngine>(std::to_string(port)); auto fmuEngine = std::make_shared<Simulation::Simulation>(std::to_string(port));
// Load the modeli file into the engine // Load the modeli file into the engine
if (vm.count("modeli")) if (vm.count("modeli"))
{ {
... ...
......
#include "ModeliGrpcServer.h" #include "ModeliGrpcServer.h"
#include "FmuEngine.hpp" #include "Simulation.hpp"
#include "CoSimFmu.h" #include "CoSimFmu.h"
using ModeliRpc::Fmi2Status; using ModeliRpc::Fmi2Status;
ModeliGrpcServer::ModeliGrpcServer(std::shared_ptr<FmuEngine> fmuEngine) :_fmuEngine(fmuEngine) ModeliGrpcServer::ModeliGrpcServer(std::shared_ptr<Simulation> fmuEngine) :_fmuEngine(fmuEngine)
{ {
} }
...@@ -163,25 +163,9 @@ Status ModeliGrpcServer::NewValues(ServerContext * context, const::ModeliRpc::Ne ...@@ -163,25 +163,9 @@ Status ModeliGrpcServer::NewValues(ServerContext * context, const::ModeliRpc::Ne
{ {
bool streamOpen = true; bool streamOpen = true;
// Write to the stream until it is closed by the frontend // Write to the stream until it is closed by the frontend
while (streamOpen) while (writer->Write(_newValues.wait_and_pop()))
{ {
std::unique_lock<std::mutex> lock(_newValuesMutex); ; // Do nothing
// While waiting we release the lock for the producer
_newValuesCv.wait(lock);
// We can access the queue savely
while (streamOpen && !_newValues.empty())
{
if (writer->Write(_newValues.front()))
{
_newValues.pop();
}
else
{
// Stop writing
streamOpen = false;
}
}
// Lock goes out of scope, the producer can add data to the queue
} }
return Status::OK; return Status::OK;
} }
...@@ -190,25 +174,9 @@ Status ModeliGrpcServer::Log(ServerContext * context, const::ModeliRpc::LogReque ...@@ -190,25 +174,9 @@ Status ModeliGrpcServer::Log(ServerContext * context, const::ModeliRpc::LogReque
{ {
bool streamOpen = true; bool streamOpen = true;
// Write to the stream until it is closed by the frontend // Write to the stream until it is closed by the frontend
while (streamOpen) while (writer->Write(_logs.wait_and_pop()))
{
std::unique_lock<std::mutex> lock(_logMutex);
// While waiting we release the lock for the producer
_logCv.wait(lock);
// We can access the queue savely
while (streamOpen && !_logs.empty())
{ {
if (writer->Write(_logs.front())) ; // Do nothing
{
_logs.pop();
}
else
{
// Stop writing
streamOpen = false;
}
}
// Lock goes out of scope, the producer can add data to the queue
} }
return Status::OK; return Status::OK;
} }
...@@ -247,11 +215,8 @@ void ModeliGrpcServer::ValuesArrived(const std::string instanceName, double time ...@@ -247,11 +215,8 @@ void ModeliGrpcServer::ValuesArrived(const std::string instanceName, double time
added->set_value_ref(stringVrs[i]); added->set_value_ref(stringVrs[i]);
added->set_value(stringValues[i]); added->set_value(stringValues[i]);
} }
// Now safe to modify the queue // Thread safe modification & notification
std::unique_lock<std::mutex> lock(_newValuesMutex);
_newValues.push(response); _newValues.push(response);
// Let the consumer do its work
_newValuesCv.notify_all();
} }
void ModeliGrpcServer::LogArrived(std::string instanceName, int status, std::string category, std::string message) void ModeliGrpcServer::LogArrived(std::string instanceName, int status, std::string category, std::string message)
...@@ -259,5 +224,6 @@ void ModeliGrpcServer::LogArrived(std::string instanceName, int status, std::str ...@@ -259,5 +224,6 @@ void ModeliGrpcServer::LogArrived(std::string instanceName, int status, std::str
ModeliRpc::LogResponse response; ModeliRpc::LogResponse response;
response.set_instance_name(instanceName); response.set_instance_name(instanceName);
response.set_status(static_cast<Fmi2Status>(status)); response.set_status(static_cast<Fmi2Status>(status));
// Threadsafe modification & notification
_logs.push(response);
} }
#pragma once #pragma once
#include "ModeliRpc.grpc.pb.h" #include "ModeliRpc.grpc.pb.h"
#include "WaitableQueue.h"
#include "IEngineObserver.hpp" #include "IEngineObserver.hpp"
#include <memory>
#include <condition_variable>
#include <queue>
namespace Simulation namespace Simulation
{ {
class FmuEngine; class Simulation;
} }
using Simulation::FmuEngine; using Simulation::Simulation;
using grpc::Status; using grpc::Status;
using grpc::ServerContext; using grpc::ServerContext;
using grpc::ServerWriter; using grpc::ServerWriter;
...@@ -18,7 +16,7 @@ using grpc::ServerReader; ...@@ -18,7 +16,7 @@ using grpc::ServerReader;
class ModeliGrpcServer final : public ModeliRpc::ModeliBackend::Service, Simulation::IEngineObserver class ModeliGrpcServer final : public ModeliRpc::ModeliBackend::Service, Simulation::IEngineObserver
{ {
public: public:
ModeliGrpcServer(std::shared_ptr<FmuEngine> fmuEngine); ModeliGrpcServer(std::shared_ptr<Simulation> fmuEngine);
// Play the simulation infinetly in realtime // Play the simulation infinetly in realtime
Status Play(ServerContext* context, const ModeliRpc::PlayRequest* request, ModeliRpc::PlayResponse* response); Status Play(ServerContext* context, const ModeliRpc::PlayRequest* request, ModeliRpc::PlayResponse* response);
...@@ -49,7 +47,7 @@ public: ...@@ -49,7 +47,7 @@ public:
// Stream log messages to the client // Stream log messages to the client
Status Log(ServerContext* context, const ModeliRpc::LogRequest* request, ServerWriter<ModeliRpc::LogResponse>* writer); Status Log(ServerContext* context, const ModeliRpc::LogRequest* request, ServerWriter<ModeliRpc::LogResponse>* writer);
/// Observer of the simulation /// Observer callback
virtual void ValuesArrived( virtual void ValuesArrived(
std::string instanceName, ///< The instanceName of the FMU std::string instanceName, ///< The instanceName of the FMU
double timestamp, ///< Timestamp (current time) double timestamp, ///< Timestamp (current time)
...@@ -62,7 +60,7 @@ public: ...@@ -62,7 +60,7 @@ public:
std::vector<unsigned int> stringVrs, std::vector<unsigned int> stringVrs,
std::vector<const char*> stringValues); std::vector<const char*> stringValues);
/// Observer of the simulation /// Observer callback
virtual void LogArrived( virtual void LogArrived(
std::string instanceName, ///< The instanceName of the FMU std::string instanceName, ///< The instanceName of the FMU
int status, ///< Fmi2Status of the message int status, ///< Fmi2Status of the message
...@@ -71,15 +69,11 @@ public: ...@@ -71,15 +69,11 @@ public:
); );
private: private:
// Execue the simulation commands // Execue the simulation commands
std::shared_ptr<FmuEngine> _fmuEngine; std::shared_ptr<Simulation> _fmuEngine;
// Wait for logs to arrive // Wait for logs to arrive
std::mutex _logMutex; Utility::WaitableQueue<ModeliRpc::LogResponse> _logs;
std::condition_variable _logCv;
std::queue<ModeliRpc::LogResponse> _logs;
// Wait for values to arrive // Wait for values to arrive
std::mutex _newValuesMutex; Utility::WaitableQueue<ModeliRpc::NewValuesResponse> _newValues;
std::condition_variable _newValuesCv;
std::queue<ModeliRpc::NewValuesResponse> _newValues;
}; };
... ...
......
...@@ -16,12 +16,8 @@ ...@@ -16,12 +16,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.h" /> <ClInclude Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)ModeliRpc.grpc.pb.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)ModeliRpc.pb.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.cpp" /> <ClCompile Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)ModeliRpc.grpc.pb.cc" />
<ClCompile Include="$(MSBuildThisFileDirectory)ModeliRpc.pb.cc" />
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
...@@ -14,22 +14,10 @@ ...@@ -14,22 +14,10 @@
<ClCompile Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.cpp"> <ClCompile Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.cpp">
<Filter>Source</Filter> <Filter>Source</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)ModeliRpc.grpc.pb.cc">
<Filter>Source</Filter>
</ClCompile>
<ClCompile Include="$(MSBuildThisFileDirectory)ModeliRpc.pb.cc">
<Filter>Source</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.h"> <ClInclude Include="$(MSBuildThisFileDirectory)ModeliGrpcServer.h">
<Filter>Header</Filter> <Filter>Header</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)ModeliRpc.grpc.pb.h">
<Filter>Header</Filter>
</ClInclude>
<ClInclude Include="$(MSBuildThisFileDirectory)ModeliRpc.pb.h">
<Filter>Header</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
#include "FmuFile.hpp" #include "FmuFile.hpp"
#include "FmuEngine.hpp" #include "Simulation.hpp"
#include "CoSimFmu.h" #include "CoSimFmu.h"
// std // std
#include <iostream> #include <iostream>
...@@ -20,13 +20,13 @@ using NativeFmu::CoSimFmu; ...@@ -20,13 +20,13 @@ using NativeFmu::CoSimFmu;
namespace Simulation namespace Simulation
{ {
FmuEngine::FmuEngine(std::string id) : Simulation::Simulation(std::string id) :
_controllerId(id) _controllerId(id)
{ {
_simulating = false; _simulating = false;
} }
void FmuEngine::simulate() void Simulation::simulate()
{ {
using std::chrono::high_resolution_clock; using std::chrono::high_resolution_clock;
// Remember current time as oldDuration (continuing from pause) // Remember current time as oldDuration (continuing from pause)
...@@ -77,7 +77,7 @@ namespace Simulation ...@@ -77,7 +77,7 @@ namespace Simulation
fmi2False); fmi2False);
if (status == fmi2Error || status == fmi2Fatal) if (status == fmi2Error || status == fmi2Fatal)
{ {
onLog(pair.first, status, "FmuEngine", "Error on DoStep. Cannot continue the simulation!"); onLog(pair.first, status, "Simulation", "Error on DoStep. Cannot continue the simulation!");
return; // Simulation no longer possible return; // Simulation no longer possible
} }
} }
...@@ -92,7 +92,8 @@ namespace Simulation ...@@ -92,7 +92,8 @@ namespace Simulation
// Let the CPU cool down // Let the CPU cool down
SetProcessAsLowPrecision(); SetProcessAsLowPrecision();
} }
void FmuEngine::calculateChannelLinks()
void Simulation::calculateChannelLinks()
{ {
// Perform each link // Perform each link
for (ChannelLink link : _channelLinks) for (ChannelLink link : _channelLinks)
...@@ -101,7 +102,7 @@ namespace Simulation ...@@ -101,7 +102,7 @@ namespace Simulation
auto masterFmuInstance = FindFmu(link.MasterInstanceName); auto masterFmuInstance = FindFmu(link.MasterInstanceName);
if (!masterFmuInstance) if (!masterFmuInstance)
{ {
onLog("FmuEngine", fmi2Warning, "FmuEngine", onLog("Simulation", fmi2Warning, "Simulation",
"Failed ChannelLink: " + "Failed ChannelLink: " +
link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef) link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef)
+ "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) + + "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) +
...@@ -111,7 +112,7 @@ namespace Simulation ...@@ -111,7 +112,7 @@ namespace Simulation
auto slaveFmuInstance = FindFmu(link.SlaveInstanceName); auto slaveFmuInstance = FindFmu(link.SlaveInstanceName);
if (!slaveFmuInstance) if (!slaveFmuInstance)
{ {
onLog("FmuEngine", fmi2Warning, "FmuEngine", onLog("Simulation", fmi2Warning, "Simulation",
"Failed ChannelLink: " + link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef) "Failed ChannelLink: " + link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef)
+ "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) + + "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) +
" SlaveChannel fmu instance does not exist."); " SlaveChannel fmu instance does not exist.");
...@@ -124,7 +125,7 @@ namespace Simulation ...@@ -124,7 +125,7 @@ namespace Simulation
if (res != fmi2OK) if (res != fmi2OK)
{ {
// The fmu will send an error itself but send soe additional info here // The fmu will send an error itself but send soe additional info here
onLog("FmuEngine", fmi2Warning, "FmuEngine", onLog("Simulation", fmi2Warning, "Simulation",
"Failed ChannelLink: " + link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef) "Failed ChannelLink: " + link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef)
+ "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) + + "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) +
", could not perform GetReal."); ", could not perform GetReal.");
...@@ -140,7 +141,7 @@ namespace Simulation ...@@ -140,7 +141,7 @@ namespace Simulation
if (res != fmi2OK) if (res != fmi2OK)
{ {
// The fmu will send an error itself but send soe additional info here // The fmu will send an error itself but send soe additional info here
onLog("FmuEngine", fmi2Warning, "FmuEngine", onLog("Simulation", fmi2Warning, "Simulation",
"Failed ChannelLink: " + link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef) "Failed ChannelLink: " + link.MasterInstanceName + ": " + std::to_string(link.MasterValueRef)
+ "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) + + "-> " + link.SlaveInstanceName + ": " + std::to_string(link.SlaveValueRef) +
", could not perform SetReal."); ", could not perform SetReal.");
...@@ -149,7 +150,8 @@ namespace Simulation ...@@ -149,7 +150,8 @@ namespace Simulation
} }
} }
} }
void FmuEngine::sendValues()
void Simulation::sendValues()
{ {
for (auto &pair : _fmus) for (auto &pair : _fmus)
{ {
...@@ -158,25 +160,25 @@ namespace Simulation ...@@ -158,25 +160,25 @@ namespace Simulation
auto intRes = fmu->GetInteger(); auto intRes = fmu->GetInteger();
if (intRes.first != fmi2OK) if (intRes.first != fmi2OK)
{ {
onLog(fmu->GetInstanceName(), intRes.first, "FmuEngine", "GetInteger failed."); onLog(fmu->GetInstanceName(), intRes.first, "Simulation", "GetInteger failed.");
} }
// Real // Real
auto realRes = fmu->GetReal(); auto realRes = fmu->GetReal();
if (realRes.first != fmi2OK) if (realRes.first != fmi2OK)
{ {
onLog(fmu->GetInstanceName(), realRes.first, "FmuEngine", "GetReal failed."); onLog(fmu->GetInstanceName(), realRes.first, "Simulation", "GetReal failed.");
} }
// Bool // Bool
auto boolRes = fmu->GetBoolean(); auto boolRes = fmu->GetBoolean();
if (boolRes.first != fmi2OK) if (boolRes.first != fmi2OK)
{ {
onLog(fmu->GetInstanceName(), boolRes.first, "FmuEngine", "GetBoolean failed."); onLog(fmu->GetInstanceName(), boolRes.first, "Simulation", "GetBoolean failed.");
} }
// String // String
auto stringRes = fmu->GetString(); auto stringRes = fmu->GetString();
if (stringRes.first != fmi2OK) if (stringRes.first != fmi2OK)
{ {
onLog(fmu->GetInstanceName(), stringRes.first, "FmuEngine", "GetString failed."); onLog(fmu->GetInstanceName(), stringRes.first, "Simulation", "GetString failed.");
} }
// Send the values // Send the values
...@@ -190,14 +192,14 @@ namespace Simulation ...@@ -190,14 +192,14 @@ namespace Simulation
} }
} }
double FmuEngine::getSeconds(std::chrono::milliseconds duration) double Simulation::getSeconds(std::chrono::milliseconds duration)
{ {
// seconds as double // seconds as double
typedef std::chrono::duration<double> double_seconds; typedef std::chrono::duration<double> double_seconds;
return std::chrono::duration_cast<double_seconds>(duration).count(); return std::chrono::duration_cast<double_seconds>(duration).count();
} }
int FmuEngine::startSimulation() int Simulation::startSimulation()
{ {
// Play from initialized or stopped state // Play from initialized or stopped state
if (!_simulating) if (!_simulating)
...@@ -210,30 +212,30 @@ namespace Simulation ...@@ -210,30 +212,30 @@ namespace Simulation
int status = fmu->ExitInitializationMode(); int status = fmu->ExitInitializationMode();
if (!(status == fmi2OK || status == fmi2Warning)) if (!(status == fmi2OK || status == fmi2Warning))
{ {
onLog(fmu->GetInstanceName(), status, "FmuEngine", "ExitInitializationMode failed"); onLog(fmu->GetInstanceName(), status, "Simulation", "ExitInitializationMode failed");
return status; return status;
} }
} }
// Start simulating // Start simulating
_simulating = true; _simulating = true;
// Create new thread for the simulation // Create new thread for the simulation
_simThread = std::thread(&FmuEngine::simulate, this); _simThread = std::thread(&Simulation::simulate, this);
} }
return fmi2OK; return fmi2OK;
} }
void FmuEngine::AddObserver(std::shared_ptr<IEngineObserver> observer) void Simulation::AddObserver(std::shared_ptr<IEngineObserver> observer)
{ {
_observers.push_back(observer); _observers.push_back(observer);
} }
void FmuEngine::RemoveObserver(std::shared_ptr<IEngineObserver> observer) void Simulation::RemoveObserver(std::shared_ptr<IEngineObserver> observer)
{ {
// Guarenteed not to throw // Guarenteed not to throw
_observers.remove(observer); _observers.remove(observer);
} }
int FmuEngine::Play() int Simulation::Play()
{ {
// Play infinite // Play infinite
_endDuration = std::chrono::milliseconds(0); _endDuration = std::chrono::milliseconds(0);
...@@ -241,7 +243,8 @@ namespace Simulation ...@@ -241,7 +243,8 @@ namespace Simulation
_playFast = false; _playFast = false;
return startSimulation(); return startSimulation();
} }
int FmuEngine::PlayFast(double endTime_sec)
int Simulation::PlayFast(double endTime_sec)
{ {
// Update the _endTime // Update the _endTime
_endDuration = std::chrono::milliseconds(static_cast<unsigned long>(endTime_sec * 1000)); _endDuration = std::chrono::milliseconds(static_cast<unsigned long>(endTime_sec * 1000));
...@@ -249,16 +252,18 @@ namespace Simulation ...@@ -249,16 +252,18 @@ namespace Simulation
_playFast = true; _playFast = true;
return startSimulation(); return startSimulation();
} }
// Stop the simulation thread // Stop the simulation thread
void FmuEngine::Pause() void Simulation::Pause()
{ {
// Only try to obtain ownership over the thread without blocking the current thread // Only try to obtain ownership over the thread without blocking the current thread
_simulating = false; _simulating = false;
// Wait until the current run has finished // Wait until the current run has finished
_simThread.join(); _simThread.join();
} }
// Stop the thread and reset the simulation // Stop the thread and reset the simulation
int FmuEngine::Stop() int Simulation::Stop()
{ {
// Stop simulation // Stop simulation
_simulating = false; _simulating = false;
...@@ -301,7 +306,7 @@ namespace Simulation ...@@ -301,7 +306,7 @@ namespace Simulation
return fmi2OK; return fmi2OK;
} }
int FmuEngine::initializeFmu(std::shared_ptr<CoSimFmu> fmu) int Simulation::initializeFmu(std::shared_ptr<CoSimFmu> fmu)
{ {
// No error estimation and no pre-defined stoptime -> 10.0 is meaningless // No error estimation and no pre-defined stoptime -> 10.0 is meaningless
int status = fmu->SetupExperiment(fmi2False, 0, 0, fmi2False, 0); int status = fmu->SetupExperiment(fmi2False, 0, 0, fmi2False, 0);
...@@ -313,7 +318,7 @@ namespace Simulation ...@@ -313,7 +318,7 @@ namespace Simulation
return fmu->EnterInitializationMode(); return fmu->EnterInitializationMode();
} }
void FmuEngine::onValuesArrived(const std::string instanceName, double timestamp, const std::vector<unsigned int> intVrs, const std::vector<int> intValues, const std::vector<unsigned int> realVrs, const std::vector<double> realValues, const std::vector<unsigned int> boolVrs, const std::vector<int> boolValues, const std::vector<unsigned int> stringVrs, const std::vector<const char*> stringValues) void Simulation::onValuesArrived(const std::string instanceName, double timestamp, const std::vector<unsigned int> intVrs, const std::vector<int> intValues, const std::vector<unsigned int> realVrs, const std::vector<double> realValues, const std::vector<unsigned int> boolVrs, const std::vector<int> boolValues, const std::vector<unsigned int> stringVrs, const std::vector<const char*> stringValues)
{ {
// Invoke each observer // Invoke each observer
for (auto observer : _observers) for (auto observer : _observers)
...@@ -327,7 +332,7 @@ namespace Simulation ...@@ -327,7 +332,7 @@ namespace Simulation
} }
} }
void FmuEngine::onLog(std::string instanceName, int status, std::string category, std::string message) void Simulation::onLog(std::string instanceName, int status, std::string category, std::string message)
{ {
// Invoke each observer // Invoke each observer
for (auto observer : _observers) for (auto observer : _observers)
...@@ -336,18 +341,18 @@ namespace Simulation ...@@ -336,18 +341,18 @@ namespace Simulation
} }
} }
bool FmuEngine::AddChannelLink(ChannelLink channelLink) bool Simulation::AddChannelLink(ChannelLink channelLink)
{ {
// Check existance of instances // Check existance of instances
if (!FindFmu(channelLink.MasterInstanceName)) if (!FindFmu(channelLink.MasterInstanceName))
{ {
onLog("FmuEngine", fmi2Warning, "FmuEngine", onLog("Simulation", fmi2Warning, "Simulation",
"MasterInstanceName of ChannelLink not found: " + channelLink.MasterInstanceName); "MasterInstanceName of ChannelLink not found: " + channelLink.MasterInstanceName);
return false; return false;
} }
if (!FindFmu(channelLink.SlaveInstanceName)) if (!FindFmu(channelLink.SlaveInstanceName))
{ {
onLog("FmuEngine", fmi2Warning, "FmuEngine", onLog("Simulation", fmi2Warning, "Simulation",
"SlaveInstanceName of ChannelLink not found: " + channelLink.SlaveInstanceName); "SlaveInstanceName of ChannelLink not found: " + channelLink.SlaveInstanceName);
return false; return false;
} }
...@@ -357,13 +362,13 @@ namespace Simulation ...@@ -357,13 +362,13 @@ namespace Simulation
return true; return true;
} }
bool FmuEngine::RemoveChannelLink(ChannelLink channelLink) bool Simulation::RemoveChannelLink(ChannelLink channelLink)
{ {
_channelLinks.remove(channelLink); _channelLinks.remove(channelLink);
return true; return true;
} }
bool FmuEngine::AddChannelLink(const std::string& masterInstanceName, const std::string& slaveInstanceName, bool Simulation::AddChannelLink(const std::string& masterInstanceName, const std::string& slaveInstanceName,
unsigned int masterValueRef, unsigned int slaveValueRef, double factor, double shift) unsigned int masterValueRef, unsigned int slaveValueRef, double factor, double shift)
{ {
// Create the channelLink // Create the channelLink
...@@ -377,7 +382,7 @@ namespace Simulation ...@@ -377,7 +382,7 @@ namespace Simulation
// Add it! // Add it!
return AddChannelLink(channelLink); return AddChannelLink(channelLink);
} }
bool FmuEngine::RemoveChannelLink(const std::string& masterInstanceName, const std::string& slaveInstanceName, bool Simulation::RemoveChannelLink(const std::string& masterInstanceName, const std::string& slaveInstanceName,
unsigned int masterValueRef, unsigned int slaveValueRef) unsigned int masterValueRef, unsigned int slaveValueRef)
{ {
// Create the channelLink // Create the channelLink
...@@ -390,13 +395,13 @@ namespace Simulation ...@@ -390,13 +395,13 @@ namespace Simulation
return RemoveChannelLink(channelLink); return RemoveChannelLink(channelLink);
} }
bool FmuEngine::AddFmu(std::shared_ptr<FmuFile> fmuFile) bool Simulation::AddFmu(std::shared_ptr<FmuFile> fmuFile)
{ {
// Check if the instanceName is in use // Check if the instanceName is in use
if (FindFmu(fmuFile->GetInstanceName())) if (FindFmu(fmuFile->GetInstanceName()))
{ {
// Error: The element has been found but we can not have two identical instances // Error: The element has been found but we can not have two identical instances
onLog(fmuFile->GetInstanceName(), fmi2Warning, "FmuEngine", "The instanceName already exists."); onLog(fmuFile->GetInstanceName(), fmi2Warning, "Simulation", "The instanceName already exists.");
return false; return false;
} }
...@@ -405,17 +410,17 @@ namespace Simulation ...@@ -405,17 +410,17 @@ namespace Simulation
std::pair<bool, std::string> loadDllRes = coSimFmu->LoadDll(fmuFile->GetBinaryPath()); std::pair<bool, std::string> loadDllRes = coSimFmu->LoadDll(fmuFile->GetBinaryPath());
if (!loadDllRes.first) if (!loadDllRes.first)
{ {
onLog(fmuFile->GetInstanceName(), fmi2Warning, "FmuEngine", "Failed LoadLibrary, Error: " + loadDllRes.second); onLog(fmuFile->GetInstanceName(), fmi2Warning, "Simulation", "Failed LoadLibrary, Error: " + loadDllRes.second);
return false; return false;
} }
// Setup callbacks and parameters // Setup callbacks and parameters
namespace ph = std::placeholders; namespace ph = std::placeholders;
coSimFmu->SetLoggerCallback(std::bind(&FmuEngine::onLog, this, ph::_1, ph::_2, ph::_3, ph::_4)); coSimFmu->SetLoggerCallback(std::bind(&Simulation::onLog, this, ph::_1, ph::_2, ph::_3, ph::_4));
// Instantiate // Instantiate
if (!coSimFmu->Instantiate(fmuFile->GetInstanceName(), fmuFile->GetGUID(), fmuFile->GetResourceUri())) if (!coSimFmu->Instantiate(fmuFile->GetInstanceName(), fmuFile->GetGUID(), fmuFile->GetResourceUri()))
{ {
onLog(fmuFile->GetInstanceName(), fmi2Warning, "FmuEngine", "Instantiation failed for instance: " + fmuFile->GetInstanceName()); onLog(fmuFile->GetInstanceName(), fmi2Warning, "Simulation", "Instantiation failed for instance: " + fmuFile->GetInstanceName());
return false; return false;
} }
...@@ -430,19 +435,19 @@ namespace Simulation ...@@ -430,19 +435,19 @@ namespace Simulation
return true; return true;
} }
bool FmuEngine::AddFmu(std::string instanceName, std::string path) bool Simulation::AddFmu(std::string instanceName, std::string path)
{ {
// Add the fmu from file // Add the fmu from file
return AddFmu(std::make_shared<FmuFile>(path, _controllerId, instanceName)); return AddFmu(std::make_shared<FmuFile>(path, _controllerId, instanceName));
} }
bool FmuEngine::AddFmu(std::string instanceName, const std::vector<unsigned char> &bytes) bool Simulation::AddFmu(std::string instanceName, const std::vector<unsigned char> &bytes)
{ {
// Add the fmu from file // Add the fmu from file
return AddFmu(std::make_shared<FmuFile>(bytes, _controllerId, instanceName)); return AddFmu(std::make_shared<FmuFile>(bytes, _controllerId, instanceName));
} }
bool FmuEngine::RemoveFMU(std::string instanceName) bool Simulation::RemoveFMU(std::string instanceName)
{ {
// Make sure we stopped the simulation // Make sure we stopped the simulation
Stop(); Stop();
...@@ -455,12 +460,12 @@ namespace Simulation ...@@ -455,12 +460,12 @@ namespace Simulation
} }
else else
{ {
onLog(instanceName, fmi2Warning, "FmuEngine", "Instance can not be removed, it does not exist: " + instanceName); onLog(instanceName, fmi2Warning, "Simulation", "Instance can not be removed, it does not exist: " + instanceName);
return false; return false;
} }
} }
boost::optional<FmuFilePair> FmuEngine::FindFmu(std::string instanceName) boost::optional<FmuFilePair> Simulation::FindFmu(std::string instanceName)
{ {
auto iter = _fmus.find(instanceName); auto iter = _fmus.find(instanceName);
if (iter == _fmus.end()) if (iter == _fmus.end())
... ...
......
...@@ -35,11 +35,11 @@ namespace Simulation ...@@ -35,11 +35,11 @@ namespace Simulation
std::shared_ptr<FmuFile> File; std::shared_ptr<FmuFile> File;
}; };
class FmuEngine class Simulation
{ {
public: public:
///< Creates a new instance of the FmuEngine ///< Creates a new instance of the Simulation
FmuEngine( Simulation(
std::string id ///< A unique identification, used to create a dir where the models will be stored std::string id ///< A unique identification, used to create a dir where the models will be stored
); );
... ...
......
...@@ -17,11 +17,11 @@ ...@@ -17,11 +17,11 @@
<ClInclude Include="$(MSBuildThisFileDirectory)ChannelLink.h" /> <ClInclude Include="$(MSBuildThisFileDirectory)ChannelLink.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)fmi2FunctionTypes.h" /> <ClInclude Include="$(MSBuildThisFileDirectory)fmi2FunctionTypes.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)fmi2TypesPlatform.h" /> <ClInclude Include="$(MSBuildThisFileDirectory)fmi2TypesPlatform.h" />
<ClInclude Include="$(MSBuildThisFileDirectory)FmuEngine.hpp" /> <ClInclude Include="$(MSBuildThisFileDirectory)Simulation.hpp" />
<ClInclude Include="$(MSBuildThisFileDirectory)IEngineObserver.hpp" /> <ClInclude Include="$(MSBuildThisFileDirectory)IEngineObserver.hpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="$(MSBuildThisFileDirectory)ChannelLink.cpp" /> <ClCompile Include="$(MSBuildThisFileDirectory)ChannelLink.cpp" />
<ClCompile Include="$(MSBuildThisFileDirectory)FMUEngine.cpp" /> <ClCompile Include="$(MSBuildThisFileDirectory)Simulation.cpp" />
</ItemGroup> </ItemGroup>
</Project> </Project>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment