Compare commits

..

No commits in common. "2c60eebda1d6dd174c1ed9e16e6824e2a55042d7" and "646449b4ba338a672768989e308c6ce123c83107" have entirely different histories.

7 changed files with 31 additions and 95 deletions

View File

@ -63,18 +63,6 @@ namespace AIParkingApplication
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;
}
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}");
}
private void InitAllLanes()

View File

@ -44,7 +44,6 @@ namespace AIParkingApplication
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,
@ -75,7 +74,7 @@ namespace AIParkingApplication
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}");
appLogger.Log(LogLevel.Info, $"Query dữ liệu thống kê bãi xe lỗi. exMessage: {ex.Message}");
return null;
}
}
@ -85,13 +84,17 @@ namespace AIParkingApplication
int requestCounter = 1;
try
{
var request = new CardModel()
{
CardNumber = cardNumber
};
HttpResponseMessage response;
do
{
response = await httpClient.PostAsJsonAsync("/api/check-card", new CardModel { CardNumber = cardNumber });
response = await httpClient.PostAsJsonAsync("/api/check-card", request);
response.EnsureSuccessStatusCode();
requestCounter += 1;
await Task.Delay(800);
await Task.Delay(100);
}
while (response.StatusCode != HttpStatusCode.OK && requestCounter < numberOfRetry);
@ -101,11 +104,12 @@ namespace AIParkingApplication
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}");
appLogger.Log(LogLevel.Info, $"Query thông tin thẻ lỗi. Thẻ số: {cardNumber} | số lần thử lại: {requestCounter} | exMessage: {ex.Message}");
return null;
}
}
//Neu Dicrection la Out thi logID la logID lay ve khi check the
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());
@ -137,7 +141,7 @@ namespace AIParkingApplication
response = await httpClient.PostAsJsonAsync("/api/save-logs", request);
response.EnsureSuccessStatusCode();
requestCounter += 1;
await Task.Delay(800);
await Task.Delay(100);
} while (response.StatusCode != HttpStatusCode.OK && requestCounter < numberOfRetry);
SaveLogRespone saveLogRespone = await response.Content.ReadAsAsync<SaveLogRespone>();
return saveLogRespone;
@ -145,7 +149,7 @@ namespace AIParkingApplication
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));
appLogger.Log(LogLevel.Info, 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;
}
}

View File

@ -4,9 +4,7 @@
<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="CURRENT_LANE_SETTING" value="IN-OUT" />
<add key="AUTO_LOGIN" value="false" />
<add key="USE_PRINTER" value="false" />
<add key="CURRENT_LANE_SETTING" value="OUT-OUT" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />

View File

@ -1,5 +1,4 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
@ -70,14 +69,14 @@ namespace AIParkingApplication
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Ệ");
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: THẺ KHÔNG HỢP LỆ");
return;
}
if (cardInfoResult.Direction != "in")
{
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");
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: XE ĐÃ Ở TRONG BÃI");
return;
}
@ -149,24 +148,21 @@ namespace AIParkingApplication
{
try
{
var starTime = DateTime.Now;
Cv2.Resize(frame, frame, new OpenCvSharp.Size(1280, 720));
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);
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 = frame,

View File

@ -1,5 +1,4 @@
using System;
using System.Configuration;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
@ -25,7 +24,6 @@ namespace AIParkingApplication
private ApiController apiController;
private Printer printer;
private Logger appLogger;
private bool isUsePrinter;
public LaneOut(int doorId,
string cameraId,
@ -54,7 +52,6 @@ namespace AIParkingApplication
this.doorControlAccess = doorControlAccess;
printer = new Printer(appLogger);
plateProcessor = new PlateProcessor(engineApiController, this.isSupportSquarePlate, this.isSupportLongPlate);
ReadUsePrinterConfig();
}
private async void C3Device_OnNewCardReceived(int doorId, string cardNumber)
@ -75,14 +72,14 @@ namespace AIParkingApplication
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Ệ");
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | 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} vào | số thẻ : {cardNumber} | lỗi: XE ĐÃ Ở TRONG BÃI");
appLogger.Log(LogLevel.Error, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | lỗi: XE ĐÃ Ở TRONG BÃI");
return;
}
@ -124,18 +121,14 @@ namespace AIParkingApplication
OpenDoor(doorId);
appLogger.Log(LogLevel.Info, $"Request thẻ cổng {doorId} vào | số thẻ : {cardNumber} | biển số: {result.PlateString} | Đã mở cửa");
}
if (isUsePrinter)
PrinterData printerData = new PrinterData
{
PrinterData printerData = new PrinterData
{
PlateString = result.PlateString,
MoneyAmount = saveLogResult.Cost,
TimeParkingIn = cardInformation.TimeIn,
TimeParkingOut = DateTime.Now.GetTimeFormatted()
};
printer.DoPrint(printerData);
}
PlateString = result.PlateString,
MoneyAmount = saveLogResult.Cost,
TimeParkingIn = cardInformation.TimeIn,
TimeParkingOut = DateTime.Now.GetTimeFormatted()
};
printer.DoPrint(printerData);
}
else
{
@ -144,19 +137,6 @@ namespace AIParkingApplication
}
}
private void ReadUsePrinterConfig()
{
try
{
bool.TryParse(ConfigurationManager.AppSettings["USE_PRINTER"], out isUsePrinter);
}
catch (Exception ex)
{
Util.AddOrUpdateAppSettings("USE_PRINTER", "false");
appLogger.Log(LogLevel.Error, $"Không thể đọc cấu hình: USE_PRINTER");
}
}
private void PlateCamera_OnOpenVideoStreamFailed(Mat videoFrame)
{
pictureBoxPlateVideo.UpdateImage(videoFrame.ToBitmap());
@ -181,11 +161,9 @@ namespace AIParkingApplication
private void OpenDoor(int doorId)
{
var openDoorResult = doorControlAccess.OpenDoor(doorId);
if (openDoorResult.HasError)
if (doorControlAccess.OpenDoor(doorId).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}");
}
}
@ -193,7 +171,6 @@ namespace AIParkingApplication
{
try
{
var starTime = DateTime.Now;
Cv2.Resize(frame, frame, new OpenCvSharp.Size(1280, 720));
FinalPlateResult finalPlateResult = await plateProcessor.ProcessPlate(frame);
@ -204,7 +181,6 @@ namespace AIParkingApplication
overviewCamera.RequestCaptureOneFrame();
finalPlateResult = await plateProcessor.ProcessPlate(frame);
}
appLogger.Log(LogLevel.Info, $"ProcessFrameImage: {(DateTime.Now - starTime).TotalMilliseconds} ms");
return finalPlateResult;
}
catch (Exception ex)

