diff --git a/.gitignore b/.gitignore index 323da9f6..e0f815c3 100644 --- a/.gitignore +++ b/.gitignore @@ -400,3 +400,4 @@ FodyWeavers.xsd /Common/CommonConsole /Common/Common.v3.ncrunchsolution /TBF_V2/Sources/TBF/TBF/BenchControl/TestMethods/GenesisCommunication.zip +/Common/Hardware/WaterMeter/Genesis/GenesisCore/configuration2013.json diff --git a/Common/.shared/NlogConfig.xml b/Common/.shared/NlogConfig.xml index fbf263fd..1735f807 100644 --- a/Common/.shared/NlogConfig.xml +++ b/Common/.shared/NlogConfig.xml @@ -3,84 +3,84 @@ - - - - - + + - - + + + + - - - - - + + - - - + + + - - - - - + + - - + + - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs index c914511d..3dcbf8a7 100644 --- a/Common/.shared/SharedAssemblyInfo.cs +++ b/Common/.shared/SharedAssemblyInfo.cs @@ -13,4 +13,4 @@ using System.Reflection; // //[assembly: AssemblyVersion("1.2.*.0")] -[assembly: AssemblyVersion("2.7.6.*")] +[assembly: AssemblyVersion("2.8.10.*")] diff --git a/Common/.vs/Common/config/applicationhost.config b/Common/.vs/Common/config/applicationhost.config index 4b78051e..8f2db308 100644 --- a/Common/.vs/Common/config/applicationhost.config +++ b/Common/.vs/Common/config/applicationhost.config @@ -160,6 +160,22 @@ + + + + + + + + + + + + + + + + diff --git a/Common/.vs/config/applicationhost.config b/Common/.vs/config/applicationhost.config index a894c3cf..cd69abb2 100644 --- a/Common/.vs/config/applicationhost.config +++ b/Common/.vs/config/applicationhost.config @@ -155,7 +155,7 @@ - + @@ -168,6 +168,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Common.sln b/Common/Common.sln index 05500228..be29ee39 100644 --- a/Common/Common.sln +++ b/Common/Common.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.33423.255 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36310.24 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utils", "Utils", "{7A0EE7B8-6B7E-41E9-B679-319C8CA48CF1}" EndProject @@ -101,8 +101,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IrdaDemo", "Ui\IrdaDemo\Ird EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WaterMeterRegisters", "Hardware\WaterMeter\WaterMeterCore\WaterMeterRegisters\WaterMeterRegisters.csproj", "{26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProductionUiCordonelLegacy", "ProductionUiCordonel\ProductionUiCordonelLegacy.csproj", "{D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonCore.Configuration", "CommonCore.Configuration\CommonCore.Configuration.csproj", "{9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProductionOrderCore", "Logic\ProductionOrderCore\ProductionOrderCore.csproj", "{6D2777BB-7A88-466D-A49B-3266F9BF0160}" @@ -334,20 +332,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debug", "Debug", "{7C77A79B EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TempPE", "TempPE", "{91CA9896-2288-4967-8991-AC49A77B6058}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LaaPackages", "LaaPackages", "{2E31C385-4FFC-473E-9C00-D7DC48140704}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.SqlClient", "LaaPackages\LaaPackages.SqlClient\LaaPackages.SqlClient.csproj", "{F90B940C-9A83-496D-AAE0-11CD02CE0A22}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.HttpClient", "LaaPackages\LaaPackages.HttpClient\LaaPackages.HttpClient.csproj", "{C9816412-7752-4F7A-8BD2-765DB6D58B3C}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stichproben", "Stichproben\Stichproben.csproj", "{F69A79FA-548D-4E21-887E-01FABDAD9E73}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.Features.Cordonel", "LaaPackages\LaaPackages.Features.Cordonel\LaaPackages.Features.Cordonel.csproj", "{8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.Extensions", "LaaPackages\LaaPackages.Extensions\LaaPackages.Extensions.csproj", "{15A06398-ECB6-49C9-ACB4-52A495A886A6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProductionWeb.Resources", "LaaPackages\LaaProductionWeb.Resources\LaaProductionWeb.Resources.csproj", "{DA65E376-3D35-4D96-913A-7197FCA6DF48}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserAccessCtrl", "Utils\UserAccessCtrl\UserAccessCtrl.csproj", "{2D55BBD1-5373-484C-8781-C6ECEAFC2A90}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassAccess", "Utils\ClassAccess\ClassAccess.csproj", "{30BF7357-0B6C-498D-8123-5AACC66B3E5F}" @@ -364,10 +350,21 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockGenesis", "Hardware\Wat EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonConsole", "CommonConsole\CommonConsole.csproj", "{AFC428F5-0141-4A3F-BEF2-470A89D972F6}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SIRT", "SIRT", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LaaPackages", "LaaPackages", "{7B7EC9A1-2091-4CCD-9F01-C579ABD9241D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaProductionWeb.Resources", "LaaPackages\LaaProductionWeb.Resources\LaaProductionWeb.Resources.csproj", "{9E070488-15DE-418A-8606-5B79056C6E9F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.Features.Cordonel", "LaaPackages\LaaPackages.Features.Cordonel\LaaPackages.Features.Cordonel.csproj", "{8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.Extensions", "LaaPackages\LaaPackages.Extensions\LaaPackages.Extensions.csproj", "{15A06398-ECB6-49C9-ACB4-52A495A886A6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.SqlClient", "LaaPackages\LaaPackages.SqlClient\LaaPackages.SqlClient.csproj", "{F90B940C-9A83-496D-AAE0-11CD02CE0A22}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LaaPackages.HttpClient", "LaaPackages\LaaPackages.HttpClient\LaaPackages.HttpClient.csproj", "{C9816412-7752-4F7A-8BD2-765DB6D58B3C}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - Utils\DateTimeServerShared\DateTimeServerShared.projitems*{4806d89a-fbfb-41bc-aaa7-2242444bf55a}*SharedItemsImports = 4 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution _MANUAL_CONTROL|Any CPU = _MANUAL_CONTROL|Any CPU _MANUAL_CONTROL|Mixed Platforms = _MANUAL_CONTROL|Mixed Platforms @@ -397,6 +394,10 @@ Global ReleaseTest|Mixed Platforms = ReleaseTest|Mixed Platforms ReleaseTest|x64 = ReleaseTest|x64 ReleaseTest|x86 = ReleaseTest|x86 + VPN_Debug|Any CPU = VPN_Debug|Any CPU + VPN_Debug|Mixed Platforms = VPN_Debug|Mixed Platforms + VPN_Debug|x64 = VPN_Debug|x64 + VPN_Debug|x86 = VPN_Debug|x86 XP32bit|Any CPU = XP32bit|Any CPU XP32bit|Mixed Platforms = XP32bit|Mixed Platforms XP32bit|x64 = XP32bit|x64 @@ -459,6 +460,14 @@ Global {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.ReleaseTest|x64.Build.0 = Release|x64 {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.ReleaseTest|x86.ActiveCfg = Release|x86 {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.ReleaseTest|x86.Build.0 = Release|x86 + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -523,6 +532,14 @@ Global {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.ReleaseTest|x64.Build.0 = Release|x64 {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.ReleaseTest|x86.ActiveCfg = Release|x86 {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.ReleaseTest|x86.Build.0 = Release|x86 + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {0E524D43-7B66-45CD-AA74-41D51AFC3D99}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -587,6 +604,14 @@ Global {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.ReleaseTest|x64.Build.0 = Release|x64 {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.ReleaseTest|x86.ActiveCfg = Release|x86 {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.ReleaseTest|x86.Build.0 = Release|x86 + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {86E69395-AE63-46E5-9CF3-BF8B2A4DC76E}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -651,6 +676,14 @@ Global {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.ReleaseTest|x64.Build.0 = Release|Any CPU {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.ReleaseTest|x86.Build.0 = Release|Any CPU + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.XP32bit|Any CPU.ActiveCfg = PerformTest|Any CPU {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.XP32bit|Any CPU.Build.0 = PerformTest|Any CPU {7543AFCB-F5AF-44AF-83C9-23164474C1E9}.XP32bit|Mixed Platforms.ActiveCfg = PerformTest|Any CPU @@ -715,6 +748,14 @@ Global {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.ReleaseTest|x64.Build.0 = Release|Any CPU {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.ReleaseTest|x86.Build.0 = Release|Any CPU + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.XP32bit|Any CPU.ActiveCfg = PerformTest|Any CPU {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.XP32bit|Any CPU.Build.0 = PerformTest|Any CPU {42E9198C-ED2C-4BC8-B0A1-55D91D8F1E90}.XP32bit|Mixed Platforms.ActiveCfg = PerformTest|Any CPU @@ -779,6 +820,14 @@ Global {494AB06C-10C4-43F8-BC8A-92088EB35867}.ReleaseTest|x64.Build.0 = Release|Any CPU {494AB06C-10C4-43F8-BC8A-92088EB35867}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {494AB06C-10C4-43F8-BC8A-92088EB35867}.ReleaseTest|x86.Build.0 = Release|Any CPU + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {494AB06C-10C4-43F8-BC8A-92088EB35867}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {494AB06C-10C4-43F8-BC8A-92088EB35867}.XP32bit|Any CPU.ActiveCfg = PerformTest|Any CPU {494AB06C-10C4-43F8-BC8A-92088EB35867}.XP32bit|Any CPU.Build.0 = PerformTest|Any CPU {494AB06C-10C4-43F8-BC8A-92088EB35867}.XP32bit|Mixed Platforms.ActiveCfg = PerformTest|Any CPU @@ -843,6 +892,14 @@ Global {AE928623-E961-44E2-ACD2-A3902167FDA4}.ReleaseTest|x64.Build.0 = Release|Any CPU {AE928623-E961-44E2-ACD2-A3902167FDA4}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {AE928623-E961-44E2-ACD2-A3902167FDA4}.ReleaseTest|x86.Build.0 = Release|Any CPU + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {AE928623-E961-44E2-ACD2-A3902167FDA4}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {AE928623-E961-44E2-ACD2-A3902167FDA4}.XP32bit|Any CPU.ActiveCfg = PerformTest|Any CPU {AE928623-E961-44E2-ACD2-A3902167FDA4}.XP32bit|Any CPU.Build.0 = PerformTest|Any CPU {AE928623-E961-44E2-ACD2-A3902167FDA4}.XP32bit|Mixed Platforms.ActiveCfg = PerformTest|Any CPU @@ -907,6 +964,14 @@ Global {4B88B0D3-E791-4774-9521-EABEACDC420E}.ReleaseTest|x64.Build.0 = Release|x64 {4B88B0D3-E791-4774-9521-EABEACDC420E}.ReleaseTest|x86.ActiveCfg = Release|x86 {4B88B0D3-E791-4774-9521-EABEACDC420E}.ReleaseTest|x86.Build.0 = Release|x86 + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {4B88B0D3-E791-4774-9521-EABEACDC420E}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {4B88B0D3-E791-4774-9521-EABEACDC420E}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {4B88B0D3-E791-4774-9521-EABEACDC420E}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {4B88B0D3-E791-4774-9521-EABEACDC420E}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -968,6 +1033,14 @@ Global {95A50087-99EE-4349-9A17-C547290DB42F}.ReleaseTest|x64.Build.0 = Release|Any CPU {95A50087-99EE-4349-9A17-C547290DB42F}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {95A50087-99EE-4349-9A17-C547290DB42F}.ReleaseTest|x86.Build.0 = Release|Any CPU + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {95A50087-99EE-4349-9A17-C547290DB42F}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {95A50087-99EE-4349-9A17-C547290DB42F}.XP32bit|Any CPU.ActiveCfg = PerformTest|Any CPU {95A50087-99EE-4349-9A17-C547290DB42F}.XP32bit|Any CPU.Build.0 = PerformTest|Any CPU {95A50087-99EE-4349-9A17-C547290DB42F}.XP32bit|Mixed Platforms.ActiveCfg = PerformTest|Any CPU @@ -1032,6 +1105,14 @@ Global {F581264D-3C20-4E4F-9E74-2606869AAAB7}.ReleaseTest|x64.Build.0 = Release|Any CPU {F581264D-3C20-4E4F-9E74-2606869AAAB7}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {F581264D-3C20-4E4F-9E74-2606869AAAB7}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {F581264D-3C20-4E4F-9E74-2606869AAAB7}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {F581264D-3C20-4E4F-9E74-2606869AAAB7}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {F581264D-3C20-4E4F-9E74-2606869AAAB7}.XP32bit|Any CPU.Build.0 = Release|Any CPU {F581264D-3C20-4E4F-9E74-2606869AAAB7}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1096,6 +1177,14 @@ Global {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.ReleaseTest|x64.Build.0 = Release|Any CPU {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.ReleaseTest|x86.Build.0 = Release|Any CPU + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.XP32bit|Any CPU.Build.0 = Release|Any CPU {1057AD21-BA22-4CAB-B3FE-88C5C9980E6A}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1160,6 +1249,14 @@ Global {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.ReleaseTest|x64.Build.0 = Release|Any CPU {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.XP32bit|Any CPU.Build.0 = Release|Any CPU {F7E3DF42-4D35-4A0C-9182-90438F9956E1}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1224,6 +1321,14 @@ Global {8203ABB8-38E5-472E-A742-33F38B7A74A6}.ReleaseTest|x64.Build.0 = ReleaseTest|x64 {8203ABB8-38E5-472E-A742-33F38B7A74A6}.ReleaseTest|x86.ActiveCfg = ReleaseTest|x86 {8203ABB8-38E5-472E-A742-33F38B7A74A6}.ReleaseTest|x86.Build.0 = ReleaseTest|x86 + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {8203ABB8-38E5-472E-A742-33F38B7A74A6}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {8203ABB8-38E5-472E-A742-33F38B7A74A6}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {8203ABB8-38E5-472E-A742-33F38B7A74A6}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {8203ABB8-38E5-472E-A742-33F38B7A74A6}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1288,6 +1393,14 @@ Global {04201E95-90A0-4B73-A72F-379739B2A3AE}.ReleaseTest|x64.Build.0 = Release|x64 {04201E95-90A0-4B73-A72F-379739B2A3AE}.ReleaseTest|x86.ActiveCfg = Release|x86 {04201E95-90A0-4B73-A72F-379739B2A3AE}.ReleaseTest|x86.Build.0 = Release|x86 + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {04201E95-90A0-4B73-A72F-379739B2A3AE}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {04201E95-90A0-4B73-A72F-379739B2A3AE}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {04201E95-90A0-4B73-A72F-379739B2A3AE}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {04201E95-90A0-4B73-A72F-379739B2A3AE}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1352,6 +1465,14 @@ Global {D32ED790-7E1E-435B-8619-9F906C992066}.ReleaseTest|x64.Build.0 = Release|x64 {D32ED790-7E1E-435B-8619-9F906C992066}.ReleaseTest|x86.ActiveCfg = Release|x86 {D32ED790-7E1E-435B-8619-9F906C992066}.ReleaseTest|x86.Build.0 = Release|x86 + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {D32ED790-7E1E-435B-8619-9F906C992066}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {D32ED790-7E1E-435B-8619-9F906C992066}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {D32ED790-7E1E-435B-8619-9F906C992066}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {D32ED790-7E1E-435B-8619-9F906C992066}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1416,6 +1537,14 @@ Global {29617814-313E-409E-AA5D-59C78A9D4DF1}.ReleaseTest|x64.Build.0 = Release|x64 {29617814-313E-409E-AA5D-59C78A9D4DF1}.ReleaseTest|x86.ActiveCfg = Release|x86 {29617814-313E-409E-AA5D-59C78A9D4DF1}.ReleaseTest|x86.Build.0 = Release|x86 + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {29617814-313E-409E-AA5D-59C78A9D4DF1}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {29617814-313E-409E-AA5D-59C78A9D4DF1}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {29617814-313E-409E-AA5D-59C78A9D4DF1}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {29617814-313E-409E-AA5D-59C78A9D4DF1}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1480,6 +1609,14 @@ Global {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.ReleaseTest|x64.Build.0 = Release|Any CPU {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.ReleaseTest|x86.Build.0 = Release|Any CPU + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.XP32bit|Any CPU.Build.0 = Release|Any CPU {2E139F63-B6FE-4EA9-A098-85364FE9B26C}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1544,6 +1681,14 @@ Global {72037E89-4F63-4B3F-BEFF-4138E578CE99}.ReleaseTest|x64.Build.0 = Release|x64 {72037E89-4F63-4B3F-BEFF-4138E578CE99}.ReleaseTest|x86.ActiveCfg = Release|x86 {72037E89-4F63-4B3F-BEFF-4138E578CE99}.ReleaseTest|x86.Build.0 = Release|x86 + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {72037E89-4F63-4B3F-BEFF-4138E578CE99}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {72037E89-4F63-4B3F-BEFF-4138E578CE99}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {72037E89-4F63-4B3F-BEFF-4138E578CE99}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {72037E89-4F63-4B3F-BEFF-4138E578CE99}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1608,6 +1753,14 @@ Global {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.ReleaseTest|x64.Build.0 = Release|Any CPU {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.ReleaseTest|x86.Build.0 = Release|Any CPU + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.XP32bit|Any CPU.ActiveCfg = PerformTest|Any CPU {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.XP32bit|Any CPU.Build.0 = PerformTest|Any CPU {63E0AC5E-B7C8-4363-A2FE-BE489E648FF0}.XP32bit|Mixed Platforms.ActiveCfg = PerformTest|Any CPU @@ -1672,6 +1825,14 @@ Global {F4AAF7E6-7333-4284-B735-E32DEB076C64}.ReleaseTest|x64.Build.0 = Release|Any CPU {F4AAF7E6-7333-4284-B735-E32DEB076C64}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {F4AAF7E6-7333-4284-B735-E32DEB076C64}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {F4AAF7E6-7333-4284-B735-E32DEB076C64}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {F4AAF7E6-7333-4284-B735-E32DEB076C64}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {F4AAF7E6-7333-4284-B735-E32DEB076C64}.XP32bit|Any CPU.Build.0 = Release|Any CPU {F4AAF7E6-7333-4284-B735-E32DEB076C64}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1734,6 +1895,14 @@ Global {6CCDB656-C676-4360-BABA-C4596AAD175D}.ReleaseTest|x64.Build.0 = Release|x64 {6CCDB656-C676-4360-BABA-C4596AAD175D}.ReleaseTest|x86.ActiveCfg = Release|x86 {6CCDB656-C676-4360-BABA-C4596AAD175D}.ReleaseTest|x86.Build.0 = Release|x86 + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {6CCDB656-C676-4360-BABA-C4596AAD175D}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {6CCDB656-C676-4360-BABA-C4596AAD175D}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {6CCDB656-C676-4360-BABA-C4596AAD175D}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {6CCDB656-C676-4360-BABA-C4596AAD175D}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1798,6 +1967,14 @@ Global {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.ReleaseTest|x64.Build.0 = Release|Any CPU {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.ReleaseTest|x86.Build.0 = Release|Any CPU + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.XP32bit|Any CPU.Build.0 = Release|Any CPU {1B02C79E-0B19-43E2-8F6B-71EF0C786C97}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1862,6 +2039,14 @@ Global {60765BF4-6165-4F2F-8756-1C699826265D}.ReleaseTest|x64.Build.0 = Release|Any CPU {60765BF4-6165-4F2F-8756-1C699826265D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {60765BF4-6165-4F2F-8756-1C699826265D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {60765BF4-6165-4F2F-8756-1C699826265D}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {60765BF4-6165-4F2F-8756-1C699826265D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {60765BF4-6165-4F2F-8756-1C699826265D}.XP32bit|Any CPU.Build.0 = Release|Any CPU {60765BF4-6165-4F2F-8756-1C699826265D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -1926,6 +2111,14 @@ Global {3DD94AD1-D153-46DD-8550-645C57EA8326}.ReleaseTest|x64.Build.0 = Release|x64 {3DD94AD1-D153-46DD-8550-645C57EA8326}.ReleaseTest|x86.ActiveCfg = Release|x86 {3DD94AD1-D153-46DD-8550-645C57EA8326}.ReleaseTest|x86.Build.0 = Release|x86 + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {3DD94AD1-D153-46DD-8550-645C57EA8326}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {3DD94AD1-D153-46DD-8550-645C57EA8326}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {3DD94AD1-D153-46DD-8550-645C57EA8326}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {3DD94AD1-D153-46DD-8550-645C57EA8326}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -1990,6 +2183,14 @@ Global {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.ReleaseTest|x64.Build.0 = Release|Any CPU {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.XP32bit|Any CPU.Build.0 = Release|Any CPU {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2054,6 +2255,14 @@ Global {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.ReleaseTest|x64.Build.0 = Release|Any CPU {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.ReleaseTest|x86.Build.0 = Release|Any CPU + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.XP32bit|Any CPU.Build.0 = Release|Any CPU {407E05EE-F1DE-4020-83AD-8C18EDE6B32C}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2118,6 +2327,14 @@ Global {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.ReleaseTest|x64.Build.0 = Release|Any CPU {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.ReleaseTest|x86.Build.0 = Release|Any CPU + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.XP32bit|Any CPU.Build.0 = Release|Any CPU {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2126,70 +2343,6 @@ Global {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.XP32bit|x64.Build.0 = Release|x64 {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.XP32bit|x86.ActiveCfg = Release|Any CPU {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}.XP32bit|x86.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|Any CPU.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|Any CPU.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|Mixed Platforms.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|x64.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|x64.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|x86.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.COM|x86.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|x64.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|x64.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|x86.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Debug|x86.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|Any CPU.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|x64.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|x64.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|x86.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.GenesisDisplayTool_V01|x86.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|Any CPU.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|Any CPU.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|Mixed Platforms.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|x64.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|x64.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|x86.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.PerformTest|x86.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|Any CPU.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|x64.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|x64.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|x86.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.Release|x86.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|x64.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|x64.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|x86.ActiveCfg = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.ReleaseTest|x86.Build.0 = Release|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|Any CPU.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|Any CPU.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|Mixed Platforms.Build.0 = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|x64.ActiveCfg = Debug|x64 - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|x64.Build.0 = Debug|x64 - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|x86.ActiveCfg = Debug|Any CPU - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4}.XP32bit|x86.Build.0 = Debug|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}._MANUAL_CONTROL|Any CPU.ActiveCfg = _MANUAL_CONTROL|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}._MANUAL_CONTROL|Any CPU.Build.0 = _MANUAL_CONTROL|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = _MANUAL_CONTROL|Any CPU @@ -2246,6 +2399,14 @@ Global {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.ReleaseTest|x64.Build.0 = Release|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.ReleaseTest|x86.Build.0 = Release|Any CPU + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.XP32bit|Any CPU.Build.0 = Release|Any CPU {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2310,6 +2471,14 @@ Global {6D2777BB-7A88-466D-A49B-3266F9BF0160}.ReleaseTest|x64.Build.0 = Release|Any CPU {6D2777BB-7A88-466D-A49B-3266F9BF0160}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {6D2777BB-7A88-466D-A49B-3266F9BF0160}.ReleaseTest|x86.Build.0 = Release|Any CPU + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {6D2777BB-7A88-466D-A49B-3266F9BF0160}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {6D2777BB-7A88-466D-A49B-3266F9BF0160}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {6D2777BB-7A88-466D-A49B-3266F9BF0160}.XP32bit|Any CPU.Build.0 = Release|Any CPU {6D2777BB-7A88-466D-A49B-3266F9BF0160}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2374,6 +2543,14 @@ Global {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.ReleaseTest|x64.Build.0 = Release|Any CPU {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.ReleaseTest|x86.Build.0 = Release|Any CPU + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.XP32bit|Any CPU.Build.0 = Release|Any CPU {315E94B8-B82F-4B25-B5BD-297DF3BC1D54}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2438,6 +2615,14 @@ Global {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.ReleaseTest|x64.Build.0 = Release|Any CPU {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.ReleaseTest|x86.Build.0 = Release|Any CPU + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.XP32bit|Any CPU.Build.0 = Release|Any CPU {2C6378C6-6BA1-4CEE-8992-8404D8369A90}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2502,6 +2687,14 @@ Global {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.ReleaseTest|x64.Build.0 = Release|Any CPU {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.ReleaseTest|x86.Build.0 = Release|Any CPU + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.XP32bit|Any CPU.Build.0 = Release|Any CPU {A33E3C6D-EAAE-4A20-A0EE-F9E6922FD029}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2566,6 +2759,14 @@ Global {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.ReleaseTest|x64.Build.0 = Release|Any CPU {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.ReleaseTest|x86.Build.0 = Release|Any CPU + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.XP32bit|Any CPU.ActiveCfg = Debug|Any CPU {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.XP32bit|Any CPU.Build.0 = Debug|Any CPU {D0C8D887-ED52-40AB-A069-90BCE0E801E2}.XP32bit|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -2630,6 +2831,14 @@ Global {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.ReleaseTest|x64.Build.0 = Release|Any CPU {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.XP32bit|Any CPU.ActiveCfg = Debug|Any CPU {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.XP32bit|Any CPU.Build.0 = Debug|Any CPU {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}.XP32bit|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -2694,6 +2903,14 @@ Global {20F137FD-C25E-42B7-A68F-58C746475897}.ReleaseTest|x64.Build.0 = Release|Any CPU {20F137FD-C25E-42B7-A68F-58C746475897}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {20F137FD-C25E-42B7-A68F-58C746475897}.ReleaseTest|x86.Build.0 = Release|Any CPU + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {20F137FD-C25E-42B7-A68F-58C746475897}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {20F137FD-C25E-42B7-A68F-58C746475897}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {20F137FD-C25E-42B7-A68F-58C746475897}.XP32bit|Any CPU.Build.0 = Release|Any CPU {20F137FD-C25E-42B7-A68F-58C746475897}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2758,6 +2975,14 @@ Global {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.ReleaseTest|x64.Build.0 = Release|Any CPU {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.ReleaseTest|x86.Build.0 = Release|Any CPU + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.XP32bit|Any CPU.ActiveCfg = Debug|Any CPU {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.XP32bit|Any CPU.Build.0 = Debug|Any CPU {8A619CD5-6C8D-420C-A132-7946C6F13E6E}.XP32bit|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -2822,6 +3047,14 @@ Global {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.ReleaseTest|x64.Build.0 = Release|Any CPU {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.ReleaseTest|x86.Build.0 = Release|Any CPU + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.XP32bit|Any CPU.Build.0 = Release|Any CPU {94CA71F3-C5D7-4EC6-BA47-FA8EEA3C9406}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2886,6 +3119,14 @@ Global {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.ReleaseTest|x64.Build.0 = Release|Any CPU {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.ReleaseTest|x86.Build.0 = Release|Any CPU + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.XP32bit|Any CPU.Build.0 = Release|Any CPU {2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -2950,6 +3191,14 @@ Global {A25A96FD-604B-43BE-80CD-A953152C2175}.ReleaseTest|x64.Build.0 = Release|Any CPU {A25A96FD-604B-43BE-80CD-A953152C2175}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {A25A96FD-604B-43BE-80CD-A953152C2175}.ReleaseTest|x86.Build.0 = Release|Any CPU + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {A25A96FD-604B-43BE-80CD-A953152C2175}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {A25A96FD-604B-43BE-80CD-A953152C2175}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {A25A96FD-604B-43BE-80CD-A953152C2175}.XP32bit|Any CPU.Build.0 = Release|Any CPU {A25A96FD-604B-43BE-80CD-A953152C2175}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3014,6 +3263,14 @@ Global {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.ReleaseTest|x64.Build.0 = Release|Any CPU {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.ReleaseTest|x86.Build.0 = Release|Any CPU + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.XP32bit|Any CPU.Build.0 = Release|Any CPU {AC434B18-4D7B-49BA-9AD5-0527C79E8297}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3078,6 +3335,14 @@ Global {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.ReleaseTest|x64.Build.0 = Release|Any CPU {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.ReleaseTest|x86.Build.0 = Release|Any CPU + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.XP32bit|Any CPU.Build.0 = Release|Any CPU {0FFBCA6C-E828-4196-B0A8-988DEA3E077F}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3142,6 +3407,14 @@ Global {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.ReleaseTest|x64.Build.0 = Release|Any CPU {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.ReleaseTest|x86.Build.0 = Release|Any CPU + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.XP32bit|Any CPU.Build.0 = Release|Any CPU {70BF5094-0F03-41FC-B0BD-BEFCF51686C9}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3206,6 +3479,14 @@ Global {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.ReleaseTest|x64.Build.0 = Release|Any CPU {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.ReleaseTest|x86.Build.0 = Release|Any CPU + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.XP32bit|Any CPU.Build.0 = Release|Any CPU {108FE49B-75E1-43F5-82DD-DA33FE99CBEC}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3270,6 +3551,14 @@ Global {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.ReleaseTest|x64.Build.0 = Release|Any CPU {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.ReleaseTest|x86.Build.0 = Release|Any CPU + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.XP32bit|Any CPU.Build.0 = Release|Any CPU {62E5BA37-36AB-4F0A-BC12-554E7A1F1A39}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3334,6 +3623,14 @@ Global {652ECA13-A411-4789-8814-6823965947CB}.ReleaseTest|x64.Build.0 = Release|Any CPU {652ECA13-A411-4789-8814-6823965947CB}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {652ECA13-A411-4789-8814-6823965947CB}.ReleaseTest|x86.Build.0 = Release|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {652ECA13-A411-4789-8814-6823965947CB}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {652ECA13-A411-4789-8814-6823965947CB}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {652ECA13-A411-4789-8814-6823965947CB}.XP32bit|Any CPU.Build.0 = Release|Any CPU {652ECA13-A411-4789-8814-6823965947CB}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3398,6 +3695,14 @@ Global {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.ReleaseTest|x64.Build.0 = Release|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.ReleaseTest|x86.Build.0 = Release|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.XP32bit|Any CPU.Build.0 = Release|Any CPU {0F646872-D8DC-4EE5-989F-D4C73F0ACE3F}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3462,6 +3767,14 @@ Global {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x64.Build.0 = Release|Any CPU {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {35726BCF-975C-4B49-BEFA-C00D90394F1D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {35726BCF-975C-4B49-BEFA-C00D90394F1D}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Any CPU.Build.0 = Release|Any CPU {35726BCF-975C-4B49-BEFA-C00D90394F1D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3526,6 +3839,14 @@ Global {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.ReleaseTest|x64.Build.0 = Release|Any CPU {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.ReleaseTest|x86.Build.0 = Release|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.XP32bit|Any CPU.Build.0 = Release|Any CPU {A5E7CE52-3101-4E9B-B896-C2C0FADE4812}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3590,6 +3911,14 @@ Global {70398B99-B134-4BBD-968B-7399B70C3CE2}.ReleaseTest|x64.Build.0 = Release|Any CPU {70398B99-B134-4BBD-968B-7399B70C3CE2}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {70398B99-B134-4BBD-968B-7399B70C3CE2}.ReleaseTest|x86.Build.0 = Release|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {70398B99-B134-4BBD-968B-7399B70C3CE2}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {70398B99-B134-4BBD-968B-7399B70C3CE2}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {70398B99-B134-4BBD-968B-7399B70C3CE2}.XP32bit|Any CPU.Build.0 = Release|Any CPU {70398B99-B134-4BBD-968B-7399B70C3CE2}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3654,6 +3983,14 @@ Global {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.ReleaseTest|x64.Build.0 = Release|Any CPU {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.ReleaseTest|x86.Build.0 = Release|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.XP32bit|Any CPU.Build.0 = Release|Any CPU {B5DA260C-71CC-45CA-B79E-D1B376AF718C}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3718,6 +4055,14 @@ Global {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.ReleaseTest|x64.Build.0 = Release|Any CPU {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.ReleaseTest|x86.Build.0 = Release|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.XP32bit|Any CPU.Build.0 = Release|Any CPU {00748F11-4B49-4D8B-93C4-4A11A210CCE2}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3782,6 +4127,14 @@ Global {D6B81C60-2763-4C4D-989F-90822F53B01A}.ReleaseTest|x64.Build.0 = Release|Any CPU {D6B81C60-2763-4C4D-989F-90822F53B01A}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {D6B81C60-2763-4C4D-989F-90822F53B01A}.ReleaseTest|x86.Build.0 = Release|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {D6B81C60-2763-4C4D-989F-90822F53B01A}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {D6B81C60-2763-4C4D-989F-90822F53B01A}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {D6B81C60-2763-4C4D-989F-90822F53B01A}.XP32bit|Any CPU.Build.0 = Release|Any CPU {D6B81C60-2763-4C4D-989F-90822F53B01A}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -3846,6 +4199,14 @@ Global {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.ReleaseTest|x64.Build.0 = Release|x64 {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.ReleaseTest|x86.ActiveCfg = Release|x86 {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.ReleaseTest|x86.Build.0 = Release|x86 + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {BA17D20E-0CEB-4B27-9772-2392BD750ED5}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -3910,6 +4271,14 @@ Global {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.ReleaseTest|x64.Build.0 = Release|x64 {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.ReleaseTest|x86.ActiveCfg = Release|x86 {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.ReleaseTest|x86.Build.0 = Release|x86 + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|x86.ActiveCfg = VPN_Debug|x86 + {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.VPN_Debug|x86.Build.0 = VPN_Debug|x86 {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.XP32bit|Any CPU.ActiveCfg = XP32bit|Any CPU {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.XP32bit|Any CPU.Build.0 = XP32bit|Any CPU {8BDD2789-96D4-43EA-AAD7-0F49D0347998}.XP32bit|Mixed Platforms.ActiveCfg = XP32bit|x86 @@ -3974,6 +4343,14 @@ Global {FD30EB7A-7809-4E62-9374-791D31877D6D}.ReleaseTest|x64.Build.0 = Release|Any CPU {FD30EB7A-7809-4E62-9374-791D31877D6D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {FD30EB7A-7809-4E62-9374-791D31877D6D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {FD30EB7A-7809-4E62-9374-791D31877D6D}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {FD30EB7A-7809-4E62-9374-791D31877D6D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {FD30EB7A-7809-4E62-9374-791D31877D6D}.XP32bit|Any CPU.Build.0 = Release|Any CPU {FD30EB7A-7809-4E62-9374-791D31877D6D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4038,6 +4415,10 @@ Global {F8D84B9A-0FCF-4083-B067-8C39B7314152}.ReleaseTest|x64.Build.0 = Release|Any CPU {F8D84B9A-0FCF-4083-B067-8C39B7314152}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {F8D84B9A-0FCF-4083-B067-8C39B7314152}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F8D84B9A-0FCF-4083-B067-8C39B7314152}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {F8D84B9A-0FCF-4083-B067-8C39B7314152}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {F8D84B9A-0FCF-4083-B067-8C39B7314152}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {F8D84B9A-0FCF-4083-B067-8C39B7314152}.VPN_Debug|x86.ActiveCfg = Release|Any CPU {F8D84B9A-0FCF-4083-B067-8C39B7314152}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {F8D84B9A-0FCF-4083-B067-8C39B7314152}.XP32bit|Any CPU.Build.0 = Release|Any CPU {F8D84B9A-0FCF-4083-B067-8C39B7314152}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4102,6 +4483,10 @@ Global {01A28A70-D5E6-4898-8C22-E64400A3B80F}.ReleaseTest|x64.Build.0 = Release|Any CPU {01A28A70-D5E6-4898-8C22-E64400A3B80F}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {01A28A70-D5E6-4898-8C22-E64400A3B80F}.ReleaseTest|x86.Build.0 = Release|Any CPU + {01A28A70-D5E6-4898-8C22-E64400A3B80F}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {01A28A70-D5E6-4898-8C22-E64400A3B80F}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {01A28A70-D5E6-4898-8C22-E64400A3B80F}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {01A28A70-D5E6-4898-8C22-E64400A3B80F}.VPN_Debug|x86.ActiveCfg = Release|Any CPU {01A28A70-D5E6-4898-8C22-E64400A3B80F}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {01A28A70-D5E6-4898-8C22-E64400A3B80F}.XP32bit|Any CPU.Build.0 = Release|Any CPU {01A28A70-D5E6-4898-8C22-E64400A3B80F}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4166,6 +4551,14 @@ Global {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.ReleaseTest|x64.Build.0 = Release|x64 {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.ReleaseTest|x86.Build.0 = Release|Any CPU + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.XP32bit|Any CPU.Build.0 = Release|Any CPU {4806D89A-FBFB-41BC-AAA7-2242444BF55A}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4230,6 +4623,14 @@ Global {E9FAAF12-8721-46AC-8181-744001E3314E}.ReleaseTest|x64.Build.0 = Release|x64 {E9FAAF12-8721-46AC-8181-744001E3314E}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {E9FAAF12-8721-46AC-8181-744001E3314E}.ReleaseTest|x86.Build.0 = Release|Any CPU + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {E9FAAF12-8721-46AC-8181-744001E3314E}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {E9FAAF12-8721-46AC-8181-744001E3314E}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {E9FAAF12-8721-46AC-8181-744001E3314E}.XP32bit|Any CPU.Build.0 = Release|Any CPU {E9FAAF12-8721-46AC-8181-744001E3314E}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4294,6 +4695,14 @@ Global {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.ReleaseTest|x64.Build.0 = Release|x64 {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.ReleaseTest|x86.Build.0 = Release|Any CPU + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.XP32bit|Any CPU.Build.0 = Release|Any CPU {CBF74D42-327E-4476-A096-63E7EBD9B7A3}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4358,6 +4767,14 @@ Global {A83696BF-D8A2-4809-8424-CFE172AED5B6}.ReleaseTest|x64.Build.0 = Release|Any CPU {A83696BF-D8A2-4809-8424-CFE172AED5B6}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {A83696BF-D8A2-4809-8424-CFE172AED5B6}.ReleaseTest|x86.Build.0 = Release|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {A83696BF-D8A2-4809-8424-CFE172AED5B6}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {A83696BF-D8A2-4809-8424-CFE172AED5B6}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {A83696BF-D8A2-4809-8424-CFE172AED5B6}.XP32bit|Any CPU.Build.0 = Release|Any CPU {A83696BF-D8A2-4809-8424-CFE172AED5B6}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4422,6 +4839,14 @@ Global {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.ReleaseTest|x64.Build.0 = Release|Any CPU {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.ReleaseTest|x86.Build.0 = Release|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.XP32bit|Any CPU.Build.0 = Release|Any CPU {C2808A8E-C0BA-44EC-B7B1-1C66AD3D8478}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4486,6 +4911,14 @@ Global {B6A19B80-0F0F-434C-A754-A7712FC208B2}.ReleaseTest|x64.Build.0 = Release|Any CPU {B6A19B80-0F0F-434C-A754-A7712FC208B2}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {B6A19B80-0F0F-434C-A754-A7712FC208B2}.ReleaseTest|x86.Build.0 = Release|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {B6A19B80-0F0F-434C-A754-A7712FC208B2}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {B6A19B80-0F0F-434C-A754-A7712FC208B2}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {B6A19B80-0F0F-434C-A754-A7712FC208B2}.XP32bit|Any CPU.Build.0 = Release|Any CPU {B6A19B80-0F0F-434C-A754-A7712FC208B2}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4550,6 +4983,14 @@ Global {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.ReleaseTest|x64.Build.0 = Release|Any CPU {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.XP32bit|Any CPU.Build.0 = Release|Any CPU {FD9EAB89-D2E5-4006-8E4F-7EF7A010749D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4614,6 +5055,10 @@ Global {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.ReleaseTest|x64.Build.0 = Release|Any CPU {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.ReleaseTest|x86.Build.0 = Release|Any CPU + {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.VPN_Debug|Any CPU.ActiveCfg = Development|Any CPU + {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.VPN_Debug|Mixed Platforms.ActiveCfg = Development|Any CPU + {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.VPN_Debug|x64.ActiveCfg = Development|Any CPU + {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.VPN_Debug|x86.ActiveCfg = Development|Any CPU {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.XP32bit|Any CPU.Build.0 = Release|Any CPU {8E1431E9-9B14-4BC2-8B65-47357C97B1FC}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4678,6 +5123,10 @@ Global {C6BFAC88-5647-4131-90B1-4D6265E08348}.ReleaseTest|x64.Build.0 = Release|Any CPU {C6BFAC88-5647-4131-90B1-4D6265E08348}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {C6BFAC88-5647-4131-90B1-4D6265E08348}.ReleaseTest|x86.Build.0 = Release|Any CPU + {C6BFAC88-5647-4131-90B1-4D6265E08348}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {C6BFAC88-5647-4131-90B1-4D6265E08348}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {C6BFAC88-5647-4131-90B1-4D6265E08348}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {C6BFAC88-5647-4131-90B1-4D6265E08348}.VPN_Debug|x86.ActiveCfg = Release|Any CPU {C6BFAC88-5647-4131-90B1-4D6265E08348}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {C6BFAC88-5647-4131-90B1-4D6265E08348}.XP32bit|Any CPU.Build.0 = Release|Any CPU {C6BFAC88-5647-4131-90B1-4D6265E08348}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4742,6 +5191,10 @@ Global {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.ReleaseTest|x64.Build.0 = Release|Any CPU {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.ReleaseTest|x86.Build.0 = Release|Any CPU + {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.VPN_Debug|x86.ActiveCfg = Release|Any CPU {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.XP32bit|Any CPU.Build.0 = Release|Any CPU {41E949AD-FBF6-47A3-AC1D-7E17AB7F1252}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4806,6 +5259,14 @@ Global {28FD69D1-B2DA-485D-9571-711BF3917350}.ReleaseTest|x64.Build.0 = Release|Any CPU {28FD69D1-B2DA-485D-9571-711BF3917350}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {28FD69D1-B2DA-485D-9571-711BF3917350}.ReleaseTest|x86.Build.0 = Release|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {28FD69D1-B2DA-485D-9571-711BF3917350}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {28FD69D1-B2DA-485D-9571-711BF3917350}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {28FD69D1-B2DA-485D-9571-711BF3917350}.XP32bit|Any CPU.Build.0 = Release|Any CPU {28FD69D1-B2DA-485D-9571-711BF3917350}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4870,6 +5331,14 @@ Global {4E8BB839-D40A-488C-88CE-F21811F1F476}.ReleaseTest|x64.Build.0 = Release|Any CPU {4E8BB839-D40A-488C-88CE-F21811F1F476}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {4E8BB839-D40A-488C-88CE-F21811F1F476}.ReleaseTest|x86.Build.0 = Release|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {4E8BB839-D40A-488C-88CE-F21811F1F476}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {4E8BB839-D40A-488C-88CE-F21811F1F476}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {4E8BB839-D40A-488C-88CE-F21811F1F476}.XP32bit|Any CPU.Build.0 = Release|Any CPU {4E8BB839-D40A-488C-88CE-F21811F1F476}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4934,6 +5403,14 @@ Global {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.ReleaseTest|x64.Build.0 = Release|Any CPU {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.ReleaseTest|x86.Build.0 = Release|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.XP32bit|Any CPU.Build.0 = Release|Any CPU {8DE8E742-EE0A-4004-AA49-3D08D748E5AC}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -4998,6 +5475,14 @@ Global {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.ReleaseTest|x64.Build.0 = Release|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.ReleaseTest|x86.Build.0 = Release|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.XP32bit|Any CPU.Build.0 = Release|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5006,134 +5491,6 @@ Global {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.XP32bit|x64.Build.0 = Release|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.XP32bit|x86.ActiveCfg = Release|Any CPU {FDE234FD-FF24-479F-B5CA-DFB74B4636DA}.XP32bit|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x64.ActiveCfg = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x64.Build.0 = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x86.ActiveCfg = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x86.Build.0 = Debug|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x86.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Any CPU.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x64.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x64.Build.0 = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x86.ActiveCfg = Release|Any CPU - {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x64.ActiveCfg = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x64.Build.0 = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x86.ActiveCfg = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x86.Build.0 = Debug|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x86.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Any CPU.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x64.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x64.Build.0 = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x86.ActiveCfg = Release|Any CPU - {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x86.Build.0 = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5190,6 +5547,14 @@ Global {F69A79FA-548D-4E21-887E-01FABDAD9E73}.ReleaseTest|x64.Build.0 = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {F69A79FA-548D-4E21-887E-01FABDAD9E73}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.XP32bit|Any CPU.Build.0 = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5198,198 +5563,6 @@ Global {F69A79FA-548D-4E21-887E-01FABDAD9E73}.XP32bit|x64.Build.0 = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.XP32bit|x86.ActiveCfg = Release|Any CPU {F69A79FA-548D-4E21-887E-01FABDAD9E73}.XP32bit|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x64.ActiveCfg = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x64.Build.0 = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x86.ActiveCfg = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x86.Build.0 = Debug|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x86.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Any CPU.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x64.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x64.Build.0 = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x86.ActiveCfg = Release|Any CPU - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x64.ActiveCfg = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x64.Build.0 = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x86.ActiveCfg = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x86.Build.0 = Debug|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x86.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Any CPU.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x64.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x64.Build.0 = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x86.ActiveCfg = Release|Any CPU - {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.COM|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|x64.ActiveCfg = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|x64.Build.0 = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|x86.ActiveCfg = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Debug|x86.Build.0 = Debug|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.GenesisDisplayTool_V01|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.PerformTest|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.Release|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.ReleaseTest|x86.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|Any CPU.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|x64.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|x64.Build.0 = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|x86.ActiveCfg = Release|Any CPU - {DA65E376-3D35-4D96-913A-7197FCA6DF48}.XP32bit|x86.Build.0 = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5446,6 +5619,14 @@ Global {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.ReleaseTest|x64.Build.0 = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.ReleaseTest|x86.Build.0 = Release|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.XP32bit|Any CPU.Build.0 = Release|Any CPU {2D55BBD1-5373-484C-8781-C6ECEAFC2A90}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5510,6 +5691,14 @@ Global {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.ReleaseTest|x64.Build.0 = Release|Any CPU {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.ReleaseTest|x86.Build.0 = Release|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.XP32bit|Any CPU.Build.0 = Release|Any CPU {30BF7357-0B6C-498D-8123-5AACC66B3E5F}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5574,6 +5763,14 @@ Global {4928FC37-15EC-4872-8514-EA4ADCC4139D}.ReleaseTest|x64.Build.0 = Release|x64 {4928FC37-15EC-4872-8514-EA4ADCC4139D}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {4928FC37-15EC-4872-8514-EA4ADCC4139D}.ReleaseTest|x86.Build.0 = Release|Any CPU + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|x64 + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|x64 + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|x64.ActiveCfg = VPN_Debug|x64 + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|x64.Build.0 = VPN_Debug|x64 + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {4928FC37-15EC-4872-8514-EA4ADCC4139D}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {4928FC37-15EC-4872-8514-EA4ADCC4139D}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {4928FC37-15EC-4872-8514-EA4ADCC4139D}.XP32bit|Any CPU.Build.0 = Release|Any CPU {4928FC37-15EC-4872-8514-EA4ADCC4139D}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5638,6 +5835,14 @@ Global {48DA0272-9B14-4CC8-976F-A91E42DE4680}.ReleaseTest|x64.Build.0 = Release|Any CPU {48DA0272-9B14-4CC8-976F-A91E42DE4680}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {48DA0272-9B14-4CC8-976F-A91E42DE4680}.ReleaseTest|x86.Build.0 = Release|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {48DA0272-9B14-4CC8-976F-A91E42DE4680}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {48DA0272-9B14-4CC8-976F-A91E42DE4680}.XP32bit|Any CPU.ActiveCfg = Debug|Any CPU {48DA0272-9B14-4CC8-976F-A91E42DE4680}.XP32bit|Any CPU.Build.0 = Debug|Any CPU {48DA0272-9B14-4CC8-976F-A91E42DE4680}.XP32bit|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -5702,6 +5907,14 @@ Global {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.ReleaseTest|x64.Build.0 = Release|Any CPU {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.ReleaseTest|x86.Build.0 = Release|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|Any CPU.ActiveCfg = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|Any CPU.Build.0 = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|Mixed Platforms.ActiveCfg = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|Mixed Platforms.Build.0 = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|x64.ActiveCfg = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|x64.Build.0 = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|x86.ActiveCfg = VPN_Debug|Any CPU + {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.VPN_Debug|x86.Build.0 = VPN_Debug|Any CPU {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.XP32bit|Any CPU.Build.0 = Release|Any CPU {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5766,6 +5979,10 @@ Global {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.ReleaseTest|x64.Build.0 = Release|Any CPU {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.ReleaseTest|x86.ActiveCfg = Release|Any CPU {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.ReleaseTest|x86.Build.0 = Release|Any CPU + {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.VPN_Debug|x86.ActiveCfg = Release|Any CPU {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.XP32bit|Any CPU.Build.0 = Release|Any CPU {AFC428F5-0141-4A3F-BEF2-470A89D972F6}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -5774,6 +5991,366 @@ 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 + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|Any CPU.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|Any CPU.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|Mixed Platforms.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|x64.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|x64.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|x86.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.COM|x86.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|x64.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|x64.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|x86.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Debug|x86.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|Any CPU.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|x64.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|x64.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|x86.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.GenesisDisplayTool_V01|x86.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|Any CPU.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|Any CPU.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|Mixed Platforms.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|x64.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|x64.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|x86.ActiveCfg = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.PerformTest|x86.Build.0 = Debug|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|Any CPU.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|x64.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|x64.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|x86.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.Release|x86.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|x64.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|x64.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|x86.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.ReleaseTest|x86.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|Any CPU.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|Mixed Platforms.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|x64.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|x86.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.VPN_Debug|x86.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|Any CPU.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|x64.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|x64.Build.0 = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|x86.ActiveCfg = Release|Any CPU + {9E070488-15DE-418A-8606-5B79056C6E9F}.XP32bit|x86.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Any CPU.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Any CPU.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|Mixed Platforms.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x64.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x64.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x86.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.COM|x86.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x64.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x64.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x86.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Debug|x86.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Any CPU.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x64.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x64.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x86.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.GenesisDisplayTool_V01|x86.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Any CPU.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Any CPU.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|Mixed Platforms.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x64.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x64.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x86.ActiveCfg = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.PerformTest|x86.Build.0 = Debug|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Any CPU.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x64.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x64.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x86.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.Release|x86.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x64.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x64.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x86.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.ReleaseTest|x86.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|Any CPU.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|Mixed Platforms.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|x64.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|x86.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.VPN_Debug|x86.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Any CPU.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x64.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x64.Build.0 = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x86.ActiveCfg = Release|Any CPU + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}.XP32bit|x86.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Any CPU.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Any CPU.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Mixed Platforms.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|Mixed Platforms.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x64.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x64.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x86.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.COM|x86.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x64.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Debug|x86.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Any CPU.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x64.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x64.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x86.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.GenesisDisplayTool_V01|x86.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Any CPU.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Any CPU.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Mixed Platforms.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|Mixed Platforms.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x64.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x64.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x86.ActiveCfg = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.PerformTest|x86.Build.0 = Debug|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Any CPU.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x64.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x64.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x86.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.Release|x86.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x64.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x64.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x86.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.ReleaseTest|x86.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|Any CPU.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|Mixed Platforms.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|x64.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|x86.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.VPN_Debug|x86.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Any CPU.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x64.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x64.Build.0 = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x86.ActiveCfg = Release|Any CPU + {15A06398-ECB6-49C9-ACB4-52A495A886A6}.XP32bit|x86.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Any CPU.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Any CPU.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|Mixed Platforms.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x64.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x64.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x86.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.COM|x86.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x64.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x64.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x86.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Debug|x86.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Any CPU.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x64.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x64.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x86.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.GenesisDisplayTool_V01|x86.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Any CPU.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Any CPU.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|Mixed Platforms.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x64.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x64.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x86.ActiveCfg = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.PerformTest|x86.Build.0 = Debug|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Any CPU.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x64.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x64.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x86.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.Release|x86.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x64.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x64.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x86.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.ReleaseTest|x86.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|Any CPU.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|Mixed Platforms.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|x64.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|x86.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.VPN_Debug|x86.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Any CPU.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x64.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x64.Build.0 = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x86.ActiveCfg = Release|Any CPU + {F90B940C-9A83-496D-AAE0-11CD02CE0A22}.XP32bit|x86.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Any CPU.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Any CPU.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Mixed Platforms.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|Mixed Platforms.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x64.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x64.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x86.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}._MANUAL_CONTROL|x86.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Any CPU.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Any CPU.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|Mixed Platforms.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x64.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x64.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x86.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.COM|x86.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x64.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x64.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x86.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Debug|x86.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Any CPU.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Any CPU.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|Mixed Platforms.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x64.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x64.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x86.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.GenesisDisplayTool_V01|x86.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Any CPU.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Any CPU.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|Mixed Platforms.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x64.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x64.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x86.ActiveCfg = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.PerformTest|x86.Build.0 = Debug|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Any CPU.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x64.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x64.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x86.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.Release|x86.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Any CPU.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Any CPU.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|Mixed Platforms.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x64.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x64.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x86.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.ReleaseTest|x86.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|Any CPU.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|Any CPU.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|Mixed Platforms.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|Mixed Platforms.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|x64.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|x64.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|x86.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.VPN_Debug|x86.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Any CPU.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Any CPU.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Mixed Platforms.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|Mixed Platforms.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x64.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x64.Build.0 = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x86.ActiveCfg = Release|Any CPU + {C9816412-7752-4F7A-8BD2-765DB6D58B3C}.XP32bit|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -5817,7 +6394,6 @@ Global {F013A56B-7BE6-4852-9CD8-B971CD1ADD0C} = {B5F43F61-4448-4992-85B5-7EDFB82FD643} {407E05EE-F1DE-4020-83AD-8C18EDE6B32C} = {03D4F23E-7E4A-4091-BC96-036C996D351A} {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E} = {5563DD3B-2287-4BED-97BF-F0389FF505AF} - {D72BFC81-AA50-45F2-9FB2-DF4F373F6AD4} = {03D4F23E-7E4A-4091-BC96-036C996D351A} {9EB1F659-6F73-4F65-BCAB-4114FD94F5FC} = {C17363DF-A043-4F25-8EBA-2B3B078227DC} {6D2777BB-7A88-466D-A49B-3266F9BF0160} = {57AA2731-BFD9-40A5-820F-E943FBC75D91} {315E94B8-B82F-4B25-B5BD-297DF3BC1D54} = {B5F43F61-4448-4992-85B5-7EDFB82FD643} @@ -5865,7 +6441,7 @@ Global {4E8BB839-D40A-488C-88CE-F21811F1F476} = {43B54F41-6F09-4BCB-9F82-77621275831B} {56768A27-D0E4-430E-8E75-AFC7319F189A} = {C9393A97-C0BB-4D59-A879-B572BE04CE15} {E6081C0A-8452-44B4-8EB4-E0CAE9119830} = {56768A27-D0E4-430E-8E75-AFC7319F189A} - {8DE8E742-EE0A-4004-AA49-3D08D748E5AC} = {99B23EE9-CE50-4924-A055-C39EFA038721} + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {FDE234FD-FF24-479F-B5CA-DFB74B4636DA} = {03D4F23E-7E4A-4091-BC96-036C996D351A} {3332395B-122F-4DE5-A294-9DDAEA09F10C} = {68323534-4337-4E3A-89BC-11D8BB55343A} {890AA5E6-C55A-4E35-9841-999FA24B5025} = {3332395B-122F-4DE5-A294-9DDAEA09F10C} @@ -5909,12 +6485,7 @@ Global {B2EAC69C-22C9-41D5-987B-5E1F435C0CBC} = {A778164E-C265-4B13-82A1-FF227AC3D668} {7C77A79B-646C-4CF8-AD1C-930E0B059829} = {B2EAC69C-22C9-41D5-987B-5E1F435C0CBC} {91CA9896-2288-4967-8991-AC49A77B6058} = {7C77A79B-646C-4CF8-AD1C-930E0B059829} - {F90B940C-9A83-496D-AAE0-11CD02CE0A22} = {2E31C385-4FFC-473E-9C00-D7DC48140704} - {C9816412-7752-4F7A-8BD2-765DB6D58B3C} = {2E31C385-4FFC-473E-9C00-D7DC48140704} {F69A79FA-548D-4E21-887E-01FABDAD9E73} = {696A94BE-7237-4AE2-9E36-6059DE519971} - {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB} = {2E31C385-4FFC-473E-9C00-D7DC48140704} - {15A06398-ECB6-49C9-ACB4-52A495A886A6} = {2E31C385-4FFC-473E-9C00-D7DC48140704} - {DA65E376-3D35-4D96-913A-7197FCA6DF48} = {2E31C385-4FFC-473E-9C00-D7DC48140704} {2D55BBD1-5373-484C-8781-C6ECEAFC2A90} = {7A0EE7B8-6B7E-41E9-B679-319C8CA48CF1} {30BF7357-0B6C-498D-8123-5AACC66B3E5F} = {7A0EE7B8-6B7E-41E9-B679-319C8CA48CF1} {4928FC37-15EC-4872-8514-EA4ADCC4139D} = {AE29BDE3-843C-4B9B-8B02-D3C4814028AC} @@ -5922,10 +6493,19 @@ Global {A6B3AB5A-A567-4C77-80FB-1E1E19A00713} = {B5F43F61-4448-4992-85B5-7EDFB82FD643} {D7A7E1FF-D024-407F-B30D-4C519CFA7BF1} = {A6B3AB5A-A567-4C77-80FB-1E1E19A00713} {AFC428F5-0141-4A3F-BEF2-470A89D972F6} = {C17363DF-A043-4F25-8EBA-2B3B078227DC} + {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {99B23EE9-CE50-4924-A055-C39EFA038721} + {9E070488-15DE-418A-8606-5B79056C6E9F} = {7B7EC9A1-2091-4CCD-9F01-C579ABD9241D} + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB} = {7B7EC9A1-2091-4CCD-9F01-C579ABD9241D} + {15A06398-ECB6-49C9-ACB4-52A495A886A6} = {7B7EC9A1-2091-4CCD-9F01-C579ABD9241D} + {F90B940C-9A83-496D-AAE0-11CD02CE0A22} = {7B7EC9A1-2091-4CCD-9F01-C579ABD9241D} + {C9816412-7752-4F7A-8BD2-765DB6D58B3C} = {7B7EC9A1-2091-4CCD-9F01-C579ABD9241D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4BCB7B69-696C-436A-86F7-C91EA5588164} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + Utils\DateTimeServerShared\DateTimeServerShared.projitems*{4806d89a-fbfb-41bc-aaa7-2242444bf55a}*SharedItemsImports = 4 + EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true EndGlobalSection diff --git a/Common/Common.sln.DotSettings b/Common/Common.sln.DotSettings index d76a8661..9421a131 100644 --- a/Common/Common.sln.DotSettings +++ b/Common/Common.sln.DotSettings @@ -24,6 +24,7 @@ True True True + True True True @@ -62,9 +63,11 @@ True True True + True True True True + True True True True @@ -75,6 +78,7 @@ True True True + True True True True diff --git a/Common/CommonConsole/CommonConsole.csproj b/Common/CommonConsole/CommonConsole.csproj index 7fbef325..d539bb10 100644 --- a/Common/CommonConsole/CommonConsole.csproj +++ b/Common/CommonConsole/CommonConsole.csproj @@ -37,22 +37,30 @@ false - - ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll - - - - ..\..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.Net.Http.dll - - - + + + + + + + + + + + + + + + + + @@ -63,35 +71,6 @@ {4e8bb839-d40a-488c-88ce-f21811f1f476} Common.Hardware.WaterMeter.eRegister - - {f4aaf7e6-7333-4284-b735-e32deb076c64} - Registers - - - {F90B940C-9A83-496D-AAE0-11CD02CE0A22} - LaaPackages.SqlClient - - - {F69A79FA-548D-4E21-887E-01FABDAD9E73} - Stichproben - - - - - 8.3.0 - - - 16.1.26121.12000 - - - 4.3.2 - - - 5.0.0 - - - 3.9.74 - \ No newline at end of file diff --git a/Common/CommonConsole/PAM03.cs b/Common/CommonConsole/PAM03.cs new file mode 100644 index 00000000..2ae0d76e --- /dev/null +++ b/Common/CommonConsole/PAM03.cs @@ -0,0 +1,201 @@ +namespace CommonConsole +{ + using Common.Hardware.SIRT; + using Common.Hardware.SIRT.Parameters; + using Common.Hardware.SIRT.Tasks; + using Common.Hardware.WaterMeter.eRegister; + using Common.Hardware.WaterMeter.eRegister.Features; + + using System; + using System.IO.Ports; + using System.Linq; + using System.Text.RegularExpressions; + using System.Threading; + + public class PAM03 + { + private string portName; + private uint address; + private byte[] key; + + public int Run(params string[] args) + { + /// + /// Process.ExitCode: + /// 0 - OK + /// 1 - Execution Error + /// 2 - Connection Error + /// 3 - Invalid Arguments + /// + var exitCode = this.ParseArguments(args); + + if (exitCode == 0) + { + var processAwaiter = new ManualResetEventSlim(); + var sirtBroadcaster = new SIRTBroadcaster(this.portName); + var pinI = new ProvidePin { AuthLevel = AuthLevel.I }; + + void SIRTBroadcaster_Connected(SIRTBroadcaster sirt) + { + var task = new CordonelTask(sirt.Frequency) + { + DelPamSemi = true, + WakeUpCmd = true, + WakeUpModul = true, + RequestAddress = address, + EncryptionKey = key, + IsEncrypted = true + }; + + task.SetPending(); + sirt.Start(task); + task.Wait(); + + void ResetAlarms(byte alarmMask) + { + if (exitCode != 0) + { + return; + } + + task.WakeUpCmd = false; + task.WakeUpModul = false; + task.Data = new ResetAlarms(alarmMask).Append(pinI); + task.SetPending(); + sirt.Start(task); + task.Wait(); + + if (task.State != SIRTTaskState.Completed) + { + Console.WriteLine($"{nameof(SIRTTaskState)}.{task.State}"); + + exitCode = 1; + } + + exitCode = 0; + } + + task.SetPending(); + sirt.Start(task); + task.Wait(); + + if (task.State != SIRTTaskState.Completed) + { + exitCode = 1; + } + + ResetAlarms(new AlarmsMask(0xFF) + { + MediumAbsent = false + }); + ResetAlarms(0xFE); + processAwaiter.Set(); + } + + void SIRTBroadcaster_Disconnected(SIRTBroadcaster _) + => processAwaiter.Set(); + + sirtBroadcaster.Connected += SIRTBroadcaster_Connected; + sirtBroadcaster.Disconnected += SIRTBroadcaster_Disconnected; + + sirtBroadcaster.Open(); + processAwaiter.Wait(); + sirtBroadcaster.Close(); + + sirtBroadcaster.Disconnected -= SIRTBroadcaster_Disconnected; + sirtBroadcaster.Connected -= SIRTBroadcaster_Connected; + } + + return exitCode; + } + + public int ParseArguments(string[] args) + { + if (args.Length != 3) + { + Console.WriteLine($"Falsche anzahl an parameter: '{string.Join("', '", args)}'"); + Console.WriteLine($"Expected: [COM..n as string] [Address as uint] [EncryptionKey as string]"); + + return 3; + } + + this.portName = args[0]; + + if (Regex.IsMatch($"{this.portName}", "[Cc][Oo][Mm][0-9]+")) + { + this.portName = this.portName.ToUpper(); + } + else if (SerialPort.GetPortNames().Any(x => x.Equals(this.portName, StringComparison.CurrentCultureIgnoreCase))) + { + Console.WriteLine($"COM Port: '{this.portName}' - nicht vorhanden"); + + return 3; + } + else + { + Console.WriteLine($"Falsche COM PortName: '{this.portName}' - erwartet: [Cc][Oo][Mm][0-9]+"); + + return 3; + } + + if (!uint.TryParse($"{args[1]}", out this.address)) + { + Console.WriteLine($"Ungültige Funkadresse: '{args[1]}'"); + + return 3; + } + + this.key = $"{args[2]}".GetBytes(); + + if (this.key.Length != 16) + { + Console.WriteLine($"Ungültige Funkschlüssel: '{BitConverter.ToString(this.key)}'"); + + return 3; + } + + return 0; + } + + public class CordonelTask : EregisterTask + { + public CordonelTask(int frequency) : base(frequency) + { + } + + public override Byte[] Start() + { + Console.WriteLine($"TX|{BitConverter.ToString(this.request)}"); + + return base.Start(); + } + + public override void Push(SIRTMessage response) + { + base.Push(response); + + Console.WriteLine($"RX|{BitConverter.ToString(response)}"); + + try + { + if (this.SEMIMessage != null) + { + Console.WriteLine($"========================================="); + Console.WriteLine($"AlarmsMask"); + Console.WriteLine($"-----------------------------------------"); + Console.WriteLine($"{new AlarmsMask(response.Payload[10])}"); + Console.WriteLine($"========================================="); + Console.WriteLine($"RSSI.PAM {response.P2}"); + Console.WriteLine($"RSSI.SEMI {response.Payload[12]}"); + Console.WriteLine($"PAMStatus {new PAMStatus(response.Payload[11])}"); + Console.WriteLine($"========================================="); + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } + } +} diff --git a/Common/CommonConsole/Program.cs b/Common/CommonConsole/Program.cs index e0c7e973..99c04106 100644 --- a/Common/CommonConsole/Program.cs +++ b/Common/CommonConsole/Program.cs @@ -1,250 +1,299 @@ namespace CommonConsole { using System; + using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams; public static class Program { - public static void Main() + static void Main() { - var bytes = new byte[] { 0x01, 0x82, 0x14, 0x94, 0x12, 0x10, 0x61, 0x20, 0x01, 0x34, 0xA6, 0x71, 0xB8, 0xFF, 0xE1, 0x09 }; - var bits = string.Empty; + // Console.WriteLine(BitConverter.ToInt32(new byte[] { 0xEC, 0xFF, 0xFF, 0xFF }, 0)); - foreach (var _byte in bytes) - { - for (int i = 7; i >= 0; i--) - { - bits += $"{(_byte >> i) & 1}"; - } - } - - var last = 1; - - for (int i = 0; i < bits.Length; i++) - { - last *= 2; - } - - var x = "1"; - var r = 0; - - for (var i = 0; i < 128; i++) - { - var t = string.Empty; - - for (var a = x.Length - 1; a >= 0; a--) - { - var xs = (byte)(x[a] - '0') * 2; - - t = $"{xs % 10 + r}{t}"; - r = xs / 10; - } - - x = t; - - if (r > 0) - { - x = $"{r}{x}"; - } - } - - - Console.WriteLine(); + SIRTServer.StartServer(Console.WriteLine, Console.WriteLine, 6, 8); + // SIRTServer.StartProgramming(433, 412013443, "0E9FACC6A0E1EF1C3B27A49BAC216535"); + // SIRTServer.StartProgramming(433, 412013444, "0E9FACC6A0E1EF1C3B27A49BAC216535"); + // SIRTServer.StartProgramming(433, 412013356, "80D46C00E1BED73FE0DA85D95CA4BEE3"); + // SIRTServer.StartProgramming(433, 412013081, "7B5F2F606155C670BD9891231A598EF3"); + // SIRTServer.StartProgramming(433, 412013082, "A10BB3C32B71894BD8BB17884973E616"); + // SIRTServer.StartProgramming(433, 412013083, "15EEC94741740FB1EA736CF6468A4790"); + // SIRTServer.StartProgramming(433, 412013084, "6E742330A56149E8CF94ABD70576573D"); + // SIRTServer.StartProgramming(433, 412013087, "C4D1DC170D7E219C26FDE76F9B2DC89A"); + // SIRTServer.StartProgramming(433, 412013078, "4E788CF5F57FF977C85F458049D00387"); + // SIRTServer.StartProgramming(868, 402001154, "0E9FACC6A0E1EF1C3B27A49BAC216535"); + // SIRTServer.StartProgramming(433, 412012695, "867DD2A34C382B7D1190DD563E6B52C4"); + // SIRTServer.StartProgramming(433, 412013356, "80D46C00E1BED73FE0DA85D95CA4BEE3"); } - //public static void Main() + public static void MainRF(params string[] args) + { + //var pam03 = new PAM03(); + + //pam03.Run("COM6", "402010030", "E6C88800DEB868C0D6A84880CE982840"); + //pam03.Run("COM6", "402010027", "D9C154DC274966AB71AD5D804A322178"); + + //return pam03.Run("COM7", "412004190", "0E9FACC6A0E1EF1C3B27A49BAC216535"); + // 10402010030 E6C88800DEB868C0D6A84880CE982840 + + //try + //{ + // return pam03.Run("COM10", "402009768", "3CB64CBCB71F8D0F9F69FF18DF5D24D3"); + //} + //catch (System.Exception e) + //{ + // return -1; + //} + } + + class FDRMask + { + public const byte LOG_ALARM_STATE = 0; // 0x00000001, //!< AlarmState (16 bits) + public const byte LOG_BILLING_COUNTER = 1; // 0x00000002, //!< BillingCounter + public const byte LOG_REVERSE_COUNTER = 2; // 0x00000004, //!< Backward or ReverseCounter + public const byte LOG_MAX_FLOW_VAL = 3; // 0x00000008, //!< Value of MaxFlow + public const byte LOG_MAX_FLOW_TIME = 4; // 0x00000010, //!< Date/Time of MaxFlow + public const byte LOG_PEAK_FLOW_VAL = 5; // 0x00000020, //!< Value of PeakFlow + public const byte LOG_PEAK_FLOW_TIME = 6; // 0x00000040, //!< Date/Time of PeakFlow + public const byte LOG_CUR_FLOW_VAL = 7; // 0x00000080, //!< Current Flow Value (Average of Period) + public const byte LOG_BROKEN_PIPE_FLOW_VAL = 8; // 0x00000100, //!< Value of BrokenPipe + public const byte LOG_BROKEN_PIPE_FLOW_TIME = 9; // 0x00000200, //!< Date/Time of BrokenPipe + public const byte LOG_MIN_FLOW_VAL = 10; // 0x00000400, //!< Value of FlowMin + public const byte LOG_MIN_FLOW_TIME = 11; // 0x00000800, //!< Date/Time of FlowMin + public const byte LOG_FORWARD_COUNTER = 12; // 0x00001000, //!< ForwardCounter + public const byte LOG_MIN_PRESS_VAL = 13; // 0x00010000, //!< Pressure Minimum + public const byte LOG_MIN_PRESS_TIME = 14; // 0x00020000, //!< Pressure Minimum Time + public const byte LOG_MAX_PRESS_VAL = 15; // 0x00040000, //!< Pressure Maximum + public const byte LOG_MAX_PRESS_TIME = 16; // 0x00080000, //!< Pressure Maximum Time + public const byte LOG_MIN_TEMP_VAL = 17; // 0x00100000, //!< Temperature Minimum + public const byte LOG_MIN_TEMP_TIME = 18; // 0x00200000, //!< Temperature Minimum + public const byte LOG_MAX_TEMP_VAL = 19; // 0x00400000, //!< Temperature Maximum + public const byte LOG_MAX_TEMP_TIME = 20; // 0x00800000, //!< Temperature Maximum + public const byte LOG_CUR_PRESS_VAL = 21; // 0x01000000, //!< Pressure Current Value + public const byte LOG_CUR_TEMP_VAL = 22; // 0x02000000, //!< Temperature Current Value + public const byte LOG_EXT_ALARM_STATE = 23; // 0x04000000,    //> AlarmMask.ALARM_REBOOT) % 2} {(x2 >> AlarmMask.ALARM_REBOOT) % 2} "); + //Console.WriteLine($"ALARM_LOW_BATTERY: [{(int)AlarmMask.ALARM_LOW_BATTERY,2}] {(x1 >> AlarmMask.ALARM_LOW_BATTERY) % 2} {(x2 >> AlarmMask.ALARM_LOW_BATTERY) % 2} "); + //Console.WriteLine($"ALARM_VERY_LOW_BATTERY: [{(int)AlarmMask.ALARM_VERY_LOW_BATTERY,2}] {(x1 >> AlarmMask.ALARM_VERY_LOW_BATTERY) % 2} {(x2 >> AlarmMask.ALARM_VERY_LOW_BATTERY) % 2} "); + //Console.WriteLine($"ALARM_CONFIG_ERROR: [{(int)AlarmMask.ALARM_CONFIG_ERROR,2}] {(x1 >> AlarmMask.ALARM_CONFIG_ERROR) % 2} {(x2 >> AlarmMask.ALARM_CONFIG_ERROR) % 2} "); + //Console.WriteLine($"ALARM_EMPTY_PIPE: [{(int)AlarmMask.ALARM_EMPTY_PIPE,2}] {(x1 >> AlarmMask.ALARM_EMPTY_PIPE) % 2} {(x2 >> AlarmMask.ALARM_EMPTY_PIPE) % 2} "); + //Console.WriteLine($"ALARM_MAGNETIC_TAMPER: [{(int)AlarmMask.ALARM_MAGNETIC_TAMPER,2}] {(x1 >> AlarmMask.ALARM_MAGNETIC_TAMPER) % 2} {(x2 >> AlarmMask.ALARM_MAGNETIC_TAMPER) % 2} "); + //Console.WriteLine($"ALARM_REVERSE_FLOW: [{(int)AlarmMask.ALARM_REVERSE_FLOW,2}] {(x1 >> AlarmMask.ALARM_REVERSE_FLOW) % 2} {(x2 >> AlarmMask.ALARM_REVERSE_FLOW) % 2} "); + //Console.WriteLine($"ALARM_SUSPECT_LEAK: [{(int)AlarmMask.ALARM_SUSPECT_LEAK,2}] {(x1 >> AlarmMask.ALARM_SUSPECT_LEAK) % 2} {(x2 >> AlarmMask.ALARM_SUSPECT_LEAK) % 2} "); + //Console.WriteLine($"ALARM_BROKEN_PIPE: [{(int)AlarmMask.ALARM_BROKEN_PIPE,2}] {(x1 >> AlarmMask.ALARM_BROKEN_PIPE) % 2} {(x2 >> AlarmMask.ALARM_BROKEN_PIPE) % 2} "); + //Console.WriteLine($"ALARM_LOW_PRESSURE: [{(int)AlarmMask.ALARM_LOW_PRESSURE,2}] {(x1 >> AlarmMask.ALARM_LOW_PRESSURE) % 2} {(x2 >> AlarmMask.ALARM_LOW_PRESSURE) % 2} "); + //Console.WriteLine($"ALARM_HIGH_PRESSURE: [{(int)AlarmMask.ALARM_HIGH_PRESSURE,2}] {(x1 >> AlarmMask.ALARM_HIGH_PRESSURE) % 2} {(x2 >> AlarmMask.ALARM_HIGH_PRESSURE) % 2} "); + //Console.WriteLine($"ALARM_LOW_TEMPERATURE: [{(int)AlarmMask.ALARM_LOW_TEMPERATURE,2}] {(x1 >> AlarmMask.ALARM_LOW_TEMPERATURE) % 2} {(x2 >> AlarmMask.ALARM_LOW_TEMPERATURE) % 2} "); + //Console.WriteLine($"ALARM_HIGH_TEMPERATURE: [{(int)AlarmMask.ALARM_HIGH_TEMPERATURE,2}] {(x1 >> AlarmMask.ALARM_HIGH_TEMPERATURE) % 2} {(x2 >> AlarmMask.ALARM_HIGH_TEMPERATURE) % 2} "); + //Console.WriteLine($"ALARM_RADIO_ERROR: [{(int)AlarmMask.ALARM_RADIO_ERROR,2}] {(x1 >> AlarmMask.ALARM_RADIO_ERROR) % 2} {(x2 >> AlarmMask.ALARM_RADIO_ERROR) % 2} "); + //Console.WriteLine($"ALARM_METROLOGY_PARAMS: [{(int)AlarmMask.ALARM_METROLOGY_PARAMS,2}] {(x1 >> AlarmMask.ALARM_METROLOGY_PARAMS) % 2} {(x2 >> AlarmMask.ALARM_METROLOGY_PARAMS) % 2} "); + //Console.WriteLine($"ALARM_METROLOGY_MEASURE: [{(int)AlarmMask.ALARM_METROLOGY_MEASURE,2}] {(x1 >> AlarmMask.ALARM_METROLOGY_MEASURE) % 2} {(x2 >> AlarmMask.ALARM_METROLOGY_MEASURE) % 2}"); + //Console.WriteLine($"ALARM_MAX: [{(int)AlarmMask.ALARM_MAX,2}] {(x1 >> AlarmMask.ALARM_MAX) % 2} {(x2 >> AlarmMask.ALARM_MAX) % 2} "); + + + //Console.WriteLine(int.MaxValue); + //Console.WriteLine(uint.MaxValue); + //Console.WriteLine(long.MaxValue); + + } + + //public static void /*MainCSD()*/ Main() //{ - // ////var x = (625L * 65536) | 0x80_00_00_00; + // var alarmEnableMask = 0xD39F0000; + // var ix = 0; - // ////Console.WriteLine((int)x); - - // ////var semiBytes25747925 = new byte[] { 0x08, 0x03, 0x12, 0x6B, 0x78, 0x41, 0x00, 0x00, 0x01, 0xF4, 0x00, 0x00, 0x83, 0x0C, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x13, 0x01, 0x88, 0xE1, 0xD5, 0x07, 0x0E, 0x10, 0xEC, 0x56, 0x13, 0xDA, 0x4C, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x1E, 0x00, 0x03, 0x01, 0x2F, 0xBE, 0xCA, 0x47, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xEF, 0xA6 }; - // ////var semi25747925 = new SEMI(semiBytes25747925, 868, 0); - - // ////var debugBytes25747925 = new byte[] { 0x0B, 0x10, 0x12, 0x6B, 0x78, 0x41, 0x00, 0x0C, 0x11, 0x0B, 0x11, 0x08, 0x04, 0x02, 0x7C, 0x4C, 0x12, 0x84, 0x15, 0x00, 0x66, 0x00, 0x35, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x8F, 0xD2, 0x02, 0x01, 0x01, 0x16, 0x00, 0x1B, 0x02, 0x71, 0x00, 0x00, 0x82, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xA0, 0xA5 }; - // ////var debug25747925 = new DEBUG(debugBytes25747925, 0); - - - // ////var siteUrl = "https://1xylemeur.sharepoint.com/sites/geckoSrc/customer/Pub_CSD/Forms/AllItems.aspx"; - // ////var userName = "stoyan.zlatev@xylem.com"; - // ////var password = "****************"; - - // ////var securePassword = new SecureString(); - - // ////foreach (var c in password) - // ////{ - // //// securePassword.AppendChar(c); - // ////} - - // ////using (var context = new ClientContext(siteUrl)) - // ////{ - // //// context.Credentials = new SharePointOnlineCredentials(userName, securePassword); - - // //// var web = context.Web; - // //// context.Load(web); - // //// context.ExecuteQuery(); - - // //// Console.WriteLine("Site Title: " + web.Title); - // ////} - //} - - - //public static void Main() - //{ - // SIRTLogger.State += Console.WriteLine; - - // var sirtHub = new SIRTHub(); - - // if (sirtHub.TryOpen("COM6", out var sirtId, out var frequency)) + // foreach (var item in Enum.GetValues(typeof(AlarmMask)).Cast().OrderBy(x => (uint)x).ToArray()) // { - // SIRTLogger.State -= Console.WriteLine; - // SIRTLogger.Message += Console.WriteLine; - // Console.WriteLine($"Listening on: COM6 - {frequency} - {sirtId}"); - - // var task = new LEDTask(frequency, 319017453) - // { - // //WakeUpCmd = true, - // //WakeUpModul = true, - // //DelPamSemi = true, - // Data = new byte[] { 0x1F, 0x01, 0x08, 0x43, 0x03, 0x63, 0x93, 0x73, 0x22 }, - // EncryptionKey = "E6C88800DEB868C0D6A84880CE982840".GetBytes(), - // IsEncrypted = true, - // }; - - // sirtHub.Start(task); - // task.Wait(); - - // Console.ReadKey(); - // sirtHub.Close("COM6"); - // } - //} - - //public class LEDTask : EregisterTask - //{ - // public LEDTask(int frequency, uint address) : base(frequency) - // { - // this.RequestAddress = address; + // Console.WriteLine($"{item,23} = {item:X} = {(uint)item,5} = {(alarmEnableMask << ix++) & 1}"); // } - // public byte P811 + // foreach (var item in Enum.GetValues(typeof(FDRMask)).Cast().OrderBy(x => x).ToArray()) // { - // get => this.p811; - // set => this.p811 = value; + // Console.WriteLine($"{item} = {item:X} = {(uint)item}"); // } - //} - //internal enum AlarmMask - //{ - // ALARM_REBOOT = 1 << 0, // immer An - // ALARM_LOW_BATTERY = 1 << 1, - // ALARM_VERY_LOW_BATTERY = 1 << 2, /* For consistency with st_alarm_bit_t only */ - // ALARM_CONFIG_ERROR = 1 << 3, - // ALARM_EMPTY_PIPE = 1 << 4, - // ALARM_MAGNETIC_TAMPER = 1 << 5, /* For consistency with st_alarm_bit_t only */ - // ALARM_REVERSE_FLOW = 1 << 6, - // ALARM_SUSPECT_LEAK = 1 << 7, - // ALARM_BROKEN_PIPE = 1 << 8, - // ALARM_LOW_PRESSURE = 1 << 9, - // ALARM_HIGH_PRESSURE = 1 << 10, - // ALARM_LOW_TEMPERATURE = 1 << 11, - // ALARM_HIGH_TEMPERATURE = 1 << 12, - // ALARM_RADIO_ERROR = 1 << 13, - // ALARM_METROLOGY_PARAMS = 1 << 14, - // ALARM_METROLOGY_MEASURE = 1 << 15, - // ALARM_MAX = 1 << 16 - //}; + // ushort value = 3; - //internal enum FDRMask - //{ - // LOG_BILLING_COUNTER = 0x00000002, //!< BillingCounter - // LOG_FORWARD_COUNTER = 0x00001000, //!< ForwardCounter - // LOG_REVERSE_COUNTER = 0x00000004, //!< Backward or ReverseCounter - // LOG_MIN_FLOW_TIME = 0x00000800, //!< Date/Time of FlowMin - // LOG_MIN_FLOW_VAL = 0x00000400, //!< Value of FlowMin - // LOG_BROKEN_PIPE_FLOW_TIME = 0x00000200, //!< Date/Time of BrokenPipe - // LOG_BROKEN_PIPE_FLOW_VAL = 0x00000100, //!< Value of BrokenPipe - // LOG_CUR_FLOW_VAL = 0x00000080, //!< Current Flow Value (Average of Period) - // LOG_PEAK_FLOW_TIME = 0x00000040, //!< Date/Time of PeakFlow - // LOG_PEAK_FLOW_VAL = 0x00000020, //!< Value of PeakFlow - // LOG_MAX_FLOW_TIME = 0x00000010, //!< Date/Time of MaxFlow - // LOG_MAX_FLOW_VAL = 0x00000008, //!< Value of MaxFlow - // LOG_CUR_TEMP_VAL = 0x02000000, //!< Temperature Current Value - // LOG_MAX_TEMP_TIME = 0x00800000, //!< Temperature Maximum - // LOG_MAX_TEMP_VAL = 0x00400000, //!< Temperature Maximum - // LOG_MIN_TEMP_TIME = 0x00200000, //!< Temperature Minimum - // LOG_MIN_TEMP_VAL = 0x00100000, //!< Temperature Minimum - // LOG_CUR_PRESS_VAL = 0x01000000, //!< Pressure Current Value - // LOG_MAX_PRESS_TIME = 0x00080000, //!< Pressure Maximum Time - // LOG_MAX_PRESS_VAL = 0x00040000, //!< Pressure Maximum - // LOG_MIN_PRESS_TIME = 0x00020000, //!< Pressure Minimum Time - // LOG_MIN_PRESS_VAL = 0x00010000, //!< Pressure Minimum - // LOG_ALARM_STATE = 0x00000001, //!< AlarmState (16 bits) - // LOG_EXT_ALARM_STATE = 0x04000000,    //> 0 & 1}"); + // Console.WriteLine($"0: {value >> 1 & 1}"); + // Console.WriteLine($"0: {value >> 2 & 1}"); - //var alarm - // = FDRMask.LOG_BILLING_COUNTER - // | FDRMask.LOG_REVERSE_COUNTER - // | FDRMask.LOG_BROKEN_PIPE_FLOW_TIME - // | FDRMask.LOG_BROKEN_PIPE_FLOW_VAL - // | FDRMask.LOG_PEAK_FLOW_TIME - // | FDRMask.LOG_PEAK_FLOW_VAL - // | FDRMask.LOG_MAX_FLOW_TIME - // | FDRMask.LOG_MAX_FLOW_VAL - // | FDRMask.LOG_MAX_TEMP_TIME - // | FDRMask.LOG_MAX_TEMP_VAL - // | FDRMask.LOG_ALARM_STATE - // | FDRMask.LOG_EXT_ALARM_STATE; + // Console.WriteLine("CSD CSD 772161_MW"); + // Console.WriteLine("============================================================================="); - //public static void Main() - //{ // var alarm = AlarmMask.ALARM_REBOOT // | AlarmMask.ALARM_EMPTY_PIPE - // | AlarmMask.ALARM_SUSPECT_LEAK - // | AlarmMask.ALARM_BROKEN_PIPE // | AlarmMask.ALARM_LOW_BATTERY - // | AlarmMask.ALARM_REVERSE_FLOW - // | AlarmMask.ALARM_HIGH_TEMPERATURE; + // | AlarmMask.ALARM_REVERSE_FLOW; - // Console.WriteLine($"Alarm: {alarm}"); - // Console.WriteLine(BitConverter.ToString(BitConverter.GetBytes((int)alarm))); - // Console.WriteLine(); + // Console.WriteLine($"CUSTOMER_AlarmVisualMask: {BitConverter.ToString(BitConverter.GetBytes((int)alarm))}"); - // var fdr = FDRMask.LOG_BILLING_COUNTER - // | FDRMask.LOG_REVERSE_COUNTER - // | FDRMask.LOG_BROKEN_PIPE_FLOW_TIME - // | FDRMask.LOG_BROKEN_PIPE_FLOW_VAL - // | FDRMask.LOG_PEAK_FLOW_TIME - // | FDRMask.LOG_PEAK_FLOW_VAL - // | FDRMask.LOG_MAX_FLOW_TIME - // | FDRMask.LOG_MAX_FLOW_VAL - // | FDRMask.LOG_MAX_TEMP_TIME - // | FDRMask.LOG_MAX_TEMP_VAL + + // var dlg = FDRMask.LOG_BILLING_COUNTER + // | FDRMask.LOG_MIN_FLOW_VAL + // | FDRMask.LOG_CUR_FLOW_VAL // ... AverageFlow !? // | FDRMask.LOG_ALARM_STATE // | FDRMask.LOG_EXT_ALARM_STATE; - // Console.WriteLine($"FDR: {fdr}"); - // Console.WriteLine(BitConverter.ToString(BitConverter.GetBytes((int)fdr))); - // Console.WriteLine(); + // Console.WriteLine($"PERIODICLOG_DataLogContents: {BitConverter.ToString(BitConverter.GetBytes((int)dlg))}"); - // Console.WriteLine($"HErrL: {BitConverter.ToString(BitConverter.GetBytes((short)90))}"); - // Console.WriteLine(); + // var fdr = FDRMask.LOG_BILLING_COUNTER + // | FDRMask.LOG_MIN_FLOW_VAL + // | FDRMask.LOG_CUR_FLOW_VAL // ... AverageFlow !? + // | FDRMask.LOG_ALARM_STATE + // | FDRMask.LOG_EXT_ALARM_STATE; - // Console.WriteLine("LeakageThreshold"); - // Console.WriteLine($"DN 40 100 l/h = 100 * 256 = {BitConverter.ToString(BitConverter.GetBytes(100 * 256))}"); - // Console.WriteLine($"DN 50 100 l/h = 100 * 256 = {BitConverter.ToString(BitConverter.GetBytes(100 * 256))}"); - // Console.WriteLine($"DN 65 125 l/h = 125 * 256 = {BitConverter.ToString(BitConverter.GetBytes(125 * 256))}"); - // Console.WriteLine($"DN 80 125 l/h = 125 * 256 = {BitConverter.ToString(BitConverter.GetBytes(125 * 256))}"); - // Console.WriteLine($"DN 100 125 l/h = 125 * 256 = {BitConverter.ToString(BitConverter.GetBytes(125 * 256))}"); - // Console.WriteLine($"DN 125 500 l/h = 500 * 256 = {BitConverter.ToString(BitConverter.GetBytes(500 * 256))}"); - // Console.WriteLine($"DN 150 375 l/h = 375 * 256 = {BitConverter.ToString(BitConverter.GetBytes(375 * 256))}"); - // Console.WriteLine(); - - - // Console.WriteLine("BrokenPipeThreshold"); - // Console.WriteLine($"DN 40 50 m³/h = 50 * 256 * 1000 = {BitConverter.ToString(BitConverter.GetBytes( 50 * 256 * 1000))}"); - // Console.WriteLine($"DN 80 125 m³/h = 125 * 256 * 1000 = {BitConverter.ToString(BitConverter.GetBytes(125 * 256 * 1000))}"); - // Console.WriteLine($"DN 150 250 m³/h = 250 * 256 * 1000 = {BitConverter.ToString(BitConverter.GetBytes(250 * 256 * 1000))}"); - // Console.WriteLine(); + // Console.WriteLine($"PERIODICLOG_FixedDateReadingContents: {BitConverter.ToString(BitConverter.GetBytes((int)fdr))}"); //} + + /// + /// CSD 769400 Arqiva Thames Water + /// + public static void Main1231231() + { + Console.WriteLine("CSD 769400 Arqiva Thames Water"); + Console.WriteLine("============================================================================="); + Console.WriteLine("--- DN50 --------------------------------------------------------------------"); + Console.WriteLine($"CUSTOMER_ExcessFlowVolumeThreshold: {BitConverter.ToString(BitConverter.GetBytes((int)(37.5 * 1000) / 256))}"); + + var alarm = 1 << AlarmMask.ALARM_EMPTY_PIPE + | 1 << AlarmMask.ALARM_SUSPECT_LEAK + | 1 << AlarmMask.ALARM_LOW_BATTERY + | 1 << AlarmMask.ALARM_HIGH_TEMPERATURE + | 1 << AlarmMask.ALARM_LOW_TEMPERATURE + | 1 << AlarmMask.ALARM_HIGH_PRESSURE + | 1 << AlarmMask.ALARM_LOW_PRESSURE; + + Console.WriteLine($"CUSTOMER_AlarmVisualMask: {BitConverter.ToString(BitConverter.GetBytes(alarm))}"); + + + var dlg = 1 < this.bytes = new byte[4]; + + public Epoch20000101(uint secondsSince, DateTimeKind dateTimeKind = DateTimeKind.Utc) : this(dateTimeKind) + => this.SecondsSince = secondsSince; + + public uint SecondsSince + { + get => BitConverter.ToUInt32(this.bytes, 0); + set => BitConverter.GetBytes(value).CopyTo(this.bytes, 0); + } + + public DateTime DateTime + { + get => epoch.AddSeconds(this.SecondsSince); + set => this.SecondsSince = (uint)(value - epoch).TotalSeconds; + } + + public static uint UTCNow => new Epoch20000101 { DateTime = DateTime.UtcNow }.SecondsSince; + + public static implicit operator DateTime(Epoch20000101 epoch) => epoch.DateTime; + + public static implicit operator uint(Epoch20000101 epoch) => epoch.SecondsSince; + } +} diff --git a/Common/CommonConsole/RFTelegrams/Extensions.cs b/Common/CommonConsole/RFTelegrams/Extensions.cs new file mode 100644 index 00000000..055ad21b --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/Extensions.cs @@ -0,0 +1,623 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using System; + using System.Collections.Generic; + + public static class Extensions + { + private const int ByteSize = 8; + private const int SByteSize = 16; + private const int Int16Size = 16; + private const int UInt16Size = 16; + private const int Int32Size = 32; + private const int UInt32Size = 32; + private const int Int64Size = 64; + private const int UInt64Size = 64; + + public static byte[] GetBitsBE(this byte value) + { + var bits = new byte[ByteSize]; + + for (int i = 7, x = 0; i >= 0; i--, x++) + { + bits[x] = (byte)((value >> i) & 1); + } + + return bits; + } + + public static byte[] GetBitsLE(this byte value) + { + var bits = new byte[ByteSize]; + + for (var i = 0; i < ByteSize; i++) + { + bits[i] = (byte)((value >> i) & 1); + } + + return bits; + } + + public static byte[] GetBitsLE(this ushort value) + { + var bits = new byte[UInt16Size]; + + for (var i = 0; i < UInt16Size; i++) + { + bits[i] = (byte)((value >> i) & 1); + } + + return bits; + } + + public static byte GetByteLE(this byte[] bits) + { + if (bits is null) + { + return default(byte); + } + + var value = default(byte); + + for (var i = 0; i < ByteSize; i++) + { + value ^= (byte)(bits[i] << i); + } + + return value; + } + + public static byte GetByteLE(this byte[] bits, int start = 0, int count = 0) + { + if (bits is null) + { + return default(byte); + } + + if (count == 0) + { + count = bits.Length; + } + + var length = start + count; + var _byte = default(byte); + + for (int i = start, x = 0; i < length; i++, x++) + { + _byte ^= (byte)(bits[i] << x); + } + + return _byte; + } + + public static void SetBitsLE(this byte value, byte[] bits, int start = 0, int count = 0) + { + if (bits is null) + { + return; + } + + if (count == 0 || count > bits.Length) + { + count = bits.Length; + } + + for (int i = start, x = 0; i < count; i++, x++) + { + bits[i] = (byte)((value >> x) % 2); + } + } + + public static byte[] GetBytesBE(this sbyte value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this short value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this int value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this long value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)(value >> 56); + bytes[index++] = (byte)(value >> 48); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this ushort value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this uint value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this ulong value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)(value >> 56); + bytes[index++] = (byte)(value >> 48); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesLE(this sbyte value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index] = (byte)(value >> 8); + + return bytes; + } + + public static byte[] GetBytesLE(this short value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index] = (byte)(value >> 8); + + return bytes; + } + + public static byte[] GetBytesLE(this int value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index] = (byte)(value >> 24); + + return bytes; + } + + public static byte[] GetBytesLE(this long value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 48); + bytes[index] = (byte)(value >> 56); + + return bytes; + } + + public static byte[] GetBytesLE(this ushort value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index] = (byte)(value >> 8); + + return bytes; + } + + public static byte[] GetBytesLE(this uint value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index] = (byte)(value >> 24); + + return bytes; + } + + public static byte[] GetBytesLE(this ulong value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 48); + bytes[index] = (byte)(value >> 56); + + return bytes; + } + + public static sbyte ToSByteBE(this byte[] bytes, int start = 0) + { + var value = default(sbyte); + + value ^= (sbyte)(bytes[start++] << 8); + value ^= (sbyte)bytes[start]; + + return value; + } + + public static short ToInt16BE(this byte[] bytes, int start = 0) + { + var value = default(short); + + value ^= (short)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static int ToInt32BE(this byte[] bytes, int start = 0) + { + var value = default(int); + + value ^= bytes[start++] << 24; + value ^= bytes[start++] << 16; + value ^= bytes[start++] << 8; + value ^= bytes[start]; + + return value; + } + + public static long ToInt64BE(this byte[] bytes, int start = 0) + { + var value = default(long); + + value ^= bytes[start++] << 56; + value ^= bytes[start++] << 48; + value ^= bytes[start++] << 40; + value ^= bytes[start++] << 32; + value ^= bytes[start++] << 24; + value ^= bytes[start++] << 16; + value ^= bytes[start++] << 8; + value ^= bytes[start]; + + return value; + } + + public static ushort ToUInt16BE(this byte[] bytes, int start = 0) + { + var value = default(ushort); + + value ^= (ushort)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static uint ToUInt32BE(this byte[] bytes, int start = 0) + { + var value = default(uint); + + value ^= (uint)(bytes[start++] << 24); + value ^= (uint)(bytes[start++] << 16); + value ^= (uint)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static ulong ToUInt64BE(this byte[] bytes, int start = 0) + { + var value = default(ulong); + + value ^= (ulong)(bytes[start++] << 56); + value ^= (ulong)(bytes[start++] << 48); + value ^= (ulong)(bytes[start++] << 40); + value ^= (ulong)(bytes[start++] << 32); + value ^= (ulong)(bytes[start++] << 24); + value ^= (ulong)(bytes[start++] << 16); + value ^= (ulong)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static sbyte ToSByteLE(this byte[] bytes, int start = 0) + { + var value = default(sbyte); + + value ^= (sbyte)bytes[start++]; + value ^= (sbyte)(bytes[start] << 8); + + return value; + } + + public static short ToInt16LE(this byte[] bytes, int start = 0) + { + var value = default(short); + + value ^= bytes[start++]; + value ^= (short)(bytes[start] << 8); + + return value; + } + + public static int ToInt32LE(this byte[] bytes, int start = 0) + { + var value = default(int); + + value ^= bytes[start++]; + value ^= bytes[start++] << 8; + value ^= bytes[start++] << 16; + value ^= bytes[start] << 24; + + return value; + } + + public static long ToInt64LE(this byte[] bytes, int start = 0) + { + var value = default(long); + + value ^= bytes[start++]; + value ^= bytes[start++] << 8; + value ^= bytes[start++] << 16; + value ^= bytes[start++] << 24; + value ^= bytes[start++] << 32; + value ^= bytes[start++] << 40; + value ^= bytes[start++] << 48; + value ^= bytes[start] << 56; + + return value; + } + + public static ushort ToUInt16LE(this byte[] bytes, int start = 0) + { + var value = default(ushort); + + value ^= bytes[start++]; + value ^= (ushort)(bytes[start] << 8); + + return value; + } + + public static ushort ToUIint16LEFromBits(this byte[] bits) + { + if (bits is null) + { + bits = new byte[UInt16Size]; + } + + Array.Resize(ref bits, UInt16Size); + + ushort value = 0; + + for (var i = 0; i < UInt16Size; i++) + { + value ^= (ushort)(bits[i] << i); + } + + return value; + } + + public static uint ToUInt32LE(this byte[] bytes, int start = 0) + { + var value = default(uint); + + value ^= bytes[start++]; + value ^= (uint)(bytes[start++] << 8); + value ^= (uint)(bytes[start++] << 16); + value ^= (uint)(bytes[start] << 24); + + return value; + } + + public static ulong ToUInt64LE(this byte[] bytes, int start = 0) + { + var value = default(ulong); + + value ^= bytes[start++]; + value ^= (ulong)(bytes[start++] << 8); + value ^= (ulong)(bytes[start++] << 16); + value ^= (ulong)(bytes[start++] << 24); + value ^= (ulong)(bytes[start++] << 32); + value ^= (ulong)(bytes[start++] << 40); + value ^= (ulong)(bytes[start++] << 48); + value ^= (ulong)(bytes[start] << 56); + + return value; + } + + public static ushort CRCCCITT(this byte[] bytes, int start = 0, int length = 0) + { + if (length == 0) + { + length = bytes.Length; + } + + var crc = (ushort)0xFFFF; + + for (var b = start; b < length; b++) + { + var _byte = bytes[b]; + var token = (ushort)((_byte << 8) & 0xFF00); + + for (var i = 0; i < 8; i++) + { + if (0x8000 == ((crc ^ token) & 0x8000)) + { + crc <<= 1; + crc ^= 0x1021; + } + else + { + crc <<= 1; + } + + token <<= 1; + } + } + + return crc; + } + + public static byte[] GetBytes(this string hexString) + { + var bytes = new List(); + + if (!string.IsNullOrWhiteSpace(hexString)) + { + // not needed, only valid hex bytes are processed // hexString = Regex.Replace(hexString, "[^a-fA-F0-9]*", string.Empty); + + var first = true; + var x = 0; + + foreach (var hex in hexString) + { + if ('0' <= hex && hex <= '9') + { + x += hex - '0'; + } + else if ('A' <= hex && hex <= 'F') + { + x += hex - 'A' + 10; + } + else if ('a' <= hex && hex <= 'f') + { + x = hex - 'a' + 10; + } + else + { + continue; + } + + if (first) + { + x *= 16; + } + else + { + bytes.Add((byte)x); + + x = 0; + } + + first = !first; + } + } + + return bytes.ToArray(); + } + + public static byte[] GetEncryptionKey(this string hexString, int requiredLength = 16) + { + var bytes = hexString.GetBytes(); + + if (bytes?.Length != requiredLength) + { + return default(byte[]); + } + + return bytes; + } + + public static uint GetAddress(this byte[] bytes, int index) + { + var value = default(uint); + var _index = index; + + value ^= (uint)(bytes[_index++] << 24); + value ^= (uint)(bytes[_index++] << 16); + value ^= (uint)(bytes[_index++] << 8); + value ^= bytes[_index]; + + return value; + } + + public static ushort GetCrc(this byte[] bytes, int index) + { + var value = default(ushort); + var _index = index; + + value ^= (ushort)(bytes[_index++] << 8); + value ^= bytes[_index]; + + return value; + } + + public static void SetAddress(this byte[] bytes, int index, uint address) + { + var _index = index; + + bytes[_index++] = (byte)(address >> 24); + bytes[_index++] = (byte)(address >> 16); + bytes[_index++] = (byte)(address >> 8); + bytes[_index] = (byte)address; + } + + public static void SetCrc(this byte[] bytes, int index, ushort crc) + { + var _index = index; + + bytes[_index++] = (byte)(crc >> 8); + bytes[_index] = (byte)crc; + } + } +} diff --git a/Common/CommonConsole/RFTelegrams/LogContent.cs b/Common/CommonConsole/RFTelegrams/LogContent.cs new file mode 100644 index 00000000..9748bd7d --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/LogContent.cs @@ -0,0 +1,97 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public class LogContent + { + private readonly byte[] bits = new byte[16]; + + public LogContent(ushort value = 0) + => this.bits = value.GetBitsLE(); + + public bool ForwardCounter + { + get => this.bits[12] == 1; + set => this.bits[12] = (byte)(value ? 1 : 0); + } + + public bool TimeOfMinimumFlow + { + get => this.bits[11] == 1; + set => this.bits[11] = (byte)(value ? 1 : 0); + } + + public bool MinimumFlow + { + get => this.bits[10] == 1; + set => this.bits[10] = (byte)(value ? 1 : 0); + } + + public bool TimeOfBrokenPipe + { + get => this.bits[9] == 1; + set => this.bits[9] = (byte)(value ? 1 : 0); + } + + public bool BrokenPipeFlow + { + get => this.bits[8] == 1; + set => this.bits[8] = (byte)(value ? 1 : 0); + } + + public bool CurrentFlow + { + get => this.bits[7] == 1; + set => this.bits[7] = (byte)(value ? 1 : 0); + } + + public bool TimeOfPeakFlow + { + get => this.bits[6] == 1; + set => this.bits[6] = (byte)(value ? 1 : 0); + } + + public bool PeakFlow + { + get => this.bits[5] == 1; + set => this.bits[5] = (byte)(value ? 1 : 0); + } + + public bool TimeOfMaximumFlow + { + get => this.bits[4] == 1; + set => this.bits[4] = (byte)(value ? 1 : 0); + } + + public bool MaximumFlow + { + get => this.bits[3] == 1; + set => this.bits[3] = (byte)(value ? 1 : 0); + } + + public bool BackwardVolume + { + get => this.bits[2] == 1; + set => this.bits[2] = (byte)(value ? 1 : 0); + } + + public bool Counter + { + get => this.bits[1] == 1; + set => this.bits[1] = (byte)(value ? 1 : 0); + } + + public bool AlarmState + { + get => this.bits[0] == 1; + set => this.bits[0] = (byte)(value ? 1 : 0); + } + + public override string ToString() + => string.Join(string.Empty, this.bits); + + public static implicit operator LogContent(ushort value) + => new LogContent(value); + + public static implicit operator ushort(LogContent value) + => value.bits.ToUIint16LEFromBits(); + } +} diff --git a/Common/CommonConsole/RFTelegrams/MeterTypes.cs b/Common/CommonConsole/RFTelegrams/MeterTypes.cs new file mode 100644 index 00000000..8c4d7484 --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/MeterTypes.cs @@ -0,0 +1,11 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public enum MeterTypes : byte + { + Residential = 0, + CandI = 1, + Cordonel = 0x09, + Residential__0x0B = 11, + CandI__0x0C = 12, + } +} diff --git a/Common/CommonConsole/RFTelegrams/PAMStatus.cs b/Common/CommonConsole/RFTelegrams/PAMStatus.cs new file mode 100644 index 00000000..4f452230 --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/PAMStatus.cs @@ -0,0 +1,62 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public class PAMStatus + { + private readonly byte[] bits; + + public PAMStatus(byte _byte) + => this.bits = _byte.GetBitsLE(); + + public bool CMD_UNKNOWN => this.bits[0] == 1; + + public bool WRONG_AUTH => this.bits[1] == 1; + + public bool EXPIRED_AUTH => this.bits[2] == 1; + + public bool MIXED_TYPES => this.bits[3] == 1; + + public bool OUT_OF_RANGE => this.bits[4] == 1; + + public override string ToString() + { + if (this.bits.GetByteLE() == 0) + { + return nameof(OK); + } + if (this.OUT_OF_RANGE) + { + return nameof(this.OUT_OF_RANGE); + } + else if (this.MIXED_TYPES) + { + return nameof(this.MIXED_TYPES); + } + else if (this.CMD_UNKNOWN) + { + return nameof(this.CMD_UNKNOWN); + } + else if (this.EXPIRED_AUTH) + { + return nameof(this.EXPIRED_AUTH); + } + else if (this.WRONG_AUTH) + { + return nameof(this.WRONG_AUTH); + } + else + { + return string.Join(string.Empty, this.bits); + } + } + + public static byte OK = 0; + + public static byte EXPIREDAUTH = 4; + + public static implicit operator byte(PAMStatus status) + => status?.bits?.GetByteLE() ?? 0xFF; + + public static implicit operator string(PAMStatus status) + => status?.ToString(); + } +} diff --git a/Common/CommonConsole/RFTelegrams/Pams/DummyPam.cs b/Common/CommonConsole/RFTelegrams/Pams/DummyPam.cs new file mode 100644 index 00000000..9e33b84c --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/Pams/DummyPam.cs @@ -0,0 +1,7 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams +{ + public class DummyPam + { + public static implicit operator byte[](DummyPam dummyPam) => new byte[0]; + } +} diff --git a/Common/CommonConsole/RFTelegrams/Pams/ResetAlarms.cs b/Common/CommonConsole/RFTelegrams/Pams/ResetAlarms.cs new file mode 100644 index 00000000..b4d3e53a --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/Pams/ResetAlarms.cs @@ -0,0 +1,70 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams +{ + public class ResetAlarms + { + private readonly byte[] bits; + + public ResetAlarms(byte _byte = 0xFF) + => this.bits = _byte.GetBitsLE(); + + public bool SpecificError + { + get => this.bits[0] == 1; + set => this.bits[0] = (byte)(value ? 1 : 0); + } + + public bool MediumAbsent + { + get => this.bits[1] == 1; + set => this.bits[1] = (byte)(value ? 1 : 0); + } + + public bool BrokenPipe + { + get => this.bits[2] == 1; + set => this.bits[2] = (byte)(value ? 1 : 0); + } + + public bool Backflow + { + get => this.bits[3] == 1; + set => this.bits[3] = (byte)(value ? 1 : 0); + } + + public bool MetrologyUnavailable + { + get => this.bits[4] == 1; + set => this.bits[4] = (byte)(value ? 1 : 0); + } + + public bool MagneticTamper + { + get => this.bits[5] == 1; + set => this.bits[5] = (byte)(value ? 1 : 0); + } + + public bool Leak + { + get => this.bits[6] == 1; + set => this.bits[6] = (byte)(value ? 1 : 0); + } + + public bool LowBattery + { + get => this.bits[7] == 1; + set => this.bits[7] = (byte)(value ? 1 : 0); + } + + public static implicit operator byte[] (ResetAlarms resetAlarms) => new byte[] + { + 0x03, + resetAlarms.bits.GetByteLE(), + 0x43, + 0x01, + 0x14, + 0x30, + 0x68, + 0xD0 + }; + } +} diff --git a/Common/CommonConsole/RFTelegrams/RFTask.cs b/Common/CommonConsole/RFTelegrams/RFTask.cs new file mode 100644 index 00000000..5efb53ae --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/RFTask.cs @@ -0,0 +1,86 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using global::Common.Hardware.SIRT; + using global::Common.Hardware.SIRT.Tasks; + + using System; + using System.Collections.Generic; + + public class RFTask : WritePamTask + { + private readonly Stack messages = new Stack(); + + public SIRTMessage AKN { get; private set; } + + public SIRTMessage BUP { get; private set; } + + public SIRTMessage LAT { get; private set; } + + public SIRTMessage DEBUG { get; private set; } + + public SIRTMessage SEMI { get; private set; } + + public SIRTMessage LastOrDefault() + => this.messages.Count > 0 + ? this.messages.Peek() + : new SIRTMessage(); + + public override string ToString() + => BitConverter.ToString(this.request.Payload); + + protected override void OnMessageSent(SIRTMessage request) + => this.messages.Push(request); + + protected override void OnUnknownReceived(SIRTMessage unknown) + => this.messages.Push(unknown); + + protected override void OnAKNReceived(SIRTMessage akn) + { + this.AKN = akn; + + this.messages.Push(akn); + } + + protected override void OnBUPReceived(SIRTMessage bup) + { + this.BUP = bup; + + this.messages.Push(bup); + } + + protected override void OnLATReceived(SIRTMessage lat) + { + this.LAT = lat; + + this.messages.Push(lat); + } + + protected override void OnDEBUGReceived(SIRTMessage debug) + { + this.DEBUG = debug; + + this.messages.Push(debug); + } + + protected override void OnSEMIReceived(SIRTMessage semi) + { + this.SEMI = semi; + + this.messages.Push(semi); + + if (semi.Payload.Length > 11) + { + var pamStatus = new PAMStatus(semi.Payload[11]); + + if (pamStatus == PAMStatus.OK) + { + base.OnSEMIReceived(semi); + } + else + { + this.SetError(); + } + } + } + } +} diff --git a/Common/CommonConsole/RFTelegrams/RSSI.cs b/Common/CommonConsole/RFTelegrams/RSSI.cs new file mode 100644 index 00000000..e5b337e0 --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/RSSI.cs @@ -0,0 +1,42 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public class RSSI + { + public RSSI(byte value, int mhz) + { + this.Value = value; + + if (mhz == 433) + { + this.Dbm = value * 0.5 - 140; + this.Percent = value * 0.7333 - 57.6667; + } + else if (mhz == 868) + { + this.Dbm = value * 0.5 - 131.3; + this.Percent = value * 0.66 - 40.316; + } + + if (this.Percent > 100) + { + this.Percent = 100; + } + else if (this.Percent < 0) + { + this.Percent = 0; + } + } + + public byte Value { get; } + + public double Dbm { get; } + + public double Percent { get; } + + public override string ToString() => $"{this.Dbm}dBm ({this.Percent:0.0}%)"; + + public static implicit operator byte(RSSI rssi) => rssi?.Value ?? 0; + + public static implicit operator string(RSSI rssi) => rssi?.ToString(); + } +} diff --git a/Common/CommonConsole/RFTelegrams/SEMI.cs b/Common/CommonConsole/RFTelegrams/SEMI.cs new file mode 100644 index 00000000..abf03f0c --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/SEMI.cs @@ -0,0 +1,176 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using Pams; + + using System; + using System.Text; + + /// + /// TODO: SEMI from the SirtDLL is not complete, + /// + public class SEMI + { + //public const int MIN_LENGTH = 120; + public const int MIN_LENGTH = 97; + + public SEMI(byte[] payload, int mhz) + { + this.AppCode = (AppCode)payload[0]; + this.Counter = payload[1]; + this.Address = payload.ToUInt32BE(2); + this.Reading = payload.ToInt32BE(6); + this.MainAlarmByte = new ResetAlarms(payload[10]); + this.PAMStatus = new PAMStatus(payload[11]); + this.RSSI = new RSSI(payload[12], mhz); + this.MeterType = (MeterTypes)payload[13]; + this.TransmissionInterval = payload.ToUInt16BE(14); + this.LATInterval = payload[16]; + this.ActualFlow = payload.ToUInt16BE(17); + this.BackwardVolume = payload.ToUInt32BE(19); + this.Units = (DisplayUnits)payload[23]; + this.MBusStatus = payload[24]; + this.MBusTransmissionInterval = payload.ToUInt16BE(25); + this.MainAlarmMask = new ResetAlarms(payload[27]); + this.LeakageDetectionParameters = payload[28]; + this.BrokenPipeDetectionParameters = payload[29]; + this.BatteryRemainingYears = payload.ToUInt16BE(30) / (4D * 365); + this.ReminingBatteryCapacity = payload[32]; + this.MaximumFlow = payload.ToUInt16BE(33); + this.TimeSinceMaximumFlow = payload.ToUInt16BE(35); + this.TimeSinceLowBattery = payload.ToUInt16BE(37); + this.AlarmLeakage = new Epoch20000101(payload.ToUInt32BE(39), DateTimeKind.Local); + this.AlarmAirInPipe = new Epoch20000101(payload.ToUInt32BE(43), DateTimeKind.Local); + this.AlarmReverseFlow = new Epoch20000101(payload.ToUInt32BE(47), DateTimeKind.Local); + this.AlarmBrokenPipe = new Epoch20000101(payload.ToUInt32BE(51), DateTimeKind.Local); + this.DataLogContent = payload.ToUInt16BE(55); + this.DataLoggingInterval = payload.ToUInt16BE(57); + this.FDRContent = payload.ToUInt16BE(59); + this.FDRDayOfMonth = payload[61]; + this.ActualDateTime = new Epoch20000101(payload.ToUInt32BE(62), DateTimeKind.Local); + this.HistoricalErrorDays = payload[66]; + this.CustomerSpecificText = Encoding.ASCII.GetString(payload, 67, 9); + this.TimeOfFDRReset = payload.ToUInt16BE(76); + this.TimeOfLogReset = payload.ToUInt16BE(78); + this.ActualPressure = payload.ToUInt16BE(80); + this.ActualTemperature = payload[82]; + this.PressureParameter = Encoding.ASCII.GetString(payload, 83, 7); + this.TemperatureParameter = payload.ToInt32BE(90); + this.PulseOutParameter = payload[94]; + this.AlarmByteExtended = payload[95]; + this.AlarmMaskExtended = payload[96]; + //this.AlarmMaxPressureTime = payload.ToUInt32BE(97); + //this.AlarmMinPressureTime = payload.ToUInt32BE(101); + //this.AlarmMaxTemperatureTime = payload.ToUInt32BE(105); + //this.AlarmMinTemperatureTime = payload.ToUInt32BE(109); + //this.LogContentPressureTemperature = payload.ToUInt16BE(113); + //this.FDRContentPressureTemperature = payload.ToUInt16BE(115); + //this.UnitExtraFlags = payload[117]; + //this.MeterSize = payload[118]; + //this.PressureCalibrationOffset = payload[119]; + } + + public AppCode AppCode { get; } + + public byte Counter { get; } + + public uint Address { get; } + + public int Reading { get; } + + public ResetAlarms MainAlarmByte { get; } + + public PAMStatus PAMStatus { get; } + + public RSSI RSSI { get; } + + public MeterTypes MeterType { get; } + + public ushort TransmissionInterval { get; } + + public byte LATInterval { get; } + + public ushort ActualFlow { get; } + + public uint BackwardVolume { get; } + + public DisplayUnits Units { get; } + + public byte MBusStatus { get; } + + public ushort MBusTransmissionInterval { get; } + + public ResetAlarms MainAlarmMask { get; } + + public byte LeakageDetectionParameters { get; } + + public byte BrokenPipeDetectionParameters { get; } + + public double BatteryRemainingYears { get; } + + public byte ReminingBatteryCapacity { get; } + + public ushort MaximumFlow { get; } + + public ushort TimeSinceMaximumFlow { get; } + + public ushort TimeSinceLowBattery { get; } + + public DateTime AlarmLeakage { get; } + + public DateTime AlarmAirInPipe { get; } + + public DateTime AlarmReverseFlow { get; } + + public DateTime AlarmBrokenPipe { get; } + + public LogContent DataLogContent { get; } + + public ushort DataLoggingInterval { get; } + + public LogContent FDRContent { get; } + + public byte FDRDayOfMonth { get; } + + public DateTime ActualDateTime { get; } + + public byte HistoricalErrorDays { get; } + + public string CustomerSpecificText { get; } + + public ushort TimeOfFDRReset { get; } + + public ushort TimeOfLogReset { get; } + + public ushort ActualPressure { get; } + + public byte ActualTemperature { get; } + + public string PressureParameter { get; } + + public int TemperatureParameter { get; } + + public byte PulseOutParameter { get; } + + public byte AlarmByteExtended { get; } + + public byte AlarmMaskExtended { get; } + + //public uint AlarmMaxPressureTime { get; } + + //public uint AlarmMinPressureTime { get; } + + //public uint AlarmMaxTemperatureTime { get; } + + //public uint AlarmMinTemperatureTime { get; } + + //public ushort LogContentPressureTemperature { get; } + + //public ushort FDRContentPressureTemperature { get; } + + //public byte UnitExtraFlags { get; } + + //public byte MeterSize { get; } + + //public byte PressureCalibrationOffset { get; } + } +} diff --git a/Common/CommonConsole/RFTelegrams/SIRTServer.cs b/Common/CommonConsole/RFTelegrams/SIRTServer.cs new file mode 100644 index 00000000..d628b78c --- /dev/null +++ b/Common/CommonConsole/RFTelegrams/SIRTServer.cs @@ -0,0 +1,201 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using CommonConsole.RFTelegrams.Pams; + using global::Common.Hardware.SIRT; + using global::Common.Hardware.SIRT.Tasks; + + using Pams; + + using System; + + internal class SIRTServer + { + private static Action messageCallback; + private static Action errorMessageCallback; + private static readonly SIRTHub sirtHub = new SIRTHub(); + + /// + /// Connects SIRT's globaly for the application + /// + /// Action that receives info messages + /// Action that receives error messages + /// The COM-Ports to be connected + /// true - if all ports connected otherwise false + public static bool StartServer(Action messageHandler, Action errorMessageHandler, params int[] comPorts) + { + string sirtId; + int frequency; + bool succeeded = true; + + messageHandler?.Invoke(new string('-', 100)); + + foreach (var comport in comPorts) + { + succeeded = ConnectSIRT(comport, out sirtId, out frequency); + + if (succeeded) + { + messageHandler?.Invoke($"COM{comport}|{sirtId}|{frequency}MHz - connected"); + messageHandler?.Invoke(new string('-', 100)); + } + else + { + errorMessageHandler?.Invoke($"SIRT at COM{comport} not connected!"); + errorMessageHandler?.Invoke(new string('-', 100)); + + break; + } + } + + if (succeeded) + { + messageCallback = messageHandler; + errorMessageCallback = errorMessageHandler; + } + + return succeeded; + } + + public static bool StartProgramming(int frequency, uint address, string encryptionKey, int repeatsCount = 3) + { + var succeeded = true; + var encryptionBytes = encryptionKey.GetBytes(); + + if (succeeded) + { + succeeded = SendPAM(task => + { + task.WakeUpCmd = true; + task.DelPamSemi = true; + task.WakeUpModul = true; + task.IsEncrypted = true; + task.Frequency = frequency; + task.RequestAddress = address; + task.EncryptionKey = encryptionBytes; + task.Data = new DummyPam(); + } + , repeatsCount); + } + + if (succeeded) + { + succeeded = SendPAM(task => + { + task.DelPamSemi = true; + task.IsEncrypted = true; + task.Frequency = frequency; + task.RequestAddress = address; + task.EncryptionKey = encryptionBytes; + task.Data = new ResetAlarms(0xFF); + } + , repeatsCount); + } + + if (succeeded) + { + succeeded = SendPAM(task => + { + task.DelPamSemi = true; + task.IsEncrypted = true; + task.Frequency = frequency; + task.RequestAddress = address; + task.EncryptionKey = encryptionBytes; + task.Data = new ResetAlarms(0xFE); + } + , repeatsCount); + } + + //if (succeeded) + //{ + // succeeded = SendPAM(task => + // { + // task.DelPamSemi = true; + // task.IsEncrypted = true; + // task.Frequency = frequency; + // task.RequestAddress = address; + // task.EncryptionKey = encryptionBytes; + // task.Data = ChangeWakeUp.GoSleepAutoOn; + // } + // , repeatsCount); + //} + + return succeeded; + } + + /// + /// Dispose all SIRT's globaly for the application. + /// + public static void Dispose() + { + void LogState(object state) => messageCallback?.Invoke(state?.ToString()); + + sirtHub.StateLogging += LogState; + sirtHub.Stop(); + sirtHub.StateLogging -= LogState; + + messageCallback = null; + errorMessageCallback = null; + } + + private static bool ConnectSIRT(int portno, out string sirtId, out int frequency) + => sirtHub.TryOpen($"COM{portno}", out sirtId, out frequency); + + private static bool SendPAM(Action taskOptions, int repeatsCount = 3) + { + void LogMessage(SIRTMessage message) => messageCallback?.Invoke(message.ToString()); + + var dashes = new string('-', 100); + var cordonelTask = new RFTask(); + var succeeded = false; + + taskOptions(cordonelTask); + + cordonelTask.MessageSent += LogMessage; + cordonelTask.MessageReceived += LogMessage; + + for (var i = 1; i <= repeatsCount && cordonelTask.State != SIRTTaskState.Completed && cordonelTask.State != SIRTTaskState.Cancelled; i++) + { + if (sirtHub.Start(cordonelTask)) + { + cordonelTask.Wait(); + } + } + + cordonelTask.MessageReceived -= LogMessage; + cordonelTask.MessageSent -= LogMessage; + + if (cordonelTask.State == SIRTTaskState.Completed) + { + succeeded = true; + + messageCallback?.Invoke($"{"CMD",20}: {cordonelTask}"); + messageCallback?.Invoke($"{"State",20}: {cordonelTask.State}"); + + var pam = new PAMStatus(cordonelTask.SEMI.Payload[11]); + messageCallback?.Invoke($"{"PAM Status",20}: {pam}"); + + var alarm = new AlarmMask(cordonelTask.SEMI.Payload[10]); + messageCallback?.Invoke(alarm.ToString()); + messageCallback?.Invoke(dashes); + + var semi = new SEMI(cordonelTask.SEMI.Payload, 868); + } + else + { + succeeded = false; + + messageCallback?.Invoke($"{"CMD",20}: {cordonelTask}"); + messageCallback?.Invoke($"{"State",20}: {cordonelTask.State}"); + + var pam = new PAMStatus(cordonelTask.SEMI.Payload[11]); + messageCallback?.Invoke($"{"PAM Status",20}: {pam}"); + + var alarm = new AlarmMask(cordonelTask.SEMI.Payload[10]); + messageCallback?.Invoke(alarm.ToString()); + messageCallback?.Invoke(dashes); + } + + return succeeded; + } + } +} diff --git a/Common/CommonCore.Configuration/CommonCore.Configuration.csproj b/Common/CommonCore.Configuration/CommonCore.Configuration.csproj index c35066ed..fb275dff 100644 --- a/Common/CommonCore.Configuration/CommonCore.Configuration.csproj +++ b/Common/CommonCore.Configuration/CommonCore.Configuration.csproj @@ -21,7 +21,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG prompt 4 7.0 @@ -38,7 +38,7 @@ true bin\_MANUAL_CONTROL\ - DEBUG;TRACE + TRACE;DEBUG full AnyCPU prompt @@ -81,6 +81,25 @@ bin\x64\Debug-local IIS-CUST\ + + true + bin\VPN_Debug\ + TRACE;DEBUG;URI_OLD_DNS + full + AnyCPU + 7.0 + prompt + + + true + bin\x64\VPN_Debug\ + DEBUG;TRACE + full + x64 + 7.0 + prompt + MinimumRecommendedRules.ruleset + ..\packages\Newtonsoft.Json.13.0.3\lib\net40\Newtonsoft.Json.dll @@ -98,12 +117,17 @@ Properties\SharedAssemblyInfo.cs + + + + + - - - - - + + + + + diff --git a/Common/Production/ProductionUiCordonel/App.xaml.cs b/Common/Production/ProductionUiCordonel/App.xaml.cs index e3aa5d75..403ad1c0 100644 --- a/Common/Production/ProductionUiCordonel/App.xaml.cs +++ b/Common/Production/ProductionUiCordonel/App.xaml.cs @@ -11,6 +11,8 @@ namespace Xylem.Common.Production.ProductionUiCordonel /// public partial class App { + private static readonly String EolProcess = "ShippingUiCordonel"; + private static readonly String PickingProcess = "AssemblyUiCordonel"; private void Application_Startup(Object sender, StartupEventArgs e) { switch (ConfigurationManager.AppSettings["Mode"]) @@ -18,21 +20,21 @@ namespace Xylem.Common.Production.ProductionUiCordonel case "1": var ProductionWindow = new ProductionWindow( ProductionUiCordonel.Properties.Resources.StrEolSoftwareNameVersion, - "ShippingUiCordonel", new EolProcessStateDef(), false); + EolProcess, new EolProcessStateDef(), false); ProductionWindow.Show(); break; case "2": ProductionWindow = new ProductionWindow( ProductionUiCordonel.Properties.Resources.StrPickingSoftwareNameVersion, - "PickingUiCordonel", new PickingProcessStateDef(), true); + PickingProcess, new PickingProcessStateDef(), true); ProductionWindow.Show(); break; default: ProductionWindow = new ProductionWindow( ProductionUiCordonel.Properties.Resources.StrEolSoftwareNameVersion, - "ShippingUiCordonel", new EolProcessStateDef(), false); + EolProcess, new EolProcessStateDef(), false); ProductionWindow.Show(); break; } diff --git a/Common/Production/ProductionUiCordonel/ApplicationSettings.cs b/Common/Production/ProductionUiCordonel/ApplicationSettings.cs deleted file mode 100644 index 34e52c25..00000000 --- a/Common/Production/ProductionUiCordonel/ApplicationSettings.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Newtonsoft.Json; - -namespace Xylem.Common.Production.ProductionUiCordonel -{ - - /// - /// Configuration of ProductionUi - /// - public class ApplicationSettings - { - - public class Pos - { - public Double Left { get; set; } - public Double Top { get; set; } - public Double Height { get; set; } - public Double Width { get; set; } - } - public class MultiFormChilds - { - public Type ViewModelType { get; set; } - public Boolean Visisble { get; set; } - public String Name { get; set; } - public Int32 Slot { get; set; } - public String TextPort { get; set; } - public Pos StartPos { get; set; } - - } - public Int32 Slot { get; set; } - - public Int32? PressureStationId { get; set; } - public Boolean AutoDetect { get; set; } - - public Boolean AccessToPresuretestTab { get; set; } - public Boolean AccessToMarrieTab { get; set; } - public Boolean AccessToFinalcheckTab { get; set; } - - public Boolean AccessToSettingTab { get; set; } - public Boolean AccessToStatusTab { get; set; } - public Boolean AccessToPickingTab { get; set; } - - - public Int32? SirtComport433 { get; set; } - public Int32? SirtComport866 { get; set; } - public Int32? SirtBoxNr { get; set; } - - public Int32? StationId { get; set; } - - public List ChildForms { get; set; } - - /// - /// ctor - /// - public ApplicationSettings() - { - Slot = 0; - AutoDetect = false; - AccessToPresuretestTab = false; - AccessToMarrieTab = false; - AccessToFinalcheckTab = false; - AccessToSettingTab = false; - AccessToPickingTab = false; - AccessToStatusTab = false; - PressureStationId = null; - SirtComport433 = null; - SirtComport866 = null; - SirtBoxNr = null; - ChildForms = new List(); - StationId = null; - } - /// - public ApplicationSettings(String file) - { - //var configFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - //nameof(Xylem.Common.Hardware.WaterMeter.Genesis), file); - - //if (!File.Exists(configFile)) - //{ - var configFile = Path.Combine(file); - if (!File.Exists(configFile)) - { - Slot = 0; - AutoDetect = false; - AccessToPresuretestTab = false; - AccessToMarrieTab = false; - AccessToFinalcheckTab = false; - AccessToSettingTab = false; - AccessToPickingTab = false; - AccessToStatusTab = false; - PressureStationId = null; - ChildForms = new List(); - StationId = null; - return; - } - //} - - using (var tr = new StreamReader(configFile)) - { - var meterConfig = JsonConvert.DeserializeObject(tr.ReadToEnd()); - if (meterConfig != null) - { - Slot = meterConfig.Slot; - AutoDetect = meterConfig.AutoDetect; - AccessToPresuretestTab = meterConfig.AccessToPresuretestTab; - AccessToMarrieTab = meterConfig.AccessToMarrieTab; - AccessToFinalcheckTab = meterConfig.AccessToFinalcheckTab; - AccessToSettingTab = meterConfig.AccessToSettingTab; - AccessToPickingTab = meterConfig.AccessToPickingTab; - AccessToStatusTab = meterConfig.AccessToStatusTab; - PressureStationId = meterConfig.PressureStationId; - - ChildForms = meterConfig.ChildForms; - StationId = meterConfig.StationId; - } - } - - } - - public void Update(String file) - { - var configFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - nameof(Hardware.WaterMeter.Genesis), file); - - if (!File.Exists(configFile)) - { - configFile = Path.Combine(file); - } - - File.WriteAllText(file, JsonConvert.SerializeObject(this)); - } - - - } -} diff --git a/Common/Production/ProductionUiCordonel/BarcodeInput/Listener.cs b/Common/Production/ProductionUiCordonel/BarcodeInput/Listener.cs deleted file mode 100644 index a5e49ac4..00000000 --- a/Common/Production/ProductionUiCordonel/BarcodeInput/Listener.cs +++ /dev/null @@ -1,102 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using System.Threading.Tasks; -//using System.Windows.Forms; - -//namespace ProductionUiCordonel.BarcodeInput -//{ -// public class Listener : NativeWindow -// { -// /// -// /// Initializes a new instance of the BarcodeScannerListener -// /// class. The raw input devices that this class will listen to are -// /// registered with the given window handle. -// /// -// /// the form that should listen for -// /// barcode scans -// /// if the form is null -// /// if we are unable to register -// /// for raw input devices -// /// if an error occurs -// /// during configuration -// public Listener(Form form) -// { -// IntPtr hwnd; - -// if (form == null) -// { -// throw new ArgumentNullException("form"); -// } - -// hwnd = form.Handle; - -// HookRawInput(hwnd); // We'll take a look at this in a minute -// this.HookHandleEvents(form); - -// this.AssignHandle(hwnd); -// } -// /// -// /// Registers ourselves to listen to raw input from keyboard-like devices. -// /// -// /// the handle of the form that will receive the raw -// /// input messages -// /// if the call to register with the -// /// raw input API fails for some reason -// private static void HookRawInput(IntPtr hwnd) -// { -// NativeMethods.RAWINPUTDEVICE[] rid; - -// rid = new NativeMethods.RAWINPUTDEVICE[1]; - -// rid[0].usUsagePage = 0x01; // USB HID Generic Desktop Page -// rid[0].usUsage = 0x06; // Keyboard Usage ID -// rid[0].dwFlags = NativeMethods.RawInputDeviceFlags.RIDEV_INPUTSINK; -// rid[0].hwndTarget = hwnd; - -// if (!NativeMethods.RegisterRawInputDevices(rid, (uint)rid.Length, (uint)Marshal.SizeOf(rid[0]))) -// { -// InvalidOperationException e; - -// e = new InvalidOperationException( -// "The barcode scanner listener could not register for raw input devices.", -// new Win32Exception()); -// throw e; -// } -// } - -// /// -// /// Hooks into the form's HandleCreated and HandleDestoryed events -// /// to ensure that we start and stop listening at appropriate times. -// /// -// /// the form to listen to -// private void HookHandleEvents(Form form) -// { -// form.HandleCreated += this.OnHandleCreated; -// form.HandleDestroyed += this.OnHandleDestroyed; -// } - -// /// -// /// When the form's handle is created, let's hook into it so we can see -// /// the WM_INPUT event. -// /// -// /// the form whose handle was created -// /// the event arguments -// private void OnHandleCreated(object sender, EventArgs e) -// { -// this.AssignHandle(((Form)sender).Handle); -// } - -// /// -// /// When the form's handle is destroyed, let's unhook from it so we stop -// /// listening and allow the OS to free up its resources. -// /// -// /// the form whose handle was destroyed -// /// the event arguments -// private void OnHandleDestroyed(object sender, EventArgs e) -// { -// this.ReleaseHandle(); -// } -// } -//} diff --git a/Common/Production/ProductionUiCordonel/Data/FinalTestState.cs b/Common/Production/ProductionUiCordonel/Data/FinalTestState.cs deleted file mode 100644 index 1981f6d7..00000000 --- a/Common/Production/ProductionUiCordonel/Data/FinalTestState.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace ProductionUiCordonel.Data -{ - /// - /// Genesis meter final test states - /// - public enum FinalTestState - { - /// - /// Idle (nothing to do) - /// - Idle, - /// - /// Start the initial execution - /// - StartInitial, - /// - /// Error handling - /// - Error, - /// - /// Single processing step failed - /// - StepFailed, - /// - /// Repeat last step - /// - RepeatStep, - /// - /// Repeat the entire final test - /// - RepeatFinalTest, - /// - /// Final test failed - /// - FinalTestFailed, - /// - /// Check the actual shipping state - /// - CheckShippingState, - /// - /// Check the attachments - /// - CheckAttachments, - /// - /// Check the order number - /// - CheckOrderNumber, - /// - /// Check the serial number - /// - CheckSerialNumber, - /// - /// Connect to Cordonel - /// - ConnectCordonel, - /// - /// Store all configurations to FLASH memory - /// - StoreAllConfigurations, - /// - /// Reboot the Cordonel to check all parameters being stored to FLASH memory - /// - RebootCordonel, - /// - /// Finalize process - /// - FinalizeProcess, - /// - /// Final parametrization fixed values - /// - FinalParametrizationFix, - /// - /// Final parametrization with VAKO and CSD - /// - FinalParametrizationVakoCsd, - /// - /// Read out all parametrization values - /// - FullReadOutParametrization, - /// - /// Check all settings for against required values - /// - ConfigurationCheck, - /// - /// Acquire, process set the password file - /// - ProcessPasswordFile, - /// - /// Process special configuration - /// - ProcessSpecialConfig, - /// - /// Prepare shipping mode - /// - PrepareShippingMode, - /// - /// Delimiter for list - /// - StateListDelimiter - } -} \ No newline at end of file diff --git a/Common/Production/ProductionUiCordonel/Data/FinalTestStateInfo.cs b/Common/Production/ProductionUiCordonel/Data/FinalTestStateInfo.cs deleted file mode 100644 index bfcbca55..00000000 --- a/Common/Production/ProductionUiCordonel/Data/FinalTestStateInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Linq; -using ProductionUiCordonel.Properties; - -namespace ProductionUiCordonel.Data -{ - /// - /// Concatenation of state and string - /// - public static class FinalTestStateInfo - { - /// - /// Build state information - /// - private static readonly FinalTestStateText[] StateInfos; - - /// - /// Ctor - /// - static FinalTestStateInfo() - { - StateInfos = new FinalTestStateText[(Int32)FinalTestState.StateListDelimiter]; - StateInfos[(Int32)FinalTestState.Idle].State = FinalTestState.Idle; - StateInfos[(Int32)FinalTestState.Idle].Message = Resources.StrStateIdle; - - StateInfos[(Int32)FinalTestState.StartInitial].State = FinalTestState.StartInitial; - StateInfos[(Int32)FinalTestState.StartInitial].Message = Resources.StrStateStartInitial; - - } - - /// - /// Get the current information - /// - /// state to search for information text - public static String GetTextFromState(FinalTestState state) - { - return (from stateInfo in StateInfos - where stateInfo.State == state - select stateInfo.Message).FirstOrDefault(); - } - /// - /// Get the state of the text - /// - /// information text to search if state is assigned - public static FinalTestState GetStateFromText(String text) - { - return (from stateInfo in StateInfos - where stateInfo.Message == text - select stateInfo.State).FirstOrDefault(); - } - } -} diff --git a/Common/Production/ProductionUiCordonel/Data/FinalTestStateText.cs b/Common/Production/ProductionUiCordonel/Data/FinalTestStateText.cs deleted file mode 100644 index 4bfd80cf..00000000 --- a/Common/Production/ProductionUiCordonel/Data/FinalTestStateText.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace ProductionUiCordonel.Data -{ - /// - /// Concatenation between final test state and text - /// - public struct FinalTestStateText - { - /// - /// The state of the final test - /// - public FinalTestState State; - /// - /// The message text of the final test state - /// - public String Message; - } -} diff --git a/Common/Production/ProductionUiCordonel/Data/PickingResultData.cs b/Common/Production/ProductionUiCordonel/Data/PickingResultData.cs deleted file mode 100644 index da089f8e..00000000 --- a/Common/Production/ProductionUiCordonel/Data/PickingResultData.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Windows.Media; -using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; -using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; - -namespace Xylem.Common.Production.ProductionUiCordonel.Data -{ - public class PickingItemCheckReturn - { - public Boolean? Result; - public String Msg; - } - -public abstract class PickingResultBaseData : IPickingResultData - { - public String Ident { get; set; } - - public Int32 Index { get; set; } - - public String CheckText { get; set; } - - public String CurrentValueText { get; set; } - - public Boolean? Result { get; set; } - - public Boolean HasError { get; set; } - - public Brush ResultColor => getColorFromResult(); - public abstract Func Action { get; } - - private Brush getColorFromResult() - { - var converter = new BrushConverter(); - var brush = (Brush)converter.ConvertFromString("#000000"); - - if (Result.HasValue) // && a.Result.Value )) - { - if (!Result.Value) - { - brush = (Brush)converter.ConvertFromString("#FF8000"); - } - else - { - brush = (Brush)converter.ConvertFromString("#419C14"); - } - - } - return brush; - } - - } - public interface IPickingResultData - { - String Ident { get; set; } - - Int32 Index { get; set; } - String CheckText { get; set; } - - String CurrentValueText { get; set; } - - Boolean? Result { get; set; } - - Boolean HasError { get; set; } - - Brush ResultColor { get; } - - Func Action { get; } - } - public class PickingResultRegisterData : PickingResultBaseData - { - public String RegisterIdent { get; set; } - - public GenesisMeter ReadMeter { get; set; } - - public Object CompareObject { get; set; } - - public override Func Action => staticReadAndCompareAction(); - - public Func staticReadAndCompareAction() - { - return delegate - { - var retComp = new PickingItemCheckReturn(); - retComp.Result = null; - retComp.Msg = "-"; - if (ReadMeter != null && ReadMeter.IsLoggedOn) - { - var r = ReadMeter.ReadRegister(RegisterIdent); - - if (CompareObject is UInt32 intNumber) - { - retComp.Result = intNumber.Equals(RegisterConverter.ByteArrayToValue(r)); - retComp.Msg = intNumber.ToString(); - } - else if (CompareObject is Boolean boolCompare) - { - retComp.Result = boolCompare.Equals(RegisterConverter.ByteArrayToValue(r)); - retComp.Msg = boolCompare.ToString(); - } - - } - - return retComp; - }; - } - } - - public class PickingResultCustomCheckData : PickingResultBaseData - { - - public PickingResultCustomCheckData(Func action) - { - _action = action; - } - - public readonly Func _action; - public override Func Action => _action; - } - -} diff --git a/Common/Production/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs b/Common/Production/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs deleted file mode 100644 index d5468de5..00000000 --- a/Common/Production/ProductionUiCordonel/Data/PressureResultDataNotifyable.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Runtime.CompilerServices; -using Xylem.Common.Logic.ProductionOrderCore.TestResults; - -namespace Xylem.Common.Production.ProductionUiCordonel.Data -{ - public class PressureResultDataNotifyable : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - - protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - public PressureResultDataNotifyable(PressureResultData baseData) - { - LeakRate = baseData.LeakRate; - Passed = baseData.Passed; - PcbId = baseData.PcbId; - Remark = baseData.Remark; - Rev = baseData.Rev; - TesterName = baseData.TesterName; - Testpoints = new ObservableCollection(); - baseData.TestPoints.ForEach(o => Testpoints.Add(o)); - TestPressure = baseData.TestPressure; - } - public PressureResultDataNotifyable() - { - - } - public void InternalPropertyChanged(String propertyName = "") - { - NotifyPropertyChanged(propertyName); - } - - - public String PcbId; - - - private Int32 rev; - - public Int32 Rev - { - get => rev; - set - { - rev = value; - InternalPropertyChanged(nameof(Rev)); - } - } - private Boolean? passed = false; - public Boolean? Passed - { - get => passed; - set - { - passed = value; - InternalPropertyChanged(nameof(Passed)); - } - } - - - - private String testerName = "C. Röhl"; - public String TesterName - { - get => testerName; - set - { - testerName = value; - InternalPropertyChanged(nameof(TesterName)); - } - } - - private String testPressure = "6"; - public String TestPressure - { - get => testPressure; - set - { - testPressure = value; - InternalPropertyChanged(nameof(TestPressure)); - } - } - - - private String leakRate = " 0,00001"; - public String LeakRate - { - get => leakRate; - set - { - leakRate = value; - InternalPropertyChanged(nameof(LeakRate)); - } - } - - private String remark = ""; - public String Remark - { - get => remark; - set - { - remark = value; - InternalPropertyChanged(nameof(Remark)); - } - } - - - private ObservableCollection testpoints = new ObservableCollection - { - new PressureTestPoints { Ident = 1, Input = "2E-07" }, - new PressureTestPoints { Ident = 2, Input = "2E-07" }, - new PressureTestPoints { Ident = 3, Input = "2E-07" }, - new PressureTestPoints { Ident = 4, Input = "2E-07" }, - new PressureTestPoints { Ident = 5, Input = "2E-07" }, - new PressureTestPoints { Ident = 6, Input = "2E-07" }, - new PressureTestPoints { Ident = 7, Input = "2E-07" }, - new PressureTestPoints { Ident = 8, Input = "2E-07" }, - new PressureTestPoints { Ident = 9, Input = "2E-07" }, - new PressureTestPoints { Ident = 10, Input = "2E-07" } - }; - public ObservableCollection Testpoints - { - get => testpoints; - set - { - testpoints = value; - InternalPropertyChanged(nameof(Testpoints)); - } - } - - internal void SetAllTestPoints(String input) - { - foreach (var item in Testpoints) - { - item.Input = input; - } - InternalPropertyChanged(nameof(Testpoints)); - } - public PressureResultData ToBase() - { - var baseData = new PressureResultData(); - baseData.LeakRate = LeakRate; - baseData.Passed = Passed; - baseData.PcbId = PcbId; - baseData.Remark = Remark; - baseData.Rev = Rev; - baseData.TesterName = TesterName; - baseData.TestPoints = Testpoints.ToList(); - baseData.TestPressure = TestPressure; - return baseData; - } - - } -} - diff --git a/Common/Production/ProductionUiCordonel/Docu/EolRelease.txt b/Common/Production/ProductionUiCordonel/Docu/EolRelease.txt index 433f7316..8c39127e 100644 --- a/Common/Production/ProductionUiCordonel/Docu/EolRelease.txt +++ b/Common/Production/ProductionUiCordonel/Docu/EolRelease.txt @@ -12,10 +12,12 @@ RESTRICTIONS: - None. LATEST: -2.7.6 - 2025-Aug-12 -- Signal comparison error on failed communication for previuosly written configurations. +2.7.7 - 2025-Aug-14 +- New database. CHANGELOG: +2.7.6 - 2025-Aug-13 +- Signal comparison error on failed communication for previuosly written configurations. 2.7.5 - 2025-Aug-12 - Check powermon remaining seconds for shipping threshold, - Restructured production process sequence. diff --git a/Common/Production/ProductionUiCordonel/Docu/ProductionUiCordonel.qea b/Common/Production/ProductionUiCordonel/Docu/ProductionUiCordonel.qea index 4ecc35b0..bbb7f9eb 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/ProductionUiCordonel.qea and b/Common/Production/ProductionUiCordonel/Docu/ProductionUiCordonel.qea differ diff --git a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_ASMBLY_SRSe.docx b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_ASBL_SRSe.docx similarity index 88% rename from Common/Production/ProductionUiCordonel/Docu/TBF_COM_ASMBLY_SRSe.docx rename to Common/Production/ProductionUiCordonel/Docu/TBF_COM_ASBL_SRSe.docx index 5c7e2ce1..96b8e1f8 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_ASMBLY_SRSe.docx and b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_ASBL_SRSe.docx differ diff --git a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc index 35e01172..cc6f4ed8 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc and b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc differ diff --git a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx index e72f8c31..86575832 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx and b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx differ diff --git a/Common/Production/ProductionUiCordonel/Event/StringArgs.cs b/Common/Production/ProductionUiCordonel/Event/StringArgs.cs deleted file mode 100644 index 06808c93..00000000 --- a/Common/Production/ProductionUiCordonel/Event/StringArgs.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace Xylem.Common.Production.ProductionUiCordonel.Event -{ - public class StringArgs : EventArgs - { - public readonly String Content; - public StringArgs(String content) - { - Content = content; - } - } -} diff --git a/Common/Production/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs b/Common/Production/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs deleted file mode 100644 index dbd07012..00000000 --- a/Common/Production/ProductionUiCordonel/Model/IMultiModeChildViewModel.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.ComponentModel; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - public interface IMultiModeChildViewModel : INotifyPropertyChanged, IDisposable - { - String GetChildIdent(); - - void InputText(String text); - } -} diff --git a/Common/Production/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs b/Common/Production/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs deleted file mode 100644 index 2048f0d5..00000000 --- a/Common/Production/ProductionUiCordonel/Model/MarriageMultiModeViewModel.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Threading.Tasks; -using System.Windows; -using Xylem.Common.CommonCore.Configuration; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; -using Xylem.Common.Logic.SoftwareAccessHelper; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - public class MarriageMultiModeViewModel : BaseMultiModeChildViewModel - { - private Boolean canMarry; - public Boolean CanMarry - { - get => canMarry; - set - { - canMarry = value; - NotifyPropertyChanged(); - } - } - - - private Int32 serialNr; - public Int32 SerialNr - { - get => serialNr; - set - { - serialNr = value; - NotifyPropertyChanged(); - } - } - - - private Boolean locked = false; - public MarriageMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : - base(ctrName, slotNR, barcodeTrigger, stationID) - { - VisibilityMarriage = Visibility.Visible; - MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; - } - - internal async Task Store() - { - var url = $"{ServiceUrls.MarriageServiceUrl()}SetPcbToSerial?PcbId={CurrentPcbID}&SerialNumber={SerialNr}&returnMetroData=0"; - - return await Task.Run(() => - { - try - { - - //url = "http://10.49.40.25/MeterProcessState/api/Marriage/SetPcbToSerial?PcbId=201420242&SerialNumber=20728820&returnMetroData=1"; - var resp = LocalWebRequest.GetRequest(url); - - if (!string.IsNullOrEmpty(resp)) - { - if (CurrentMeter != null) - { - CurrentMeter.Login(); - //if (resp.Trim() != "store") - //{ - - - // var myJsonResponse = JsonConvert.DeserializeObject>(resp); - // foreach (var item in myJsonResponse) - // { - // CurrentMeter.WriteRegister(item.RegisterName, item.RegisterValue); - // } - //} - CurrentMeter.SetProcessState(DisplayCodes.Mounted); - CurrentMeter.GetLastProcessState(); - } - - return true; - } - - Log($"No result for {url} on Store"); - return false; - - - } - catch (Exception ex) - { - if (ex is WebException) - { - Log($"Error on Store {url}: {Environment.NewLine} {((WebException)ex).Message}"); - } - else - { - Log(ex.Message); - } - - - } - return false; - - }); - } - - private void PickingMultiModeViewModel_MeterDetectedHandler(Object sender, EventArgs e) - { - CheckBtnEnable(); - } - - private void CheckBtnEnable() - { - if (SerialNr > 0 && !string.IsNullOrEmpty(CurrentPcbID)) - { - CanMarry = true; - } - else - { - CanMarry = false; - } - - } - - - - public override void InputText(String text) - { - try - { - SerialNr = 0; - text = text.Replace(" ", ""); - var preFix = "8SEN20"; - if (text.Contains(preFix) && text.Contains(",")) - { - var tmpSerialNr = 0; - var srText = text.Substring(text.IndexOf(preFix) + preFix.Length, text.IndexOf(",") - preFix.Length); - if (int.TryParse(srText, out tmpSerialNr)) - { - SerialNr = tmpSerialNr; - } - } - CheckBtnEnable(); - } - catch (Exception ex) - { - Log(ex.Message); - } - finally - { - CheckBtnEnable(); - } - - - } - - public override Boolean SlotIsLocked() - { - return locked; - } - } -} diff --git a/Common/Production/ProductionUiCordonel/Model/MultiModeChildViewModel.cs b/Common/Production/ProductionUiCordonel/Model/MultiModeChildViewModel.cs deleted file mode 100644 index a401b1d7..00000000 --- a/Common/Production/ProductionUiCordonel/Model/MultiModeChildViewModel.cs +++ /dev/null @@ -1,332 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Timers; -using System.Windows; -using NLog; -using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; -using Xylem.Common.Utils.Logging; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - public abstract class BaseMultiModeChildViewModel : IMultiModeChildViewModel - { - - private readonly ILogger _logger; - - private Timer tmrAutoDetect; - - public EventHandler OnPcbIdDetect; - public List BarcodeTrigger = new List(); - - private Int32 intervalWithoutDetect = 1000; - private Int32 intervalWithDetect = 10000; - private String _currentPcbID; - private MeterBatch Batch = new MeterBatch(); - private Visibility visibilityMarriage = Visibility.Collapsed; - public Visibility VisibilityMarriage - { - get => visibilityMarriage; - set - { - visibilityMarriage = value; - - NotifyPropertyChanged(); - } - } - - private Visibility visibilityPicking = Visibility.Collapsed; - public Visibility VisibilityPicking - { - get => visibilityPicking; - set - { - visibilityPicking = value; - - NotifyPropertyChanged(); - } - } - - private Visibility visibilityPressure = Visibility.Collapsed; - public Visibility VisibilityPressure - { - get => visibilityPressure; - set - { - visibilityPressure = value; - - NotifyPropertyChanged(); - } - } - - - public String currentSlotStateText = "none"; - public String CurrentSlotStateText - { - get => currentSlotStateText; - set - { - currentSlotStateText = value; - - NotifyPropertyChanged(); - } - } - - - - - private SlotState currentSlotState = SlotState.None; - public SlotState CurrentSlotState - { - get => currentSlotState; - set - { - currentSlotState = value; - switch (currentSlotState) - { - case SlotState.None: - CurrentSlotStateText = "Keiner"; - break; - case SlotState.IsDetecting: - CurrentSlotStateText = "Warte auf Zähler Kontakt"; - break; - case SlotState.Detected: - CurrentSlotStateText = "Zähler detektiert"; - break; - case SlotState.InProgress: - CurrentSlotStateText = "Zähler wird bearbeitet"; - break; - case SlotState.Done: - CurrentSlotStateText = "Zähler wurde bearbeitet"; - break; - case SlotState.ConnectionLost: - CurrentSlotStateText = "Verbindung getrennt"; - break; - case SlotState.Error: - CurrentSlotStateText = "Fehler beim bearbeitet"; - break; - case SlotState.Fatal: - CurrentSlotStateText = "Schwerwiegender Fehler"; - break; - } - NotifyPropertyChanged(); - } - } - - - private String slotInfo = "-"; - public String SlotInfo - { - get => slotInfo; - set - { - slotInfo = value; - NotifyPropertyChanged(); - } - } - - - public enum SlotState - { - None, - IsDetecting, - Detected, - InProgress, - Done, - ConnectionLost, - Error, - Fatal - } - private String childName = "asd"; - public String ChildName - { - get => childName; - set - { - childName = value; - NotifyPropertyChanged(); - } - } - - private String order; - public String Order - { - get => order; - set - { - order = value; - NotifyPropertyChanged(); - } - } - - - public String CurrentPcbID - { - get => _currentPcbID; - set - { - _currentPcbID = value; - - NotifyPropertyChanged(); - } - } - - - public GenesisMeter CurrentMeter { get; private set; } - - public event PropertyChangedEventHandler PropertyChanged; - - protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - public String GetChildIdent() - { - return ChildName; - } - - - public Int32 SlotNr; - public BaseMultiModeChildViewModel(String ctrName, Int32 slotNR,List barcodeTrigger, Int32? StationId = null, Boolean useTimer = true) - { - _logger = NLogHelper.CreateOrGetLogger("ProductionUI"); - ChildName = ctrName; - SlotNr = slotNR; - SlotInfo = SlotNr.ToString(); - if (useTimer) - { - tmrAutoDetect = new Timer(intervalWithoutDetect); - tmrAutoDetect.Elapsed += TmrAutoDetect_Elapsed; - tmrAutoDetect.Enabled = true; - } - - BarcodeTrigger = barcodeTrigger; - - } - public void TmrAutoDetect_Elapsed(Object sender, EventArgs e) - { - CurrentSlotState = SlotState.IsDetecting; - tmrAutoDetect.Enabled = false; - var hasDetect = Detect(SlotNr); - if (hasDetect) - { - CurrentSlotState = SlotState.Detected; - tmrAutoDetect.Interval = intervalWithDetect; - - } - else - { - tmrAutoDetect.Interval = intervalWithoutDetect; - } - tmrAutoDetect.Enabled = true; - } - - public void TextForceUpdate() - { - var hasDetect = Detect(SlotNr); - if (hasDetect) - { - CurrentSlotState = SlotState.Detected; - - } - } - - public virtual void InputText(String text) - { - Order = text; - } - - public void Log(String txt) - { - _logger?.Info(txt); - } - public abstract Boolean SlotIsLocked(); - - public event EventHandler MeterDetectedHandler; - private Boolean Detect(Int32 slot) - { - if (!SlotIsLocked()) - { - Log("Start Detect"); - Boolean hasDetect = false; - if (string.IsNullOrEmpty(CurrentPcbID) || CurrentMeter == null) - { - Batch = new MeterBatch(); - var tryMeter = new GenesisMeter(); - try - { - tryMeter.SetupFromConfigFile(slot); - Batch.AddMeter(tryMeter); - tryMeter.Logout(); - Log("Try to get PcbID"); - CurrentPcbID = tryMeter.GetPcbId(); - - hasDetect = !string.IsNullOrEmpty(CurrentPcbID); - CurrentMeter = tryMeter; - if (hasDetect) - { - Log($"New PcbID detected {CurrentPcbID}"); - MeterDetectedHandler?.Invoke(CurrentMeter, EventArgs.Empty); - } - else - { - Log("No Meter found"); - DisposeAllConnections(); - } - - } - catch (Exception e) - { - Log($"Error occur.{ Environment.NewLine} {e.Message}"); - } - - } - else - { - Log("Check if Meter is still connected"); - var ret = CurrentMeter.GetPcbId(); - if (string.IsNullOrEmpty(ret) || ret != CurrentPcbID) - { - Log("Meter connection lost"); - hasDetect = false; - DisposeAllConnections(); - - CurrentPcbID = ""; - } - else - { - Log("Meter is still connected"); - hasDetect = true; - } - } - return hasDetect; - } - - Log("Meter is still connected (locked)"); - return true; - } - - private void DisposeAllConnections() - { - MeterDetectedHandler?.Invoke(null, EventArgs.Empty); - if (Batch != null) - { - Batch.RemoveAllMeters(); - if (CurrentMeter != null) - { - CurrentMeter.Dispose(); - } - Batch.Dispose(); - } - - } - - public void Dispose() - { - DisposeAllConnections(); - } - } -} diff --git a/Common/Production/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs b/Common/Production/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs deleted file mode 100644 index 928fa233..00000000 --- a/Common/Production/ProductionUiCordonel/Model/MultiModeMasterViewModel.cs +++ /dev/null @@ -1,516 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO.Ports; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; -using System.Windows.Media; -using Logic.ProductionToProductMapper.Cordonel; -using Newtonsoft.Json; -using Xylem.Common.CommonCore.Configuration; -using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; -using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; -using Xylem.Common.Logic.SoftwareAccessHelper; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - internal class MultiModeMasterViewModel : INotifyPropertyChanged - { - private String pickingState = "Warte auf Scanner"; - private String pickingScanner = "keine Verbindung"; - private String pickingSlot = "-"; - private String pickingResult = "-"; - - private Brush pickingResultColor; - public Brush PickingResultColor - { - get => pickingResultColor; - set - { - pickingResultColor = value; - NotifyPropertyChanged(); - } - } - public String PickingState - { - get => pickingState; - set - { - pickingState = value; - NotifyPropertyChanged(); - } - } - public String PickingScanner - { - get => pickingScanner; - set - { - pickingScanner = value; - NotifyPropertyChanged(); - } - } - public String PickingSlot - { - get => pickingSlot; - set - { - pickingSlot = value; - NotifyPropertyChanged(); - } - } - public String PickingResult - { - get => pickingResult; - set - { - pickingResult = value; - NotifyPropertyChanged(); - } - } - public event PropertyChangedEventHandler PropertyChanged; - protected virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "") - { - - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - - - public void StartPicking(CancellationTokenSource cancle) - { - var s = new Task(() => { PickingLoop(cancle.Token); }, cancle.Token); - s.Start(); - } - public enum PickingStateMachine - { - Init, - WaitForScanning, - ScanningDone, - WaitForDetect, - GetOrderDetails, - Compare, - MeterDone, - MeterError, - StartCom, - WaitForBuildingMeterReady, - WaitForBuildingPressureReady, - } - private PickingStateMachine sm = PickingStateMachine.Init; - - private class BarScanner : IDisposable - { - private Boolean isRuning; - public String Input = ""; - private String Port; - private CancellationToken Cancellation; - private Task WaitForScannerTask; - public BarScanner(String port, CancellationToken cancellation) - { - Port = port; - Cancellation = cancellation; - } - public void Start() - { - if (!isRuning) - { - if (Port == null) - { - return; - } - WaitForScannerTask = new Task(() => - { - using (var a = new SerialPort(Port)) - { - a.Open(); - a.NewLine = "\r"; - while (true) - { - if (Cancellation.IsCancellationRequested) - { - isRuning = false; - break; - } - - Input = a.ReadLine(); - a.Close(); - isRuning = false; - break; - } - } - - - }, Cancellation); - WaitForScannerTask.Start(); - } - } - - public void Dispose() - { - if (WaitForScannerTask.Status != TaskStatus.Faulted && WaitForScannerTask.Status != TaskStatus.RanToCompletion && WaitForScannerTask.Status != TaskStatus.Canceled) - { - WaitForScannerTask.Dispose(); - } - - } - } - - - public Boolean Compare(Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) - { - using (var Batch = new MeterBatch()) - { - - using (var meter = new GenesisMeter()) - { - - meter.SetupFromConfigFile(PickingSlotNr); - Batch.AddMeter(meter); - PickingState = "Am Zähler anmelden"; - if (meter.Login()) - { - meter.SetProcessState(DisplayCodes.PickingStarted); - var ret = RunCheck(checkAppsIdVersion, Frequency, MeterSize, PressurePresent, meter); - - if (ret) - { - meter.SetProcessState(DisplayCodes.PickingTested); - var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={meter.PcbId}&FertigungsauftragsNr={PickingOrder}"; - var RetString = LocalWebRequest.PostRequestAsyncAndGetContent(url); - - var result = false; - if (bool.TryParse(RetString, out result)) - { - return result; - - } - } - else - { - meter.SetProcessState(DisplayCodes.PickingFailed); - } - } - } - } - return false; - } - - private Boolean RunCheck(Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent, GenesisMeter meter) - { - PickingState = "Üperprüfe Parameter"; - var FrequencyReadOut = RegisterConverter.ByteArrayToValue(meter.ReadRegister("SENSUSRADIO_FrequencyIndicator")); - if (FrequencyReadOut != Frequency) - { - PickingState = $"Falsche Frequenz! soll {Frequency}MHz ist {FrequencyReadOut}MHz"; - return false; - } - - var MeterSizeReadOut = RegisterConverter.ByteArrayToValue(meter.ReadRegister("GENESISFLOW_MeterSize")); - if (MeterSizeReadOut != MeterSize) - { - PickingState = $"Meter Dn falsch! soll {MeterSize}DN ist {MeterSizeReadOut}DN"; - return false; - } - - - var PressureReadOut = RegisterConverter.ByteArrayToValue(meter.ReadRegister("METROLOGYASST_PressurePresent")); - if (PressureReadOut != PressurePresent) - { - if (PressurePresent) - { - PickingState = "Pcb mit Drucksensor. Laut Auftrag keine verbaut"; - } - else - { - PickingState = "Pcb ohne Drucksensor. Laut Auftrag soll eine verbaut werden"; - } - //todo raus - return false; - } - - foreach (var item in checkAppsIdVersion) - { - - try - { - var MeterFWApp = meter.MeterAppListVersion.First(a => item.Key == a.AppId); - if (MeterFWApp == null || MeterFWApp.Version != item.Value) - { - PickingState = "Falsche FW, bitte Updaten"; - return false; - } - - } - catch (Exception) - { - PickingState = "Fehler beim auslesen der FW"; - return false; - } - - - } - - - try - { - meter.WriteRegister("METROLOGYASST_StoreConfiguration", 1); - Thread.Sleep(100); - var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); - if (!storeRet.All(a => a.Equals(0))) - { - PickingState = "Filesystem corrupt"; - return false; - } - - } - catch (Exception) - { - PickingState = "Fehler beim überprüfen des Filesystems"; - return false; - } - - return true; - } - - private PickingCompareItem PickingOrderDetails; - private BarScanner PickingBarScanner; - private String PickingOrder; - private String PickingPcbId; - - - private String PickingScannerPort = "COM6"; - private Int32 PickingSlotNr = 1; - //PickingState,PickingScanner,PickingSlot,PickingResult - private void PickingLoop(CancellationToken token) - { - while (!token.IsCancellationRequested) - { - switch (sm) - { - case PickingStateMachine.Init: - PickingState = "Initialisierung"; - PickingSlot = $"Inaktiv EP {PickingSlotNr}"; - PickingScanner = $"Geschlossen {PickingScannerPort}"; - //CheckAllPorts? - - sm = PickingStateMachine.StartCom; - - break; - case PickingStateMachine.StartCom: - PickingOrderDetails = null; - PickingScanner = $"Öfffne {PickingScannerPort}"; - //CheckAllPorts? - PickingBarScanner = new BarScanner(PickingScannerPort, token); - PickingBarScanner.Start(); - - sm = PickingStateMachine.WaitForScanning; - - break; - case PickingStateMachine.WaitForScanning: - PickingScanner = $"Offen {PickingScannerPort}"; - PickingState = $"Warte auf Scannereingabe({PickingScannerPort})"; - if (PickingBarScanner != null && !string.IsNullOrEmpty(PickingBarScanner.Input)) - { - PickingOrder = PickingBarScanner.Input; - PickingScanner = $"Geschlossen {PickingScannerPort}"; - PickingBarScanner = null; - - - sm = PickingStateMachine.WaitForDetect; - - } - - break; - case PickingStateMachine.WaitForDetect: - using (var Batch = new MeterBatch()) - { - - using (var tryMeter = new GenesisMeter()) - { - try - { - PickingState = "Warte auf Pcb"; - PickingSlot = $"Öffne EP {PickingSlotNr}"; - tryMeter.SetupFromConfigFile(PickingSlotNr); - Batch.AddMeter(tryMeter); - tryMeter.Logout(); - Log("Try to get PcbID"); - PickingPcbId = tryMeter.GetPcbId(); - - var hasDetect = !string.IsNullOrEmpty(PickingPcbId); - - if (hasDetect) - { - - PickingState = $"Pcb gefunden {PickingPcbId}"; - Log($"New PcbID detected {PickingPcbId}"); - sm = PickingStateMachine.GetOrderDetails; - } - else - { - PickingSlot = $"Keine Konnektivität EP {PickingSlotNr}"; - Log("No Meter found"); - - } - - } - catch (Exception e) - { - Log($"Error occur.{ Environment.NewLine} {e.Message}"); - } - } - } - - break; - case PickingStateMachine.GetOrderDetails: - - PickingState = $"Lade Auftragsdaten {PickingOrder}"; - var retCode = 0; - var str = LocalWebRequest.GetRequestWithError($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetOrderOverview?ProductionOrderNumber={PickingOrder}&CheckPcbId={PickingPcbId}", out retCode, 15000); - if (retCode == 417) - { - sm = PickingStateMachine.MeterError; - PickingResult = "Keine Radio Parameter"; - } - else - { - var retStr = JsonConvert.DeserializeObject(str); - PickingOrderDetails = retStr.PickingCompareItem; - - if (retStr.OrderOverViewCordonel.Count == retStr.OrderOverViewCordonel.AssignedPicking) - { - PickingResult = "Auftrag schon komplett"; - sm = PickingStateMachine.MeterError; - } - else - { - PickingState = $"Auftragsdaten geladen {PickingOrder}"; - sm = PickingStateMachine.Compare; - } - } - - break; - case PickingStateMachine.Compare: - //Compare - PickingState = $"Vergleiche Auftragsdaten {PickingOrder} mit Pcb Eigenschaften"; - - - var converter = new BrushConverter(); - if (Compare(PickingOrderDetails.CheckAppsIdVersion, PickingOrderDetails.FrequencyIndicator, PickingOrderDetails.MeterSize, PickingOrderDetails.PressurePresent)) - { - //erfolg anzeigen und weiter - var b = (Brush)converter.ConvertFromString("#419C14"); - b.Freeze(); - PickingResultColor = b; - sm = PickingStateMachine.MeterDone; - } - else - { - sm = PickingStateMachine.MeterError; - - var b = (Brush)converter.ConvertFromString("#FF8000"); - b.Freeze(); - PickingResultColor = b; - } - break; - case PickingStateMachine.MeterError: - PickingOrderDetails = null; - PickingState = "Vergleich abgeschlossen"; - PickingResult = "Vergleich fertig fehlgeschlagen"; - Thread.Sleep(10000); - sm = PickingStateMachine.StartCom; - - break; - case PickingStateMachine.MeterDone: - - - PickingState = "Vergleich abgeschlossen warten auf Montage Rückmeldung"; - PickingResult = $"Pcb {PickingPcbId} wurde dem Auftrag {PickingOrder} hinzugefügt"; - Thread.Sleep(10000); - PickingScanner = $"Öfffne {PickingScannerPort}"; - PickingBarScanner = new BarScanner(PickingScannerPort, token); - - PickingBarScanner.Start(); - sm = PickingStateMachine.WaitForBuildingMeterReady; - - //CheckAllPorts? - - - - break; - case PickingStateMachine.WaitForBuildingMeterReady: - - if (PickingBarScanner != null && !string.IsNullOrEmpty(PickingBarScanner.Input)) - { - - if (PickingBarScanner.Input == "%Cordonel_SAP_100%") - { - - var url = ServiceUrls.MeterProcessStateUrl(); - url = url + $"setSapState?PcbID={PickingPcbId}&code=100&version=1"; - try - { - LocalWebRequest.PostRequestAsync(url); - } - catch (Exception ex) - { - } - - if (PickingOrderDetails.PressurePresent) - { - PickingBarScanner = new BarScanner(PickingScannerPort, token); - - PickingBarScanner.Start(); - PickingState = "Montage Rückmeldung erhalten, Montage des Drucksensors bestätigen"; - sm = PickingStateMachine.WaitForBuildingPressureReady; - } - else - { - PickingState = "Montage Rückmeldung erhalten, auftrag Scannen"; - sm = PickingStateMachine.StartCom; - } - } - } - break; - case PickingStateMachine.WaitForBuildingPressureReady: - - if (PickingBarScanner != null && !string.IsNullOrEmpty(PickingBarScanner.Input)) - { - - if (PickingBarScanner.Input == "%Cordonel_SAP_101%") - { - var url = ServiceUrls.MeterProcessStateUrl(); - url = url + $"setSapState?PcbID={PickingPcbId}&code=101&version=1"; - try - { - LocalWebRequest.PostRequestAsync(url); - } - catch (Exception ex) - { - } - - PickingState = "Montage Rückmeldung erhalten, auftrag Scannen"; - sm = PickingStateMachine.StartCom; - } - } - break; - } - Thread.Sleep(1000); - - } - - } - - private void Log(String v) - { - //throw new NotImplementedException(); - } - } - - - -} - diff --git a/Common/Production/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs b/Common/Production/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs deleted file mode 100644 index bba74360..00000000 --- a/Common/Production/ProductionUiCordonel/Model/PickingMultiModeViewModel.cs +++ /dev/null @@ -1,440 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media; -using Logic.ProductionToProductMapper.Cordonel; -using Newtonsoft.Json; -using Xylem.Common.CommonCore.Configuration; -using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; -using Xylem.Common.Logic.ProductionOrderCore.OrderData; -using Xylem.Common.Logic.SoftwareAccessHelper; -using Xylem.Common.Production.ProductionUiCordonel.Data; -using MessageBox = System.Windows.Forms.MessageBox; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - public class PickingMultiModeViewModel : BaseMultiModeChildViewModel - { - - private Boolean inputIsEnabled; - public Boolean InputIsEnabled - { - get => inputIsEnabled; - set - { - inputIsEnabled = value; - NotifyPropertyChanged(); - } - } - - - private Boolean locked; - public PickingMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID, false) - { - VisibilityPicking = Visibility.Visible; - MeterDetectedHandler += PickingMultiModeViewModel_MeterDetectedHandler; - } - - private void PickingMultiModeViewModel_MeterDetectedHandler(Object sender, EventArgs e) - { - - } - - - - public override Boolean SlotIsLocked() - { - return locked; - } - public override void InputText(String text) - { - Order = text; - ReloadData(); - TextForceUpdate(); - } - internal void ReloadData() - { - - Task.Run(() => - { - try - { - if (!locked && !string.IsNullOrEmpty(Order) && Order.Length > 6 && int.TryParse(Order, out var orderNR)) - { - - var str = LocalWebRequest.GetRequest($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetOrderOverview?ProductionOrderNumber={orderNR}"); - var OrderOverView = JsonConvert.DeserializeObject(str); - var doneCount = OrderOverView.AssignedPicking; - if (OrderOverView.Count == OrderOverView.AssignedPicking) - { - - UpdatePickingUi("Order is already completed", StatusColor, "Input a new order number", 0, 0); - locked = false; - return; - } - - str = LocalWebRequest.GetRequestWithError($"{ServiceUrls.GenesisFinalCheckServiceUrl()}GetOrderDetails?ProductionOrderNumber={orderNR}&CheckPcbId={CurrentMeter.PcbId}", out var retCode, 15000); - - if (retCode == 417) - { - MessageBox.Show(@"NO radio parameter found"); - } - - if (OrderOverView.Count == OrderOverView.AssignedPicking) - { - - UpdatePickingUi("Order is already completed", StatusColor, "Input a new order number", 0, 0); - locked = false; - return; - } - - var OrderDteails = JsonConvert.DeserializeObject(str); - - - if (CurrentMeter != null) - { - try - { - - - locked = true; - //Init(CurrentMeter, new Dictionary(), OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); - - - var a = new Dictionary(); - a.Add(0, 486); - a.Add(15, 287); - if (OrderDteails.FrequencyIndicator == 868) - { - a.Add(24, 1067); - } - else - { - a.Add(24, 1066); - } - - Init(CurrentMeter, a, OrderDteails.FrequencyIndicator, OrderDteails.MeterSize, OrderDteails.PressurePresent); - - - var r = Run(CurrentMeter.PcbId, orderNR.ToString()); - - if (r) - { - doneCount = doneCount + 1; - } - locked = false; - UpdatePickingUi("Start checking meter", StatusColor, orderNR.ToString(), OrderOverView.Count, doneCount); - } - catch (Exception ex) - { - Log(ex.Message); - } - finally - { - locked = false; - } - } - } - else - { - UpdatePickingUi("Please input a valid order number", StatusColor, "no valid order!", 0, 0); - - } - } - catch (Exception ex) - { - Log(ex.Message); - } - }); - } - - private void UpdatePickingUi(String state, Brush StateColor, String order, Int32 toDo, Int32 done) - { - Message = state; - Order = order; - ToDo = toDo; - Done = done; - OnUpdateUi?.Invoke(null, EventArgs.Empty); - //if (true) - //{ - - //} - // lblStatus.Content = state; - // lblStatus.Background = StateColor; - // lblPickingOrder.Content = $"{Order}({Done}/{toDo}"; - // txtHiddenInput.Focus(); - // if (Done > 0 && Done >= toDo) - // { - // MessageBox.Show("Order is Finish"); - // txtOrderNr.Text = ""; - // lblStatus.Content = "Please input a new order number"; - // } - - //})); - - } - //private void RefreshPicking() - //{ - - // tbarOrder.Visibility = Visibility.Visible; - // if (!string.IsNullOrEmpty(txtOrderNr.Text)) - // { - // lblPickingOrder.Content = orderString; - - - // } - // else - // { - // UpdatePickingUi("Please input a valid order number", PickingData.StatusColor, "no valid order!", 0, 0); - // } - //} - - public event EventHandler OnDataChanged; - public event EventHandler OnUpdateUi; - public new event PropertyChangedEventHandler PropertyChanged; - - private GenesisMeter currentMeter; - - public ObservableCollection Data - { - get; set; - } - - private OverallStatus status = OverallStatus.NoDetect; - private OverallStatus Status - { - get => status; - set - { - status = value; - OnDataChanged?.Invoke(value.GetHashCode(), EventArgs.Empty); - - } - } - public String Message - { - get; set; - } - private enum OverallStatus - { - NoDetect, - CheckingIsRunning, - CheckingIsDone, - CheckingIsNoMatch, - CheckingIsHasError, - } - public String StatusText - { - get - { - switch (Status) - { - case OverallStatus.NoDetect: - return "Wait for meter"; - case OverallStatus.CheckingIsRunning: - return "Is checking, please wait"; - case OverallStatus.CheckingIsDone: - return "Succsesfull check next Pcb"; - case OverallStatus.CheckingIsNoMatch: - return "Check has mismatch, this PCB cannot be used!"; - default: - return "Check has errors, this PCB cannot be used!"; - } - - } - } - - public Brush StatusColor - { - get - { - switch (Status) - { - case OverallStatus.NoDetect: - return (SolidColorBrush)new BrushConverter().ConvertFromString("White"); - case OverallStatus.CheckingIsRunning: - return (SolidColorBrush)new BrushConverter().ConvertFromString("Yellow"); - case OverallStatus.CheckingIsDone: - return (SolidColorBrush)new BrushConverter().ConvertFromString("Green"); - case OverallStatus.CheckingIsNoMatch: - return (SolidColorBrush)new BrushConverter().ConvertFromString("Red"); - default: - return (SolidColorBrush)new BrushConverter().ConvertFromString("DarkRed"); - } - } - } - - public Int32 ToDo - { - get; private set; - } - public Int32 Done - { - get; private set; - } - - public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) - { - - - currentMeter = meter; - var data = new List(); - - data.Add(new PickingResultCustomCheckData(delegate - { - - meter.Login(); - meter.SetProcessState(DisplayCodes.PickingStarted); - return new PickingItemCheckReturn { Result = true, Msg = "done" }; - - }) - { - Index = data.Count, Ident = "Login", CheckText = "Try to access Meter", HasError = false, Result = null, - CurrentValueText = "-" - }); - - data.Add(new PickingResultRegisterData - { - ReadMeter = meter, Index = data.Count, Ident = "Check Radio", CheckText = $"{Frequency}MHz", - CompareObject = Frequency, CurrentValueText = "none", HasError = false, Result = null, - RegisterIdent = "SENSUSRADIO_FrequencyIndicator" - }); - - - data.Add(new PickingResultRegisterData - { - ReadMeter = meter, Index = data.Count, Ident = "MeterSize", - CheckText = "DN40-50", CompareObject = MeterSize, CurrentValueText = "none", HasError = false, - Result = null, RegisterIdent = "GENESISFLOW_MeterSize" - }); - - data.Add(new PickingResultRegisterData - { - ReadMeter = meter, Index = data.Count, Ident = "Pressure", - CheckText = "Pressure Sensor", CompareObject = PressurePresent, CurrentValueText = "-", HasError = false, - Result = null, RegisterIdent = "METROLOGYASST_PressurePresent" - }); - - - foreach (var item in checkAppsIdVersion) - { - data.Add(new PickingResultCustomCheckData(delegate - { - try - { - var MeterFWApp = meter.MeterAppListVersion.First(a => item.Key == a.AppId); - if (MeterFWApp.Version != item.Value) - { - return new PickingItemCheckReturn { Result = false, Msg = MeterFWApp.StrVersion }; - } - return new PickingItemCheckReturn { Result = true, Msg = MeterFWApp.StrVersion }; - } - catch (Exception) - { - return new PickingItemCheckReturn { Result = false, Msg = "error" }; - } - - }) - { - Index = data.Count, Ident = $"Check AppId {item.Key}", CheckText = $"Version {item.Value}", - HasError = false, Result = null, CurrentValueText = "-" - }); - - } - - data.Add(new PickingResultCustomCheckData(delegate - { - try - { - meter.WriteRegister("METROLOGYASST_StoreConfiguration", 1); - Thread.Sleep(100); - var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); - if (storeRet.All(a => a.Equals(0))) - { - return new PickingItemCheckReturn { Result = true, Msg = "Filesystem OK" }; - } - - return new PickingItemCheckReturn { Result = false, Msg = "Filesystem corrupt" }; - - } - catch (Exception) - { - return new PickingItemCheckReturn { Result = false, Msg = "error" }; - } - - }) - { - Index = data.Count, Ident = "Check Filesystem", CheckText = "Check Filesystem", HasError = false, - Result = null, CurrentValueText = "checking" - }); - - Status = OverallStatus.CheckingIsRunning; - ChangeDataData(data); - } - private void ChangeDataData(List data) - { - Data = new ObservableCollection(data); - OnDataChanged?.Invoke(Data, EventArgs.Empty); - } - - public Boolean Run(String pcbID, String OrderNr) - { - var tmpData = Data.ToList(); - foreach (var item in tmpData.Where(a => !a.Result.HasValue).OrderBy(a => a.Index)) - { - var result = item.Action.Invoke(); - item.Result = result.Result; - item.CurrentValueText = result.Msg; - ChangeDataData(tmpData); - } - - if (tmpData.All(a => !a.HasError && a.Result.HasValue && a.Result.Value)) - { - currentMeter.SetProcessState(DisplayCodes.PickingTested); - var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={pcbID}&FertigungsauftragsNr={OrderNr}"; - var RetString = LocalWebRequest.PostRequestAsyncAndGetContent(url); - - if (bool.TryParse(RetString, out var result)) - { - Status = OverallStatus.CheckingIsDone; - return result; - - } - - Status = OverallStatus.CheckingIsHasError; - - return false; - - } - - currentMeter.SetProcessState(DisplayCodes.PickingFailed); - if (tmpData.All(a => a.HasError)) - { - Status = OverallStatus.CheckingIsHasError; - } - else - { - Status = OverallStatus.CheckingIsNoMatch; - } - - return false; - } - - internal void Empty() - { - Status = OverallStatus.NoDetect; - ChangeDataData(new List()); - } - - protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) - { - PropertyChanged?.Invoke(this, e); - } - } -} diff --git a/Common/Production/ProductionUiCordonel/Model/PickingViewModel.cs b/Common/Production/ProductionUiCordonel/Model/PickingViewModel.cs deleted file mode 100644 index 66eb4822..00000000 --- a/Common/Production/ProductionUiCordonel/Model/PickingViewModel.cs +++ /dev/null @@ -1,221 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Threading; -using System.Windows.Media; -using Logic.ProductionToProductMapper.Cordonel; -using Xylem.Common.CommonCore.Configuration; -using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; -using Xylem.Common.Logic.SoftwareAccessHelper; -using Xylem.Common.Production.ProductionUiCordonel.Data; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - public class PickingViewModel : INotifyPropertyChanged - { - public event EventHandler OnDataChanged; - public event PropertyChangedEventHandler PropertyChanged; - - private GenesisMeter currentMeter; - private PickingCompareItem baseFile; - - public ObservableCollection Data { get; set; } - - private OverallStatus status = OverallStatus.NoDetect; - private OverallStatus Status - { - get => status; - set - { - status = value; - OnDataChanged?.Invoke(value.GetHashCode(), EventArgs.Empty); - - } - } - - private enum OverallStatus - { - NoDetect, - CheckingIsRunning, - CheckingIsDone, - CheckingIsNoMatch, - CheckingIsHasError, - } - public String StatusText - { - get - { - switch (Status) - { - case OverallStatus.NoDetect: - return "Wait for meter"; - case OverallStatus.CheckingIsRunning: - return "Is checking, please wait"; - case OverallStatus.CheckingIsDone: - return "Succsesfull check next Pcb"; - case OverallStatus.CheckingIsNoMatch: - return "Check has mismatch, this PCB cannot be used!"; - default: - return "Check has errors, this PCB cannot be used!"; - } - - } - } - - public Brush StatusColor - { - get - { - switch (Status) - { - case OverallStatus.NoDetect: - return (SolidColorBrush)new BrushConverter().ConvertFromString("White"); - case OverallStatus.CheckingIsRunning: - return (SolidColorBrush)new BrushConverter().ConvertFromString("Yellow"); - case OverallStatus.CheckingIsDone: - return (SolidColorBrush)new BrushConverter().ConvertFromString("Green"); - case OverallStatus.CheckingIsNoMatch: - return (SolidColorBrush)new BrushConverter().ConvertFromString("Red"); - default: - return (SolidColorBrush)new BrushConverter().ConvertFromString("DarkRed"); - } - } - } - - - public void Init(GenesisMeter meter, Dictionary checkAppsIdVersion, UInt32 Frequency, UInt32 MeterSize, Boolean PressurePresent) - { - - - currentMeter = meter; - var data = new List(); - - data.Add(new PickingResultCustomCheckData(delegate - { - - var r = meter.Login(); - meter.SetProcessState(DisplayCodes.PickingStarted); - return new PickingItemCheckReturn { Result = true, Msg = "done" }; - - }) - { Index = data.Count, Ident = "Login", CheckText = "Try to access Meter", HasError = false, Result = null, CurrentValueText = "-" }); - if (Frequency != 0) - { - data.Add(new PickingResultRegisterData { ReadMeter = meter, Index = data.Count, Ident = "Check Radio", CheckText = "433", CompareObject = Frequency, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "SENSUSRADIO_FrequencyIndicator" }); ; - - - data.Add(new PickingResultRegisterData { ReadMeter = meter, Index = data.Count, Ident = "MeterSize", CheckText = "DN40-50", CompareObject = MeterSize, CurrentValueText = "none", HasError = false, Result = null, RegisterIdent = "GENESISFLOW_MeterSize" }); - } - - foreach (var item in checkAppsIdVersion) - { - data.Add(new PickingResultCustomCheckData(delegate - { - try - { - var MeterFWApp = meter.MeterAppListVersion.First(a => item.Key == a.AppId); - if (MeterFWApp == null || MeterFWApp.Version != item.Value) - { - return new PickingItemCheckReturn { Result = false, Msg = MeterFWApp.StrVersion }; - } - return new PickingItemCheckReturn { Result = true, Msg = MeterFWApp.StrVersion }; - } - catch (Exception) - { - return new PickingItemCheckReturn { Result = false, Msg = "error" }; - } - - }) - { Index = data.Count, Ident = $"Check AppId {item.Key}", CheckText = $"Version {item.Value}", HasError = false, Result = null, CurrentValueText = "-" }); ; - - } - - data.Add(new PickingResultCustomCheckData(delegate - { - try - { - meter.WriteRegister("METROLOGYASST_StoreConfiguration", 1); - Thread.Sleep(100); - var storeRet = meter.ReadRegister("METROLOGYASST_StoreConfiguration"); - if (storeRet.All(a => a.Equals(0))) - { - return new PickingItemCheckReturn { Result = true, Msg = "Filesystem OK" }; - } - - return new PickingItemCheckReturn { Result = false, Msg = "Filesystem corrupt" }; - - } - catch (Exception) - { - return new PickingItemCheckReturn { Result = false, Msg = "error" }; - } - - }) - { Index = data.Count, Ident = "Check Filesystem", CheckText = "Check Filesystem", HasError = false, Result = null, CurrentValueText = "checking" }); ; - - Status = OverallStatus.CheckingIsRunning; - ChangeDataData(data); - } - private void ChangeDataData(List data) - { - Data = new ObservableCollection(data); - OnDataChanged?.Invoke(Data, EventArgs.Empty); - } - - public Boolean Run(String pcbID, String OrderNr) - { - var tmpData = Data.ToList(); - foreach (var item in tmpData.Where(a => !a.Result.HasValue).OrderBy(a => a.Index)) - { - var result = item.Action.Invoke(); - item.Result = result.Result; - item.CurrentValueText = result.Msg; - ChangeDataData(tmpData); - } - - if (tmpData.All(a => !a.HasError && a.Result.HasValue && a.Result.Value)) - { - currentMeter.SetProcessState(DisplayCodes.PickingTested); - var url = $"{ServiceUrls.MeterProcessStateUrl()}SetPickingState?PcbID={pcbID}&FertigungsauftragsNr={OrderNr}"; - var RetString = LocalWebRequest.PostRequestAsyncAndGetContent(url); - - var result = false; - if (bool.TryParse(RetString, out result)) - { - Status = OverallStatus.CheckingIsDone; - return result; - - } - - Status = OverallStatus.CheckingIsHasError; - - return false; - - } - - currentMeter.SetProcessState(DisplayCodes.PickingFailed); - if (tmpData.All(a => a.HasError)) - { - Status = OverallStatus.CheckingIsHasError; - } - else - { - Status = OverallStatus.CheckingIsNoMatch; - } - - return false; - - - - } - - internal void Empty() - { - Status = OverallStatus.NoDetect; - ChangeDataData(new List()); - } - } -} diff --git a/Common/Production/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs b/Common/Production/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs deleted file mode 100644 index 3c9e416e..00000000 --- a/Common/Production/ProductionUiCordonel/Model/PressureMultiModeViewModel.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; -using Newtonsoft.Json; -using Xylem.Common.CommonCore.Configuration; -using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; -using Xylem.Common.Logic.ProductionOrderCore.ProcessState; -using Xylem.Common.Logic.ProductionOrderCore.TestResults; -using Xylem.Common.Logic.SoftwareAccessHelper; -using Xylem.Common.Production.ProductionUiCordonel.Data; -using Xylem.Common.Production.ProductionUiCordonel.Event; - -namespace Xylem.Common.Production.ProductionUiCordonel.Model -{ - public class PressureMultiModeViewModel : BaseMultiModeChildViewModel - { - - - public event EventHandler OnStoreDone; - private PressureResultDataNotifyable result = new PressureResultDataNotifyable(); - public PressureResultDataNotifyable Result - { - get => result; - set - { - result = value; - NotifyPropertyChanged(); - } - } - - - private Boolean inputIsEnabled; - public Boolean InputIsEnabled - { - get => inputIsEnabled; - set - { - inputIsEnabled = value; - NotifyPropertyChanged(); - } - } - - - public Boolean Locked { get; set; } = false; - public Int32? StationID { get; set; } - - public PressureMultiModeViewModel(String ctrName, Int32 slotNR, List barcodeTrigger, Int32? stationID = null) : base(ctrName, slotNR, barcodeTrigger, stationID) - { - VisibilityPressure = Visibility.Visible; - StationID = stationID; - } - - public Boolean isHydraulicStaion() - { - - if (!StationID.HasValue || StationID.Value == 1) - { - return false; - } - return true; - } - public override Boolean SlotIsLocked() - { - return false; - } - - internal void ReloadData(Boolean reset) - { - - if (Result != null && Result.PcbId != CurrentPcbID) - { - InputIsEnabled = false; - if (true) - { - - } - Result = new PressureResultDataNotifyable { Remark = "loading", Testpoints = new ObservableCollection(), PcbId = "" }; - Task.Run(() => - { - try - { - var url = ServiceUrls.MeterProcessStateUrl(); - url = url + $"GetPressureStateDetailed?PcbId={CurrentPcbID}&TopCount=1"; - - var retStr = LocalWebRequest.GetRequest(url); - - var pressureResultData = JsonConvert.DeserializeObject>(retStr); - if (!pressureResultData.Any()) - { - return new PressureResultDataNotifyable(); - } - return new PressureResultDataNotifyable(pressureResultData.First()); - } - catch (Exception ex) - { - Log(ex.Message); - return new PressureResultDataNotifyable(); - } - - }).ContinueWith(a => - { - var res = a.Result; - res.PcbId = CurrentPcbID; - - Result = res; - InputIsEnabled = true; - } - - ); - - } - } - - internal void StoreData(Boolean successfull) - { - - if (Result != null && Result.PcbId == CurrentPcbID) - { - InputIsEnabled = false; - var isStored = false; - var status = DisplayCodes.PressureTestedFailed; - - Task.Run(() => - { - var url = ServiceUrls.MeterProcessStateUrl(); - - if (successfull) - { - status = DisplayCodes.PressureTested; - } - try - { - if (StationID == 1) - { - var addResult = new PressureTestResult - { - FreeText = Result.Remark, - Passed = successfull, - StationId = StationID - }; - - url = url + $"SetPressureState?PcbId={CurrentPcbID}&FertigungsauftragsNr=0"; - - - if (!LocalWebRequest.PostRequestAsync(url, json: addResult)) - { - throw new ApplicationException("PressureState: NOT successful"); - } - - } - else - { - url = url + "SetPressureStateDetailed"; - var mutedResult = Result.ToBase(); - isStored = LocalWebRequest.PostRequestAsync(url, json: mutedResult); - if (!isStored) - { - OnStoreDone?.Invoke(null, new StringArgs("Can not store Result")); - status = DisplayCodes.PressureTestedFailed; - } - } - - - CurrentMeter.Login(); - CurrentMeter.SetProcessState(status); - } - catch (Exception ex) - { - Log(ex.Message); - status = DisplayCodes.PressureTestedFailed; - OnStoreDone?.Invoke(null, new StringArgs("Can not store Result")); - } - - - if (status == DisplayCodes.PressureTested) - { - OnStoreDone?.Invoke(null, new StringArgs("Pressure test stored successfully. Meter can passed")); - return; - } - OnStoreDone?.Invoke(null, new StringArgs("Pressure test stored successfully. But Meter is marked with a leakage. Please inform QS")); - - }); - - } - } - - } - -} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs index 46bf77d6..1491b865 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs @@ -168,6 +168,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses /// public event EventHandler OnProcessProgressChanged; + + /// + public event EventHandler OnGuiMessageDispatcher; #endregion --------------------------------------- Variables -------------------------------------------------- #region ------------------------------------------ Init ------------------------------------------------------- @@ -290,6 +293,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses OnProcessStateChanged?.Invoke(sender, new SingleProcessStateArgs(state)); } + /// + /// Fire event for GUI messages + /// + /// + protected void DispatchGuiMessage(GuiMessageArgs args) + { + OnGuiMessageDispatcher?.Invoke(this, args); + } + /// public void StartProcess(ProcessState? successExitState, ProcessState errorExitState = ProcessState.Error, ProcessState breakExitState = ProcessState.AbortTest) diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/GuiItem.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/GuiItem.cs new file mode 100644 index 00000000..846dd084 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/GuiItem.cs @@ -0,0 +1,17 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum +{ + /// + /// Items to dispatch as message to the GUI + /// + public enum GuiItem + { + /// + /// Order amount of Cordonels + /// + OrderAmount, + /// + /// Counter of Cordonels for this order + /// + OrderCounter + } +} \ No newline at end of file diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/ProcessState.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/ProcessState.cs index d26d051b..27017b67 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/ProcessState.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/Enum/ProcessState.cs @@ -109,6 +109,14 @@ /// /// Completed to release the assembly line /// + CheckCordonelMapping, + /// + /// Install the LUT + /// + InstallLut, + /// + /// Completed to release the assembly line + /// AssemblyLineRelease, /// /// Print return report diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckFinalParametrization.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckFinalParametrization.cs index e0a96779..0597f89e 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckFinalParametrization.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckFinalParametrization.cs @@ -70,7 +70,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Access to meter requires login if (!Meter.IsLoggedOn) { - Meter.Login(); + Meter.ReLogin(); if (!Meter.IsLoggedOn) { ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); @@ -95,9 +95,11 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr if (retValBol) { EolProgress.ParametrizationCompareChecked = EOLStatus.OK; + Meter?.Logout(); return StatusReturn.Okay; } EolProgress.ParametrizationCompareChecked = EOLStatus.FAIL; + Meter?.Logout(); return StatusReturn.Failed; } catch (Exception ex) diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs index 97b8bb64..8f5b22af 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckOrderNumber.cs @@ -1,95 +1,20 @@ using System; -using Xylem.Common.CommonCore.Consts; -using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; -using Xylem.Common.Production.ProductionUiCordonel.Properties; -using Xylem.Common.Production.ProductionUiCordonel.UserControls; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses { - public class CheckOrderNumber : BaseProductionProcess + public class CheckOrderNumber : BaseCheckOrderNumber { - // string from scanner with string delimiter - private String _scan = ""; - // marker for scan input received - private Boolean _scanInputReceived; - /// - /// Ctor - /// + /// public CheckOrderNumber(String name) : base( name) { } /// - protected override void InitUserControl() + protected override Boolean ValidateProcessAndPublishDataToGui(OrderOverViewCordonel orderOverview) { - UserControl = new UcBarcodeInput - { - lblHeadLine = { Content = Resources.StrInstructionScanOrder }, - tbxScan = { Text = "" } - }; - } - - /// - /// Event handler taking the input from text box which should be scanned but also can be input manually. - /// - /// - /// - /// - Initial - /// - private void UserControlInput_Handler(Object sender, String input) - { - _scan = input; - _scanInputReceived = true; - } - - /// - /// Scanning of order number from production order sheet and comparing with DB. - /// - /// - /// - /// - Initial - /// - /// - /// - Removed signals for and as - /// these will be automatically set based on return value in - /// . - /// - public override StatusReturn ExecuteProcess() - { - if (Meter == null) - { - return StatusReturn.Failed; - } - - SignalRunningState(); - - if (UserControl == null) - { - ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); - return StatusReturn.Failed; - } - - var ucBarCode = (UcBarcodeInput)UserControl; - ucBarCode.OnBarcodeInput += UserControlInput_Handler; - - // set focus to text input for scanner - ucBarCode.FocusMe(); - _scanInputReceived = false; - - // wait for new line - while (!_scanInputReceived) - { - } - - ucBarCode.OnBarcodeInput -= UserControlInput_Handler; - - if (_scan.Equals(Meter.OrderNumber.ToString())) - { - return StatusReturn.Okay; - } - - ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); - return StatusReturn.Failed; + return orderOverview.OrderNumber == Meter.OrderNumber; } } } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckRadio.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckRadio.cs index 6c85da9d..eeacedd1 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckRadio.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/CheckRadio.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json.Linq; using SIRTCOM; using System; -using System.Configuration; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading; @@ -10,14 +10,17 @@ using System.Windows.Threading; using System.Xml.Linq; using Xylem.Common.CommonCore.Configuration; using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Logic.ProductionOrderCore; using Xylem.Common.Logic.SoftwareAccessHelper; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams; using Xylem.Common.Production.ProductionUiCordonel.Properties; using Xylem.Common.Production.ProductionUiCordonel.UserControls; using Xylem.Common.Utils.Logging; using Button = System.Windows.Controls.Button; + // ReSharper disable UnusedAutoPropertyAccessor.Local namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolProcesses @@ -29,7 +32,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// Use the sleep 250 to create x seconds timeout; /// private const Int32 TimeoutLoop_ms = 250; - private const Int32 Timeout_s = 10; + private const Int32 Timeout_s = 25; private const Int32 MaxActualProgressSteps = 1000 / TimeoutLoop_ms * Timeout_s; /// @@ -102,9 +105,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr private Byte _sirtBoxNr; /// - /// Comport number of SIRT + /// Comport number of RSSI-SIRT /// - private Byte _sirtComport; + private Int32 _rssiSirtComport; /// /// Radio address Cordonel @@ -127,10 +130,6 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr { Retry(); }; - //_checkRadioUserControl.OnDoneRequested += delegate - //{ - // SaveRssiLevelsToDb(); - //}; } /// @@ -181,6 +180,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// /// - Removed change and read back of MainAlarmMask and ExtendedAlarmMask. /// + /// + /// - Load settings from SIRT config file instead from AppConfig. + /// + /// + /// - Service SIRT for alarm setup over the air. + /// + /// + /// - Service SIRT verbose output and additional error handling and warning. + /// public override StatusReturn ExecuteProcess() { // This will force to reset all values, Sentinel and Prepare shipping will fail based on EOL Progress @@ -215,7 +223,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr { if (!Meter.IsLoggedOn) { - Meter.Login(); + Meter.ReLogin(); if (!Meter.IsLoggedOn) { return SetTestFailed(Resources.StrErrorMsgCordonelLogin); @@ -233,7 +241,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Initialize the SIRT if (!SirtInit()) { - return SetTestFailed(Resources.StrErrorMsgSirt); + return SetTestFailed(Resources.StrErrorMsgRssiSirt); } //FrequencyIndicator @@ -269,24 +277,82 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr SuccessMsgDispatcher(Resources.StrSuccessMsgDbToMeterEncryptionKey); ActualProcessProgress++; - _sirtComport = Convert.ToByte(ConfigurationManager.AppSettings[$"SirtComport{freq}"]); - _sirtBoxNr = Convert.ToByte(ConfigurationManager.AppSettings["SirtBoxNr"]); + // Load settings from SIRT config file + var sirtConfig = new SirtConfig(); + sirtConfig.ReadSirtConfig(); + + if (freq == 433 && sirtConfig.SirtComport433MHz != null) + { + int.TryParse(sirtConfig.SirtComport433MHz.Replace("COM", ""), out _rssiSirtComport); + } + + if (freq == 868 && sirtConfig.SirtComport433MHz != null) + { + int.TryParse(sirtConfig.SirtComport868MHz.Replace("COM", ""), out _rssiSirtComport); + } + + var ServicePorts = new List(); + if (sirtConfig.ServiceSirtComport433MHz != null && + int.TryParse(sirtConfig.ServiceSirtComport433MHz.Replace("COM", ""), out var serviceSirtComport)) + { + ServicePorts.Add(serviceSirtComport); + } + if (sirtConfig.ServiceSirtComport868MHz != null && + int.TryParse(sirtConfig.ServiceSirtComport868MHz.Replace("COM", ""), out serviceSirtComport)) + { + ServicePorts.Add(serviceSirtComport); + } + + + if (sirtConfig.SirtBoxNo != null) + _sirtBoxNr = (Byte)sirtConfig.SirtBoxNo; + var ucRadio = (UcRadioCheck)UserControl; ucRadio.SetHeadline($"{Resources.StrStateRadioCheck} BOX: {_sirtBoxNr}"); - LogNewStatusMsg($"{Resources.StrStateRadioCheck} Port: COM{_sirtComport}, BOX: {_sirtBoxNr}, " + + LogNewStatusMsg($"{Resources.StrStateRadioCheck} Port: COM{_rssiSirtComport}, BOX: {_sirtBoxNr}, " + $"f: {freq} MHz"); // Tell the radio that something is in the slot which will impact the radio transmission WriteRegisterLogAndProcessCtr(new ProgrammingParameters("SENSUSRADIO_IrDAModulePresent", new Byte[] { 1 }, ProgrammingSource.ProgramInternal)); - ActualProcessProgress++; + + if (ServicePorts.Any()) + { + LogNewStatusMsg(Resources.StrStateRadioAlarmSetupOverTheAir); + try + { + if (!SIRTServer.StartServer(SuccessMsgDispatcher, ErrorMsgDispatcher, ServicePorts.ToArray())) + { + SIRTServer.Dispose(); + return SetTestFailed(Resources.StrErrorMsgServiceSirtServerStart); + } + + if (!SIRTServer.StartProgramming(Convert.ToInt32(freq), _radioAddressCordonel, + meterEncryptionKey)) + { + SIRTServer.Dispose(); + return SetTestFailed(Resources.StrErrorMsgServiceSirtProgramming); + } + SIRTServer.Dispose(); + } + catch (Exception ex) + { + SIRTServer.Dispose(); + return SetTestFailed(ex.Message); + } + } + else + { + WarningMsgDispatcher(Resources.StrWarningMsgServiceSirtSkipped); + } + // Clear the measurement as on a retry started from main control the old values will be displayed ClearRssiMeasurement(); // kick off RSSI test StartRssiMeasurement(); - + // Exit if meanwhile cancellation is required if (CancellationToken.IsCancellationRequested) CancellationProcedure(); @@ -318,15 +384,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr ActualProcessProgress++; if (// radio system state 0x02 shipping mode, 0x01 production mode, 0x0C transmission and data logger active - _finalRadioSystemState != 0x02 + _finalRadioSystemState != 0x02 // If radio check is enabled the signal level has to be in range and the test has to be finished || (!skipRadioCheck && (!_successSignalLevel || !_sirtComOkay || !_testFinished))) { - return SetTestFailed(!_sirtComOkay ? Resources.StrErrorMsgSirt : Resources.StrErrorMsgRadioCheck); + return SetTestFailed(!_sirtComOkay ? Resources.StrErrorMsgRssiSirt : Resources.StrErrorMsgRadioCheck); } SuccessMsgDispatcher(Resources.StrSuccessMsgRadioInCustomerMode); - + // Skip radio check by requirement if (skipRadioCheck) { @@ -399,8 +465,10 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr EolProgress.RadioCheckId = _radioResultCheckId; EolProgress.FinalRadioSystemState = _finalRadioSystemState; - // Essential to logout from meter at any exit + // Essential to logout from meter at any exit to give the radio app the chance + // to access the parameters and config file Meter?.Logout(); + Thread.Sleep(1000); _stateMachine?.Stop(); _stateMachine = null; @@ -477,7 +545,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr { ActualProcessProgress++; GetRssiMinMaxValuesFromDb(_sirtBoxNr, Meter.OrderNumber); - SendPamListenSemi((Int32)_radioAddressCordonel, _sirtComport, _radioEncryptionKey); + SendPamListenSemi((Int32)_radioAddressCordonel, _rssiSirtComport, _radioEncryptionKey); UpdateUc(); ActualProcessProgress++; } @@ -523,7 +591,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr } ClearRssiMeasurement(); UpdateUc(); - SendPamListenSemi((Int32)_radioAddressCordonel, _sirtComport, _radioEncryptionKey); + SendPamListenSemi((Int32)_radioAddressCordonel, _rssiSirtComport, _radioEncryptionKey); } /// @@ -669,7 +737,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr _dataContainer.RadioAdress = radioAddress; _stateMachine.initialise((Byte)byteComPort); - + try { var path = NLogHelper.GetApplicationDataPath(); @@ -696,7 +764,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Initialize the state machine of the SIRT dll _stateMachine.Stop(); _stateMachine.ClearPam(); - _stateMachine.Timeout_s = 30; + _stateMachine.Timeout_s = 45; // Dummy PAM 00 with radio encryption key, SIRT dll takes the key for the response and the // address for the request and response, CommandHex 00 is data size of 0, so it makes no sense @@ -821,6 +889,8 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr LogNewStatusMsg(pam.Semi.GetPamErrorMessage()); _sirtComOkay = false; } + + CheckAlarmStateFromRF(semiBytes); } else { @@ -839,5 +909,95 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr Meter?.WriteLog(ex.Message); } } + + /// + /// Check telegram length and alarms. + /// + /// + /// + /// - Initial. + /// + /// + /// - Multilingual. + /// + /// + /// - Reworked. + /// + private void CheckAlarmStateFromRF(params Byte[] telegram) + { + if (telegram == null) return; + + try + { + var telegramLength = telegram.Length; + + if (telegramLength <= 8) + { + ErrorMsgDispatcher(Resources.StrErrorMsgSirtTelegramLength); + return; + } + + var semiLength = Math.Min(telegram[7], (Byte)RFTelegrams.SEMI.MIN_LENGTH); + + if (telegramLength < semiLength) + { + ErrorMsgDispatcher(Resources.StrErrorMsgSemiTelegramLength); + return; + } + + var mhz = RegisterConverter.ByteArrayToValue(Meter.ReadRegister("SENSUSRADIO_FrequencyIndicator")); + var semiBytes = new Byte[semiLength]; + Array.Copy(telegram, 8, semiBytes, 0, semiLength - 8); + var semi = new RFTelegrams.SEMI(semiBytes, (Int32)mhz); + var alarms = semi.MainAlarmByte; + + if (alarms.Backflow) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.Backflow)} !"); + _testFinished = false; + } + + if (alarms.BrokenPipe) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.BrokenPipe)} !"); + _testFinished = false; + } + + if (alarms.Leak) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.Leak)} !"); + _testFinished = false; + } + + if (alarms.LowBattery) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.LowBattery)} !"); + _testFinished = false; + } + + if (alarms.MagneticTamper) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.MagneticTamper)} !"); + _testFinished = false; + } + + if (alarms.MetrologyUnavailable) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.MetrologyUnavailable)} !"); + _testFinished = false; + } + + if (alarms.SpecificError) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsgAlarmActive}: {nameof(alarms.SpecificError)} !"); + _testFinished = false; + } + } + catch (Exception _e) + { + ErrorMsgDispatcher($"{Resources.StrErrorMsg}: {_e.Message} - {Resources.StrMsgSemiTelegram}"); + _testFinished = false; + } + } } } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs index 2136da04..75ad3d5e 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/EolProcessStatesDef.cs @@ -214,16 +214,6 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr processState: ProcessState.RebootCordonel, processInfo: Resources.StrStateRebootCordonel, productionProcessNo: 8, - nextStateOnSuccess: ProcessState.CheckFinalParametrization), - - // Precondition: - The reboot process including the store all configurations has to be - // completed. - // Check final configuration has to be executed exclusively with automatic - new ProcessStateStruct( - productionProcess: new CheckFinalParametrization(Resources.StrStateCheckParametrization), - processState: ProcessState.CheckFinalParametrization, - processInfo: Resources.StrStateCheckParametrization, - productionProcessNo: 9, nextStateOnSuccess: ProcessState.CheckRadio), // Precondition: - The final parametrization, reboot process including the store all @@ -234,9 +224,19 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr productionProcess: new CheckRadio(Resources.StrStateRadioCheck), processState: ProcessState.CheckRadio, processInfo: Resources.StrStateRadioCheck, + productionProcessNo: 9, + nextStateOnSuccess: ProcessState.CheckFinalParametrization), + + // Precondition: - The reboot process including the store all configurations has to be + // completed. + // Check final configuration has to be executed exclusively with automatic + new ProcessStateStruct( + productionProcess: new CheckFinalParametrization(Resources.StrStateCheckParametrization), + processState: ProcessState.CheckFinalParametrization, + processInfo: Resources.StrStateCheckParametrization, productionProcessNo: 10, nextStateOnSuccess: ProcessState.CheckOrderNumber), - + // This scans the order number, it has to be executed exclusively with automatic new ProcessStateStruct( productionProcess: new CheckOrderNumber(Resources.StrStateCheckOrderNumber), diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs index cc882cba..d72ac822 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecFinalParametrization.cs @@ -2,6 +2,7 @@ using System.Linq; using LaaPackages.Features.Cordonel.Models; using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; using Xylem.Common.Production.ProductionUiCordonel.Properties; @@ -58,6 +59,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// /// - EOL progress signaled. /// + /// + /// - Accumulators read back for debug. + /// public override StatusReturn ExecuteProcess() { // Uncheck executed process to leave the result open needed for retries @@ -72,37 +76,64 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Check if radio has been set up properly and programming parameters are present if ((!Meter.RadioFrequencyMhz.HasValue && RegisterRestorer.RecoveryRegisters.Any(a => a.RegisterIdent.Contains("RADIO"))) || - (Meter.RadioFrequencyMhz.HasValue && !RegisterRestorer.RecoveryRegisters.Any(a => + (Meter.RadioFrequencyMhz.HasValue && !RegisterRestorer.RecoveryRegisters.Any(a => a.RegisterIdent.Contains("RADIO")))) { ErrorMsgDispatcher(Resources.StrErrorMsgRadioInconsistent); - EolProgress.ParametrizationDoneChecked = EOLStatus.FAIL; + EolProgress.ParametrizationDoneChecked = EOLStatus.FAIL; return StatusReturn.Failed; } // Set the process bar limits including approximately 10 additional steps for preparation and finalization SignalRunningState(RegisterRestorer.RecoveryRegisterCount + 10); - + try { // access to meter requires login if (!Meter.IsLoggedOn) { - Meter.Login(); + Meter.ReLogin(); if (!Meter.IsLoggedOn) { ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); - EolProgress.ParametrizationDoneChecked = EOLStatus.FAIL; + EolProgress.ParametrizationDoneChecked = EOLStatus.FAIL; return StatusReturn.Failed; } } + + // ReSharper disable once NotAccessedVariable used for DEBUG -> logs it to register history + var readBackScaledBilling = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_ScaledBilling")); + // ReSharper disable once NotAccessedVariable used for DEBUG -> logs it to register history + var readBackUnscaledFwd = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledFwd")); + // ReSharper disable once NotAccessedVariable used for DEBUG -> logs it to register history + var readBackUnscaledRev = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledRev")); + + Meter.ClearAlarm(); + ActualProcessProgress++; + RegisterRestorer.OnProcessUpdate += ProcessUpdate_Handler; - var retVal = RegisterRestorer.EolProgrammingRegisters(RegisterRestorer.RecoveryRegisters, + var retVal = RegisterRestorer.EolProgrammingRegisters(RegisterRestorer.RecoveryRegisters, CancellationToken); RegisterRestorer.OnProcessUpdate -= ProcessUpdate_Handler; - + + // ReSharper disable once NotAccessedVariable used for DEBUG -> logs it to register history + // ReSharper disable once RedundantAssignment + readBackScaledBilling = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_ScaledBilling")); + // ReSharper disable once NotAccessedVariable used for DEBUG -> logs it to register history + // ReSharper disable once RedundantAssignment + readBackUnscaledFwd = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledFwd")); + // ReSharper disable once NotAccessedVariable used for DEBUG -> logs it to register history + // ReSharper disable once RedundantAssignment + readBackUnscaledRev = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledRev")); + EolProgress.ParametrizationDoneChecked = retVal == StatusReturn.Okay ? EOLStatus.OK : EOLStatus.FAIL; return retVal; } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecPasswordFile.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecPasswordFile.cs index 19c02e65..0a0a3789 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecPasswordFile.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecPasswordFile.cs @@ -186,7 +186,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr ucPwd.UpdateImage(ucPwd.imgWriteToMeter, ImgState.Active); if (!Meter.IsLoggedOn) - Meter.Login(); + Meter.ReLogin(); // Install and check password file var retryCtr = 2; diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs index 5fe1983d..c102fe5a 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs @@ -45,6 +45,12 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr /// /// - Reset alarms in customer app and radio app and check it for success. /// + /// + /// - Check accumulators being cleared to zero. + /// + /// + /// - Accumulator reset if setting to zero failed as defined by A.F. as workaround for FW bug. + /// public override StatusReturn ExecuteProcess() { // Uncheck executed process to leave the result open needed for retries @@ -63,7 +69,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // access to meter requires login if (!Meter.IsLoggedOn) { - Meter.Login(); + Meter.ReLogin(); if (!Meter.IsLoggedOn) { ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); @@ -71,13 +77,14 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr return StatusReturn.Failed; } } - + var ale = Meter.ReadRegister("CUSTOMER_AlarmEnableMask"); + #region ----------------------------------- Reboot ---------------------------------------------------- // reboot the meter and avoid doubled storage of configurations var _meterResetPsu = new MeterResetPsu(Meter) { StoreConfigEnable = false }; - + _meterResetPsu.OnProcessUpdate += ProcessUpdate_Handler; var rebootSucceeded = _meterResetPsu.MeterResetPsuExecute(CancellationToken); _meterResetPsu.OnProcessUpdate -= ProcessUpdate_Handler; @@ -91,7 +98,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // access to meter requires login if (!Meter.IsLoggedOn) { - Meter.Login(); + Meter.ReLogin(); if (!Meter.IsLoggedOn) { ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); @@ -100,30 +107,31 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr } } ActualProcessProgress++; - + #endregion + #region ----------------------------------- Set Time and Reset Counters ------------------------------- // Get the time in UTC to program the time for the Cordonel in seconds since 01. Jan 2000 // to set the new UTC after reboot var teaTime = new TimeT(); // Build byte array var rawSeconds = RegisterConverter.ValueToByteArray(teaTime.UtcNowToSecondsSince2000); - var timerSetup = new ProgrammingParameters("SYSTEM_CalendarSeconds", rawSeconds, + var timerSetup = new ProgrammingParameters("SYSTEM_CalendarSeconds", rawSeconds, ProgrammingSource.ProgramInternal); var retValBol = WriteRegisterLogAndProcessCtr(timerSetup); // This is the manufacturing date of the Cordonel - retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("IRDA_MfgDate", rawSeconds, + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("IRDA_MfgDate", rawSeconds, ProgrammingSource.ProgramInternal)); ActualProcessProgress++; // Reset reboot counter - retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("CUSTOMER_RebootCount", new Byte[] { 0x00 }, - ProgrammingSource.ProgramInternal)); + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("CUSTOMER_RebootCount", + new Byte[] { 0x00 }, ProgrammingSource.ProgramInternal)); // Reset alarms Customer - retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("CUSTOMER_TriggerAlarmCancel", + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("CUSTOMER_TriggerAlarmCancel", new Byte[] { 0xFF, 0xFF, 0xFF, 0xFF }, ProgrammingSource.ProgramInternal)); ActualProcessProgress++; // Read back CUSTOMER_TriggerAlarmCancel and ignore empty pipe - var readBackCustomerAlarmCancel = + var readBackCustomerAlarmCancel = RegisterConverter.ByteArrayToValue(Meter.ReadRegister("CUSTOMER_TriggerAlarmCancel")); if (!retValBol || readBackCustomerAlarmCancel != 0) @@ -132,33 +140,91 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr EolProgress.RebootDoneChecked = EOLStatus.FAIL; return StatusReturn.Failed; } - + #endregion + #region ----------------------------------- Check And Reset Radio ------------------------------------- if (Meter.RadioFrequencyMhz != null) { // Reset periodic log reset counter - retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("PERIODICLOG_ResetCounter", + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("PERIODICLOG_ResetCounter", new Byte[] { 0x00 }, ProgrammingSource.ProgramInternal)); - // System state sensus radio to 0xFF for re-initialize + // System state sensus radio to 0xFF for re-initialize retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("SENSUSRADIO_SystemState", new Byte[] { 0xFF }, ProgrammingSource.ProgramInternal)); ActualProcessProgress++; - var finalRadioSystemState = + var finalRadioSystemState = RegisterConverter.ByteArrayToValue(Meter.ReadRegister("SENSUSRADIO_SystemState")); // Reset sensus radio reset counter var sensusRadioResetCtr = new ProgrammingParameters("SENSUSRADIO_ResetCounter", new Byte[] { 0x00 }, ProgrammingSource.ProgramInternal); retValBol &= WriteRegisterLogAndProcessCtr(sensusRadioResetCtr); - + if (!retValBol || finalRadioSystemState != 0x02) { - ErrorMsgDispatcher(Resources.StrErrorMsgAlarmReset); + ErrorMsgDispatcher(Resources.StrErrorMsgRadioNotInCustomerMode); EolProgress.RebootDoneChecked = EOLStatus.FAIL; return StatusReturn.Failed; } } + #endregion + #region ----------------------------------- Check And Reset Accu -------------------------------------- + // Check the accumulator reset and retry if sequence failed - Workaround for FW bug + var retryCtr = 2; + // Check all values for 0 after reset and followed reboot which may use the + var readBackScaledBilling = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_ScaledBilling")); + var readBackUnscaledFwd = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledFwd")); + var readBackUnscaledRev = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledRev")); + + while (retryCtr-- > 0 && + (readBackScaledBilling != 0 || readBackUnscaledFwd != 0 || readBackUnscaledRev != 0)) + { + // Backup sealing state as for the NA region it may be unsealed + var displaySealingState = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_SealDisplay")); + + // Unseal accumulator reset capability + retValBol = WriteRegisterLogAndProcessCtr(new ProgrammingParameters("GENESISFLOW_SealDisplay", + new Byte[] { 0x00 }, ProgrammingSource.ProgramInternal)); + + // Reset accumulators again + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("GENESISFLOW_ResetAccumulators", + new Byte[] { 0x01 }, ProgrammingSource.ProgramInternal)); + // Backup current setting for forward arrow which is different for EMEA and NA region + var forwardArrow = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_ForwardArrow")); + // Any valid write to forward arrow will trigger a writeback to flash in the next few moments, + // it doesn't have to be a change. + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("GENESISFLOW_ForwardArrow", + new[] { forwardArrow }, ProgrammingSource.ProgramInternal)); + + // Seal accumulator reset capability + // ReSharper disable once RedundantAssignment as it is used for DEBUG + retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("GENESISFLOW_SealDisplay", + new[] { displaySealingState }, ProgrammingSource.ProgramInternal)); + + WarningMsgDispatcher(Resources.StrWarningMsgRepeatedAccumulatorReset); + + // Check all values for 0 after reset and followed reboot which may use the + readBackScaledBilling = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_ScaledBilling")); + readBackUnscaledFwd = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledFwd")); + readBackUnscaledRev = + RegisterConverter.ByteArrayToValue(Meter.ReadRegister("GENESISFLOW_UnscaledRev")); + } + + if (readBackScaledBilling != 0 || readBackUnscaledFwd != 0 || readBackUnscaledRev != 0) + { + ErrorMsgDispatcher(Resources.StrErrorMsgVolumeNotCleared); + EolProgress.RebootDoneChecked = EOLStatus.FAIL; + return StatusReturn.Failed; + } +#endregion SuccessMsgDispatcher(Resources.StrSuccessMsgAlarmReset); EolProgress.RebootDoneChecked = EOLStatus.OK; return StatusReturn.Okay; diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecStoreConfiguration.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecStoreConfiguration.cs index b8694a26..8123bc65 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecStoreConfiguration.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecStoreConfiguration.cs @@ -44,7 +44,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // access to meter requires login if (!Meter.IsLoggedOn) { - Meter.Login(); + Meter.ReLogin(); if (!Meter.IsLoggedOn) { ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/PrepareShipping.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/PrepareShipping.cs index ac8d4208..aaf70e7f 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/PrepareShipping.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/PrepareShipping.cs @@ -122,8 +122,15 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr if (feedback != null) foreach (var feed in feedback) { - ErrorMsgDispatcher(Resources.StrErrorMsgSentinelConcerns + " " + - feed.Key + ": " + feed.Value); + // Message filter to reduce those + if (!feed.Key.Contains("Source") && + !feed.Key.Contains("Stack") && + !feed.Key.Contains("Succeeded")) + { + var msg = feed.Key.Contains("Sentinel") ? "" : feed.Key + ": "; + ErrorMsgDispatcher(Resources.StrErrorMsgSentinelConcerns + " " + + msg + feed.Value); + } } ErrorMsgDispatcher(Resources.StrErrorMsgSentinelCheckEolProgress); diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/GuiMessageArgs.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/GuiMessageArgs.cs new file mode 100644 index 00000000..728580c5 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/GuiMessageArgs.cs @@ -0,0 +1,25 @@ +using System; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; + +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EventArgs +{ + /// + /// Logging messages with a specific color for output to GUI as user information. + /// + public class GuiMessageArgs : System.EventArgs + { + public readonly GuiItem GuiItem; + public readonly Object Obj; + + /// + /// Message dispatcher event arguments for GUI display + /// + /// identifier to specify the GUI item + /// + public GuiMessageArgs(GuiItem guiItem, Object obj) + { + GuiItem = guiItem; + Obj = obj; + } + } + } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessLogArgs.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessLogArgs.cs index a6fa781d..fefebe57 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessLogArgs.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessLogArgs.cs @@ -2,7 +2,11 @@ using System.Windows.Media; namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EventArgs -{ public class ProcessLogArgs : System.EventArgs +{ + /// + /// Logging a text with a specific color for output to GUI as user information. + /// + public class ProcessLogArgs : System.EventArgs { public readonly String Data; public readonly SolidColorBrush Color; diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessProgressArgs.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessProgressArgs.cs index 46a18003..c918ab77 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessProgressArgs.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EventArgs/ProcessProgressArgs.cs @@ -2,6 +2,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EventArgs { + /// + /// Process progress to feed the progress bar. + /// public class ProcessProgressArgs : System.EventArgs { public enum ProcessProgressType diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs index 74ba04a6..0d20767f 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs @@ -464,7 +464,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener feedbackMsg = isSpecialActive && productionRequirements.SpecialId != null && productionRequirements.SpecialVersion != null ? - Resources.StrWarningMsgSpecialRequirementActive + + Resources.StrAttentionMsgSpecialRequirementActive + $" Id.Ver: {productionRequirements.SpecialId}.{productionRequirements.SpecialVersion}" : Resources.StrSuccessMsgRequirementActive + $" Id.Ver {productionRequirements.StandardId}.{productionRequirements.StandardVersion}"; @@ -513,7 +513,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener } var pressureSensorAssembled = meter.PressureSensorAssembled ? $", {Resources.StrLblPressureSensorAssembledTxt}" : ""; - var meterInfo = $"{Resources.StrLblRadioFrequencyTxt}: {meter.RadioFrequencyMhz} MHz," + + var meterInfo = $"{Resources.StrLblRadioFrequencyTxt}: {meter.RadioFrequencyMhz} MHz, " + $"{Resources.StrLblMeterSizeTxt}: {meter.MeterSize}, " + $"{Resources.StrLblMeterLengthTxt}: {meter.MeterLength} mm" + $"{pressureSensorAssembled}"; diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/BaseCheckOrderNumber.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/BaseCheckOrderNumber.cs new file mode 100644 index 00000000..c15a81b3 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/BaseCheckOrderNumber.cs @@ -0,0 +1,117 @@ +using System; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; +using Xylem.Common.Production.ProductionUiCordonel.Properties; +using Xylem.Common.Production.ProductionUiCordonel.UserControls; + +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses +{ + public abstract class BaseCheckOrderNumber : BaseProductionProcess + { + // string from scanner with string delimiter + private String _scan = ""; + // marker for scan input received + private Boolean _scanInputReceived; + /// + /// Ctor + /// + protected BaseCheckOrderNumber(String name) : base(name) + { + } + + /// + protected override void InitUserControl() + { + UserControl = new UcBarcodeInput + { + lblHeadLine = { Content = Resources.StrInstructionScanOrder }, + tbxScan = { Text = "" } + }; + } + + /// + /// Event handler taking the input from text box which should be scanned but also can be input manually. + /// + /// + /// + /// - Initial + /// + private void UserControlInput_Handler(Object sender, String input) + { + _scan = input; + _scanInputReceived = true; + } + + /// + /// Scanning of order number from production order sheet and comparing with DB. + /// + /// + /// + /// - Initial + /// + /// + /// - Removed signals for and as + /// these will be automatically set based on return value in + /// . + /// + public override StatusReturn ExecuteProcess() + { + if (Meter == null) + { + return StatusReturn.Failed; + } + + SignalRunningState(); + + if (UserControl == null) + { + ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); + return StatusReturn.Failed; + } + + var ucBarCode = (UcBarcodeInput)UserControl; + ucBarCode.OnBarcodeInput += UserControlInput_Handler; + + // set focus to text input for scanner + ucBarCode.FocusMe(); + _scanInputReceived = false; + + // wait for new line + while (!_scanInputReceived) + { + } + + ucBarCode.OnBarcodeInput -= UserControlInput_Handler; + + if (!string.IsNullOrEmpty(_scan) && _scan.Length > 6) + { + if (int.TryParse(_scan, out var prodOrderNo)) + { + // Get order overview + if (OrderDetailsDb.GetCordonelOrderOverview(prodOrderNo, out var orderOverview)) + { + if (ValidateProcessAndPublishDataToGui(orderOverview)) + { + ActualProcessProgress++; + return StatusReturn.Okay; + } + return StatusReturn.Failed; + } + + ErrorMsgDispatcher(Resources.StrErrorMsgDataBaseAccess); + return StatusReturn.Failed; + } + } + + ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); + return StatusReturn.Failed; + } + + /// + /// Application differences in check result + /// + /// + protected abstract Boolean ValidateProcessAndPublishDataToGui(OrderOverViewCordonel orderOverview); + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/ConnectCordonel.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/ConnectCordonel.cs index 0bb0af72..07ad034c 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/ConnectCordonel.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/ConnectCordonel.cs @@ -32,6 +32,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener /// /// - Error exit on unsupported FW from the configuration.json. /// + /// + /// - Early return if login failed. + /// public override StatusReturn ExecuteProcess() { Boolean retVal; @@ -53,24 +56,25 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener retVal = false; } + if (!retVal) + { + ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); + return StatusReturn.Failed; + } + // If interface is outdated if (!Meter.InterfaceSupportsFwVersion) { ErrorMsgDispatcher($"{Resources.StrErrorMsg}: " + - $"{Resources.StrMsgInterfaceVersion} {Meter.InterfaceVersion} - " + - $"{Resources.StrMsgInterfaceSupportedMaxFwVersion} {Meter.InterfaceMaxFwVersion} - " + + $"{Resources.StrMsgInterfaceVersion} {Meter.InterfaceInfo.InterfaceVersion} - " + $"{Resources.StrMsgInstalledFwVersion} {Meter.FwVersion}"); return StatusReturn.Failed; } SuccessMsgDispatcher($"{Resources.StrSuccessMsg}: " + - $"{Resources.StrMsgInterfaceVersion} {Meter.InterfaceVersion} - " + - $"{Resources.StrMsgInterfaceSupportedMaxFwVersion} {Meter.InterfaceMaxFwVersion} - " + + $"{Resources.StrMsgInterfaceVersion} {Meter.InterfaceInfo.InterfaceVersion} - " + $"{Resources.StrMsgInstalledFwVersion} {Meter.FwVersion}"); - if (retVal) return StatusReturn.Okay; - - ErrorMsgDispatcher(Resources.StrErrorMsgCordonelLogin); - return StatusReturn.Failed; + return StatusReturn.Okay; } } } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/DetectCordonel.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/DetectCordonel.cs index 0c2d9993..18a18bad 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/DetectCordonel.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/DetectCordonel.cs @@ -43,10 +43,12 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener // read the PcbId to validate Cordonel is attached var retVal = !string.IsNullOrEmpty(Meter.GetPcbId()); - if (retVal) return StatusReturn.Okay; + if (retVal) + return StatusReturn.Okay; ErrorMsgDispatcher(Resources.StrErrorMsgCordonelDetection); return StatusReturn.Failed; } + } } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetSerialNumberAndRadioAddress.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetSerialNumberAndRadioAddress.cs index a912e5a7..18a8682c 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetSerialNumberAndRadioAddress.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericProcesses/GetSerialNumberAndRadioAddress.cs @@ -58,7 +58,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener "&withRadioAdress=true"; var responseJson = LocalWebRequest.GetRequest(url, 30000); - var stringArray = JsonConvert.DeserializeObject(responseJson); + var stringArray = JsonConvert.DeserializeObject(responseJson); if (stringArray != null) { diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs index 9bf5a649..62cb3390 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/IProductionProcess.cs @@ -39,6 +39,11 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses /// event EventHandler OnProcessProgressChanged; + /// + /// Send messages to GUI + /// + event EventHandler OnGuiMessageDispatcher; + /// /// State of single production process /// diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckCordonelMapping.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckCordonelMapping.cs new file mode 100644 index 00000000..e3ef3d14 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckCordonelMapping.cs @@ -0,0 +1,130 @@ +using System; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; +using Resources = Xylem.Common.Production.ProductionUiCordonel.Properties.Resources; + +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.PickingProcesses +{ + /// + /// Check for Cordonel mapping parameters. + /// + public class CheckCordonelMapping : BaseProductionProcess + { + /// + /// Ctor + /// Setup of name and single process state + /// + public CheckCordonelMapping(String name) : base(name) + { + } + + /// + /// Check Cordonel mapping: + /// - Check if PcbId is already mapped to production order + /// - Check if order is different from actual scanned order, + /// - Check if older box with octopussies is on stock, + /// - Preserve picking number for this Cordonel. + /// Precondition: - Detection of Cordonel has to be finished, + /// - Meter.OrderNumber has to be assigned after scan. + /// + /// + /// + /// - Initial + /// + public override StatusReturn ExecuteProcess() + { + if (Meter == null || string.IsNullOrEmpty(Meter.PcbId) || Meter.OrderNumber == 0) + { + return StatusReturn.Failed; + } + + SignalRunningState(5); + Meter.ReLogin(); + Meter.SetProcessState(DisplayCodes.PickingStarted); + Meter.Logout(); + + // Check mapping information + if (!OrderDetailsDb.GetCordonelMapping(Meter.PcbId, out var cordonelMapping) || + cordonelMapping == null || cordonelMapping.Count == 0) + { + return ErrorExit(Resources.StrErrorMsgMissingMappingInformation); + } + ActualProcessProgress++; + + // Check if this meter is mapped to a different order + if (cordonelMapping[0].CordonelAssignedPicking_FertigungsAuftragsNr != null && + cordonelMapping[0].CordonelAssignedPicking_FertigungsAuftragsNr != Meter.OrderNumber) + { + return ErrorExit(Resources.StrErrorMsgMeterForOtherOrderAssigned + + $": {cordonelMapping[0].CordonelAssignedPicking_FertigungsAuftragsNr}"); + } + + // Check if meter is already married to a serial number on a previous run + if (cordonelMapping[0].MapPcbIdToSerialNumber_SerialNumber != null) + { + WarningMsgDispatcher(Resources.StrWarningMsgCordonelIsAlreadyMarried); + Meter.SerialNumber = cordonelMapping[0].MapPcbIdToSerialNumber_SerialNumber.ToString(); + } + + // Reserve picking for this device to lock other assembly line software to assign another Cordonel to + // this order. + //TODO THW deactivated until WebAPI is implemented + //if (!OrderDetailsDb.SetCordonelPickingStateToDb(Meter.PcbId, Meter.OrderNumber)) + //{ + // return ErrorExit(Resources.StrErrorMsgPickingReservationFailed); + //} + ActualProcessProgress++; + + //TODO THW Read reservation status with GetOrderOverview to update the display + ActualProcessProgress++; + + // Get detailed order information to set e.g. the correct meter size needed for LUT installation + if (!OrderDetailsDb.GetOrderDetails(Meter.OrderNumber, Meter.PcbId, out var orderDetails)) + { + return ErrorExit(Resources.StrErrorMsgMissingOrderInformation); + } + ActualProcessProgress++; + + // Meter has to be connected in advance being able to overwrite the meter size. The meterSize will be + // read out from Cordonel at Connect. This may be reassigned dependent on the orderDetails.MeterSize. + // This meter size is the base for all following process steps e.g. loading of the correct LUT. + // The property change allowance for the meter size and pressure assembled has to be set in advance + // soon the production process is defined as assembly. + Meter.EnablePropertyChangeAbility(true); + // During the LUT installation the MeterSize will be written to the Cordonel and stored permanently. + if (!Meter.SetMeterSize((MeterSize)orderDetails.MeterSize)) + { + return ErrorExit(Resources.StrErrorMsgChangingMeterSizeFromOrderFailed); + } + SuccessMsgDispatcher(Resources.StrSuccessMsgChangedMeterSizeFromOrder + $": {Meter.MeterSize}"); + + //TODO THW do not change, read only if this is set + if (!Meter.SetPressureSensorAssembled(orderDetails.PressurePresent)) + { + return ErrorExit(Resources.StrErrorMsgPressureSensorSetupFromOrderFailed); + } + var pressurePresent = Meter.PressureSensorAssembled + ? Resources.StrMsgPressureSensorApplied + : Resources.StrMsgPressureSensorNotApplied; + SuccessMsgDispatcher(Resources.StrSuccessMsgPressureSensorSetupFromOrder + $": {pressurePresent}"); + Meter.EnablePropertyChangeAbility(false); + + return StatusReturn.Okay; + } + + /// + /// Common error exit method. + /// + /// + /// + private StatusReturn ErrorExit(String errorMsg) + { + Meter.ReLogin(); + Meter.SetProcessState(DisplayCodes.PickingFailed); + Meter.Logout(); + ErrorMsgDispatcher(errorMsg); + return StatusReturn.Failed; + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs index a4e23818..3f876722 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/CheckOrderNumber.cs @@ -1,100 +1,37 @@ using System; -using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; -using Xylem.Common.Production.ProductionUiCordonel.Properties; -using Xylem.Common.Production.ProductionUiCordonel.UserControls; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EventArgs; +using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.GenericProcesses; +using Resources = Xylem.Common.Production.ProductionUiCordonel.Properties.Resources; namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.PickingProcesses { - public class CheckOrderNumber : BaseProductionProcess + public class CheckOrderNumber : BaseCheckOrderNumber { - // string from scanner with string delimiter - private String _scan = ""; - // marker for scan input received - private Boolean _scanInputReceived; - /// - /// Ctor - /// - public CheckOrderNumber(String name) : base( name) + /// + public CheckOrderNumber(String name) : base(name) { } /// - protected override void InitUserControl() + protected override Boolean ValidateProcessAndPublishDataToGui(OrderOverViewCordonel orderOverview) { - UserControl = new UcBarcodeInput - { - lblHeadLine = { Content = Resources.StrInstructionScanOrder }, - tbxScan = { Text = "" } - }; - } - - /// - /// Event handler taking the input from text box which should be scanned but also can be input manually. - /// - /// - /// - /// - Initial - /// - private void UserControlInput_Handler(Object sender, String input) - { - _scan = input; - _scanInputReceived = true; - } - - /// - /// Scanning of order number from production order sheet and comparing with DB. - /// - /// - /// - /// - Initial - /// - /// - /// - Removed signals for and as - /// these will be automatically set based on return value in - /// . - /// - public override StatusReturn ExecuteProcess() - { - if (Meter == null) - { - return StatusReturn.Failed; - } - - SignalRunningState(); - - if (UserControl == null) - { - ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); - return StatusReturn.Failed; - } - - var ucBarCode = (UcBarcodeInput)UserControl; - ucBarCode.OnBarcodeInput += UserControlInput_Handler; + // ATTENTION: Set order number of Cordonel first to enable display on completed order + Meter.OrderNumber = orderOverview.OrderNumber; - // set focus to text input for scanner - ucBarCode.FocusMe(); - _scanInputReceived = false; - - // wait for new line - while (!_scanInputReceived) + // Display order overview in GUI + DispatchGuiMessage(new GuiMessageArgs(GuiItem.OrderAmount, orderOverview.Count)); + DispatchGuiMessage(new GuiMessageArgs(GuiItem.OrderCounter, orderOverview.AssignedPicking)); + // Exit if order is completed + if (orderOverview.AssignedPicking >= orderOverview.Count) { + // Order is already completed + ErrorMsgDispatcher(Resources.StrErrorOrderCompleted); + return false; } - - ucBarCode.OnBarcodeInput -= UserControlInput_Handler; - - if (!string.IsNullOrEmpty(_scan) && _scan.Length > 6) - { - //TODO Roland, Do something with the scanned order - if (int.TryParse(_scan, out var result)) - { - Meter.OrderNumber = result; - return StatusReturn.Okay; - } - } - - ErrorMsgDispatcher(Resources.StrErrorMsgScanOrderNumber); - return StatusReturn.Failed; + + return true; } } } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/ExecInstallLut.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/ExecInstallLut.cs new file mode 100644 index 00000000..7427ddba --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/ExecInstallLut.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Logic.ProductionToProductMapper.Cordonel; +using Newtonsoft.Json; +using Xylem.Common.CommonCore.Configuration; +using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; +using Xylem.Common.Logic.SoftwareAccessHelper; +using Xylem.Common.Production.ProductionUiCordonel.Properties; + +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.PickingProcesses +{ + /// + /// Production process for installation of the metrology-lookup-table LUT. + /// + public class ExecInstallLut : BaseProductionProcess + { + /// + /// Ctor + /// Setup of name and single process state + /// + public ExecInstallLut(String name) : base(name) + { + } + + /// + /// Install the LUT. + /// Precondition: - Connection to Cordonel has to be validated. + /// + /// + /// + /// - Initial + /// + public override StatusReturn ExecuteProcess() + { + if (Meter == null) + { + return StatusReturn.Failed; + } + + SignalRunningState(7); + + try + { + var url = ServiceUrls.GetLutUrl(); + // ATTENTION: Meter.MeterSize has to be preset from order.MeterSize as this is forced by order. + // If not doing so, the wrong LUT will be loaded! + url += $"?Metersize={(Int32)MeterSizeConverter.ConvertMeterSizeNameToEnum(Meter.MeterSize)}" + + $"&ForProd=true&Region={Meter.Region}"; + var requestResponse = LocalWebRequest.GetRequest(url, 30000); + if (string.IsNullOrEmpty(requestResponse)) + { + ErrorMsgDispatcher(Resources.StrErrorLutNotFound); + return StatusReturn.Failed; + } + + var lutList = JsonConvert.DeserializeObject>(requestResponse); + if (lutList.Count <= 0) + { + ErrorMsgDispatcher(Resources.StrErrorLutNotFound); + return StatusReturn.Failed; + } + + var lut = lutList.First(); + var meterLutUpdate = new MeterLutUpdate(Meter); + meterLutUpdate.OnProcessUpdate += ProcessUpdate_Handler; + var retVal = meterLutUpdate.LoadLutFromStream(lut.FileName, lut.FileContent.ToList()); + retVal &= meterLutUpdate.UpdateMeterLut(); + meterLutUpdate.OnProcessUpdate -= ProcessUpdate_Handler; + return !retVal ? StatusReturn.Failed : StatusReturn.Okay; + } + catch (Exception ex) + { + Meter?.WriteLog(ex.Message); + return StatusReturn.Failed; + } + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs index 0e44f138..4de17564 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PickingProcessStatesDef.cs @@ -119,19 +119,18 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki processState: ProcessState.ConnectCordonel, processInfo: Resources.StrStateConnectCordonel, productionProcessNo: 2, - nextStateOnSuccess: ProcessState.GetProgrammingParameters), + nextStateOnSuccess: ProcessState.CheckCordonelMapping), - // Precondition: - The connection process has to be completed as a readout of some register - // values from the Cordonel are needed to check the update capability: - // - Wait on completed connection process before starting this process. + // Precondition: - The connection process has to be completed + // This process is needed to load the radio signal levels for this meter size and length which have to + // be compared later in the 'CheckProductionState' process. new ProcessStateStruct( productionProcess: new GetFinalParametrization(Resources.StrStateGetProgrammingParameters), processState: ProcessState.GetProgrammingParameters, processInfo: Resources.StrStateGetProgrammingParameters, - productionProcessNo: 3, - nextStateOnSuccess: ProcessState.CheckProductionState, - // Wait before starting this process until this process has been successfully completed - waitForSingleProcess: ProcessState.ConnectCordonel), + productionProcessNo: 4, + nextStateOnSuccess: ProcessState.InstallLut), + #endregion -------------------------------- GENERIC-STATES -------------------------------------------- #region ----------------------------------- PICKING-STATES -------------------------------------------- @@ -143,24 +142,43 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki productionProcessNo: 0, nextStateOnSuccess: ProcessState.DetectCordonel), - // Precondition: - The connection process has to be completed as a readout of some register - // values from the Cordonel are needed to check the update capability: - // - Wait on completed connection process before starting this process. + // Precondition: - The connection process has to be completed + // During the 'ConnectCordonel' process the meter size will be read from the meter and set inside the + // 'GenesisMeter' object. Based on the order details this has to be changed afterward and to overwrite + // this in the 'GenesisMeter' object. It is needed for the installation of the correct LUT. + new ProcessStateStruct( + productionProcess: new CheckCordonelMapping(Resources.StrStateCheckCordonelMapping), + processState: ProcessState.CheckCordonelMapping, + processInfo: Resources.StrStateCheckCordonelMapping, + productionProcessNo: 3, + nextStateOnSuccess: ProcessState.GetProgrammingParameters), + + // Connection of Cordonel has to be completed so leave to automatic + new ProcessStateStruct( + productionProcess: new ExecInstallLut(Resources.StrStateInstallLut), + processState: ProcessState.InstallLut, + processInfo: Resources.StrStateInstallLut, + productionProcessNo: 5, + nextStateOnSuccess: ProcessState.CheckProductionState), + + // Precondition: - The programming parameters are needed to check if radio signal levels for this + // meter size and length are defined, + // - The LUT has to be installed in advance, + // - The battery fix has to be applied in advance. new ProcessStateStruct( productionProcess: new CheckProductionState(Resources.StrStateCheckProductionState), processState: ProcessState.CheckProductionState, processInfo: Resources.StrStateCheckProductionState, - productionProcessNo: 4, + productionProcessNo: 6, nextStateOnSuccess: ProcessState.PrepareAssemblyLineRelease, - // Wait before starting this process until this process has been successfully completed - waitForSingleProcess: ProcessState.GetProgrammingParameters), + waitForAllProcesses: true), // Precondition: - All checks have to be executed with positive result new ProcessStateStruct( productionProcess: new PrepareAssemblyRelease(Resources.StrStatePrepareAssemblyRelease), processState: ProcessState.PrepareAssemblyLineRelease, processInfo: Resources.StrStatePrepareAssemblyRelease, - productionProcessNo: 5, + productionProcessNo: 7, nextStateOnSuccess: ProcessState.AssemblyLineRelease), new ProcessStateStruct( @@ -170,7 +188,6 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki productionProcessNo: null, nextStateOnSuccess: ProcessState.Idle), - //TODO Roland: implement your states here #endregion -------------------------------- PICKING-STATES -------------------------------------------- }; diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PrepareAssemblyRelease.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PrepareAssemblyRelease.cs index 79c3ac73..453f0489 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PrepareAssemblyRelease.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/PickingProcesses/PrepareAssemblyRelease.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using Xylem.Common.CommonCore.Consts; +using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts; +using Xylem.Common.Logic.ProductionOrderCore.OrderData; using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Enum; using Xylem.Common.Production.ProductionUiCordonel.Properties; using Xylem.Common.Production.ProductionUiCordonel.UserControls; @@ -47,25 +49,37 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Picki /// /// - Initial. /// + /// + /// - Final result message, display and push to database. + /// public override StatusReturn ExecuteProcess() { try { - _waitOnUserFeedback = true; SignalRunningState(MaxActualProgressSteps); - var ucDialog = (UcDialog)UserControl; - // Push progress will publish all application versions and the core version - var retVal = Meter.PushProgress("Assembly", Version.ToString()); - if (retVal == StatusReturn.Failed) - { - return retVal; - } + // Set picking for this device as finished successfully. + //TODO THW deactivated until WebAPI is implemented + //if (StatusReturn.Failed == Meter.PushProgress("Assembly", Version.ToString()) || + // !OrderDetailsDb.SetCordonelPickingStateToDb(Meter.PcbId, Meter.OrderNumber, 1)) + //{ + // OrderDetailsDb.SetCordonelPickingStateToDb(Meter.PcbId, Meter.OrderNumber, 0); + // Meter.Login(); + // Meter.SetProcessState(DisplayCodes.PickingFailed); + // Meter.Logout(); + // ErrorMsgDispatcher(Resources.StrErrorMsgPickingFinalizationFailed); + // return StatusReturn.Failed; + //} ActualProcessProgress++; - + Meter.ReLogin(); + Meter.SetProcessState(DisplayCodes.PickingTested); + Meter.Logout(); + // Initialize the ucDialog + _waitOnUserFeedback = true; + var ucDialog = (UcDialog)UserControl; ucDialog.SetHeadline(Resources.StrStateAssemblyLineRelease); ucDialog.SetMessage(Resources.StrInfoMeterBoxing); var OptionList = new List(); diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs index b0aef037..6fe00b63 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/ProcessController.cs @@ -85,6 +85,11 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses /// public event EventHandler OnProcessProgressChanged; + /// + /// Dispatch a message to the GUI + /// + public event EventHandler OnGuiMessageDispatcher; + // cancellation token private CancellationTokenSource _cancellationTokenSource; private CancellationToken _cancellationToken; @@ -254,6 +259,11 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses OnProcessProgressChanged?.Invoke(sender, e); } + private void GuiMessageDispatcher_Handler(Object sender, GuiMessageArgs e) + { + OnGuiMessageDispatcher?.Invoke(sender, e); + } + private void ProcessLog_Handler(Object sender, ProcessLogArgs e) { OnProcessLogRequest?.Invoke(sender, e); @@ -325,79 +335,85 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses // Signal state change to logger OnStateMachineStateChanged?.Invoke(this, new ProcessStateArgs(_stateMachineState)); - - // Check if state is the first in the list of production processes to reset cancellationToken and - // calculate the over all process steps to feed the progress bars. - var startProcessState = _processStateDef.GetStateOfFirstProcess(); - if (startProcessState == _stateMachineState) + + if (_processStateDef != null) { - // Kill all processes at start - KillProcesses(); - // Avoid immediately cancellation for first process of the process chain - ResetCancellationToken(); - // Set up the counter for maximum overall process progress bar in GUI - CalcAndPushMaxOverAllProcessSteps(); - } - - // Get the processStateStruct of this new required stateMachineState - var processStateStruct = _processStateDef.GetProcessStateStructOfState(_stateMachineState); - - switch (_stateMachineState) - { - case ProcessState.Idle: - break; - - case ProcessState.CheckNewMeter: - // Detection of Cordonel has to be completed before assigning next state. It has to be checked if - // the meter changed to clear all collected contents of previous run. To UPDATE ALL INFORMATION after - // new meter assignment the "DetectCordonel" has to be repeated to return here "Old Meter" and then - // enter the "ConnectCordonel"! - if (processStateStruct.NextStateOnSuccess != null) - { - _stateMachineState = CheckForNewMeter() ? (ProcessState)processStateStruct.NextStateOnSuccess : - processStateStruct.ErrorExitState; - } - else - { - _stateMachineState = ProcessState.Error; - } - break; - - case ProcessState.RepeatFailedTests: - _stateMachineState = RepeatFailedTests(); - break; - - case ProcessState.AbortTest: - AbortProcesses(); - _stateMachineState = ProcessState.Idle; - break; - - case ProcessState.Stop: + // Check if state is the first in the list of production processes to reset cancellationToken and + // calculate the over all process steps to feed the progress bars. + var startProcessState = _processStateDef.GetStateOfFirstProcess(); + if (startProcessState == _stateMachineState) + { + // Kill all processes at start KillProcesses(); - _stateMachineState = ProcessState.Idle; - break; + // Avoid immediately cancellation for first process of the process chain + ResetCancellationToken(); + // Set up the counter for maximum overall process progress bar in GUI + CalcAndPushMaxOverAllProcessSteps(); + } - case ProcessState.Error: - // Common error handling routine - ProcessErrorHandler(_stateChangeRequestProcess); - // Start the error handler with its user feedback request. It has to be started - // always even if the abortion of all processes is required! The error handler - // will change the exit state based on the user input. - StartProcess(processStateStruct); - break; + // Get the processStateStruct of this new required stateMachineState + var processStateStruct = _processStateDef.GetProcessStateStructOfState(_stateMachineState); - case ProcessState.StateListDelimiter: - _stateMachineState = ProcessState.Idle; - break; + switch (_stateMachineState) + { + case ProcessState.Idle: + break; - default: - // This is the call to the processes for a specific test - StartProcess(processStateStruct); - if (processStateStruct.KickOffParallelState != null) - { - _stateMachineState = (ProcessState)processStateStruct.KickOffParallelState; - } - break; + case ProcessState.CheckNewMeter: + // Detection of Cordonel has to be completed before assigning next state. It has to be checked if + // the meter changed to clear all collected contents of previous run. To UPDATE ALL INFORMATION after + // new meter assignment the "DetectCordonel" has to be repeated to return here "Old Meter" and then + // enter the "ConnectCordonel"! + if (processStateStruct.NextStateOnSuccess != null) + { + _stateMachineState = CheckForNewMeter() + ? (ProcessState)processStateStruct.NextStateOnSuccess + : processStateStruct.ErrorExitState; + } + else + { + _stateMachineState = ProcessState.Error; + } + + break; + + case ProcessState.RepeatFailedTests: + _stateMachineState = RepeatFailedTests(); + break; + + case ProcessState.AbortTest: + AbortProcesses(); + _stateMachineState = ProcessState.Idle; + break; + + case ProcessState.Stop: + KillProcesses(); + _stateMachineState = ProcessState.Idle; + break; + + case ProcessState.Error: + // Common error handling routine + ProcessErrorHandler(_stateChangeRequestProcess); + // Start the error handler with its user feedback request. It has to be started + // always even if the abortion of all processes is required! The error handler + // will change the exit state based on the user input. + StartProcess(processStateStruct); + break; + + case ProcessState.StateListDelimiter: + _stateMachineState = ProcessState.Idle; + break; + + default: + // This is the call to the processes for a specific test + StartProcess(processStateStruct); + if (processStateStruct.KickOffParallelState != null) + { + _stateMachineState = (ProcessState)processStateStruct.KickOffParallelState; + } + + break; + } } } catch (ThreadAbortException ex) @@ -441,7 +457,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses } } } - + /// /// Returns the currentGenesis information for display /// @@ -453,7 +469,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses { return _cordonelRequirements; } - + /// /// Returns the currentGenesis information for display /// @@ -465,8 +481,8 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses { return _genesisMeter; } - - + + /// /// Clears all collected data on new genesisMeter and reminds the detected for next /// detection and run of this comparison. @@ -510,7 +526,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses InitNewMeter(); InitProcesses(ppNo); ResetCancellationToken(); - + // Remind actual genesis for next call _lastPcbId = _genesisMeter?.PcbId; @@ -568,7 +584,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses return state; } - + /// /// Error handler /// @@ -599,6 +615,8 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses pp.RetryProcess(); pp = _processStateDef.GetProcessOfState(ProcessState.RebootCordonel); pp.RetryProcess(); + pp = _processStateDef.GetProcessOfState(ProcessState.CheckRadio); + pp.RetryProcess(); pp = _processStateDef.GetProcessOfState(ProcessState.CheckFinalParametrization); pp.RetryProcess(); } @@ -619,7 +637,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses OnProcessProgressChanged?.Invoke(this, new ProcessProgressArgs(_maxOverallProcessesSteps, ProcessProgressArgs.ProcessProgressType.MaxOverallProcessSteps)); } - + /// /// Calculate all processes which are completed or skipped and signal to GUI. /// @@ -666,9 +684,9 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses process.IdleProcess(); // All processes from and behind this process will be killed to kep the preceding as is - else if ( _processStateDef.GetProductionProcessNoOfProcess(process) >= productionProcessNo) + else if (_processStateDef.GetProductionProcessNoOfProcess(process) >= productionProcessNo) process.IdleProcess(); - + // Add process to list to feed the process window in main screen if (Processes.All(pp => pp.ProcessName != process.ProcessName)) { @@ -812,6 +830,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses if (process == null) return; + process.OnGuiMessageDispatcher += GuiMessageDispatcher_Handler; process.OnProcessProgressChanged += ProcessProgress_Handler; process.OnProcessLogRequest += ProcessLog_Handler; process.OnProcessStateChanged += ProcessStateChanged_Handler; @@ -827,6 +846,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses if (process == null) return; + process.OnGuiMessageDispatcher -= GuiMessageDispatcher_Handler; process.OnProcessProgressChanged -= ProcessProgress_Handler; process.OnProcessLogRequest -= ProcessLog_Handler; process.OnProcessStateChanged -= ProcessStateChanged_Handler; @@ -910,7 +930,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses if (productionProcessNo == null) pp.IdleProcess(); // All processes from and behind this process will be killed to kep the preceding as is - else if ( _processStateDef.GetProductionProcessNoOfProcess(pp) >= productionProcessNo) + else if (_processStateDef.GetProductionProcessNoOfProcess(pp) >= productionProcessNo) pp.IdleProcess(); } } diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/AlarmMask.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/AlarmMask.cs new file mode 100644 index 00000000..bc39a99c --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/AlarmMask.cs @@ -0,0 +1,79 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + //using Common.Hardware.SIRT; + + using System.Text; + + public class AlarmMask + { + protected readonly byte[] bits; + + public AlarmMask(byte value) => this.bits = value.GetBitsLE(); + + public bool SpecificError + { + get => this.bits[0] == 1; + set => this.bits[0] = (byte)(value ? 1 : 0); + } + + public bool MediumAbsent + { + get => this.bits[1] == 1; + set => this.bits[1] = (byte)(value ? 1 : 0); + } + + public bool BrokenPipe + { + get => this.bits[2] == 1; + set => this.bits[2] = (byte)(value ? 1 : 0); + } + + public bool Backflow + { + get => this.bits[3] == 1; + set => this.bits[3] = (byte)(value ? 1 : 0); + } + + public bool MetrologyUnavailable + { + get => this.bits[4] == 1; + set => this.bits[4] = (byte)(value ? 1 : 0); + } + + public bool MagneticTamper + { + get => this.bits[5] == 1; + set => this.bits[5] = (byte)(value ? 1 : 0); + } + + public bool Leak + { + get => this.bits[6] == 1; + set => this.bits[6] = (byte)(value ? 1 : 0); + } + + public bool LowBattery + { + get => this.bits[7] == 1; + set => this.bits[7] = (byte)(value ? 1 : 0); + } + + public override string ToString() + { + var alarmMaskBuilder = new StringBuilder(); + + alarmMaskBuilder.AppendLine($"{nameof(this.SpecificError),20}: {this.SpecificError}"); + alarmMaskBuilder.AppendLine($"{nameof(this.MediumAbsent),20}: {this.MediumAbsent}"); + alarmMaskBuilder.AppendLine($"{nameof(this.BrokenPipe),20}: {this.BrokenPipe}"); + alarmMaskBuilder.AppendLine($"{nameof(this.Backflow),20}: {this.Backflow}"); + alarmMaskBuilder.AppendLine($"{nameof(this.MetrologyUnavailable),20}: {this.MetrologyUnavailable}"); + alarmMaskBuilder.AppendLine($"{nameof(this.MagneticTamper),20}: {this.MagneticTamper}"); + alarmMaskBuilder.AppendLine($"{nameof(this.Leak),20}: {this.Leak}"); + alarmMaskBuilder.AppendLine($"{nameof(this.LowBattery),20}: {this.LowBattery}"); + + return alarmMaskBuilder.ToString(); + } + + public static implicit operator byte(AlarmMask alarmMask) => alarmMask.bits.GetByteLE(); + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/AppCode.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/AppCode.cs new file mode 100644 index 00000000..4ce6d158 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/AppCode.cs @@ -0,0 +1,13 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public enum AppCode + { + BUP = 0x00, + LAT = 0x01, + SEMI = 0x08, + LoggerTelegram = 0x09, + TestTelegram = 0x0A, + DEBUG = 0x0B, + EncapsulatedFlexNet = 0x10 + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/DisplayUnits.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/DisplayUnits.cs new file mode 100644 index 00000000..8414e6d5 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/DisplayUnits.cs @@ -0,0 +1,11 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public enum DisplayUnits + { + NA = 0, + m3 = 19, + CF = 35, + GAL = 24, + IGAL = 144, + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Epoch20000101.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Epoch20000101.cs new file mode 100644 index 00000000..0bdbe9b4 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Epoch20000101.cs @@ -0,0 +1,35 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using System; + + public class Epoch20000101 + { + private static readonly DateTime epoch = new DateTime(2000, 01, 01, 00, 00, 00, DateTimeKind.Utc); + + private readonly byte[] bytes; + + public Epoch20000101(DateTimeKind dateTimeKind = DateTimeKind.Utc) + => this.bytes = new byte[4]; + + public Epoch20000101(uint secondsSince, DateTimeKind dateTimeKind = DateTimeKind.Utc) : this(dateTimeKind) + => this.SecondsSince = secondsSince; + + public uint SecondsSince + { + get => BitConverter.ToUInt32(this.bytes, 0); + set => BitConverter.GetBytes(value).CopyTo(this.bytes, 0); + } + + public DateTime DateTime + { + get => epoch.AddSeconds(this.SecondsSince); + set => this.SecondsSince = (uint)(value - epoch).TotalSeconds; + } + + public static uint UTCNow => new Epoch20000101 { DateTime = DateTime.UtcNow }.SecondsSince; + + public static implicit operator DateTime(Epoch20000101 epoch) => epoch.DateTime; + + public static implicit operator uint(Epoch20000101 epoch) => epoch.SecondsSince; + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Extensions.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Extensions.cs new file mode 100644 index 00000000..055ad21b --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Extensions.cs @@ -0,0 +1,623 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using System; + using System.Collections.Generic; + + public static class Extensions + { + private const int ByteSize = 8; + private const int SByteSize = 16; + private const int Int16Size = 16; + private const int UInt16Size = 16; + private const int Int32Size = 32; + private const int UInt32Size = 32; + private const int Int64Size = 64; + private const int UInt64Size = 64; + + public static byte[] GetBitsBE(this byte value) + { + var bits = new byte[ByteSize]; + + for (int i = 7, x = 0; i >= 0; i--, x++) + { + bits[x] = (byte)((value >> i) & 1); + } + + return bits; + } + + public static byte[] GetBitsLE(this byte value) + { + var bits = new byte[ByteSize]; + + for (var i = 0; i < ByteSize; i++) + { + bits[i] = (byte)((value >> i) & 1); + } + + return bits; + } + + public static byte[] GetBitsLE(this ushort value) + { + var bits = new byte[UInt16Size]; + + for (var i = 0; i < UInt16Size; i++) + { + bits[i] = (byte)((value >> i) & 1); + } + + return bits; + } + + public static byte GetByteLE(this byte[] bits) + { + if (bits is null) + { + return default(byte); + } + + var value = default(byte); + + for (var i = 0; i < ByteSize; i++) + { + value ^= (byte)(bits[i] << i); + } + + return value; + } + + public static byte GetByteLE(this byte[] bits, int start = 0, int count = 0) + { + if (bits is null) + { + return default(byte); + } + + if (count == 0) + { + count = bits.Length; + } + + var length = start + count; + var _byte = default(byte); + + for (int i = start, x = 0; i < length; i++, x++) + { + _byte ^= (byte)(bits[i] << x); + } + + return _byte; + } + + public static void SetBitsLE(this byte value, byte[] bits, int start = 0, int count = 0) + { + if (bits is null) + { + return; + } + + if (count == 0 || count > bits.Length) + { + count = bits.Length; + } + + for (int i = start, x = 0; i < count; i++, x++) + { + bits[i] = (byte)((value >> x) % 2); + } + } + + public static byte[] GetBytesBE(this sbyte value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this short value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this int value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this long value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)(value >> 56); + bytes[index++] = (byte)(value >> 48); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this ushort value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this uint value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesBE(this ulong value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)(value >> 56); + bytes[index++] = (byte)(value >> 48); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 8); + bytes[index] = (byte)value; + + return bytes; + } + + public static byte[] GetBytesLE(this sbyte value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index] = (byte)(value >> 8); + + return bytes; + } + + public static byte[] GetBytesLE(this short value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index] = (byte)(value >> 8); + + return bytes; + } + + public static byte[] GetBytesLE(this int value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index] = (byte)(value >> 24); + + return bytes; + } + + public static byte[] GetBytesLE(this long value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 48); + bytes[index] = (byte)(value >> 56); + + return bytes; + } + + public static byte[] GetBytesLE(this ushort value) + { + var bytes = new byte[2]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index] = (byte)(value >> 8); + + return bytes; + } + + public static byte[] GetBytesLE(this uint value) + { + var bytes = new byte[4]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index] = (byte)(value >> 24); + + return bytes; + } + + public static byte[] GetBytesLE(this ulong value) + { + var bytes = new byte[8]; + var index = 0; + + bytes[index++] = (byte)value; + bytes[index++] = (byte)(value >> 8); + bytes[index++] = (byte)(value >> 16); + bytes[index++] = (byte)(value >> 24); + bytes[index++] = (byte)(value >> 32); + bytes[index++] = (byte)(value >> 40); + bytes[index++] = (byte)(value >> 48); + bytes[index] = (byte)(value >> 56); + + return bytes; + } + + public static sbyte ToSByteBE(this byte[] bytes, int start = 0) + { + var value = default(sbyte); + + value ^= (sbyte)(bytes[start++] << 8); + value ^= (sbyte)bytes[start]; + + return value; + } + + public static short ToInt16BE(this byte[] bytes, int start = 0) + { + var value = default(short); + + value ^= (short)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static int ToInt32BE(this byte[] bytes, int start = 0) + { + var value = default(int); + + value ^= bytes[start++] << 24; + value ^= bytes[start++] << 16; + value ^= bytes[start++] << 8; + value ^= bytes[start]; + + return value; + } + + public static long ToInt64BE(this byte[] bytes, int start = 0) + { + var value = default(long); + + value ^= bytes[start++] << 56; + value ^= bytes[start++] << 48; + value ^= bytes[start++] << 40; + value ^= bytes[start++] << 32; + value ^= bytes[start++] << 24; + value ^= bytes[start++] << 16; + value ^= bytes[start++] << 8; + value ^= bytes[start]; + + return value; + } + + public static ushort ToUInt16BE(this byte[] bytes, int start = 0) + { + var value = default(ushort); + + value ^= (ushort)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static uint ToUInt32BE(this byte[] bytes, int start = 0) + { + var value = default(uint); + + value ^= (uint)(bytes[start++] << 24); + value ^= (uint)(bytes[start++] << 16); + value ^= (uint)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static ulong ToUInt64BE(this byte[] bytes, int start = 0) + { + var value = default(ulong); + + value ^= (ulong)(bytes[start++] << 56); + value ^= (ulong)(bytes[start++] << 48); + value ^= (ulong)(bytes[start++] << 40); + value ^= (ulong)(bytes[start++] << 32); + value ^= (ulong)(bytes[start++] << 24); + value ^= (ulong)(bytes[start++] << 16); + value ^= (ulong)(bytes[start++] << 8); + value ^= bytes[start]; + + return value; + } + + public static sbyte ToSByteLE(this byte[] bytes, int start = 0) + { + var value = default(sbyte); + + value ^= (sbyte)bytes[start++]; + value ^= (sbyte)(bytes[start] << 8); + + return value; + } + + public static short ToInt16LE(this byte[] bytes, int start = 0) + { + var value = default(short); + + value ^= bytes[start++]; + value ^= (short)(bytes[start] << 8); + + return value; + } + + public static int ToInt32LE(this byte[] bytes, int start = 0) + { + var value = default(int); + + value ^= bytes[start++]; + value ^= bytes[start++] << 8; + value ^= bytes[start++] << 16; + value ^= bytes[start] << 24; + + return value; + } + + public static long ToInt64LE(this byte[] bytes, int start = 0) + { + var value = default(long); + + value ^= bytes[start++]; + value ^= bytes[start++] << 8; + value ^= bytes[start++] << 16; + value ^= bytes[start++] << 24; + value ^= bytes[start++] << 32; + value ^= bytes[start++] << 40; + value ^= bytes[start++] << 48; + value ^= bytes[start] << 56; + + return value; + } + + public static ushort ToUInt16LE(this byte[] bytes, int start = 0) + { + var value = default(ushort); + + value ^= bytes[start++]; + value ^= (ushort)(bytes[start] << 8); + + return value; + } + + public static ushort ToUIint16LEFromBits(this byte[] bits) + { + if (bits is null) + { + bits = new byte[UInt16Size]; + } + + Array.Resize(ref bits, UInt16Size); + + ushort value = 0; + + for (var i = 0; i < UInt16Size; i++) + { + value ^= (ushort)(bits[i] << i); + } + + return value; + } + + public static uint ToUInt32LE(this byte[] bytes, int start = 0) + { + var value = default(uint); + + value ^= bytes[start++]; + value ^= (uint)(bytes[start++] << 8); + value ^= (uint)(bytes[start++] << 16); + value ^= (uint)(bytes[start] << 24); + + return value; + } + + public static ulong ToUInt64LE(this byte[] bytes, int start = 0) + { + var value = default(ulong); + + value ^= bytes[start++]; + value ^= (ulong)(bytes[start++] << 8); + value ^= (ulong)(bytes[start++] << 16); + value ^= (ulong)(bytes[start++] << 24); + value ^= (ulong)(bytes[start++] << 32); + value ^= (ulong)(bytes[start++] << 40); + value ^= (ulong)(bytes[start++] << 48); + value ^= (ulong)(bytes[start] << 56); + + return value; + } + + public static ushort CRCCCITT(this byte[] bytes, int start = 0, int length = 0) + { + if (length == 0) + { + length = bytes.Length; + } + + var crc = (ushort)0xFFFF; + + for (var b = start; b < length; b++) + { + var _byte = bytes[b]; + var token = (ushort)((_byte << 8) & 0xFF00); + + for (var i = 0; i < 8; i++) + { + if (0x8000 == ((crc ^ token) & 0x8000)) + { + crc <<= 1; + crc ^= 0x1021; + } + else + { + crc <<= 1; + } + + token <<= 1; + } + } + + return crc; + } + + public static byte[] GetBytes(this string hexString) + { + var bytes = new List(); + + if (!string.IsNullOrWhiteSpace(hexString)) + { + // not needed, only valid hex bytes are processed // hexString = Regex.Replace(hexString, "[^a-fA-F0-9]*", string.Empty); + + var first = true; + var x = 0; + + foreach (var hex in hexString) + { + if ('0' <= hex && hex <= '9') + { + x += hex - '0'; + } + else if ('A' <= hex && hex <= 'F') + { + x += hex - 'A' + 10; + } + else if ('a' <= hex && hex <= 'f') + { + x = hex - 'a' + 10; + } + else + { + continue; + } + + if (first) + { + x *= 16; + } + else + { + bytes.Add((byte)x); + + x = 0; + } + + first = !first; + } + } + + return bytes.ToArray(); + } + + public static byte[] GetEncryptionKey(this string hexString, int requiredLength = 16) + { + var bytes = hexString.GetBytes(); + + if (bytes?.Length != requiredLength) + { + return default(byte[]); + } + + return bytes; + } + + public static uint GetAddress(this byte[] bytes, int index) + { + var value = default(uint); + var _index = index; + + value ^= (uint)(bytes[_index++] << 24); + value ^= (uint)(bytes[_index++] << 16); + value ^= (uint)(bytes[_index++] << 8); + value ^= bytes[_index]; + + return value; + } + + public static ushort GetCrc(this byte[] bytes, int index) + { + var value = default(ushort); + var _index = index; + + value ^= (ushort)(bytes[_index++] << 8); + value ^= bytes[_index]; + + return value; + } + + public static void SetAddress(this byte[] bytes, int index, uint address) + { + var _index = index; + + bytes[_index++] = (byte)(address >> 24); + bytes[_index++] = (byte)(address >> 16); + bytes[_index++] = (byte)(address >> 8); + bytes[_index] = (byte)address; + } + + public static void SetCrc(this byte[] bytes, int index, ushort crc) + { + var _index = index; + + bytes[_index++] = (byte)(crc >> 8); + bytes[_index] = (byte)crc; + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/LogContent.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/LogContent.cs new file mode 100644 index 00000000..9748bd7d --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/LogContent.cs @@ -0,0 +1,97 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public class LogContent + { + private readonly byte[] bits = new byte[16]; + + public LogContent(ushort value = 0) + => this.bits = value.GetBitsLE(); + + public bool ForwardCounter + { + get => this.bits[12] == 1; + set => this.bits[12] = (byte)(value ? 1 : 0); + } + + public bool TimeOfMinimumFlow + { + get => this.bits[11] == 1; + set => this.bits[11] = (byte)(value ? 1 : 0); + } + + public bool MinimumFlow + { + get => this.bits[10] == 1; + set => this.bits[10] = (byte)(value ? 1 : 0); + } + + public bool TimeOfBrokenPipe + { + get => this.bits[9] == 1; + set => this.bits[9] = (byte)(value ? 1 : 0); + } + + public bool BrokenPipeFlow + { + get => this.bits[8] == 1; + set => this.bits[8] = (byte)(value ? 1 : 0); + } + + public bool CurrentFlow + { + get => this.bits[7] == 1; + set => this.bits[7] = (byte)(value ? 1 : 0); + } + + public bool TimeOfPeakFlow + { + get => this.bits[6] == 1; + set => this.bits[6] = (byte)(value ? 1 : 0); + } + + public bool PeakFlow + { + get => this.bits[5] == 1; + set => this.bits[5] = (byte)(value ? 1 : 0); + } + + public bool TimeOfMaximumFlow + { + get => this.bits[4] == 1; + set => this.bits[4] = (byte)(value ? 1 : 0); + } + + public bool MaximumFlow + { + get => this.bits[3] == 1; + set => this.bits[3] = (byte)(value ? 1 : 0); + } + + public bool BackwardVolume + { + get => this.bits[2] == 1; + set => this.bits[2] = (byte)(value ? 1 : 0); + } + + public bool Counter + { + get => this.bits[1] == 1; + set => this.bits[1] = (byte)(value ? 1 : 0); + } + + public bool AlarmState + { + get => this.bits[0] == 1; + set => this.bits[0] = (byte)(value ? 1 : 0); + } + + public override string ToString() + => string.Join(string.Empty, this.bits); + + public static implicit operator LogContent(ushort value) + => new LogContent(value); + + public static implicit operator ushort(LogContent value) + => value.bits.ToUIint16LEFromBits(); + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/MeterTypes.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/MeterTypes.cs new file mode 100644 index 00000000..8c4d7484 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/MeterTypes.cs @@ -0,0 +1,11 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public enum MeterTypes : byte + { + Residential = 0, + CandI = 1, + Cordonel = 0x09, + Residential__0x0B = 11, + CandI__0x0C = 12, + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/PAMStatus.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/PAMStatus.cs new file mode 100644 index 00000000..4f452230 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/PAMStatus.cs @@ -0,0 +1,62 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public class PAMStatus + { + private readonly byte[] bits; + + public PAMStatus(byte _byte) + => this.bits = _byte.GetBitsLE(); + + public bool CMD_UNKNOWN => this.bits[0] == 1; + + public bool WRONG_AUTH => this.bits[1] == 1; + + public bool EXPIRED_AUTH => this.bits[2] == 1; + + public bool MIXED_TYPES => this.bits[3] == 1; + + public bool OUT_OF_RANGE => this.bits[4] == 1; + + public override string ToString() + { + if (this.bits.GetByteLE() == 0) + { + return nameof(OK); + } + if (this.OUT_OF_RANGE) + { + return nameof(this.OUT_OF_RANGE); + } + else if (this.MIXED_TYPES) + { + return nameof(this.MIXED_TYPES); + } + else if (this.CMD_UNKNOWN) + { + return nameof(this.CMD_UNKNOWN); + } + else if (this.EXPIRED_AUTH) + { + return nameof(this.EXPIRED_AUTH); + } + else if (this.WRONG_AUTH) + { + return nameof(this.WRONG_AUTH); + } + else + { + return string.Join(string.Empty, this.bits); + } + } + + public static byte OK = 0; + + public static byte EXPIREDAUTH = 4; + + public static implicit operator byte(PAMStatus status) + => status?.bits?.GetByteLE() ?? 0xFF; + + public static implicit operator string(PAMStatus status) + => status?.ToString(); + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/ChangeWakeUp.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/ChangeWakeUp.cs new file mode 100644 index 00000000..3fa9c0e3 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/ChangeWakeUp.cs @@ -0,0 +1,29 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams +{ + public class ChangeWakeUp + { + private ChangeWakeUp(WakeUpMode mode) => this.WakeUpMode = mode; + + public WakeUpMode WakeUpMode { get; } + + public static ChangeWakeUp GoSleepAutoOff => WakeUpMode.SleepAutoOff; + + public static ChangeWakeUp GoSleepAutoOn => WakeUpMode.SleepAutoOn; + + public static ChangeWakeUp StayAwake => WakeUpMode.StayAwake; + + public static implicit operator ChangeWakeUp(WakeUpMode mode) => new ChangeWakeUp(mode); + + public static implicit operator byte[] (ChangeWakeUp changeWakeUp) => new byte[] + { + 0x00, + (byte)changeWakeUp.WakeUpMode, + 0x43, + 0x02, + 0x14, + 0x0E, + 0x80, + 0x40 + }; + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/DummyPam.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/DummyPam.cs new file mode 100644 index 00000000..9e33b84c --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/DummyPam.cs @@ -0,0 +1,7 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams +{ + public class DummyPam + { + public static implicit operator byte[](DummyPam dummyPam) => new byte[0]; + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/ResetAlarms.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/ResetAlarms.cs new file mode 100644 index 00000000..b4d3e53a --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/ResetAlarms.cs @@ -0,0 +1,70 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams +{ + public class ResetAlarms + { + private readonly byte[] bits; + + public ResetAlarms(byte _byte = 0xFF) + => this.bits = _byte.GetBitsLE(); + + public bool SpecificError + { + get => this.bits[0] == 1; + set => this.bits[0] = (byte)(value ? 1 : 0); + } + + public bool MediumAbsent + { + get => this.bits[1] == 1; + set => this.bits[1] = (byte)(value ? 1 : 0); + } + + public bool BrokenPipe + { + get => this.bits[2] == 1; + set => this.bits[2] = (byte)(value ? 1 : 0); + } + + public bool Backflow + { + get => this.bits[3] == 1; + set => this.bits[3] = (byte)(value ? 1 : 0); + } + + public bool MetrologyUnavailable + { + get => this.bits[4] == 1; + set => this.bits[4] = (byte)(value ? 1 : 0); + } + + public bool MagneticTamper + { + get => this.bits[5] == 1; + set => this.bits[5] = (byte)(value ? 1 : 0); + } + + public bool Leak + { + get => this.bits[6] == 1; + set => this.bits[6] = (byte)(value ? 1 : 0); + } + + public bool LowBattery + { + get => this.bits[7] == 1; + set => this.bits[7] = (byte)(value ? 1 : 0); + } + + public static implicit operator byte[] (ResetAlarms resetAlarms) => new byte[] + { + 0x03, + resetAlarms.bits.GetByteLE(), + 0x43, + 0x01, + 0x14, + 0x30, + 0x68, + 0xD0 + }; + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/WakeUpMode.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/WakeUpMode.cs new file mode 100644 index 00000000..839fbed2 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/Pams/WakeUpMode.cs @@ -0,0 +1,12 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams +{ + public enum WakeUpMode : byte + { + /// Stay awake + StayAwake = 0x00, + /// Go to sleep with radio activate on by water flow. + SleepAutoOn = 0x03, + /// Go to sleep without radio activate on by water flow. + SleepAutoOff = 0x06 + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/RFTask.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/RFTask.cs new file mode 100644 index 00000000..5efb53ae --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/RFTask.cs @@ -0,0 +1,86 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using global::Common.Hardware.SIRT; + using global::Common.Hardware.SIRT.Tasks; + + using System; + using System.Collections.Generic; + + public class RFTask : WritePamTask + { + private readonly Stack messages = new Stack(); + + public SIRTMessage AKN { get; private set; } + + public SIRTMessage BUP { get; private set; } + + public SIRTMessage LAT { get; private set; } + + public SIRTMessage DEBUG { get; private set; } + + public SIRTMessage SEMI { get; private set; } + + public SIRTMessage LastOrDefault() + => this.messages.Count > 0 + ? this.messages.Peek() + : new SIRTMessage(); + + public override string ToString() + => BitConverter.ToString(this.request.Payload); + + protected override void OnMessageSent(SIRTMessage request) + => this.messages.Push(request); + + protected override void OnUnknownReceived(SIRTMessage unknown) + => this.messages.Push(unknown); + + protected override void OnAKNReceived(SIRTMessage akn) + { + this.AKN = akn; + + this.messages.Push(akn); + } + + protected override void OnBUPReceived(SIRTMessage bup) + { + this.BUP = bup; + + this.messages.Push(bup); + } + + protected override void OnLATReceived(SIRTMessage lat) + { + this.LAT = lat; + + this.messages.Push(lat); + } + + protected override void OnDEBUGReceived(SIRTMessage debug) + { + this.DEBUG = debug; + + this.messages.Push(debug); + } + + protected override void OnSEMIReceived(SIRTMessage semi) + { + this.SEMI = semi; + + this.messages.Push(semi); + + if (semi.Payload.Length > 11) + { + var pamStatus = new PAMStatus(semi.Payload[11]); + + if (pamStatus == PAMStatus.OK) + { + base.OnSEMIReceived(semi); + } + else + { + this.SetError(); + } + } + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/RSSI.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/RSSI.cs new file mode 100644 index 00000000..e5b337e0 --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/RSSI.cs @@ -0,0 +1,42 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + public class RSSI + { + public RSSI(byte value, int mhz) + { + this.Value = value; + + if (mhz == 433) + { + this.Dbm = value * 0.5 - 140; + this.Percent = value * 0.7333 - 57.6667; + } + else if (mhz == 868) + { + this.Dbm = value * 0.5 - 131.3; + this.Percent = value * 0.66 - 40.316; + } + + if (this.Percent > 100) + { + this.Percent = 100; + } + else if (this.Percent < 0) + { + this.Percent = 0; + } + } + + public byte Value { get; } + + public double Dbm { get; } + + public double Percent { get; } + + public override string ToString() => $"{this.Dbm}dBm ({this.Percent:0.0}%)"; + + public static implicit operator byte(RSSI rssi) => rssi?.Value ?? 0; + + public static implicit operator string(RSSI rssi) => rssi?.ToString(); + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/SEMI.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/SEMI.cs new file mode 100644 index 00000000..abf03f0c --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/SEMI.cs @@ -0,0 +1,176 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using Pams; + + using System; + using System.Text; + + /// + /// TODO: SEMI from the SirtDLL is not complete, + /// + public class SEMI + { + //public const int MIN_LENGTH = 120; + public const int MIN_LENGTH = 97; + + public SEMI(byte[] payload, int mhz) + { + this.AppCode = (AppCode)payload[0]; + this.Counter = payload[1]; + this.Address = payload.ToUInt32BE(2); + this.Reading = payload.ToInt32BE(6); + this.MainAlarmByte = new ResetAlarms(payload[10]); + this.PAMStatus = new PAMStatus(payload[11]); + this.RSSI = new RSSI(payload[12], mhz); + this.MeterType = (MeterTypes)payload[13]; + this.TransmissionInterval = payload.ToUInt16BE(14); + this.LATInterval = payload[16]; + this.ActualFlow = payload.ToUInt16BE(17); + this.BackwardVolume = payload.ToUInt32BE(19); + this.Units = (DisplayUnits)payload[23]; + this.MBusStatus = payload[24]; + this.MBusTransmissionInterval = payload.ToUInt16BE(25); + this.MainAlarmMask = new ResetAlarms(payload[27]); + this.LeakageDetectionParameters = payload[28]; + this.BrokenPipeDetectionParameters = payload[29]; + this.BatteryRemainingYears = payload.ToUInt16BE(30) / (4D * 365); + this.ReminingBatteryCapacity = payload[32]; + this.MaximumFlow = payload.ToUInt16BE(33); + this.TimeSinceMaximumFlow = payload.ToUInt16BE(35); + this.TimeSinceLowBattery = payload.ToUInt16BE(37); + this.AlarmLeakage = new Epoch20000101(payload.ToUInt32BE(39), DateTimeKind.Local); + this.AlarmAirInPipe = new Epoch20000101(payload.ToUInt32BE(43), DateTimeKind.Local); + this.AlarmReverseFlow = new Epoch20000101(payload.ToUInt32BE(47), DateTimeKind.Local); + this.AlarmBrokenPipe = new Epoch20000101(payload.ToUInt32BE(51), DateTimeKind.Local); + this.DataLogContent = payload.ToUInt16BE(55); + this.DataLoggingInterval = payload.ToUInt16BE(57); + this.FDRContent = payload.ToUInt16BE(59); + this.FDRDayOfMonth = payload[61]; + this.ActualDateTime = new Epoch20000101(payload.ToUInt32BE(62), DateTimeKind.Local); + this.HistoricalErrorDays = payload[66]; + this.CustomerSpecificText = Encoding.ASCII.GetString(payload, 67, 9); + this.TimeOfFDRReset = payload.ToUInt16BE(76); + this.TimeOfLogReset = payload.ToUInt16BE(78); + this.ActualPressure = payload.ToUInt16BE(80); + this.ActualTemperature = payload[82]; + this.PressureParameter = Encoding.ASCII.GetString(payload, 83, 7); + this.TemperatureParameter = payload.ToInt32BE(90); + this.PulseOutParameter = payload[94]; + this.AlarmByteExtended = payload[95]; + this.AlarmMaskExtended = payload[96]; + //this.AlarmMaxPressureTime = payload.ToUInt32BE(97); + //this.AlarmMinPressureTime = payload.ToUInt32BE(101); + //this.AlarmMaxTemperatureTime = payload.ToUInt32BE(105); + //this.AlarmMinTemperatureTime = payload.ToUInt32BE(109); + //this.LogContentPressureTemperature = payload.ToUInt16BE(113); + //this.FDRContentPressureTemperature = payload.ToUInt16BE(115); + //this.UnitExtraFlags = payload[117]; + //this.MeterSize = payload[118]; + //this.PressureCalibrationOffset = payload[119]; + } + + public AppCode AppCode { get; } + + public byte Counter { get; } + + public uint Address { get; } + + public int Reading { get; } + + public ResetAlarms MainAlarmByte { get; } + + public PAMStatus PAMStatus { get; } + + public RSSI RSSI { get; } + + public MeterTypes MeterType { get; } + + public ushort TransmissionInterval { get; } + + public byte LATInterval { get; } + + public ushort ActualFlow { get; } + + public uint BackwardVolume { get; } + + public DisplayUnits Units { get; } + + public byte MBusStatus { get; } + + public ushort MBusTransmissionInterval { get; } + + public ResetAlarms MainAlarmMask { get; } + + public byte LeakageDetectionParameters { get; } + + public byte BrokenPipeDetectionParameters { get; } + + public double BatteryRemainingYears { get; } + + public byte ReminingBatteryCapacity { get; } + + public ushort MaximumFlow { get; } + + public ushort TimeSinceMaximumFlow { get; } + + public ushort TimeSinceLowBattery { get; } + + public DateTime AlarmLeakage { get; } + + public DateTime AlarmAirInPipe { get; } + + public DateTime AlarmReverseFlow { get; } + + public DateTime AlarmBrokenPipe { get; } + + public LogContent DataLogContent { get; } + + public ushort DataLoggingInterval { get; } + + public LogContent FDRContent { get; } + + public byte FDRDayOfMonth { get; } + + public DateTime ActualDateTime { get; } + + public byte HistoricalErrorDays { get; } + + public string CustomerSpecificText { get; } + + public ushort TimeOfFDRReset { get; } + + public ushort TimeOfLogReset { get; } + + public ushort ActualPressure { get; } + + public byte ActualTemperature { get; } + + public string PressureParameter { get; } + + public int TemperatureParameter { get; } + + public byte PulseOutParameter { get; } + + public byte AlarmByteExtended { get; } + + public byte AlarmMaskExtended { get; } + + //public uint AlarmMaxPressureTime { get; } + + //public uint AlarmMinPressureTime { get; } + + //public uint AlarmMaxTemperatureTime { get; } + + //public uint AlarmMinTemperatureTime { get; } + + //public ushort LogContentPressureTemperature { get; } + + //public ushort FDRContentPressureTemperature { get; } + + //public byte UnitExtraFlags { get; } + + //public byte MeterSize { get; } + + //public byte PressureCalibrationOffset { get; } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/SIRTServer.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/SIRTServer.cs new file mode 100644 index 00000000..4ed5706b --- /dev/null +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/RFTelegrams/SIRTServer.cs @@ -0,0 +1,211 @@ +namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams +{ + using global::Common.Hardware.SIRT; + using global::Common.Hardware.SIRT.Tasks; + + using System; + + using Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.RFTelegrams.Pams; + + internal class SIRTServer + { + private static Action messageCallback; + private static Action errorMessageCallback; + private static readonly SIRTHub sirtHub = new SIRTHub(); + + /// + /// Connects SIRT's globaly for the application + /// + /// Action that receives info messages + /// Action that receives error messages + /// The COM-Ports to be connected + /// true - if all ports connected otherwise false + public static bool StartServer(Action messageHandler, Action errorMessageHandler, params int[] comPorts) + { + string sirtId; + int frequency; + bool succeeded = true; + + messageHandler?.Invoke(new string('-', 100)); + + foreach (var comport in comPorts) + { + succeeded = ConnectSIRT(comport, out sirtId, out frequency); + + if (succeeded) + { + messageHandler?.Invoke($"COM{comport}|{sirtId}|{frequency}MHz - connected"); + messageHandler?.Invoke(new string('-', 100)); + } + else + { + errorMessageHandler?.Invoke($"SIRT at COM{comport} not connected!"); + errorMessageHandler?.Invoke(new string('-', 100)); + + break; + } + } + + if (succeeded) + { + messageCallback = messageHandler; + errorMessageCallback = errorMessageHandler; + } + + return succeeded; + } + + /// + /// Executes: + /// 1. Dummy PAM -> Wake Up + /// 2. Reset Alarms + /// 3. Reset Extended Alarms + /// 4. TODO: Go Sleep Auto On ? + /// + /// 433/868 + /// The Radio address + /// The Encryption Key + /// Repeats count + /// + public static bool StartProgramming(int frequency, uint address, string encryptionKey, int repeatsCount = 3) + { + var succeeded = true; + var encryptionBytes = encryptionKey.GetBytes(); + + if (succeeded) + { + succeeded = SendPAM(task => + { + task.WakeUpCmd = true; + task.DelPamSemi = true; + task.WakeUpModul = true; + task.IsEncrypted = true; + task.Frequency = frequency; + task.RequestAddress = address; + task.EncryptionKey = encryptionBytes; + task.Data = new DummyPam(); + } + , repeatsCount); + } + + if (succeeded) + { + succeeded = SendPAM(task => + { + task.DelPamSemi = true; + task.IsEncrypted = true; + task.Frequency = frequency; + task.RequestAddress = address; + task.EncryptionKey = encryptionBytes; + task.Data = new ResetAlarms(0xFF); + } + , repeatsCount); + } + + if (succeeded) + { + succeeded = SendPAM(task => + { + task.DelPamSemi = true; + task.IsEncrypted = true; + task.Frequency = frequency; + task.RequestAddress = address; + task.EncryptionKey = encryptionBytes; + task.Data = new ResetAlarms(0xFE); + } + , repeatsCount); + } + + //TODO: enable for production ? + //if (succeeded) + //{ + // succeeded = SendPAM(task => + // { + // task.DelPamSemi = true; + // task.IsEncrypted = true; + // task.Frequency = frequency; + // task.RequestAddress = address; + // task.EncryptionKey = encryptionBytes; + // task.Data = ChangeWakeUp.GoSleepAutoOn; + // } + // , repeatsCount); + //} + + return succeeded; + } + + /// + /// Dispose all SIRT's globaly for the application. + /// + public static void Dispose() + { + void LogState(object state) => messageCallback?.Invoke(state?.ToString()); + + sirtHub.StateLogging += LogState; + sirtHub.Stop(); + sirtHub.StateLogging -= LogState; + + messageCallback = null; + errorMessageCallback = null; + } + + private static bool ConnectSIRT(int portno, out string sirtId, out int frequency) + => sirtHub.TryOpen($"COM{portno}", out sirtId, out frequency); + + private static bool SendPAM(Action taskOptions, int repeatsCount = 3) + { + void LogMessage(SIRTMessage message) => messageCallback?.Invoke(message.ToString()); + + var dashes = new string('-', 100); + var cordonelTask = new RFTask(); + var succeeded = false; + + taskOptions(cordonelTask); + + cordonelTask.MessageSent += LogMessage; + cordonelTask.MessageReceived += LogMessage; + + for (var i = 1; i <= repeatsCount && cordonelTask.State != SIRTTaskState.Completed && cordonelTask.State != SIRTTaskState.Cancelled; i++) + { + if (sirtHub.Start(cordonelTask)) + { + cordonelTask.Wait(); + } + } + + cordonelTask.MessageReceived -= LogMessage; + cordonelTask.MessageSent -= LogMessage; + + if (cordonelTask.State == SIRTTaskState.Completed) + { + succeeded = true; + + messageCallback?.Invoke($"{"CMD",20}: {cordonelTask}"); + messageCallback?.Invoke($"{"State",20}: {cordonelTask.State}"); + + var pam = new PAMStatus(cordonelTask.SEMI.Payload[11]); + messageCallback?.Invoke($"{"PAM Status",20}: {pam}"); + + var alarm = new AlarmMask(cordonelTask.SEMI.Payload[10]); + messageCallback?.Invoke(alarm.ToString()); + messageCallback?.Invoke(dashes); + } + else + { + succeeded = false; + + messageCallback?.Invoke($"{"CMD",20}: {cordonelTask}"); + messageCallback?.Invoke($"{"State",20}: {cordonelTask.State}"); + + var pam = new PAMStatus(cordonelTask.SEMI.Payload[11]); + messageCallback?.Invoke($"{"PAM Status",20}: {pam}"); + + var alarm = new AlarmMask(cordonelTask.SEMI.Payload[10]); + messageCallback?.Invoke(alarm.ToString()); + messageCallback?.Invoke(dashes); + } + + return succeeded; + } + } +} diff --git a/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj b/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj index 3007adac..061229c9 100644 --- a/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj +++ b/Common/Production/ProductionUiCordonel/ProductionUiCordonel.csproj @@ -15,6 +15,9 @@ 4 true false + + + C:\Users\drabesch_ro\Documents\cordonelProduction\ true Disk @@ -31,9 +34,6 @@ false true true - - - AnyCPU @@ -100,6 +100,31 @@ false + + true + bin\VPN_Debug\ + DEBUG;TRACE + true + true + full + AnyCPU + 7.0 + prompt + true + + + true + bin\x64\VPN_Debug\ + DEBUG;TRACE + true + true + full + x64 + 7.0 + prompt + MinimumRecommendedRules.ruleset + true + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll @@ -140,21 +165,13 @@ Properties\SharedAssemblyInfo.cs - - - - ctlMultiModeMarriage.xaml - - - ctlMultiModePicking.xaml - - - ctlMultiModePressure.xaml - + + + @@ -170,19 +187,11 @@ + + - - - - - - - - - - @@ -200,6 +209,22 @@ + + + + + + + + + + + + + + + + Resources.de.resx True @@ -229,18 +254,6 @@ UcPasswordFile.xaml - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - Designer MSBuild:Compile @@ -348,6 +361,10 @@ {1B02C79E-0B19-43E2-8F6B-71EF0C786C97} CommonCore + + {8DE8E742-EE0A-4004-AA49-3D08D748E5AC} + Common.Hardware.SIRT + {2E139F63-B6FE-4EA9-A098-85364FE9B26C} PortCore @@ -435,7 +452,7 @@ False - Microsoft .NET Framework 4.6 %28x86 and x64%29 + Microsoft .NET Framework 4.6 %28x86 und x64%29 true diff --git a/Common/Production/ProductionUiCordonel/ProductionWindow.xaml b/Common/Production/ProductionUiCordonel/ProductionWindow.xaml index 55b92026..e48305ac 100644 --- a/Common/Production/ProductionUiCordonel/ProductionWindow.xaml +++ b/Common/Production/ProductionUiCordonel/ProductionWindow.xaml @@ -105,25 +105,27 @@ -