Compare commits
247 Commits
c8a5a489f6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d97908a22b | ||
|
|
9400402141 | ||
|
|
59208674e0 | ||
|
|
aa73bf8129 | ||
|
|
aa1aae8c6c | ||
|
|
1671d3b456 | ||
|
|
a3543084b7 | ||
|
|
89e766714a | ||
|
|
fd96643412 | ||
|
|
1418b1077e | ||
|
|
53aa3e31ea | ||
|
|
076290e141 | ||
|
|
6284909fd8 | ||
|
|
68d84387b8 | ||
|
|
c0c8b325d0 | ||
|
|
2c6e326008 | ||
|
|
01098b4597 | ||
|
|
61f6be6093 | ||
|
|
d3a47432bb | ||
|
|
2c60eebda1 | ||
|
|
7c03df5229 | ||
|
|
c9b65ba883 | ||
|
|
a835ed626b | ||
|
|
79eca30267 | ||
|
|
87e3a7418a | ||
|
|
646449b4ba | ||
|
|
e8fae43c1d | ||
|
|
153eba219f | ||
|
|
b4baa218b4 | ||
|
|
b020ca2a73 | ||
|
|
ee590211f8 | ||
|
|
52f71be90b | ||
|
|
08c6ed210e | ||
|
|
2a8a1ff1a5 | ||
|
|
8778a976db | ||
|
|
e1f1320671 | ||
|
|
0af35e015a | ||
|
|
7d2f05a2f8 | ||
|
|
d6d87b2ec8 | ||
|
|
740858693e | ||
|
|
0375eac88d | ||
|
|
daf755949a | ||
|
|
92d95236c8 | ||
|
|
06dc6957ce | ||
|
|
5773b6d48e | ||
|
|
73e353b99e | ||
|
|
9d25ac394b | ||
|
|
74855b6467 | ||
|
|
728f65cd90 | ||
|
|
50301189d8 | ||
|
|
6d7125511c | ||
|
|
2c559d26b9 | ||
|
|
5c13a5c5e0 | ||
|
|
f0a64d9034 | ||
|
|
4bf3ddea5d | ||
|
|
b50ea3c97c | ||
|
|
8ae4adae0a | ||
|
|
56e6ef249d | ||
|
|
34d0054b01 | ||
|
|
85ec2e8559 | ||
|
|
e006ea75e4 | ||
|
|
0cc0400b05 | ||
|
|
b46d79e101 | ||
|
|
960e8cf76d | ||
|
|
f29ad3c5c4 | ||
|
|
766873da13 | ||
|
|
d9c7da60b5 | ||
|
|
bd02973b52 | ||
|
|
9cd22def78 | ||
|
|
47a386a3f7 | ||
|
|
7f61711e61 | ||
|
|
5b3d0f95c8 | ||
|
|
cc6df6ac2b | ||
|
|
a00d77133f | ||
|
|
fbee2526c5 | ||
|
|
44ee429ae6 | ||
|
|
315d2fd03a | ||
|
|
5f7ac10f22 | ||
|
|
53f457b020 | ||
|
|
bbe0f7ed64 | ||
|
|
2c5c923fc9 | ||
|
|
92e57da18c | ||
|
|
33eace9899 | ||
|
|
051ab35337 | ||
|
|
2e44442289 | ||
|
|
ee56086eff | ||
|
|
8e537fba1b | ||
|
|
ab9216cbc2 | ||
|
|
0ff210091a | ||
|
|
d60b020ad2 | ||
|
|
0fc26f7f01 | ||
|
|
a038303db3 | ||
|
|
1da26f5106 | ||
|
|
f56206d5c2 | ||
|
|
9e9875123d | ||
|
|
bf9a89f8c5 | ||
|
|
3af336a184 | ||
|
|
98538a3fba | ||
|
|
3d08edea71 | ||
|
|
b441c2d70a | ||
|
|
a717b356f0 | ||
|
|
798eee42e2 | ||
|
|
2be71a249a | ||
|
|
a8bb5bf67a | ||
|
|
2a2c1439b3 | ||
|
|
ede593da17 | ||
|
|
d1128f34c2 | ||
|
|
42e04898cf | ||
|
|
1871f67ec2 | ||
|
|
9573166217 | ||
|
|
005095401f | ||
|
|
9916304ce2 | ||
|
|
0eefa56149 | ||
|
|
9e34d572b7 | ||
|
|
cd4fd83d4c | ||
|
|
d541accb33 | ||
|
|
be4b3b184a | ||
|
|
c84d277f15 | ||
|
|
3913dd41e7 | ||
|
|
5c6775c6d4 | ||
|
|
5f4fa31c35 | ||
|
|
c93f57592f | ||
|
|
a761829216 | ||
|
|
b5d532f2a9 | ||
|
|
e72f365013 | ||
|
|
4ee2507055 | ||
|
|
9894ce831d | ||
|
|
75efa50256 | ||
|
|
a7f5406550 | ||
|
|
d00adfac4c | ||
|
|
19f9a4ed82 | ||
|
|
562cccc7d5 | ||
|
|
9668f8f3ac | ||
|
|
d756d36082 | ||
|
|
1eee458212 | ||
|
|
e3d81bc413 | ||
|
|
996a13013d | ||
|
|
5b90cee75b | ||
|
|
0d5e76b2af | ||
|
|
20b3ce8360 | ||
|
|
cc92f80a45 | ||
|
|
148896423f | ||
|
|
e30cc8470d | ||
|
|
0f39bd31f3 | ||
|
|
f63da8a968 | ||
|
|
5259eba6b5 | ||
|
|
ab14853d29 | ||
|
|
f280376752 | ||
|
|
34fc28a0d8 | ||
|
|
5bcea0ba3f | ||
|
|
6c93c0dcb7 | ||
|
|
a7a060f89c | ||
|
|
8060a595c8 | ||
|
|
96cc32dbee | ||
|
|
57101b4d8f | ||
|
|
7b05cbafa2 | ||
|
|
f4527e3eac | ||
|
|
454251898d | ||
|
|
963bba78a8 | ||
|
|
12c2618932 | ||
|
|
7512bafc43 | ||
|
|
2cd9fa1ef3 | ||
|
|
089c289019 | ||
|
|
f8004c3212 | ||
|
|
02870d5aa7 | ||
|
|
5d7dcd63da | ||
|
|
30f5f14ee7 | ||
|
|
d5089f189b | ||
|
|
e972222b91 | ||
|
|
2903ea8653 | ||
|
|
2de7ff5745 | ||
|
|
b7eae98821 | ||
|
|
b0b062788e | ||
|
|
b94b6773d5 | ||
|
|
b8e88aaafe | ||
|
|
44eb7c3ee7 | ||
|
|
c01b0dac8a | ||
|
|
b3517e90ea | ||
|
|
f38d8dd085 | ||
|
|
eb9f0e86d3 | ||
|
|
968e852f18 | ||
|
|
48e900b353 | ||
|
|
059e79924c | ||
|
|
73a13a249d | ||
|
|
04e74cea45 | ||
|
|
b6aef4b864 | ||
|
|
7c0383fa9f | ||
|
|
6344eaed34 | ||
|
|
e939613153 | ||
|
|
7529efa6d2 | ||
|
|
fefc90331d | ||
|
|
b71846e3c9 | ||
|
|
effa22abc9 | ||
|
|
bc86b4c00f | ||
|
|
cdc5ffb968 | ||
|
|
8f8f5343e9 | ||
|
|
a7fe049f15 | ||
|
|
56e16cf267 | ||
|
|
b2cdbf26f5 | ||
|
|
c909ce2cc1 | ||
|
|
444b58721f | ||
|
|
b877a1493e | ||
|
|
a5932bebef | ||
|
|
88e1fb82ef | ||
|
|
853c49969d | ||
|
|
a61195ca03 | ||
|
|
d359929042 | ||
|
|
f879055fee | ||
|
|
61d2563923 | ||
|
|
3f22ddceb1 | ||
|
|
4ca1cc1bd6 | ||
|
|
3332827fd5 | ||
|
|
4df6d9f2d6 | ||
|
|
7880d5bced | ||
|
|
8a8e8c8481 | ||
|
|
908bd883fe | ||
|
|
53e4faf307 | ||
|
|
a0199cc0f8 | ||
|
|
f641690f38 | ||
|
|
96d01f00f5 | ||
|
|
86949443bb | ||
|
|
fd25473dee | ||
|
|
a69ba30600 | ||
|
|
4648ac01fe | ||
|
|
f9fcca2902 | ||
|
|
7fcb3cc5c6 | ||
|
|
325ad27bf6 | ||
|
|
e987a410d1 | ||
|
|
13d591ada3 | ||
|
|
88b2e3524e | ||
|
|
e3ebc951fb | ||
|
|
8e7cf287f5 | ||
|
|
2bd45cf43f | ||
|
|
2caffc6adf | ||
|
|
e7fe1de33e | ||
|
|
d1d1640a31 | ||
|
|
267e6cfaa3 | ||
|
|
8967740d67 | ||
|
|
9a2def05a2 | ||
|
|
7ee31cc894 | ||
|
|
0a615f0f03 | ||
|
|
e2ba2c065d | ||
|
|
8b2319fe81 | ||
|
|
1cd0195fe7 | ||
|
|
5d09d95f90 | ||
|
|
b731d24880 | ||
|
|
8a2317f816 |
@@ -8,13 +8,19 @@ EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Debug|x64.Build.0 = Debug|x64
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Release|x64.ActiveCfg = Release|x64
|
||||
{AAB88B46-4AAC-4BE6-8847-E7E4C37AEB6D}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -16,6 +16,21 @@
|
||||
<TargetFrameworkProfile />
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@@ -36,7 +51,35 @@
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.4.7.2\lib\net45\NLog.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="OpenCvSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6adad1e807fea099, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\OpenCvSharp4.4.3.0.20200524\lib\net461\OpenCvSharp.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -47,17 +90,28 @@
|
||||
<HintPath>..\packages\OpenCvSharp4.4.3.0.20200524\lib\net461\OpenCvSharp.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Formatting, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
<Reference Include="System.Transactions" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
@@ -69,10 +123,21 @@
|
||||
<Compile Include="AIParkingApplicationForm.Designer.cs">
|
||||
<DependentUpon>AIParkingApplicationForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="ApiController.cs" />
|
||||
<Compile Include="AppConstant.cs" />
|
||||
<Compile Include="C3DeviceController.cs" />
|
||||
<Compile Include="Camera.cs" />
|
||||
<Compile Include="Lane.cs" />
|
||||
<Compile Include="ConfigurationForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ConfigurationForm.Designer.cs">
|
||||
<DependentUpon>ConfigurationForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="EngineApiController.cs" />
|
||||
<Compile Include="Enums.cs" />
|
||||
<Compile Include="ExtensitionMethods.cs" />
|
||||
<Compile Include="IDoorControlAccess.cs" />
|
||||
<Compile Include="ILane.cs" />
|
||||
<Compile Include="LaneIn.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
@@ -85,19 +150,51 @@
|
||||
<Compile Include="LaneOut.Designer.cs">
|
||||
<DependentUpon>LaneOut.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="LoginForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="LoginForm.Designer.cs">
|
||||
<DependentUpon>LoginForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="PlateDetector.cs" />
|
||||
<Compile Include="PlateProcessor.cs" />
|
||||
<Compile Include="Printer.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Sidebar.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Sidebar.Designer.cs">
|
||||
<DependentUpon>Sidebar.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Statistic.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Statistic.Designer.cs">
|
||||
<DependentUpon>Statistic.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="StatusBar.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="StatusBar.Designer.cs">
|
||||
<DependentUpon>StatusBar.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Util.cs" />
|
||||
<EmbeddedResource Include="AIParkingApplicationForm.resx">
|
||||
<DependentUpon>AIParkingApplicationForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ConfigurationForm.resx">
|
||||
<DependentUpon>ConfigurationForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="LaneIn.resx">
|
||||
<DependentUpon>LaneIn.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="LaneOut.resx">
|
||||
<DependentUpon>LaneOut.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="LoginForm.resx">
|
||||
<DependentUpon>LoginForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
@@ -108,6 +205,24 @@
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Sidebar.resx">
|
||||
<DependentUpon>Sidebar.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Statistic.resx">
|
||||
<DependentUpon>Statistic.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="StatusBar.resx">
|
||||
<DependentUpon>StatusBar.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<None Include="engine.bat">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<Content Include="NLog.config">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<None Include="NLog.xsd">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
@@ -123,12 +238,33 @@
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Images\ApplicationLogo.ico">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Images\CantConnectCamera.jpg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="plate.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="plateLong.xml">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="PrinterForm.html">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
|
||||
@@ -28,21 +28,104 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AIParkingApplicationForm));
|
||||
this.menuStrip = new System.Windows.Forms.MenuStrip();
|
||||
this.toolStripMenuItemSwitchLane = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItemSwitchLaneInIn = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItemSwitchLaneInOut = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItemSwitchLaneOutOut = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItemSwitchLaneOutIn = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.setupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.menuStrip.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// menuStrip
|
||||
//
|
||||
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripMenuItemSwitchLane,
|
||||
this.setupToolStripMenuItem});
|
||||
this.menuStrip.Location = new System.Drawing.Point(0, 0);
|
||||
this.menuStrip.Name = "menuStrip";
|
||||
this.menuStrip.Size = new System.Drawing.Size(1366, 24);
|
||||
this.menuStrip.TabIndex = 0;
|
||||
this.menuStrip.Text = "menuStrip1";
|
||||
//
|
||||
// toolStripMenuItemSwitchLane
|
||||
//
|
||||
this.toolStripMenuItemSwitchLane.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripMenuItemSwitchLaneInIn,
|
||||
this.toolStripMenuItemSwitchLaneInOut,
|
||||
this.toolStripMenuItemSwitchLaneOutOut,
|
||||
this.toolStripMenuItemSwitchLaneOutIn});
|
||||
this.toolStripMenuItemSwitchLane.Name = "toolStripMenuItemSwitchLane";
|
||||
this.toolStripMenuItemSwitchLane.Size = new System.Drawing.Size(59, 20);
|
||||
this.toolStripMenuItemSwitchLane.Text = "Đảo làn";
|
||||
//
|
||||
// toolStripMenuItemSwitchLaneInIn
|
||||
//
|
||||
this.toolStripMenuItemSwitchLaneInIn.Name = "toolStripMenuItemSwitchLaneInIn";
|
||||
this.toolStripMenuItemSwitchLaneInIn.Size = new System.Drawing.Size(180, 22);
|
||||
this.toolStripMenuItemSwitchLaneInIn.Text = "Vào - Vào";
|
||||
this.toolStripMenuItemSwitchLaneInIn.Click += new System.EventHandler(this.toolStripMenuItemSwitchLaneInIn_Click);
|
||||
//
|
||||
// toolStripMenuItemSwitchLaneInOut
|
||||
//
|
||||
this.toolStripMenuItemSwitchLaneInOut.Name = "toolStripMenuItemSwitchLaneInOut";
|
||||
this.toolStripMenuItemSwitchLaneInOut.Size = new System.Drawing.Size(180, 22);
|
||||
this.toolStripMenuItemSwitchLaneInOut.Text = "Vào - Ra";
|
||||
this.toolStripMenuItemSwitchLaneInOut.Click += new System.EventHandler(this.toolStripMenuItemSwitchLaneInOut_Click);
|
||||
//
|
||||
// toolStripMenuItemSwitchLaneOutOut
|
||||
//
|
||||
this.toolStripMenuItemSwitchLaneOutOut.Name = "toolStripMenuItemSwitchLaneOutOut";
|
||||
this.toolStripMenuItemSwitchLaneOutOut.Size = new System.Drawing.Size(180, 22);
|
||||
this.toolStripMenuItemSwitchLaneOutOut.Text = "Ra - Ra";
|
||||
this.toolStripMenuItemSwitchLaneOutOut.Click += new System.EventHandler(this.toolStripMenuItemSwitchLaneOutOut_Click);
|
||||
//
|
||||
// toolStripMenuItemSwitchLaneOutIn
|
||||
//
|
||||
this.toolStripMenuItemSwitchLaneOutIn.Name = "toolStripMenuItemSwitchLaneOutIn";
|
||||
this.toolStripMenuItemSwitchLaneOutIn.Size = new System.Drawing.Size(180, 22);
|
||||
this.toolStripMenuItemSwitchLaneOutIn.Text = "Ra - Vào";
|
||||
this.toolStripMenuItemSwitchLaneOutIn.Click += new System.EventHandler(this.toolStripMenuItemSwitchLaneOutIn_Click);
|
||||
//
|
||||
// setupToolStripMenuItem
|
||||
//
|
||||
this.setupToolStripMenuItem.Name = "setupToolStripMenuItem";
|
||||
this.setupToolStripMenuItem.Size = new System.Drawing.Size(56, 20);
|
||||
this.setupToolStripMenuItem.Text = "Cài đặt";
|
||||
this.setupToolStripMenuItem.Click += new System.EventHandler(this.setupToolStripMenuItem_Click);
|
||||
//
|
||||
// AIParkingApplicationForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(1350, 729);
|
||||
this.MinimumSize = new System.Drawing.Size(1366, 768);
|
||||
this.ClientSize = new System.Drawing.Size(1366, 737);
|
||||
this.Controls.Add(this.menuStrip);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.MainMenuStrip = this.menuStrip;
|
||||
this.MinimumSize = new System.Drawing.Size(1382, 776);
|
||||
this.Name = "AIParkingApplicationForm";
|
||||
this.Text = "AIParking Application";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "AIParking - Phần mềm quản lý bãi đỗ xe";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AIParkingApplicationForm_FormClosing);
|
||||
this.Load += new System.EventHandler(this.AIParkingApplicationForm_Load);
|
||||
this.menuStrip.ResumeLayout(false);
|
||||
this.menuStrip.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.MenuStrip menuStrip;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSwitchLane;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSwitchLaneInIn;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSwitchLaneInOut;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSwitchLaneOutOut;
|
||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemSwitchLaneOutIn;
|
||||
private System.Windows.Forms.ToolStripMenuItem setupToolStripMenuItem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,128 +1,312 @@
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Extensions;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Configuration;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class AIParkingApplicationForm : Form
|
||||
{
|
||||
private Camera camera;
|
||||
public AIParkingApplicationForm()
|
||||
private ApiController apiController;
|
||||
private IDoorControlAccess c3Device;
|
||||
private LaneIn laneIn12;
|
||||
private LaneIn laneIn56;
|
||||
private LaneOut laneOut34;
|
||||
private LaneOut laneOut78;
|
||||
private StatusBar statusBar;
|
||||
private Sidebar sidebar;
|
||||
private Config configOnWeb;
|
||||
private EngineApiController engineApiController;
|
||||
private string doorAccessControlDeviceIP;
|
||||
private Logger appLogger;
|
||||
|
||||
public AIParkingApplicationForm(ApiController apiController, string serverIPAddress, Config configOnWeb, Logger appLogger)
|
||||
{
|
||||
InitializeComponent();
|
||||
this.apiController = apiController;
|
||||
this.configOnWeb = configOnWeb;
|
||||
this.appLogger = appLogger;
|
||||
|
||||
string url = @"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"; // @"C:\HS_test.mp4"; // @"rtsp://admin:admin@192.168.2.10"
|
||||
camera = new Camera(url);
|
||||
camera.OnVideoFrameReceived += Camera_OnVideoFrameReceived;
|
||||
camera.Startcapture();
|
||||
//Thread thread1 = new Thread(ShowFrame);
|
||||
//thread1.IsBackground = true;
|
||||
//thread1.Start();
|
||||
//CaptureFrame();
|
||||
LaneIn laneIn = new LaneIn();
|
||||
LaneOut laneOut = new LaneOut();
|
||||
this.Controls.Add(laneIn);
|
||||
laneOut.Location = new System.Drawing.Point(550, 0);
|
||||
this.Controls.Add(laneOut);
|
||||
}
|
||||
|
||||
private void Camera_OnVideoFrameReceived(Mat videoFrame)
|
||||
ReadAccessControlDeviceIPConfigurationFile();
|
||||
if (string.IsNullOrEmpty(doorAccessControlDeviceIP) || !Util.IsValidIPAddress(doorAccessControlDeviceIP))
|
||||
{
|
||||
//pictureBox1.Invoke(new Action(() =>
|
||||
//{
|
||||
// pictureBox1.Image?.Dispose();
|
||||
// pictureBox1.Width = videoFrame.Width;
|
||||
// pictureBox1.Height = videoFrame.Height;
|
||||
// pictureBox1.Image = videoFrame.ToBitmap();
|
||||
//}));
|
||||
appLogger.Log(LogLevel.Error, "Kiểm tra lại cấu hình IP thiết bị mở cửa!");
|
||||
MessageBox.Show("Kiểm tra lại cấu hình IP thiết bị mở cửa! (C3200)", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
//public void ShowFrame()
|
||||
//{
|
||||
// while (true)
|
||||
// {
|
||||
// Thread.Sleep(1);
|
||||
// if (camera.VideoFrames.Count == 0)
|
||||
// {
|
||||
// continue;
|
||||
// }
|
||||
// Mat videoFrame = camera.VideoFrames.Dequeue();
|
||||
// pictureBox1.Invoke(new Action(() =>
|
||||
// {
|
||||
// pictureBox1.Image?.Dispose();
|
||||
// pictureBox1.Width = videoFrame.Width;
|
||||
// pictureBox1.Height = videoFrame.Height;
|
||||
// pictureBox1.Image = videoFrame.ToBitmap();
|
||||
// }));
|
||||
// }
|
||||
//}
|
||||
c3Device = new C3DeviceController(appLogger, doorAccessControlDeviceIP);
|
||||
sidebar = new Sidebar(apiController)
|
||||
{
|
||||
Location = new Point(0, 0)
|
||||
};
|
||||
Controls.Add(sidebar);
|
||||
|
||||
//public void CaptureFrame()
|
||||
//{
|
||||
// Thread thread = new Thread(new ThreadStart(() =>
|
||||
// {
|
||||
// Mat frame1 = new Mat();
|
||||
// Mat frame2 = new Mat();
|
||||
// Mat frame3 = new Mat();
|
||||
// Mat frame4 = new Mat();
|
||||
// VideoCapture capture1 = new VideoCapture();
|
||||
// VideoCapture capture2 = new VideoCapture();
|
||||
// VideoCapture capture3 = new VideoCapture();
|
||||
// VideoCapture capture4 = new VideoCapture();
|
||||
// capture1.Open(@"C:\HS_test.mp4");
|
||||
// capture2.Open(@"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov");
|
||||
// capture3.Open(@"C:\HS_test.mp4");
|
||||
// capture4.Open(@"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov");
|
||||
statusBar = new StatusBar(serverIPAddress, doorAccessControlDeviceIP)
|
||||
{
|
||||
Location = new Point(0, sidebar.Location.Y + sidebar.Height + 26),
|
||||
Anchor = AnchorStyles.Bottom | AnchorStyles.Left
|
||||
};
|
||||
Controls.Add(statusBar);
|
||||
|
||||
// while (true)
|
||||
// {
|
||||
// Thread.Sleep(TimeSpan.FromMilliseconds(1));
|
||||
// try
|
||||
// {
|
||||
// capture1.Read(frame1);
|
||||
// capture2.Read(frame2);
|
||||
// capture3.Read(frame3);
|
||||
// capture4.Read(frame4);
|
||||
// pictureBox1.Image?.Dispose();
|
||||
// var image1 = frame1.ToBitmap();
|
||||
// pictureBox1.Invoke(new Action(() =>
|
||||
// {
|
||||
// pictureBox1.Image = image1;
|
||||
// }));
|
||||
try
|
||||
{
|
||||
engineApiController = new EngineApiController($"http://{this.configOnWeb.APIPath.ApiPlateRecognize.IP}:{this.configOnWeb.APIPath.ApiPlateRecognize.Port}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
appLogger.Log(LogLevel.Error, $"Cấu hình URL của Engine nhận diện biển số lỗi. exMessage: {ex.Message}");
|
||||
MessageBox.Show("Cấu hình API Plate Recognize lỗi!", "Cấu hình API Engine lỗi!", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
return;
|
||||
}
|
||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
||||
Application.ThreadException += Application_ThreadException;
|
||||
}
|
||||
|
||||
// pictureBox2.Image?.Dispose();
|
||||
// var image2 = frame2.ToBitmap();
|
||||
// pictureBox2.Invoke(new Action(() =>
|
||||
// {
|
||||
// pictureBox2.Image = image2;
|
||||
// }));
|
||||
private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
|
||||
{
|
||||
appLogger.Log(LogLevel.Error, $"Application.ThreadException. ex:{e.Exception.Message}");
|
||||
}
|
||||
|
||||
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||
{
|
||||
appLogger.Log(LogLevel.Error, $"AppDomain.CurrentDomain.UnhandledException. ex:{(e.ExceptionObject as Exception).Message}");
|
||||
}
|
||||
|
||||
// pictureBox3.Image?.Dispose();
|
||||
// var image3 = frame3.ToBitmap();
|
||||
// pictureBox3.Invoke(new Action(() =>
|
||||
// {
|
||||
// pictureBox3.Image = image3;
|
||||
// }));
|
||||
private void InitAllLanes()
|
||||
{
|
||||
laneIn12 = new LaneIn(10, configOnWeb.CameraData1.Id.ToString(), configOnWeb.CameraData1.StreamUrl, configOnWeb.CameraData2.StreamUrl, c3Device, apiController, engineApiController, appLogger, configOnWeb.CameraData1.Roi_config, true, false, true);
|
||||
laneIn12.BorderStyle = BorderStyle.FixedSingle;
|
||||
laneIn12.Hide();
|
||||
Controls.Add(laneIn12);
|
||||
|
||||
laneOut34 = new LaneOut(20, configOnWeb.CameraData3.Id.ToString(), configOnWeb.CameraData3.StreamUrl, configOnWeb.CameraData4.StreamUrl, c3Device, apiController, engineApiController, appLogger, configOnWeb.CameraData3.Roi_config, true, false, true);
|
||||
laneOut34.BorderStyle = BorderStyle.FixedSingle;
|
||||
laneOut34.Hide();
|
||||
Controls.Add(laneOut34);
|
||||
|
||||
// pictureBox4.Image?.Dispose();
|
||||
// var image4 = frame4.ToBitmap();
|
||||
// pictureBox4.Invoke(new Action(() =>
|
||||
// {
|
||||
// pictureBox4.Image = image4;
|
||||
// }));
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine("Error: " + ex.Message);
|
||||
// }
|
||||
// }
|
||||
// }));
|
||||
// thread.IsBackground = true;
|
||||
// thread.Start();
|
||||
//}
|
||||
laneIn56 = new LaneIn(10, configOnWeb.CameraData5.Id.ToString(), configOnWeb.CameraData5.StreamUrl, configOnWeb.CameraData6.StreamUrl, c3Device, apiController, engineApiController, appLogger, configOnWeb.CameraData5.Roi_config, true, false, true);
|
||||
laneIn56.BorderStyle = BorderStyle.FixedSingle;
|
||||
laneIn56.Hide();
|
||||
Controls.Add(laneIn56);
|
||||
|
||||
laneOut78 = new LaneOut(20, configOnWeb.CameraData7.Id.ToString(), configOnWeb.CameraData7.StreamUrl, configOnWeb.CameraData8.StreamUrl, c3Device, apiController, engineApiController, appLogger, configOnWeb.CameraData7.Roi_config, true, false, true);
|
||||
laneOut78.BorderStyle = BorderStyle.FixedSingle;
|
||||
laneOut78.Hide();
|
||||
Controls.Add(laneOut78);
|
||||
}
|
||||
|
||||
private void UpdateLaneInOut()
|
||||
{
|
||||
laneIn12.DoorId = 1;
|
||||
laneIn12.Location = new Point(sidebar.Location.X + sidebar.Width + 20, menuStrip.Height);
|
||||
laneIn12.Show();
|
||||
laneIn12.Start();
|
||||
|
||||
laneOut34.DoorId = 2;
|
||||
laneOut34.Location = new Point(laneIn12.Location.X + laneIn12.Width + 20, menuStrip.Height);
|
||||
laneOut34.Show();
|
||||
laneOut34.Start();
|
||||
}
|
||||
|
||||
private void UpdateLaneInIn()
|
||||
{
|
||||
laneIn12.DoorId = 1;
|
||||
laneIn12.Location = new Point(sidebar.Location.X + sidebar.Width + 20, menuStrip.Height);
|
||||
laneIn12.Show();
|
||||
laneIn12.Start();
|
||||
|
||||
laneIn56.DoorId = 2;
|
||||
laneIn56.Location = new Point(laneIn12.Location.X + laneIn12.Width + 20, menuStrip.Height);
|
||||
laneIn56.Show();
|
||||
laneIn56.Start();
|
||||
}
|
||||
|
||||
private void UpdateLaneOutIn()
|
||||
{
|
||||
laneOut78.DoorId = 1;
|
||||
laneOut78.Location = new Point(sidebar.Location.X + sidebar.Width + 20, menuStrip.Height);
|
||||
laneOut78.Show();
|
||||
laneOut78.Start();
|
||||
|
||||
laneIn56.DoorId = 2;
|
||||
laneIn56.Location = new Point(laneOut78.Location.X + laneOut78.Width + 20, menuStrip.Height);
|
||||
laneIn56.Show();
|
||||
laneIn56.Start();
|
||||
}
|
||||
|
||||
private void UpdateLaneOutOut()
|
||||
{
|
||||
laneOut78.DoorId = 1;
|
||||
laneOut78.Location = new Point(sidebar.Location.X + sidebar.Width + 20, menuStrip.Height);
|
||||
laneOut78.Show();
|
||||
laneOut78.Start();
|
||||
|
||||
laneOut34.DoorId = 2;
|
||||
laneOut34.Location = new Point(laneOut78.Location.X + laneOut78.Width + 20, menuStrip.Height);
|
||||
laneOut34.Show();
|
||||
laneOut34.Start();
|
||||
}
|
||||
|
||||
private void toolStripMenuItemSwitchLaneInIn_Click(object sender, EventArgs e)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.CURRENT_LANE_SETTING, "IN-IN");
|
||||
UpdateMenuStripItemStatus(sender as ToolStripMenuItem);
|
||||
StopAllLanes();
|
||||
UpdateLaneInIn();
|
||||
appLogger.Log(LogLevel.Info, "Chuyển làn: IN-IN");
|
||||
}
|
||||
|
||||
private void toolStripMenuItemSwitchLaneInOut_Click(object sender, EventArgs e)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.CURRENT_LANE_SETTING, "IN-OUT");
|
||||
UpdateMenuStripItemStatus(sender as ToolStripMenuItem);
|
||||
StopAllLanes();
|
||||
UpdateLaneInOut();
|
||||
appLogger.Log(LogLevel.Info, "Chuyển làn: IN-OUT");
|
||||
}
|
||||
|
||||
private void toolStripMenuItemSwitchLaneOutIn_Click(object sender, EventArgs e)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.CURRENT_LANE_SETTING, "OUT-IN");
|
||||
UpdateMenuStripItemStatus(sender as ToolStripMenuItem);
|
||||
StopAllLanes();
|
||||
UpdateLaneOutIn();
|
||||
appLogger.Log(LogLevel.Info, "Chuyển làn: OUT-IN");
|
||||
}
|
||||
|
||||
private void toolStripMenuItemSwitchLaneOutOut_Click(object sender, EventArgs e)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.CURRENT_LANE_SETTING, "OUT-OUT");
|
||||
UpdateMenuStripItemStatus(sender as ToolStripMenuItem);
|
||||
StopAllLanes();
|
||||
UpdateLaneOutOut();
|
||||
appLogger.Log(LogLevel.Info, "Chuyển làn: OUT-OUT");
|
||||
}
|
||||
|
||||
private void UpdateMenuStripItemStatus(ToolStripMenuItem selectedToolStripMenuItem)
|
||||
{
|
||||
if (selectedToolStripMenuItem != null)
|
||||
{
|
||||
((ToolStripMenuItem)selectedToolStripMenuItem.OwnerItem).DropDownItems
|
||||
.OfType<ToolStripMenuItem>().ToList()
|
||||
.ForEach(item =>
|
||||
{
|
||||
item.Checked = false;
|
||||
item.Enabled = true;
|
||||
});
|
||||
|
||||
selectedToolStripMenuItem.Checked = true;
|
||||
selectedToolStripMenuItem.Enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void StopAllLanes()
|
||||
{
|
||||
laneIn12.DoorId = 10;
|
||||
laneIn56.DoorId = 10;
|
||||
laneOut34.DoorId = 10;
|
||||
laneOut78.DoorId = 10;
|
||||
|
||||
laneIn12?.Stop();
|
||||
laneIn56?.Stop();
|
||||
laneOut34?.Stop();
|
||||
laneOut78?.Stop();
|
||||
|
||||
laneIn12?.Hide();
|
||||
laneIn56?.Hide();
|
||||
laneOut34?.Hide();
|
||||
laneOut78?.Hide();
|
||||
}
|
||||
|
||||
private void InitLaneFirstTime()
|
||||
{
|
||||
try
|
||||
{
|
||||
string lanesConfig = ConfigurationManager.AppSettings[AppConstant.CURRENT_LANE_SETTING];
|
||||
if (!string.IsNullOrEmpty(lanesConfig))
|
||||
{
|
||||
string[] lanes = lanesConfig.Split('-');
|
||||
if (lanes.Length == 2)
|
||||
{
|
||||
string lane0 = lanes[0].ToLower();
|
||||
string lane1 = lanes[1].ToLower();
|
||||
if (lane0 == "in" && lane1 == "in")
|
||||
{
|
||||
UpdateLaneInIn();
|
||||
toolStripMenuItemSwitchLaneInIn.DisableSelected();
|
||||
appLogger.Log(LogLevel.Info, $"Khởi động App sử dụng lane: IN-IN");
|
||||
}
|
||||
if (lane0 == "in" && lane1 == "out")
|
||||
{
|
||||
UpdateLaneInOut();
|
||||
toolStripMenuItemSwitchLaneInOut.DisableSelected();
|
||||
appLogger.Log(LogLevel.Info, $"Khởi động App sử dụng lane: IN-OUT");
|
||||
}
|
||||
if (lane0 == "out" && lane1 == "in")
|
||||
{
|
||||
UpdateLaneOutIn();
|
||||
toolStripMenuItemSwitchLaneOutIn.DisableSelected();
|
||||
appLogger.Log(LogLevel.Info, $"Khởi động App sử dụng lane: OUT-IN");
|
||||
}
|
||||
if (lane0 == "out" && lane1 == "out")
|
||||
{
|
||||
UpdateLaneOutOut();
|
||||
toolStripMenuItemSwitchLaneOutOut.DisableSelected();
|
||||
appLogger.Log(LogLevel.Info, $"Khởi động App sử dụng lane: OUT-OUT");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.CURRENT_LANE_SETTING, "IN-OUT");
|
||||
UpdateLaneInOut();
|
||||
toolStripMenuItemSwitchLaneInOut.DisableSelected();
|
||||
appLogger.Log(LogLevel.Info, $"Khởi động App đọc config không đủ 2 param: IN-OUT");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.CURRENT_LANE_SETTING, "IN-OUT");
|
||||
UpdateLaneInOut();
|
||||
toolStripMenuItemSwitchLaneInOut.DisableSelected();
|
||||
Console.WriteLine($"{DateTime.Now.GetTimeFormatted()}\tReadLaneSettingFromConfigurationFile\t{ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, $"Đọc config làn lỗi khi khởi động app!\texMessage: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void ReadAccessControlDeviceIPConfigurationFile()
|
||||
{
|
||||
try
|
||||
{
|
||||
doorAccessControlDeviceIP = ConfigurationManager.AppSettings[AppConstant.DOOR_ACCESS_DEVICE_CONTROL_IP].Trim();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
doorAccessControlDeviceIP = string.Empty;
|
||||
Console.WriteLine($"{DateTime.Now.GetTimeFormatted()}\tReadAccessControlDeviceIPConfiguration\t{ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, $"Cấu hình IP thiết bị mở cửa lỗi({AppConstant.DOOR_ACCESS_DEVICE_CONTROL_IP})!\texMessage: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void AIParkingApplicationForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
InitAllLanes();
|
||||
InitLaneFirstTime();
|
||||
}
|
||||
|
||||
private void AIParkingApplicationForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
appLogger.Log(LogLevel.Info, $"Đóng ứng dụng");
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
private void setupToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
var configurationForm = new ConfigurationForm(appLogger);
|
||||
configurationForm.ShowDialog(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,5 @@
|
||||
{
|
||||
public bool HasError { get; set; }
|
||||
public string Message { get; set; }
|
||||
public object Data { get; set; }
|
||||
}
|
||||
}
|
||||
553
AIParkingApplication/ApiController.cs
Normal file
553
AIParkingApplication/ApiController.cs
Normal file
@@ -0,0 +1,553 @@
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using OpenCvSharp;
|
||||
using Newtonsoft.Json;
|
||||
using System.Net;
|
||||
using NLog;
|
||||
using System.Drawing;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public class ApiController : IDisposable
|
||||
{
|
||||
private HttpClient httpClient;
|
||||
private bool isHttpClientDisposabled;
|
||||
private int numberOfRetry;
|
||||
private Logger appLogger;
|
||||
|
||||
public ApiController(string serverIPAddress, Logger appLogger, int numberOfRetry = 3)
|
||||
{
|
||||
this.appLogger = appLogger;
|
||||
httpClient = new HttpClient
|
||||
{
|
||||
BaseAddress = new Uri($"http://{serverIPAddress}"),
|
||||
Timeout = TimeSpan.FromSeconds(5)
|
||||
};
|
||||
isHttpClientDisposabled = false;
|
||||
this.numberOfRetry = numberOfRetry;
|
||||
}
|
||||
|
||||
~ApiController()
|
||||
{
|
||||
Dispose();
|
||||
}
|
||||
|
||||
public async Task<LoginDataModel> Login(LoginModel loginData)
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpResponseMessage response = await httpClient.PostAsJsonAsync("/api/login", loginData);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var loginResult = await response.Content.ReadAsAsync<LoginDataModel>();
|
||||
return loginResult;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Login Exception:\t{DateTime.Now.GetTimeFormatted()} \t {ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, $"Login lỗi. exMessage: {ex.Message}");
|
||||
return new LoginDataModel
|
||||
{
|
||||
IsLoginSuccess = false,
|
||||
Exception = ex
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<Statistic.ParkInfo> GetStatisticInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpResponseMessage response = await httpClient.GetAsync("/api/statistics");
|
||||
response.EnsureSuccessStatusCode();
|
||||
Statistic.ParkInfo parkingInfo = await response.Content.ReadAsAsync<Statistic.ParkInfo>();
|
||||
|
||||
if (string.IsNullOrEmpty(parkingInfo.TotalIn))
|
||||
{
|
||||
parkingInfo.TotalIn = "0";
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(parkingInfo.TotalOut))
|
||||
{
|
||||
parkingInfo.TotalOut = "0";
|
||||
}
|
||||
return parkingInfo;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"GetStatisticInfo Exception:\t{DateTime.Now.GetTimeFormatted()} \t {ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, $"Query dữ liệu thống kê bãi xe lỗi. exMessage: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<CardInformation> GetCardInformation(string cardNumber)
|
||||
{
|
||||
int requestCounter = 1;
|
||||
try
|
||||
{
|
||||
HttpResponseMessage response;
|
||||
do
|
||||
{
|
||||
response = await httpClient.PostAsJsonAsync("/api/check-card", new CardModel { CardNumber = cardNumber });
|
||||
response.EnsureSuccessStatusCode();
|
||||
requestCounter += 1;
|
||||
await Task.Delay(800);
|
||||
}
|
||||
while (response.StatusCode != HttpStatusCode.OK && requestCounter < numberOfRetry);
|
||||
|
||||
var cardValication = await response.Content.ReadAsAsync<CardInformation>();
|
||||
return cardValication;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"CheckCard Exception:\t{DateTime.Now.GetTimeFormatted()} \t {ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, $"Query thông tin thẻ lỗi. Thẻ số: {cardNumber} | số lần thử lại: {requestCounter} | exMessage: {ex.Message}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<SaveLogRespone> SaveLog(LaneDirection direction, string cardID, string cameraID, PlateType plateType, string timestamp, string plateString, Mat plateImage, Mat plateImageResult, Mat plateFrameImage, Mat frameImage, string logID = "")
|
||||
{
|
||||
string plateImageBase64 = Convert.ToBase64String(plateImage.ToBytes());
|
||||
string plateImageResultBase64 = Convert.ToBase64String(plateImageResult.ToBytes());
|
||||
string plateFrameImageBase64 = Convert.ToBase64String(plateFrameImage.ToBytes());
|
||||
string frameImageBase64 = Convert.ToBase64String(frameImage.ToBytes());
|
||||
|
||||
int requestCounter = 1;
|
||||
try
|
||||
{
|
||||
var request = new SaveLogModel
|
||||
{
|
||||
Direction = direction == LaneDirection.In ? "in" : "out",
|
||||
LogID = logID,
|
||||
CardID = cardID,
|
||||
TextPlate = plateString,
|
||||
CameraID = cameraID,
|
||||
ModePlate = plateType == PlateType.Square ? "1" : "0",
|
||||
Timestamp = timestamp,
|
||||
PlateImage = plateImageBase64,
|
||||
PlateResultImage = plateImageResultBase64,
|
||||
PlateFrameImage = plateFrameImageBase64,
|
||||
FrameImage = frameImageBase64
|
||||
};
|
||||
HttpResponseMessage response;
|
||||
|
||||
do
|
||||
{
|
||||
response = await httpClient.PostAsJsonAsync("/api/save-logs", request);
|
||||
response.EnsureSuccessStatusCode();
|
||||
requestCounter += 1;
|
||||
await Task.Delay(800);
|
||||
} while (response.StatusCode != HttpStatusCode.OK && requestCounter < numberOfRetry);
|
||||
SaveLogRespone saveLogRespone = await response.Content.ReadAsAsync<SaveLogRespone>();
|
||||
return saveLogRespone;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"SaveLog Exception:\t{DateTime.Now.GetTimeFormatted()} \t {ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, string.Format("Không thể lưu log gửi xe. Làn: {0} | Mã thẻ: {1} | cameraID: {2} | Thời gian: {3} | Biển số: {4} | LogID: {5} | exMessage: ", direction == LaneDirection.In ? "IN" : "OUT", cardID, cameraID, timestamp, plateString, logID, ex.Message));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async void SaveRoiToServer(Rectangle roiRegion, string cameraId)
|
||||
{
|
||||
int requestCounter = 1;
|
||||
try
|
||||
{
|
||||
var request = new RoiConfig
|
||||
{
|
||||
CameraID = cameraId,
|
||||
X = roiRegion.X,
|
||||
Y = roiRegion.Y,
|
||||
Width = roiRegion.Width,
|
||||
Height = roiRegion.Height
|
||||
};
|
||||
HttpResponseMessage response;
|
||||
|
||||
do
|
||||
{
|
||||
response = await httpClient.PostAsJsonAsync("/api/update-roi", request);
|
||||
response.EnsureSuccessStatusCode();
|
||||
requestCounter += 1;
|
||||
} while (response.StatusCode != HttpStatusCode.OK && requestCounter < numberOfRetry);
|
||||
SaveLogRespone saveLogRespone = await response.Content.ReadAsAsync<SaveLogRespone>();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"SaveRoiConfig Exception:\t{DateTime.Now.GetTimeFormatted()} \t {ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, string.Format("Không thể lưu ROI Config | exMessage: " + ex.Message));
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (httpClient != null && !isHttpClientDisposabled)
|
||||
{
|
||||
isHttpClientDisposabled = true;
|
||||
httpClient.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#region Check card validation API Data Model
|
||||
public class CardModel
|
||||
{
|
||||
[JsonProperty("card")]
|
||||
public string CardNumber { get; set; }
|
||||
}
|
||||
|
||||
public class CardInformation
|
||||
{
|
||||
[JsonProperty("status")]
|
||||
public bool IsValid { get; set; }
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string Direction { get; set; }
|
||||
|
||||
[JsonProperty("cardID")]
|
||||
public string CardId { get; set; }
|
||||
|
||||
[JsonProperty("cardRealID")]
|
||||
public int CardRealID { get; set; }
|
||||
|
||||
[JsonProperty("log_id")]
|
||||
public int LogID { get; set; }
|
||||
|
||||
[JsonProperty("cardType")]
|
||||
public string CardType { get; set; }
|
||||
|
||||
[JsonProperty("vehicleType")]
|
||||
public string VehicleType { get; set; }
|
||||
|
||||
[JsonProperty("autoOpen")]
|
||||
public bool AutoOpenDoor { get; set; }
|
||||
|
||||
[JsonProperty("plate")]
|
||||
public string PlateString { get; set; }
|
||||
|
||||
[JsonProperty("time")]
|
||||
public string TimeIn { get; set; }
|
||||
|
||||
[JsonProperty("plateImage")]
|
||||
public string PlateImageBase64 { get; set; }
|
||||
|
||||
[JsonProperty("frameImage")]
|
||||
public string FrameImageBase64 { get; set; }
|
||||
|
||||
[JsonProperty("faceImage")]
|
||||
public string FaceImageBase64 { get; set; }
|
||||
|
||||
[JsonProperty("name")]
|
||||
public string CustomerName { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Save Log API Data Model
|
||||
public class SaveLogRespone
|
||||
{
|
||||
[JsonProperty("status")]
|
||||
public bool Status { get; set; }
|
||||
|
||||
[JsonProperty("logID")]
|
||||
public int LogID { get; set; }
|
||||
|
||||
[JsonProperty("cost")]
|
||||
public string Cost { get; set; }
|
||||
}
|
||||
|
||||
public class SaveLogModel
|
||||
{
|
||||
[JsonProperty("card")]
|
||||
public string CardID { get; set; }
|
||||
|
||||
[JsonProperty("plate")]
|
||||
public string TextPlate { get; set; }
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string Direction { get; set; }
|
||||
|
||||
[JsonProperty("mod")]
|
||||
public string ModePlate { get; set; }
|
||||
|
||||
[JsonProperty("log_id")]
|
||||
public string LogID { get; set; }
|
||||
|
||||
[JsonProperty("camera")]
|
||||
public string CameraID { get; set; }
|
||||
|
||||
[JsonProperty("time")]
|
||||
public string Timestamp { get; set; }
|
||||
|
||||
[JsonProperty("plateImage")]
|
||||
public string PlateImage { get; set; }
|
||||
|
||||
[JsonProperty("plateResultImage")]
|
||||
public string PlateResultImage { get; set; }
|
||||
|
||||
[JsonProperty("plateFrameImage")]
|
||||
public string PlateFrameImage { get; set; }
|
||||
|
||||
[JsonProperty("frameImage")]
|
||||
public string FrameImage { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Get Config API Data Model
|
||||
public class LoginModel
|
||||
{
|
||||
[JsonProperty("username")]
|
||||
public string Username { get; set; }
|
||||
|
||||
[JsonProperty("password")]
|
||||
public string Password { get; set; }
|
||||
}
|
||||
|
||||
public class LoginDataModel
|
||||
{
|
||||
[JsonProperty("status")]
|
||||
public bool IsLoginSuccess { get; set; }
|
||||
|
||||
[JsonProperty("data")]
|
||||
public Config LoginData { get; set; }
|
||||
|
||||
public Exception Exception { get; set; }
|
||||
}
|
||||
|
||||
public class Config
|
||||
{
|
||||
[JsonProperty("userID")]
|
||||
public int UserID { get; set; }
|
||||
|
||||
[JsonProperty("name")]
|
||||
public string UserName { get; set; }
|
||||
|
||||
[JsonProperty("configROI")]
|
||||
public bool IsConfigROI { get; set; }
|
||||
|
||||
[JsonProperty("configSystemLogs")]
|
||||
public bool IsSaveSystemLogs { get; set; }
|
||||
|
||||
[JsonProperty("api")]
|
||||
public APIPathModel APIPath { get; set; }
|
||||
|
||||
[JsonProperty("camera1")]
|
||||
public CameraData CameraData1 { get; set; }
|
||||
|
||||
[JsonProperty("camera2")]
|
||||
public CameraData CameraData2 { get; set; }
|
||||
|
||||
[JsonProperty("camera3")]
|
||||
public CameraData CameraData3 { get; set; }
|
||||
|
||||
[JsonProperty("camera4")]
|
||||
public CameraData CameraData4 { get; set; }
|
||||
|
||||
[JsonProperty("camera5")]
|
||||
public CameraData CameraData5 { get; set; }
|
||||
|
||||
[JsonProperty("camera6")]
|
||||
public CameraData CameraData6 { get; set; }
|
||||
|
||||
[JsonProperty("camera7")]
|
||||
public CameraData CameraData7 { get; set; }
|
||||
|
||||
[JsonProperty("camera8")]
|
||||
public CameraData CameraData8 { get; set; }
|
||||
|
||||
[JsonProperty("statistic")]
|
||||
public Statistics StatisticsData { get; set; }
|
||||
|
||||
[JsonProperty("cascadeConfig")]
|
||||
public CascadeConfig CascadeConfigData { get; set; }
|
||||
|
||||
[JsonProperty("laneConfig")]
|
||||
public LaneConfig LaneConfigData { get; set; }
|
||||
}
|
||||
|
||||
#region API Path
|
||||
public class APIPathModel
|
||||
{
|
||||
[JsonProperty("apiStatistics")]
|
||||
public APIProperties ApiStatistics { get; set; }
|
||||
|
||||
[JsonProperty("apiPlateRecognize")]
|
||||
public APIProperties ApiPlateRecognize { get; set; }
|
||||
|
||||
[JsonProperty("apiCheckCard")]
|
||||
public APIProperties ApiCheckCard { get; set; }
|
||||
|
||||
[JsonProperty("apiSaveLogs")]
|
||||
public APIProperties ApiSaveLogs { get; set; }
|
||||
|
||||
[JsonProperty("apiUpdateLogs")]
|
||||
public APIProperties ApiUpdateLogs { get; set; }
|
||||
}
|
||||
|
||||
public class APIProperties
|
||||
{
|
||||
[JsonProperty("ip")]
|
||||
public string IP { get; set; }
|
||||
|
||||
[JsonProperty("port")]
|
||||
public string Port { get; set; }
|
||||
|
||||
[JsonProperty("path")]
|
||||
public string Path { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
public class CameraData
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[JsonProperty("gate")]
|
||||
public int Gate { get; set; }
|
||||
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[JsonProperty("stream_url")]
|
||||
public string StreamUrl { get; set; }
|
||||
|
||||
[JsonProperty("minWidth")]
|
||||
public double MinWidth { get; set; }
|
||||
|
||||
[JsonProperty("maxWidth")]
|
||||
public double MaxWidth { get; set; }
|
||||
|
||||
[JsonProperty("minHeight")]
|
||||
public double MinHeight { get; set; }
|
||||
|
||||
[JsonProperty("maxHeight")]
|
||||
public double MaxHeight { get; set; }
|
||||
|
||||
[JsonProperty("scaleFactor")]
|
||||
public double ScaleFactor { get; set; }
|
||||
|
||||
[JsonProperty("minNeighbors")]
|
||||
public double MinNeighbors { get; set; }
|
||||
|
||||
[JsonProperty("status")]
|
||||
public double Status { get; set; }
|
||||
|
||||
[JsonProperty("isRecognizeCamera")]
|
||||
public bool IsRecognizeCamera { get; set; }
|
||||
|
||||
[JsonProperty("isLongPlate")]
|
||||
public bool IsLongPlate { get; set; }
|
||||
|
||||
[JsonProperty("stt")]
|
||||
public int Stt { get; set; }
|
||||
|
||||
[JsonProperty("roi_config")]
|
||||
public string Roi_config { get; set; }
|
||||
|
||||
[JsonProperty("created_at")]
|
||||
public int Created_at { get; set; }
|
||||
|
||||
[JsonProperty("modified_at")]
|
||||
public int Modified_at { get; set; }
|
||||
}
|
||||
|
||||
public class Statistics
|
||||
{
|
||||
[JsonProperty("moto")]
|
||||
public string Moto { get; set; }
|
||||
|
||||
[JsonProperty("oto")]
|
||||
public string Oto { get; set; }
|
||||
|
||||
[JsonProperty("vip")]
|
||||
public string Vip { get; set; }
|
||||
|
||||
[JsonProperty("total_in")]
|
||||
public string Total_in { get; set; }
|
||||
|
||||
[JsonProperty("total_out")]
|
||||
public string Total_out { get; set; }
|
||||
}
|
||||
|
||||
public class CascadeConfig
|
||||
{
|
||||
[JsonProperty("minWidthPlate")]
|
||||
public int MinWidthPlate { get; set; }
|
||||
|
||||
[JsonProperty("maxWidthPlate")]
|
||||
public int MaxWidthPlate { get; set; }
|
||||
|
||||
[JsonProperty("minHeightPlate")]
|
||||
public int MinHeightPlate { get; set; }
|
||||
|
||||
[JsonProperty("maxHeightPlate")]
|
||||
public int MaxHeightPlate { get; set; }
|
||||
|
||||
[JsonProperty("minWidthLongPlate")]
|
||||
public int MinWidthLongPlate { get; set; }
|
||||
|
||||
[JsonProperty("maxWidthLongPlate")]
|
||||
public int MaxWidthLongPlate { get; set; }
|
||||
|
||||
[JsonProperty("minHeightLongPlate")]
|
||||
public int MinHeightLongPlate { get; set; }
|
||||
|
||||
[JsonProperty("maxHeightLongPlate")]
|
||||
public int MaxHeightLongPlate { get; set; }
|
||||
|
||||
[JsonProperty("scaleFactor")]
|
||||
public double ScaleFactor { get; set; }
|
||||
|
||||
[JsonProperty("scaleFactorLong")]
|
||||
public double ScaleFactorLong { get; set; }
|
||||
|
||||
[JsonProperty("minNeighbors")]
|
||||
public double MinNeighbors { get; set; }
|
||||
|
||||
[JsonProperty("minNeighborsLong")]
|
||||
public double MinNeighborsLong { get; set; }
|
||||
|
||||
[JsonProperty("timeOut")]
|
||||
public int TimeOut { get; set; }
|
||||
|
||||
[JsonProperty("logs")]
|
||||
public int Logs { get; set; }
|
||||
}
|
||||
|
||||
|
||||
#region LaneConfig
|
||||
public class LaneConfig
|
||||
{
|
||||
[JsonProperty("laneConfig")]
|
||||
public LaneConfigPosision Posision { get; set; }
|
||||
}
|
||||
|
||||
public class LaneConfigPosision
|
||||
{
|
||||
[JsonProperty("left")]
|
||||
public LaneConfigParam LeftLane { get; set; }
|
||||
|
||||
[JsonProperty("right")]
|
||||
public LaneConfigParam RightLane { get; set; }
|
||||
}
|
||||
|
||||
public class LaneConfigParam
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
public string LaneName { get; set; }
|
||||
|
||||
[JsonProperty("default")]
|
||||
public string DefaultLane { get; set; }
|
||||
|
||||
[JsonProperty("longPlate")]
|
||||
public bool IsLongPlate { get; set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,6 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="DOOR_ACCESS_DEVICE_CONTROL_IP" value="192.168.1.200" />
|
||||
<add key="DEFAULT_USERNAME" value="cong1vao" />
|
||||
<add key="DEFAULT_PASSWORD" value="123456a@" />
|
||||
<add key="DEFAULT_WEB_SERVER" value="192.168.1.122:80" />
|
||||
<add key="CURRENT_LANE_SETTING" value="IN-OUT" />
|
||||
<add key="AUTO_LOGIN" value="false" />
|
||||
<add key="USE_PRINTER" value="false" />
|
||||
<add key="AUTO_OPEN_DOOR_1" value="true" />
|
||||
<add key="AUTO_OPEN_DOOR_2" value="true" />
|
||||
<add key="ALLOW_CHANGE_ROI_RECT" value="true" />
|
||||
<add key="AUTO_RUN_AT_STARTUP" value="false" />
|
||||
</appSettings>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
|
||||
</startup>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
||||
@@ -2,10 +2,29 @@
|
||||
{
|
||||
public static class AppConstant
|
||||
{
|
||||
#region Application Messages
|
||||
public const string APPLICATION_IS_RUNNNING = "AIParkingApplication: Ứng dụng đã chạy!";
|
||||
public const string ERROR_TITLE = "Lỗi";
|
||||
public const string DATETIME_FORMAT = "HH:mm:ss dd/MM/yyyy";
|
||||
|
||||
public const string CAMERA_FAILED_IMAGE_PATH = @".\Images\CantConnectCamera.jpg";
|
||||
public const string DEFAULT_LOGO_IMAGE = @".\Images\ApplicationLogo.ico";
|
||||
|
||||
public const string APPLICATION_LOGGER_NAME = "ApplicationLogger";
|
||||
public const string PING_SERVER_LOGGER_NAME = "PingServerLogger";
|
||||
public const string PING_DOOR_DEVICE_CONTROL_ACCESS_LOGGER_NAME = "PingDoorDeviceControlAccessLogger";
|
||||
|
||||
#region App Config Key
|
||||
public const string DOOR_ACCESS_DEVICE_CONTROL_IP = "DOOR_ACCESS_DEVICE_CONTROL_IP";
|
||||
public const string DEFAULT_USERNAME = "DEFAULT_USERNAME";
|
||||
public const string DEFAULT_PASSWORD = "DEFAULT_PASSWORD";
|
||||
public const string DEFAULT_WEB_SERVER = "DEFAULT_WEB_SERVER";
|
||||
public const string CURRENT_LANE_SETTING = "CURRENT_LANE_SETTING";
|
||||
public const string AUTO_LOGIN = "AUTO_LOGIN";
|
||||
public const string USE_PRINTER = "USE_PRINTER";
|
||||
public const string AUTO_OPEN_DOOR_1 = "AUTO_OPEN_DOOR_1";
|
||||
public const string AUTO_OPEN_DOOR_2 = "AUTO_OPEN_DOOR_2";
|
||||
public const string ALLOW_CHANGE_ROI_RECT = "ALLOW_CHANGE_ROI_RECT";
|
||||
public const string AUTO_RUN_AT_STARTUP = "AUTO_RUN_AT_STARTUP";
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +1,34 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public delegate void C3EventHandler(ActionResult actionResult);
|
||||
public delegate void C3RTLogEventHandler(ActionResult actionResult, int doorId, string cardNumber);
|
||||
public delegate void C3DeviceEvent(int doorId, string cardNumber);
|
||||
|
||||
public class C3DeviceController
|
||||
public class C3DeviceController : IDoorControlAccess
|
||||
{
|
||||
public string IPAddress { get; }
|
||||
private string ipAddress;
|
||||
private int port;
|
||||
private IntPtr oneTimeConnectedParamHandler;
|
||||
private string connectionString;
|
||||
private bool isReconnected;
|
||||
public event C3EventHandler OnConnected;
|
||||
public event C3EventHandler OnConnectFailed;
|
||||
public event C3EventHandler OnReconnect;
|
||||
public event C3EventHandler OnDoorOpenned;
|
||||
public event C3EventHandler OnDoorOpenFailed;
|
||||
public event C3EventHandler OnPingFailed;
|
||||
public event C3EventHandler OnDisconnected;
|
||||
public event C3RTLogEventHandler OnGetRTLog;
|
||||
public event C3EventHandler OnGetRTLogFailed;
|
||||
private int reconnectCounter;
|
||||
private Logger appLogger;
|
||||
|
||||
public C3DeviceController(string ipAddress, int port = C3Constant.DEFAULT_C3_PORT)
|
||||
public event C3DeviceEvent OnNewCardReceived;
|
||||
|
||||
public C3DeviceController(Logger appLogger, string ipAddress, int port = C3Constant.DEFAULT_C3_PORT)
|
||||
{
|
||||
IPAddress = ipAddress;
|
||||
this.ipAddress = ipAddress;
|
||||
this.port = port;
|
||||
connectionString = $"protocol=TCP,ipaddress={this.IPAddress},port={this.port},timeout=2000,passwd=";
|
||||
connectionString = $"protocol=TCP,ipaddress={this.ipAddress},port={this.port},timeout=2000,passwd=";
|
||||
oneTimeConnectedParamHandler = IntPtr.Zero;
|
||||
isReconnected = true;
|
||||
reconnectCounter = 0;
|
||||
this.appLogger = appLogger;
|
||||
}
|
||||
|
||||
~C3DeviceController()
|
||||
@@ -57,7 +53,7 @@ namespace AIParkingApplication
|
||||
|
||||
public ActionResult Connect()
|
||||
{
|
||||
if (Util.IsPingable(IPAddress))
|
||||
if (Util.IsPingable(ipAddress, out long replyTime))
|
||||
{
|
||||
oneTimeConnectedParamHandler = Connect(connectionString);
|
||||
if (oneTimeConnectedParamHandler != IntPtr.Zero)
|
||||
@@ -65,9 +61,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = false,
|
||||
Message = string.Format(C3Constant.CONNECTED_SUCCESSFULLY, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.CONNECTED_SUCCESSFULLY, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnConnected?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
@@ -75,9 +70,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.FAILED_TO_CONNECT, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress, PullLastError())
|
||||
Message = string.Format(C3Constant.FAILED_TO_CONNECT, DateTime.Now.GetTimeFormatted(), ipAddress, PullLastError())
|
||||
};
|
||||
OnConnectFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -86,10 +80,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.FAILED_TO_PING, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.FAILED_TO_PING, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnPingFailed?.Invoke(result);
|
||||
OnConnectFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -104,9 +96,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = false,
|
||||
Message = string.Format(C3Constant.OPENNED_DOOR_SUCCESSFULLY, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.OPENNED_DOOR_SUCCESSFULLY, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnDoorOpenned?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
@@ -114,9 +105,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.FAILED_TO_OPEN_DOOR, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.FAILED_TO_OPEN_DOOR, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnDoorOpenFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -125,27 +115,38 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.NOT_CONNECTTED, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.NOT_CONNECTTED, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnDoorOpenFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public ActionResult GetRTLog(out int doorId, out string cardNumber)
|
||||
public async Task GetLogToReceiveNewCard()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
ActionResult getRTLogResult = GetRTLog(out int doorId, out string cardNumber);
|
||||
if (doorId != C3Constant.DEFAULT_DOOR_ID && cardNumber != C3Constant.DEFAULT_CARD_NUMBER)
|
||||
{
|
||||
OnNewCardReceived?.Invoke(doorId, cardNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ActionResult GetRTLog(out int doorId, out string cardNumber)
|
||||
{
|
||||
doorId = C3Constant.DEFAULT_DOOR_ID;
|
||||
cardNumber = C3Constant.DEFAULT_CARD_NUMBER;
|
||||
|
||||
if (!Util.IsPingable(IPAddress))
|
||||
if (!Util.IsPingable(ipAddress, out long replyTime))
|
||||
{
|
||||
isReconnected = false;
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.FAILED_TO_PING, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.FAILED_TO_PING, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnPingFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -167,7 +168,6 @@ namespace AIParkingApplication
|
||||
{
|
||||
HasError = false
|
||||
};
|
||||
OnGetRTLog?.Invoke(result, doorId, cardNumber);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
@@ -180,18 +180,16 @@ namespace AIParkingApplication
|
||||
{
|
||||
isReconnected = true;
|
||||
reconnectCounter = 0;
|
||||
reconnectResult.Message = string.Format(C3Constant.RECONNECTED_SUCCESSFULLY, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress);
|
||||
reconnectResult.Message = string.Format(C3Constant.RECONNECTED_SUCCESSFULLY, DateTime.Now.GetTimeFormatted(), ipAddress);
|
||||
}
|
||||
OnReconnect?.Invoke(reconnectResult);
|
||||
return reconnectResult;
|
||||
}
|
||||
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.FAILED_TO_READ_LOG, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.FAILED_TO_READ_LOG, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnGetRTLogFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -202,9 +200,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = true,
|
||||
Message = string.Format(C3Constant.WRONG_FORMAT_DATA, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress, ex.Message)
|
||||
Message = string.Format(C3Constant.WRONG_FORMAT_DATA, DateTime.Now.GetTimeFormatted(), ipAddress, ex.Message)
|
||||
};
|
||||
OnGetRTLogFailed?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -216,9 +213,8 @@ namespace AIParkingApplication
|
||||
var result = new ActionResult
|
||||
{
|
||||
HasError = false,
|
||||
Message = string.Format(C3Constant.DISCONNECTED_SUCCESSFULLY, DateTime.Now.ToString(AppConstant.DATETIME_FORMAT), IPAddress)
|
||||
Message = string.Format(C3Constant.DISCONNECTED_SUCCESSFULLY, DateTime.Now.GetTimeFormatted(), ipAddress)
|
||||
};
|
||||
OnDisconnected?.Invoke(result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,32 +1,45 @@
|
||||
using OpenCvSharp;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public delegate void CameraEvent(Mat videoFrame);
|
||||
|
||||
public class Camera
|
||||
{
|
||||
private string streamUrl;
|
||||
private bool isCapturing;
|
||||
private object lockSyncObject;
|
||||
private volatile bool isFrameRequested;
|
||||
private Thread readStreamThread;
|
||||
private VideoCapture videoCapture;
|
||||
public volatile Mat CurrentFrame;
|
||||
|
||||
public event CameraEvent OnVideoFrameReceived;
|
||||
public event CameraEvent OnOneVideoFrameRequested;
|
||||
public event CameraEvent OnOpenVideoStreamFailed;
|
||||
|
||||
public Camera(string streamUrl)
|
||||
{
|
||||
this.streamUrl = streamUrl;
|
||||
this.isCapturing = true;
|
||||
this.isFrameRequested = false;
|
||||
lockSyncObject = new object();
|
||||
isFrameRequested = false;
|
||||
videoCapture = new VideoCapture();
|
||||
readStreamThread = new Thread(new ThreadStart(ReadVideoStream));
|
||||
readStreamThread.IsBackground = true;
|
||||
}
|
||||
|
||||
public void Startcapture()
|
||||
~Camera()
|
||||
{
|
||||
Thread readVideoStreamThread = new Thread(new ThreadStart(ReadVideoStream));
|
||||
readVideoStreamThread.IsBackground = true;
|
||||
readVideoStreamThread.Start();
|
||||
Stop();
|
||||
videoCapture?.Dispose();
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (!readStreamThread.IsAlive)
|
||||
{
|
||||
readStreamThread = new Thread(new ThreadStart(ReadVideoStream));
|
||||
readStreamThread.IsBackground = true;
|
||||
readStreamThread.Start();
|
||||
}
|
||||
}
|
||||
|
||||
public void RequestCaptureOneFrame()
|
||||
@@ -36,39 +49,40 @@ namespace AIParkingApplication
|
||||
|
||||
public void ReadVideoStream()
|
||||
{
|
||||
VideoCapture videoCapture = new VideoCapture();
|
||||
Mat videoFrame = new Mat();
|
||||
if (!videoCapture.Open(streamUrl))
|
||||
{
|
||||
OnOpenVideoStreamFailed?.Invoke(Cv2.ImRead(Application.StartupPath + AppConstant.CAMERA_FAILED_IMAGE_PATH));
|
||||
return;
|
||||
}
|
||||
|
||||
Mat videoFrame = new Mat();
|
||||
while (true)
|
||||
{
|
||||
//Thread.Sleep(5);
|
||||
Thread.Sleep(50); //Stream Thread Sleep
|
||||
//Thread.Sleep(40); //Video Thread Sleep
|
||||
if (!isCapturing)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (videoCapture.Read(videoFrame) && videoFrame.Width > 0 && videoFrame.Height > 0)
|
||||
{
|
||||
OnVideoFrameReceived?.Invoke(videoFrame);
|
||||
if (isFrameRequested)
|
||||
{
|
||||
OnOneVideoFrameRequested?.Invoke(videoFrame);
|
||||
CurrentFrame = videoFrame;
|
||||
isFrameRequested = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnOpenVideoStreamFailed?.Invoke(Cv2.ImRead(Application.StartupPath + AppConstant.CAMERA_FAILED_IMAGE_PATH));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void PauseCapture()
|
||||
public void Stop()
|
||||
{
|
||||
lock (lockSyncObject)
|
||||
if (readStreamThread.IsAlive)
|
||||
{
|
||||
isCapturing = false;
|
||||
readStreamThread.Abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
290
AIParkingApplication/ConfigurationForm.Designer.cs
generated
Normal file
290
AIParkingApplication/ConfigurationForm.Designer.cs
generated
Normal file
@@ -0,0 +1,290 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
partial class ConfigurationForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.lblDoorDeviceControlAccessIPStatus = new System.Windows.Forms.Label();
|
||||
this.btnCheckDoorDeviceControlAccessIP = new System.Windows.Forms.Button();
|
||||
this.btnClose = new System.Windows.Forms.Button();
|
||||
this.btnSaveSettings = new System.Windows.Forms.Button();
|
||||
this.chkAllowChangeROIRect = new System.Windows.Forms.CheckBox();
|
||||
this.chkAllowAutoDoor2 = new System.Windows.Forms.CheckBox();
|
||||
this.chkAllowAutoDoor1 = new System.Windows.Forms.CheckBox();
|
||||
this.lblAllowChangeROIRect = new System.Windows.Forms.Label();
|
||||
this.lblAllowAutoOpenDoorIn = new System.Windows.Forms.Label();
|
||||
this.txtDoorDeviceControlAccessIP = new System.Windows.Forms.TextBox();
|
||||
this.lblDoorDeviceControlAccessIP = new System.Windows.Forms.Label();
|
||||
this.lblAllowUsePrinter = new System.Windows.Forms.Label();
|
||||
this.chkAllowUsePrinter = new System.Windows.Forms.CheckBox();
|
||||
this.lblAllowAutoLogin = new System.Windows.Forms.Label();
|
||||
this.chkAllowAutoLogin = new System.Windows.Forms.CheckBox();
|
||||
this.statusStrip = new System.Windows.Forms.StatusStrip();
|
||||
this.toolStripStatusLabelSavedSettingStatus = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.lblAllowAutoRun = new System.Windows.Forms.Label();
|
||||
this.chkAllowAutoRunAtStartUp = new System.Windows.Forms.CheckBox();
|
||||
this.statusStrip.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// lblDoorDeviceControlAccessIPStatus
|
||||
//
|
||||
this.lblDoorDeviceControlAccessIPStatus.AutoSize = true;
|
||||
this.lblDoorDeviceControlAccessIPStatus.Location = new System.Drawing.Point(412, 9);
|
||||
this.lblDoorDeviceControlAccessIPStatus.Name = "lblDoorDeviceControlAccessIPStatus";
|
||||
this.lblDoorDeviceControlAccessIPStatus.Size = new System.Drawing.Size(58, 13);
|
||||
this.lblDoorDeviceControlAccessIPStatus.TabIndex = 17;
|
||||
this.lblDoorDeviceControlAccessIPStatus.Text = "Trạng thái:";
|
||||
//
|
||||
// btnCheckDoorDeviceControlAccessIP
|
||||
//
|
||||
this.btnCheckDoorDeviceControlAccessIP.Location = new System.Drawing.Point(330, 3);
|
||||
this.btnCheckDoorDeviceControlAccessIP.Name = "btnCheckDoorDeviceControlAccessIP";
|
||||
this.btnCheckDoorDeviceControlAccessIP.Size = new System.Drawing.Size(75, 24);
|
||||
this.btnCheckDoorDeviceControlAccessIP.TabIndex = 2;
|
||||
this.btnCheckDoorDeviceControlAccessIP.Text = "Kiểm tra";
|
||||
this.btnCheckDoorDeviceControlAccessIP.UseVisualStyleBackColor = true;
|
||||
this.btnCheckDoorDeviceControlAccessIP.Click += new System.EventHandler(this.btnCheckDoorDeviceControlAccessIP_Click);
|
||||
//
|
||||
// btnClose
|
||||
//
|
||||
this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnClose.Location = new System.Drawing.Point(528, 207);
|
||||
this.btnClose.Name = "btnClose";
|
||||
this.btnClose.Size = new System.Drawing.Size(106, 41);
|
||||
this.btnClose.TabIndex = 7;
|
||||
this.btnClose.Text = "Đóng";
|
||||
this.btnClose.UseVisualStyleBackColor = true;
|
||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
||||
//
|
||||
// btnSaveSettings
|
||||
//
|
||||
this.btnSaveSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnSaveSettings.Location = new System.Drawing.Point(416, 207);
|
||||
this.btnSaveSettings.Name = "btnSaveSettings";
|
||||
this.btnSaveSettings.Size = new System.Drawing.Size(106, 41);
|
||||
this.btnSaveSettings.TabIndex = 0;
|
||||
this.btnSaveSettings.Text = "Lưu";
|
||||
this.btnSaveSettings.UseVisualStyleBackColor = true;
|
||||
this.btnSaveSettings.Click += new System.EventHandler(this.btnSaveSettings_Click);
|
||||
//
|
||||
// chkAllowChangeROIRect
|
||||
//
|
||||
this.chkAllowChangeROIRect.AutoSize = true;
|
||||
this.chkAllowChangeROIRect.Location = new System.Drawing.Point(252, 95);
|
||||
this.chkAllowChangeROIRect.Name = "chkAllowChangeROIRect";
|
||||
this.chkAllowChangeROIRect.Size = new System.Drawing.Size(72, 17);
|
||||
this.chkAllowChangeROIRect.TabIndex = 5;
|
||||
this.chkAllowChangeROIRect.Text = "Cho phép";
|
||||
this.chkAllowChangeROIRect.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// chkAllowAutoDoor2
|
||||
//
|
||||
this.chkAllowAutoDoor2.AutoSize = true;
|
||||
this.chkAllowAutoDoor2.Location = new System.Drawing.Point(252, 37);
|
||||
this.chkAllowAutoDoor2.Name = "chkAllowAutoDoor2";
|
||||
this.chkAllowAutoDoor2.Size = new System.Drawing.Size(68, 17);
|
||||
this.chkAllowAutoDoor2.TabIndex = 4;
|
||||
this.chkAllowAutoDoor2.Text = "Cửa số 2";
|
||||
this.chkAllowAutoDoor2.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// chkAllowAutoDoor1
|
||||
//
|
||||
this.chkAllowAutoDoor1.AutoSize = true;
|
||||
this.chkAllowAutoDoor1.Location = new System.Drawing.Point(141, 37);
|
||||
this.chkAllowAutoDoor1.Name = "chkAllowAutoDoor1";
|
||||
this.chkAllowAutoDoor1.Size = new System.Drawing.Size(68, 17);
|
||||
this.chkAllowAutoDoor1.TabIndex = 3;
|
||||
this.chkAllowAutoDoor1.Text = "Cửa số 1";
|
||||
this.chkAllowAutoDoor1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// lblAllowChangeROIRect
|
||||
//
|
||||
this.lblAllowChangeROIRect.AutoSize = true;
|
||||
this.lblAllowChangeROIRect.Location = new System.Drawing.Point(11, 96);
|
||||
this.lblAllowChangeROIRect.Name = "lblAllowChangeROIRect";
|
||||
this.lblAllowChangeROIRect.Size = new System.Drawing.Size(211, 13);
|
||||
this.lblAllowChangeROIRect.TabIndex = 9;
|
||||
this.lblAllowChangeROIRect.Text = "Cho phép thay đổi vùng nhận diện biển số:";
|
||||
//
|
||||
// lblAllowAutoOpenDoorIn
|
||||
//
|
||||
this.lblAllowAutoOpenDoorIn.AutoSize = true;
|
||||
this.lblAllowAutoOpenDoorIn.Location = new System.Drawing.Point(11, 39);
|
||||
this.lblAllowAutoOpenDoorIn.Name = "lblAllowAutoOpenDoorIn";
|
||||
this.lblAllowAutoOpenDoorIn.Size = new System.Drawing.Size(89, 13);
|
||||
this.lblAllowAutoOpenDoorIn.TabIndex = 10;
|
||||
this.lblAllowAutoOpenDoorIn.Text = "Tự động mở cửa:";
|
||||
//
|
||||
// txtDoorDeviceControlAccessIP
|
||||
//
|
||||
this.txtDoorDeviceControlAccessIP.Location = new System.Drawing.Point(141, 5);
|
||||
this.txtDoorDeviceControlAccessIP.Name = "txtDoorDeviceControlAccessIP";
|
||||
this.txtDoorDeviceControlAccessIP.Size = new System.Drawing.Size(183, 20);
|
||||
this.txtDoorDeviceControlAccessIP.TabIndex = 1;
|
||||
//
|
||||
// lblDoorDeviceControlAccessIP
|
||||
//
|
||||
this.lblDoorDeviceControlAccessIP.AutoSize = true;
|
||||
this.lblDoorDeviceControlAccessIP.Location = new System.Drawing.Point(12, 9);
|
||||
this.lblDoorDeviceControlAccessIP.Name = "lblDoorDeviceControlAccessIP";
|
||||
this.lblDoorDeviceControlAccessIP.Size = new System.Drawing.Size(96, 13);
|
||||
this.lblDoorDeviceControlAccessIP.TabIndex = 7;
|
||||
this.lblDoorDeviceControlAccessIP.Text = "IP Thiết bị mở cửa:";
|
||||
//
|
||||
// lblAllowUsePrinter
|
||||
//
|
||||
this.lblAllowUsePrinter.AutoSize = true;
|
||||
this.lblAllowUsePrinter.Location = new System.Drawing.Point(11, 67);
|
||||
this.lblAllowUsePrinter.Name = "lblAllowUsePrinter";
|
||||
this.lblAllowUsePrinter.Size = new System.Drawing.Size(83, 13);
|
||||
this.lblAllowUsePrinter.TabIndex = 9;
|
||||
this.lblAllowUsePrinter.Text = "Sử dụng máy in:";
|
||||
//
|
||||
// chkAllowUsePrinter
|
||||
//
|
||||
this.chkAllowUsePrinter.AutoSize = true;
|
||||
this.chkAllowUsePrinter.Location = new System.Drawing.Point(141, 66);
|
||||
this.chkAllowUsePrinter.Name = "chkAllowUsePrinter";
|
||||
this.chkAllowUsePrinter.Size = new System.Drawing.Size(66, 17);
|
||||
this.chkAllowUsePrinter.TabIndex = 5;
|
||||
this.chkAllowUsePrinter.Text = "Sử dụng";
|
||||
this.chkAllowUsePrinter.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// lblAllowAutoLogin
|
||||
//
|
||||
this.lblAllowAutoLogin.AutoSize = true;
|
||||
this.lblAllowAutoLogin.Location = new System.Drawing.Point(11, 129);
|
||||
this.lblAllowAutoLogin.Name = "lblAllowAutoLogin";
|
||||
this.lblAllowAutoLogin.Size = new System.Drawing.Size(106, 13);
|
||||
this.lblAllowAutoLogin.TabIndex = 9;
|
||||
this.lblAllowAutoLogin.Text = "Tự động đăng nhập:";
|
||||
//
|
||||
// chkAllowAutoLogin
|
||||
//
|
||||
this.chkAllowAutoLogin.AutoSize = true;
|
||||
this.chkAllowAutoLogin.Location = new System.Drawing.Point(141, 128);
|
||||
this.chkAllowAutoLogin.Name = "chkAllowAutoLogin";
|
||||
this.chkAllowAutoLogin.Size = new System.Drawing.Size(66, 17);
|
||||
this.chkAllowAutoLogin.TabIndex = 5;
|
||||
this.chkAllowAutoLogin.Text = "Sử dụng";
|
||||
this.chkAllowAutoLogin.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// statusStrip
|
||||
//
|
||||
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripStatusLabelSavedSettingStatus});
|
||||
this.statusStrip.Location = new System.Drawing.Point(0, 259);
|
||||
this.statusStrip.Name = "statusStrip";
|
||||
this.statusStrip.Size = new System.Drawing.Size(646, 22);
|
||||
this.statusStrip.TabIndex = 18;
|
||||
this.statusStrip.Text = "statusStrip";
|
||||
//
|
||||
// toolStripStatusLabelSavedSettingStatus
|
||||
//
|
||||
this.toolStripStatusLabelSavedSettingStatus.Name = "toolStripStatusLabelSavedSettingStatus";
|
||||
this.toolStripStatusLabelSavedSettingStatus.Size = new System.Drawing.Size(110, 17);
|
||||
this.toolStripStatusLabelSavedSettingStatus.Text = "Cấu hình ứng dụng";
|
||||
//
|
||||
// lblAllowAutoRun
|
||||
//
|
||||
this.lblAllowAutoRun.AutoSize = true;
|
||||
this.lblAllowAutoRun.Location = new System.Drawing.Point(11, 161);
|
||||
this.lblAllowAutoRun.Name = "lblAllowAutoRun";
|
||||
this.lblAllowAutoRun.Size = new System.Drawing.Size(122, 13);
|
||||
this.lblAllowAutoRun.TabIndex = 9;
|
||||
this.lblAllowAutoRun.Text = "Tự khởi động ứng dụng:";
|
||||
//
|
||||
// chkAllowAutoRunAtStartUp
|
||||
//
|
||||
this.chkAllowAutoRunAtStartUp.AutoSize = true;
|
||||
this.chkAllowAutoRunAtStartUp.Location = new System.Drawing.Point(141, 160);
|
||||
this.chkAllowAutoRunAtStartUp.Name = "chkAllowAutoRunAtStartUp";
|
||||
this.chkAllowAutoRunAtStartUp.Size = new System.Drawing.Size(66, 17);
|
||||
this.chkAllowAutoRunAtStartUp.TabIndex = 5;
|
||||
this.chkAllowAutoRunAtStartUp.Text = "Sử dụng";
|
||||
this.chkAllowAutoRunAtStartUp.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// ConfigurationForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(646, 281);
|
||||
this.Controls.Add(this.statusStrip);
|
||||
this.Controls.Add(this.lblDoorDeviceControlAccessIPStatus);
|
||||
this.Controls.Add(this.btnCheckDoorDeviceControlAccessIP);
|
||||
this.Controls.Add(this.btnClose);
|
||||
this.Controls.Add(this.btnSaveSettings);
|
||||
this.Controls.Add(this.chkAllowAutoRunAtStartUp);
|
||||
this.Controls.Add(this.chkAllowAutoLogin);
|
||||
this.Controls.Add(this.chkAllowUsePrinter);
|
||||
this.Controls.Add(this.chkAllowChangeROIRect);
|
||||
this.Controls.Add(this.lblAllowAutoRun);
|
||||
this.Controls.Add(this.chkAllowAutoDoor2);
|
||||
this.Controls.Add(this.lblAllowAutoLogin);
|
||||
this.Controls.Add(this.chkAllowAutoDoor1);
|
||||
this.Controls.Add(this.lblAllowUsePrinter);
|
||||
this.Controls.Add(this.lblAllowChangeROIRect);
|
||||
this.Controls.Add(this.lblAllowAutoOpenDoorIn);
|
||||
this.Controls.Add(this.txtDoorDeviceControlAccessIP);
|
||||
this.Controls.Add(this.lblDoorDeviceControlAccessIP);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
||||
this.MaximumSize = new System.Drawing.Size(662, 320);
|
||||
this.MinimumSize = new System.Drawing.Size(662, 320);
|
||||
this.Name = "ConfigurationForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||
this.Text = "Cấu hình ứng dụng";
|
||||
this.Load += new System.EventHandler(this.ConfigurationForm_Load);
|
||||
this.statusStrip.ResumeLayout(false);
|
||||
this.statusStrip.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label lblDoorDeviceControlAccessIPStatus;
|
||||
private System.Windows.Forms.Button btnCheckDoorDeviceControlAccessIP;
|
||||
private System.Windows.Forms.Button btnClose;
|
||||
private System.Windows.Forms.Button btnSaveSettings;
|
||||
private System.Windows.Forms.CheckBox chkAllowChangeROIRect;
|
||||
private System.Windows.Forms.CheckBox chkAllowAutoDoor2;
|
||||
private System.Windows.Forms.CheckBox chkAllowAutoDoor1;
|
||||
private System.Windows.Forms.Label lblAllowChangeROIRect;
|
||||
private System.Windows.Forms.Label lblAllowAutoOpenDoorIn;
|
||||
private System.Windows.Forms.TextBox txtDoorDeviceControlAccessIP;
|
||||
private System.Windows.Forms.Label lblDoorDeviceControlAccessIP;
|
||||
private System.Windows.Forms.Label lblAllowUsePrinter;
|
||||
private System.Windows.Forms.CheckBox chkAllowUsePrinter;
|
||||
private System.Windows.Forms.Label lblAllowAutoLogin;
|
||||
private System.Windows.Forms.CheckBox chkAllowAutoLogin;
|
||||
private System.Windows.Forms.StatusStrip statusStrip;
|
||||
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelSavedSettingStatus;
|
||||
private System.Windows.Forms.Label lblAllowAutoRun;
|
||||
private System.Windows.Forms.CheckBox chkAllowAutoRunAtStartUp;
|
||||
}
|
||||
}
|
||||
108
AIParkingApplication/ConfigurationForm.cs
Normal file
108
AIParkingApplication/ConfigurationForm.cs
Normal file
@@ -0,0 +1,108 @@
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class ConfigurationForm : Form
|
||||
{
|
||||
private Logger appLogger;
|
||||
private string doorAccessControlDeviceIP;
|
||||
private bool allowAutoOpenDoor1;
|
||||
private bool allowAutoOpenDoor2;
|
||||
private bool allowUsePrinter;
|
||||
private bool allowChangeROIRect;
|
||||
private bool allowAutoLogin;
|
||||
private bool allowAutoRunAtStartUp;
|
||||
|
||||
public ConfigurationForm(Logger appLogger)
|
||||
{
|
||||
InitializeComponent();
|
||||
this.appLogger = appLogger;
|
||||
}
|
||||
|
||||
private void btnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void btnSaveSettings_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool isValidIPAddress = Util.IsValidIPAddress(txtDoorDeviceControlAccessIP.Text);
|
||||
if (!isValidIPAddress)
|
||||
{
|
||||
MessageBox.Show("Nhập đúng IP thiết bị mở cửa!");
|
||||
return;
|
||||
}
|
||||
Util.UpsertAppSettings(AppConstant.DOOR_ACCESS_DEVICE_CONTROL_IP, txtDoorDeviceControlAccessIP.Text);
|
||||
Util.UpsertAppSettings(AppConstant.AUTO_OPEN_DOOR_1, chkAllowAutoDoor1.Checked.ToString().ToLower());
|
||||
Util.UpsertAppSettings(AppConstant.AUTO_OPEN_DOOR_2, chkAllowAutoDoor2.Checked.ToString().ToLower());
|
||||
Util.UpsertAppSettings(AppConstant.USE_PRINTER, chkAllowUsePrinter.Checked.ToString().ToLower());
|
||||
Util.UpsertAppSettings(AppConstant.ALLOW_CHANGE_ROI_RECT, chkAllowChangeROIRect.Checked.ToString().ToLower());
|
||||
Util.UpsertAppSettings(AppConstant.AUTO_LOGIN, chkAllowAutoLogin.Checked.ToString().ToLower());
|
||||
Util.UpsertAppSettings(AppConstant.AUTO_RUN_AT_STARTUP, chkAllowAutoRunAtStartUp.Checked.ToString().ToLower());
|
||||
if (chkAllowAutoRunAtStartUp.Checked)
|
||||
{
|
||||
Util.AddApplicationToStartup();
|
||||
}
|
||||
else
|
||||
{
|
||||
Util.RemoveApplicationFromStartup();
|
||||
}
|
||||
toolStripStatusLabelSavedSettingStatus.Text = $"{DateTime.Now.GetTimeFormatted()} Đã lưu cài đặt";
|
||||
}
|
||||
|
||||
private void ConfigurationForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
LoadConfiguration();
|
||||
txtDoorDeviceControlAccessIP.Text = doorAccessControlDeviceIP;
|
||||
chkAllowAutoDoor1.Checked = allowAutoOpenDoor1;
|
||||
chkAllowAutoDoor2.Checked = allowAutoOpenDoor2;
|
||||
chkAllowUsePrinter.Checked = allowUsePrinter;
|
||||
chkAllowChangeROIRect.Checked = allowChangeROIRect;
|
||||
chkAllowAutoLogin.Checked = allowAutoLogin;
|
||||
chkAllowAutoRunAtStartUp.Checked = allowAutoRunAtStartUp;
|
||||
}
|
||||
|
||||
private void LoadConfiguration()
|
||||
{
|
||||
doorAccessControlDeviceIP = ReadConfigurationFromAppSettings(AppConstant.DOOR_ACCESS_DEVICE_CONTROL_IP, string.Empty);
|
||||
bool.TryParse(ReadConfigurationFromAppSettings(AppConstant.AUTO_OPEN_DOOR_1, "false"), out allowAutoOpenDoor1);
|
||||
bool.TryParse(ReadConfigurationFromAppSettings(AppConstant.AUTO_OPEN_DOOR_2, "false"), out allowAutoOpenDoor2);
|
||||
bool.TryParse(ReadConfigurationFromAppSettings(AppConstant.USE_PRINTER, "false"), out allowUsePrinter);
|
||||
bool.TryParse(ReadConfigurationFromAppSettings(AppConstant.ALLOW_CHANGE_ROI_RECT, "false"), out allowChangeROIRect);
|
||||
bool.TryParse(ReadConfigurationFromAppSettings(AppConstant.AUTO_LOGIN, "false"), out allowAutoLogin);
|
||||
bool.TryParse(ReadConfigurationFromAppSettings(AppConstant.AUTO_RUN_AT_STARTUP, "false"), out allowAutoRunAtStartUp);
|
||||
}
|
||||
|
||||
private string ReadConfigurationFromAppSettings(string configurationKey, string defaultValueIfReadFailed)
|
||||
{
|
||||
try
|
||||
{
|
||||
return ConfigurationManager.AppSettings[configurationKey].Trim();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Util.UpsertAppSettings(configurationKey, defaultValueIfReadFailed);
|
||||
Console.WriteLine($"ReadDoorDeviceControlAccessConfiguration. ex: {ex.Message}");
|
||||
appLogger.Log(LogLevel.Info, $"ConfigurationForm - ReadConfigurationFromAppSettings. Key: {configurationKey} - DefaultValue: {defaultValueIfReadFailed}. ex: {ex.Message}");
|
||||
return defaultValueIfReadFailed;
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheckDoorDeviceControlAccessIP_Click(object sender, EventArgs e)
|
||||
{
|
||||
lblDoorDeviceControlAccessIPStatus.Text = string.Empty;
|
||||
bool isValidIPAddress = Util.IsValidIPAddress(txtDoorDeviceControlAccessIP.Text);
|
||||
if (!isValidIPAddress)
|
||||
{
|
||||
lblDoorDeviceControlAccessIPStatus.Text = "Không đúng định dạng IP";
|
||||
}
|
||||
else
|
||||
{
|
||||
lblDoorDeviceControlAccessIPStatus.Text = "OK";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
123
AIParkingApplication/ConfigurationForm.resx
Normal file
123
AIParkingApplication/ConfigurationForm.resx
Normal file
@@ -0,0 +1,123 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
40
AIParkingApplication/EngineApiController.cs
Normal file
40
AIParkingApplication/EngineApiController.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using OpenCvSharp;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public class EngineApiController
|
||||
{
|
||||
private HttpClient httpClientEngine;
|
||||
|
||||
public EngineApiController(string engineBaseAddress)
|
||||
{
|
||||
httpClientEngine = new HttpClient { BaseAddress = new Uri(engineBaseAddress), Timeout = TimeSpan.FromMilliseconds(5000) };
|
||||
}
|
||||
|
||||
public async Task<OcrResult> SendEngineRequestAsync(Mat plateImage, PlateType plateType)
|
||||
{
|
||||
string plateImageBase64 = Convert.ToBase64String(plateImage.ToBytes());
|
||||
try
|
||||
{
|
||||
var request = new PlateRequestEngineModel
|
||||
{
|
||||
Img64 = plateImageBase64,
|
||||
Mode = plateType == PlateType.Square ? "square" : "long",
|
||||
Display = "full"
|
||||
};
|
||||
HttpResponseMessage response = await httpClientEngine.PostAsJsonAsync("/get-from-frame", request);
|
||||
response.EnsureSuccessStatusCode();
|
||||
var ocrResult = await response.Content.ReadAsAsync<OcrResult>();
|
||||
return ocrResult;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"SendEngineRequest : {ex.Message}");
|
||||
return new OcrResult();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
14
AIParkingApplication/Enums.cs
Normal file
14
AIParkingApplication/Enums.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public enum PlateType
|
||||
{
|
||||
Square,
|
||||
Long
|
||||
}
|
||||
|
||||
public enum LaneDirection
|
||||
{
|
||||
In,
|
||||
Out
|
||||
}
|
||||
}
|
||||
76
AIParkingApplication/ExtensitionMethods.cs
Normal file
76
AIParkingApplication/ExtensitionMethods.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public static class ExtensitionMethods
|
||||
{
|
||||
public static void DisableSelected(this ToolStripMenuItem toolStripMenuItem)
|
||||
{
|
||||
toolStripMenuItem.Checked = true;
|
||||
toolStripMenuItem.Enabled = false;
|
||||
}
|
||||
|
||||
public static string GetTimeFormatted(this DateTime dateTime)
|
||||
{
|
||||
return dateTime.ToString(AppConstant.DATETIME_FORMAT);
|
||||
}
|
||||
|
||||
public static void UpdateImage(this PictureBox pictureBox, Bitmap image)
|
||||
{
|
||||
if (pictureBox.IsDisposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pictureBox.Invoke(new Action(() =>
|
||||
{
|
||||
pictureBox.Image?.Dispose();
|
||||
pictureBox.Image = image;
|
||||
}));
|
||||
}
|
||||
|
||||
public static void UpdateLabel(this Label label, string text, Color backColor, Color foreColor)
|
||||
{
|
||||
if (label.IsDisposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
label.Invoke(new Action(() =>
|
||||
{
|
||||
label.Text = text;
|
||||
label.BackColor = backColor;
|
||||
label.ForeColor = foreColor;
|
||||
}));
|
||||
}
|
||||
|
||||
public static void UpdateLabel(this Label label, string text, Color backColor)
|
||||
{
|
||||
if (label.IsDisposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
label.Invoke(new Action(() =>
|
||||
{
|
||||
label.Text = text;
|
||||
label.BackColor = backColor;
|
||||
}));
|
||||
}
|
||||
|
||||
public static void UpdateLabel(this Label label, string text)
|
||||
{
|
||||
if (label.IsDisposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
label.Invoke(new Action(() =>
|
||||
{
|
||||
label.Text = text;
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
14
AIParkingApplication/IDoorControlAccess.cs
Normal file
14
AIParkingApplication/IDoorControlAccess.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public interface IDoorControlAccess
|
||||
{
|
||||
event C3DeviceEvent OnNewCardReceived;
|
||||
|
||||
ActionResult Connect();
|
||||
ActionResult Disconnect();
|
||||
Task GetLogToReceiveNewCard();
|
||||
ActionResult OpenDoor(int doorId);
|
||||
}
|
||||
}
|
||||
10
AIParkingApplication/ILane.cs
Normal file
10
AIParkingApplication/ILane.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public interface ILane
|
||||
{
|
||||
void Start();
|
||||
void Stop();
|
||||
void Hide();
|
||||
void Show();
|
||||
}
|
||||
}
|
||||
BIN
AIParkingApplication/Images/ApplicationLogo.ico
Normal file
BIN
AIParkingApplication/Images/ApplicationLogo.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 150 KiB |
BIN
AIParkingApplication/Images/CantConnectCamera.jpg
Normal file
BIN
AIParkingApplication/Images/CantConnectCamera.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 52 KiB |
@@ -1,22 +0,0 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public class Lane
|
||||
{
|
||||
private LaneType laneType;
|
||||
private string vehicleVideoStream;
|
||||
private string plateVideoStream;
|
||||
|
||||
public Lane(LaneType laneType, string vehicleVideoStream, string plateVideoStream)
|
||||
{
|
||||
this.laneType = laneType;
|
||||
this.vehicleVideoStream = vehicleVideoStream;
|
||||
this.plateVideoStream = plateVideoStream;
|
||||
}
|
||||
}
|
||||
|
||||
public enum LaneType
|
||||
{
|
||||
IN,
|
||||
OUT
|
||||
}
|
||||
}
|
||||
96
AIParkingApplication/LaneIn.Designer.cs
generated
96
AIParkingApplication/LaneIn.Designer.cs
generated
@@ -40,7 +40,7 @@
|
||||
this.grbCardInformation = new System.Windows.Forms.GroupBox();
|
||||
this.lblCardTime = new System.Windows.Forms.Label();
|
||||
this.lblPlateString = new System.Windows.Forms.Label();
|
||||
this.lblRecogizePlateStatus = new System.Windows.Forms.Label();
|
||||
this.lblStatusInfo = new System.Windows.Forms.Label();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateImage)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateVideo)).BeginInit();
|
||||
this.grbPlateCamera.SuspendLayout();
|
||||
@@ -52,8 +52,8 @@
|
||||
//
|
||||
// pictureBoxPlateImage
|
||||
//
|
||||
this.pictureBoxPlateImage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.pictureBoxPlateImage.Location = new System.Drawing.Point(226, 29);
|
||||
this.pictureBoxPlateImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxPlateImage.Location = new System.Drawing.Point(226, 23);
|
||||
this.pictureBoxPlateImage.Name = "pictureBoxPlateImage";
|
||||
this.pictureBoxPlateImage.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxPlateImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
@@ -62,29 +62,35 @@
|
||||
//
|
||||
// pictureBoxPlateVideo
|
||||
//
|
||||
this.pictureBoxPlateVideo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||
this.pictureBoxPlateVideo.Location = new System.Drawing.Point(15, 29);
|
||||
this.pictureBoxPlateVideo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxPlateVideo.Location = new System.Drawing.Point(15, 23);
|
||||
this.pictureBoxPlateVideo.Name = "pictureBoxPlateVideo";
|
||||
this.pictureBoxPlateVideo.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxPlateVideo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxPlateVideo.TabIndex = 0;
|
||||
this.pictureBoxPlateVideo.TabStop = false;
|
||||
this.pictureBoxPlateVideo.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBoxPlateVideo_Paint);
|
||||
this.pictureBoxPlateVideo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBoxPlateVideo_MouseDown);
|
||||
this.pictureBoxPlateVideo.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBoxPlateVideo_MouseMove);
|
||||
this.pictureBoxPlateVideo.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBoxPlateVideo_MouseUp);
|
||||
//
|
||||
// grbPlateCamera
|
||||
//
|
||||
this.grbPlateCamera.Controls.Add(this.pictureBoxPlateImage);
|
||||
this.grbPlateCamera.Controls.Add(this.pictureBoxPlateVideo);
|
||||
this.grbPlateCamera.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbPlateCamera.Location = new System.Drawing.Point(9, 250);
|
||||
this.grbPlateCamera.Location = new System.Drawing.Point(1, 208);
|
||||
this.grbPlateCamera.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.grbPlateCamera.Name = "grbPlateCamera";
|
||||
this.grbPlateCamera.Size = new System.Drawing.Size(441, 246);
|
||||
this.grbPlateCamera.Size = new System.Drawing.Size(440, 238);
|
||||
this.grbPlateCamera.TabIndex = 12;
|
||||
this.grbPlateCamera.TabStop = false;
|
||||
this.grbPlateCamera.Text = "Camera biển số";
|
||||
//
|
||||
// pictureBoxOverviewImage
|
||||
//
|
||||
this.pictureBoxOverviewImage.Location = new System.Drawing.Point(226, 30);
|
||||
this.pictureBoxOverviewImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxOverviewImage.Location = new System.Drawing.Point(226, 24);
|
||||
this.pictureBoxOverviewImage.Name = "pictureBoxOverviewImage";
|
||||
this.pictureBoxOverviewImage.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxOverviewImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
@@ -93,7 +99,8 @@
|
||||
//
|
||||
// pictureBoxOverviewVideo
|
||||
//
|
||||
this.pictureBoxOverviewVideo.Location = new System.Drawing.Point(15, 30);
|
||||
this.pictureBoxOverviewVideo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxOverviewVideo.Location = new System.Drawing.Point(15, 24);
|
||||
this.pictureBoxOverviewVideo.Name = "pictureBoxOverviewVideo";
|
||||
this.pictureBoxOverviewVideo.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxOverviewVideo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
@@ -105,23 +112,23 @@
|
||||
this.grbOverviewCamera.Controls.Add(this.pictureBoxOverviewImage);
|
||||
this.grbOverviewCamera.Controls.Add(this.pictureBoxOverviewVideo);
|
||||
this.grbOverviewCamera.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbOverviewCamera.Location = new System.Drawing.Point(9, 502);
|
||||
this.grbOverviewCamera.Location = new System.Drawing.Point(1, 454);
|
||||
this.grbOverviewCamera.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.grbOverviewCamera.Name = "grbOverviewCamera";
|
||||
this.grbOverviewCamera.Size = new System.Drawing.Size(441, 247);
|
||||
this.grbOverviewCamera.Size = new System.Drawing.Size(440, 238);
|
||||
this.grbOverviewCamera.TabIndex = 11;
|
||||
this.grbOverviewCamera.TabStop = false;
|
||||
this.grbOverviewCamera.Text = "Camera toàn cảnh";
|
||||
//
|
||||
// lblLaneLabel
|
||||
//
|
||||
this.lblLaneLabel.AutoSize = true;
|
||||
this.lblLaneLabel.BackColor = System.Drawing.Color.Red;
|
||||
this.lblLaneLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblLaneLabel.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.lblLaneLabel.Location = new System.Drawing.Point(9, 10);
|
||||
this.lblLaneLabel.Location = new System.Drawing.Point(1, 1);
|
||||
this.lblLaneLabel.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lblLaneLabel.Name = "lblLaneLabel";
|
||||
this.lblLaneLabel.Padding = new System.Windows.Forms.Padding(138, 5, 137, 5);
|
||||
this.lblLaneLabel.Size = new System.Drawing.Size(441, 49);
|
||||
this.lblLaneLabel.Size = new System.Drawing.Size(440, 50);
|
||||
this.lblLaneLabel.TabIndex = 10;
|
||||
this.lblLaneLabel.Text = "LÀN VÀO";
|
||||
this.lblLaneLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
@@ -129,20 +136,20 @@
|
||||
// lblCardType
|
||||
//
|
||||
this.lblCardType.AutoSize = true;
|
||||
this.lblCardType.Location = new System.Drawing.Point(12, 77);
|
||||
this.lblCardType.Location = new System.Drawing.Point(12, 64);
|
||||
this.lblCardType.Name = "lblCardType";
|
||||
this.lblCardType.Size = new System.Drawing.Size(60, 18);
|
||||
this.lblCardType.Size = new System.Drawing.Size(64, 18);
|
||||
this.lblCardType.TabIndex = 0;
|
||||
this.lblCardType.Text = "Loại thẻ";
|
||||
this.lblCardType.Text = "Loại thẻ:";
|
||||
//
|
||||
// lblCardNumber
|
||||
//
|
||||
this.lblCardNumber.AutoSize = true;
|
||||
this.lblCardNumber.Location = new System.Drawing.Point(12, 31);
|
||||
this.lblCardNumber.Name = "lblCardNumber";
|
||||
this.lblCardNumber.Size = new System.Drawing.Size(51, 18);
|
||||
this.lblCardNumber.Size = new System.Drawing.Size(55, 18);
|
||||
this.lblCardNumber.TabIndex = 0;
|
||||
this.lblCardNumber.Text = "Số thẻ";
|
||||
this.lblCardNumber.Text = "Số thẻ:";
|
||||
//
|
||||
// grbCardInformation
|
||||
//
|
||||
@@ -151,9 +158,10 @@
|
||||
this.grbCardInformation.Controls.Add(this.lblPlateString);
|
||||
this.grbCardInformation.Controls.Add(this.lblCardNumber);
|
||||
this.grbCardInformation.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbCardInformation.Location = new System.Drawing.Point(9, 69);
|
||||
this.grbCardInformation.Location = new System.Drawing.Point(1, 55);
|
||||
this.grbCardInformation.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.grbCardInformation.Name = "grbCardInformation";
|
||||
this.grbCardInformation.Size = new System.Drawing.Size(441, 113);
|
||||
this.grbCardInformation.Size = new System.Drawing.Size(440, 104);
|
||||
this.grbCardInformation.TabIndex = 13;
|
||||
this.grbCardInformation.TabStop = false;
|
||||
this.grbCardInformation.Text = "Thông tin thẻ";
|
||||
@@ -161,46 +169,47 @@
|
||||
// lblCardTime
|
||||
//
|
||||
this.lblCardTime.AutoSize = true;
|
||||
this.lblCardTime.Location = new System.Drawing.Point(218, 77);
|
||||
this.lblCardTime.Location = new System.Drawing.Point(223, 64);
|
||||
this.lblCardTime.Name = "lblCardTime";
|
||||
this.lblCardTime.Size = new System.Drawing.Size(68, 18);
|
||||
this.lblCardTime.Size = new System.Drawing.Size(72, 18);
|
||||
this.lblCardTime.TabIndex = 0;
|
||||
this.lblCardTime.Text = "Thời gian";
|
||||
this.lblCardTime.Text = "Thời gian:";
|
||||
//
|
||||
// lblPlateString
|
||||
//
|
||||
this.lblPlateString.AutoSize = true;
|
||||
this.lblPlateString.Location = new System.Drawing.Point(218, 31);
|
||||
this.lblPlateString.Location = new System.Drawing.Point(223, 31);
|
||||
this.lblPlateString.Name = "lblPlateString";
|
||||
this.lblPlateString.Size = new System.Drawing.Size(58, 18);
|
||||
this.lblPlateString.Size = new System.Drawing.Size(62, 18);
|
||||
this.lblPlateString.TabIndex = 0;
|
||||
this.lblPlateString.Text = "Biển số";
|
||||
this.lblPlateString.Text = "Biển số:";
|
||||
//
|
||||
// lblRecogizePlateStatus
|
||||
// lblStatusInfo
|
||||
//
|
||||
this.lblRecogizePlateStatus.AutoSize = true;
|
||||
this.lblRecogizePlateStatus.BackColor = System.Drawing.Color.Green;
|
||||
this.lblRecogizePlateStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblRecogizePlateStatus.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.lblRecogizePlateStatus.Location = new System.Drawing.Point(9, 197);
|
||||
this.lblRecogizePlateStatus.Name = "lblRecogizePlateStatus";
|
||||
this.lblRecogizePlateStatus.Padding = new System.Windows.Forms.Padding(12, 6, 12, 6);
|
||||
this.lblRecogizePlateStatus.Size = new System.Drawing.Size(441, 41);
|
||||
this.lblRecogizePlateStatus.TabIndex = 15;
|
||||
this.lblRecogizePlateStatus.Text = "KHÔNG NHẬN DIỆN ĐƯỢC BIỂN SỐ";
|
||||
this.lblRecogizePlateStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
this.lblStatusInfo.BackColor = System.Drawing.Color.CornflowerBlue;
|
||||
this.lblStatusInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblStatusInfo.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.lblStatusInfo.Location = new System.Drawing.Point(1, 159);
|
||||
this.lblStatusInfo.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lblStatusInfo.Name = "lblStatusInfo";
|
||||
this.lblStatusInfo.Size = new System.Drawing.Size(440, 40);
|
||||
this.lblStatusInfo.TabIndex = 15;
|
||||
this.lblStatusInfo.Text = "XIN CHÀO";
|
||||
this.lblStatusInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// LaneIn
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.lblRecogizePlateStatus);
|
||||
this.Controls.Add(this.lblStatusInfo);
|
||||
this.Controls.Add(this.grbPlateCamera);
|
||||
this.Controls.Add(this.grbOverviewCamera);
|
||||
this.Controls.Add(this.lblLaneLabel);
|
||||
this.Controls.Add(this.grbCardInformation);
|
||||
this.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.Name = "LaneIn";
|
||||
this.Size = new System.Drawing.Size(460, 764);
|
||||
this.Size = new System.Drawing.Size(442, 692);
|
||||
this.Load += new System.EventHandler(this.LaneIn_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateImage)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateVideo)).EndInit();
|
||||
this.grbPlateCamera.ResumeLayout(false);
|
||||
@@ -210,7 +219,6 @@
|
||||
this.grbCardInformation.ResumeLayout(false);
|
||||
this.grbCardInformation.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
@@ -227,6 +235,6 @@
|
||||
private System.Windows.Forms.GroupBox grbCardInformation;
|
||||
private System.Windows.Forms.Label lblPlateString;
|
||||
private System.Windows.Forms.Label lblCardTime;
|
||||
private System.Windows.Forms.Label lblRecogizePlateStatus;
|
||||
private System.Windows.Forms.Label lblStatusInfo;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,78 +1,291 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Printing;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Extensions;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class LaneIn : UserControl
|
||||
public partial class LaneIn : UserControl, ILane
|
||||
{
|
||||
private Camera overviewCamera;
|
||||
private Camera plateCamera;
|
||||
private PlateDetector plateDetector;
|
||||
private PlateProcessor plateProcessor;
|
||||
public int DoorId { get; set; }
|
||||
private string cameraId;
|
||||
private bool isSupportSquarePlate;
|
||||
private bool isSupportLongPlate;
|
||||
private bool isAutoOpenDoor;
|
||||
private bool isRetryMode;
|
||||
private IDoorControlAccess doorControlAccess;
|
||||
private ApiController apiController;
|
||||
private Logger appLogger;
|
||||
|
||||
public LaneIn()
|
||||
private System.Drawing.Point StartPoint { get; set; }
|
||||
private System.Drawing.Point CurrentCursorPosition { get; set; }
|
||||
private Rectangle pictureBoxRoi;
|
||||
private bool IsDrawBox { get; set; }
|
||||
private Rect roiBoxRect;
|
||||
|
||||
public LaneIn(int doorId,
|
||||
string cameraId,
|
||||
string plateStream,
|
||||
string overviewStream,
|
||||
IDoorControlAccess doorControlAccess,
|
||||
ApiController apiController,
|
||||
EngineApiController engineApiController,
|
||||
Logger appLogger,
|
||||
string roiConfig,
|
||||
bool isSupportSquarePlate = true,
|
||||
bool isSupportLongPlate = false,
|
||||
bool isAutoOpenDoor = true,
|
||||
bool isRetryMode = false)
|
||||
{
|
||||
InitializeComponent();
|
||||
string overviewCameraVideo = @"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"; //@"C:\HS_test.mp4"
|
||||
string plateCameraVideo = @"C:\HS_test.mp4";
|
||||
overviewCamera = new Camera(overviewCameraVideo);
|
||||
plateCamera = new Camera(plateCameraVideo);
|
||||
|
||||
plateCamera.OnVideoFrameReceived += PlateCameraOnVideoFrameReceived;
|
||||
plateCamera.OnOneVideoFrameRequested += PlateCamera_OnOneVideoFrameRequested; ;
|
||||
|
||||
overviewCamera.OnVideoFrameReceived += OverviewCameraOnVideoFrameReceived;
|
||||
overviewCamera.OnOneVideoFrameRequested += OverviewCamera_OnOneVideoFrameRequested;
|
||||
|
||||
overviewCamera.Startcapture();
|
||||
plateCamera.Startcapture();
|
||||
|
||||
plateDetector = new PlateDetector(PlateType.Square, PlateDetectorConstant.MIN_SIZE_DEFAULT_SQUARE_PLATE, PlateDetectorConstant.MAX_SIZE_DEFAULT_SQUARE_PLATE, PlateDetectorConstant.SCALE_FACTOR_DEFAULT_SQUARE_PLATE, PlateDetectorConstant.MIN_NEIGHBORS_DEFAULT_SQUARE_PLATE);
|
||||
this.appLogger = appLogger;
|
||||
DoorId = doorId;
|
||||
this.cameraId = cameraId;
|
||||
this.isSupportSquarePlate = isSupportSquarePlate;
|
||||
this.isSupportLongPlate = isSupportLongPlate;
|
||||
this.isAutoOpenDoor = isAutoOpenDoor;
|
||||
this.isRetryMode = isRetryMode;
|
||||
overviewCamera = new Camera(overviewStream);
|
||||
plateCamera = new Camera(plateStream);
|
||||
this.apiController = apiController;
|
||||
this.doorControlAccess = doorControlAccess;
|
||||
plateProcessor = new PlateProcessor(engineApiController, this.isSupportSquarePlate, this.isSupportLongPlate);
|
||||
this.pictureBoxRoi = Util.ConvertStringToRectangle(roiConfig);
|
||||
}
|
||||
|
||||
private void OverviewCamera_OnOneVideoFrameRequested(Mat videoFrame)
|
||||
private async void C3Device_OnNewCardReceived(int doorId, string cardNumber)
|
||||
{
|
||||
pictureBoxOverviewImage.Invoke(new Action(() =>
|
||||
if (DoorId != doorId)
|
||||
{
|
||||
pictureBoxOverviewImage.Image?.Dispose();
|
||||
pictureBoxOverviewImage.Image = videoFrame.ToBitmap();
|
||||
}));
|
||||
return;
|
||||
}
|
||||
ClearPlateAndOverviewImage();
|
||||
var cardInfoResult = await apiController.GetCardInformation(cardNumber);
|
||||
if (cardInfoResult == null)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG THỂ KẾT NỐI SERVER", Color.Purple);
|
||||
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: KHÔNG THỂ KẾT NỐI TỚI SERVER");
|
||||
return;
|
||||
}
|
||||
if (!cardInfoResult.IsValid)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("THẺ KHÔNG HỢP LỆ", Color.Purple);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: THẺ KHÔNG HỢP LỆ");
|
||||
return;
|
||||
}
|
||||
|
||||
private void PlateCamera_OnOneVideoFrameRequested(Mat videoFrame)
|
||||
if (cardInfoResult.Direction != "in")
|
||||
{
|
||||
Cv2.Resize(videoFrame, videoFrame, new Size(1280, 720));
|
||||
Mat result = plateDetector.DetectPlate(videoFrame);
|
||||
pictureBoxPlateImage.Invoke(new Action(() =>
|
||||
lblStatusInfo.UpdateLabel("XE ĐÃ Ở TRONG BÃI", Color.Red);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: XE ĐÃ Ở TRONG BÃI");
|
||||
return;
|
||||
}
|
||||
|
||||
plateCamera.RequestCaptureOneFrame();
|
||||
overviewCamera.RequestCaptureOneFrame();
|
||||
await Task.Delay(200);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | Chụp ảnh camera");
|
||||
|
||||
var plateVideoFrame = plateCamera.CurrentFrame;
|
||||
FinalPlateResult result = await ProcessFrameImage(plateProcessor, plateVideoFrame, isRetryMode);
|
||||
pictureBoxPlateImage.UpdateImage(result.PlateImage.ToBitmap());
|
||||
|
||||
var overviewVideoFrame = overviewCamera.CurrentFrame;
|
||||
pictureBoxOverviewImage.UpdateImage(overviewVideoFrame.ToBitmap());
|
||||
|
||||
var cardInformation = await apiController.GetCardInformation(cardNumber);
|
||||
|
||||
var saveLogResult = await apiController.SaveLog(LaneDirection.In, cardInformation.CardRealID.ToString(), cameraId, result.PlateType, DateTime.Now.GetTimeFormatted(), result.PlateString, result.PlateImage, result.PlateImage, result.PlateImage, overviewVideoFrame);
|
||||
|
||||
if (saveLogResult == null)
|
||||
{
|
||||
pictureBoxPlateImage.Image?.Dispose();
|
||||
pictureBoxPlateImage.Image = result.ToBitmap();
|
||||
}));
|
||||
lblStatusInfo.UpdateLabel("KHÔNG CÓ KẾT NỐI ĐẾN MÁY CHỦ", Color.Red);
|
||||
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: KHÔNG CÓ KẾT NỐI ĐẾN MÁY CHỦ - KHÔNG LƯU ĐƯỢC LOG");
|
||||
return;
|
||||
}
|
||||
|
||||
ShowCardInfoOnUI(cardNumber, result.PlateString, cardInformation.CardType, DateTime.Now.GetTimeFormatted());
|
||||
|
||||
if (saveLogResult.Status)
|
||||
{
|
||||
if (isAutoOpenDoor && DoorId == doorId)
|
||||
{
|
||||
OpenDoor(doorId);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | biển số: {result.PlateString} | Đã mở cửa");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: LƯU BẢN GHI LỖI");
|
||||
lblStatusInfo.UpdateLabel("LƯU BẢN GHI LỖI", Color.Red);
|
||||
}
|
||||
}
|
||||
|
||||
private void PlateCamera_OnOpenVideoStreamFailed(Mat videoFrame)
|
||||
{
|
||||
pictureBoxPlateVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
|
||||
private void OverviewCamera_OnOpenVideoStreamFailed(Mat videoFrame)
|
||||
{
|
||||
pictureBoxOverviewVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
|
||||
private void ClearPlateAndOverviewImage()
|
||||
{
|
||||
pictureBoxPlateImage.UpdateImage(null);
|
||||
pictureBoxOverviewImage.UpdateImage(null);
|
||||
}
|
||||
|
||||
private void OpenDoor(int doorId)
|
||||
{
|
||||
if (doorControlAccess.OpenDoor(doorId).HasError)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG THỂ MỞ CỬA", Color.Red);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<FinalPlateResult> ProcessFrameImage(PlateProcessor plateProcessor, Mat frame, bool isRetryMode)
|
||||
{
|
||||
var starTime = DateTime.Now;
|
||||
Cv2.Resize(frame, frame, new OpenCvSharp.Size(1280, 720));
|
||||
roiBoxRect = Util.ConvertRectangleToRect(pictureBoxRoi, pictureBoxPlateVideo);
|
||||
Mat frameRoi = frame[roiBoxRect];
|
||||
try
|
||||
{
|
||||
|
||||
FinalPlateResult finalPlateResult = await plateProcessor.ProcessPlate(frameRoi);
|
||||
|
||||
if (isRetryMode && !plateProcessor.IsPlateStringValid(finalPlateResult.PlateString))
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
overviewCamera.RequestCaptureOneFrame();
|
||||
finalPlateResult = await plateProcessor.ProcessPlate(frameRoi);
|
||||
Console.WriteLine("ProcessFrameImage Retry Mode");
|
||||
}
|
||||
appLogger.Log(LogLevel.Info, $"ProcessFrameImage: {(DateTime.Now - starTime).TotalMilliseconds} ms");
|
||||
return finalPlateResult;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"ProcessFrameImage\texMessage: {ex.Message}");
|
||||
appLogger.Log(LogLevel.Info, $"ProcessFrameImage: ex: {ex.Message}");
|
||||
return new FinalPlateResult
|
||||
{
|
||||
PlateImage = frameRoi,
|
||||
PlateString = string.Empty,
|
||||
PlateType = PlateType.Square
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
plateCamera.Stop();
|
||||
overviewCamera.Stop();
|
||||
|
||||
pictureBoxPlateImage.UpdateImage(null);
|
||||
pictureBoxPlateVideo.UpdateImage(null);
|
||||
|
||||
pictureBoxOverviewImage.UpdateImage(null);
|
||||
pictureBoxOverviewVideo.UpdateImage(null);
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
plateCamera.Start();
|
||||
overviewCamera.Start();
|
||||
}
|
||||
|
||||
private void ShowCardInfoOnUI(string cardNumber, string plateString, string cardType, string cardTime)
|
||||
{
|
||||
lblCardNumber.UpdateLabel($"Số thẻ: {cardNumber}");
|
||||
lblPlateString.UpdateLabel($"Biển số: {plateString}");
|
||||
lblCardType.UpdateLabel($"Loại thẻ: {cardType}");
|
||||
lblCardTime.UpdateLabel($"Thời gian: {cardTime}");
|
||||
lblStatusInfo.UpdateLabel(string.IsNullOrEmpty(plateString) ? "KHÔNG NHẬN DIỆN ĐƯỢC BIỂN SỐ" : $"MỜI XE {plateString} QUA", string.IsNullOrEmpty(plateString) ? Color.Red : Color.Green);
|
||||
}
|
||||
|
||||
private void OverviewCameraOnVideoFrameReceived(Mat videoFrame)
|
||||
{
|
||||
pictureBoxOverviewVideo.Invoke(new Action(() =>
|
||||
{
|
||||
pictureBoxOverviewVideo.Image?.Dispose();
|
||||
pictureBoxOverviewVideo.Image = videoFrame.ToBitmap();
|
||||
}));
|
||||
pictureBoxOverviewVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
|
||||
private void PlateCameraOnVideoFrameReceived(Mat videoFrame)
|
||||
{
|
||||
pictureBoxPlateVideo.Invoke(new Action(() =>
|
||||
{
|
||||
pictureBoxPlateVideo.Image?.Dispose();
|
||||
pictureBoxPlateVideo.Image = videoFrame.ToBitmap();
|
||||
}));
|
||||
pictureBoxPlateVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
|
||||
private void CaptureAllCamera(object sender, EventArgs e)
|
||||
private void ConnectToDoorAccessControl()
|
||||
{
|
||||
this.plateCamera.RequestCaptureOneFrame();
|
||||
this.overviewCamera.RequestCaptureOneFrame();
|
||||
if (!doorControlAccess.Connect().HasError)
|
||||
{
|
||||
_ = doorControlAccess.GetLogToReceiveNewCard();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG THỂ KẾT NỐI TỚI C3200", Color.Purple);
|
||||
}
|
||||
}
|
||||
|
||||
private void LaneIn_Load(object sender, EventArgs e)
|
||||
{
|
||||
doorControlAccess.OnNewCardReceived += C3Device_OnNewCardReceived;
|
||||
plateCamera.OnVideoFrameReceived += PlateCameraOnVideoFrameReceived;
|
||||
plateCamera.OnOpenVideoStreamFailed += PlateCamera_OnOpenVideoStreamFailed;
|
||||
|
||||
overviewCamera.OnVideoFrameReceived += OverviewCameraOnVideoFrameReceived;
|
||||
overviewCamera.OnOpenVideoStreamFailed += OverviewCamera_OnOpenVideoStreamFailed;
|
||||
ConnectToDoorAccessControl();
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
StartPoint = e.Location;
|
||||
pictureBoxRoi = new Rectangle(StartPoint, new System.Drawing.Size(0, 0));
|
||||
IsDrawBox = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (IsDrawBox)
|
||||
{
|
||||
CurrentCursorPosition = e.Location;
|
||||
pictureBoxRoi.Width = CurrentCursorPosition.X - StartPoint.X;
|
||||
pictureBoxRoi.Height = CurrentCursorPosition.Y - StartPoint.Y;
|
||||
}
|
||||
Refresh();
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_MouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
IsDrawBox = false;
|
||||
if (StartPoint.X + pictureBoxRoi.Width > pictureBoxPlateVideo.Width || StartPoint.Y + pictureBoxRoi.Height > pictureBoxPlateVideo.Height)
|
||||
{
|
||||
pictureBoxRoi.X = pictureBoxRoi.Y = 0;
|
||||
pictureBoxRoi.Width = pictureBoxPlateVideo.Width;
|
||||
pictureBoxRoi.Height = pictureBoxPlateVideo.Height;
|
||||
}
|
||||
apiController.SaveRoiToServer(pictureBoxRoi, cameraId);
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
Pen redPen = new Pen(Color.FromArgb(255, 255, 0, 0), 3);
|
||||
e.Graphics.DrawRectangle(redPen, pictureBoxRoi);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,4 +117,52 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="pictureBoxPlateImage.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxPlateVideo.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="grbPlateCamera.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxOverviewImage.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxOverviewVideo.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="grbOverviewCamera.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblLaneLabel.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardType.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardNumber.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="grbCardInformation.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardTime.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblPlateString.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardTime.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblPlateString.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblStatusInfo.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
</root>
|
||||
373
AIParkingApplication/LaneOut.Designer.cs
generated
373
AIParkingApplication/LaneOut.Designer.cs
generated
@@ -28,214 +28,283 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.backgroundWorker2 = new System.ComponentModel.BackgroundWorker();
|
||||
this.pictureBox5 = new System.Windows.Forms.PictureBox();
|
||||
this.pictureBox6 = new System.Windows.Forms.PictureBox();
|
||||
this.grbPlateRefernce = new System.Windows.Forms.GroupBox();
|
||||
this.pictureBox2 = new System.Windows.Forms.PictureBox();
|
||||
this.pictureBox1 = new System.Windows.Forms.PictureBox();
|
||||
this.grbPlateCamera = new System.Windows.Forms.GroupBox();
|
||||
this.pictureBox4 = new System.Windows.Forms.PictureBox();
|
||||
this.pictureBox3 = new System.Windows.Forms.PictureBox();
|
||||
this.grbOverviewCamera = new System.Windows.Forms.GroupBox();
|
||||
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
|
||||
this.lblLaneLabel = new System.Windows.Forms.Label();
|
||||
this.lblCardNumber = new System.Windows.Forms.Label();
|
||||
this.lblMoneyAmount = new System.Windows.Forms.Label();
|
||||
this.lblCardType = new System.Windows.Forms.Label();
|
||||
this.pictureBoxOverviewImageIn = new System.Windows.Forms.PictureBox();
|
||||
this.pictureBoxPlateImageIn = new System.Windows.Forms.PictureBox();
|
||||
this.grbCardInformation = new System.Windows.Forms.GroupBox();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).BeginInit();
|
||||
this.lblCardType = new System.Windows.Forms.Label();
|
||||
this.lblCardTimeOut = new System.Windows.Forms.Label();
|
||||
this.lblCardTime = new System.Windows.Forms.Label();
|
||||
this.lblMoneyAmount = new System.Windows.Forms.Label();
|
||||
this.lblPlateString = new System.Windows.Forms.Label();
|
||||
this.lblCardNumber = new System.Windows.Forms.Label();
|
||||
this.pictureBoxPlateImage = new System.Windows.Forms.PictureBox();
|
||||
this.pictureBoxPlateVideo = new System.Windows.Forms.PictureBox();
|
||||
this.grbPlateCamera = new System.Windows.Forms.GroupBox();
|
||||
this.pictureBoxOverviewImage = new System.Windows.Forms.PictureBox();
|
||||
this.pictureBoxOverviewVideo = new System.Windows.Forms.PictureBox();
|
||||
this.grbOverviewCamera = new System.Windows.Forms.GroupBox();
|
||||
this.lblLaneLabel = new System.Windows.Forms.Label();
|
||||
this.lblStatusInfo = new System.Windows.Forms.Label();
|
||||
this.grbPlateRefernce.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
|
||||
this.grbPlateCamera.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
|
||||
this.grbOverviewCamera.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxOverviewImageIn)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateImageIn)).BeginInit();
|
||||
this.grbCardInformation.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateImage)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateVideo)).BeginInit();
|
||||
this.grbPlateCamera.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxOverviewImage)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxOverviewVideo)).BeginInit();
|
||||
this.grbOverviewCamera.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// pictureBox5
|
||||
//
|
||||
this.pictureBox5.Location = new System.Drawing.Point(6, 23);
|
||||
this.pictureBox5.Name = "pictureBox5";
|
||||
this.pictureBox5.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBox5.TabIndex = 0;
|
||||
this.pictureBox5.TabStop = false;
|
||||
//
|
||||
// pictureBox6
|
||||
//
|
||||
this.pictureBox6.Location = new System.Drawing.Point(6, 296);
|
||||
this.pictureBox6.Name = "pictureBox6";
|
||||
this.pictureBox6.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBox6.TabIndex = 0;
|
||||
this.pictureBox6.TabStop = false;
|
||||
//
|
||||
// grbPlateRefernce
|
||||
//
|
||||
this.grbPlateRefernce.Controls.Add(this.pictureBox6);
|
||||
this.grbPlateRefernce.Controls.Add(this.pictureBox5);
|
||||
this.grbPlateRefernce.Controls.Add(this.pictureBoxOverviewImageIn);
|
||||
this.grbPlateRefernce.Controls.Add(this.pictureBoxPlateImageIn);
|
||||
this.grbPlateRefernce.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbPlateRefernce.Location = new System.Drawing.Point(445, 171);
|
||||
this.grbPlateRefernce.Location = new System.Drawing.Point(453, 208);
|
||||
this.grbPlateRefernce.Name = "grbPlateRefernce";
|
||||
this.grbPlateRefernce.Size = new System.Drawing.Size(212, 510);
|
||||
this.grbPlateRefernce.Size = new System.Drawing.Size(226, 484);
|
||||
this.grbPlateRefernce.TabIndex = 9;
|
||||
this.grbPlateRefernce.TabStop = false;
|
||||
this.grbPlateRefernce.Text = "THAM CHIẾU BIỂN SỐ VÀO";
|
||||
this.grbPlateRefernce.Text = "Tham chiếu vào";
|
||||
//
|
||||
// pictureBox2
|
||||
// pictureBoxOverviewImageIn
|
||||
//
|
||||
this.pictureBox2.Location = new System.Drawing.Point(6, 23);
|
||||
this.pictureBox2.Name = "pictureBox2";
|
||||
this.pictureBox2.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBox2.TabIndex = 0;
|
||||
this.pictureBox2.TabStop = false;
|
||||
this.pictureBoxOverviewImageIn.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.pictureBoxOverviewImageIn.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxOverviewImageIn.Location = new System.Drawing.Point(13, 270);
|
||||
this.pictureBoxOverviewImageIn.Name = "pictureBoxOverviewImageIn";
|
||||
this.pictureBoxOverviewImageIn.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxOverviewImageIn.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxOverviewImageIn.TabIndex = 0;
|
||||
this.pictureBoxOverviewImageIn.TabStop = false;
|
||||
//
|
||||
// pictureBox1
|
||||
// pictureBoxPlateImageIn
|
||||
//
|
||||
this.pictureBox1.Location = new System.Drawing.Point(212, 23);
|
||||
this.pictureBox1.Name = "pictureBox1";
|
||||
this.pictureBox1.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBox1.TabIndex = 0;
|
||||
this.pictureBox1.TabStop = false;
|
||||
this.pictureBoxPlateImageIn.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||
this.pictureBoxPlateImageIn.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxPlateImageIn.Location = new System.Drawing.Point(13, 23);
|
||||
this.pictureBoxPlateImageIn.Name = "pictureBoxPlateImageIn";
|
||||
this.pictureBoxPlateImageIn.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxPlateImageIn.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxPlateImageIn.TabIndex = 0;
|
||||
this.pictureBoxPlateImageIn.TabStop = false;
|
||||
//
|
||||
// grbPlateCamera
|
||||
// grbCardInformation
|
||||
//
|
||||
this.grbPlateCamera.Controls.Add(this.pictureBox1);
|
||||
this.grbPlateCamera.Controls.Add(this.pictureBox2);
|
||||
this.grbPlateCamera.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbPlateCamera.Location = new System.Drawing.Point(15, 171);
|
||||
this.grbPlateCamera.Name = "grbPlateCamera";
|
||||
this.grbPlateCamera.Size = new System.Drawing.Size(424, 238);
|
||||
this.grbPlateCamera.TabIndex = 7;
|
||||
this.grbPlateCamera.TabStop = false;
|
||||
this.grbPlateCamera.Text = "CAMERA BIỂN SỐ";
|
||||
this.grbCardInformation.Controls.Add(this.lblCardType);
|
||||
this.grbCardInformation.Controls.Add(this.lblCardTimeOut);
|
||||
this.grbCardInformation.Controls.Add(this.lblCardTime);
|
||||
this.grbCardInformation.Controls.Add(this.lblMoneyAmount);
|
||||
this.grbCardInformation.Controls.Add(this.lblPlateString);
|
||||
this.grbCardInformation.Controls.Add(this.lblCardNumber);
|
||||
this.grbCardInformation.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbCardInformation.Location = new System.Drawing.Point(1, 55);
|
||||
this.grbCardInformation.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.grbCardInformation.Name = "grbCardInformation";
|
||||
this.grbCardInformation.Size = new System.Drawing.Size(678, 104);
|
||||
this.grbCardInformation.TabIndex = 19;
|
||||
this.grbCardInformation.TabStop = false;
|
||||
this.grbCardInformation.Text = "Thông tin thẻ";
|
||||
//
|
||||
// pictureBox4
|
||||
// lblCardType
|
||||
//
|
||||
this.pictureBox4.Location = new System.Drawing.Point(6, 24);
|
||||
this.pictureBox4.Name = "pictureBox4";
|
||||
this.pictureBox4.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBox4.TabIndex = 0;
|
||||
this.pictureBox4.TabStop = false;
|
||||
this.lblCardType.AutoSize = true;
|
||||
this.lblCardType.Location = new System.Drawing.Point(12, 64);
|
||||
this.lblCardType.Name = "lblCardType";
|
||||
this.lblCardType.Size = new System.Drawing.Size(64, 18);
|
||||
this.lblCardType.TabIndex = 0;
|
||||
this.lblCardType.Text = "Loại thẻ:";
|
||||
//
|
||||
// pictureBox3
|
||||
// lblCardTimeOut
|
||||
//
|
||||
this.pictureBox3.Location = new System.Drawing.Point(212, 24);
|
||||
this.pictureBox3.Name = "pictureBox3";
|
||||
this.pictureBox3.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBox3.TabIndex = 0;
|
||||
this.pictureBox3.TabStop = false;
|
||||
this.lblCardTimeOut.AutoSize = true;
|
||||
this.lblCardTimeOut.Location = new System.Drawing.Point(462, 64);
|
||||
this.lblCardTimeOut.Name = "lblCardTimeOut";
|
||||
this.lblCardTimeOut.Size = new System.Drawing.Size(31, 18);
|
||||
this.lblCardTimeOut.TabIndex = 0;
|
||||
this.lblCardTimeOut.Text = "Ra:";
|
||||
//
|
||||
// grbOverviewCamera
|
||||
// lblCardTime
|
||||
//
|
||||
this.grbOverviewCamera.Controls.Add(this.pictureBox3);
|
||||
this.grbOverviewCamera.Controls.Add(this.pictureBox4);
|
||||
this.grbOverviewCamera.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbOverviewCamera.Location = new System.Drawing.Point(15, 443);
|
||||
this.grbOverviewCamera.Name = "grbOverviewCamera";
|
||||
this.grbOverviewCamera.Size = new System.Drawing.Size(424, 238);
|
||||
this.grbOverviewCamera.TabIndex = 6;
|
||||
this.grbOverviewCamera.TabStop = false;
|
||||
this.grbOverviewCamera.Text = "CAMERA TOÀN CẢNH";
|
||||
this.lblCardTime.AutoSize = true;
|
||||
this.lblCardTime.Location = new System.Drawing.Point(223, 64);
|
||||
this.lblCardTime.Name = "lblCardTime";
|
||||
this.lblCardTime.Size = new System.Drawing.Size(38, 18);
|
||||
this.lblCardTime.TabIndex = 0;
|
||||
this.lblCardTime.Text = "Vào:";
|
||||
//
|
||||
// lblLaneLabel
|
||||
// lblMoneyAmount
|
||||
//
|
||||
this.lblLaneLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.lblLaneLabel.AutoSize = true;
|
||||
this.lblLaneLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblLaneLabel.Location = new System.Drawing.Point(262, 22);
|
||||
this.lblLaneLabel.Name = "lblLaneLabel";
|
||||
this.lblLaneLabel.Size = new System.Drawing.Size(141, 39);
|
||||
this.lblLaneLabel.TabIndex = 5;
|
||||
this.lblLaneLabel.Text = "LÀN RA";
|
||||
this.lblMoneyAmount.AutoSize = true;
|
||||
this.lblMoneyAmount.Location = new System.Drawing.Point(462, 31);
|
||||
this.lblMoneyAmount.Name = "lblMoneyAmount";
|
||||
this.lblMoneyAmount.Size = new System.Drawing.Size(58, 18);
|
||||
this.lblMoneyAmount.TabIndex = 0;
|
||||
this.lblMoneyAmount.Text = "Số tiền:";
|
||||
//
|
||||
// lblPlateString
|
||||
//
|
||||
this.lblPlateString.AutoSize = true;
|
||||
this.lblPlateString.Location = new System.Drawing.Point(223, 31);
|
||||
this.lblPlateString.Name = "lblPlateString";
|
||||
this.lblPlateString.Size = new System.Drawing.Size(62, 18);
|
||||
this.lblPlateString.TabIndex = 0;
|
||||
this.lblPlateString.Text = "Biển số:";
|
||||
//
|
||||
// lblCardNumber
|
||||
//
|
||||
this.lblCardNumber.AutoSize = true;
|
||||
this.lblCardNumber.Location = new System.Drawing.Point(12, 31);
|
||||
this.lblCardNumber.Name = "lblCardNumber";
|
||||
this.lblCardNumber.Size = new System.Drawing.Size(51, 18);
|
||||
this.lblCardNumber.Size = new System.Drawing.Size(55, 18);
|
||||
this.lblCardNumber.TabIndex = 0;
|
||||
this.lblCardNumber.Text = "Số thẻ";
|
||||
this.lblCardNumber.Text = "Số thẻ:";
|
||||
//
|
||||
// lblMoneyAmount
|
||||
// pictureBoxPlateImage
|
||||
//
|
||||
this.lblMoneyAmount.AutoSize = true;
|
||||
this.lblMoneyAmount.Location = new System.Drawing.Point(209, 31);
|
||||
this.lblMoneyAmount.Name = "lblMoneyAmount";
|
||||
this.lblMoneyAmount.Size = new System.Drawing.Size(54, 18);
|
||||
this.lblMoneyAmount.TabIndex = 0;
|
||||
this.lblMoneyAmount.Text = "Số tiền";
|
||||
this.pictureBoxPlateImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxPlateImage.Location = new System.Drawing.Point(226, 23);
|
||||
this.pictureBoxPlateImage.Name = "pictureBoxPlateImage";
|
||||
this.pictureBoxPlateImage.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxPlateImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxPlateImage.TabIndex = 0;
|
||||
this.pictureBoxPlateImage.TabStop = false;
|
||||
//
|
||||
// lblCardType
|
||||
// pictureBoxPlateVideo
|
||||
//
|
||||
this.lblCardType.AutoSize = true;
|
||||
this.lblCardType.Location = new System.Drawing.Point(12, 59);
|
||||
this.lblCardType.Name = "lblCardType";
|
||||
this.lblCardType.Size = new System.Drawing.Size(60, 18);
|
||||
this.lblCardType.TabIndex = 0;
|
||||
this.lblCardType.Text = "Loại thẻ";
|
||||
this.pictureBoxPlateVideo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxPlateVideo.Location = new System.Drawing.Point(15, 23);
|
||||
this.pictureBoxPlateVideo.Name = "pictureBoxPlateVideo";
|
||||
this.pictureBoxPlateVideo.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxPlateVideo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxPlateVideo.TabIndex = 0;
|
||||
this.pictureBoxPlateVideo.TabStop = false;
|
||||
this.pictureBoxPlateVideo.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBoxPlateVideo_Paint);
|
||||
this.pictureBoxPlateVideo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBoxPlateVideo_MouseDown);
|
||||
this.pictureBoxPlateVideo.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBoxPlateVideo_MouseMove);
|
||||
this.pictureBoxPlateVideo.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBoxPlateVideo_MouseUp);
|
||||
//
|
||||
// grbCardInformation
|
||||
// grbPlateCamera
|
||||
//
|
||||
this.grbCardInformation.Controls.Add(this.lblCardType);
|
||||
this.grbCardInformation.Controls.Add(this.lblMoneyAmount);
|
||||
this.grbCardInformation.Controls.Add(this.lblCardNumber);
|
||||
this.grbCardInformation.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbCardInformation.Location = new System.Drawing.Point(15, 69);
|
||||
this.grbCardInformation.Name = "grbCardInformation";
|
||||
this.grbCardInformation.Size = new System.Drawing.Size(642, 91);
|
||||
this.grbCardInformation.TabIndex = 8;
|
||||
this.grbCardInformation.TabStop = false;
|
||||
this.grbCardInformation.Text = "THÔNG TIN THẺ";
|
||||
this.grbPlateCamera.Controls.Add(this.pictureBoxPlateImage);
|
||||
this.grbPlateCamera.Controls.Add(this.pictureBoxPlateVideo);
|
||||
this.grbPlateCamera.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbPlateCamera.Location = new System.Drawing.Point(1, 208);
|
||||
this.grbPlateCamera.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.grbPlateCamera.Name = "grbPlateCamera";
|
||||
this.grbPlateCamera.Size = new System.Drawing.Size(439, 238);
|
||||
this.grbPlateCamera.TabIndex = 18;
|
||||
this.grbPlateCamera.TabStop = false;
|
||||
this.grbPlateCamera.Text = "Camera biển số";
|
||||
//
|
||||
// pictureBoxOverviewImage
|
||||
//
|
||||
this.pictureBoxOverviewImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxOverviewImage.Location = new System.Drawing.Point(226, 24);
|
||||
this.pictureBoxOverviewImage.Name = "pictureBoxOverviewImage";
|
||||
this.pictureBoxOverviewImage.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxOverviewImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxOverviewImage.TabIndex = 0;
|
||||
this.pictureBoxOverviewImage.TabStop = false;
|
||||
//
|
||||
// pictureBoxOverviewVideo
|
||||
//
|
||||
this.pictureBoxOverviewVideo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.pictureBoxOverviewVideo.Location = new System.Drawing.Point(15, 24);
|
||||
this.pictureBoxOverviewVideo.Name = "pictureBoxOverviewVideo";
|
||||
this.pictureBoxOverviewVideo.Size = new System.Drawing.Size(200, 200);
|
||||
this.pictureBoxOverviewVideo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxOverviewVideo.TabIndex = 0;
|
||||
this.pictureBoxOverviewVideo.TabStop = false;
|
||||
//
|
||||
// grbOverviewCamera
|
||||
//
|
||||
this.grbOverviewCamera.Controls.Add(this.pictureBoxOverviewImage);
|
||||
this.grbOverviewCamera.Controls.Add(this.pictureBoxOverviewVideo);
|
||||
this.grbOverviewCamera.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbOverviewCamera.Location = new System.Drawing.Point(1, 454);
|
||||
this.grbOverviewCamera.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.grbOverviewCamera.Name = "grbOverviewCamera";
|
||||
this.grbOverviewCamera.Size = new System.Drawing.Size(439, 238);
|
||||
this.grbOverviewCamera.TabIndex = 17;
|
||||
this.grbOverviewCamera.TabStop = false;
|
||||
this.grbOverviewCamera.Text = "Camera toàn cảnh";
|
||||
//
|
||||
// lblLaneLabel
|
||||
//
|
||||
this.lblLaneLabel.BackColor = System.Drawing.Color.Red;
|
||||
this.lblLaneLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 26.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblLaneLabel.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.lblLaneLabel.Location = new System.Drawing.Point(1, 1);
|
||||
this.lblLaneLabel.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lblLaneLabel.Name = "lblLaneLabel";
|
||||
this.lblLaneLabel.Size = new System.Drawing.Size(678, 50);
|
||||
this.lblLaneLabel.TabIndex = 16;
|
||||
this.lblLaneLabel.Text = "LÀN RA";
|
||||
this.lblLaneLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblStatusInfo
|
||||
//
|
||||
this.lblStatusInfo.BackColor = System.Drawing.Color.CornflowerBlue;
|
||||
this.lblStatusInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblStatusInfo.ForeColor = System.Drawing.SystemColors.Control;
|
||||
this.lblStatusInfo.Location = new System.Drawing.Point(1, 159);
|
||||
this.lblStatusInfo.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.lblStatusInfo.Name = "lblStatusInfo";
|
||||
this.lblStatusInfo.Size = new System.Drawing.Size(678, 40);
|
||||
this.lblStatusInfo.TabIndex = 20;
|
||||
this.lblStatusInfo.Text = "XIN CHÀO";
|
||||
this.lblStatusInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// LaneOut
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.grbPlateRefernce);
|
||||
this.Controls.Add(this.grbCardInformation);
|
||||
this.Controls.Add(this.lblLaneLabel);
|
||||
this.Controls.Add(this.grbOverviewCamera);
|
||||
this.Controls.Add(this.grbPlateCamera);
|
||||
this.Controls.Add(this.grbOverviewCamera);
|
||||
this.Controls.Add(this.lblLaneLabel);
|
||||
this.Controls.Add(this.lblStatusInfo);
|
||||
this.Controls.Add(this.grbPlateRefernce);
|
||||
this.Name = "LaneOut";
|
||||
this.Size = new System.Drawing.Size(671, 694);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox6)).EndInit();
|
||||
this.Size = new System.Drawing.Size(680, 692);
|
||||
this.Load += new System.EventHandler(this.LaneOut_Load);
|
||||
this.grbPlateRefernce.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
|
||||
this.grbPlateCamera.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
|
||||
this.grbOverviewCamera.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxOverviewImageIn)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateImageIn)).EndInit();
|
||||
this.grbCardInformation.ResumeLayout(false);
|
||||
this.grbCardInformation.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateImage)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxPlateVideo)).EndInit();
|
||||
this.grbPlateCamera.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxOverviewImage)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxOverviewVideo)).EndInit();
|
||||
this.grbOverviewCamera.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.ComponentModel.BackgroundWorker backgroundWorker2;
|
||||
private System.Windows.Forms.PictureBox pictureBox5;
|
||||
private System.Windows.Forms.PictureBox pictureBox6;
|
||||
private System.Windows.Forms.GroupBox grbPlateRefernce;
|
||||
private System.Windows.Forms.PictureBox pictureBox2;
|
||||
private System.Windows.Forms.PictureBox pictureBox1;
|
||||
private System.Windows.Forms.GroupBox grbPlateCamera;
|
||||
private System.Windows.Forms.PictureBox pictureBox4;
|
||||
private System.Windows.Forms.PictureBox pictureBox3;
|
||||
private System.Windows.Forms.GroupBox grbOverviewCamera;
|
||||
private System.ComponentModel.BackgroundWorker backgroundWorker1;
|
||||
private System.Windows.Forms.Label lblLaneLabel;
|
||||
private System.Windows.Forms.Label lblCardNumber;
|
||||
private System.Windows.Forms.Label lblMoneyAmount;
|
||||
private System.Windows.Forms.Label lblCardType;
|
||||
private System.Windows.Forms.PictureBox pictureBoxOverviewImageIn;
|
||||
private System.Windows.Forms.PictureBox pictureBoxPlateImageIn;
|
||||
private System.Windows.Forms.GroupBox grbCardInformation;
|
||||
private System.Windows.Forms.Label lblCardType;
|
||||
private System.Windows.Forms.Label lblCardTime;
|
||||
private System.Windows.Forms.Label lblPlateString;
|
||||
private System.Windows.Forms.Label lblCardNumber;
|
||||
private System.Windows.Forms.PictureBox pictureBoxPlateImage;
|
||||
private System.Windows.Forms.PictureBox pictureBoxPlateVideo;
|
||||
private System.Windows.Forms.GroupBox grbPlateCamera;
|
||||
private System.Windows.Forms.PictureBox pictureBoxOverviewImage;
|
||||
private System.Windows.Forms.PictureBox pictureBoxOverviewVideo;
|
||||
private System.Windows.Forms.GroupBox grbOverviewCamera;
|
||||
private System.Windows.Forms.Label lblLaneLabel;
|
||||
private System.Windows.Forms.Label lblStatusInfo;
|
||||
private System.Windows.Forms.Label lblMoneyAmount;
|
||||
private System.Windows.Forms.Label lblCardTimeOut;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,369 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Configuration;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using NLog;
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Extensions;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class LaneOut : UserControl
|
||||
public partial class LaneOut : UserControl, ILane
|
||||
{
|
||||
public LaneOut()
|
||||
private Camera overviewCamera;
|
||||
private Camera plateCamera;
|
||||
private PlateProcessor plateProcessor;
|
||||
public int DoorId { get; set; }
|
||||
private string cameraId;
|
||||
private bool isSupportSquarePlate;
|
||||
private bool isSupportLongPlate;
|
||||
private bool isAutoOpenDoor;
|
||||
private bool isRetryMode;
|
||||
private IDoorControlAccess doorControlAccess;
|
||||
private ApiController apiController;
|
||||
private Printer printer;
|
||||
private Logger appLogger;
|
||||
private bool isUsePrinter;
|
||||
|
||||
private System.Drawing.Point StartPoint { get; set; }
|
||||
private System.Drawing.Point CurrentCursorPosition { get; set; }
|
||||
private Rectangle pictureBoxRoi;
|
||||
private bool IsDrawBox { get; set; }
|
||||
private Rect roiBoxRect;
|
||||
|
||||
public LaneOut(int doorId,
|
||||
string cameraId,
|
||||
string plateStream,
|
||||
string overviewStream,
|
||||
IDoorControlAccess doorControlAccess,
|
||||
ApiController apiController,
|
||||
EngineApiController engineApiController,
|
||||
Logger appLogger,
|
||||
string roiConfig,
|
||||
bool isSupportSquarePlate = true,
|
||||
bool isSupportLongPlate = false,
|
||||
bool isAutoOpenDoor = true,
|
||||
bool isRetryMode = false)
|
||||
{
|
||||
InitializeComponent();
|
||||
this.appLogger = appLogger;
|
||||
DoorId = doorId;
|
||||
this.cameraId = cameraId;
|
||||
this.isSupportSquarePlate = isSupportSquarePlate;
|
||||
this.isSupportLongPlate = isSupportLongPlate;
|
||||
this.isAutoOpenDoor = isAutoOpenDoor;
|
||||
this.isRetryMode = isRetryMode;
|
||||
overviewCamera = new Camera(overviewStream);
|
||||
plateCamera = new Camera(plateStream);
|
||||
this.apiController = apiController;
|
||||
this.doorControlAccess = doorControlAccess;
|
||||
printer = new Printer(appLogger);
|
||||
plateProcessor = new PlateProcessor(engineApiController, this.isSupportSquarePlate, this.isSupportLongPlate);
|
||||
ReadUsePrinterConfig();
|
||||
this.pictureBoxRoi = Util.ConvertStringToRectangle(roiConfig);
|
||||
}
|
||||
|
||||
private async void C3Device_OnNewCardReceived(int doorId, string cardNumber)
|
||||
{
|
||||
if (DoorId != doorId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
ClearPlateAndOverviewImage();
|
||||
ClearPlateAndOverviewImageIn();
|
||||
var cardInfoResult = await apiController.GetCardInformation(cardNumber);
|
||||
if (cardInfoResult == null)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG THỂ KẾT NỐI SERVER", Color.Purple);
|
||||
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | lỗi: KHÔNG THỂ KẾT NỐI TỚI SERVER");
|
||||
return;
|
||||
}
|
||||
if (!cardInfoResult.IsValid)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("THẺ KHÔNG HỢP LỆ", Color.Purple);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | lỗi: THẺ KHÔNG HỢP LỆ");
|
||||
return;
|
||||
}
|
||||
|
||||
if (cardInfoResult.Direction != "out")
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("CHƯA NHẬN THẺ VÀO", Color.Red);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | lỗi: CHƯA NHẬN THẺ VÀO");
|
||||
return;
|
||||
}
|
||||
|
||||
Bitmap plateImageIn = Util.ConvertFromBase64Image(cardInfoResult.PlateImageBase64);
|
||||
Bitmap overviewImageIn = Util.ConvertFromBase64Image(cardInfoResult.FrameImageBase64);
|
||||
|
||||
pictureBoxPlateImageIn.UpdateImage(plateImageIn);
|
||||
pictureBoxOverviewImageIn.UpdateImage(overviewImageIn);
|
||||
|
||||
plateCamera.RequestCaptureOneFrame();
|
||||
overviewCamera.RequestCaptureOneFrame();
|
||||
await Task.Delay(200);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | Chụp ảnh camera");
|
||||
|
||||
var plateVideoFrame = plateCamera.CurrentFrame;
|
||||
FinalPlateResult result = await ProcessFrameImage(plateProcessor, plateVideoFrame, isRetryMode);
|
||||
pictureBoxPlateImage.UpdateImage(result.PlateImage.ToBitmap());
|
||||
|
||||
var overviewVideoFrame = overviewCamera.CurrentFrame;
|
||||
pictureBoxOverviewImage.UpdateImage(overviewVideoFrame.ToBitmap());
|
||||
|
||||
var cardInformation = await apiController.GetCardInformation(cardNumber);
|
||||
|
||||
var saveLogResult = await apiController.SaveLog(LaneDirection.Out, cardInformation.CardRealID.ToString(), cameraId, result.PlateType, DateTime.Now.GetTimeFormatted(), result.PlateString, result.PlateImage, result.PlateImage, result.PlateImage, overviewVideoFrame, cardInformation.LogID.ToString());
|
||||
|
||||
if (saveLogResult == null)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG CÓ KẾT NỐI ĐẾN MÁY CHỦ", Color.Red);
|
||||
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | lỗi: KHÔNG CÓ KẾT NỐI ĐẾN MÁY CHỦ - KHÔNG LƯU ĐƯỢC LOG");
|
||||
return;
|
||||
}
|
||||
|
||||
ShowCardInfoOnUI(cardNumber, result.PlateString, cardInformation.PlateString, cardInformation.CardType, cardInformation.TimeIn, DateTime.Now.GetTimeFormatted(), saveLogResult.Cost);
|
||||
|
||||
if (saveLogResult.Status)
|
||||
{
|
||||
if (isAutoOpenDoor)
|
||||
{
|
||||
OpenDoor(doorId);
|
||||
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | biển số: {result.PlateString} | Đã mở cửa");
|
||||
}
|
||||
|
||||
if (isUsePrinter)
|
||||
{
|
||||
PrinterData printerData = new PrinterData
|
||||
{
|
||||
PlateString = result.PlateString,
|
||||
MoneyAmount = saveLogResult.Cost,
|
||||
TimeParkingIn = cardInformation.TimeIn,
|
||||
TimeParkingOut = DateTime.Now.GetTimeFormatted()
|
||||
};
|
||||
printer.DoPrint(printerData);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} ra | số thẻ : {cardNumber} | lỗi: LƯU BẢN GHI LỖI");
|
||||
lblStatusInfo.UpdateLabel("LƯU BẢN GHI LỖI", Color.Red);
|
||||
}
|
||||
}
|
||||
|
||||
private void ReadUsePrinterConfig()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool.TryParse(ConfigurationManager.AppSettings[AppConstant.USE_PRINTER], out isUsePrinter);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.USE_PRINTER, "false");
|
||||
appLogger.Log(LogLevel.Error, $"Không thể đọc cấu hình: {AppConstant.USE_PRINTER}. ex: {ex.Message }");
|
||||
}
|
||||
}
|
||||
|
||||
private void PlateCamera_OnOpenVideoStreamFailed(Mat videoFrame)
|
||||
{
|
||||
pictureBoxPlateVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
|
||||
private void OverviewCamera_OnOpenVideoStreamFailed(Mat videoFrame)
|
||||
{
|
||||
pictureBoxOverviewVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
|
||||
private void ClearPlateAndOverviewImage()
|
||||
{
|
||||
pictureBoxPlateImage.UpdateImage(null);
|
||||
pictureBoxOverviewImage.UpdateImage(null);
|
||||
}
|
||||
|
||||
private void ClearPlateAndOverviewImageIn()
|
||||
{
|
||||
pictureBoxPlateImageIn.UpdateImage(null);
|
||||
pictureBoxOverviewImageIn.UpdateImage(null);
|
||||
}
|
||||
|
||||
private void OpenDoor(int doorId)
|
||||
{
|
||||
var openDoorResult = doorControlAccess.OpenDoor(doorId);
|
||||
if (openDoorResult.HasError)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG THỂ MỞ CỬA", Color.Red);
|
||||
appLogger.Log(LogLevel.Error, $"Không thể mở cửa {doorId}. Lỗi: {openDoorResult.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<FinalPlateResult> ProcessFrameImage(PlateProcessor plateProcessor, Mat frame, bool isRetryMode)
|
||||
{
|
||||
var starTime = DateTime.Now;
|
||||
Cv2.Resize(frame, frame, new OpenCvSharp.Size(1280, 720));
|
||||
Rect roiBoxRect = Util.ConvertRectangleToRect(pictureBoxRoi, pictureBoxPlateVideo);
|
||||
Mat frameRoi = frame[roiBoxRect];
|
||||
try
|
||||
{
|
||||
|
||||
FinalPlateResult finalPlateResult = await plateProcessor.ProcessPlate(frame);
|
||||
|
||||
if (isRetryMode && !plateProcessor.IsPlateStringValid(finalPlateResult.PlateString))
|
||||
{
|
||||
Console.WriteLine("ProcessFrameImage Retry Mode");
|
||||
Thread.Sleep(1000);
|
||||
overviewCamera.RequestCaptureOneFrame();
|
||||
finalPlateResult = await plateProcessor.ProcessPlate(frame);
|
||||
}
|
||||
appLogger.Log(LogLevel.Info, $"ProcessFrameImage: {(DateTime.Now - starTime).TotalMilliseconds} ms");
|
||||
return finalPlateResult;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"ProcessFrameImage\texMessage: {ex.Message}");
|
||||
return new FinalPlateResult
|
||||
{
|
||||
PlateImage = frame,
|
||||
PlateString = string.Empty,
|
||||
PlateType = PlateType.Square
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
plateCamera.Stop();
|
||||
overviewCamera.Stop();
|
||||
|
||||
pictureBoxPlateImage.UpdateImage(null);
|
||||
pictureBoxPlateVideo.UpdateImage(null);
|
||||
|
||||
pictureBoxOverviewImage.UpdateImage(null);
|
||||
pictureBoxOverviewVideo.UpdateImage(null);
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
plateCamera.Start();
|
||||
overviewCamera.Start();
|
||||
}
|
||||
|
||||
private void ShowCardInfoOnUI(string cardNumber, string plateStringEngine, string plateInString, string cardType, string cardTimeIn, string cardTimeOut, string money)
|
||||
{
|
||||
lblCardNumber.UpdateLabel($"Số thẻ: {cardNumber}");
|
||||
lblPlateString.UpdateLabel($"Biển số: {plateStringEngine}");
|
||||
lblCardType.UpdateLabel($"Loại thẻ: {cardType}");
|
||||
lblCardTime.UpdateLabel($"Vào: {cardTimeIn}");
|
||||
lblCardTimeOut.UpdateLabel($"Ra: {cardTimeOut}");
|
||||
|
||||
int.TryParse(money, out int moneyAmount);
|
||||
lblMoneyAmount.UpdateLabel($"Số tiền: {string.Format("{0:n0}", moneyAmount)} vnđ");
|
||||
|
||||
if (string.IsNullOrEmpty(plateStringEngine))
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG NHẬN DIỆN ĐƯỢC BIỂN SỐ", Color.Red);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (plateStringEngine != plateInString)
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("SO KHỚP BIỂN SỐ KHÔNG CHÍNH XÁC", Color.Red);
|
||||
}
|
||||
else
|
||||
{
|
||||
lblStatusInfo.UpdateLabel($"MỜI XE {plateStringEngine} QUA", Color.Green);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OverviewCameraOnVideoFrameReceived(Mat videoFrame)
|
||||
{
|
||||
try
|
||||
{
|
||||
pictureBoxOverviewVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"{Util.GetCurrentMethodName()}\texMessage: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void PlateCameraOnVideoFrameReceived(Mat videoFrame)
|
||||
{
|
||||
try
|
||||
{
|
||||
pictureBoxPlateVideo.UpdateImage(videoFrame.ToBitmap());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"{Util.GetCurrentMethodName()}\texMessage: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void ConnectToDoorAccessControl()
|
||||
{
|
||||
if (!doorControlAccess.Connect().HasError)
|
||||
{
|
||||
_ = doorControlAccess.GetLogToReceiveNewCard();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblStatusInfo.UpdateLabel("KHÔNG THỂ KẾT NỐI TỚI C3200", Color.Purple);
|
||||
}
|
||||
}
|
||||
|
||||
private void LaneIn_Load(object sender, EventArgs e)
|
||||
{
|
||||
ConnectToDoorAccessControl();
|
||||
}
|
||||
|
||||
private void LaneOut_Load(object sender, EventArgs e)
|
||||
{
|
||||
doorControlAccess.OnNewCardReceived += C3Device_OnNewCardReceived;
|
||||
plateCamera.OnVideoFrameReceived += PlateCameraOnVideoFrameReceived;
|
||||
plateCamera.OnOpenVideoStreamFailed += PlateCamera_OnOpenVideoStreamFailed;
|
||||
|
||||
overviewCamera.OnVideoFrameReceived += OverviewCameraOnVideoFrameReceived;
|
||||
overviewCamera.OnOpenVideoStreamFailed += OverviewCamera_OnOpenVideoStreamFailed;
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
StartPoint = e.Location;
|
||||
pictureBoxRoi = new Rectangle(StartPoint, new System.Drawing.Size(0, 0));
|
||||
IsDrawBox = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (IsDrawBox)
|
||||
{
|
||||
CurrentCursorPosition = e.Location;
|
||||
pictureBoxRoi.Width = CurrentCursorPosition.X - StartPoint.X;
|
||||
pictureBoxRoi.Height = CurrentCursorPosition.Y - StartPoint.Y;
|
||||
}
|
||||
Refresh();
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_MouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
IsDrawBox = false;
|
||||
if (StartPoint.X + pictureBoxRoi.Width > pictureBoxPlateVideo.Width || StartPoint.Y + pictureBoxRoi.Height > pictureBoxPlateVideo.Height)
|
||||
{
|
||||
pictureBoxRoi.X = pictureBoxRoi.Y = 0;
|
||||
pictureBoxRoi.Width = pictureBoxPlateVideo.Width;
|
||||
pictureBoxRoi.Height = pictureBoxPlateVideo.Height;
|
||||
}
|
||||
apiController.SaveRoiToServer(pictureBoxRoi, cameraId);
|
||||
}
|
||||
|
||||
private void pictureBoxPlateVideo_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
Pen redPen = new Pen(Color.FromArgb(255, 255, 0, 0), 3);
|
||||
e.Graphics.DrawRectangle(redPen, pictureBoxRoi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,10 +117,85 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="backgroundWorker2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>176, 17</value>
|
||||
<metadata name="grbPlateRefernce.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="backgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>12, 17</value>
|
||||
<metadata name="pictureBoxOverviewImageIn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxPlateImageIn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxOverviewImageIn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxPlateImageIn.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="grbCardInformation.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardType.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardTimeOut.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardTime.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblMoneyAmount.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblPlateString.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardNumber.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardType.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardTimeOut.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardTime.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblMoneyAmount.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblPlateString.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblCardNumber.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxPlateImage.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxPlateVideo.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="grbPlateCamera.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxOverviewImage.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="pictureBoxOverviewVideo.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="grbOverviewCamera.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblLaneLabel.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="lblStatusInfo.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
</root>
|
||||
181
AIParkingApplication/LoginForm.Designer.cs
generated
Normal file
181
AIParkingApplication/LoginForm.Designer.cs
generated
Normal file
@@ -0,0 +1,181 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
partial class LoginForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm));
|
||||
this.pictureBoxImageLogo = new System.Windows.Forms.PictureBox();
|
||||
this.txtUsername = new System.Windows.Forms.TextBox();
|
||||
this.lblUsername = new System.Windows.Forms.Label();
|
||||
this.txtPassword = new System.Windows.Forms.TextBox();
|
||||
this.lblPassword = new System.Windows.Forms.Label();
|
||||
this.txtServerAddress = new System.Windows.Forms.TextBox();
|
||||
this.lblServerAddress = new System.Windows.Forms.Label();
|
||||
this.btnLogin = new System.Windows.Forms.Button();
|
||||
this.lblLoginStatus = new System.Windows.Forms.Label();
|
||||
this.chkAutoLogin = new System.Windows.Forms.CheckBox();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxImageLogo)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// pictureBoxImageLogo
|
||||
//
|
||||
this.pictureBoxImageLogo.Location = new System.Drawing.Point(12, 14);
|
||||
this.pictureBoxImageLogo.Name = "pictureBoxImageLogo";
|
||||
this.pictureBoxImageLogo.Size = new System.Drawing.Size(185, 185);
|
||||
this.pictureBoxImageLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pictureBoxImageLogo.TabIndex = 0;
|
||||
this.pictureBoxImageLogo.TabStop = false;
|
||||
//
|
||||
// txtUsername
|
||||
//
|
||||
this.txtUsername.Location = new System.Drawing.Point(294, 14);
|
||||
this.txtUsername.Name = "txtUsername";
|
||||
this.txtUsername.Size = new System.Drawing.Size(227, 20);
|
||||
this.txtUsername.TabIndex = 1;
|
||||
this.txtUsername.Text = "cong1vao";
|
||||
//
|
||||
// lblUsername
|
||||
//
|
||||
this.lblUsername.AutoSize = true;
|
||||
this.lblUsername.Location = new System.Drawing.Point(214, 17);
|
||||
this.lblUsername.Name = "lblUsername";
|
||||
this.lblUsername.Size = new System.Drawing.Size(55, 13);
|
||||
this.lblUsername.TabIndex = 2;
|
||||
this.lblUsername.Text = "Tài khoản";
|
||||
//
|
||||
// txtPassword
|
||||
//
|
||||
this.txtPassword.Location = new System.Drawing.Point(294, 45);
|
||||
this.txtPassword.Name = "txtPassword";
|
||||
this.txtPassword.PasswordChar = '*';
|
||||
this.txtPassword.Size = new System.Drawing.Size(227, 20);
|
||||
this.txtPassword.TabIndex = 1;
|
||||
this.txtPassword.Text = "123456a@";
|
||||
//
|
||||
// lblPassword
|
||||
//
|
||||
this.lblPassword.AutoSize = true;
|
||||
this.lblPassword.Location = new System.Drawing.Point(214, 48);
|
||||
this.lblPassword.Name = "lblPassword";
|
||||
this.lblPassword.Size = new System.Drawing.Size(52, 13);
|
||||
this.lblPassword.TabIndex = 2;
|
||||
this.lblPassword.Text = "Mật khẩu";
|
||||
//
|
||||
// txtServerAddress
|
||||
//
|
||||
this.txtServerAddress.Location = new System.Drawing.Point(294, 77);
|
||||
this.txtServerAddress.Name = "txtServerAddress";
|
||||
this.txtServerAddress.Size = new System.Drawing.Size(227, 20);
|
||||
this.txtServerAddress.TabIndex = 1;
|
||||
this.txtServerAddress.Text = "192.168.1.122:80";
|
||||
//
|
||||
// lblServerAddress
|
||||
//
|
||||
this.lblServerAddress.AutoSize = true;
|
||||
this.lblServerAddress.Location = new System.Drawing.Point(214, 80);
|
||||
this.lblServerAddress.Name = "lblServerAddress";
|
||||
this.lblServerAddress.Size = new System.Drawing.Size(48, 13);
|
||||
this.lblServerAddress.TabIndex = 2;
|
||||
this.lblServerAddress.Text = "Máy chủ";
|
||||
//
|
||||
// btnLogin
|
||||
//
|
||||
this.btnLogin.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btnLogin.Location = new System.Drawing.Point(294, 162);
|
||||
this.btnLogin.Name = "btnLogin";
|
||||
this.btnLogin.Size = new System.Drawing.Size(227, 37);
|
||||
this.btnLogin.TabIndex = 3;
|
||||
this.btnLogin.Text = "Đăng nhập";
|
||||
this.btnLogin.UseVisualStyleBackColor = true;
|
||||
this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
|
||||
//
|
||||
// lblLoginStatus
|
||||
//
|
||||
this.lblLoginStatus.AutoSize = true;
|
||||
this.lblLoginStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblLoginStatus.ForeColor = System.Drawing.SystemColors.ControlLight;
|
||||
this.lblLoginStatus.Location = new System.Drawing.Point(291, 100);
|
||||
this.lblLoginStatus.Name = "lblLoginStatus";
|
||||
this.lblLoginStatus.Size = new System.Drawing.Size(90, 18);
|
||||
this.lblLoginStatus.TabIndex = 4;
|
||||
this.lblLoginStatus.Text = "Login Status";
|
||||
//
|
||||
// chkAutoLogin
|
||||
//
|
||||
this.chkAutoLogin.AutoSize = true;
|
||||
this.chkAutoLogin.Location = new System.Drawing.Point(295, 142);
|
||||
this.chkAutoLogin.Name = "chkAutoLogin";
|
||||
this.chkAutoLogin.Size = new System.Drawing.Size(122, 17);
|
||||
this.chkAutoLogin.TabIndex = 5;
|
||||
this.chkAutoLogin.Text = "Tự động đăng nhập";
|
||||
this.chkAutoLogin.UseVisualStyleBackColor = true;
|
||||
this.chkAutoLogin.CheckedChanged += new System.EventHandler(this.chkAutoLogin_CheckedChanged);
|
||||
//
|
||||
// LoginForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(534, 211);
|
||||
this.Controls.Add(this.chkAutoLogin);
|
||||
this.Controls.Add(this.lblLoginStatus);
|
||||
this.Controls.Add(this.btnLogin);
|
||||
this.Controls.Add(this.lblServerAddress);
|
||||
this.Controls.Add(this.lblPassword);
|
||||
this.Controls.Add(this.lblUsername);
|
||||
this.Controls.Add(this.txtServerAddress);
|
||||
this.Controls.Add(this.txtPassword);
|
||||
this.Controls.Add(this.txtUsername);
|
||||
this.Controls.Add(this.pictureBoxImageLogo);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.MaximumSize = new System.Drawing.Size(550, 250);
|
||||
this.Name = "LoginForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "AIParking - Hệ thống quản lý bãi đỗ xe - Đăng nhập";
|
||||
this.TopMost = true;
|
||||
this.Load += new System.EventHandler(this.LoginForm_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxImageLogo)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.PictureBox pictureBoxImageLogo;
|
||||
private System.Windows.Forms.TextBox txtUsername;
|
||||
private System.Windows.Forms.Label lblUsername;
|
||||
private System.Windows.Forms.TextBox txtPassword;
|
||||
private System.Windows.Forms.Label lblPassword;
|
||||
private System.Windows.Forms.TextBox txtServerAddress;
|
||||
private System.Windows.Forms.Label lblServerAddress;
|
||||
private System.Windows.Forms.Button btnLogin;
|
||||
private System.Windows.Forms.Label lblLoginStatus;
|
||||
private System.Windows.Forms.CheckBox chkAutoLogin;
|
||||
}
|
||||
}
|
||||
153
AIParkingApplication/LoginForm.cs
Normal file
153
AIParkingApplication/LoginForm.cs
Normal file
@@ -0,0 +1,153 @@
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class LoginForm : Form
|
||||
{
|
||||
private ApiController apiController;
|
||||
private Logger applicationLogger;
|
||||
private bool isAutoLogin;
|
||||
|
||||
public LoginForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
applicationLogger = LogManager.GetLogger(AppConstant.APPLICATION_LOGGER_NAME);
|
||||
applicationLogger.Log(LogLevel.Info, new string('-', 20));
|
||||
isAutoLogin = false;
|
||||
string defaultLogoImagePath = Application.StartupPath + AppConstant.DEFAULT_LOGO_IMAGE;
|
||||
if (File.Exists(defaultLogoImagePath))
|
||||
{
|
||||
pictureBoxImageLogo.Image = new Bitmap(defaultLogoImagePath);
|
||||
}
|
||||
txtUsername.Focus();
|
||||
lblLoginStatus.Text = string.Empty;
|
||||
AcceptButton = btnLogin;
|
||||
}
|
||||
|
||||
private async void Login()
|
||||
{
|
||||
btnLogin.Enabled = false;
|
||||
string serverUrl = txtServerAddress.Text;
|
||||
if (string.IsNullOrEmpty(serverUrl))
|
||||
{
|
||||
lblLoginStatus.Text = "Địa chỉ server không được để trống! \r\n ví dụ: 192.168.1.2:80";
|
||||
btnLogin.Enabled = true;
|
||||
applicationLogger.Log(LogLevel.Info, "Địa chỉ server không được để trống");
|
||||
return;
|
||||
}
|
||||
|
||||
Util.ParseHostString(serverUrl, out string ipAddress, out int port);
|
||||
|
||||
if (!Util.IsValidIPAddress(ipAddress))
|
||||
{
|
||||
lblLoginStatus.Text = "Địa chỉ server không đúng định dạng: \r\n ví dụ: 192.168.1.122:80";
|
||||
btnLogin.Enabled = true;
|
||||
applicationLogger.Log(LogLevel.Info, "Địa chỉ server không đúng định dạng");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
apiController = new ApiController(serverUrl, applicationLogger);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
applicationLogger.Log(LogLevel.Error, $"Cấu máy chủ lỗi - Kiểm tra lại tên máy chủ, kết nối máy chủ! Không thể khởi tạo API Webserver. ex: {ex.Message}");
|
||||
MessageBox.Show($"Cấu máy chủ lỗi - Kiểm tra lại tên máy chủ, kết nối máy chủ! \r\n {ex.Message}", "Lỗi khởi tạo API!", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
btnLogin.Enabled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
lblLoginStatus.Text = string.Empty;
|
||||
string username = txtUsername.Text;
|
||||
string password = txtPassword.Text;
|
||||
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
|
||||
{
|
||||
lblLoginStatus.Text = "Tên tài khoản hoặc mật khẩu không được để trống";
|
||||
btnLogin.Enabled = true;
|
||||
applicationLogger.Log(LogLevel.Info, "Tên tài khoản hoặc mật khẩu không được để trống");
|
||||
return;
|
||||
}
|
||||
|
||||
var loginResult = await apiController.Login(new LoginModel { Username = username, Password = password });
|
||||
if (loginResult.Exception != null)
|
||||
{
|
||||
btnLogin.Enabled = true;
|
||||
var execeptioMessage = loginResult.Exception.Message;
|
||||
if (execeptioMessage.Contains("Error converting value"))
|
||||
{
|
||||
lblLoginStatus.UpdateLabel("Sai tên tài khoản hoặc mật khẩu!", Color.Red);
|
||||
applicationLogger.Log(LogLevel.Info, "Sai tên tài khoản hoặc mật khẩu");
|
||||
return;
|
||||
}
|
||||
|
||||
if (execeptioMessage.Contains("An error occurred while sending the request"))
|
||||
{
|
||||
lblLoginStatus.UpdateLabel("Không có kết nối tới server!\r\nKiểm tra lại kết nối tới server!", Color.Red, Color.White);
|
||||
applicationLogger.Log(LogLevel.Error, "Không có kết nối tới server!");
|
||||
return;
|
||||
}
|
||||
lblLoginStatus.UpdateLabel("Không có kết nối tới server!\r\nKiểm tra lại kết nối tới server!", Color.Red, Color.White);
|
||||
applicationLogger.Log(LogLevel.Error, "Không có kết nối tới server!");
|
||||
}
|
||||
|
||||
if (loginResult.IsLoginSuccess)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.DEFAULT_USERNAME, txtUsername.Text);
|
||||
Util.UpsertAppSettings(AppConstant.DEFAULT_PASSWORD, txtPassword.Text);
|
||||
Util.UpsertAppSettings(AppConstant.DEFAULT_WEB_SERVER, txtServerAddress.Text);
|
||||
new AIParkingApplicationForm(apiController, ipAddress, loginResult.LoginData, applicationLogger).Show();
|
||||
Hide();
|
||||
applicationLogger.Log(LogLevel.Info, $"Đăng nhập thành công với tài khoản: {txtUsername.Text}");
|
||||
}
|
||||
}
|
||||
|
||||
private void btnLogin_Click(object sender, EventArgs e)
|
||||
{
|
||||
Login();
|
||||
}
|
||||
|
||||
private void ReadAppConfigurationFromFile()
|
||||
{
|
||||
try
|
||||
{
|
||||
txtUsername.Text = ConfigurationManager.AppSettings[AppConstant.DEFAULT_USERNAME];
|
||||
txtPassword.Text = ConfigurationManager.AppSettings[AppConstant.DEFAULT_PASSWORD];
|
||||
txtServerAddress.Text = ConfigurationManager.AppSettings[AppConstant.DEFAULT_WEB_SERVER];
|
||||
bool.TryParse(ConfigurationManager.AppSettings[AppConstant.AUTO_LOGIN], out isAutoLogin);
|
||||
if (isAutoLogin)
|
||||
{
|
||||
chkAutoLogin.Checked = true;
|
||||
Login();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
txtUsername.Text = string.Empty;
|
||||
txtPassword.Text = string.Empty;
|
||||
Util.UpsertAppSettings(AppConstant.DEFAULT_USERNAME, string.Empty);
|
||||
Util.UpsertAppSettings(AppConstant.DEFAULT_PASSWORD, string.Empty);
|
||||
Util.UpsertAppSettings(AppConstant.AUTO_LOGIN, "false");
|
||||
Util.UpsertAppSettings(AppConstant.DEFAULT_WEB_SERVER, "127.0.0.1:80");
|
||||
chkAutoLogin.Checked = false;
|
||||
Console.WriteLine($"{DateTime.Now.GetTimeFormatted()}\tReadAccessControlDeviceIPConfiguration\t{ex.Message}");
|
||||
applicationLogger.Log(LogLevel.Error, $"Không thể đọc cấu hình tài khoản mặc định: {AppConstant.DEFAULT_USERNAME}, {AppConstant.DEFAULT_PASSWORD}");
|
||||
}
|
||||
}
|
||||
|
||||
private void LoginForm_Load(object sender, EventArgs e)
|
||||
{
|
||||
ReadAppConfigurationFromFile();
|
||||
}
|
||||
|
||||
private void chkAutoLogin_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Util.UpsertAppSettings(AppConstant.AUTO_LOGIN, (sender as CheckBox).Checked.ToString().ToLower());
|
||||
}
|
||||
}
|
||||
}
|
||||
2679
AIParkingApplication/LoginForm.resx
Normal file
2679
AIParkingApplication/LoginForm.resx
Normal file
File diff suppressed because it is too large
Load Diff
25
AIParkingApplication/NLog.config
Normal file
25
AIParkingApplication/NLog.config
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
|
||||
autoReload="true"
|
||||
throwExceptions="false"
|
||||
internalLogLevel="Off" internalLogFile="D:\nlog-internal.log">
|
||||
<variable name="logDirectory" value="${basedir}/logs"/>
|
||||
<variable name="logLayout" value="${date:format=HH\:mm\:ss dd-MM-yyyy} ${uppercase:${level}} ${message} ${exception}"/>
|
||||
<targets>
|
||||
<target xsi:type="File" name="applicationLogger" fileName="${logDirectory}/${shortdate}_App.log"
|
||||
layout="${logLayout}" maxArchiveFiles="30" encoding="Unicode" writeBom="true"/>
|
||||
|
||||
<target xsi:type="File" name="pingServerLoggingFile" fileName="${logDirectory}/${shortdate}_PingServer.log"
|
||||
layout="${logLayout}" maxArchiveFiles="30" encoding="Unicode" writeBom="true"/>
|
||||
|
||||
<target xsi:type="File" name="pingDoorDeviceControlAccessLoggingFile" fileName="${logDirectory}/${shortdate}_PingDoorDeviceControlAccess.log"
|
||||
layout="${logLayout}" maxArchiveFiles="30" encoding="Unicode" writeBom="true"/>
|
||||
</targets>
|
||||
<rules>
|
||||
<logger name="ApplicationLogger" minlevel="Trace" writeTo="applicationLogger" />
|
||||
<logger name="PingServerLogger" minlevel="Trace" writeTo="pingServerLoggingFile" />
|
||||
<logger name="PingDoorDeviceControlAccessLogger" minlevel="Trace" writeTo="pingDoorDeviceControlAccessLoggingFile" />
|
||||
</rules>
|
||||
</nlog>
|
||||
3638
AIParkingApplication/NLog.xsd
Normal file
3638
AIParkingApplication/NLog.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,7 @@
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
@@ -20,7 +21,13 @@ namespace AIParkingApplication
|
||||
this.maxSizePlate = maxSizePlate;
|
||||
this.scaleFactor = scaleFactor;
|
||||
this.minNeighbors = minNeighbors;
|
||||
plateCascadeClassifier = new CascadeClassifier(this.plateType == PlateType.Square ? "plate.xml" : "plateLong.xml");
|
||||
string plateWeightPath = Application.StartupPath + (this.plateType == PlateType.Square ? PlateDetectorConstant.SQUARE_PLATE_WEIGHT_FILENAME : PlateDetectorConstant.LONG_PLATE_WEIGHT_FILENAME);
|
||||
plateCascadeClassifier = new CascadeClassifier(plateWeightPath);
|
||||
}
|
||||
|
||||
~PlateDetector()
|
||||
{
|
||||
plateCascadeClassifier?.Dispose();
|
||||
}
|
||||
|
||||
public Mat DetectPlate(Mat frame)
|
||||
@@ -28,36 +35,66 @@ namespace AIParkingApplication
|
||||
Rect[] plateRectsDetected = plateCascadeClassifier.DetectMultiScale(frame, scaleFactor, minNeighbors, HaarDetectionType.ScaleImage, minSizePlate, maxSizePlate);
|
||||
Console.WriteLine("Plate Detected Length: " + plateRectsDetected.Length);
|
||||
if (plateRectsDetected.Length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
Mat plateImage = GetBiggestPlate(plateRectsDetected, frame);
|
||||
Cv2.Resize(plateImage, plateImage, new Size(272, 272));
|
||||
return plateImage;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"DetectPlate\t{ex.Message}");
|
||||
return frame;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return frame;
|
||||
}
|
||||
}
|
||||
|
||||
private Rect ExtendPlateRect(Rect plateRect, int extendWidth = 50, int extendHeigh = 50) //TODO: 50 for plate square.
|
||||
{
|
||||
int newX = plateRect.X - extendWidth;
|
||||
int newY = plateRect.Y - extendHeigh;
|
||||
int newWidth = plateRect.Width + extendWidth * 2;
|
||||
int newHeigh = plateRect.Height + extendHeigh * 2;
|
||||
return new Rect(newX, newY, newWidth, newHeigh);
|
||||
}
|
||||
|
||||
private Mat GetBiggestPlate(Rect[] plateRects, Mat frame)
|
||||
{
|
||||
Rect biggestPlateRect = plateRects.OrderByDescending(x => x.Width).FirstOrDefault();
|
||||
Console.WriteLine("===================================================");
|
||||
for (int i = 0; i < plateRects.Length; i++)
|
||||
{
|
||||
Console.WriteLine($"{i}\t{plateRects[i].Width}\t{plateRects[i].Height}");
|
||||
}
|
||||
Console.WriteLine($"GetBiggestPlate - Width: {biggestPlateRect.Width}\tHeight: {biggestPlateRect.Height}");
|
||||
Mat plateImage = frame[biggestPlateRect];
|
||||
Rect extendedRect = ExtendPlateRect(biggestPlateRect);
|
||||
Mat plateImage;
|
||||
try
|
||||
{
|
||||
plateImage = frame[extendedRect];
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
plateImage = frame[biggestPlateRect];
|
||||
Console.WriteLine($"Error While Extending Plate Rect: {ex.Message}");
|
||||
}
|
||||
return plateImage;
|
||||
}
|
||||
}
|
||||
|
||||
public enum PlateType
|
||||
{
|
||||
Square,
|
||||
Long
|
||||
}
|
||||
|
||||
public static class PlateDetectorConstant
|
||||
{
|
||||
public const string SQUARE_PLATE_WEIGHT_FILENAME = @".\plate.xml";
|
||||
public const string LONG_PLATE_WEIGHT_FILENAME = @".\plateLong.xml";
|
||||
|
||||
public const double SCALE_FACTOR_DEFAULT_SQUARE_PLATE = 1.03;
|
||||
public static int MIN_NEIGHBORS_DEFAULT_SQUARE_PLATE = 2;
|
||||
public static Size MIN_SIZE_DEFAULT_SQUARE_PLATE = new Size(80, 75);
|
||||
public static Size MIN_SIZE_DEFAULT_SQUARE_PLATE = new Size(105, 100);
|
||||
public static Size MAX_SIZE_DEFAULT_SQUARE_PLATE = new Size(450, 400);
|
||||
|
||||
public static double SCALE_FACTOR_DEFAULT_LONG_PLATE = 1.5;
|
||||
|
||||
111
AIParkingApplication/PlateProcessor.cs
Normal file
111
AIParkingApplication/PlateProcessor.cs
Normal file
@@ -0,0 +1,111 @@
|
||||
using OpenCvSharp;
|
||||
using OpenCvSharp.Extensions;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public class PlateProcessor
|
||||
{
|
||||
private bool isSupportSquarePlate;
|
||||
private bool isSupportLongPlate;
|
||||
private PlateDetector squarePlateDetector;
|
||||
private PlateDetector longPlateDetector;
|
||||
private EngineApiController engineApiController;
|
||||
|
||||
public PlateProcessor(EngineApiController engineApiController, bool isSupportSquarePlate = true, bool isSupportLongPlate = false)
|
||||
{
|
||||
this.isSupportSquarePlate = isSupportSquarePlate;
|
||||
this.isSupportLongPlate = isSupportLongPlate;
|
||||
this.engineApiController = engineApiController;
|
||||
|
||||
if (this.isSupportSquarePlate)
|
||||
{
|
||||
squarePlateDetector = new PlateDetector(PlateType.Square, PlateDetectorConstant.MIN_SIZE_DEFAULT_SQUARE_PLATE, PlateDetectorConstant.MAX_SIZE_DEFAULT_SQUARE_PLATE, PlateDetectorConstant.SCALE_FACTOR_DEFAULT_SQUARE_PLATE, PlateDetectorConstant.MIN_NEIGHBORS_DEFAULT_SQUARE_PLATE);
|
||||
}
|
||||
|
||||
if (this.isSupportLongPlate)
|
||||
{
|
||||
longPlateDetector = new PlateDetector(PlateType.Long, PlateDetectorConstant.MIN_SIZE_DEFAULT_LONG_PLATE, PlateDetectorConstant.MAX_SIZE_DEFAULT_LONG_PLATE, PlateDetectorConstant.SCALE_FACTOR_DEFAULT_LONG_PLATE, PlateDetectorConstant.MIN_NEIGHBORS_DEFAULT_LONG_PLATE);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<FinalPlateResult> DetectPlateAndDoOcrEngineAsync(PlateType plateType, Mat frame)
|
||||
{
|
||||
Mat plateDetected = plateType == PlateType.Square ? squarePlateDetector.DetectPlate(frame) : longPlateDetector.DetectPlate(frame);
|
||||
|
||||
//TODO: Check if plateDetected empty
|
||||
OcrResult plateOcrResultFromEngine = await engineApiController.SendEngineRequestAsync(plateDetected, plateType);
|
||||
Mat finalPlateImage;
|
||||
if (!string.IsNullOrEmpty(plateOcrResultFromEngine.PlateString) && !string.IsNullOrEmpty(plateOcrResultFromEngine.PlateImageBase64))
|
||||
{
|
||||
Bitmap plateBitmapImage = Util.ConvertFromBase64Image(plateOcrResultFromEngine.PlateImageBase64);
|
||||
finalPlateImage = BitmapConverter.ToMat(plateBitmapImage);
|
||||
}
|
||||
else
|
||||
{
|
||||
finalPlateImage = plateDetected;
|
||||
}
|
||||
|
||||
return new FinalPlateResult
|
||||
{
|
||||
PlateString = plateOcrResultFromEngine.PlateString,
|
||||
PlateImage = finalPlateImage,
|
||||
PlateType = plateType
|
||||
};
|
||||
}
|
||||
|
||||
public async Task<FinalPlateResult> ProcessPlate(Mat frame)
|
||||
{
|
||||
try
|
||||
{
|
||||
FinalPlateResult plateResult;
|
||||
if (isSupportLongPlate)
|
||||
{
|
||||
plateResult = await DetectPlateAndDoOcrEngineAsync(PlateType.Long, frame);
|
||||
if (!IsPlateStringValid(plateResult.PlateString))
|
||||
{
|
||||
plateResult = await DetectPlateAndDoOcrEngineAsync(PlateType.Square, frame);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Recall Square Plates");
|
||||
plateResult = await DetectPlateAndDoOcrEngineAsync(PlateType.Square, frame);
|
||||
}
|
||||
|
||||
return plateResult;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"{Util.GetCurrentMethodName()}\texMessage: {ex.Message}");
|
||||
return new FinalPlateResult
|
||||
{
|
||||
PlateString = string.Empty,
|
||||
PlateImage = frame,
|
||||
PlateType = PlateType.Square
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: Complete this
|
||||
private string NormalizePlateString(string plateString)
|
||||
{
|
||||
return plateString;
|
||||
}
|
||||
|
||||
public bool IsPlateStringValid(string plateString, int minPlateStringLength = 5)
|
||||
{
|
||||
bool isValid = !string.IsNullOrEmpty(plateString) && plateString.Length > minPlateStringLength;
|
||||
return isValid;
|
||||
}
|
||||
}
|
||||
|
||||
public class FinalPlateResult
|
||||
{
|
||||
public string PlateString { get; set; }
|
||||
public Mat PlateImage { get; set; }
|
||||
public PlateType PlateType { get; set; }
|
||||
}
|
||||
}
|
||||
76
AIParkingApplication/Printer.cs
Normal file
76
AIParkingApplication/Printer.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using Microsoft.Win32;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public class Printer
|
||||
{
|
||||
private Logger appLogger;
|
||||
|
||||
public Printer(Logger appLogger)
|
||||
{
|
||||
this.appLogger = appLogger;
|
||||
SetupPrinterPageSetting();
|
||||
}
|
||||
|
||||
public void DoPrint(PrinterData printData)
|
||||
{
|
||||
WebBrowser webBrowser = new WebBrowser();
|
||||
webBrowser.Left = 0;
|
||||
string documentText = ProcessingString("PrinterForm.html", printData);
|
||||
if (!string.IsNullOrEmpty(documentText))
|
||||
{
|
||||
webBrowser.DocumentText = documentText;
|
||||
webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;
|
||||
}
|
||||
}
|
||||
|
||||
private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
|
||||
{
|
||||
((WebBrowser)sender).Print();
|
||||
}
|
||||
|
||||
private string ProcessingString(string path, PrinterData printerField)
|
||||
{
|
||||
try
|
||||
{
|
||||
string htmlStr = File.ReadAllText(path);
|
||||
htmlStr = htmlStr.Replace("{PLATE_STRING}", printerField.PlateString)
|
||||
.Replace("{TIME_PARKING_IN}", printerField.TimeParkingIn)
|
||||
.Replace("{TIME_PARKING_OUT}", printerField.TimeParkingOut)
|
||||
.Replace("{MONEY_AMOUNT}", printerField.MoneyAmount);
|
||||
return htmlStr;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"ProcessingString\texMessage:{ex.Message}");
|
||||
appLogger.Log(LogLevel.Error, $"Lỗi khi In hóa đơn: {ex.Message}");
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupPrinterPageSetting()
|
||||
{
|
||||
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\PageSetup", RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
|
||||
key.SetValue("footer", string.Empty, RegistryValueKind.String);
|
||||
key.SetValue("header", string.Empty, RegistryValueKind.String);
|
||||
key.SetValue("margin_top", 0);
|
||||
key.SetValue("margin_right", 0.2);
|
||||
key.SetValue("margin_bottom", 0.5);
|
||||
key.SetValue("margin_left", 0.2);
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
|
||||
public class PrinterData
|
||||
{
|
||||
public string PlateString { get; set; }
|
||||
public string TimeParkingIn { get; set; }
|
||||
public string TimeParkingOut { get; set; }
|
||||
public string MoneyAmount { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@ namespace AIParkingApplication
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new AIParkingApplicationForm());
|
||||
Application.Run(new LoginForm());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("AIParkingApplication")]
|
||||
[assembly: AssemblyTitle("AIParking - Phần mềm quản lý bãi đỗ xe")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("AIParkingApplication")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyCopyright("Copyright © DucDA 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
|
||||
46
AIParkingApplication/Sidebar.Designer.cs
generated
Normal file
46
AIParkingApplication/Sidebar.Designer.cs
generated
Normal file
@@ -0,0 +1,46 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
partial class Sidebar
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// Sidebar
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Name = "Sidebar";
|
||||
this.Size = new System.Drawing.Size(192, 692);
|
||||
this.Load += new System.EventHandler(this.Sidebar_Load);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
41
AIParkingApplication/Sidebar.cs
Normal file
41
AIParkingApplication/Sidebar.cs
Normal file
@@ -0,0 +1,41 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class Sidebar : UserControl
|
||||
{
|
||||
private Statistic statistic;
|
||||
private string logoImagePath;
|
||||
private ApiController apiController;
|
||||
|
||||
public Sidebar(ApiController apiController, string logoImagePath = AppConstant.DEFAULT_LOGO_IMAGE)
|
||||
{
|
||||
InitializeComponent();
|
||||
this.apiController = apiController;
|
||||
this.logoImagePath = logoImagePath;
|
||||
}
|
||||
|
||||
private void Sidebar_Load(object sender, EventArgs e)
|
||||
{
|
||||
string defaultLogoImagePath = Application.StartupPath + logoImagePath;
|
||||
if (File.Exists(defaultLogoImagePath))
|
||||
{
|
||||
PictureBox pictureBoxImageLogo;
|
||||
pictureBoxImageLogo = new PictureBox();
|
||||
pictureBoxImageLogo.Location = new Point(1, 1);
|
||||
pictureBoxImageLogo.Size = new Size(185, 185);
|
||||
pictureBoxImageLogo.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
pictureBoxImageLogo.Image = new Bitmap(logoImagePath);
|
||||
Controls.Add(pictureBoxImageLogo);
|
||||
}
|
||||
|
||||
statistic = new Statistic(apiController, TimeSpan.FromMinutes(10));
|
||||
statistic.Location = new Point(0, 400);
|
||||
statistic.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
|
||||
Controls.Add(statistic);
|
||||
}
|
||||
}
|
||||
}
|
||||
123
AIParkingApplication/Sidebar.resx
Normal file
123
AIParkingApplication/Sidebar.resx
Normal file
@@ -0,0 +1,123 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
</root>
|
||||
289
AIParkingApplication/Statistic.Designer.cs
generated
Normal file
289
AIParkingApplication/Statistic.Designer.cs
generated
Normal file
@@ -0,0 +1,289 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
partial class Statistic
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.grbVehicleStatistics = new System.Windows.Forms.GroupBox();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.lblVehicleTotalOut = new System.Windows.Forms.Label();
|
||||
this.lblVehicleTotalIn = new System.Windows.Forms.Label();
|
||||
this.tlpStatisticTable = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.lblLoaiXe = new System.Windows.Forms.Label();
|
||||
this.lblSoLuong = new System.Windows.Forms.Label();
|
||||
this.lblXeMay = new System.Windows.Forms.Label();
|
||||
this.lblSoLuongXeMay = new System.Windows.Forms.Label();
|
||||
this.lblOto = new System.Windows.Forms.Label();
|
||||
this.lblSoLuongOto = new System.Windows.Forms.Label();
|
||||
this.grbLoginInfo = new System.Windows.Forms.GroupBox();
|
||||
this.lblAuthorization = new System.Windows.Forms.Label();
|
||||
this.lblUsername = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.grbVehicleStatistics.SuspendLayout();
|
||||
this.tlpStatisticTable.SuspendLayout();
|
||||
this.grbLoginInfo.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// grbVehicleStatistics
|
||||
//
|
||||
this.grbVehicleStatistics.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.grbVehicleStatistics.Controls.Add(this.label4);
|
||||
this.grbVehicleStatistics.Controls.Add(this.label3);
|
||||
this.grbVehicleStatistics.Controls.Add(this.lblVehicleTotalOut);
|
||||
this.grbVehicleStatistics.Controls.Add(this.lblVehicleTotalIn);
|
||||
this.grbVehicleStatistics.Controls.Add(this.tlpStatisticTable);
|
||||
this.grbVehicleStatistics.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbVehicleStatistics.Location = new System.Drawing.Point(1, 1);
|
||||
this.grbVehicleStatistics.Name = "grbVehicleStatistics";
|
||||
this.grbVehicleStatistics.Size = new System.Drawing.Size(189, 178);
|
||||
this.grbVehicleStatistics.TabIndex = 0;
|
||||
this.grbVehicleStatistics.TabStop = false;
|
||||
this.grbVehicleStatistics.Text = "Thống kê xe";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.label4.Location = new System.Drawing.Point(112, 125);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(60, 20);
|
||||
this.label4.TabIndex = 2;
|
||||
this.label4.Text = "Xe ra";
|
||||
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.label3.Location = new System.Drawing.Point(21, 125);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(60, 20);
|
||||
this.label3.TabIndex = 2;
|
||||
this.label3.Text = "Xe vào";
|
||||
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblVehicleTotalOut
|
||||
//
|
||||
this.lblVehicleTotalOut.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.lblVehicleTotalOut.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblVehicleTotalOut.Location = new System.Drawing.Point(112, 153);
|
||||
this.lblVehicleTotalOut.Name = "lblVehicleTotalOut";
|
||||
this.lblVehicleTotalOut.Size = new System.Drawing.Size(60, 20);
|
||||
this.lblVehicleTotalOut.TabIndex = 1;
|
||||
this.lblVehicleTotalOut.Text = "0";
|
||||
this.lblVehicleTotalOut.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblVehicleTotalIn
|
||||
//
|
||||
this.lblVehicleTotalIn.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.lblVehicleTotalIn.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblVehicleTotalIn.Location = new System.Drawing.Point(21, 153);
|
||||
this.lblVehicleTotalIn.Name = "lblVehicleTotalIn";
|
||||
this.lblVehicleTotalIn.Size = new System.Drawing.Size(60, 20);
|
||||
this.lblVehicleTotalIn.TabIndex = 1;
|
||||
this.lblVehicleTotalIn.Text = "0";
|
||||
this.lblVehicleTotalIn.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// tlpStatisticTable
|
||||
//
|
||||
this.tlpStatisticTable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tlpStatisticTable.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single;
|
||||
this.tlpStatisticTable.ColumnCount = 2;
|
||||
this.tlpStatisticTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
|
||||
this.tlpStatisticTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
|
||||
this.tlpStatisticTable.Controls.Add(this.lblLoaiXe, 0, 0);
|
||||
this.tlpStatisticTable.Controls.Add(this.lblSoLuong, 1, 0);
|
||||
this.tlpStatisticTable.Controls.Add(this.lblXeMay, 0, 1);
|
||||
this.tlpStatisticTable.Controls.Add(this.lblSoLuongXeMay, 1, 1);
|
||||
this.tlpStatisticTable.Controls.Add(this.lblOto, 0, 2);
|
||||
this.tlpStatisticTable.Controls.Add(this.lblSoLuongOto, 1, 2);
|
||||
this.tlpStatisticTable.Location = new System.Drawing.Point(6, 22);
|
||||
this.tlpStatisticTable.Name = "tlpStatisticTable";
|
||||
this.tlpStatisticTable.RowCount = 3;
|
||||
this.tlpStatisticTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tlpStatisticTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tlpStatisticTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
|
||||
this.tlpStatisticTable.Size = new System.Drawing.Size(178, 100);
|
||||
this.tlpStatisticTable.TabIndex = 0;
|
||||
//
|
||||
// lblLoaiXe
|
||||
//
|
||||
this.lblLoaiXe.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.lblLoaiXe.AutoSize = true;
|
||||
this.lblLoaiXe.Location = new System.Drawing.Point(17, 8);
|
||||
this.lblLoaiXe.Name = "lblLoaiXe";
|
||||
this.lblLoaiXe.Size = new System.Drawing.Size(55, 18);
|
||||
this.lblLoaiXe.TabIndex = 0;
|
||||
this.lblLoaiXe.Text = "Loại xe";
|
||||
//
|
||||
// lblSoLuong
|
||||
//
|
||||
this.lblSoLuong.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.lblSoLuong.AutoSize = true;
|
||||
this.lblSoLuong.Location = new System.Drawing.Point(99, 8);
|
||||
this.lblSoLuong.Name = "lblSoLuong";
|
||||
this.lblSoLuong.Size = new System.Drawing.Size(67, 18);
|
||||
this.lblSoLuong.TabIndex = 0;
|
||||
this.lblSoLuong.Text = "Số lượng";
|
||||
//
|
||||
// lblXeMay
|
||||
//
|
||||
this.lblXeMay.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.lblXeMay.AutoSize = true;
|
||||
this.lblXeMay.Location = new System.Drawing.Point(15, 41);
|
||||
this.lblXeMay.Name = "lblXeMay";
|
||||
this.lblXeMay.Size = new System.Drawing.Size(58, 18);
|
||||
this.lblXeMay.TabIndex = 0;
|
||||
this.lblXeMay.Text = "Xe máy";
|
||||
//
|
||||
// lblSoLuongXeMay
|
||||
//
|
||||
this.lblSoLuongXeMay.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.lblSoLuongXeMay.AutoSize = true;
|
||||
this.lblSoLuongXeMay.Location = new System.Drawing.Point(125, 41);
|
||||
this.lblSoLuongXeMay.Name = "lblSoLuongXeMay";
|
||||
this.lblSoLuongXeMay.Size = new System.Drawing.Size(16, 18);
|
||||
this.lblSoLuongXeMay.TabIndex = 0;
|
||||
this.lblSoLuongXeMay.Text = "0";
|
||||
//
|
||||
// lblOto
|
||||
//
|
||||
this.lblOto.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.lblOto.AutoSize = true;
|
||||
this.lblOto.Location = new System.Drawing.Point(28, 74);
|
||||
this.lblOto.Name = "lblOto";
|
||||
this.lblOto.Size = new System.Drawing.Size(33, 18);
|
||||
this.lblOto.TabIndex = 0;
|
||||
this.lblOto.Text = "Ôtô";
|
||||
//
|
||||
// lblSoLuongOto
|
||||
//
|
||||
this.lblSoLuongOto.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.lblSoLuongOto.AutoSize = true;
|
||||
this.lblSoLuongOto.Location = new System.Drawing.Point(125, 74);
|
||||
this.lblSoLuongOto.Name = "lblSoLuongOto";
|
||||
this.lblSoLuongOto.Size = new System.Drawing.Size(16, 18);
|
||||
this.lblSoLuongOto.TabIndex = 0;
|
||||
this.lblSoLuongOto.Text = "0";
|
||||
//
|
||||
// grbLoginInfo
|
||||
//
|
||||
this.grbLoginInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.grbLoginInfo.Controls.Add(this.lblAuthorization);
|
||||
this.grbLoginInfo.Controls.Add(this.lblUsername);
|
||||
this.grbLoginInfo.Controls.Add(this.label2);
|
||||
this.grbLoginInfo.Controls.Add(this.label1);
|
||||
this.grbLoginInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.grbLoginInfo.Location = new System.Drawing.Point(1, 198);
|
||||
this.grbLoginInfo.Name = "grbLoginInfo";
|
||||
this.grbLoginInfo.Size = new System.Drawing.Size(190, 93);
|
||||
this.grbLoginInfo.TabIndex = 1;
|
||||
this.grbLoginInfo.TabStop = false;
|
||||
this.grbLoginInfo.Text = "Thông tin tài khoản";
|
||||
//
|
||||
// lblAuthorization
|
||||
//
|
||||
this.lblAuthorization.AutoSize = true;
|
||||
this.lblAuthorization.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblAuthorization.Location = new System.Drawing.Point(109, 60);
|
||||
this.lblAuthorization.Name = "lblAuthorization";
|
||||
this.lblAuthorization.Size = new System.Drawing.Size(56, 18);
|
||||
this.lblAuthorization.TabIndex = 0;
|
||||
this.lblAuthorization.Text = "Bảo Vệ";
|
||||
//
|
||||
// lblUsername
|
||||
//
|
||||
this.lblUsername.AutoSize = true;
|
||||
this.lblUsername.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblUsername.Location = new System.Drawing.Point(109, 27);
|
||||
this.lblUsername.Name = "lblUsername";
|
||||
this.lblUsername.Size = new System.Drawing.Size(48, 18);
|
||||
this.lblUsername.TabIndex = 0;
|
||||
this.lblUsername.Text = "baove";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label2.Location = new System.Drawing.Point(16, 60);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(89, 18);
|
||||
this.label2.TabIndex = 0;
|
||||
this.label2.Text = "Phân quyền:";
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label1.Location = new System.Drawing.Point(16, 27);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(77, 18);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Tài khoản:";
|
||||
//
|
||||
// Statistic
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.grbLoginInfo);
|
||||
this.Controls.Add(this.grbVehicleStatistics);
|
||||
this.Name = "Statistic";
|
||||
this.Size = new System.Drawing.Size(192, 292);
|
||||
this.Load += new System.EventHandler(this.Statistic_Load);
|
||||
this.grbVehicleStatistics.ResumeLayout(false);
|
||||
this.tlpStatisticTable.ResumeLayout(false);
|
||||
this.tlpStatisticTable.PerformLayout();
|
||||
this.grbLoginInfo.ResumeLayout(false);
|
||||
this.grbLoginInfo.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.GroupBox grbVehicleStatistics;
|
||||
private System.Windows.Forms.TableLayoutPanel tlpStatisticTable;
|
||||
private System.Windows.Forms.GroupBox grbLoginInfo;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label lblAuthorization;
|
||||
private System.Windows.Forms.Label lblUsername;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label lblVehicleTotalOut;
|
||||
private System.Windows.Forms.Label lblVehicleTotalIn;
|
||||
private System.Windows.Forms.Label lblLoaiXe;
|
||||
private System.Windows.Forms.Label lblSoLuong;
|
||||
private System.Windows.Forms.Label lblXeMay;
|
||||
private System.Windows.Forms.Label lblSoLuongXeMay;
|
||||
private System.Windows.Forms.Label lblOto;
|
||||
private System.Windows.Forms.Label lblSoLuongOto;
|
||||
}
|
||||
}
|
||||
63
AIParkingApplication/Statistic.cs
Normal file
63
AIParkingApplication/Statistic.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class Statistic : UserControl
|
||||
{
|
||||
private readonly Thread statisticsThread;
|
||||
private readonly TimeSpan updateInterval;
|
||||
private ApiController apiController;
|
||||
|
||||
public Statistic(ApiController apiController, TimeSpan updateInterval)
|
||||
{
|
||||
InitializeComponent();
|
||||
this.apiController = apiController;
|
||||
this.updateInterval = updateInterval;
|
||||
statisticsThread = new Thread(new ThreadStart(GetStatistic)) { IsBackground = true };
|
||||
}
|
||||
|
||||
private void GetStatistic()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
GetDataUpdate();
|
||||
Thread.Sleep(updateInterval);
|
||||
}
|
||||
}
|
||||
|
||||
private async void GetDataUpdate()
|
||||
{
|
||||
ParkInfo parkInfo = await apiController.GetStatisticInfo();
|
||||
if (parkInfo != null && IsHandleCreated)
|
||||
{
|
||||
lblSoLuongXeMay.UpdateLabel(parkInfo.NumberOfMoto.ToString());
|
||||
lblSoLuongOto.UpdateLabel(parkInfo.NumberOfCar.ToString());
|
||||
lblVehicleTotalIn.UpdateLabel(parkInfo.TotalIn);
|
||||
lblVehicleTotalOut.UpdateLabel(parkInfo.TotalOut);
|
||||
}
|
||||
}
|
||||
|
||||
public class ParkInfo
|
||||
{
|
||||
[JsonProperty("oto")]
|
||||
public int NumberOfCar { get; set; }
|
||||
|
||||
[JsonProperty("moto")]
|
||||
public int NumberOfMoto { get; set; }
|
||||
|
||||
[JsonProperty("total_in")]
|
||||
public string TotalIn { get; set; }
|
||||
|
||||
[JsonProperty("total_out")]
|
||||
public string TotalOut { get; set; }
|
||||
}
|
||||
|
||||
private void Statistic_Load(object sender, EventArgs e)
|
||||
{
|
||||
statisticsThread.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
120
AIParkingApplication/Statistic.resx
Normal file
120
AIParkingApplication/Statistic.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
155
AIParkingApplication/StatusBar.Designer.cs
generated
Normal file
155
AIParkingApplication/StatusBar.Designer.cs
generated
Normal file
@@ -0,0 +1,155 @@
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
partial class StatusBar
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.lblPingTimeServer = new System.Windows.Forms.Label();
|
||||
this.lblDateTime = new System.Windows.Forms.Label();
|
||||
this.lblPingDoorAccessControlDevice = new System.Windows.Forms.Label();
|
||||
this.lblPingTimeToDoorAccessControl = new System.Windows.Forms.Label();
|
||||
this.lblConnectionStatus = new System.Windows.Forms.Label();
|
||||
this.lblServer = new System.Windows.Forms.Label();
|
||||
this.lblEngine = new System.Windows.Forms.Label();
|
||||
this.lblEngineStatus = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// lblPingTimeServer
|
||||
//
|
||||
this.lblPingTimeServer.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblPingTimeServer.Location = new System.Drawing.Point(212, 0);
|
||||
this.lblPingTimeServer.Name = "lblPingTimeServer";
|
||||
this.lblPingTimeServer.Size = new System.Drawing.Size(65, 18);
|
||||
this.lblPingTimeServer.TabIndex = 0;
|
||||
this.lblPingTimeServer.Text = "1ms";
|
||||
this.lblPingTimeServer.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblDateTime
|
||||
//
|
||||
this.lblDateTime.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.lblDateTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblDateTime.Location = new System.Drawing.Point(1226, 0);
|
||||
this.lblDateTime.Name = "lblDateTime";
|
||||
this.lblDateTime.Size = new System.Drawing.Size(140, 18);
|
||||
this.lblDateTime.TabIndex = 2;
|
||||
this.lblDateTime.Text = "17/06/2020 16:54:43";
|
||||
this.lblDateTime.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblPingDoorAccessControlDevice
|
||||
//
|
||||
this.lblPingDoorAccessControlDevice.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblPingDoorAccessControlDevice.Location = new System.Drawing.Point(316, 0);
|
||||
this.lblPingDoorAccessControlDevice.Name = "lblPingDoorAccessControlDevice";
|
||||
this.lblPingDoorAccessControlDevice.Size = new System.Drawing.Size(114, 18);
|
||||
this.lblPingDoorAccessControlDevice.TabIndex = 3;
|
||||
this.lblPingDoorAccessControlDevice.Text = "Thiết bị mở cửa:";
|
||||
this.lblPingDoorAccessControlDevice.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblPingTimeToDoorAccessControl
|
||||
//
|
||||
this.lblPingTimeToDoorAccessControl.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblPingTimeToDoorAccessControl.Location = new System.Drawing.Point(440, 0);
|
||||
this.lblPingTimeToDoorAccessControl.Name = "lblPingTimeToDoorAccessControl";
|
||||
this.lblPingTimeToDoorAccessControl.Size = new System.Drawing.Size(71, 18);
|
||||
this.lblPingTimeToDoorAccessControl.TabIndex = 3;
|
||||
this.lblPingTimeToDoorAccessControl.Text = "500ms";
|
||||
this.lblPingTimeToDoorAccessControl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblConnectionStatus
|
||||
//
|
||||
this.lblConnectionStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblConnectionStatus.Location = new System.Drawing.Point(0, 0);
|
||||
this.lblConnectionStatus.Name = "lblConnectionStatus";
|
||||
this.lblConnectionStatus.Size = new System.Drawing.Size(125, 18);
|
||||
this.lblConnectionStatus.TabIndex = 1;
|
||||
this.lblConnectionStatus.Text = "Trạng thái kết nối";
|
||||
this.lblConnectionStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblServer
|
||||
//
|
||||
this.lblServer.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblServer.Location = new System.Drawing.Point(142, 0);
|
||||
this.lblServer.Name = "lblServer";
|
||||
this.lblServer.Size = new System.Drawing.Size(63, 18);
|
||||
this.lblServer.TabIndex = 1;
|
||||
this.lblServer.Text = "Server:";
|
||||
this.lblServer.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblEngine
|
||||
//
|
||||
this.lblEngine.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblEngine.Location = new System.Drawing.Point(583, 0);
|
||||
this.lblEngine.Name = "lblEngine";
|
||||
this.lblEngine.Size = new System.Drawing.Size(65, 18);
|
||||
this.lblEngine.TabIndex = 3;
|
||||
this.lblEngine.Text = "Engine:";
|
||||
this.lblEngine.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// lblEngineStatus
|
||||
//
|
||||
this.lblEngineStatus.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.lblEngineStatus.Location = new System.Drawing.Point(654, 0);
|
||||
this.lblEngineStatus.Name = "lblEngineStatus";
|
||||
this.lblEngineStatus.Size = new System.Drawing.Size(169, 18);
|
||||
this.lblEngineStatus.TabIndex = 3;
|
||||
this.lblEngineStatus.Text = "---";
|
||||
this.lblEngineStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// StatusBar
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.lblEngineStatus);
|
||||
this.Controls.Add(this.lblPingTimeToDoorAccessControl);
|
||||
this.Controls.Add(this.lblEngine);
|
||||
this.Controls.Add(this.lblPingDoorAccessControlDevice);
|
||||
this.Controls.Add(this.lblDateTime);
|
||||
this.Controls.Add(this.lblServer);
|
||||
this.Controls.Add(this.lblConnectionStatus);
|
||||
this.Controls.Add(this.lblPingTimeServer);
|
||||
this.Margin = new System.Windows.Forms.Padding(0);
|
||||
this.MaximumSize = new System.Drawing.Size(1366, 18);
|
||||
this.MinimumSize = new System.Drawing.Size(1366, 18);
|
||||
this.Name = "StatusBar";
|
||||
this.Size = new System.Drawing.Size(1366, 18);
|
||||
this.Load += new System.EventHandler(this.StatusBar_Load);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label lblPingTimeServer;
|
||||
private System.Windows.Forms.Label lblDateTime;
|
||||
private System.Windows.Forms.Label lblPingDoorAccessControlDevice;
|
||||
private System.Windows.Forms.Label lblPingTimeToDoorAccessControl;
|
||||
private System.Windows.Forms.Label lblConnectionStatus;
|
||||
private System.Windows.Forms.Label lblServer;
|
||||
private System.Windows.Forms.Label lblEngine;
|
||||
private System.Windows.Forms.Label lblEngineStatus;
|
||||
}
|
||||
}
|
||||
105
AIParkingApplication/StatusBar.cs
Normal file
105
AIParkingApplication/StatusBar.cs
Normal file
@@ -0,0 +1,105 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public partial class StatusBar : UserControl
|
||||
{
|
||||
private string webServerIP;
|
||||
private string doorAccessControlDeviceIP;
|
||||
private const string engineFilePath = @"\engine.bat";
|
||||
private Thread updateInfoThread;
|
||||
|
||||
public StatusBar(string webServerIP, string doorAccessControlDeviceIP)
|
||||
{
|
||||
InitializeComponent();
|
||||
this.webServerIP = webServerIP;
|
||||
this.doorAccessControlDeviceIP = doorAccessControlDeviceIP;
|
||||
updateInfoThread = new Thread(UpdateStatus) { IsBackground = true };
|
||||
}
|
||||
|
||||
private void UpdateStatus()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
if (IsHandleCreated)
|
||||
{
|
||||
lblDateTime.UpdateLabel(DateTime.Now.GetTimeFormatted());
|
||||
|
||||
PingResult pingDoorAccessControlResult = GetPingStatus(doorAccessControlDeviceIP);
|
||||
lblPingTimeToDoorAccessControl.UpdateLabel($"{pingDoorAccessControlResult.ReplyTime} ms", pingDoorAccessControlResult.BackColor, pingDoorAccessControlResult.ForeColor);
|
||||
|
||||
PingResult pingWebServerResult = GetPingStatus(webServerIP);
|
||||
lblPingTimeServer.UpdateLabel($"{pingWebServerResult.ReplyTime} ms", pingWebServerResult.BackColor, pingWebServerResult.ForeColor);
|
||||
|
||||
if (Process.GetProcessesByName("tmux").Length == 0)
|
||||
{
|
||||
string engineBatFilePath = Application.StartupPath + engineFilePath;
|
||||
if (File.Exists(engineBatFilePath))
|
||||
{
|
||||
Util.ExecuteCommand(engineBatFilePath);
|
||||
lblEngineStatus.UpdateLabel("DỪNG HOẠT ĐỘNG", Color.Red);
|
||||
}
|
||||
else
|
||||
{
|
||||
lblEngineStatus.UpdateLabel("KHÔNG TÌM THẤY FILE", Color.Red);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lblEngineStatus.UpdateLabel("ĐANG HOẠT ĐỘNG", Color.Green);
|
||||
}
|
||||
}
|
||||
Thread.Sleep(TimeSpan.FromSeconds(1));
|
||||
}
|
||||
}
|
||||
|
||||
private PingResult GetPingStatus(string ipAddress)
|
||||
{
|
||||
PingResult pingResult = new PingResult();
|
||||
bool isPingable;
|
||||
isPingable = Util.IsPingable(ipAddress, out long replyTime);
|
||||
if (isPingable)
|
||||
{
|
||||
switch (replyTime)
|
||||
{
|
||||
case long n when (n >= 0 && n < 1):
|
||||
pingResult.ReplyTime = 1;
|
||||
pingResult.BackColor = Color.Green;
|
||||
break;
|
||||
case long n when (n >= 1 && n < 50):
|
||||
pingResult.ReplyTime = replyTime;
|
||||
pingResult.BackColor = Color.Green;
|
||||
break;
|
||||
case long n when (n >= 50):
|
||||
pingResult.ReplyTime = replyTime;
|
||||
pingResult.BackColor = Color.Red;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pingResult.ReplyTime = 0;
|
||||
pingResult.BackColor = Color.Gray;
|
||||
}
|
||||
return pingResult;
|
||||
}
|
||||
|
||||
private class PingResult
|
||||
{
|
||||
public long ReplyTime { get; set; }
|
||||
public Color BackColor { get; set; }
|
||||
public Color ForeColor { get; set; }
|
||||
}
|
||||
|
||||
private void StatusBar_Load(object sender, EventArgs e)
|
||||
{
|
||||
updateInfoThread.Start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
120
AIParkingApplication/StatusBar.resx
Normal file
120
AIParkingApplication/StatusBar.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -1,43 +1,229 @@
|
||||
using System;
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using OpenCvSharp;
|
||||
using System;
|
||||
using System.Configuration;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AIParkingApplication
|
||||
{
|
||||
public static class Util
|
||||
{
|
||||
public static bool IsPingable(string destinationIPAddress, int timeOut = UtilConstant.PING_TIMEOUT_MS)
|
||||
public static bool IsPingable(string destinationIPAddress, out long pingTime, int timeOut = UtilConstant.PING_TIMEOUT_MS)
|
||||
{
|
||||
var pingTask = Task.Factory.StartNew(async () =>
|
||||
{
|
||||
bool isPingable = false;
|
||||
Ping pinger = new Ping();
|
||||
try
|
||||
{
|
||||
PingReply reply = await pinger.SendPingAsync(destinationIPAddress, timeOut);
|
||||
isPingable = reply.Status == IPStatus.Success;
|
||||
if (!isPingable)
|
||||
{
|
||||
// Logging
|
||||
}
|
||||
return reply;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
isPingable = false;
|
||||
return null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
pinger.Dispose();
|
||||
}
|
||||
return isPingable;
|
||||
});
|
||||
|
||||
return pingTask.Result.Result;
|
||||
var pingResult = pingTask.Result.Result;
|
||||
if (pingResult != null && pingResult.Status == IPStatus.Success)
|
||||
{
|
||||
pingTime = pingResult.RoundtripTime;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
pingTime = -1;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetCurrentMethodName()
|
||||
{
|
||||
var strackTrace = new StackTrace();
|
||||
var sf = strackTrace.GetFrame(1);
|
||||
return sf.GetMethod().Name;
|
||||
}
|
||||
|
||||
public static Bitmap ConvertFromBase64Image(string base64ImageString)
|
||||
{
|
||||
byte[] imageData = Convert.FromBase64String(base64ImageString);
|
||||
using (var memoryStream = new MemoryStream(imageData))
|
||||
{
|
||||
Bitmap image = new Bitmap(memoryStream);
|
||||
return image;
|
||||
}
|
||||
}
|
||||
|
||||
public static void ExecuteCommand(string command)
|
||||
{
|
||||
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
|
||||
processInfo.CreateNoWindow = true;
|
||||
processInfo.UseShellExecute = false;
|
||||
processInfo.RedirectStandardError = true;
|
||||
processInfo.RedirectStandardOutput = true;
|
||||
using (var process = Process.Start(processInfo))
|
||||
{
|
||||
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine("Engine Output >>" + e.Data);
|
||||
process.BeginOutputReadLine();
|
||||
|
||||
process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine("Engine Error >>" + e.Data);
|
||||
process.BeginErrorReadLine();
|
||||
//process.WaitForExit();
|
||||
//Console.WriteLine("ExitCode: {0}", process.ExitCode);
|
||||
//process.Close();
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsValidIPAddress(string ipAddress)
|
||||
{
|
||||
if (string.IsNullOrEmpty(ipAddress))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool isValidIPAddress = IPAddress.TryParse(ipAddress, out IPAddress ip);
|
||||
return isValidIPAddress;
|
||||
}
|
||||
|
||||
public static void ParseHostString(string hostString, out string hostName, out int port)
|
||||
{
|
||||
if (!hostString.Contains(":"))
|
||||
{
|
||||
hostName = hostString;
|
||||
port = 80;
|
||||
return;
|
||||
}
|
||||
|
||||
string[] hostParts = hostString.Split(':');
|
||||
if (hostParts.Length != 2)
|
||||
{
|
||||
hostName = string.Empty;
|
||||
port = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
hostName = hostParts[0];
|
||||
int.TryParse(hostParts[1], out port);
|
||||
}
|
||||
|
||||
public static void UpsertAppSettings(string key, string value)
|
||||
{
|
||||
try
|
||||
{
|
||||
var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
|
||||
var settings = configFile.AppSettings.Settings;
|
||||
if (settings[key] == null)
|
||||
{
|
||||
settings.Add(key, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
settings[key].Value = value;
|
||||
}
|
||||
configFile.Save(ConfigurationSaveMode.Modified);
|
||||
ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
|
||||
}
|
||||
catch (ConfigurationErrorsException ex)
|
||||
{
|
||||
Console.WriteLine($"{DateTime.Now.GetTimeFormatted()}\tAddOrUpdateAppSettings\t{ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public static Rect ConvertRectangleToRect(Rectangle pictureBoxRoi, PictureBox pictureBoxPlateVideo)
|
||||
{
|
||||
Rect temp = new Rect
|
||||
{
|
||||
X = pictureBoxRoi.X * 1280 / pictureBoxPlateVideo.Width,
|
||||
Y = pictureBoxRoi.Y * 720 / pictureBoxPlateVideo.Height,
|
||||
Width = pictureBoxRoi.Width * 1280 / pictureBoxPlateVideo.Width,
|
||||
Height = pictureBoxRoi.Height * 720 / pictureBoxPlateVideo.Height
|
||||
};
|
||||
return temp;
|
||||
}
|
||||
|
||||
public static Rectangle ConvertStringToRectangle(string input)
|
||||
{
|
||||
var roi = JsonConvert.DeserializeObject<RoiConfig>(input);
|
||||
return new Rectangle
|
||||
{
|
||||
X = roi.X,
|
||||
Y = roi.Y,
|
||||
Height = roi.Height,
|
||||
Width = roi.Width
|
||||
};
|
||||
}
|
||||
|
||||
public static void AddApplicationToStartup()
|
||||
{
|
||||
using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
|
||||
{
|
||||
key.SetValue("AIParkingApplication", "\"" + Application.ExecutablePath + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveApplicationFromStartup()
|
||||
{
|
||||
using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true))
|
||||
{
|
||||
key.DeleteValue("AIParkingApplication", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class PlateRequestEngineModel
|
||||
{
|
||||
[JsonProperty("img64")]
|
||||
public string Img64 { get; set; }
|
||||
|
||||
[JsonProperty("mode")]
|
||||
public string Mode { get; set; }
|
||||
|
||||
[JsonProperty("display")]
|
||||
public string Display { get; set; }
|
||||
}
|
||||
|
||||
public class OcrResult
|
||||
{
|
||||
[JsonProperty("ocr")]
|
||||
public string PlateString { get; set; }
|
||||
|
||||
[JsonProperty("plate")]
|
||||
public string PlateImageBase64 { get; set; }
|
||||
}
|
||||
|
||||
public static class UtilConstant
|
||||
{
|
||||
public const int PING_TIMEOUT_MS = 500;
|
||||
|
||||
public const string HTTP_POST_METHOD = "POST";
|
||||
public const string HTTP_POST_CONTENTTYPE = "application/json";
|
||||
}
|
||||
|
||||
public class RoiConfig
|
||||
{
|
||||
[JsonProperty("x")]
|
||||
public int X { get; set; }
|
||||
|
||||
[JsonProperty("y")]
|
||||
public int Y { get; set; }
|
||||
|
||||
[JsonProperty("width")]
|
||||
public int Width { get; set; }
|
||||
|
||||
[JsonProperty("height")]
|
||||
public int Height { get; set; }
|
||||
|
||||
[JsonProperty("camera_id")]
|
||||
public string CameraID { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
3
AIParkingApplication/engine.bat
Normal file
3
AIParkingApplication/engine.bat
Normal file
@@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
wsl bash -c "cd ~/AIParking_Engine_deploy && tmux new-session -d -s "engine" gunicorn app:app -b 0.0.0.0:8080 --workers=2"
|
||||
exit
|
||||
@@ -1,7 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.7" targetFramework="net461" />
|
||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
|
||||
<package id="NLog" version="4.7.2" targetFramework="net461" />
|
||||
<package id="NLog.Config" version="4.7.2" targetFramework="net461" />
|
||||
<package id="NLog.Schema" version="4.7.2" targetFramework="net461" />
|
||||
<package id="OpenCvSharp4" version="4.3.0.20200524" targetFramework="net461" />
|
||||
<package id="OpenCvSharp4.runtime.win" version="4.3.0.20200524" targetFramework="net461" />
|
||||
<package id="OpenCvSharp4.Windows" version="4.3.0.20200524" targetFramework="net461" />
|
||||
<package id="System.Net.Http" version="4.3.4" targetFramework="net461" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net461" />
|
||||
</packages>
|
||||
31
AIParkingApplication/printerForm.html
Normal file
31
AIParkingApplication/printerForm.html
Normal file
@@ -0,0 +1,31 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
<style>
|
||||
@media only print {
|
||||
@page {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0 20px;
|
||||
height: 100px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body style="">
|
||||
<h3 style="text-align: center;"><em>BỆNH VIỆN BẠCH MAI</em></h3>
|
||||
<h2 style="text-align: center;"><strong>Biên lai thu tiền</strong></h2>
|
||||
<p>Biển số xe: <em><strong>{PLATE_STRING}</strong></em></p>
|
||||
<p>Thời gian vào: <em><strong>{TIME_PARKING_IN}</strong></em></p>
|
||||
<p>Thời gian ra: <strong><em>{TIME_PARKING_OUT}</em></strong></p>
|
||||
<p>Số tiền: <strong><em>{MONEY_AMOUNT}</em></strong></p>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
BIN
packages/Microsoft.AspNet.WebApi.Client.5.2.7/.signature.p7s
vendored
Normal file
BIN
packages/Microsoft.AspNet.WebApi.Client.5.2.7/.signature.p7s
vendored
Normal file
Binary file not shown.
BIN
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/net45/System.Net.Http.Formatting.dll
vendored
Normal file
BIN
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/net45/System.Net.Http.Formatting.dll
vendored
Normal file
Binary file not shown.
2094
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/net45/System.Net.Http.Formatting.xml
vendored
Normal file
2094
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/net45/System.Net.Http.Formatting.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/netstandard2.0/System.Net.Http.Formatting.dll
vendored
Normal file
BIN
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/netstandard2.0/System.Net.Http.Formatting.dll
vendored
Normal file
Binary file not shown.
4025
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/netstandard2.0/System.Net.Http.Formatting.xml
vendored
Normal file
4025
packages/Microsoft.AspNet.WebApi.Client.5.2.7/lib/netstandard2.0/System.Net.Http.Formatting.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/.signature.p7s
vendored
Normal file
BIN
packages/NLog.4.7.2/.signature.p7s
vendored
Normal file
Binary file not shown.
BIN
packages/NLog.4.7.2/lib/monoandroid44/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/monoandroid44/NLog.dll
vendored
Normal file
Binary file not shown.
26661
packages/NLog.4.7.2/lib/monoandroid44/NLog.xml
vendored
Normal file
26661
packages/NLog.4.7.2/lib/monoandroid44/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/net35/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/net35/NLog.dll
vendored
Normal file
Binary file not shown.
29160
packages/NLog.4.7.2/lib/net35/NLog.xml
vendored
Normal file
29160
packages/NLog.4.7.2/lib/net35/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/net40-client/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/net40-client/NLog.dll
vendored
Normal file
Binary file not shown.
29391
packages/NLog.4.7.2/lib/net40-client/NLog.xml
vendored
Normal file
29391
packages/NLog.4.7.2/lib/net40-client/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/net45/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/net45/NLog.dll
vendored
Normal file
Binary file not shown.
29589
packages/NLog.4.7.2/lib/net45/NLog.xml
vendored
Normal file
29589
packages/NLog.4.7.2/lib/net45/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/netstandard1.3/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/netstandard1.3/NLog.dll
vendored
Normal file
Binary file not shown.
25730
packages/NLog.4.7.2/lib/netstandard1.3/NLog.xml
vendored
Normal file
25730
packages/NLog.4.7.2/lib/netstandard1.3/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/netstandard1.5/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/netstandard1.5/NLog.dll
vendored
Normal file
Binary file not shown.
26729
packages/NLog.4.7.2/lib/netstandard1.5/NLog.xml
vendored
Normal file
26729
packages/NLog.4.7.2/lib/netstandard1.5/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/netstandard2.0/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/netstandard2.0/NLog.dll
vendored
Normal file
Binary file not shown.
27537
packages/NLog.4.7.2/lib/netstandard2.0/NLog.xml
vendored
Normal file
27537
packages/NLog.4.7.2/lib/netstandard2.0/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/sl4/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/sl4/NLog.dll
vendored
Normal file
Binary file not shown.
21873
packages/NLog.4.7.2/lib/sl4/NLog.xml
vendored
Normal file
21873
packages/NLog.4.7.2/lib/sl4/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/sl5/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/sl5/NLog.dll
vendored
Normal file
Binary file not shown.
22039
packages/NLog.4.7.2/lib/sl5/NLog.xml
vendored
Normal file
22039
packages/NLog.4.7.2/lib/sl5/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/wp8/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/wp8/NLog.dll
vendored
Normal file
Binary file not shown.
21215
packages/NLog.4.7.2/lib/wp8/NLog.xml
vendored
Normal file
21215
packages/NLog.4.7.2/lib/wp8/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.4.7.2/lib/xamarinios10/NLog.dll
vendored
Normal file
BIN
packages/NLog.4.7.2/lib/xamarinios10/NLog.dll
vendored
Normal file
Binary file not shown.
26607
packages/NLog.4.7.2/lib/xamarinios10/NLog.xml
vendored
Normal file
26607
packages/NLog.4.7.2/lib/xamarinios10/NLog.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/NLog.Config.4.7.2/.signature.p7s
vendored
Normal file
BIN
packages/NLog.Config.4.7.2/.signature.p7s
vendored
Normal file
Binary file not shown.
41
packages/NLog.Config.4.7.2/content/NLog.config
vendored
Normal file
41
packages/NLog.Config.4.7.2/content/NLog.config
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
|
||||
autoReload="true"
|
||||
throwExceptions="false"
|
||||
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
|
||||
|
||||
<!-- optional, add some variables
|
||||
https://github.com/nlog/NLog/wiki/Configuration-file#variables
|
||||
-->
|
||||
<variable name="myvar" value="myvalue"/>
|
||||
|
||||
<!--
|
||||
See https://github.com/nlog/nlog/wiki/Configuration-file
|
||||
for information on customizing logging rules and outputs.
|
||||
-->
|
||||
<targets>
|
||||
|
||||
<!--
|
||||
add your targets here
|
||||
See https://github.com/nlog/NLog/wiki/Targets for possible targets.
|
||||
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
|
||||
-->
|
||||
|
||||
<!--
|
||||
Write events to a file with the date in the filename.
|
||||
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
|
||||
layout="${longdate} ${uppercase:${level}} ${message}" />
|
||||
-->
|
||||
</targets>
|
||||
|
||||
<rules>
|
||||
<!-- add your logging rules here -->
|
||||
|
||||
<!--
|
||||
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
|
||||
<logger name="*" minlevel="Debug" writeTo="f" />
|
||||
-->
|
||||
</rules>
|
||||
</nlog>
|
||||
41
packages/NLog.Config.4.7.2/contentFiles/any/any/NLog.config
vendored
Normal file
41
packages/NLog.Config.4.7.2/contentFiles/any/any/NLog.config
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
|
||||
autoReload="true"
|
||||
throwExceptions="false"
|
||||
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
|
||||
|
||||
<!-- optional, add some variables
|
||||
https://github.com/nlog/NLog/wiki/Configuration-file#variables
|
||||
-->
|
||||
<variable name="myvar" value="myvalue"/>
|
||||
|
||||
<!--
|
||||
See https://github.com/nlog/nlog/wiki/Configuration-file
|
||||
for information on customizing logging rules and outputs.
|
||||
-->
|
||||
<targets>
|
||||
|
||||
<!--
|
||||
add your targets here
|
||||
See https://github.com/nlog/NLog/wiki/Targets for possible targets.
|
||||
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
|
||||
-->
|
||||
|
||||
<!--
|
||||
Write events to a file with the date in the filename.
|
||||
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
|
||||
layout="${longdate} ${uppercase:${level}} ${message}" />
|
||||
-->
|
||||
</targets>
|
||||
|
||||
<rules>
|
||||
<!-- add your logging rules here -->
|
||||
|
||||
<!--
|
||||
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
|
||||
<logger name="*" minlevel="Debug" writeTo="f" />
|
||||
-->
|
||||
</rules>
|
||||
</nlog>
|
||||
12
packages/NLog.Config.4.7.2/tools/Install.ps1
vendored
Normal file
12
packages/NLog.Config.4.7.2/tools/Install.ps1
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
param($installPath, $toolsPath, $package, $project)
|
||||
|
||||
$configItem = $project.ProjectItems.Item("NLog.config")
|
||||
|
||||
# set 'Copy To Output Directory' to 'Copy if newer'
|
||||
$copyToOutput = $configItem.Properties.Item("CopyToOutputDirectory")
|
||||
$copyToOutput.Value = 2
|
||||
|
||||
# set 'Build Action' to 'Content'
|
||||
$buildAction = $configItem.Properties.Item("BuildAction")
|
||||
$buildAction.Value = 2
|
||||
|
||||
BIN
packages/NLog.Schema.4.7.2/.signature.p7s
vendored
Normal file
BIN
packages/NLog.Schema.4.7.2/.signature.p7s
vendored
Normal file
Binary file not shown.
3638
packages/NLog.Schema.4.7.2/content/NLog.xsd
vendored
Normal file
3638
packages/NLog.Schema.4.7.2/content/NLog.xsd
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3638
packages/NLog.Schema.4.7.2/contentFiles/any/any/NLog.xsd
vendored
Normal file
3638
packages/NLog.Schema.4.7.2/contentFiles/any/any/NLog.xsd
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/.signature.p7s
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/.signature.p7s
vendored
Normal file
Binary file not shown.
20
packages/Newtonsoft.Json.12.0.3/LICENSE.md
vendored
Normal file
20
packages/Newtonsoft.Json.12.0.3/LICENSE.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2007 James Newton-King
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
BIN
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
10298
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.xml
vendored
Normal file
10298
packages/Newtonsoft.Json.12.0.3/lib/net20/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
9446
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.xml
vendored
Normal file
9446
packages/Newtonsoft.Json.12.0.3/lib/net35/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
9646
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.xml
vendored
Normal file
9646
packages/Newtonsoft.Json.12.0.3/lib/net40/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
11262
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.xml
vendored
Normal file
11262
packages/Newtonsoft.Json.12.0.3/lib/net45/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.dll
vendored
Normal file
BIN
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.dll
vendored
Normal file
Binary file not shown.
10950
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.xml
vendored
Normal file
10950
packages/Newtonsoft.Json.12.0.3/lib/netstandard1.0/Newtonsoft.Json.xml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user