diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs
index 3e8af694..8b789afc 100644
--- a/Common/.shared/SharedAssemblyInfo.cs
+++ b/Common/.shared/SharedAssemblyInfo.cs
@@ -14,5 +14,5 @@ using System.Reflection;
//[assembly: AssemblyVersion("1.2.*.0")]
-[assembly: AssemblyVersion("2.6.4.*")]
-[assembly: AssemblyFileVersion("2.6.4.0")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.6.0.*")]
+[assembly: AssemblyFileVersion("2.6.0.0")]
\ No newline at end of file
diff --git a/Common/.vs/config/applicationhost.config b/Common/.vs/config/applicationhost.config
index 1b9332b4..a894c3cf 100644
--- a/Common/.vs/config/applicationhost.config
+++ b/Common/.vs/config/applicationhost.config
@@ -155,11 +155,19 @@
-
+
+
+
+
+
+
+
+
+
diff --git a/Common/Common.sln b/Common/Common.sln
index 008730d2..4f5ae3eb 100644
--- a/Common/Common.sln
+++ b/Common/Common.sln
@@ -157,8 +157,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Protocols", "Protocols", "{
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MjkControlledCodeRef", "MjkControlledCodeRef", "{B4F8545B-F379-42A5-BDE9-763FD7B79598}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "modbus_master_csharp", "..\..\..\MJK\Code\C#\modbus_master_csharp\src\modbus_master_csharp\modbus_master_csharp.csproj", "{F14940F8-3C86-4BB7-A915-B021E4B3052D}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagFluxToolBox", "Ui\MagFluxToolBox\MagFluxToolBox.csproj", "{A5E7CE52-3101-4E9B-B896-C2C0FADE4812}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagFluxConfig", "Hardware\WaterMeter\MagFlux\MagFluxConfig\MagFluxConfig.csproj", "{70398B99-B134-4BBD-968B-7399B70C3CE2}"
@@ -189,6 +187,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonMessurementUnits", "C
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonConsole", "CommonConsole\CommonConsole.csproj", "{AFC428F5-0141-4A3F-BEF2-470A89D972F6}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "modbus_master_csharp", "modbus_master_csharp\modbus_master_csharp.csproj", "{F14940F8-3C86-4BB7-A915-B021E4B3052D}"
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
Utils\DateTimeServerShared\DateTimeServerShared.projitems*{4806d89a-fbfb-41bc-aaa7-2242444bf55a}*SharedItemsImports = 4
@@ -3487,70 +3487,6 @@ Global
{35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x64.Build.0 = Release|Any CPU
{35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x86.ActiveCfg = Release|Any CPU
{35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x64.Build.0 = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x86.Build.0 = Debug|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x86.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Any CPU.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x64.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x64.Build.0 = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x86.ActiveCfg = Release|Any CPU
- {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x86.Build.0 = Release|Any CPU
{A5E7CE52-3101-4E9B-B896-C2C0FADE4812}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU
{A5E7CE52-3101-4E9B-B896-C2C0FADE4812}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU
{A5E7CE52-3101-4E9B-B896-C2C0FADE4812}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -4447,6 +4383,70 @@ Global
{AFC428F5-0141-4A3F-BEF2-470A89D972F6}.XP32bit|x64.Build.0 = Release|Any CPU
{AFC428F5-0141-4A3F-BEF2-470A89D972F6}.XP32bit|x86.ActiveCfg = Release|Any CPU
{AFC428F5-0141-4A3F-BEF2-470A89D972F6}.XP32bit|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.COM|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x64.Build.0 = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Debug|x86.Build.0 = Debug|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.PerformTest|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.Release|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.ReleaseTest|x86.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Any CPU.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x64.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x64.Build.0 = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x86.ActiveCfg = Release|Any CPU
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D}.XP32bit|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -4517,7 +4517,6 @@ Global
{C9393A97-C0BB-4D59-A879-B572BE04CE15} = {5563DD3B-2287-4BED-97BF-F0389FF505AF}
{94579693-7AC6-4FF0-B540-1F3780E1BCFA} = {C9393A97-C0BB-4D59-A879-B572BE04CE15}
{B4F8545B-F379-42A5-BDE9-763FD7B79598} = {C9393A97-C0BB-4D59-A879-B572BE04CE15}
- {F14940F8-3C86-4BB7-A915-B021E4B3052D} = {B4F8545B-F379-42A5-BDE9-763FD7B79598}
{A5E7CE52-3101-4E9B-B896-C2C0FADE4812} = {03D4F23E-7E4A-4091-BC96-036C996D351A}
{70398B99-B134-4BBD-968B-7399B70C3CE2} = {C9393A97-C0BB-4D59-A879-B572BE04CE15}
{B5DA260C-71CC-45CA-B79E-D1B376AF718C} = {C9393A97-C0BB-4D59-A879-B572BE04CE15}
@@ -4533,6 +4532,7 @@ Global
{FD30EB7A-7809-4E62-9374-791D31877D6D} = {696A94BE-7237-4AE2-9E36-6059DE519971}
{17C15B79-9A9E-4079-8FE2-0E563F18CA01} = {C17363DF-A043-4F25-8EBA-2B3B078227DC}
{AFC428F5-0141-4A3F-BEF2-470A89D972F6} = {C17363DF-A043-4F25-8EBA-2B3B078227DC}
+ {F14940F8-3C86-4BB7-A915-B021E4B3052D} = {B4F8545B-F379-42A5-BDE9-763FD7B79598}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4BCB7B69-696C-436A-86F7-C91EA5588164}
diff --git a/Common/CommonConsole/BitExtensions.cs b/Common/CommonConsole/BitExtensions.cs
new file mode 100644
index 00000000..30aa2512
--- /dev/null
+++ b/Common/CommonConsole/BitExtensions.cs
@@ -0,0 +1,117 @@
+namespace CommonConsole
+{
+ using System;
+ using System.Linq;
+ using System.Text;
+
+ public static class BitExtensions
+ {
+ public static byte[] GetBits(this byte[] bytes)
+ {
+ if (bytes is null)
+ {
+ return Array.Empty();
+ }
+
+ var bytesCount = bytes.Length;
+ var bitsCount = bytesCount * 8;
+ var bits = new byte[bitsCount];
+ var bit = 0;
+
+ foreach (var @byte in bytes)
+ {
+ for (int b = 7; b >= 0; b--)
+ {
+ bits[bit++] = (byte)((@byte >> b) % 2);
+ }
+ }
+
+ return bits;
+ }
+
+ public static byte[] GetBytes(this byte value, int take = 1)
+ => BitConverter.GetBytes(value).Take(take);
+
+ public static byte[] GetBytes(this sbyte value, int take = 2)
+ => BitConverter.GetBytes(value).Take(take);
+
+ public static byte[] GetBytes(this short value, int take = 2)
+ => BitConverter.GetBytes(value).Take(2);
+
+ public static byte[] GetBytes(this ushort value, int take = 2)
+ => BitConverter.GetBytes(value).Take(2);
+
+ public static byte[] GetBytes(this int value, int take = 4)
+ => BitConverter.GetBytes(value).Take(take);
+
+ public static byte[] GetBytes(this uint value, int take = 4)
+ => BitConverter.GetBytes(value).Take(take);
+
+ public static byte[] GetBytes(this long value, int take = 8)
+ => BitConverter.GetBytes(value).Take(take);
+
+ public static byte[] GetBytes(this ulong value, int take = 8)
+ => BitConverter.GetBytes(value).Take(take);
+
+ public static byte[] GetBytes(this double value)
+ => BitConverter.GetBytes(value);
+
+ public static byte[] GetBytes(this string value)
+ => Encoding.ASCII.GetBytes(value);
+
+ public static byte[] Swap(this byte[] bytes)
+ {
+ if (bytes is null)
+ {
+ return Array.Empty();
+ }
+
+ var length = bytes.Length;
+ var swapped = new byte[length];
+
+ for (int x = 0; x < length; x++)
+ {
+ swapped[x] = bytes[length - x - 1];
+ }
+
+ return swapped;
+ }
+
+ public static byte[] Take(this byte[] bytesSRC, int count)
+ {
+ if (bytesSRC is null || count < 0)
+ {
+ return Array.Empty();
+ }
+
+ var bytesDST = new byte[count];
+
+ Array.Copy(bytesSRC, 0, bytesDST, 0, count);
+
+ return bytesDST;
+ }
+
+ public static string ToHex(this byte[] value, string separator = " ")
+ {
+ if (value is null)
+ {
+ return string.Empty;
+ }
+
+ return BitConverter.ToString(value).Replace("-", separator);
+ }
+
+ public static byte[] FromHex(this string value, string separator = " ")
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return Array.Empty();
+ }
+
+ return value
+ .Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries)
+ .Select(x => byte.TryParse(x, out byte b) ? b : default(byte))
+ .ToArray();
+ }
+ }
+}
diff --git a/Common/CommonConsole/CommonConsole.csproj b/Common/CommonConsole/CommonConsole.csproj
index 840f0f3c..64185cfd 100644
--- a/Common/CommonConsole/CommonConsole.csproj
+++ b/Common/CommonConsole/CommonConsole.csproj
@@ -46,11 +46,22 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -59,5 +70,6 @@
CommonMessurementUnits
+
\ No newline at end of file
diff --git a/Common/CommonConsole/ConfigurationJson.cs b/Common/CommonConsole/ConfigurationJson.cs
new file mode 100644
index 00000000..60c3df07
--- /dev/null
+++ b/Common/CommonConsole/ConfigurationJson.cs
@@ -0,0 +1,330 @@
+namespace CommonConsole
+{
+ using Newtonsoft.Json;
+
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Runtime.Serialization;
+
+ public class ConfigurationJson : Dictionary
+ {
+ public Section this[byte id]
+ => this.Values.FirstOrDefault(x => x.Id == id)
+ ?? new Section();
+
+ public new Section this[string key]
+ {
+ get
+ {
+ if (string.IsNullOrWhiteSpace(key))
+ {
+ throw new ArgumentException("Section name should not be null or white space!");
+ }
+
+ if (!this.TryGetValue(key, out var section))
+ {
+ section = new Section();
+
+ this[key] = section;
+ }
+
+ return section;
+ }
+ set
+ {
+ if (string.IsNullOrWhiteSpace(key))
+ {
+ throw new ArgumentException("Section name should not be null or white space!");
+ }
+
+ this[key] = value;
+ }
+ }
+
+ [OnDeserialized]
+ internal void OnDeserialized(StreamingContext _)
+ {
+ foreach (var kvp in this)
+ {
+ kvp.Value.Name = kvp.Key;
+ }
+ }
+ }
+
+ public class Section
+ {
+ public byte Id { get; set; }
+
+ [JsonIgnore]
+ public string Name { get; internal set; }
+
+ public Version Version { get; set; }
+
+ public Registers Registers { get; set; }
+
+ public Status Status { get; set; }
+
+ public Register this[string key]
+ {
+ get
+ {
+ if (this.Registers is null)
+ {
+ return new Register();
+ }
+
+ return this.Registers[key];
+ }
+ set
+ {
+ if (this.Registers != null)
+ {
+ this.Registers[key] = value;
+ }
+ }
+ }
+
+ public Register this[byte id]
+ => this.Registers?[id] ?? new Register();
+ }
+
+ public class Version
+ {
+ public int? First { get; set; }
+
+ public int? Last { get; set; }
+
+ public bool InVersion(int version)
+ {
+ if (this.First is null && this.Last is null)
+ {
+ return false;
+ }
+
+ return (this.First ?? int.MinValue) <= version && (this.First ?? int.MaxValue) >= version;
+ }
+ }
+
+ public class Registers : Dictionary
+ {
+ public Register this[byte id]
+ => this.Values.FirstOrDefault(x => x.Id == id)
+ ?? new Register();
+
+ public new Register this[string key]
+ {
+ get
+ {
+ if (string.IsNullOrWhiteSpace(key))
+ {
+ throw new ArgumentException("Register name should not be null or white space!");
+ }
+
+ if (!this.TryGetValue(key, out var register))
+ {
+ register = new Register();
+
+ this[key] = register;
+ }
+
+ return register;
+ }
+ set
+ {
+ if (string.IsNullOrWhiteSpace(key))
+ {
+ throw new ArgumentException("Register name should not be null or white space!");
+ }
+
+ this[key] = value;
+ }
+ }
+
+ [OnDeserialized]
+ internal void OnDeserialized(StreamingContext _)
+ {
+ foreach (var kvp in this)
+ {
+ kvp.Value.Name = kvp.Key;
+ }
+ }
+ }
+
+ public class Register
+ {
+ public byte Id { get; set; }
+
+ [JsonIgnore]
+ public string Name { get; internal set; }
+
+ public Details Details { get; set; }
+
+ public Detail this[int version]
+ => this.Details?[version] ?? new Detail();
+ }
+
+ public class Details : List
+ {
+ public new Detail this[int version]
+ => this.FirstOrDefault(x => x.Version?.InVersion(version) ?? false)
+ ?? new Detail();
+ }
+
+ public class Detail
+ {
+ public string Type { get; set; }
+
+ public string StaticType { get; set; }
+
+ public Privilege Privilege { get; set; }
+
+ public Version Version { get; set; }
+
+ public Values Values { get; set; }
+
+ [JsonIgnore]
+ public Value Value { get; set; }
+
+ [JsonIgnore]
+ public Unit Unit { get; set; }
+
+ public object this[string property]
+ {
+ get
+ {
+ if (property == nameof(Value))
+ {
+ return this.Value?.Current;
+ }
+ else if (property == nameof(Unit))
+ {
+ return this.Unit?.Base;
+ }
+
+ return null;
+ }
+ set
+ {
+ if (property == nameof(Value) && this.Value != null)
+ {
+ this.Value.Current = value;
+ }
+ else if (property == nameof(Unit) && this.Unit != null)
+ {
+ this.Unit.Base = value;
+ }
+ }
+ }
+
+ [OnDeserialized]
+ internal void OnDeserialized(StreamingContext _)
+ {
+ try
+ {
+ var valueType = System.Type.GetType(
+ typeName: $"CommonConsole.{this.Type}",
+ throwOnError: false,
+ ignoreCase: true);
+ var instance = Activator.CreateInstance(valueType);
+
+ if (instance is Value value)
+ {
+ if (this.Values != null)
+ {
+ value.Current = this.Values.Default;
+ }
+
+ this.Value = value;
+ }
+ }
+ catch (Exception e)
+ {
+ // TODO: Handle exceptions.
+ }
+ }
+ }
+
+ public class Values
+ {
+ public object Default { get; set; }
+
+ public object Minimum { get; set; }
+
+ public object Maximum { get; set; }
+ }
+
+ public class Privilege
+ {
+ public Access Lvl1 { get; set; }
+
+ public Access Lvl2 { get; set; }
+
+ public Access Lvl3 { get; set; }
+
+ public Access Lvl4 { get; set; }
+
+ public Access Lvl5 { get; set; }
+
+ public Access Lvl6 { get; set; }
+
+ public Access Lvl7 { get; set; }
+
+ public Access Lvl8 { get; set; }
+ }
+
+ public enum Access : byte
+ {
+ NS,
+ NA,
+ RO,
+ WO,
+ RW
+ }
+
+ public class Status : Dictionary
+ {
+
+ }
+
+ public class StatusInfo
+ {
+ public byte Id { get; set; }
+
+ public string Action { get; set; }
+
+ public string Description { get; set; }
+ }
+
+ public class AccessConverter : JsonConverter
+ {
+ public override bool CanConvert(Type type)
+ => type == typeof(Access)
+ || type == typeof(Access?);
+
+ public override object ReadJson(JsonReader reader, Type _, object existingValue, JsonSerializer serializer)
+ {
+ if (reader.TokenType == JsonToken.Null)
+ {
+ return null;
+ }
+
+ var value = serializer.Deserialize(reader);
+
+ if (Enum.TryParse(value, true, out Access access))
+ {
+ return access;
+ }
+
+ return default(Access);
+ }
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer _1)
+ {
+ if (value != null)
+ {
+ writer.WriteValue($"{value}");
+ }
+ }
+ }
+}
diff --git a/Common/CommonConsole/JsonConverters/CurrentConverter.cs b/Common/CommonConsole/JsonConverters/CurrentConverter.cs
new file mode 100644
index 00000000..a0416414
--- /dev/null
+++ b/Common/CommonConsole/JsonConverters/CurrentConverter.cs
@@ -0,0 +1,27 @@
+namespace CommonConsole.JsonConverters
+{
+ using Newtonsoft.Json;
+
+ using System;
+
+ public class CurrentConverter : JsonConverter
+ {
+ public override Current ReadJson(JsonReader reader, Type objectType, Current existingValue, bool hasExistingValue, JsonSerializer serializer)
+ {
+ while (reader.ValueType != typeof(double))
+ {
+ reader.Read();
+ }
+
+ if (reader.Value is double value)
+ {
+ return value;
+ }
+
+ return existingValue;
+ }
+
+ public override void WriteJson(JsonWriter writer, Current value, JsonSerializer serializer)
+ => writer.WriteValue((double)value);
+ }
+}
diff --git a/Common/CommonConsole/JsonConverters/FlowConverter.cs b/Common/CommonConsole/JsonConverters/FlowConverter.cs
new file mode 100644
index 00000000..5b7ddfa2
--- /dev/null
+++ b/Common/CommonConsole/JsonConverters/FlowConverter.cs
@@ -0,0 +1,27 @@
+namespace CommonConsole.JsonConverters
+{
+ using Newtonsoft.Json;
+
+ using System;
+
+ public class FlowConverter : JsonConverter
+ {
+ public override Flow ReadJson(JsonReader reader, Type objectType, Flow existingValue, bool hasExistingValue, JsonSerializer serializer)
+ {
+ while (reader.ValueType != typeof(double))
+ {
+ reader.Read();
+ }
+
+ if (reader.Value is double value)
+ {
+ return value;
+ }
+
+ return existingValue;
+ }
+
+ public override void WriteJson(JsonWriter writer, Flow value, JsonSerializer serializer)
+ => writer.WriteValue((double)value);
+ }
+}
diff --git a/Common/CommonConsole/JsonConverters/PressureConverter.cs b/Common/CommonConsole/JsonConverters/PressureConverter.cs
new file mode 100644
index 00000000..d513c108
--- /dev/null
+++ b/Common/CommonConsole/JsonConverters/PressureConverter.cs
@@ -0,0 +1,27 @@
+namespace CommonConsole.JsonConverters
+{
+ using Newtonsoft.Json;
+
+ using System;
+
+ public class PressureConverter : JsonConverter
+ {
+ public override Pressure ReadJson(JsonReader reader, Type objectType, Pressure existingValue, bool hasExistingValue, JsonSerializer serializer)
+ {
+ while (reader.ValueType != typeof(double))
+ {
+ reader.Read();
+ }
+
+ if (reader.Value is double value)
+ {
+ return value;
+ }
+
+ return existingValue;
+ }
+
+ public override void WriteJson(JsonWriter writer, Pressure value, JsonSerializer serializer)
+ => writer.WriteValue((double)value);
+ }
+}
diff --git a/Common/CommonConsole/JsonConverters/TemperatureConverter.cs b/Common/CommonConsole/JsonConverters/TemperatureConverter.cs
new file mode 100644
index 00000000..0105b5e1
--- /dev/null
+++ b/Common/CommonConsole/JsonConverters/TemperatureConverter.cs
@@ -0,0 +1,27 @@
+namespace CommonConsole.JsonConverters
+{
+ using Newtonsoft.Json;
+
+ using System;
+
+ public class TemperatureConverter : JsonConverter
+ {
+ public override Temperature ReadJson(JsonReader reader, Type objectType, Temperature existingValue, bool hasExistingValue, JsonSerializer serializer)
+ {
+ while (reader.ValueType != typeof(double))
+ {
+ reader.Read();
+ }
+
+ if (reader.Value is double value)
+ {
+ return value;
+ }
+
+ return existingValue;
+ }
+
+ public override void WriteJson(JsonWriter writer, Temperature value, JsonSerializer serializer)
+ => writer.WriteValue((double)value);
+ }
+}
diff --git a/Common/CommonConsole/JsonConverters/TimeConverter.cs b/Common/CommonConsole/JsonConverters/TimeConverter.cs
new file mode 100644
index 00000000..79ff2520
--- /dev/null
+++ b/Common/CommonConsole/JsonConverters/TimeConverter.cs
@@ -0,0 +1,27 @@
+namespace CommonConsole.JsonConverters
+{
+ using Newtonsoft.Json;
+
+ using System;
+
+ public class TimeConverter : JsonConverter