From f03ccad8637a07642fa24b1cbae6d6f466c519d2 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Mon, 19 Oct 2015 18:52:09 +0200 Subject: [PATCH] Move ChatItem to library. Fix bugs with connecting. --- .../.vs/ErgometerApplication/v14/.suo | Bin 101376 -> 112128 bytes .../ErgometerApplication/ChatItem.cs | 63 ------------------ .../ClientApplicatie.Designer.cs | 3 +- .../ErgometerApplication/ClientApplicatie.cs | 46 +++++++------ .../ErgometerApplication.csproj | 3 - .../ErgometerApplication/MainClient.cs | 25 +++++-- .../ErgometerApplication/PanelClientChat.cs | 24 +++---- .../PanelClientContainer.cs | 2 +- .../bin/Debug/ErgometerLibrary.dll | Bin 24064 -> 25600 bytes 9 files changed, 56 insertions(+), 110 deletions(-) delete mode 100644 ErgometerApplication/ErgometerApplication/ChatItem.cs diff --git a/ErgometerApplication/.vs/ErgometerApplication/v14/.suo b/ErgometerApplication/.vs/ErgometerApplication/v14/.suo index 5b04bd4e755a254d28da2785f974f27a2423cbd8..aba3c9a054f846c118635fb16fcc6d3041d9d0b0 100644 GIT binary patch delta 8684 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 UvjA@1E!qMf$fcM0Y?=H&05N<{9 delta 5101 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 10) + { + count = 0; + panelGraphView.updateAllCharts(MainClient.Metingen); + } + + count++; } } @@ -59,37 +70,30 @@ namespace ErgometerApplication } if (password.Length > 0 && password.Length < 4) { - panelLogin.lblVerification.Text = "Vul een wachtwoord in van minimaal 8 karakters."; + panelLogin.lblVerification.Text = "Vul een wachtwoord in van minimaal 4 karakters."; panelLogin.lblVerification.ForeColor = Color.Red; panelLogin.lblVerification.Visible = true; } if (password.Length >= 3) { - /* - if(SerialPort.GetPortNames().Length <= 0) + string error = ""; + bool connect = MainClient.Connect(SerialPort.GetPortNames()[0], username, password, out error); + + if (connect) { - panelLogin.lblVerification.Text = "De Ergometer is niet gevonden."; + panelClientContainer.BringToFront(); + chat = panelClientChat; + this.labelUsername.Text = panelLogin.textBoxUsername.Text; + panelTopBar.Visible = true; + updateTimer.Start(); + } + else + { + panelLogin.lblVerification.Text = error; panelLogin.lblVerification.ForeColor = Color.Red; panelLogin.lblVerification.Visible = true; } - else - { */ - if(MainClient.Connect(SerialPort.GetPortNames()[0], username, password)) - { - panelClientContainer.BringToFront(); - chat = panelClientChat; - this.labelUsername.Text = panelLogin.textBoxUsername.Text; - panelTopBar.Visible = true; - updateTimer.Start(); - } - else - { - panelLogin.lblVerification.Text = "De inloggegevens zijn onjuist."; - panelLogin.lblVerification.ForeColor = Color.Red; - panelLogin.lblVerification.Visible = true; - } - //} } } else diff --git a/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj b/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj index 94c73b0..4e96fa2 100644 --- a/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj +++ b/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj @@ -59,9 +59,6 @@ Component - - Component - Component diff --git a/ErgometerApplication/ErgometerApplication/MainClient.cs b/ErgometerApplication/ErgometerApplication/MainClient.cs index f39bc14..26506af 100644 --- a/ErgometerApplication/ErgometerApplication/MainClient.cs +++ b/ErgometerApplication/ErgometerApplication/MainClient.cs @@ -49,11 +49,20 @@ namespace ErgometerApplication Client = client; } - public static bool Connect(string comport, string name, string password) + public static bool Connect(string comport, string name, string password, out string error) { + error = "Succes"; + if (!Doctor.Connected) { - Doctor.Connect(HOST, PORT); + try { + Doctor.Connect(HOST, PORT); + } + catch (Exception e) + { + error = "De server is niet online."; + return false; + } Name = name; NetCommand net = NetHelper.ReadNetCommand(Doctor); @@ -63,6 +72,7 @@ namespace ErgometerApplication throw new Exception("Session not assigned"); running = true; + t.IsBackground = true; t.Start(); } @@ -75,6 +85,7 @@ namespace ErgometerApplication if (response.Type == NetCommand.CommandType.RESPONSE && response.Response == NetCommand.ResponseType.LOGINWRONG) { Loggedin = false; + error = "De inloggegevens zijn onjuist."; return false; } @@ -99,7 +110,10 @@ namespace ErgometerApplication SaveMeting(response); } else - throw new Exception("Comport was unable to connect"); + { + error = "De ergometer is niet verbonden"; + return false; + } } return true; @@ -159,8 +173,9 @@ namespace ErgometerApplication ParseValueSet(command); break; case NetCommand.CommandType.CHAT: - Chat.Add(new ChatMessage(Name, command.ChatMessage, true)); - Client.chat.Invoke(Client.chat.passChatMessage, new Object[] {command.ChatMessage, Helper.MillisecondsToTime(command.Timestamp), true}); + ChatMessage chat = new ChatMessage(command.DisplayName, command.ChatMessage, true); + Chat.Add(chat); + Client.chat.Invoke(Client.chat.passChatMessage, new Object[] { chat }); break; case NetCommand.CommandType.RESPONSE: Console.WriteLine(command.Response.ToString()); diff --git a/ErgometerApplication/ErgometerApplication/PanelClientChat.cs b/ErgometerApplication/ErgometerApplication/PanelClientChat.cs index 0c4d7b9..1ad2db0 100644 --- a/ErgometerApplication/ErgometerApplication/PanelClientChat.cs +++ b/ErgometerApplication/ErgometerApplication/PanelClientChat.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ErgometerLibrary; +using ErgometerLibrary.Chat; namespace ErgometerApplication { @@ -66,7 +67,7 @@ namespace ErgometerApplication this.connectionLabel.Name = "connectionLabel"; this.connectionLabel.Size = new System.Drawing.Size(112, 13); this.connectionLabel.TabIndex = 0; - this.connectionLabel.Text = "Now connected with:"; + this.connectionLabel.Text = "Now connected with: Doctor"; // // label2 // @@ -100,7 +101,7 @@ namespace ErgometerApplication this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(85, 90); this.button1.TabIndex = 1; - this.button1.Text = "Verstuur"; + this.button1.Text = "Send"; this.button1.UseVisualStyleBackColor = false; this.button1.Click += new System.EventHandler(this.button1_Click); // @@ -147,27 +148,17 @@ namespace ErgometerApplication { if (richTextBox1.TextLength > 1) { - AddChatItem(richTextBox1.Text, Helper.MillisecondsToTime(Helper.Now), false); + AddChatItem(new ChatMessage("Anon", richTextBox1.Text, false)); MainClient.SendNetCommand(new NetCommand(richTextBox1.Text, MainClient.Session)); richTextBox1.ResetText(); } } - public void AddChatItem(string text) + public void AddChatItem(ChatMessage chat) { - flowLayoutPanel1.Controls.Add(new ChatItem(text, Helper.MillisecondsToTime(Helper.Now), true)); + flowLayoutPanel1.Controls.Add(new ChatItem(chat)); } - public void AddChatItem(string text, bool isDoctor) - { - flowLayoutPanel1.Controls.Add(new ChatItem(text, Helper.MillisecondsToTime(Helper.Now), isDoctor)); - } - - public void AddChatItem(string text, string time, bool isDoctor) - { - flowLayoutPanel1.Controls.Add(new ChatItem(text,time,isDoctor)); - } - private void panel3_MouseWheel(object sender, MouseEventArgs e) { panel3.Focus(); @@ -201,10 +192,11 @@ namespace ErgometerApplication if (e.KeyCode == Keys.Enter) { button1_Click(this, new EventArgs()); + e.Handled = true; } } - public delegate void ChatDelegate(string text, string time, bool isDoctor); + public delegate void ChatDelegate(ChatMessage chat); public ChatDelegate passChatMessage; } } diff --git a/ErgometerApplication/ErgometerApplication/PanelClientContainer.cs b/ErgometerApplication/ErgometerApplication/PanelClientContainer.cs index f2e40ef..1595464 100644 --- a/ErgometerApplication/ErgometerApplication/PanelClientContainer.cs +++ b/ErgometerApplication/ErgometerApplication/PanelClientContainer.cs @@ -11,7 +11,7 @@ namespace ErgometerApplication { public PanelClientChat panelClientChat; - private PanelGraphView panelGraphView; + public PanelGraphView panelGraphView; public PanelClientContainer() : base() { diff --git a/ErgometerApplication/ErgometerApplication/bin/Debug/ErgometerLibrary.dll b/ErgometerApplication/ErgometerApplication/bin/Debug/ErgometerLibrary.dll index 68219db59007ff920ba2496f5cd70ae8c1dd23ad..eacc8eb1987d1907a2a910f9e11836c8d865ad37 100644 GIT binary patch delta 7731 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 UH5){$J^h?VYZ=lSnfjUd7t@T-p#T5?