View File

@ -3,7 +3,6 @@ using System;
using System.Configuration;
using System.Drawing;
using System.IO;
using System.Threading;
using System.Windows.Forms;
namespace AIParkingApplication
@ -12,14 +11,12 @@ namespace AIParkingApplication
{
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;
if (File.Exists(AppConstant.DEFAULT_LOGO_IMAGE))
{
pictureBoxImageLogo.Image = new Bitmap(AppConstant.DEFAULT_LOGO_IMAGE);
@ -37,7 +34,7 @@ namespace AIParkingApplication
{
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");
applicationLogger.Log(LogLevel.Error, "Địa chỉ server không được để trống");
return;
}
@ -47,7 +44,7 @@ namespace AIParkingApplication
{
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");
applicationLogger.Log(LogLevel.Error, "Địa chỉ server không đúng định dạng");
return;
}
@ -57,9 +54,9 @@ namespace AIParkingApplication
}
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;
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");
return;
}
@ -70,7 +67,7 @@ namespace AIParkingApplication
{
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");
applicationLogger.Log(LogLevel.Error, "Tên tài khoản hoặc mật khẩu không được để trống");
return;
}
@ -82,7 +79,7 @@ namespace AIParkingApplication
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");
applicationLogger.Log(LogLevel.Error, "Sai tên tài khoản hoặc mật khẩu");
return;
}
@ -120,34 +117,12 @@ namespace AIParkingApplication
}
}
private void DoAutoLogin()
{
try
{
}
catch (Exception ex)
{
Util.AddOrUpdateAppSettings("AUTO_LOGIN", string.Empty);
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: DEFAULT_USERNAME, DEFAULT_PASSWORD");
}
}
private void ReadAppConfigurationFromFile()
{
try
{
txtUsername.Text = ConfigurationManager.AppSettings["DEFAULT_USERNAME"];
txtPassword.Text = ConfigurationManager.AppSettings["DEFAULT_PASSWORD"];
bool.TryParse(ConfigurationManager.AppSettings["AUTO_LOGIN"], out isAutoLogin);
Thread.Sleep(500);
if (isAutoLogin)
{
lblLoginStatus.UpdateLabel("Đang đăng nhập", Color.Green, Color.White);
Login();
}
}
catch (Exception ex)
{
@ -155,7 +130,6 @@ namespace AIParkingApplication
txtPassword.Text = string.Empty;
Util.AddOrUpdateAppSettings("DEFAULT_USERNAME", string.Empty);
Util.AddOrUpdateAppSettings("DEFAULT_PASSWORD", string.Empty);
Util.AddOrUpdateAppSettings("AUTO_LOGIN", "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: DEFAULT_USERNAME, DEFAULT_PASSWORD");
}

View File

@ -47,7 +47,7 @@ namespace AIParkingApplication
catch (Exception ex)
{
Console.WriteLine($"ProcessingString\texMessage:{ex.Message}");
appLogger.Log(LogLevel.Error, $"Lỗi khi In hóa đơn: {ex.Message}");
appLogger.Log(LogLevel.Info, $"Lỗi khi In hóa đơn: {ex.Message}");
return string.Empty;
}
}