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 - + diff --git a/Common/CommonMessurementUnits/Current.cs b/Common/CommonMessurementUnits/Current.cs index 9568fe31..0be055aa 100644 --- a/Common/CommonMessurementUnits/Current.cs +++ b/Common/CommonMessurementUnits/Current.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; [JsonConverter(typeof(CurrentConverter))] - public class Current : Base + public class Current : Unit { public double MiliampereHours { diff --git a/Common/CommonMessurementUnits/Flow.cs b/Common/CommonMessurementUnits/Flow.cs index 30503235..fc1d0ed0 100644 --- a/Common/CommonMessurementUnits/Flow.cs +++ b/Common/CommonMessurementUnits/Flow.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; [JsonConverter(typeof(FlowConverter))] - public class Flow : Base + public class Flow : Unit { public double CubicMeterInHour { diff --git a/Common/CommonMessurementUnits/Pressure.cs b/Common/CommonMessurementUnits/Pressure.cs index ac2dd690..c5a27c16 100644 --- a/Common/CommonMessurementUnits/Pressure.cs +++ b/Common/CommonMessurementUnits/Pressure.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; [JsonConverter(typeof(PressureConverter))] - public class Pressure : Base + public class Pressure : Unit { public double Pascal { diff --git a/Common/CommonMessurementUnits/Temperature.cs b/Common/CommonMessurementUnits/Temperature.cs index bc845407..b633f551 100644 --- a/Common/CommonMessurementUnits/Temperature.cs +++ b/Common/CommonMessurementUnits/Temperature.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; [JsonConverter(typeof(TemperatureConverter))] - public class Temperature : Base + public class Temperature : Unit { public double Celsius { diff --git a/Common/CommonMessurementUnits/Time.cs b/Common/CommonMessurementUnits/Time.cs index 808089d1..5bc89a5d 100644 --- a/Common/CommonMessurementUnits/Time.cs +++ b/Common/CommonMessurementUnits/Time.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; [JsonConverter(typeof(TimeConverter))] - public class Time : Base + public class Time : Unit { public double Miliseconds { diff --git a/Common/CommonMessurementUnits/Base.cs b/Common/CommonMessurementUnits/Unit.cs similarity index 82% rename from Common/CommonMessurementUnits/Base.cs rename to Common/CommonMessurementUnits/Unit.cs index 41abb0f0..afdcf2fb 100644 --- a/Common/CommonMessurementUnits/Base.cs +++ b/Common/CommonMessurementUnits/Unit.cs @@ -1,6 +1,6 @@ namespace CommonMessurementUnits { - public abstract class Base + public abstract class Unit { public const int MsInSec = 1000; public const int SecInMin = 60; @@ -22,10 +22,10 @@ public override int GetHashCode() => this.value.GetHashCode(); - public static explicit operator double (Base @base) + public static explicit operator double (Unit @base) => @base?.value ?? default(double); - public static explicit operator double? (Base @base) + public static explicit operator double? (Unit @base) => @base?.value; } } diff --git a/Common/CommonMessurementUnits/Volume.cs b/Common/CommonMessurementUnits/Volume.cs index e32ba4ba..1fdd40a1 100644 --- a/Common/CommonMessurementUnits/Volume.cs +++ b/Common/CommonMessurementUnits/Volume.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; [JsonConverter(typeof(VolumeConverter))] - public class Volume : Base + public class Volume : Unit { public double Mililiter { @@ -21,10 +21,12 @@ public double CubicMeter { - get => this.value; - set => this.value = value; + get => this.value * this.Factor; + set => this.value = value / this.Factor; } + public int Factor { get; set; } = 1000; + public static implicit operator Volume(double x) => new Volume { value = x }; diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisConfigReader.cs b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisConfigReader.cs index 1a00dd47..ed4b73b0 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisConfigReader.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisConfigReader.cs @@ -1,19 +1,19 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using Xylem.Common.Hardware.WaterMeter.Genesis.Applications; -using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; -using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes; -using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterProperties; -using Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters; - -namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore +namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore { + using Newtonsoft.Json; + using Newtonsoft.Json.Converters; + + using System; + using System.Collections.Generic; + using System.Globalization; + using System.IO; + + using Xylem.Common.Hardware.WaterMeter.Genesis.Applications; + using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; + using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes; + using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.Json; + using Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters; + /// /// JSON filer reader for generation of register lists /// @@ -22,12 +22,19 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// Registers defined in configuration.json file /// - public List ConfigRegistersDefinitions; + public List ConfigRegistersDefinitions { get; set; } + = new List(); /// /// Applications defined in configuration.json file /// - public List ConfigApplicationDefinitions; + public List ConfigApplicationDefinitions { get; set; } + = new List(); + + /// + /// + /// + public IDictionary Value { get; private set; } /// /// Ctor @@ -50,416 +57,189 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore /// /// Convert file content to register list /// - /// + /// /// /// - private void Convert(String fileContent) + private void Convert(string configurationJson) { - var applicationGroups = (JObject)JsonConvert.DeserializeObject(fileContent); - ConfigRegistersDefinitions = new List(); - ConfigApplicationDefinitions = new List(); + var sections = default(IDictionary); + try { - //extract information of every application - if (applicationGroups != null) - foreach (var currentApplication in applicationGroups) - { - var o = (JObject)currentApplication.Value; - var application = new ApplicationDefinition(); - Byte applicationAddress = 0; + sections = JsonConvert + .DeserializeObject>(configurationJson, SerializerSettings) + ?? new Dictionary(); + } + catch (Exception e) + { + sections = new Dictionary(); + } - foreach (var groupProp in o) + this.Value = sections; + + foreach (var sectionKVP in sections) + { + var appId = sectionKVP.Value.Id; + var appName = sectionKVP.Key; + + this.ConfigApplicationDefinitions.Add(new ApplicationDefinition + { + AppId = appId, + AppName = appName + }); + + var section = sectionKVP.Value; + + if (section is null) + { + continue; + } + + var registers = section.Registers; + + if (registers is null) + { + continue; + } + + foreach (var registerKVP in registers) + { + var register = registerKVP.Value; + + if (register is null) + { + continue; + } + + var details = register.Details; + + if (details is null) + { + continue; + } + + var regId = register.Id; + + foreach (var detail in details) + { + var values = detail.Values; + + this.ConfigRegistersDefinitions.Add(new RegisterDefinition { - try - { - if (groupProp.Key == "id") - { - applicationAddress = groupProp.Value.Value(); - application.AppName = currentApplication.Key; - application.AppId = applicationAddress; - ConfigApplicationDefinitions.Add(application); - } - else if (groupProp.Key == "registers") - { - foreach (var registers in groupProp.Value) - { - var register = (JProperty)registers; - - try - { - foreach (var registerJ in register.Value) - { - var reg = (JProperty)registerJ; - - Byte? registerAddress = null; - if (reg.Name == "id") - { - registerAddress = (Byte)reg.Value; - } - - if (reg.Name == "details") - { - var details = ((JArray)reg.Value); - - foreach (var jdetail in details.Children()) - { - var actualRegister = new RegisterDefinition(); - var idTag = reg.Parent.First(f => ((JProperty)f).Name == "id"); - var id = (Byte)(JProperty)idTag; //.Value(); - - if (registerAddress.HasValue) - { - throw new Exception("invalid json cast"); - } - - actualRegister.RegAddressInApp = id; - actualRegister.AppName = currentApplication.Key; - actualRegister.AppAddress = applicationAddress; - actualRegister.RegisterDetail = new RegisterDetail(); - actualRegister.RegisterName = register.Name; - var detailO = (JObject)jdetail; - JProperty detail; - detail = detailO.Property("privilege"); - if (detail.Name == "privilege") - { - actualRegister.RegisterDetail.Privilege = - JsonConvert.DeserializeObject( - detail.Value.ToString(), Settings); - } - - detail = detailO.Property("type"); - if (detail.Name == "type") - { - actualRegister.DataType = - typeof(String); // detail.Value.ToString(); - - switch (detail.Value.ToString().ToLower()) - { - case "bool_t": - actualRegister.DataType = typeof(Boolean); - break; - case "rpc": - actualRegister.DataType = typeof(Rpc); - break; - case "string": - actualRegister.DataType = typeof(String); - break; - case "uint32_t": - actualRegister.DataType = typeof(UInt32); - break; - case "time_t": - actualRegister.DataType = typeof(TimeT); - break; - case "status_t": - actualRegister.DataType = typeof(StatusT); - break; - case "uint16_t": - actualRegister.DataType = typeof(UInt16); - break; - case "uint8_t": - actualRegister.DataType = typeof(byte); - break; - case "enum8": - actualRegister.DataType = typeof(Enum8); - break; - case "uint64_t": - actualRegister.DataType = typeof(UInt64); - break; - case "uint96_t": - actualRegister.DataType = typeof(UInt96); - break; - case "int8_t": - actualRegister.DataType = typeof(sbyte); - break; - case "int32_t": - actualRegister.DataType = typeof(Int32); - break; - case "int64_t": - actualRegister.DataType = typeof(Int64); - break; - case "int16_t": - actualRegister.DataType = typeof(Int16); - break; - } - } - - detail = detailO.Property("description"); - if (detail.Name == "description") - { - actualRegister.RegisterDetail.Description = - detail.Value.ToString(); - } - - detail = detailO.Property("version"); - if (detail.Name == "version") - { - actualRegister.RegisterDetail.Version = - JsonConvert.DeserializeObject( - detail.Value.ToString()); - } - - detail = detailO.Property("values"); - if (detail != null && detail.Name == "values") - { - foreach (var dValues in detail.Children().First()) - { - switch (((JProperty)dValues).Name) - { - case "default": - actualRegister.Default = - (Int64)((JProperty)dValues).Value; - break; - case "maximum": - actualRegister.Maximum = - (Int64)((JProperty)dValues).Value; - break; - case "minimum": - actualRegister.Minimum = - (Int64)((JProperty)dValues).Value; - break; - } - } - } - - detail = detailO.Property(StaticType.StaticTypeFieldIdentifier); - if (detail != null && detail.Name == - StaticType.StaticTypeFieldIdentifier) - { - actualRegister.RestoreCapability = - new StaticType(detail.Value.ToString()); - } - - ConfigRegistersDefinitions.Add(actualRegister); - } - } - } - } - catch (Exception ) - { - //todo log ex - } - } - } - } - catch (Exception ) - { - //todo log ex - } - } - } - } - catch (Exception ) - { - // ignored - } - - - ////tofile - var listOfRegisters = new List(); - foreach (var item in ConfigRegistersDefinitions) - { - if (item is RegisterDefinition reg) - { - if (listOfRegisters.Any(a => a.GetIdent() == reg.GetIdent())) - { - var oldItem = listOfRegisters.First(a => a.GetIdent() == reg.GetIdent()); - if (oldItem.RegisterDetail.Version.Last < reg.RegisterDetail.Version.Last) - { - listOfRegisters.Remove(oldItem); - listOfRegisters.Add(reg); - } - } - else - { - listOfRegisters.Add(reg); + AppAddress = appId, + AppName = appName, + DataType = this.GetType(detail.Type), + Default = values?.Default is long d ? d : default(long?), + IsAvailable = default(bool), + Maximum = values?.Maximum is long max ? max : default(long?), + Minimum = values?.Minimum is long min ? min : default(long?), + RegAddressInApp = regId, + // RegisterAddress = new byte[] { appId, regId }, + RegisterDetail = detail, + RegisterName = registerKVP.Key, + RestoreCapability = new StaticType(detail.StaticType) + }); } } } - //#region create a file for my american friends - //var sbCSV = new StringBuilder(); - - //sbCSV.AppendLine("Filter;Ident;First;Last"); - //foreach (var item in ConfigRegistersDefinitions) - //{ - // if (item is RegisterDefinition Reg) - // { - // sbCSV.AppendLine($"ALL;{Reg.GetIdent()};{Reg.RegisterDetail.Version.First}; {Reg.RegisterDetail.Version.Last};"); - // } - //} - - //foreach (var item in lsitOfRegisters) - //{ - // sbCSV.AppendLine($"InUse;{item.GetIdent()};{item.RegisterDetail.Version.First}; {item.RegisterDetail.Version.Last};"); - //} - - //foreach (var item in lsitOfRegisters) - //{ - // sbCSV.AppendLine($"InUse;{item.GetIdent()};{item.RegisterDetail.Version.First}; {item.RegisterDetail.Version.Last};"); - //} - //var k = sbCSV.ToString(); - - //sbCSV.AppendLine("###"); - //sbCSV.AppendLine("###"); - //sbCSV.AppendLine("###"); - - //sbCSV.AppendLine("App;Version"); - //foreach (var item in lsitOfRegisters) - //{ - // sbCSV.AppendLine($"InUse;{item.GetIdent()};{item.RegisterDetail.Version.First}; {item.RegisterDetail.Version.Last};"); - //} - - //foreach (var grpReg in lsitOfRegisters.GroupBy(g => g.AppName)) - //{ - - // sb.AppendLine($"public static class {grpReg.Key} {{"); - // foreach (var item in grpReg) - // { - // sbCSV.Append($"{grpReg.Key};{item.RegisterName};{item.DataType.Name};{item.RegisterDetail.Description}"); - - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl1.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl2.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl3.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl4.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl5.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl6.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl7.ToString()}"); - // sbCSV.Append($";{ item.RegisterDetail.Privilege.Lvl8.ToString()}"); - - - // sb.AppendLine($"public static readonly RegisterDefinition {item.RegisterName} = new RegisterDefinition() {{"); - // sb.AppendLine($"DataType = typeof({item.DataType.Name}),"); - // sb.AppendLine($"Address = new byte[2] {{ (byte){item.RegisterAddress[0]}, (byte){item.RegisterAddress[1]} }},"); - - // sb.AppendLine($"Default = new long?("); - // if (item.Default.HasValue) - // { - // sb.Append(item.Default.Value); - // sbCSV.Append($";{item.Default.Value}"); - // } - // else - // { - // sbCSV.Append(";-"); - // } - - // sb.Append($"),"); - - // sb.AppendLine($"Maximum = new long?("); - // if (item.Maximum.HasValue) - // { - // sb.Append(item.Maximum.Value); - // sbCSV.Append($";{item.Maximum.Value}"); - // } - // else - // { - // sbCSV.Append(";-"); - // } - // sb.Append($"),"); - - // sb.AppendLine($"Minimum = new long?("); - // if (item.Minimum.HasValue) - // { - // sb.Append(item.Minimum.Value); - // sbCSV.Append($";{item.Minimum.Value}"); - // } - // else - // { - // sbCSV.Append(";-"); - // } - // sb.Append($"),"); - // sb.AppendLine($"Detail = new Detail(){{"); - // sb.AppendLine($" Description = \"{item.RegisterDetail.Description}\","); - // sb.AppendLine($" Version = new Version(1,{item.RegisterDetail.Version.Last}),"); - // sb.AppendLine($" Privilege = new Privilege(){{"); - // // - - // sb.AppendLine($" Lvl1 = Access.{item.RegisterDetail.Privilege.Lvl1.ToString()},"); - // sb.AppendLine($" Lvl2 = Access.{item.RegisterDetail.Privilege.Lvl2.ToString()},"); - // sb.AppendLine($" Lvl3 = Access.{item.RegisterDetail.Privilege.Lvl3.ToString()},"); - // sb.AppendLine($" Lvl4 = Access.{item.RegisterDetail.Privilege.Lvl4.ToString()},"); - // sb.AppendLine($" Lvl5 = Access.{item.RegisterDetail.Privilege.Lvl5.ToString()},"); - // sb.AppendLine($" Lvl6 = Access.{item.RegisterDetail.Privilege.Lvl6.ToString()},"); - // sb.AppendLine($" Lvl7 = Access.{item.RegisterDetail.Privilege.Lvl7.ToString()},"); - // sb.AppendLine($" Lvl8 = Access.{item.RegisterDetail.Privilege.Lvl8.ToString()},"); - - // sb.AppendLine($" }}"); - // sb.AppendLine($"}}"); - // sb.AppendLine($"}};"); - // sbCSV.AppendLine(";"); - // } - // sb.AppendLine($"}}"); - //} - //#endregion - //var z = sbCSV.ToString(); - - //var code = sb.ToString(); - } - - internal class LvlConverter : JsonConverter - { - public override Boolean CanConvert(Type t) => t == typeof(Access) || t == typeof(Access?); - - public override Object ReadJson(JsonReader reader, Type t, Object existingValue, JsonSerializer serializer) - { - if (reader.TokenType == JsonToken.Null) - { - return null; - } - - var value = serializer.Deserialize(reader); - switch (value) - { - case "NA": - return Access.Na; - case "RO": - return Access.Ro; - case "RW": - return Access.Rw; - case "WO": - return Access.Wo; - } - throw new Exception("Cannot unmarshal type Lvl"); - } - - public override void WriteJson(JsonWriter writer, Object untypedValue, JsonSerializer serializer) - { - if (untypedValue == null) - { - serializer.Serialize(writer, null); - return; - } - var value = (Access)untypedValue; - switch (value) - { - case Access.Na: - serializer.Serialize(writer, "NA"); - return; - case Access.Ro: - serializer.Serialize(writer, "RO"); - return; - case Access.Rw: - serializer.Serialize(writer, "RW"); - return; - case Access.Wo: - serializer.Serialize(writer, "WO"); - return; - } - throw new Exception("Cannot marshal type Lvl"); - } - public static readonly LvlConverter Singleton = new LvlConverter(); } /// /// Settings /// - public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings + public static readonly JsonSerializerSettings SerializerSettings = new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Ignore, DateParseHandling = DateParseHandling.None, Converters = { - LvlConverter.Singleton, + AccessConverter.Singleton, new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } }, }; + + private Type GetType(string value) + { + switch (value.ToLower()) + { + case "bool_t": return typeof(Boolean); + case "rpc": return typeof(Rpc); + case "string": return typeof(String); + case "uint32_t": return typeof(UInt32); + case "time_t": return typeof(TimeT); + case "status_t": return typeof(StatusT); + case "uint16_t": return typeof(UInt16); + case "uint8_t": return typeof(byte); + case "enum8": return typeof(Enum8); + case "uint64_t": return typeof(UInt64); + case "uint96_t": return typeof(UInt96); + case "int8_t": return typeof(sbyte); + case "int32_t": return typeof(Int32); + case "int64_t": return typeof(Int64); + case "int16_t": return typeof(Int16); + default: throw new Exception($"Type {value} not recognized!"); + } + } + } + + /// + /// + /// + public class AccessConverter : JsonConverter + { + /// + /// + /// + /// + /// + public override bool CanConvert(Type t) => t == typeof(Access) || t == typeof(Access?); + + /// + /// + /// + /// + /// + /// + /// + /// + public override Object ReadJson(JsonReader reader, Type t, 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 untypedValue, JsonSerializer serializer) + { + if (untypedValue is Access access) + { + writer.WriteValue(access.ToString()); + } + else + { + throw new Exception("Cannot marshal type Lvl"); + } + } + + /// + /// + /// + public static readonly AccessConverter Singleton = new AccessConverter(); } } diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisCore.csproj b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisCore.csproj index 67763bd3..fdfcad46 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisCore.csproj +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/GenesisCore.csproj @@ -372,7 +372,7 @@ - +