diff --git a/02_Windows_App/Perun_v1/01_Classes/DatabaseController.cs b/02_Windows_App/Perun_v1/01_Classes/DatabaseController.cs index 0478575..3900a07 100644 --- a/02_Windows_App/Perun_v1/01_Classes/DatabaseController.cs +++ b/02_Windows_App/Perun_v1/01_Classes/DatabaseController.cs @@ -16,9 +16,9 @@ public class DatabaseController string strUDPFrameType = strUDPFrame.type; string strUDPFrameTimestamp = strUDPFrame.timestamp; string strUDPFrameInstance = strUDPFrame.instance; - string strUDPFramePayload = ""; - string strUDPFramePayload_Perun = ""; - string strSQLQueryTxt = ""; + string strUDPFramePayload; + string strUDPFramePayload_Perun; + string strSQLQueryTxt; // Some frames may come without timestamp, use database currrent timestampe then @@ -86,48 +86,58 @@ public class DatabaseController } // Connect to mysql and execute sql - connMySQL = new MySqlConnection(strMySQLConnectionString); try { - Console.WriteLine("Sending data to MySQL - Begin"); - connMySQL.Open(); - bStatus = true; - MySqlCommand cmdMySQL = new MySqlCommand(strSQLQueryTxt, connMySQL); - MySqlDataReader rdrMySQL = cmdMySQL.ExecuteReader(); + connMySQL = new MySqlConnection(strMySQLConnectionString); - while (rdrMySQL.Read()) + try { - Console.WriteLine(rdrMySQL[0] + " -- " + rdrMySQL[1]); + Console.WriteLine("Sending data to MySQL - Begin"); + connMySQL.Open(); + bStatus = true; + MySqlCommand cmdMySQL = new MySqlCommand(strSQLQueryTxt, connMySQL); + MySqlDataReader rdrMySQL = cmdMySQL.ExecuteReader(); + + while (rdrMySQL.Read()) + { + Console.WriteLine(rdrMySQL[0] + " -- " + rdrMySQL[1]); + } + rdrMySQL.Close(); + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "#" + strUDPFrameInstance + " > MySQL updated, package type: " + strUDPFrameType); } - rdrMySQL.Close(); - PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "#"+strUDPFrameInstance + " > MySQL updated, package type: " + strUDPFrameType); - } - catch (ArgumentException a_ex) - { - // General exception found - Console.WriteLine(a_ex.ToString()); - PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - package type: " + strUDPFrameType); - bStatus = false; - } - catch (MySqlException m_ex) - { - // MySQL exception found - PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - package type: " + strUDPFrameType); - switch (m_ex.Number) + catch (ArgumentException a_ex) { - case 1042: // Unable to connect to any of the specified MySQL hosts (Check Server,Port) - PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - unable to connect"); - break; - case 0: // Access denied (Check DB name,username,password) - PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - access denied"); - break; - default: - PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - " + m_ex.Number); - break; + // General exception found + Console.WriteLine(a_ex.ToString()); + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - package type: " + strUDPFrameType); + bStatus = false; } - bStatus = false; + catch (MySqlException m_ex) + { + // MySQL exception found + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - package type: " + strUDPFrameType); + switch (m_ex.Number) + { + case 1042: // Unable to connect to any of the specified MySQL hosts (Check Server,Port) + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - unable to connect"); + break; + case 0: // Access denied (Check DB name,username,password) + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - access denied"); + break; + default: + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - " + m_ex.Number); + break; + } + bStatus = false; + } + connMySQL.Close(); + Console.WriteLine("Sending data to MySQL - Done"); } - connMySQL.Close(); - Console.WriteLine("Sending data to MySQL - Done"); + catch (ArgumentException) + { + PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - wrong connection parameters"); + } + + } } diff --git a/02_Windows_App/Perun_v1/01_Classes/Program.cs b/02_Windows_App/Perun_v1/01_Classes/Program.cs index 7d0dff1..59686ac 100644 --- a/02_Windows_App/Perun_v1/01_Classes/Program.cs +++ b/02_Windows_App/Perun_v1/01_Classes/Program.cs @@ -17,7 +17,6 @@ namespace Perun_v1 static void Main() { - // Only instance Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ApplicationExit += new EventHandler(Application_ApplicationExit); diff --git a/02_Windows_App/Perun_v1/01_Classes/TCPController.cs b/02_Windows_App/Perun_v1/01_Classes/TCPController.cs index e093bca..6ca157b 100644 --- a/02_Windows_App/Perun_v1/01_Classes/TCPController.cs +++ b/02_Windows_App/Perun_v1/01_Classes/TCPController.cs @@ -7,67 +7,63 @@ using System.Text; using System.Threading; using System.Windows.Forms; -internal class TCPController +public class TCPController { // Main class for TCP listener - public static int intListenPort; // Port to connect to - public static bool boolDone; // Helper to exit main loop without killing thread - public static TcpListener tcpServer; // Listener object - public static string[] arrLogHistory; // Log history for GUI - public static string[] arrSendBuffer; // Mysql send buffer - public static Thread thrTCPListener; // Seperate thread for UDP + public int intListenPort; // Port to connect to + public bool bDone; // Helper to exit main loop without killing thread + public string[] arrLogHistory; // Log history for GUI + public string[] arrSendBuffer; // Mysql send buffer + public Thread thrTCPListener; // Seperate thread for TCP + public bool bStatus; // TCP connecion status - public static void Create(int intListenPort, ref string[] arrLogHistory, ref string[] arrSendBuffer) + public void Create(int par_intListenPort, ref string[] par_arrLogHistory, ref string[] par_arrSendBuffer) { // Create class - TCPController.intListenPort = intListenPort; - TCPController.arrLogHistory = arrLogHistory; - TCPController.arrSendBuffer = arrSendBuffer; + intListenPort = par_intListenPort; + arrLogHistory = par_arrLogHistory; + arrSendBuffer = par_arrSendBuffer; + bDone = false; + bStatus = false; } - public static void StopListen() + public void StopListen() { - // FInish listening - TCPController.boolDone = true; - TCPController.tcpServer.Stop(); - TCPController.tcpServer = null; + // Finish listening + bDone = true; + bStatus = false; for (int i = 0; i < arrSendBuffer.Length - 1; i++) { arrSendBuffer[i] = null; } - } - public static void StartListen() + public void StartListen() { - Console.WriteLine("TCP Listen start"); - while (!TCPController.boolDone) + while (!bDone) { + Console.WriteLine("TCP Listen start"); + TcpListener tcpServer = new TcpListener(IPAddress.Any, intListenPort); ; // Listener object + try { // Start listening to TCP - tcpServer = new TcpListener(IPAddress.Any, intListenPort); string strReceivedData; // Start the main loop - TCPController.boolDone = false; tcpServer.Start(); - while (!TCPController.boolDone) + bStatus = true; + while (!bDone) { // Start listening Console.WriteLine("TCP: Waiting for packet"); TcpClient tcpClient = tcpServer.AcceptTcpClient(); //if a connection exists, the server will accept it NetworkStream ns = tcpClient.GetStream(); //networkstream is used to send/receive messages - //tcpClient.ReceiveBufferSize = 65534; - while (tcpClient.Connected && !TCPController.boolDone) //while the client is connected, we look for incoming messages + while (tcpClient.Connected && !bDone) //while the client is connected, we look for incoming messages { - //arrReceiveByteArray = new byte[tcpClient.ReceiveBufferSize]; //the messages arrive as byte array - //ns.Read(arrReceiveByteArray, 0, arrReceiveByteArray.Length); //the same networkstream reads the message sent by the client - //strReceivedData = Encoding.ASCII.GetString(arrReceiveByteArray, 0, arrReceiveByteArray.Length); - StringBuilder CompleteMessage = new StringBuilder(); if (ns.CanRead) @@ -87,24 +83,33 @@ internal class TCPController strReceivedData = CompleteMessage.ToString(); Console.WriteLine("Sender: {0} Payload: {1}", null, strReceivedData); - dynamic dynamicRawTCPFrame = JsonConvert.DeserializeObject(strReceivedData); // Deserialize received frame - string strRawTCPFrameType = dynamicRawTCPFrame.type; - - PerunHelper.LogHistoryAdd(ref arrLogHistory, "TCP packet received, type: " + strRawTCPFrameType); - - // Add to mySQL send buffer (find first empty slot) - for (int i = 0; i < arrSendBuffer.Length - 1; i++) + try { - if (arrSendBuffer[i] == null) + dynamic dynamicRawTCPFrame = JsonConvert.DeserializeObject(strReceivedData); // Deserialize received frame + string strRawTCPFrameType = dynamicRawTCPFrame.type; + + PerunHelper.LogHistoryAdd(ref arrLogHistory, "TCP packet received, type: " + strRawTCPFrameType); + + // Add to mySQL send buffer (find first empty slot) + for (int i = 0; i < arrSendBuffer.Length - 1; i++) { - arrSendBuffer[i] = strReceivedData; - break; + if (arrSendBuffer[i] == null) + { + arrSendBuffer[i] = strReceivedData; + break; + } } } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + PerunHelper.LogHistoryAdd(ref arrLogHistory, "TCP ERROR incorrect JSON"); + } } } tcpServer.Stop(); + bStatus = false; } catch (Exception e) { @@ -114,8 +119,14 @@ internal class TCPController Console.WriteLine(e.ToString()); PerunHelper.LogHistoryAdd(ref arrLogHistory, "TCP error - connection closed or port in use"); } + } - //Console.WriteLine("TCP listen stop"); + if (!(tcpServer is null)) + { + tcpServer.Stop(); + } + bStatus = false; + Console.WriteLine("TCP listen stop"); } } } diff --git a/02_Windows_App/Perun_v1/02_Forms/form_Main.Designer.cs b/02_Windows_App/Perun_v1/02_Forms/form_Main.Designer.cs index 6ff0e75..36951ba 100644 --- a/02_Windows_App/Perun_v1/02_Forms/form_Main.Designer.cs +++ b/02_Windows_App/Perun_v1/02_Forms/form_Main.Designer.cs @@ -96,7 +96,7 @@ this.con_Button_Listen_ON.Name = "con_Button_Listen_ON"; this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39); this.con_Button_Listen_ON.TabIndex = 2; - this.con_Button_Listen_ON.Text = "Connect"; + this.con_Button_Listen_ON.Text = "Start"; this.con_Button_Listen_ON.UseVisualStyleBackColor = true; this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click); // @@ -107,7 +107,7 @@ this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF"; this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39); this.con_Button_Listen_OFF.TabIndex = 3; - this.con_Button_Listen_OFF.Text = "Disconnect"; + this.con_Button_Listen_OFF.Text = "Stop"; this.con_Button_Listen_OFF.UseVisualStyleBackColor = true; this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click); // @@ -156,7 +156,6 @@ // // con_txt_mysql_port // - this.con_txt_mysql_port.Enabled = false; this.con_txt_mysql_port.Location = new System.Drawing.Point(106, 45); this.con_txt_mysql_port.Name = "con_txt_mysql_port"; this.con_txt_mysql_port.Size = new System.Drawing.Size(207, 20); diff --git a/02_Windows_App/Perun_v1/02_Forms/form_Main.cs b/02_Windows_App/Perun_v1/02_Forms/form_Main.cs index 11d2797..a9a3360 100644 --- a/02_Windows_App/Perun_v1/02_Forms/form_Main.cs +++ b/02_Windows_App/Perun_v1/02_Forms/form_Main.cs @@ -10,18 +10,22 @@ namespace Perun_v1 public partial class form_Main : Form { // Variable definitions - public string[] arrSendBuffer = new string[65534]; // Mysql send buffer - public bool boolLetMeOut = false; // Helper to handle system tray - public DatabaseController dbConnection = new DatabaseController(); + public string[] arrSendBuffer = new string[65534]; // MySQL send buffer + public bool bLetMeOut = false; // Helper to handle system tray + + public DatabaseController dcConnection = new DatabaseController(); // MySQL controller + public TCPController tcpcServer=new TCPController(); // TCP controller + + public bool bSRSStatus; // Use empty/default SRS status + public bool bLotATCStatus; // Use empty/default LotATC status // ################################ Main ################################ private void form_Main_Load(object sender, EventArgs e) { // Form loaded - fill controls with default values - Globals.arrLogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun started"; - form_Main_LoadSettings(); // Load settings - this.Text = PerunHelper.GetAppVersion(this.Text + " - "); // Display build version in title bar + form_Main_LoadSettings(); // Load settings + this.Text = PerunHelper.GetAppVersion(this.Text + " - "); // Display build version in title bar } public form_Main() @@ -62,7 +66,6 @@ namespace Perun_v1 Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text; Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked; Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked; - Properties.Settings.Default.DCS_Server_Port = Int32.Parse(con_txt_dcs_server_port.Text); Properties.Settings.Default.DCS_Instance = Int32.Parse(con_txt_dcs_instance.Text); @@ -92,7 +95,6 @@ namespace Perun_v1 // Enables controls con_Button_Listen_ON.Enabled = true; con_Button_Listen_OFF.Enabled = false; - con_txt_mysql_database.Enabled = true; con_txt_mysql_username.Enabled = true; con_txt_mysql_password.Enabled = true; @@ -104,28 +106,30 @@ namespace Perun_v1 con_check_3rd_srs.Enabled = true; con_txt_dcs_server_port.Enabled = true; con_txt_dcs_instance.Enabled = true; - } // ################################ User input ################################ private void con_Button_Listen_ON_Click(object sender, EventArgs e) { // Start listening - TCPController.Create(Int32.Parse(con_txt_dcs_server_port.Text), ref Globals.arrLogHistory, ref arrSendBuffer); - TCPController.thrTCPListener = new Thread(TCPController.StartListen); - TCPController.thrTCPListener.Start(); - TCPController.thrTCPListener.Name = "TCPThread"; + tcpcServer.Create(Int32.Parse(con_txt_dcs_server_port.Text), ref Globals.arrLogHistory, ref arrSendBuffer); + tcpcServer.thrTCPListener = new Thread(tcpcServer.StartListen); + tcpcServer.thrTCPListener.Start(); + tcpcServer.thrTCPListener.Name = "TCPThread"; - form_Main_DisableControls(); // Disable controlls - form_Main_SaveSettings(); // Save settings + form_Main_DisableControls(); // Disable controlls + form_Main_SaveSettings(); // Save settings // Prepare connection string - dbConnection.strMySQLConnectionString = "server=" + con_txt_mysql_server.Text + ";user=" + con_txt_mysql_username.Text + ";database=" + con_txt_mysql_database.Text + ";port=" + con_txt_mysql_port.Text + ";password=" + con_txt_mysql_password.Text; + dcConnection.strMySQLConnectionString = "server=" + con_txt_mysql_server.Text + ";user=" + con_txt_mysql_username.Text + ";database=" + con_txt_mysql_database.Text + ";port=" + con_txt_mysql_port.Text + ";password=" + con_txt_mysql_password.Text; // Start timmers tim_200ms.Enabled = true; tim_1000ms.Enabled = true; tim_10000ms.Enabled = true; + + // Send initial data + tim_10000ms_Tick(null, null); } private void con_Button_Listen_OFF_Click(object sender, EventArgs e) @@ -133,7 +137,7 @@ namespace Perun_v1 // Stop listening try { - TCPController.StopListen(); + tcpcServer.StopListen(); } catch (Exception ex) { @@ -142,6 +146,11 @@ namespace Perun_v1 form_Main_EnableControls(); // Enable controls + con_img_db.Image = null; + con_img_dcs.Image = null; + con_img_lotATC.Image = null; + con_img_srs.Image = null; + // Stop timmers tim_1000ms.Enabled = false; tim_10000ms.Enabled = false; @@ -194,7 +203,7 @@ namespace Perun_v1 { form_Main_SaveSettings(); - boolLetMeOut = true; // Save settings on exit + bLetMeOut = true; // Save settings on exit this.Close(); // Allow to exit application } else if (dialogResult == DialogResult.No) @@ -244,7 +253,7 @@ namespace Perun_v1 private void form_Main_FormClosing(object sender, FormClosingEventArgs e) { // Minimize to try on clicking "X" - if (e.CloseReason == CloseReason.UserClosing && !boolLetMeOut) + if (e.CloseReason == CloseReason.UserClosing && !bLetMeOut) { e.Cancel = true; form_Main_SendToTray(); // Send app to system tray @@ -279,22 +288,45 @@ namespace Perun_v1 { if (arrSendBuffer[i] != null) { - dbConnection.SendToMySql(arrSendBuffer[i]); + dcConnection.SendToMySql(arrSendBuffer[i]); arrSendBuffer[i] = null; } } - // Update icons - if (dbConnection.bStatus) + // Update status icons at main form + if (dcConnection.bStatus) { con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_db"); } else { con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_error"); } - con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_game"); - con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_srs"); - con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_lotatc"); + if (tcpcServer.bStatus) + { + con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_game"); + } + else + { + con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_error"); + } + if (bSRSStatus) + { + con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_srs"); + } + else + { + con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_error"); + } + if (bLotATCStatus) + { + con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_lotatc"); + } + else + { + con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("ico_error"); + } + + } private void tim_10000ms_Tick(object sender, EventArgs e) @@ -356,11 +388,12 @@ namespace Perun_v1 } boolSRSdefault = false; PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "#" + Int32.Parse(con_txt_dcs_instance.Text) + " > SRS data loaded"); - + bSRSStatus = true; } catch { PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "#" + Int32.Parse(con_txt_dcs_instance.Text) + " > SRS data ERROR"); + bSRSStatus = false; } @@ -369,7 +402,7 @@ namespace Perun_v1 { strSRSJson = "{'type':'100','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'true'}}"; } - dbConnection.SendToMySql(strSRSJson); + dcConnection.SendToMySql(strSRSJson); // Handle LotATC - TBD clean code for multiinstance if (con_check_3rd_lotatc.Checked) @@ -382,10 +415,12 @@ namespace Perun_v1 strLotATCJson = "{'type':'101','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':'" + strLotATCJson + "'}"; boolLotATCdefault = false; PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "#" + Int32.Parse(con_txt_dcs_instance.Text) + " > LotATC data loaded"); + bLotATCStatus = true; } catch { PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "#" + Int32.Parse(con_txt_dcs_instance.Text) + " > LotATC data ERROR"); + bLotATCStatus = false; } @@ -394,7 +429,7 @@ namespace Perun_v1 { strLotATCJson = "{'type':'101','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'true'}}"; // No LotATC controller connected } - dbConnection.SendToMySql(strLotATCJson); + dcConnection.SendToMySql(strLotATCJson); } } } diff --git a/02_Windows_App/Perun_v1/Perun_v1.csproj b/02_Windows_App/Perun_v1/Perun_v1.csproj index 857d2d4..6824983 100644 --- a/02_Windows_App/Perun_v1/Perun_v1.csproj +++ b/02_Windows_App/Perun_v1/Perun_v1.csproj @@ -75,7 +75,7 @@ true - true + false false