diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/ErgometerIPR/ErgometerApplication/App.config b/ErgometerIPR/ErgometerApplication/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerApplication/ChartPanel.cs b/ErgometerIPR/ErgometerApplication/ChartPanel.cs new file mode 100644 index 0000000..a9b459a --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/ChartPanel.cs @@ -0,0 +1,105 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace ErgometerApplication +{ + public class ChartPanel : Panel + { + private Chart chart; + private MetingType type; + private ChartArea chartArea; + private Series series; + private SeriesChartType ChartType; + + public ChartPanel(MetingType type, SeriesChartType charttype) : base() + { + this.type = type; + this.ChartType = charttype; + + this.chart = new Chart(); + this.chartArea = new ChartArea(); + this.chart.Titles.Add(new Title(type.ToString())); + + this.Location = new System.Drawing.Point(0, 0); + + this.Size = new System.Drawing.Size(400, 250); + this.Controls.Add(chart); + + this.series = createSerie(); + this.chartArea.Name = "chartArea"; + + this.chart.Size = new System.Drawing.Size(400, 250); + + this.chart.Dock = DockStyle.Fill; + this.chart.Series.Add(series); + this.chart.Text = "chart"; + + + this.chart.ChartAreas.Add(chartArea); + + } + + public void updateChart(List metingen) + { + chart.Series[0] = createSerie(); + for (int i = 0; i < metingen.Count; i++) + { + chart.Series[0].Points.Add(getMetingType(metingen[i])); + } + chart.Update(); + } + + public Series createSerie() + { + Series serie = new Series(); + serie.Name = "series"; + serie.ChartType = ChartType; + serie.ChartArea = "chartArea"; + serie.BorderWidth = 3; + return serie; + } + + public int getMetingType(Meting meting) + { + switch (type) + { + case MetingType.HEARTBEAT: + return meting.HeartBeat; + case MetingType.RPM: + return meting.RPM; + case MetingType.SPEED: + return (int)meting.Speed; + case MetingType.DISTANCE: + return (int)meting.Distance; + case MetingType.POWER: + return meting.Power; + case MetingType.ENERGY: + return meting.Energy; + case MetingType.SECONDS: + return meting.Seconds; + case MetingType.ACTUALPOWER: + return meting.ActualPower; + default: + return 0; + } + } + + public enum MetingType + { + HEARTBEAT, + RPM, + SPEED, + DISTANCE, + POWER, + ENERGY, + SECONDS, + ACTUALPOWER + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/ClientApplicatie.Designer.cs b/ErgometerIPR/ErgometerApplication/ClientApplicatie.Designer.cs new file mode 100644 index 0000000..9b19b4f --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/ClientApplicatie.Designer.cs @@ -0,0 +1,187 @@ +using System.IO.Ports; +using System.Windows.Forms; + +namespace ErgometerApplication +{ + partial class ClientApplicatie + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.updateTimer = new System.Windows.Forms.Timer(this.components); + this.panelClientContainer = new System.Windows.Forms.Panel(); + this.panelDataViewLeft = new System.Windows.Forms.Panel(); + this.panelGraphView = new ErgometerApplication.PanelGraphView(); + this.panelClientChat = new ErgometerApplication.PanelClientChat(); + this.panelLogin = new ErgometerApplication.PanelLogin(this); + this.panelTopBar = new System.Windows.Forms.Panel(); + this.buttonLogOff = new System.Windows.Forms.Button(); + this.labelUsername = new System.Windows.Forms.Label(); + this.labelHallo = new System.Windows.Forms.Label(); + + this.heartBeat = new PanelClientData("Hartslag", 50, 220); + this.RPM = new PanelClientData("RPM", 0, 120); + this.speed = new PanelClientData("Snelheid", 0, 50); + this.distance = new PanelClientData("Afstand (km)", 0, 100); + this.power = new PanelClientData("Weerstand", 25, 400); + this.energy = new PanelClientData("Energie", 0, 200); + this.actualpower = new PanelClientData("Absolute Weerstand", 0, 400); + this.time = new PanelClientData("Tijd", 0, 400); + + this.panelClientContainer.SuspendLayout(); + this.panelTopBar.SuspendLayout(); + this.SuspendLayout(); + // + // updateTimer + // + this.updateTimer.Interval = 600; + this.updateTimer.Tick += new System.EventHandler(this.updateTimer_Tick); + // + // panelClientContainer + // + this.panelClientContainer.Controls.Add(this.panelGraphView); + this.panelClientContainer.Controls.Add(this.panelDataViewLeft); + + this.panelClientContainer.Controls.Add(this.panelClientChat); + this.panelClientContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelClientContainer.Location = new System.Drawing.Point(0, 0); + this.panelClientContainer.Name = "panelClientContainer"; + this.panelClientContainer.Size = new System.Drawing.Size(800, 600); + this.panelClientContainer.TabIndex = 0; + // + // panelDataViewLeft + // + this.panelDataViewLeft.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDataViewLeft.Location = new System.Drawing.Point(0, 0); + this.panelDataViewLeft.Name = "panelDataViewLeft"; + this.panelDataViewLeft.Size = new System.Drawing.Size(18, 600); + this.panelDataViewLeft.TabIndex = 3; + this.panelDataViewLeft.BackColor = System.Drawing.Color.Gray; + this.panelDataViewLeft.Controls.Add(heartBeat); + this.panelDataViewLeft.Controls.Add(RPM); + this.panelDataViewLeft.Controls.Add(speed); + this.panelDataViewLeft.Controls.Add(distance); + this.panelDataViewLeft.Controls.Add(power); + this.panelDataViewLeft.Controls.Add(energy); + this.panelDataViewLeft.Controls.Add(actualpower); + this.panelDataViewLeft.Controls.Add(time); + + // + // panelClientChat + // + this.panelClientChat.BackColor = System.Drawing.SystemColors.ButtonHighlight; + this.panelClientChat.Dock = System.Windows.Forms.DockStyle.Right; + this.panelClientChat.Location = new System.Drawing.Point(400, 0); + this.panelClientChat.Name = "panelClientChat"; + this.panelClientChat.Size = new System.Drawing.Size(400, 600); + this.panelClientChat.TabIndex = 2; + // + // panelTopBar + // + this.panelTopBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.panelTopBar.Controls.Add(this.buttonLogOff); + this.panelTopBar.Controls.Add(this.labelUsername); + this.panelTopBar.Controls.Add(this.labelHallo); + this.panelTopBar.Dock = System.Windows.Forms.DockStyle.Top; + this.panelTopBar.Location = new System.Drawing.Point(0, 0); + this.panelTopBar.Name = "panelTopBar"; + this.panelTopBar.Size = new System.Drawing.Size(800, 30); + this.panelTopBar.TabIndex = 1; + this.panelTopBar.Visible = false; + // + // buttonLogOff + // + this.buttonLogOff.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonLogOff.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.buttonLogOff.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonLogOff.Font = new System.Drawing.Font("Segoe UI Light", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonLogOff.Location = new System.Drawing.Point(722, 3); + this.buttonLogOff.Name = "buttonLogOff"; + this.buttonLogOff.Size = new System.Drawing.Size(75, 23); + this.buttonLogOff.TabIndex = 1; + this.buttonLogOff.Text = "Afmelden"; + this.buttonLogOff.UseVisualStyleBackColor = false; + this.buttonLogOff.Click += new System.EventHandler(this.buttonLogOff_Click); + // + // labelUsername + // + this.labelUsername.AutoSize = true; + this.labelUsername.Font = new System.Drawing.Font("Segoe UI Semilight", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelUsername.ForeColor = System.Drawing.Color.White; + this.labelUsername.Location = new System.Drawing.Point(49, 3); + this.labelUsername.Name = "labelUsername"; + this.labelUsername.Size = new System.Drawing.Size(144, 21); + this.labelUsername.TabIndex = 0; + this.labelUsername.Text = ""; + // + // labelHallo + // + this.labelHallo.AutoSize = true; + this.labelHallo.Font = new System.Drawing.Font("Segoe UI Semilight", 12F); + this.labelHallo.ForeColor = System.Drawing.Color.White; + this.labelHallo.Location = new System.Drawing.Point(3, 3); + this.labelHallo.Name = "labelHallo"; + this.labelHallo.Size = new System.Drawing.Size(54, 21); + this.labelHallo.TabIndex = 0; + this.labelHallo.Text = "Hallo, "; + // + // ClientApplicatie + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(700, 500); + this.MinimumSize = new System.Drawing.Size(550, 550); + this.Controls.Add(this.panelTopBar); + this.Controls.Add(this.panelLogin); + this.Controls.Add(this.panelClientContainer); + this.Name = "ClientApplicatie"; + this.Text = "Client Applicatie"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Resize += new System.EventHandler(this.ClientApplicatie_Resize); + this.panelClientContainer.ResumeLayout(false); + this.panelTopBar.ResumeLayout(false); + this.panelTopBar.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Timer updateTimer; + private System.Windows.Forms.Panel panelClientContainer; + private PanelClientChat panelClientChat; + private PanelGraphView panelGraphView; + private PanelLogin panelLogin; + private System.Windows.Forms.Panel panelDataViewLeft; + private System.Windows.Forms.Panel panelTopBar; + private System.Windows.Forms.Button buttonLogOff; + private System.Windows.Forms.Label labelUsername; + private System.Windows.Forms.Label labelHallo; + public PanelClientData heartBeat, RPM, speed, distance, power, energy, seconds, actualpower, time; + } + + +} diff --git a/ErgometerIPR/ErgometerApplication/ClientApplicatie.cs b/ErgometerIPR/ErgometerApplication/ClientApplicatie.cs new file mode 100644 index 0000000..96b84d5 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/ClientApplicatie.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Newtonsoft.Json; +using System.IO; +using System.Net.Sockets; +using System.Net; +using System.Timers; +using ErgometerLibrary; + +namespace ErgometerApplication +{ + public partial class ClientApplicatie : Form + { + public PanelClientChat chat; + private int count; + + public ClientApplicatie() + { + InitializeComponent(); + MainClient.Init(this); + count = 0; + } + + private void updateTimer_Tick(object sender, EventArgs e) + { + if(MainClient.Doctor.Connected) + { + MainClient.ComPort.Write("ST"); + string response = MainClient.ComPort.Read(); + if (response != "err") + { + Meting m = MainClient.SaveMeting(response); + + heartBeat.updateValue(m.HeartBeat); + RPM.updateValue(m.RPM); + speed.updateValue(m.Speed); + distance.updateValue(m.Distance); + power.updateValue(m.Power); + energy.updateValue(m.Energy); + actualpower.updateValue(m.ActualPower); + time.updateValue(m.Seconds); + + if (count >= 10) + { + count = 0; + panelGraphView.updateAllCharts(MainClient.Metingen); + } + + count++; + } + else + { + logout("De Ergometer is niet meer verbonden.", Color.Red); + } + } + } + + public void validateLogin(string username, string password) + { + if (username.Length > 0) + { + if (password.Length == 0) + { + panelLogin.lblVerification.Text = "Vul een wachtwoord in."; + panelLogin.lblVerification.ForeColor = Color.Red; + panelLogin.lblVerification.Visible = true; + } + if (password.Length > 0) + { + string error = ""; + bool connect = MainClient.Connect(SerialPort.GetPortNames()[0], username, password, out error); + + if (connect) + { + 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 + { + panelLogin.lblVerification.Text = "Vul een gebruikersnaam in."; + panelLogin.lblVerification.ForeColor = Color.Red; + panelLogin.lblVerification.Visible = true; + } + } + + private void ClientApplicatie_Resize(object sender, System.EventArgs e) + { + Control control = (Control)sender; + if (control.Size.Width < 980) + { + panelGraphView.Visible = false; + panelClientChat.Width = 400; + panelDataViewLeft.Dock = DockStyle.Fill; + } + if (control.Size.Width >= 980 && control.Size.Width < 1368) + { + panelGraphView.Visible = true; + panelDataViewLeft.Width = 250; + panelClientChat.Width = 400; + panelDataViewLeft.Dock = DockStyle.Left; + } + if (control.Size.Width >= 1368) + { + panelGraphView.Visible = true; + panelDataViewLeft.Width = 400; + panelDataViewLeft.Dock = DockStyle.Left; + } + + } + + private void buttonLogOff_Click(object sender, EventArgs e) + { + logout("U bent uitgelogd.", Color.Blue); + } + + private void logout(string message, System.Drawing.Color cl) + { + panelLogin.BringToFront(); + panelTopBar.Visible = false; + panelLogin.lblVerification.Text = message; + panelLogin.lblVerification.ForeColor = cl; + panelLogin.lblVerification.Visible = true; + panelLogin.textBoxUsername.Text = ""; + panelLogin.textBoxPassword.Text = ""; + MainClient.Disconnect(); + updateTimer.Stop(); + } + } +} \ No newline at end of file diff --git a/ErgometerIPR/ErgometerApplication/ClientApplicatie.resx b/ErgometerIPR/ErgometerApplication/ClientApplicatie.resx new file mode 100644 index 0000000..26f2a51 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/ClientApplicatie.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 25 + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerApplication/ErgometerApplication.csproj b/ErgometerIPR/ErgometerApplication/ErgometerApplication.csproj new file mode 100644 index 0000000..4e96fa2 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/ErgometerApplication.csproj @@ -0,0 +1,127 @@ + + + + + Debug + AnyCPU + {1191E100-AA1B-4F41-85E2-EC2BE8ED39FD} + WinExe + Properties + ErgometerApplication + ErgometerApplication + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\ErgometerLibrary\ErgometerLibrary\ErgometerLibrary\bin\Debug\ErgometerLibrary.dll + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + + Component + + + + Component + + + Component + + + Component + + + Component + + + Component + + + Form + + + ClientApplicatie.cs + + + + + ClientApplicatie.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerApplication/MainClient.cs b/ErgometerIPR/ErgometerApplication/MainClient.cs new file mode 100644 index 0000000..635b9a8 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/MainClient.cs @@ -0,0 +1,284 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ErgometerApplication +{ + class MainClient + { + + public static ComPort ComPort { get; } + public static TcpClient Doctor { get; set; } + public static List Metingen { get; } + public static List Chat { get; } + + public static string Name; + + public static int Session; + public static bool Loggedin; + + private static Thread t; + private static bool running; + + public static string HOST = "127.0.0.1"; + public static int PORT = 8888; + + public static ClientApplicatie Client; + + static MainClient() + { + ComPort = new ComPort(); + Doctor = new TcpClient(); + Metingen = new List(); + Chat = new List(); + + Name = "Unknown"; + Session = 0; + Loggedin = false; + } + + public static void Init(ClientApplicatie client) + { + Client = client; + } + + public static bool Connect(string comport, string name, string password, out string error) + { + error = "Succes"; + + if (!ComPort.IsOpen()) + { + if (ComPort.Connect(comport)) + { + ComPort.Write("RS"); + string temp = ComPort.Read(); + if (temp == "err") + { + ComPort.Disconnect(); + error = "De Ergometer is niet verbonden"; + return false; + } + Thread.Sleep(200); + ComPort.Write("CM"); + ComPort.Read(); + Thread.Sleep(200); + + ComPort.Write("ST"); + string response = ComPort.Read(); + + SaveMeting(response); + } + else + { + error = "De ergometer is niet verbonden"; + return false; + } + } + + if (Doctor == null || !Doctor.Connected) + { + if (Doctor == null) + Doctor = new TcpClient(); + + try + { + Doctor.Connect(HOST, PORT); + } + catch (Exception e) + { + error = "Server is niet online."; + return false; + } + + Name = name; + + NetCommand net = NetHelper.ReadNetCommand(Doctor); + if (net.Type == NetCommand.CommandType.SESSION) + Session = net.Session; + else + throw new Exception("Session not assigned"); + + running = true; + + t = new Thread(run); + t.IsBackground = true; + t.Start(); + } + + if(! Loggedin) + { + NetCommand command = new NetCommand(name, false, password, Session); + NetHelper.SendNetCommand(Doctor, command); + + NetCommand response = NetHelper.ReadNetCommand(Doctor); + if (response.Type == NetCommand.CommandType.RESPONSE && response.Response == NetCommand.ResponseType.LOGINWRONG) + { + Loggedin = false; + error = "De inloggegevens zijn onjuist."; + return false; + } + + Loggedin = true; + } + + return true; + } + + public static void Disconnect() + { + if (ComPort.IsOpen()) + { + if (ComPort.Disconnect()) + { + + } + else + throw new Exception("Comport was unable to disconnect"); + } + + if (Doctor != null && Doctor.Connected) + { + NetHelper.SendNetCommand(Doctor, new NetCommand(NetCommand.CommandType.LOGOUT, Session)); + Loggedin = false; + running = false; + Doctor.Close(); + Doctor = null; + } + } + + public static Meting SaveMeting(string meting) + { + Meting m = null; + + try + { + m = Meting.Parse(meting); + } + catch(Exception e) + { + return new Meting(0, 0, 0, 0, 0, 0, 0, 0, 0); + } + + + Metingen.Add(m); + if (Doctor.Connected) + { + NetHelper.SendNetCommand(Doctor, new NetCommand(m, Session)); + } + + return m; + } + + public static void run() + { + while(running) + { + if(Doctor.Connected && Doctor.Available > 0) + { + NetCommand command = NetHelper.ReadNetCommand(Doctor); + ParseCommand(command); + } + } + + if(Doctor != null) + Doctor.Close(); + } + + private static void ParseCommand(NetCommand command) + { + switch(command.Type) + { + case NetCommand.CommandType.VALUESET: + ParseValueSet(command); + break; + case NetCommand.CommandType.CHAT: + 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()); + break; + case NetCommand.CommandType.SESSION: + Session = command.Session; + break; + case NetCommand.CommandType.ERROR: + Console.WriteLine("An error occured, ignoring"); + break; + default: + throw new FormatException("Error in Netcommand: Received command not recognized"); + } + } + + public static void SendNetCommand(NetCommand command) + { + if(! NetHelper.SendNetCommand(Doctor, command)) + { + Disconnect(); + } + } + + private static void ParseValueSet(NetCommand command) + { + switch(command.Value) + { + case NetCommand.ValueType.DISTANCE: + ComPort.Write("RS"); + ComPort.Read(); + Thread.Sleep(200); + ComPort.Write("CM"); + ComPort.Read(); + Thread.Sleep(700); + ComPort.Write("PD " + command.SetValue.ToString()); + ComPort.Read(); + break; + case NetCommand.ValueType.ENERGY: + ComPort.Write("RS"); + ComPort.Read(); + Thread.Sleep(200); + ComPort.Write("CM"); + ComPort.Read(); + Thread.Sleep(700); + ComPort.Write("PE " + command.SetValue.ToString()); + ComPort.Read(); + break; + case NetCommand.ValueType.POWER: + ComPort.Write("CM"); + ComPort.Read(); + Thread.Sleep(200); + ComPort.Write("PW " + command.SetValue.ToString()); + ComPort.Read(); + break; + case NetCommand.ValueType.TIME: + ComPort.Write("RS"); + ComPort.Read(); + Thread.Sleep(200); + ComPort.Write("CM"); + ComPort.Read(); + Thread.Sleep(700); + string temp = (command.SetValue / 60) + ""; + if(temp.Length < 2) + { + temp = "0" + temp; + } + string temp2 = (command.SetValue % 60) + ""; + if (temp2.Length < 2) + { + temp2 = "0" + temp2; + } + + string time = temp + temp2; + ComPort.Write("PT " + time); + ComPort.Read(); + break; + default: + throw new FormatException("Error in NetCommand: ValueSet is not recognized"); + } + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/PanelClientChat.cs b/ErgometerIPR/ErgometerApplication/PanelClientChat.cs new file mode 100644 index 0000000..035353c --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/PanelClientChat.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ErgometerLibrary; +using ErgometerLibrary.Chat; + +namespace ErgometerApplication +{ + public class PanelClientChat : Panel + { + + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label connectionLabel; + + public PanelClientChat() : base() + { + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.connectionLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.button1 = new System.Windows.Forms.Button(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + + this.panel3 = new System.Windows.Forms.Panel(); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.AutoSize = true; + this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly; + this.flowLayoutPanel1.Controls.Add(this.panel2); + this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(3); + this.flowLayoutPanel1.Size = new System.Drawing.Size(390, 36); + this.flowLayoutPanel1.TabIndex = 0; + this.flowLayoutPanel1.WrapContents = false; + this.flowLayoutPanel1.SizeChanged += new System.EventHandler(this.FlowLayoutPanel1_SizeChanged); + // + // panel2 + // + this.panel2.Controls.Add(this.connectionLabel); + this.panel2.Dock = System.Windows.Forms.DockStyle.Left; + this.panel2.Location = new System.Drawing.Point(6, 6); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(385, 24); + this.panel2.TabIndex = 0; + // + // connectionLabel + // + this.connectionLabel.AutoSize = true; + this.connectionLabel.Font = new System.Drawing.Font("Segoe UI Semibold", 8F, System.Drawing.FontStyle.Bold); + this.connectionLabel.Location = new System.Drawing.Point(4, 4); + this.connectionLabel.Name = "connectionLabel"; + this.connectionLabel.Size = new System.Drawing.Size(112, 13); + this.connectionLabel.TabIndex = 0; + this.connectionLabel.Text = "Now connected with: Doctor"; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(0, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(100, 23); + this.label2.TabIndex = 0; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(0, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(100, 23); + this.label1.TabIndex = 0; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.panel1.Controls.Add(this.button1); + this.panel1.Controls.Add(this.richTextBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(400, 100); + this.panel1.TabIndex = 1; + // + // button1 + // + this.button1.BackColor = System.Drawing.Color.White; + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button1.Location = new System.Drawing.Point(310, 4); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(85, 90); + this.button1.TabIndex = 1; + this.button1.Text = "Send"; + this.button1.UseVisualStyleBackColor = false; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // richTextBox1 + // + this.richTextBox1.BackColor = System.Drawing.Color.White; + this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.richTextBox1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBox1.Location = new System.Drawing.Point(4, 4); + this.richTextBox1.MaxLength = 250; + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; + this.richTextBox1.Size = new System.Drawing.Size(300, 90); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = ""; + this.richTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox_KeyDown); + // + // panel3 + // + this.panel3.AutoScroll = true; + this.panel3.HorizontalScroll.Enabled = false; + this.panel3.HorizontalScroll.Visible = false; + this.panel3.BackColor = System.Drawing.Color.White; + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Controls.Add(this.flowLayoutPanel1); + this.panel3.Location = new System.Drawing.Point(0, 0); + + this.panel3.Name = "panel3"; + this.panel3.TabIndex = 1; + // + // container + // + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "container"; + this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel3_MouseWheel); + + passChatMessage = new ChatDelegate(this.AddChatItem); + } + + private void button1_Click(object sender, EventArgs e) + { + if (richTextBox1.TextLength > 1) + { + AddChatItem(new ChatMessage("Anon", richTextBox1.Text, false)); + MainClient.SendNetCommand(new NetCommand(richTextBox1.Text, false, MainClient.Session)); + richTextBox1.ResetText(); + } + } + + public void AddChatItem(ChatMessage chat) + { + flowLayoutPanel1.Controls.Add(new ChatItem(chat)); + } + + private void panel3_MouseWheel(object sender, MouseEventArgs e) + { + panel3.Focus(); + } + + private void FlowLayoutPanel1_SizeChanged(object sender, System.EventArgs e) + { + if (flowLayoutPanel1.Size.Height > panel3.Size.Height) + { + panel2.Width = 375; + flowLayoutPanel1.Width = 380; + panel3.VerticalScroll.Value = panel3.VerticalScroll.Maximum; + } + } + + private bool textBoxIsEmpty() + { + string[] text = richTextBox1.Text.Split(); + foreach(string s in text) + { + if(s != " ") + { + return false; + } + } + return true; + } + + private void TextBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + button1_Click(this, new EventArgs()); + e.Handled = true; + } + } + + public delegate void ChatDelegate(ChatMessage chat); + public ChatDelegate passChatMessage; + } +} diff --git a/ErgometerIPR/ErgometerApplication/PanelClientContainer.cs b/ErgometerIPR/ErgometerApplication/PanelClientContainer.cs new file mode 100644 index 0000000..1595464 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/PanelClientContainer.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerApplication +{ + public class PanelClientContainer:Panel + { + + public PanelClientChat panelClientChat; + public PanelGraphView panelGraphView; + + public PanelClientContainer() : base() + { + this.panelClientChat = new PanelClientChat(); + this.panelGraphView = new PanelGraphView(); + + // + // panelClientContainer + // + this.Controls.Add(this.panelGraphView); + this.Controls.Add(this.panelClientChat); + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "panelClientContainer"; + this.Size = new System.Drawing.Size(800, 600); + this.TabIndex = 0; + + } + + } +} diff --git a/ErgometerIPR/ErgometerApplication/PanelClientData.cs b/ErgometerIPR/ErgometerApplication/PanelClientData.cs new file mode 100644 index 0000000..0d4e07b --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/PanelClientData.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerApplication +{ + public class PanelClientData : Panel + { + public Label labelMetingCurrentValue; + public ProgressBar progressBarMeting; + public Label metingName; + + private int min; + private int max; + private string name; + + public PanelClientData(string name, int min, int max) : base() + { + this.min = min; + this.max = max; + this.name = name; + + this.metingName = new System.Windows.Forms.Label(); + this.progressBarMeting = new System.Windows.Forms.ProgressBar(); + this.labelMetingCurrentValue = new System.Windows.Forms.Label(); + // + // initialize panel + // + this.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Controls.Add(this.labelMetingCurrentValue); + if(name != "Tijd") + this.Controls.Add(this.progressBarMeting); + this.Controls.Add(this.metingName); + this.Dock = System.Windows.Forms.DockStyle.Top; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "panel1"; + this.Size = new System.Drawing.Size(284, 80); + // + // metingName + // + this.metingName.AutoSize = true; + this.metingName.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.metingName.Location = new System.Drawing.Point(12, 9); + this.metingName.Name = "metingName"; + this.metingName.Size = new System.Drawing.Size(105, 21); + this.metingName.TabIndex = 0; + this.metingName.Text = name; + // + // progressBarMeting + // + this.progressBarMeting.Location = new System.Drawing.Point(16, 39); + this.progressBarMeting.Name = "progressBarMeting"; + this.progressBarMeting.Size = new System.Drawing.Size(183, 23); + this.progressBarMeting.TabIndex = 1; + this.progressBarMeting.Value = 0; + // + // labelMetingCurrentValue + // + this.labelMetingCurrentValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelMetingCurrentValue.AutoSize = true; + this.labelMetingCurrentValue.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelMetingCurrentValue.Location = new System.Drawing.Point(215, 32); + this.labelMetingCurrentValue.Name = "labelMetingCurrentValue"; + this.labelMetingCurrentValue.Size = new System.Drawing.Size(57, 32); + this.labelMetingCurrentValue.TabIndex = 2; + this.labelMetingCurrentValue.Text = "0"; + } + + public void setText(string text) + { + this.metingName.Text = text; + } + + public void updateValue(int value) + { + if (name == "Tijd") + { + this.labelMetingCurrentValue.Text = (value / 60) + ":" + (value % 60); + } + else + { + this.labelMetingCurrentValue.Text = value.ToString(); + this.progressBarMeting.Value = ValueToPercentage(value); + } + + } + + public void updateValue(double value) + { + this.labelMetingCurrentValue.Text = value.ToString(); + this.progressBarMeting.Value = ValueToPercentage((int)value); + } + + public void updateValue(decimal value) + { + this.labelMetingCurrentValue.Text = value.ToString(); + this.progressBarMeting.Value = ValueToPercentage((int)value); + } + + private int ValueToPercentage(int value) + { + if (value < min) + return 0; + + if (value > max) + return 100; + + return ((value - min) * 100) / (max - min); + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/PanelClientDataView.cs b/ErgometerIPR/ErgometerApplication/PanelClientDataView.cs new file mode 100644 index 0000000..4c27172 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/PanelClientDataView.cs @@ -0,0 +1,71 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace ErgometerApplication +{ + public class PanelGraphView : Panel + { + + private List charts; + private FlowLayoutPanel flowlayout; + + public PanelGraphView() : base() + { + createCharts(); + + flowlayout = new FlowLayoutPanel(); + + flowlayout.Dock = DockStyle.Fill; + flowlayout.BackColor = System.Drawing.Color.DarkGray; + flowlayout.Location = new System.Drawing.Point(0, 0); + flowlayout.Name = "flowlayout"; + flowlayout.Padding = new Padding(15); + flowlayout.AutoScroll = true; + foreach (ChartPanel chart in charts) + { + flowlayout.Controls.Add(chart); + } + + List metingen = new List(); + metingen.Add(new Meting(0, 0, 0, 0, 0, 0, 0, 0, 0)); + + updateAllCharts(metingen); + // + // panelGraphView + // + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Controls.Add(flowlayout); + + this.Location = new System.Drawing.Point(0, 0); + this.Name = "panelGraphView"; + this.Size = new System.Drawing.Size(400, 600); + this.TabIndex = 1; + } + + public void createCharts() + { + charts = new List(); + charts.Add(new ChartPanel(ChartPanel.MetingType.HEARTBEAT, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.RPM, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.SPEED, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.DISTANCE, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.ENERGY, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.POWER, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.ACTUALPOWER, SeriesChartType.Line)); + } + + public void updateAllCharts(List metingen) + { + foreach (ChartPanel chart in charts) + { + chart.updateChart(metingen); + } + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/PanelLogin.cs b/ErgometerIPR/ErgometerApplication/PanelLogin.cs new file mode 100644 index 0000000..151a3a0 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/PanelLogin.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerApplication +{ + public class PanelLogin:Panel + { + private System.Windows.Forms.Label lblUsername; + private System.Windows.Forms.Label lblPassword; + public System.Windows.Forms.Label lblVerification; + public System.Windows.Forms.TextBox textBoxPassword; + public System.Windows.Forms.TextBox textBoxUsername; + public System.Windows.Forms.Button buttonLogin; + private System.Windows.Forms.Label lblLoginTitle; + private System.Windows.Forms.PictureBox pictureBoxBike; + private ClientApplicatie app; + + public PanelLogin(ClientApplicatie app):base() + { + this.app = app; + this.pictureBoxBike = new System.Windows.Forms.PictureBox(); + this.buttonLogin = new System.Windows.Forms.Button(); + this.textBoxPassword = new System.Windows.Forms.TextBox(); + this.textBoxUsername = new System.Windows.Forms.TextBox(); + this.lblLoginTitle = new System.Windows.Forms.Label(); + this.lblUsername = new System.Windows.Forms.Label(); + this.lblPassword = new System.Windows.Forms.Label(); + this.lblVerification = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBike)).BeginInit(); + // + // panelLogin + // + this.Controls.Add(this.pictureBoxBike); + this.Controls.Add(this.buttonLogin); + this.Controls.Add(this.textBoxUsername); + this.Controls.Add(this.textBoxPassword); + this.Controls.Add(this.lblLoginTitle); + this.Controls.Add(this.lblUsername); + this.Controls.Add(this.lblPassword); + this.Controls.Add(this.lblVerification); + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "panelLogin"; + this.Size = new System.Drawing.Size(800, 600); + this.TabIndex = 0; + // + // pictureBoxBike + // + this.pictureBoxBike.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pictureBoxBike.Image = global::ErgometerApplication.Properties.Resources.flatbike; + this.pictureBoxBike.Location = new System.Drawing.Point(137, 131); + this.pictureBoxBike.Name = "pictureBoxBike"; + this.pictureBoxBike.Size = new System.Drawing.Size(250, 250); + this.pictureBoxBike.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pictureBoxBike.TabIndex = 4; + this.pictureBoxBike.TabStop = false; + // + // buttonLogin + // + this.buttonLogin.Anchor = System.Windows.Forms.AnchorStyles.None; + this.buttonLogin.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonLogin.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonLogin.Location = new System.Drawing.Point(468, 338); + this.buttonLogin.Name = "buttonLogin"; + this.buttonLogin.Size = new System.Drawing.Size(168, 31); + this.buttonLogin.TabIndex = 3; + this.buttonLogin.Text = "Aanmelden"; + this.buttonLogin.UseVisualStyleBackColor = true; + this.buttonLogin.Click += new System.EventHandler(this.buttonLogin_Click); + // + // textBoxPassword + // + this.textBoxPassword.Anchor = System.Windows.Forms.AnchorStyles.None; + this.textBoxPassword.Location = new System.Drawing.Point(467, 287); + this.textBoxPassword.MaxLength = 16; + this.textBoxPassword.Name = "textBoxPassword"; + this.textBoxPassword.PasswordChar = '*'; + this.textBoxPassword.Size = new System.Drawing.Size(167, 20); + this.textBoxPassword.TabIndex = 2; + this.textBoxPassword.KeyDown += TextBoxPassword_KeyDown; + // + // textBoxUsername + // + this.textBoxUsername.Anchor = System.Windows.Forms.AnchorStyles.None; + this.textBoxUsername.Location = new System.Drawing.Point(468, 231); + this.textBoxUsername.MaxLength = 16; + this.textBoxUsername.Name = "textBoxUsername"; + this.textBoxUsername.Size = new System.Drawing.Size(167, 20); + this.textBoxUsername.TabIndex = 2; + this.textBoxUsername.KeyDown += TextBoxPassword_KeyDown; + // + // lblLoginTitle + // + this.lblLoginTitle.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblLoginTitle.AutoSize = true; + this.lblLoginTitle.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblLoginTitle.Location = new System.Drawing.Point(461, 141); + this.lblLoginTitle.Name = "lblLoginTitle"; + this.lblLoginTitle.Size = new System.Drawing.Size(87, 32); + this.lblLoginTitle.TabIndex = 1; + this.lblLoginTitle.Text = "Log In"; + // + // lblVerification + // + this.lblVerification.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblVerification.AutoSize = true; + this.lblVerification.Font = new System.Drawing.Font("Segoe UI Light", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblVerification.Location = new System.Drawing.Point(140, 415); + this.lblVerification.Name = "lvlVerification"; + this.lblVerification.Size = new System.Drawing.Size(200, 21); + this.lblVerification.TabIndex = 1; + this.lblVerification.Text = "Verification label"; + this.lblVerification.Visible = false; + // + // lblUsername + // + this.lblUsername.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblUsername.AutoSize = true; + this.lblUsername.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblUsername.Location = new System.Drawing.Point(464, 207); + this.lblUsername.Name = "lblUsername"; + this.lblUsername.Size = new System.Drawing.Size(128, 21); + this.lblUsername.TabIndex = 1; + this.lblUsername.Text = "Gebruikersnaam"; + // + // lblPassword + // + this.lblPassword.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblPassword.AutoSize = true; + this.lblPassword.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold); + this.lblPassword.Location = new System.Drawing.Point(464, 263); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(103, 21); + this.lblPassword.TabIndex = 0; + this.lblPassword.Text = "Wachtwoord"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBike)).EndInit(); + } + + private void TextBoxPassword_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonLogin_Click(this, new EventArgs()); + } + } + + public void buttonLogin_Click(object sender, EventArgs e) + { + string username = textBoxUsername.Text; + string password = textBoxPassword.Text; + this.app.validateLogin(username,password); + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/Program.cs b/ErgometerIPR/ErgometerApplication/Program.cs new file mode 100644 index 0000000..cb1e68e --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerApplication +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new ClientApplicatie()); + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/Properties/AssemblyInfo.cs b/ErgometerIPR/ErgometerApplication/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3bd3fe6 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("ErgometerApplication")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ErgometerApplication")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1191e100-aa1b-4f41-85e2-ec2be8ed39fd")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ErgometerIPR/ErgometerApplication/Properties/Resources.Designer.cs b/ErgometerIPR/ErgometerApplication/Properties/Resources.Designer.cs new file mode 100644 index 0000000..9de517f --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ErgometerApplication.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ErgometerApplication.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap flatbike { + get { + object obj = ResourceManager.GetObject("flatbike", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/Properties/Resources.resx b/ErgometerIPR/ErgometerApplication/Properties/Resources.resx new file mode 100644 index 0000000..b226b08 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\flatbike.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerApplication/Properties/Settings.Designer.cs b/ErgometerIPR/ErgometerApplication/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fb56e49 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ErgometerApplication.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/ErgometerIPR/ErgometerApplication/Properties/Settings.settings b/ErgometerIPR/ErgometerApplication/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ErgometerIPR/ErgometerApplication/Resources/flatbike.png b/ErgometerIPR/ErgometerApplication/Resources/flatbike.png new file mode 100644 index 0000000..1a88ba6 Binary files /dev/null and b/ErgometerIPR/ErgometerApplication/Resources/flatbike.png differ diff --git a/ErgometerIPR/ErgometerApplication/packages.config b/ErgometerIPR/ErgometerApplication/packages.config new file mode 100644 index 0000000..64b5d8e --- /dev/null +++ b/ErgometerIPR/ErgometerApplication/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerDoctorApplication/App.config b/ErgometerIPR/ErgometerDoctorApplication/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/ChartPanel.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/ChartPanel.cs new file mode 100644 index 0000000..43a0315 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/ChartPanel.cs @@ -0,0 +1,105 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace ErgometerDoctorApplication +{ + public class ChartPanel : Panel + { + private Chart chart; + private MetingType type; + private ChartArea chartArea; + private Series series; + private SeriesChartType ChartType; + + public ChartPanel(MetingType type, SeriesChartType charttype) : base() + { + this.type = type; + this.ChartType = charttype; + + this.chart = new Chart(); + this.chartArea = new ChartArea(); + this.chart.Titles.Add(new Title(type.ToString())); + + this.Location = new System.Drawing.Point(0, 0); + + this.Size = new System.Drawing.Size(400, 250); + this.Controls.Add(chart); + + this.series = createSerie(); + this.chartArea.Name = "chartArea"; + + this.chart.Size = new System.Drawing.Size(400, 250); + + this.chart.Dock = DockStyle.Fill; + this.chart.Series.Add(series); + this.chart.Text = "chart"; + + + this.chart.ChartAreas.Add(chartArea); + + } + + public void updateChart(List metingen) + { + chart.Series[0] = createSerie(); + for (int i = 0; i < metingen.Count; i++) + { + chart.Series[0].Points.Add(getMetingType(metingen[i])); + } + chart.Update(); + } + + public Series createSerie() + { + Series serie = new Series(); + serie.Name = "series"; + serie.ChartType = ChartType; + serie.ChartArea = "chartArea"; + serie.BorderWidth = 3; + return serie; + } + + public int getMetingType(Meting meting) + { + switch (type) + { + case MetingType.HEARTBEAT: + return meting.HeartBeat; + case MetingType.RPM: + return meting.RPM; + case MetingType.SPEED: + return (int)meting.Speed; + case MetingType.DISTANCE: + return (int)meting.Distance; + case MetingType.POWER: + return meting.Power; + case MetingType.ENERGY: + return meting.Energy; + case MetingType.SECONDS: + return meting.Seconds; + case MetingType.ACTUALPOWER: + return meting.ActualPower; + default: + return 0; + } + } + + public enum MetingType + { + HEARTBEAT, + RPM, + SPEED, + DISTANCE, + POWER, + ENERGY, + SECONDS, + ACTUALPOWER + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/ClientThread.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/ClientThread.cs new file mode 100644 index 0000000..92aae43 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/ClientThread.cs @@ -0,0 +1,78 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class ClientThread + { + public int Session { get; } + public string Name { get; } + + public bool IsOldData { get; } + + private SessionWindow window; + + public List Metingen { get; set; } + public List Chat { get; } + + public ClientThread(string name, int session, bool old) + { + Name = name; + Session = session; + IsOldData = old; + + window = new SessionWindow(Name, old, Session, this); + window.FormClosed += Window_FormClosed; + + Metingen = new List(); + Chat = new List(); + } + + private void Window_FormClosed(object sender, FormClosedEventArgs e) + { + MainClient.RemoveActiveClient(this); + } + + public void HandleCommand(NetCommand command) + { + switch (command.Type) + { + case NetCommand.CommandType.DATA: + lock (Metingen) + { + Metingen.Add(command.Meting); + } + window.Invoke(window.updateMetingen, new Object[] { command.Meting }); + break; + case NetCommand.CommandType.CHAT: + ChatMessage chat = new ChatMessage(command.DisplayName, command.ChatMessage, command.IsDoctor); + Chat.Add(chat); + window.panelClientChat.Invoke(window.panelClientChat.passChatMessage, new Object[] { chat }); + break; + } + } + + public void run() + { + Application.Run(window); + } + + public void stop() + { + window.Close(); + MainClient.RemoveActiveClient(this); + } + + private void sendCommand(NetCommand command) + { + if(! IsOldData) + MainClient.SendNetCommand(command); + } + + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientChat.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientChat.cs new file mode 100644 index 0000000..3cf4c66 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientChat.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using ErgometerLibrary; +using ErgometerLibrary.Chat; + +namespace ErgometerDoctorApplication +{ + public class PanelClientChat : Panel + { + + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + public System.Windows.Forms.Button button1; + public System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Label connectionLabel; + + private int Session { get; } + + public PanelClientChat(int session, string name) : base() + { + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.connectionLabel = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.button1 = new System.Windows.Forms.Button(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + + Session = session; + + this.panel3 = new System.Windows.Forms.Panel(); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.AutoSize = true; + this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly; + this.flowLayoutPanel1.Controls.Add(this.panel2); + this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(3); + this.flowLayoutPanel1.Size = new System.Drawing.Size(390, 36); + this.flowLayoutPanel1.TabIndex = 0; + this.flowLayoutPanel1.WrapContents = false; + this.flowLayoutPanel1.SizeChanged += new System.EventHandler(this.FlowLayoutPanel1_SizeChanged); + // + // panel2 + // + this.panel2.Controls.Add(this.connectionLabel); + this.panel2.Dock = System.Windows.Forms.DockStyle.Left; + this.panel2.Location = new System.Drawing.Point(6, 6); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(385, 24); + this.panel2.TabIndex = 0; + // + // connectionLabel + // + this.connectionLabel.AutoSize = true; + this.connectionLabel.Font = new System.Drawing.Font("Segoe UI Semibold", 8F, System.Drawing.FontStyle.Bold); + this.connectionLabel.Location = new System.Drawing.Point(4, 4); + this.connectionLabel.Name = "connectionLabel"; + this.connectionLabel.Size = new System.Drawing.Size(112, 13); + this.connectionLabel.TabIndex = 0; + this.connectionLabel.Text = "Now connected with: " + name; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(0, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(100, 23); + this.label2.TabIndex = 0; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(0, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(100, 23); + this.label1.TabIndex = 0; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.panel1.Controls.Add(this.button1); + this.panel1.Controls.Add(this.richTextBox1); + this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(400, 100); + this.panel1.TabIndex = 1; + // + // button1 + // + this.button1.BackColor = System.Drawing.Color.White; + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button1.Location = new System.Drawing.Point(310, 4); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(85, 90); + this.button1.TabIndex = 1; + this.button1.Text = "Send"; + this.button1.UseVisualStyleBackColor = false; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // richTextBox1 + // + this.richTextBox1.BackColor = System.Drawing.Color.White; + this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.richTextBox1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBox1.Location = new System.Drawing.Point(4, 4); + this.richTextBox1.MaxLength = 250; + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.None; + this.richTextBox1.Size = new System.Drawing.Size(300, 90); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = ""; + this.richTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox_KeyDown); + // + // panel3 + // + this.panel3.AutoScroll = true; + this.panel3.HorizontalScroll.Enabled = false; + this.panel3.HorizontalScroll.Visible = false; + this.panel3.BackColor = System.Drawing.Color.White; + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Controls.Add(this.flowLayoutPanel1); + this.panel3.Location = new System.Drawing.Point(0, 0); + + this.panel3.Name = "panel3"; + this.panel3.TabIndex = 1; + // + // container + // + this.Controls.Add(this.panel3); + this.Controls.Add(this.panel1); + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "container"; + this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel3_MouseWheel); + + passChatMessage = new ChatDelegate(this.AddChatItem); + } + + private void button1_Click(object sender, EventArgs e) + { + if (richTextBox1.TextLength > 1) + { + AddChatItem(new ChatMessage("Doctor", richTextBox1.Text, true)); + MainClient.SendNetCommand(new NetCommand(richTextBox1.Text, true, Session)); + richTextBox1.ResetText(); + } + } + + public void AddChatItem(ChatMessage chat) + { + flowLayoutPanel1.Controls.Add(new ChatItem(chat)); + } + + private void panel3_MouseWheel(object sender, MouseEventArgs e) + { + panel3.Focus(); + } + + private void FlowLayoutPanel1_SizeChanged(object sender, System.EventArgs e) + { + if (flowLayoutPanel1.Size.Height > panel3.Size.Height) + { + panel2.Width = 375; + flowLayoutPanel1.Width = 380; + panel3.VerticalScroll.Value = panel3.VerticalScroll.Maximum; + } + } + + private bool textBoxIsEmpty() + { + string[] text = richTextBox1.Text.Split(); + foreach (string s in text) + { + if (s != " ") + { + return false; + } + } + return true; + } + + private void TextBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + button1_Click(this, new EventArgs()); + e.Handled = true; + } + } + + public delegate void ChatDelegate(ChatMessage chat); + public ChatDelegate passChatMessage; + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientData.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientData.cs new file mode 100644 index 0000000..076d6cb --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientData.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class PanelClientData : Panel + { + public Label labelMetingCurrentValue; + public ProgressBar progressBarMeting; + public Label metingName; + + private int min; + private int max; + private string name; + + public PanelClientData(string name, int min, int max) : base() + { + this.min = min; + this.max = max; + this.name = name; + + this.metingName = new System.Windows.Forms.Label(); + this.progressBarMeting = new System.Windows.Forms.ProgressBar(); + this.labelMetingCurrentValue = new System.Windows.Forms.Label(); + // + // initialize panel + // + this.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Controls.Add(this.labelMetingCurrentValue); + if (name != "Tijd") + this.Controls.Add(this.progressBarMeting); + this.Controls.Add(this.metingName); + this.Dock = System.Windows.Forms.DockStyle.Top; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "panel1"; + this.Size = new System.Drawing.Size(284, 80); + // + // metingName + // + this.metingName.AutoSize = true; + this.metingName.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.metingName.Location = new System.Drawing.Point(12, 9); + this.metingName.Name = "metingName"; + this.metingName.Size = new System.Drawing.Size(105, 21); + this.metingName.TabIndex = 0; + this.metingName.Text = name; + // + // progressBarMeting + // + this.progressBarMeting.Location = new System.Drawing.Point(16, 39); + this.progressBarMeting.Name = "progressBarMeting"; + this.progressBarMeting.Size = new System.Drawing.Size(183, 23); + this.progressBarMeting.TabIndex = 1; + this.progressBarMeting.Value = 0; + // + // labelMetingCurrentValue + // + this.labelMetingCurrentValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.labelMetingCurrentValue.AutoSize = true; + this.labelMetingCurrentValue.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelMetingCurrentValue.Location = new System.Drawing.Point(215, 32); + this.labelMetingCurrentValue.Name = "labelMetingCurrentValue"; + this.labelMetingCurrentValue.Size = new System.Drawing.Size(57, 32); + this.labelMetingCurrentValue.TabIndex = 2; + this.labelMetingCurrentValue.Text = "0"; + } + + public void setText(string text) + { + this.metingName.Text = text; + } + + public void updateValue(int value) + { + if (name == "Tijd") + { + this.labelMetingCurrentValue.Text = (value / 60) + ":" + (value % 60); + } + else + { + this.labelMetingCurrentValue.Text = value.ToString(); + this.progressBarMeting.Value = ValueToPercentage(value); + } + + } + + public void updateValue(double value) + { + this.labelMetingCurrentValue.Text = value.ToString(); + this.progressBarMeting.Value = ValueToPercentage((int)value); + } + + public void updateValue(decimal value) + { + this.labelMetingCurrentValue.Text = value.ToString(); + this.progressBarMeting.Value = ValueToPercentage((int)value); + } + + private int ValueToPercentage(int value) + { + if (value < min) + return 0; + + if (value > max) + return 100; + + return ((value - min) * 100) / (max - min); + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientSetData.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientSetData.cs new file mode 100644 index 0000000..cdb4e31 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelClientSetData.cs @@ -0,0 +1,287 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication.Client +{ + public class PanelClientSetData : Panel + { + + private Panel panel6; + private Label label3; + private Panel panel5; + private Label label4; + private Panel panel3; + private Label label2; + private Panel panel2; + private Label label1; + private Button buttonTrapsnelheid; + private TrackBar trackBar1; + private Label label6; + private Button buttonAfstand; + private TextBox textBox2; + private Label label5; + private Button buttonTijd; + private MaskedTextBox textBox1; + + private int Session; + + public PanelClientSetData(int session) : base() + { + Session = session; + this.panel6 = new System.Windows.Forms.Panel(); + this.label3 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.label4 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.MaskedTextBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.trackBar1 = new System.Windows.Forms.TrackBar(); + this.buttonTijd = new System.Windows.Forms.Button(); + this.buttonAfstand = new System.Windows.Forms.Button(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.buttonTrapsnelheid = new System.Windows.Forms.Button(); + this.panel6.SuspendLayout(); + this.panel5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + + // + // panel6 + // + this.panel6.BackColor = System.Drawing.Color.White; + this.panel6.Controls.Add(this.buttonTrapsnelheid); + this.panel6.Controls.Add(this.trackBar1); + this.panel6.Controls.Add(this.label3); + this.panel6.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel6.Location = new System.Drawing.Point(0, 199); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(370, 112); + this.panel6.TabIndex = 4; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold); + this.label3.Location = new System.Drawing.Point(4, 5); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(146, 19); + this.label3.TabIndex = 0; + this.label3.Text = "Trapsterkte aanpassen"; + // + // panel5 + // + this.panel5.BackColor = System.Drawing.Color.White; + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.buttonAfstand); + this.panel5.Controls.Add(this.textBox2); + this.panel5.Controls.Add(this.label4); + this.panel5.Dock = System.Windows.Forms.DockStyle.Top; + this.panel5.Location = new System.Drawing.Point(0, 124); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(370, 75); + this.panel5.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold); + this.label4.Location = new System.Drawing.Point(4, 26); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(114, 19); + this.label4.TabIndex = 0; + this.label4.Text = "Afstand instellen"; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.White; + this.panel3.Controls.Add(this.label5); + this.panel3.Controls.Add(this.buttonTijd); + this.panel3.Controls.Add(this.textBox1); + this.panel3.Controls.Add(this.label2); + this.panel3.Dock = System.Windows.Forms.DockStyle.Top; + this.panel3.Font = new System.Drawing.Font("Tunga", 8.25F); + this.panel3.Location = new System.Drawing.Point(0, 52); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(370, 72); + this.panel3.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold); + this.label2.Location = new System.Drawing.Point(3, 23); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(101, 19); + this.label2.TabIndex = 0; + this.label2.Text = "Tijd aanpassen"; + // + // panel2 + // + this.panel2.BackColor = System.Drawing.SystemColors.ControlDarkDark; + this.panel2.Controls.Add(this.label1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Top; + this.panel2.Location = new System.Drawing.Point(0, 0); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(500, 52); + this.panel2.TabIndex = 0; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(3, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(247, 21); + this.label1.TabIndex = 0; + this.label1.Text = "Eigenschappen fiets aanpassen"; + // + // textBox1 + // + this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBox1.Location = new System.Drawing.Point(123, 21); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(77, 25); + this.textBox1.TabIndex = 1; + this.textBox1.Mask = "00:00"; + this.textBox1.KeyDown += TextBox1_KeyDown; + // + // textBox2 + // + this.textBox2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.textBox2.Font = new System.Drawing.Font("Segoe UI", 9.75F); + this.textBox2.Location = new System.Drawing.Point(124, 24); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(77, 25); + this.textBox2.TabIndex = 1; + this.textBox2.KeyDown += TextBox2_KeyDown; + // + // trackBar1 + // + this.trackBar1.Location = new System.Drawing.Point(29, 42); + this.trackBar1.Maximum = 400; + this.trackBar1.Minimum = 25; + this.trackBar1.Name = "trackBar1"; + this.trackBar1.Size = new System.Drawing.Size(221, 45); + this.trackBar1.TabIndex = 1; + this.trackBar1.Value = 25; + // + // button1 + // + this.buttonTijd.BackColor = System.Drawing.Color.WhiteSmoke; + this.buttonTijd.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonTijd.Font = new System.Drawing.Font("Segoe UI", 9.75F); + this.buttonTijd.Location = new System.Drawing.Point(282, 19); + this.buttonTijd.Name = "button1"; + this.buttonTijd.Size = new System.Drawing.Size(75, 25); + this.buttonTijd.TabIndex = 2; + this.buttonTijd.Text = "Set"; + this.buttonTijd.UseVisualStyleBackColor = false; + this.buttonTijd.Click += new System.EventHandler(this.buttonTijd_Click); + // + // button2 + // + this.buttonAfstand.BackColor = System.Drawing.Color.WhiteSmoke; + this.buttonAfstand.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonAfstand.Font = new System.Drawing.Font("Segoe UI", 9.75F); + this.buttonAfstand.Location = new System.Drawing.Point(283, 24); + this.buttonAfstand.Name = "button2"; + this.buttonAfstand.Size = new System.Drawing.Size(75, 25); + this.buttonAfstand.TabIndex = 2; + this.buttonAfstand.Text = "Set"; + this.buttonAfstand.UseVisualStyleBackColor = false; + this.buttonAfstand.Click += new System.EventHandler(this.buttonAfstand_Click); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.Location = new System.Drawing.Point(207, 26); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(23, 13); + this.label5.TabIndex = 3; + this.label5.Text = "sec"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(208, 30); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(15, 13); + this.label6.TabIndex = 3; + this.label6.Text = "m"; + // + // button3 + // + this.buttonTrapsnelheid.BackColor = System.Drawing.Color.WhiteSmoke; + this.buttonTrapsnelheid.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonTrapsnelheid.Location = new System.Drawing.Point(283, 42); + this.buttonTrapsnelheid.Name = "button3"; + this.buttonTrapsnelheid.Size = new System.Drawing.Size(75, 25); + this.buttonTrapsnelheid.TabIndex = 2; + this.buttonTrapsnelheid.Text = "Set"; + this.buttonTrapsnelheid.UseVisualStyleBackColor = false; + this.buttonTrapsnelheid.Click += new System.EventHandler(this.buttonTrapsnelheid_Click); + + Controls.Add(this.panel6); + Controls.Add(this.panel5); + Controls.Add(this.panel3); + Controls.Add(this.panel2); + Dock = System.Windows.Forms.DockStyle.Fill; + Location = new System.Drawing.Point(0, 0); + BackColor = System.Drawing.Color.White; + Name = "panel1"; + Size = new System.Drawing.Size(370, 400); + + } + + private void TextBox2_KeyDown(object sender, KeyEventArgs e) + { + if(e.KeyCode == Keys.Enter) + { + buttonAfstand_Click(this, new EventArgs()); + } + } + + private void TextBox1_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonTijd_Click(this, new EventArgs()); + } + } + + private void buttonTrapsnelheid_Click(object sender, EventArgs e) + { + MainClient.SendNetCommand(new NetCommand(NetCommand.ValueType.POWER, trackBar1.Value, Session)); + } + + private void buttonAfstand_Click(object sender, EventArgs e) + { + MainClient.SendNetCommand(new NetCommand(NetCommand.ValueType.DISTANCE, int.Parse(textBox2.Text), Session)); + textBox2.Text = ""; + } + + private void buttonTijd_Click(object sender, EventArgs e) + { + int seconds = (int.Parse(textBox1.Text.Split(':')[0]) * 60) + int.Parse(textBox1.Text.Split(':')[1]); + MainClient.SendNetCommand(new NetCommand(NetCommand.ValueType.TIME, seconds, Session)); + textBox1.Text = ""; + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/PanelGraphView.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelGraphView.cs new file mode 100644 index 0000000..119c367 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/PanelGraphView.cs @@ -0,0 +1,71 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace ErgometerDoctorApplication +{ + public class PanelGraphView : Panel + { + + private List charts; + private FlowLayoutPanel flowlayout; + + public PanelGraphView() : base() + { + createCharts(); + + flowlayout = new FlowLayoutPanel(); + + flowlayout.Dock = DockStyle.Fill; + flowlayout.BackColor = System.Drawing.Color.DarkGray; + flowlayout.Location = new System.Drawing.Point(0, 0); + flowlayout.Name = "flowlayout"; + flowlayout.Padding = new Padding(15); + flowlayout.AutoScroll = true; + foreach (ChartPanel chart in charts) + { + flowlayout.Controls.Add(chart); + } + + List metingen = new List(); + metingen.Add(new Meting(0, 0, 0, 0, 0, 0, 0, 0, 0)); + + updateAllCharts(metingen); + // + // panelGraphView + // + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Controls.Add(flowlayout); + + this.Location = new System.Drawing.Point(0, 0); + this.Name = "panelGraphView"; + this.Size = new System.Drawing.Size(400, 600); + this.TabIndex = 1; + } + + public void createCharts() + { + charts = new List(); + charts.Add(new ChartPanel(ChartPanel.MetingType.HEARTBEAT, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.RPM, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.SPEED, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.DISTANCE, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.ENERGY, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.POWER, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.ACTUALPOWER, SeriesChartType.Line)); + } + + public void updateAllCharts(List metingen) + { + foreach (ChartPanel chart in charts) + { + chart.updateChart(metingen); + } + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.Designer.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.Designer.cs new file mode 100644 index 0000000..60a8354 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.Designer.cs @@ -0,0 +1,175 @@ +using ErgometerDoctorApplication.Client; +using System; + +namespace ErgometerDoctorApplication +{ + partial class SessionWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + + + this.components = new System.ComponentModel.Container(); + this.panelClientContainer = new System.Windows.Forms.Panel(); + this.panelDataViewLeft = new System.Windows.Forms.Panel(); + this.panelClientSetData = new PanelClientSetData(Session); + this.panelGraphView = new ErgometerDoctorApplication.PanelGraphView(); + this.panelClientChat = new ErgometerDoctorApplication.PanelClientChat(Session, ClientName); + this.panelTopBar = new System.Windows.Forms.Panel(); + this.labelUsername = new System.Windows.Forms.Label(); + this.labelHallo = new System.Windows.Forms.Label(); + + this.heartBeat = new PanelClientData("Hartslag", 50, 220); + this.RPM = new PanelClientData("RPM", 0, 120); + this.speed = new PanelClientData("Snelheid", 0, 50); + this.distance = new PanelClientData("Afstand (km)", 0, 100); + this.power = new PanelClientData("Weerstand", 25, 400); + this.energy = new PanelClientData("Energie", 0, 200); + this.actualpower = new PanelClientData("Absolute Weerstand", 0, 400); + this.time = new PanelClientData("Tijd", 0, 400); + + this.panelClientContainer.SuspendLayout(); + this.panelTopBar.SuspendLayout(); + // + // panelClientContainer + // + this.panelClientContainer.Controls.Add(this.panelGraphView); + this.panelClientContainer.Controls.Add(this.panelDataViewLeft); + + this.panelClientContainer.Controls.Add(this.panelClientChat); + this.panelClientContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelClientContainer.Location = new System.Drawing.Point(0, 0); + this.panelClientContainer.Name = "panelClientContainer"; + this.panelClientContainer.Size = new System.Drawing.Size(800, 600); + this.panelClientContainer.TabIndex = 0; + // + // panelDataViewLeft + // + //this.panelDataViewLeft.Dock = System.Windows.Forms.DockStyle.Left; + this.panelDataViewLeft.Location = new System.Drawing.Point(0, 0); + this.panelDataViewLeft.Name = "panelDataViewLeft"; + this.panelDataViewLeft.Size = new System.Drawing.Size(18, 600); + this.panelDataViewLeft.TabIndex = 3; + this.panelDataViewLeft.BackColor = System.Drawing.Color.Gray; + this.panelDataViewLeft.Controls.Add(panelClientSetData); + this.panelDataViewLeft.Controls.Add(heartBeat); + this.panelDataViewLeft.Controls.Add(RPM); + this.panelDataViewLeft.Controls.Add(speed); + this.panelDataViewLeft.Controls.Add(distance); + this.panelDataViewLeft.Controls.Add(power); + this.panelDataViewLeft.Controls.Add(energy); + this.panelDataViewLeft.Controls.Add(actualpower); + this.panelDataViewLeft.Controls.Add(time); + + + // + // panelClientChat + // + this.panelClientChat.BackColor = System.Drawing.SystemColors.ButtonHighlight; + this.panelClientChat.Dock = System.Windows.Forms.DockStyle.Right; + this.panelClientChat.Location = new System.Drawing.Point(400, 0); + this.panelClientChat.Name = "panelClientChat"; + this.panelClientChat.Size = new System.Drawing.Size(400, 600); + this.panelClientChat.TabIndex = 2; + // + // panelTopBar + // + this.panelTopBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.panelTopBar.Controls.Add(this.labelUsername); + this.panelTopBar.Controls.Add(this.labelHallo); + this.panelTopBar.Dock = System.Windows.Forms.DockStyle.Top; + this.panelTopBar.Location = new System.Drawing.Point(0, 0); + this.panelTopBar.Name = "panelTopBar"; + this.panelTopBar.Size = new System.Drawing.Size(800, 30); + this.panelTopBar.TabIndex = 1; + this.panelTopBar.Visible = false; + // + // labelUsername + // + this.labelUsername.AutoSize = true; + this.labelUsername.Font = new System.Drawing.Font("Segoe UI Semilight", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelUsername.ForeColor = System.Drawing.Color.White; + this.labelUsername.Location = new System.Drawing.Point(49, 3); + this.labelUsername.Name = "labelUsername"; + this.labelUsername.Size = new System.Drawing.Size(144, 21); + this.labelUsername.TabIndex = 0; + this.labelUsername.Text = ""; + // + // labelHallo + // + this.labelHallo.AutoSize = true; + this.labelHallo.Font = new System.Drawing.Font("Segoe UI Semilight", 12F); + this.labelHallo.ForeColor = System.Drawing.Color.White; + this.labelHallo.Location = new System.Drawing.Point(3, 3); + this.labelHallo.Name = "labelHallo"; + this.labelHallo.Size = new System.Drawing.Size(54, 21); + this.labelHallo.TabIndex = 0; + this.labelHallo.Text = "Hallo, "; + // + // SessionWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 600); + this.Controls.Add(this.panelTopBar); + this.Controls.Add(this.panelClientContainer); + this.Name = "SessionWindow"; + this.Text = "Sessie: " + ClientName; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Resize += new System.EventHandler(this.ClientApplicatie_Resize); + this.panelClientContainer.ResumeLayout(false); + this.panelTopBar.ResumeLayout(false); + this.panelTopBar.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Panel panelClientContainer; + public PanelClientChat panelClientChat; + public PanelGraphView panelGraphView; + private System.Windows.Forms.Panel panelDataViewLeft; + private System.Windows.Forms.Panel panelTopBar; + private System.Windows.Forms.Label labelUsername; + private System.Windows.Forms.Label labelHallo; + public PanelClientData heartBeat, RPM, speed, distance, power, energy, seconds, actualpower, time; + public PanelClientSetData panelClientSetData; + + private void createTitle() + { + if (ActiveSession) + { + this.Text = "Actieve Sessie: " + ClientName; + } + else + { + this.Text = "Afgelopen Sessie: " + ClientName; + } + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.cs b/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.cs new file mode 100644 index 0000000..43bb154 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.cs @@ -0,0 +1,103 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public partial class SessionWindow : Form + { + + private bool ActiveSession { get; } + private string ClientName { get; set; } + public int Session { get; } + + private ClientThread client; + + private int count; + + public delegate void UpdateMetingen(Meting m); + public UpdateMetingen updateMetingen; + + public delegate void UpdateGraph(); + public UpdateGraph updateGraph; + + public SessionWindow(string ClientName, bool old, int session, ClientThread parentthread) + { + this.ActiveSession = !old; + this.ClientName = ClientName; + this.client = parentthread; + Session = session; + + count = 0; + + updateMetingen = new UpdateMetingen(this.SaveMeting); + updateGraph = new UpdateGraph(this.LoadGraph); + + InitializeComponent(); + + if(! ActiveSession) + { + panelClientChat.richTextBox1.Enabled = false; + panelClientChat.button1.Enabled = false; + panelDataViewLeft.Visible = false; + } + } + + public void ClientApplicatie_Resize(object sender, EventArgs e) + { + Control control = (Control)sender; + if (control.Size.Width < 980) + { + panelGraphView.Visible = false; + panelClientChat.Width = 400; + panelDataViewLeft.Dock = DockStyle.Fill; + } + if (control.Size.Width >= 980 && control.Size.Width < 1368) + { + panelGraphView.Visible = true; + panelDataViewLeft.Width = 250; + panelClientChat.Width = 400; + panelDataViewLeft.Dock = DockStyle.Left; + } + if (control.Size.Width >= 1368) + { + panelGraphView.Visible = true; + panelDataViewLeft.Width = 400; + panelDataViewLeft.Dock = DockStyle.Left; + } + } + + public void SaveMeting(Meting m) + { + + heartBeat.updateValue(m.HeartBeat); + RPM.updateValue(m.RPM); + speed.updateValue(m.Speed*100); + distance.updateValue(m.Distance*100); + power.updateValue(m.Power); + energy.updateValue(m.Energy); + actualpower.updateValue(m.ActualPower); + time.updateValue(m.Seconds); + + if (count >= 10) + { + count = 0; + panelGraphView.updateAllCharts(client.Metingen); + } + + count++; + } + + public void LoadGraph() + { + panelGraphView.updateAllCharts(client.Metingen); + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.resx b/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Client/SessionWindow.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerDoctorApplication/ConActiveSessions.cs b/ErgometerIPR/ErgometerDoctorApplication/ConActiveSessions.cs new file mode 100644 index 0000000..e8389cc --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/ConActiveSessions.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.AccessControl; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class ConActiveSessions : Panel + { + + private FlowLayoutPanel flowlayout; + + public ConActiveSessions() : base() + { + labelActiveSessions = new Label(); + // + // ConActiveSessions + // + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "ConActiveSessions"; + this.Size = new System.Drawing.Size(584, 459); + this.TabIndex = 0; + // + // labelActiveSessions + // + this.labelActiveSessions.Anchor = System.Windows.Forms.AnchorStyles.Top | AnchorStyles.Left; + this.labelActiveSessions.AutoSize = true; + this.labelActiveSessions.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelActiveSessions.Location = new System.Drawing.Point(20, 20); + this.labelActiveSessions.Name = "labelActiveSessions"; + this.labelActiveSessions.Size = new System.Drawing.Size(103, 21); + this.labelActiveSessions.TabIndex = 3; + this.labelActiveSessions.Text = "Er zijn geen actieve sessies."; + + flowlayout = new FlowLayoutPanel(); + + flowlayout.Dock = DockStyle.Fill; + flowlayout.BackColor = System.Drawing.Color.WhiteSmoke; + flowlayout.Location = new System.Drawing.Point(0, 0); + flowlayout.Name = "flowlayout"; + flowlayout.Padding = new Padding(15); + flowlayout.AutoScroll = true; + + this.Controls.Add(labelActiveSessions); + this.Controls.Add(flowlayout); + + //this.Controls.Add(data); + + updateActiveSessions(MainClient.activesessions); + + } + + public System.Windows.Forms.Label labelActiveSessions; + + public void updateActiveSessions(Dictionary actives) + { + flowlayout.Controls.Clear(); + + foreach (KeyValuePair pair in actives) + { + + flowlayout.Controls.Add(new SessionPanel(pair.Key, pair.Value, true,0)); + } + } + + /* + private void data_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if (data.Rows[e.RowIndex].Cells[1].Value != null) + { + MainClient.StartNewCLient(data.Rows[e.RowIndex].Cells[0].Value + "", int.Parse(data.Rows[e.RowIndex].Cells[1].Value + "")); + } + } + + public System.Windows.Forms.DataGridViewTextBoxColumn name; + public System.Windows.Forms.DataGridViewTextBoxColumn sessionId; + public System.Windows.Forms.DataGridView data; + */ + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/ConClientBroadcast.cs b/ErgometerIPR/ErgometerDoctorApplication/ConClientBroadcast.cs new file mode 100644 index 0000000..6013746 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/ConClientBroadcast.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class ConClientBroadcast : Panel + { + + public ConClientBroadcast() : base() + { + + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "ConClientBroadcast"; + this.Size = new System.Drawing.Size(584, 459); + this.TabIndex = 0; + + buttonBroadcast = new Button(); + textBoxBroadcast = new TextBox(); + + // + // buttonLogin + // + this.buttonBroadcast.Anchor = AnchorStyles.Left | AnchorStyles.Top; + this.buttonBroadcast.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonBroadcast.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonBroadcast.Location = new System.Drawing.Point(200, 20); + this.buttonBroadcast.Name = "buttonCreate"; + this.buttonBroadcast.Size = new System.Drawing.Size(168, 31); + this.buttonBroadcast.TabIndex = 3; + this.buttonBroadcast.Text = "Broadcast"; + this.buttonBroadcast.UseVisualStyleBackColor = true; + this.buttonBroadcast.Click += new System.EventHandler(this.buttonBroadcast_Click); + // + // textBoxPassword + // + this.textBoxBroadcast.Anchor = AnchorStyles.Left | AnchorStyles.Top; + this.textBoxBroadcast.Location = new System.Drawing.Point(20, 20); + this.textBoxBroadcast.MaxLength = 16; + this.textBoxBroadcast.Name = "textBoxPassword"; + this.textBoxBroadcast.Size = new System.Drawing.Size(167, 20); + this.textBoxBroadcast.TabIndex = 2; + this.textBoxBroadcast.KeyDown += TextBoxBroadcast_KeyDown; + + this.Controls.Add(textBoxBroadcast); + this.Controls.Add(buttonBroadcast); + + + } + + private void TextBoxBroadcast_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonBroadcast_Click(this, new EventArgs()); + } + } + + private void buttonBroadcast_Click(object sender, EventArgs e) + { + MainClient.SendNetCommand(new ErgometerLibrary.NetCommand(textBoxBroadcast.Text, MainClient.Session)); + textBoxBroadcast.Text = ""; + } + + public System.Windows.Forms.TextBox textBoxBroadcast; + public System.Windows.Forms.Button buttonBroadcast; + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/ConClientData.cs b/ErgometerIPR/ErgometerDoctorApplication/ConClientData.cs new file mode 100644 index 0000000..293d3b4 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/ConClientData.cs @@ -0,0 +1,150 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Security.AccessControl; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class ConClientData : Panel + { + public System.Windows.Forms.TextBox textBoxPassword; + public System.Windows.Forms.TextBox textBoxUsername; + public System.Windows.Forms.Button buttonCreate; + public System.Windows.Forms.ListBox listUsers; + public System.Windows.Forms.Label newUsername; + public System.Windows.Forms.Label newPassword; + + public ConClientData() : base() + { + this.buttonCreate = new System.Windows.Forms.Button(); + this.textBoxPassword = new System.Windows.Forms.TextBox(); + this.textBoxUsername = new System.Windows.Forms.TextBox(); + this.listUsers = new System.Windows.Forms.ListBox(); + this.newUsername = new System.Windows.Forms.Label(); + this.newPassword = new System.Windows.Forms.Label(); + + // + // buttonLogin + // + this.buttonCreate.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.buttonCreate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonCreate.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonCreate.Location = new System.Drawing.Point(20, 215); + this.buttonCreate.Name = "buttonCreate"; + this.buttonCreate.Size = new System.Drawing.Size(168, 31); + this.buttonCreate.TabIndex = 3; + this.buttonCreate.Text = "Aanmaken"; + this.buttonCreate.BackColor = Color.LightGray; + this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click); + // + // textBoxPassword + // + this.textBoxPassword.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.textBoxPassword.Location = new System.Drawing.Point(170, 180); + this.textBoxPassword.MaxLength = 16; + this.textBoxPassword.Name = "textBoxPassword"; + this.textBoxPassword.Size = new System.Drawing.Size(167, 60); + this.textBoxPassword.TabIndex = 2; + this.textBoxPassword.KeyDown += TextBoxEnterPress; + // + // textBoxUsername + // + this.textBoxUsername.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.textBoxUsername.Location = new System.Drawing.Point(170, 150); + this.textBoxUsername.MaxLength = 16; + this.textBoxUsername.Name = "textBoxUsername"; + this.textBoxUsername.Size = new System.Drawing.Size(167, 20); + this.textBoxUsername.TabIndex = 2; + this.textBoxUsername.KeyDown += TextBoxEnterPress; + // + // listUsers + // + this.listUsers.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.listUsers.Location = new System.Drawing.Point(20, -150); + this.listUsers.Name = "listUsers"; + this.listUsers.Size = new System.Drawing.Size(200, 280); + this.listUsers.Items.Add("Geen gebruikers"); + // + // newPassword + // + this.newPassword.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.newPassword.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.newPassword.ForeColor = Color.Black; + this.newPassword.Location = new System.Drawing.Point(20, 182); + this.newPassword.Name = "newPassword"; + this.newPassword.Size = new System.Drawing.Size(167, 20); + this.newPassword.TabIndex = 3; + this.newPassword.Text = "Nieuw wachtwoord"; + // + // newUsername + // + this.newUsername.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.newUsername.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.newUsername.Location = new System.Drawing.Point(20, 152); + this.newUsername.Name = "newUsername"; + this.newUsername.Size = new System.Drawing.Size(167, 20); + this.newUsername.TabIndex = 3; + this.newUsername.Text = "Nieuwe gebruikersnaam"; + + this.Controls.Add(this.listUsers); + this.Controls.Add(this.buttonCreate); + this.Controls.Add(this.textBoxUsername); + this.Controls.Add(this.textBoxPassword); + this.Controls.Add(this.newUsername); + this.Controls.Add(this.newPassword); + // + // ConClientData + // + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(20, 0); + this.Name = "ConClientData"; + this.Size = new System.Drawing.Size(584, 459); + this.TabIndex = 0; + + + + this.BackColor = System.Drawing.Color.White; + } + + private void TextBoxEnterPress(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonCreate_Click(this, new EventArgs()); + } + } + + internal void updateUsers(Dictionary users) + { + this.listUsers.Items.Clear(); + + foreach(KeyValuePair user in users) + { + this.listUsers.Items.Add(user.Key + ": " + user.Value); + } + } + + private void buttonCreate_Click(object sender, EventArgs e) + { + if (!MainClient.users.ContainsKey(textBoxUsername.Text)) + { + MainClient.SendNetCommand(new NetCommand(textBoxUsername.Text, textBoxPassword.Text, MainClient.Session)); + MainClient.SendNetCommand(new NetCommand(NetCommand.RequestType.USERS, MainClient.Session)); + + textBoxUsername.Text = ""; + + Thread.Sleep(250); + updateUsers(MainClient.users); + } + + + textBoxPassword.Text = ""; + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/ConPanelLogin.cs b/ErgometerIPR/ErgometerDoctorApplication/ConPanelLogin.cs new file mode 100644 index 0000000..3bf2ab4 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/ConPanelLogin.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class ConPanelLogin:Panel + { + + MainWindow mainWindow; + + public ConPanelLogin(Form mainWindow) : base() + { + this.mainWindow = (MainWindow)mainWindow; + this.textBoxPassword = new System.Windows.Forms.TextBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.buttonLogin = new System.Windows.Forms.Button(); + this.labelPassword = new System.Windows.Forms.Label(); + this.labelLoginInfo = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + // + // Container + // + this.BackColor = System.Drawing.Color.White; + this.Controls.Add(this.labelLoginInfo); + this.Controls.Add(this.labelPassword); + this.Controls.Add(this.buttonLogin); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.textBoxPassword); + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + // + // textBoxPassword + // + this.textBoxPassword.Anchor = System.Windows.Forms.AnchorStyles.None; + this.textBoxPassword.Location = new System.Drawing.Point(15, 70); + this.textBoxPassword.Name = "textBoxPassword"; + this.textBoxPassword.PasswordChar = '*'; + this.textBoxPassword.Size = new System.Drawing.Size(150, 20); + this.textBoxPassword.TabIndex = 0; + this.textBoxPassword.KeyDown += TextBoxPassword_KeyDown; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Image)Properties.Resources.imageDoctor); + this.pictureBox1.Anchor = System.Windows.Forms.AnchorStyles.None; + this.pictureBox1.Location = new System.Drawing.Point(0, -150); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(175, 175); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + + // + // buttonLogin + // + this.buttonLogin.Anchor = System.Windows.Forms.AnchorStyles.None; + this.buttonLogin.BackColor = System.Drawing.SystemColors.Highlight; + this.buttonLogin.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.buttonLogin.Font = new System.Drawing.Font("Segoe UI Semibold", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.buttonLogin.ForeColor = System.Drawing.Color.White; + this.buttonLogin.Location = new System.Drawing.Point(15, 105); + this.buttonLogin.Name = "buttonLogin"; + this.buttonLogin.Size = new System.Drawing.Size(150, 30); + this.buttonLogin.TabIndex = 2; + this.buttonLogin.Text = "Log In"; + this.buttonLogin.UseVisualStyleBackColor = false; + this.buttonLogin.Click += new System.EventHandler(this.buttonLogin_Click); + // + // labelPassword + // + this.labelPassword.Anchor = System.Windows.Forms.AnchorStyles.None; + this.labelPassword.AutoSize = true; + this.labelPassword.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelPassword.Location = new System.Drawing.Point(11, 40); + this.labelPassword.Name = "labelPassword"; + this.labelPassword.Size = new System.Drawing.Size(103, 21); + this.labelPassword.TabIndex = 3; + this.labelPassword.Text = "Wachtwoord"; + // + // labelLoginInfo + // + this.labelLoginInfo.Anchor = System.Windows.Forms.AnchorStyles.None; + this.labelLoginInfo.AutoSize = true; + this.labelLoginInfo.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelLoginInfo.ForeColor = System.Drawing.Color.Red; + this.labelLoginInfo.Location = new System.Drawing.Point(11, 140); + this.labelLoginInfo.Name = "labelLoginInfo"; + this.labelLoginInfo.Size = new System.Drawing.Size(103, 21); + this.labelLoginInfo.TabIndex = 4; + this.labelLoginInfo.Text = ""; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + + } + + private void TextBoxPassword_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + buttonLogin_Click(this, new EventArgs()); + } + } + + private void buttonLogin_Click(object sender, EventArgs e) + { + mainWindow.validateLogin(); + } + public System.Windows.Forms.TextBox textBoxPassword; + private PictureBox pictureBox1; + private System.Windows.Forms.Button buttonLogin; + private System.Windows.Forms.Label labelPassword; + public System.Windows.Forms.Label labelLoginInfo; + } + +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/ConSessionHistory.cs b/ErgometerIPR/ErgometerDoctorApplication/ConSessionHistory.cs new file mode 100644 index 0000000..1326d43 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/ConSessionHistory.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public class ConSessionHistory : Panel + { + private FlowLayoutPanel flowlayout; + + public ConSessionHistory() : base() + { + labelSessionHistory = new Label(); + + this.Dock = System.Windows.Forms.DockStyle.Fill; + this.Location = new System.Drawing.Point(0, 0); + this.Name = "ConSessionHistory"; + this.Size = new System.Drawing.Size(584, 459); + this.TabIndex = 0; + // + // labelSessionHistory + // + this.labelSessionHistory.Anchor = System.Windows.Forms.AnchorStyles.Top | AnchorStyles.Left; + this.labelSessionHistory.AutoSize = true; + this.labelSessionHistory.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelSessionHistory.Location = new System.Drawing.Point(20, 20); + this.labelSessionHistory.Name = "labelSessionHistory"; + this.labelSessionHistory.Size = new System.Drawing.Size(103, 21); + this.labelSessionHistory.TabIndex = 3; + this.labelSessionHistory.Text = "Er zijn geen oude sessies."; + + flowlayout = new FlowLayoutPanel(); + + flowlayout.Dock = DockStyle.Fill; + flowlayout.BackColor = System.Drawing.Color.WhiteSmoke; + flowlayout.Location = new System.Drawing.Point(0, 0); + flowlayout.Name = "flowlayout"; + flowlayout.Padding = new Padding(15); + flowlayout.AutoScroll = true; + + this.Controls.Add(labelSessionHistory); + this.Controls.Add(flowlayout); + + //this.Controls.Add(data); + + updateHistory(MainClient.oldSessionsData); + + } + + public System.Windows.Forms.Label labelSessionHistory; + + public void updateHistory(List> historys) + { + flowlayout.Controls.Clear(); + + foreach (Tuple sessiondata in historys) + { + flowlayout.Controls.Add(new SessionPanel(sessiondata.Item3, sessiondata.Item1, false,sessiondata.Item2)); + } + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/ErgometerDoctorApplication.csproj b/ErgometerIPR/ErgometerDoctorApplication/ErgometerDoctorApplication.csproj new file mode 100644 index 0000000..7ce7163 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/ErgometerDoctorApplication.csproj @@ -0,0 +1,144 @@ + + + + + Debug + AnyCPU + {E543FF58-161A-4A41-AAE7-651327834362} + WinExe + Properties + ErgometerDoctorApplication + ErgometerDoctorApplication + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\ErgometerLibrary\ErgometerLibrary\ErgometerLibrary\bin\Debug\ErgometerLibrary.dll + + + + + + + + + + + + + + + + + + Component + + + + Component + + + Component + + + Component + + + Component + + + Form + + + SessionWindow.cs + + + Component + + + Component + + + Component + + + Component + + + Component + + + + Form + + + MainWindow.cs + + + + + Component + + + MainWindow.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SessionWindow.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerDoctorApplication/MainClient.cs b/ErgometerIPR/ErgometerDoctorApplication/MainClient.cs new file mode 100644 index 0000000..74c08e7 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/MainClient.cs @@ -0,0 +1,276 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ErgometerDoctorApplication +{ + class MainClient + { + + public static TcpClient Server { get; set; } + + public static bool loggedin; + + private static Thread t; + private static bool running; + + public static int Session; + + public static string HOST = "127.0.0.1"; + public static int PORT = 8888; + + + //Server information + public static List clients; + public static Dictionary users; + public static List> oldSessionsData; + + public static void RemoveActiveClient(ClientThread clientThread) + { + clients.Remove(clientThread); + } + + public static Dictionary activesessions; + + static MainClient() + { + Server = new TcpClient(); + + loggedin = false; + + clients = new List(); + users = new Dictionary(); + activesessions = new Dictionary(); + oldSessionsData = new List>(); + } + + public static bool Connect(string password, out string error) + { + error = "Succes"; + + if (Server == null || !Server.Connected) + { + if (Server == null) + Server = new TcpClient(); + + try + { + Server.Connect(HOST, PORT); + } + catch (Exception e) + { + error = "Server is niet online."; + return false; + } + + NetCommand net = NetHelper.ReadNetCommand(Server); + if (net.Type == NetCommand.CommandType.SESSION) + Session = net.Session; + else + throw new Exception("Session not assigned"); + + running = true; + t = new Thread(run); + t.IsBackground = true; + t.Start(); + } + + if (!loggedin) + { + NetCommand command = new NetCommand("Doctor0tVfW", true, password, Session); + NetHelper.SendNetCommand(Server, command); + + NetCommand response = NetHelper.ReadNetCommand(Server); + if (response.Type == NetCommand.CommandType.RESPONSE && response.Response == NetCommand.ResponseType.LOGINWRONG) + { + loggedin = false; + error = "Het wachtwoord is onjuist."; + return false; + } + + loggedin = true; + } + + + SendNetCommand(new NetCommand(NetCommand.RequestType.SESSIONDATA, Session)); + Thread.Sleep(15); + SendNetCommand(new NetCommand(NetCommand.RequestType.USERS, Session)); + + Thread.Sleep(200); + + return true; + } + + public static void Disconnect() + { + + if (Server != null && Server.Connected) + { + NetHelper.SendNetCommand(Server, new NetCommand(NetCommand.CommandType.LOGOUT, Session)); + loggedin = false; + running = false; + Server.Close(); + Server = null; + } + } + + public static void run() + { + while (running) + { + if (loggedin && Server.Connected && Server.Available > 0) + { + NetCommand command = NetHelper.ReadNetCommand(Server); + HandleNetCommand(command); + + } + } + + if(Server != null) + Server.Close(); + } + + private static bool UsersBeingSent = false; + private static int UsersSent = 0; + private static int UsersLength = 0; + + private static bool SessionsBeingSent = false; + private static int SessionsSent = 0; + private static int SessionsLength = 0; + + private static bool ActiveSessionsBeingSent = false; + private static int ActiveSessionsSent = 0; + private static int ActiveSessionsLength = 0; + + private static void HandleNetCommand(NetCommand command) + { + switch (command.Type) + { + case NetCommand.CommandType.LENGTH: + switch (command.Length) + { + case NetCommand.LengthType.USERS: + users.Clear(); + UsersBeingSent = true; + UsersSent = 0; + UsersLength = command.LengthValue; + break; + case NetCommand.LengthType.SESSIONS: + oldSessionsData.Clear(); + SessionsBeingSent = true; + SessionsSent = 0; + SessionsLength = command.LengthValue; + break; + case NetCommand.LengthType.SESSIONDATA: + activesessions.Clear(); + ActiveSessionsBeingSent = true; + ActiveSessionsSent = 0; + ActiveSessionsLength = command.LengthValue; + break; + default: + throw new FormatException("Error in NetCommand: Length type is not recognised"); + } + break; + case NetCommand.CommandType.ERROR: + Console.WriteLine("An error occured, ignoring"); + break; + case NetCommand.CommandType.USER: + if(UsersBeingSent) + { + users.Add(command.DisplayName, command.Password); + UsersSent++; + if (UsersSent >= UsersLength) + UsersBeingSent = false; + } + break; + case NetCommand.CommandType.SESSIONDATA: + if (ActiveSessionsBeingSent) + { + activesessions.Add(command.Session, command.DisplayName); + ActiveSessionsSent++; + if (ActiveSessionsSent >= ActiveSessionsLength) + ActiveSessionsBeingSent = false; + } + if (SessionsBeingSent) + { + oldSessionsData.Add(new Tuple(command.DisplayName, command.Timestamp, command.Session)); + SessionsSent++; + if (SessionsSent >= SessionsLength) + SessionsBeingSent = false; + } + break; + default: + HandToClient(command); + break; + } + } + + private static void HandToClient(NetCommand command) + { + foreach (ClientThread cl in clients) + { + if (cl.Session == command.Session) + { + cl.HandleCommand(command); + } + } + } + + public static void SendNetCommand(NetCommand command) + { + if(! NetHelper.SendNetCommand(Server, command)) + { + Disconnect(); + } + } + + private static bool IsSessionRunning(int session) + { + foreach (ClientThread cl in clients) + { + if (cl.Session == session) + return true; + } + + return false; + } + + public static void StartNewClient(string name, int session) + { + if (IsSessionRunning(session)) + return; + + //Start new client + ClientThread cl = new ClientThread(name, session, false); + clients.Add(cl); + + //Run client on new thread + Thread thread = new Thread(new ThreadStart(cl.run)); + thread.IsBackground = true; + thread.Start(); + } + + public static void StartOldClient(string name, int session) + { + if (IsSessionRunning(session)) + return; + + SendNetCommand(new NetCommand(NetCommand.RequestType.OLDDATA, session)); + SendNetCommand(new NetCommand(NetCommand.RequestType.CHAT, session)); + + //Start new client + ClientThread cl = new ClientThread(name, session, true); + clients.Add(cl); + + //Run client on new thread + Thread thread = new Thread(new ThreadStart(cl.run)); + thread.IsBackground = true; + thread.Start(); + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/MainWindow.Designer.cs b/ErgometerIPR/ErgometerDoctorApplication/MainWindow.Designer.cs new file mode 100644 index 0000000..d8a7c95 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/MainWindow.Designer.cs @@ -0,0 +1,320 @@ +using System; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + partial class MainWindow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.MenuPanel = new System.Windows.Forms.Panel(); + this.BtnLogout = new System.Windows.Forms.Button(); + this.BtnSessionHistory = new System.Windows.Forms.Button(); + this.BtnBroadcast = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.BtnClientData = new System.Windows.Forms.Button(); + this.BtnActiveSessions = new System.Windows.Forms.Button(); + this.LblHoofdvenster = new System.Windows.Forms.Label(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.panel1 = new System.Windows.Forms.Panel(); + this.HeaderLabel = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.MainContainer = new System.Windows.Forms.Panel(); + this.conActiveSessions = new ErgometerDoctorApplication.ConActiveSessions(); + this.conClientData = new ErgometerDoctorApplication.ConClientData(); + this.conSessionHistory = new ErgometerDoctorApplication.ConSessionHistory(); + this.conClientBroadcast = new ErgometerDoctorApplication.ConClientBroadcast(); + this.conPanelLogin = new ErgometerDoctorApplication.ConPanelLogin(this); + this.updateTimer = new Timer(); + MainContainer.Visible = false; + panel1.Visible = false; + MenuPanel.Visible = false; + menuStrip1.Visible = false; + // + // MenuPanel + // + this.MenuPanel.BackColor = System.Drawing.SystemColors.ControlLight; + this.MenuPanel.Controls.Add(this.BtnLogout); + this.MenuPanel.Controls.Add(this.BtnSessionHistory); + this.MenuPanel.Controls.Add(this.BtnBroadcast); + this.MenuPanel.Controls.Add(this.label2); + this.MenuPanel.Controls.Add(this.label1); + this.MenuPanel.Controls.Add(this.BtnClientData); + this.MenuPanel.Controls.Add(this.BtnActiveSessions); + this.MenuPanel.Controls.Add(this.LblHoofdvenster); + this.MenuPanel.Dock = System.Windows.Forms.DockStyle.Left; + this.MenuPanel.Location = new System.Drawing.Point(0, 24); + this.MenuPanel.Margin = new System.Windows.Forms.Padding(0); + this.MenuPanel.Name = "MenuPanel"; + this.MenuPanel.Size = new System.Drawing.Size(200, 537); + this.MenuPanel.TabIndex = 0; + + // + // BtnLogout + // + this.BtnLogout.BackColor = System.Drawing.Color.DarkGray; + this.BtnLogout.Dock = System.Windows.Forms.DockStyle.Bottom; + this.BtnLogout.FlatAppearance.BorderSize = 0; + this.BtnLogout.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnLogout.ForeColor = System.Drawing.Color.White; + this.BtnLogout.Location = new System.Drawing.Point(0, 205); + this.BtnLogout.Name = "BtnLogout"; + this.BtnLogout.Size = new System.Drawing.Size(200, 35); + this.BtnLogout.Text = "Uitloggen"; + this.BtnLogout.UseVisualStyleBackColor = false; + this.BtnLogout.Click += new System.EventHandler(this.buttonLogout_Click); + // + // BtnSessionHistory + // + this.BtnSessionHistory.BackColor = System.Drawing.Color.DarkGray; + this.BtnSessionHistory.Dock = System.Windows.Forms.DockStyle.Top; + this.BtnSessionHistory.FlatAppearance.BorderSize = 0; + this.BtnSessionHistory.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnSessionHistory.ForeColor = System.Drawing.Color.White; + this.BtnSessionHistory.Location = new System.Drawing.Point(0, 205); + this.BtnSessionHistory.Name = "BtnSessionHistory"; + this.BtnSessionHistory.Size = new System.Drawing.Size(200, 35); + this.BtnSessionHistory.TabIndex = 7; + this.BtnSessionHistory.Text = "Sessie Geschiedenis"; + this.BtnSessionHistory.UseVisualStyleBackColor = false; + this.BtnSessionHistory.Click += new System.EventHandler(this.BtnSessionHistory_Click); + // + // label2 + // + this.label2.Dock = System.Windows.Forms.DockStyle.Top; + this.label2.Location = new System.Drawing.Point(0, 180); + this.label2.Margin = new System.Windows.Forms.Padding(6, 3, 6, 3); + this.label2.Name = "label2"; + this.label2.Padding = new System.Windows.Forms.Padding(5, 4, 0, 0); + this.label2.Size = new System.Drawing.Size(200, 25); + this.label2.TabIndex = 6; + this.label2.Text = "SESSIE BEHEER"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // updateTimer + // + this.updateTimer.Interval = 3000; + this.updateTimer.Tick += new EventHandler(this.updateTimer_tick); + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Top; + this.label1.Location = new System.Drawing.Point(0, 95); + this.label1.Margin = new System.Windows.Forms.Padding(6, 3, 6, 3); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(200, 50); + this.label1.TabIndex = 5; + // + // BtnBroadcast + // + this.BtnBroadcast.BackColor = System.Drawing.Color.DarkGray; + this.BtnBroadcast.Dock = System.Windows.Forms.DockStyle.Top; + this.BtnBroadcast.FlatAppearance.BorderSize = 0; + this.BtnBroadcast.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnBroadcast.ForeColor = System.Drawing.Color.White; + this.BtnBroadcast.Location = new System.Drawing.Point(0, 95); + this.BtnBroadcast.Name = "BtnBroadcast"; + this.BtnBroadcast.Size = new System.Drawing.Size(200, 35); + this.BtnBroadcast.TabIndex = 7; + this.BtnBroadcast.Text = "Broadcast"; + this.BtnBroadcast.UseVisualStyleBackColor = false; + this.BtnBroadcast.Click += new System.EventHandler(this.BtnBroadcast_Click); + // + // BtnClientData + // + this.BtnClientData.BackColor = System.Drawing.Color.DarkGray; + this.BtnClientData.Dock = System.Windows.Forms.DockStyle.Top; + this.BtnClientData.FlatAppearance.BorderSize = 0; + this.BtnClientData.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnClientData.ForeColor = System.Drawing.Color.White; + this.BtnClientData.Location = new System.Drawing.Point(0, 60); + this.BtnClientData.Name = "BtnClientData"; + this.BtnClientData.Size = new System.Drawing.Size(200, 35); + this.BtnClientData.TabIndex = 4; + this.BtnClientData.Text = "Clientenbestand"; + this.BtnClientData.UseVisualStyleBackColor = false; + this.BtnClientData.Click += new System.EventHandler(this.BtnClientData_Click); + // + // BtnActiveSessions + // + this.BtnActiveSessions.BackColor = System.Drawing.Color.DarkGray; + this.BtnActiveSessions.Dock = System.Windows.Forms.DockStyle.Top; + this.BtnActiveSessions.FlatAppearance.BorderSize = 0; + this.BtnActiveSessions.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.BtnActiveSessions.ForeColor = System.Drawing.Color.White; + this.BtnActiveSessions.Location = new System.Drawing.Point(0, 25); + this.BtnActiveSessions.Name = "BtnActiveSessions"; + this.BtnActiveSessions.Size = new System.Drawing.Size(200, 35); + this.BtnActiveSessions.TabIndex = 3; + this.BtnActiveSessions.Text = "Actieve Sessies"; + this.BtnActiveSessions.UseVisualStyleBackColor = false; + this.BtnActiveSessions.Click += new System.EventHandler(this.BtnActiveSessions_Click); + // + // LblHoofdvenster + // + this.LblHoofdvenster.Dock = System.Windows.Forms.DockStyle.Top; + this.LblHoofdvenster.Location = new System.Drawing.Point(0, 0); + this.LblHoofdvenster.Margin = new System.Windows.Forms.Padding(6, 3, 6, 3); + this.LblHoofdvenster.Name = "LblHoofdvenster"; + this.LblHoofdvenster.Padding = new System.Windows.Forms.Padding(5, 4, 0, 0); + this.LblHoofdvenster.Size = new System.Drawing.Size(200, 25); + this.LblHoofdvenster.TabIndex = 0; + this.LblHoofdvenster.Text = "HOOFDVENSTER"; + this.LblHoofdvenster.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // menuStrip1 + // + this.menuStrip1.BackColor = System.Drawing.Color.DimGray; + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.viewToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(784, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.editToolStripMenuItem.Text = "Edit"; + // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.viewToolStripMenuItem.Text = "View"; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.HeaderLabel); + this.panel1.Controls.Add(this.panel3); + this.panel1.Dock = System.Windows.Forms.DockStyle.Top; + this.panel1.Location = new System.Drawing.Point(200, 24); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(584, 78); + this.panel1.TabIndex = 2; + // + // HeaderLabel + // + this.HeaderLabel.Dock = System.Windows.Forms.DockStyle.Top; + this.HeaderLabel.Font = new System.Drawing.Font("Segoe UI Semibold", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.HeaderLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.HeaderLabel.Location = new System.Drawing.Point(0, 0); + this.HeaderLabel.Name = "HeaderLabel"; + this.HeaderLabel.Padding = new System.Windows.Forms.Padding(8, 12, 0, 0); + this.HeaderLabel.Size = new System.Drawing.Size(584, 50); + this.HeaderLabel.TabIndex = 1; + this.HeaderLabel.Text = "Actieve Sessies"; + // + // panel3 + // + this.panel3.BackColor = System.Drawing.Color.Silver; + this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panel3.ForeColor = System.Drawing.Color.Black; + this.panel3.Location = new System.Drawing.Point(0, 74); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(584, 4); + this.panel3.TabIndex = 0; + // + // MainContainer + // + this.MainContainer.Controls.Add(this.conActiveSessions); + this.MainContainer.Controls.Add(this.conClientData); + this.MainContainer.Controls.Add(this.conSessionHistory); + this.MainContainer.Controls.Add(this.conClientBroadcast); + this.MainContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.MainContainer.Location = new System.Drawing.Point(200, 102); + this.MainContainer.Name = "MainContainer"; + this.MainContainer.Size = new System.Drawing.Size(584, 459); + this.MainContainer.TabIndex = 3; + // + // MainWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(700, 500); + this.MinimumSize = new System.Drawing.Size(650, 550); + this.Controls.Add(this.MainContainer); + this.Controls.Add(this.panel1); + this.Controls.Add(this.MenuPanel); + this.Controls.Add(this.menuStrip1); + this.Controls.Add(this.conPanelLogin); + + this.MainMenuStrip = this.menuStrip1; + this.Name = "MainWindow"; + this.Text = "Dokter applicatie"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + + } + + + #endregion + + private Panel MenuPanel; + private Label LblHoofdvenster; + private MenuStrip menuStrip1; + private ToolStripMenuItem fileToolStripMenuItem; + private ToolStripMenuItem editToolStripMenuItem; + private ToolStripMenuItem viewToolStripMenuItem; + private Button BtnActiveSessions; + private Button BtnBroadcast; + private Button BtnLogout; + private Button BtnSessionHistory; + private Button BtnClientData; + private Label label2; + private Label label1; + private Panel panel1; + private Panel panel3; + public Label HeaderLabel; + public Timer updateTimer; + public Panel MainContainer; + public ConActiveSessions conActiveSessions; + public ConSessionHistory conSessionHistory; + public ConClientData conClientData; + public ConPanelLogin conPanelLogin; + public ConClientBroadcast conClientBroadcast; + + } +} + diff --git a/ErgometerIPR/ErgometerDoctorApplication/MainWindow.cs b/ErgometerIPR/ErgometerDoctorApplication/MainWindow.cs new file mode 100644 index 0000000..550854a --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/MainWindow.cs @@ -0,0 +1,147 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + public partial class MainWindow : Form + { + private int request; + + public MainWindow() + { + InitializeComponent(); + conPanelLogin.BringToFront(); + request = 2; + updateTimer.Start(); + + } + + private void BtnActiveSessions_Click(object sender, EventArgs e) + { + this.HeaderLabel.Text = "Actieve Sessies"; + + if(MainClient.activesessions.Count > 0) + { + conActiveSessions.labelActiveSessions.Text = ""; + conActiveSessions.updateActiveSessions(MainClient.activesessions); + } + else + { + conActiveSessions.updateActiveSessions(MainClient.activesessions); + conActiveSessions.labelActiveSessions.Text = "Er zijn geen actieve sessies."; + } + + conActiveSessions.BringToFront(); + } + + private void BtnClientData_Click(object sender, EventArgs e) + { + this.HeaderLabel.Text = "Clientenbestand"; + + + if (MainClient.users.Count > 0) + { + conClientData.updateUsers(MainClient.users); + } + + conClientData.BringToFront(); + } + + private void BtnBroadcast_Click(object sender, EventArgs e) + { + this.HeaderLabel.Text = "Broadcast"; + conClientBroadcast.BringToFront(); + } + + private void BtnSessionHistory_Click(object sender, EventArgs e) + { + this.HeaderLabel.Text = "Sessie geschiedenis"; + + if (MainClient.oldSessionsData.Count > 0) + { + conSessionHistory.labelSessionHistory.Text = ""; + conSessionHistory.updateHistory(MainClient.oldSessionsData); + } + else + { + conSessionHistory.updateHistory(MainClient.oldSessionsData); + conSessionHistory.labelSessionHistory.Text = "Er zijn geen oude sessies."; + } + + conSessionHistory.BringToFront(); + } + public void validateLogin() + { + string error = ""; + bool connect = MainClient.Connect(conPanelLogin.textBoxPassword.Text, out error); + + if (connect) + { + conPanelLogin.textBoxPassword.Text = ""; + conPanelLogin.labelLoginInfo.Text = ""; + + if (MainClient.activesessions.Count > 0) + { + conActiveSessions.labelActiveSessions.Text = ""; + conActiveSessions.updateActiveSessions(MainClient.activesessions); + } + + showDashboard(); + } + else + { + conPanelLogin.labelLoginInfo.Text = error; + showLoginScreen(); + } + } + + private void buttonLogout_Click(object sender, EventArgs e) + { + MainClient.Disconnect(); + showLoginScreen(); + } + + private void showDashboard() + { + conPanelLogin.Visible = false; + MainContainer.Visible = true; + panel1.Visible = true; + MenuPanel.Visible = true; + menuStrip1.Visible = true; + } + + private void showLoginScreen() + { + MainContainer.Visible = false; + panel1.Visible = false; + MenuPanel.Visible = false; + menuStrip1.Visible = false; + conPanelLogin.Visible = true; + conPanelLogin.BringToFront(); + } + + private void updateTimer_tick(object sender, EventArgs e) + { + if (request == 0) + MainClient.SendNetCommand(new NetCommand(NetCommand.RequestType.USERS, MainClient.Session)); + else if (request == 1) + MainClient.SendNetCommand(new NetCommand(NetCommand.RequestType.SESSIONDATA, MainClient.Session)); + else if (request == 2) + MainClient.SendNetCommand(new NetCommand(NetCommand.RequestType.ALLSESSIONS, MainClient.Session)); + + request ++; + if (request > 2) + { + request = 0; + } + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/MainWindow.resx b/ErgometerIPR/ErgometerDoctorApplication/MainWindow.resx new file mode 100644 index 0000000..32fcbfb --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/MainWindow.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 25 + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerDoctorApplication/Program.cs b/ErgometerIPR/ErgometerDoctorApplication/Program.cs new file mode 100644 index 0000000..c469659 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainWindow()); + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Properties/AssemblyInfo.cs b/ErgometerIPR/ErgometerDoctorApplication/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f9eac09 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("ErgometerDoctorApplication")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ErgometerDoctorApplication")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e543ff58-161a-4a41-aae7-651327834362")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ErgometerIPR/ErgometerDoctorApplication/Properties/Resources.Designer.cs b/ErgometerIPR/ErgometerDoctorApplication/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c961241 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ErgometerDoctorApplication.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ErgometerDoctorApplication.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap imageDoctor { + get { + object obj = ResourceManager.GetObject("imageDoctor", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Properties/Resources.resx b/ErgometerIPR/ErgometerDoctorApplication/Properties/Resources.resx new file mode 100644 index 0000000..2034261 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\doctorImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerDoctorApplication/Properties/Settings.Designer.cs b/ErgometerIPR/ErgometerDoctorApplication/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5284d3d --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ErgometerDoctorApplication.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/ErgometerIPR/ErgometerDoctorApplication/Properties/Settings.settings b/ErgometerIPR/ErgometerDoctorApplication/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ErgometerIPR/ErgometerDoctorApplication/Resources/doctorImage.png b/ErgometerIPR/ErgometerDoctorApplication/Resources/doctorImage.png new file mode 100644 index 0000000..e138ccd Binary files /dev/null and b/ErgometerIPR/ErgometerDoctorApplication/Resources/doctorImage.png differ diff --git a/ErgometerIPR/ErgometerDoctorApplication/SessionPanel.cs b/ErgometerIPR/ErgometerDoctorApplication/SessionPanel.cs new file mode 100644 index 0000000..2ec251a --- /dev/null +++ b/ErgometerIPR/ErgometerDoctorApplication/SessionPanel.cs @@ -0,0 +1,91 @@ +using System.Windows.Forms; + +namespace ErgometerDoctorApplication +{ + class SessionPanel : Panel + { + private int Session; + private string name; + private bool IsNew; + private double timestamp; + + public SessionPanel(int session, string name, bool isNew,double timestamp) : base() + { + this.timestamp = timestamp; + Session = session; + this.name = name; + IsNew = isNew; + + this.Location = new System.Drawing.Point(0, 0); + this.Size = new System.Drawing.Size(180, 100); + this.BackColor = System.Drawing.Color.DarkGray; + + this.Click += SessionPanel_Click; + this.MouseEnter += SessionPanel_MouseEnter; + this.MouseLeave += SessionPanel_MouseLeave; + this.Cursor = Cursors.Hand; + + this.labelTimestamp = new Label(); + this.labelName = new System.Windows.Forms.Label(); + + // + // labelActiveSessions + // + this.labelName.Anchor = System.Windows.Forms.AnchorStyles.None; + this.labelName.AutoSize = true; + this.labelName.Font = new System.Drawing.Font("Segoe UI Semibold", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelName.Location = new System.Drawing.Point(10, 10); + this.labelName.ForeColor = System.Drawing.Color.White; + this.labelName.Name = "labelActiveSessions"; + this.labelName.Size = new System.Drawing.Size(103, 21); + this.labelName.TabIndex = 3; + this.labelName.Text = name; + this.labelName.Click += SessionPanel_Click; + this.labelName.MouseEnter += SessionPanel_MouseEnter; + this.labelName.MouseLeave += SessionPanel_MouseLeave; + this.labelName.Cursor = Cursors.Hand; + + this.labelTimestamp.Name = "labelTimeStamp"; + this.labelTimestamp.Anchor = AnchorStyles.None; + this.labelTimestamp.Text = ErgometerLibrary.Helper.MillisecondsToTime(timestamp); + this.labelTimestamp.Location = new System.Drawing.Point(10, 40); + this.labelTimestamp.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelTimestamp.ForeColor = System.Drawing.Color.White; + this.labelTimestamp.Size = new System.Drawing.Size(103, 21); + this.labelTimestamp.Click += SessionPanel_Click; + this.labelTimestamp.MouseEnter += SessionPanel_MouseEnter; + this.labelTimestamp.MouseLeave += SessionPanel_MouseLeave; + + if (isNew) + labelTimestamp.Visible = false; + + this.Controls.Add(labelName); + this.Controls.Add(labelTimestamp); + } + + private void SessionPanel_MouseEnter(object sender, System.EventArgs e) + { + this.BackColor = System.Drawing.Color.Gray; + this.labelName.ForeColor = System.Drawing.Color.WhiteSmoke; + labelTimestamp.ForeColor = System.Drawing.Color.WhiteSmoke; + } + + private void SessionPanel_MouseLeave(object sender, System.EventArgs e) + { + this.BackColor = System.Drawing.Color.DarkGray; + this.labelName.ForeColor = System.Drawing.Color.White; + this.labelTimestamp.ForeColor = System.Drawing.Color.White; + } + + private void SessionPanel_Click(object sender, System.EventArgs e) + { + if(IsNew) + MainClient.StartNewClient(name, Session); + else + MainClient.StartOldClient(name, Session); + } + + public System.Windows.Forms.Label labelName; + public Label labelTimestamp; + } +} \ No newline at end of file diff --git a/ErgometerIPR/ErgometerIPR.sln b/ErgometerIPR/ErgometerIPR.sln new file mode 100644 index 0000000..a8b9883 --- /dev/null +++ b/ErgometerIPR/ErgometerIPR.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ErgometerIPR", "ErgometerIPR\ErgometerIPR.csproj", "{2E76E1E6-CBA7-46EA-858A-223B13F193A8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2E76E1E6-CBA7-46EA-858A-223B13F193A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E76E1E6-CBA7-46EA-858A-223B13F193A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E76E1E6-CBA7-46EA-858A-223B13F193A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E76E1E6-CBA7-46EA-858A-223B13F193A8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ErgometerIPR/ErgometerLibrary/AESEncrypt.cs b/ErgometerIPR/ErgometerLibrary/AESEncrypt.cs new file mode 100644 index 0000000..e17ba0d --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/AESEncrypt.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace ErgometerLibrary +{ + static class AESEncrypt + { + // Change these keys + private static byte[] Key = { 47, 20, 192, 222, 214, 221, 193, 151, 182, 182, 20, 246, 80, 235, 182, 216, 116, 141, 188, 191, 13, 159, 1, 137, 151, 150, 29, 171, 240, 21, 251, 252 }; + private static byte[] Vector = { 147, 16, 78, 223, 97, 189, 43, 197, 244, 102, 242, 123, 184, 101, 75, 203 }; + + + private static ICryptoTransform EncryptorTransform, DecryptorTransform; + private static System.Text.UTF8Encoding UTFEncoder; + + static AESEncrypt() + { + //This is our encryption method + RijndaelManaged rm = new RijndaelManaged(); + + //Create an encryptor and a decryptor using our encryption method, key, and vector. + EncryptorTransform = rm.CreateEncryptor(Key, Vector); + DecryptorTransform = rm.CreateDecryptor(Key, Vector); + + //Used to translate bytes to text and vice versa + UTFEncoder = new System.Text.UTF8Encoding(); + } + + /// -------------- Two Utility Methods (not used but may be useful) ----------- + /// Generates an encryption key. + static public byte[] GenerateEncryptionKey() + { + //Generate a Key. + RijndaelManaged rm = new RijndaelManaged(); + rm.GenerateKey(); + return rm.Key; + } + + /// Generates a unique encryption vector + static public byte[] GenerateEncryptionVector() + { + //Generate a Vector + RijndaelManaged rm = new RijndaelManaged(); + rm.GenerateIV(); + return rm.IV; + } + + + /// ----------- The commonly used methods ------------------------------ + /// Encrypt some text and return a string suitable for passing in a URL. + public static string EncryptToString(string TextValue) + { + return ByteArrToString(Encrypt(TextValue)); + } + + /// Encrypt some text and return an encrypted byte array. + public static byte[] Encrypt(string TextValue) + { + //Translates our text value into a byte array. + Byte[] bytes = UTFEncoder.GetBytes(TextValue); + + //Used to stream the data in and out of the CryptoStream. + MemoryStream memoryStream = new MemoryStream(); + + /* + * We will have to write the unencrypted bytes to the stream, + * then read the encrypted result back from the stream. + */ + #region Write the decrypted value to the encryption stream + CryptoStream cs = new CryptoStream(memoryStream, EncryptorTransform, CryptoStreamMode.Write); + cs.Write(bytes, 0, bytes.Length); + cs.FlushFinalBlock(); + #endregion + + #region Read encrypted value back out of the stream + memoryStream.Position = 0; + byte[] encrypted = new byte[memoryStream.Length]; + memoryStream.Read(encrypted, 0, encrypted.Length); + #endregion + + //Clean up. + cs.Close(); + memoryStream.Close(); + + return encrypted; + } + + /// The other side: Decryption methods + public static string DecryptString(string EncryptedString) + { + return Decrypt(StrToByteArray(EncryptedString)); + } + + /// Decryption when working with byte arrays. + public static string Decrypt(byte[] EncryptedValue) + { + #region Write the encrypted value to the decryption stream + MemoryStream encryptedStream = new MemoryStream(); + CryptoStream decryptStream = new CryptoStream(encryptedStream, DecryptorTransform, CryptoStreamMode.Write); + decryptStream.Write(EncryptedValue, 0, EncryptedValue.Length); + decryptStream.FlushFinalBlock(); + #endregion + + #region Read the decrypted value from the stream. + encryptedStream.Position = 0; + Byte[] decryptedBytes = new Byte[encryptedStream.Length]; + encryptedStream.Read(decryptedBytes, 0, decryptedBytes.Length); + encryptedStream.Close(); + #endregion + return UTFEncoder.GetString(decryptedBytes); + } + + /// Convert a string to a byte array. NOTE: Normally we'd create a Byte Array from a string using an ASCII encoding (like so). + // System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); + // return encoding.GetBytes(str); + // However, this results in character values that cannot be passed in a URL. So, instead, I just + // lay out all of the byte values in a long string of numbers (three per - must pad numbers less than 100). + public static byte[] StrToByteArray(string str) + { + if (str.Length == 0) + throw new Exception("Invalid string value in StrToByteArray"); + + byte val; + byte[] byteArr = new byte[str.Length / 3]; + int i = 0; + int j = 0; + do + { + val = byte.Parse(str.Substring(i, 3)); + byteArr[j++] = val; + i += 3; + } + while (i < str.Length); + return byteArr; + } + + // Same comment as above. Normally the conversion would use an ASCII encoding in the other direction: + // System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + // return enc.GetString(byteArr); + public static string ByteArrToString(byte[] byteArr) + { + byte val; + string tempStr = ""; + for (int i = 0; i <= byteArr.GetUpperBound(0); i++) + { + val = byteArr[i]; + if (val < (byte)10) + tempStr += "00" + val.ToString(); + else if (val < (byte)100) + tempStr += "0" + val.ToString(); + else + tempStr += val.ToString(); + } + return tempStr; + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/Chat/ChatItem.cs b/ErgometerIPR/ErgometerLibrary/Chat/ChatItem.cs new file mode 100644 index 0000000..55da46f --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/Chat/ChatItem.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ErgometerLibrary.Chat +{ + public class ChatItem : Panel + { + private Label messageLabel, timeLabel; + + public ChatItem(ChatMessage chat) : base() + { + this.messageLabel = new Label(); + this.timeLabel = new Label(); + + this.AutoSize = true; + this.setAppearance(chat.IsDoctor); + this.Controls.Add(this.messageLabel); + this.Controls.Add(this.timeLabel); + this.MinimumSize = new System.Drawing.Size(150, 60); + this.Name = "messageContainer"; + this.Padding = new System.Windows.Forms.Padding(6); + + // + // Message Label + // + this.messageLabel.AutoSize = true; + this.messageLabel.Dock = System.Windows.Forms.DockStyle.Fill; + this.messageLabel.Font = new System.Drawing.Font("Segoe UI Semibold", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.messageLabel.Location = new System.Drawing.Point(6, 6); + this.messageLabel.MaximumSize = new System.Drawing.Size(250, 0); + this.messageLabel.Size = new System.Drawing.Size(121, 20); + this.messageLabel.Text = chat.Message.Replace("\n", ""); + // + // Time Label + // + this.timeLabel.AutoSize = true; + this.timeLabel.Dock = System.Windows.Forms.DockStyle.Bottom; + this.timeLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.timeLabel.Location = new System.Drawing.Point(6, 26); + this.timeLabel.Margin = new System.Windows.Forms.Padding(6); + this.timeLabel.Size = new System.Drawing.Size(32, 13); + this.timeLabel.Text = Helper.MillisecondsToTime(chat.TimeStamp); + } + + private void setAppearance(bool isDoctor) + { + if (isDoctor) + { + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); + this.Dock = DockStyle.Right; + } + else + { + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240))))); + this.Dock = DockStyle.Left; + } + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/ChatMessage.cs b/ErgometerIPR/ErgometerLibrary/ChatMessage.cs new file mode 100644 index 0000000..6605674 --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/ChatMessage.cs @@ -0,0 +1,23 @@ +namespace ErgometerLibrary +{ + public class ChatMessage + { + public string Message { get; } + public string Name { get; } + public double TimeStamp { get; set;} + public bool IsDoctor { get; set; } + + public ChatMessage(string name, string message, bool isDoctor) + { + Name = name; + Message = message; + TimeStamp = Helper.Now; + IsDoctor = isDoctor; + } + + public override string ToString() + { + return $"[{Name}] <{TimeStamp}> - {Message}"; + } + } +} \ No newline at end of file diff --git a/ErgometerIPR/ErgometerLibrary/ComPort.cs b/ErgometerIPR/ErgometerLibrary/ComPort.cs new file mode 100644 index 0000000..126fc39 --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/ComPort.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ErgometerLibrary +{ + public class ComPort + { + private SerialPort comPort; + + public ComPort() + { + comPort = null; + } + + public Boolean Connect(string port) + { + comPort = new SerialPort(); + comPort.PortName = port; + comPort.DataBits = 8; + comPort.Parity = Parity.None; + comPort.StopBits = StopBits.One; + comPort.BaudRate = 9600; + comPort.ReadTimeout = 1500; + try { + comPort.Open(); + } + catch(Exception e) + { + return false; + } + + return comPort.IsOpen; + } + + public Boolean Disconnect() + { + comPort.Close(); + return !comPort.IsOpen; + } + + public Boolean IsOpen() + { + if (comPort != null) + return comPort.IsOpen; + else + return false; + } + + public void Write(string input) + { + if (IsOpen()) + { + comPort.WriteLine(input); + } + } + + public string Read() + { + if (IsOpen()) + { + try { + return comPort.ReadLine(); + } + catch(TimeoutException e) + { + return "err"; + } + } + + return ""; + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/ErgometerLibrary.csproj b/ErgometerIPR/ErgometerLibrary/ErgometerLibrary.csproj new file mode 100644 index 0000000..b0e2aeb --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/ErgometerLibrary.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {CC20FF4E-8751-42A1-A32B-0E5B22452CAC} + Library + Properties + ErgometerLibrary + ErgometerLibrary + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerLibrary/Helper.cs b/ErgometerIPR/ErgometerLibrary/Helper.cs new file mode 100644 index 0000000..51c7a9e --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/Helper.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ErgometerLibrary +{ + public class Helper + { + public static double Now { get { return (DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; } } + + public static string MillisecondsToTime(double millis) + { + DateTime time = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + string timestr = time.AddMilliseconds(millis) + ""; + return timestr; + } + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/Meting.cs b/ErgometerIPR/ErgometerLibrary/Meting.cs new file mode 100644 index 0000000..0f2fba6 --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/Meting.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ErgometerLibrary +{ + public class Meting + { + public int HeartBeat { get; set; } + public int RPM { get; set; } + public double Speed { get; set; } + public double Distance { get; set; } + public int Power { get; set; } + public int Energy { get; set; } + public int Seconds { get; set; } + public int ActualPower { get; set; } + public double TimeStamp { get; } + + public Meting(int heartbeat, int rpm, double speed, double distance, int power, int energy, int seconds, int actualpower, double timestamp) + { + HeartBeat = heartbeat; + RPM = rpm; + Speed = speed; + Distance = distance; + Power = power; + Energy = energy; + Seconds = seconds; + ActualPower = actualpower; + TimeStamp = timestamp; + } + + public override string ToString() + { + string temp = ""; + temp += "Heartbeat: " + HeartBeat + "\n"; + temp += "RPM: " + RPM + "\n"; + temp += "Speed: " + Speed + "\n"; + temp += "Distance: " + Distance + "\n"; + temp += "Power: " + Power + "\n"; + temp += "Energy: " + Energy + "\n"; + temp += "Seconds: " + Seconds + "\n"; + temp += "ActualPower: " + ActualPower + "\n"; + return temp; + } + + public string ToCommand() + { + string temp = ""; + temp += HeartBeat + "»"; + temp += RPM + "»"; + temp += Speed + "»"; + temp += Distance + "»"; + temp += Power + "»"; + temp += Energy + "»"; + temp += Seconds + "»"; + temp += ActualPower + "»"; + temp += TimeStamp; + return temp; + } + + public static Meting Parse(string input) + { + return Parse(input, '\t'); + } + + public static Meting Parse(string input, char delimiter) + { + string[] status = input.Split(delimiter); + if (status.Length != 8 && status.Length != 9) + { + throw new FormatException("Error in Meting: Arguments do not match"); + } + int heartbeat = int.Parse(status[0]); + int rpm = int.Parse(status[1]); + double speed = double.Parse(status[2]) / 10; + double distance = double.Parse(status[3]) / 10; + int power = int.Parse(status[4]); + int energy = int.Parse(status[5]); + int actualpower = int.Parse(status[7]); + + double timestamp = 0; + if (status.Length == 9) + timestamp = double.Parse(status[8]); + else + timestamp = Helper.Now; + + string[] temp = status[6].Split(':'); + int seconds = 0; + if (temp.Length == 2) + { + seconds = (int.Parse(temp[0]) * 60) + (int.Parse(temp[1])); + } + else + { + seconds = int.Parse(status[6]); + } + + return new Meting(heartbeat, rpm, speed, distance, power, energy, seconds, actualpower,timestamp); + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/NetCommand.cs b/ErgometerIPR/ErgometerLibrary/NetCommand.cs new file mode 100644 index 0000000..fa1a753 --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/NetCommand.cs @@ -0,0 +1,424 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Win32; + +namespace ErgometerLibrary +{ + public class NetCommand + { + public enum CommandType { LOGIN, DATA, CHAT, LOGOUT, SESSION, VALUESET, USER, RESPONSE, REQUEST, LENGTH, SESSIONDATA, ERROR, BROADCAST } + public enum RequestType { USERS, ALLSESSIONS, OLDDATA, SESSIONDATA, CHAT } + public enum ResponseType { LOGINOK, LOGINWRONG, ERROR, NOTLOGGEDIN } + public enum ValueType { TIME, POWER, ENERGY, DISTANCE } + public enum LengthType { USERS, SESSIONS, SESSIONDATA, DATA } + + public double Timestamp { get; set; } + public int Session { get; set; } + public CommandType Type { get; set; } + public ResponseType Response { get; set; } + public ValueType Value { get; set; } + public RequestType Request { get; set; } + public LengthType Length { get; set; } + public int SetValue { get; set; } + public string DisplayName { get; set; } + public bool IsDoctor { get; set; } + public string Password { get; set; } + public string ChatMessage { get; set; } + public Meting Meting { get; set; } + public int LengthValue { get; set; } + + //SESSION + public NetCommand(int session) + { + Type = CommandType.SESSION; + Session = session; + Timestamp = Helper.Now; + } + + //SESSIONDATA + public NetCommand(string name, double timestamp, int session) + { + Type = CommandType.SESSIONDATA; + Session = session; + Timestamp = timestamp; + DisplayName = name; + } + + //RESPONSE + public NetCommand(ResponseType response, int session) + { + Type = CommandType.RESPONSE; + Session = session; + Timestamp = Helper.Now; + Response = response; + } + + //Length + public NetCommand(LengthType lengthtype, int length, int session) + { + Type = CommandType.LENGTH; + Length = lengthtype; + Session = session; + Timestamp = Helper.Now; + LengthValue = length; + } + + //REQUEST + public NetCommand(RequestType request, int session) + { + Type = CommandType.REQUEST; + Session = session; + Timestamp = Helper.Now; + Request = request; + } + + //STANDARD + public NetCommand(CommandType commandtype, int session) + { + Type = commandtype; + Session = session; + Timestamp = Helper.Now; + } + + //METING + public NetCommand(Meting m, int session) + { + Type = CommandType.DATA; + Session = session; + Timestamp = Helper.Now; + + Meting = m; + } + + //CHAT + public NetCommand(string chat, bool isDoctor, int session) + { + Type = CommandType.CHAT; + Session = session; + IsDoctor = isDoctor; + Timestamp = Helper.Now; + + ChatMessage = chat.Replace("\n", ""); + } + + //BROADCAST + public NetCommand(string broadcast, int session) + { + Type = CommandType.BROADCAST; + Session = session; + Timestamp = Helper.Now; + + ChatMessage = broadcast.Replace("\n", ""); + } + + //SETVALUE + public NetCommand(ValueType value, int val, int session) + { + Type = CommandType.VALUESET; + Session = session; + Value = value; + SetValue = val; + } + + //USER + public NetCommand(string username, string password, int session) + { + Type = CommandType.USER; + Session = session; + DisplayName = username; + Password = password; + } + + //LOGIN + public NetCommand(string name, bool doctor, string password, int session) + { + Type = CommandType.LOGIN; + Session = session; + Timestamp = Helper.Now; + + DisplayName = name; + IsDoctor = doctor; + Password = password; + } + + public static NetCommand Parse(string command) + { + string[] com = command.Split('»'); + + int comType = 0; + try + { + comType = int.Parse(com[0]); + } + catch(Exception e) + { + return new NetCommand(CommandType.ERROR, 0); + } + + int session = 0; + if (com[1].StartsWith("ses")) + session = int.Parse(com[1].Substring(3)); + else + throw new FormatException("Error in NetCommand: " + com[1] + " is not a valid session."); + + string[] args = new string[com.Length - 2]; + for (int i = 2; i < com.Length; i++) + { + args[i - 2] = com[i]; + } + + switch (comType) + { + case 1: + return ParseLoginRequest(session, args); + case 2: + return ParseData(session, args); + case 3: + return ParseChatMessage(session, args); + case 4: + return ParseLogoutRequest(session, args); + case 5: + return ParseSession(session); + case 6: + return ParseResponse(session, args); + case 7: + return ParseValue(session, args); + case 8: + return ParseUser(session, args); + case 9: + return ParseRequest(session, args); + case 10: + return ParseLength(session, args); + case 11: + return ParseSessionData(session, args); + case 12: + return ParseBroadcast(session, args); + default: + throw new FormatException("Error in NetCommand: " + comType + " is not a valid command type."); + } + } + + private static NetCommand ParseBroadcast(int session, string[] args) + { + if (args.Length != 1) + throw new MissingFieldException("Error in NetCommand: Broadcast Message is missing arguments"); + + NetCommand temp = new NetCommand(args[0], session); + + return temp; + } + + private static NetCommand ParseSessionData(int session, string[] args) + { + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: Session Data is missing arguments"); + + NetCommand temp = new NetCommand(args[0], double.Parse(args[1]), session); + + return temp; + } + + private static NetCommand ParseLength(int session, string[] args) + { + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: Length is missing arguments"); + + switch (args[0]) + { + case "users": + return new NetCommand(LengthType.USERS, int.Parse(args[1]), session); + case "sessiondata": + return new NetCommand(LengthType.SESSIONDATA, int.Parse(args[1]), session); + case "sessions": + return new NetCommand(LengthType.SESSIONS, int.Parse(args[1]), session); + case "data": + return new NetCommand(LengthType.DATA, int.Parse(args[1]), session); + default: + throw new FormatException("Error in NetCommand: Length type not recognised"); + } + } + + private static NetCommand ParseRequest(int session, string[] args) + { + if (args.Length != 1) + throw new MissingFieldException("Error in NetCommand: Request is missing arguments"); + + switch (args[0]) + { + case "users": + return new NetCommand(RequestType.USERS, session); + case "allsessions": + return new NetCommand(RequestType.ALLSESSIONS, session); + case "olddata": + return new NetCommand(RequestType.OLDDATA, session); + case "sessiondata": + return new NetCommand(RequestType.SESSIONDATA, session); + case "chat": + return new NetCommand(RequestType.CHAT, session); + default: + throw new FormatException("Error in NetCommand: Request type not recognised"); + } + } + + private static NetCommand ParseUser(int session, string[] args) + { + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: User is missing arguments"); + + NetCommand temp = new NetCommand(args[0], Helper.Base64Decode(args[1]), session); + + return temp; + } + + private static NetCommand ParseValue(int session, string[] args) + { + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: SetValue is missing arguments"); + + switch (args[0]) + { + case "time": + return new NetCommand(ValueType.TIME, int.Parse(args[1]), session); + case "power": + return new NetCommand(ValueType.POWER, int.Parse(args[1]), session); + case "energy": + return new NetCommand(ValueType.ENERGY, int.Parse(args[1]), session); + case "distance": + return new NetCommand(ValueType.DISTANCE, int.Parse(args[1]), session); + default: + throw new FormatException("Error in NetCommand: SetValue type not recognised"); + } + } + + private static NetCommand ParseResponse(int session, string[] args) + { + if (args.Length != 1) + throw new MissingFieldException("Error in NetCommand: Response is missing arguments"); + + switch (args[0]) + { + case "loginok": + return new NetCommand(ResponseType.LOGINOK, session); + case "loginwrong": + return new NetCommand(ResponseType.LOGINWRONG, session); + case "notloggedin": + return new NetCommand(ResponseType.NOTLOGGEDIN, session); + case "error": + return new NetCommand(ResponseType.ERROR, session); + default: + throw new FormatException("Error in NetCommand: Response type not recognised"); + } + } + + private static NetCommand ParseSession(int session) + { + NetCommand temp = new NetCommand(CommandType.SESSION, session); + return temp; + } + + private static NetCommand ParseLogoutRequest(int session, string[] args) + { + if (args.Length != 1) + throw new MissingFieldException("Error in NetCommand: Logout Request is missing arguments"); + + NetCommand temp = new NetCommand(CommandType.LOGOUT, session); + if (args[0] != "logout") + throw new FormatException("Error in NetCommand: " + args[0] + " is not a valid logout request"); + + return temp; + } + + private static NetCommand ParseChatMessage(int session, string[] args) + { + if (args.Length != 2) + throw new MissingFieldException("Error in NetCommand: Chat Message is missing arguments"); + + NetCommand temp = new NetCommand(CommandType.CHAT, session); + temp.ChatMessage = args[0]; + temp.IsDoctor = bool.Parse(args[1]); + + return temp; + } + + private static NetCommand ParseData(int session, string[] args) + { + if (args.Length != 9) + throw new MissingFieldException("Error in NetCommand: Data is missing arguments"); + + NetCommand temp = new NetCommand(CommandType.DATA, session); + temp.Meting = Meting.Parse(string.Join("\t", args)); + + return temp; + } + + private static NetCommand ParseLoginRequest(int session, string[] args) + { + bool doctor = bool.Parse(args[2]); + if (args.Length != 3) + throw new MissingFieldException("Error in NetCommand: Doctor login is missing arguments"); + + NetCommand temp = new NetCommand(CommandType.LOGIN, session); + temp.IsDoctor = doctor; + temp.DisplayName = args[0]; + temp.Password = Helper.Base64Decode(args[1]); + + return temp; + } + + public override string ToString() + { + string command = ""; + + switch (Type) + { + case CommandType.LOGIN: + command += "1»ses" + Session + "»" + DisplayName + "»" + Helper.Base64Encode(Password) + "»" + IsDoctor; + break; + case CommandType.DATA: + command += "2»ses" + Session + "»" + Meting.ToCommand(); + break; + case CommandType.CHAT: + command += "3»ses" + Session + "»" + ChatMessage + "»" + IsDoctor; + break; + case CommandType.LOGOUT: + command += "4»ses" + Session + "»logout"; + break; + case CommandType.SESSION: + command += "5»ses" + Session; + break; + case CommandType.RESPONSE: + command += "6»ses" + Session + "»" + Response.ToString().ToLower(); + break; + case CommandType.VALUESET: + command += "7»ses" + Session + "»" + Value.ToString().ToLower() + "»" + SetValue; + break; + case CommandType.USER: + command += "8»ses" + Session + "»" + DisplayName + "»" + Helper.Base64Encode(Password); + break; + case CommandType.REQUEST: + command += "9»ses" + Session + "»" + Request.ToString().ToLower(); + break; + case CommandType.LENGTH: + command += "10»ses" + Session + "»" + Length.ToString().ToLower() + "»" + LengthValue; + break; + case CommandType.SESSIONDATA: + command += "11»ses" + Session + "»" + DisplayName + "»" + Timestamp; + break; + case CommandType.BROADCAST: + command += "12»ses" + Session + "»" + ChatMessage; + break; + case CommandType.ERROR: + command += "ERROR IN NETCOMMAND"; + break; + + default: + throw new FormatException("Error in NetCommand: Cannot find type of command"); + } + + return command; + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/NetHelper.cs b/ErgometerIPR/ErgometerLibrary/NetHelper.cs new file mode 100644 index 0000000..d344b6b --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/NetHelper.cs @@ -0,0 +1,135 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Net.Sockets; +using System.Text; + +namespace ErgometerLibrary +{ + public class NetHelper + { + public static bool SendNetCommand(TcpClient client, NetCommand command) + { + /* + byte[] b = Encoding.Unicode.GetBytes(command.ToString()); + client.GetStream().Write(b, 0, b.Length); + client.GetStream().Flush(); + */ + return SendString(client, command.ToString()); + } + + public static bool SendString(TcpClient client, string command) + { + /* + byte[] b = Encoding.Unicode.GetBytes(command); + client.GetStream().Write(b, 0, b.Length); + client.GetStream().Flush(); + */ + + if (client != null && client.Connected) + { + try + { + StreamWriter wr = new StreamWriter(client.GetStream(), Encoding.Unicode); + wr.WriteLine(AESEncrypt.EncryptToString(command)); + wr.Flush(); + return true; + } + catch (Exception e) + { + return false; + } + } + else + return false; + } + + public static NetCommand ReadNetCommand(TcpClient client) + { + /* + byte[] bytesFrom = new byte[(int) client.ReceiveBufferSize]; + client.GetStream().Read(bytesFrom, 0, (int)client.ReceiveBufferSize); + string response = Encoding.Unicode.GetString(bytesFrom); + NetCommand net = NetCommand.Parse(response); + return net; + */ + + string str; + NetCommand net; + str = ReadString(client); + + if (str != "") + { + try + { + str = AESEncrypt.DecryptString(str); + } + catch (Exception e) + { + str = ""; + net = new NetCommand(NetCommand.CommandType.ERROR, 0); + } + try { + net = NetCommand.Parse(str); + } + catch (Exception e) + { + net = new NetCommand(NetCommand.CommandType.ERROR, 0); + } + } + else + net = new NetCommand(NetCommand.CommandType.ERROR, 0); + return net; + } + + public static string ReadString(TcpClient client) + { + /* + byte[] bytesFrom = new byte[(int)client.ReceiveBufferSize]; + client.GetStream().Read(bytesFrom, 0, (int)client.ReceiveBufferSize); + string response = Encoding.Unicode.GetString(bytesFrom); + return response; + */ + if (client != null && client.Connected) + { + try { + StreamReader rd = new StreamReader(client.GetStream(), Encoding.Unicode); + string str = rd.ReadLine(); + return str; + } + catch(Exception e) + { + return ""; + } + } + else + return ""; + } + + public static IPAddress GetIP(string ipstring) + { + IPAddress ip; + + bool ipIsOk = IPAddress.TryParse(ipstring, out ip); + if (!ipIsOk) { return null; } + + return ip; + } + + public static IPAddress GetIP() + { + IPHostEntry host; + string localIP = "?"; + host = Dns.GetHostEntry(Dns.GetHostName()); + foreach (IPAddress ip in host.AddressList) + { + if (ip.AddressFamily == AddressFamily.InterNetwork) + { + localIP = ip.ToString(); + } + } + return GetIP(localIP); + } + } +} diff --git a/ErgometerIPR/ErgometerLibrary/Properties/AssemblyInfo.cs b/ErgometerIPR/ErgometerLibrary/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f721bc3 --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("ErgometerLibrary")] +[assembly: AssemblyDescription("Library with the most common methods and classes for the Ergometer")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Projectgroep A5")] +[assembly: AssemblyProduct("ErgometerLibrary")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cc20ff4e-8751-42a1-a32b-0e5b22452cac")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.0.3.7")] diff --git a/ErgometerIPR/ErgometerLibrary/packages.config b/ErgometerIPR/ErgometerLibrary/packages.config new file mode 100644 index 0000000..64b5d8e --- /dev/null +++ b/ErgometerIPR/ErgometerLibrary/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerServer/App.config b/ErgometerIPR/ErgometerServer/App.config new file mode 100644 index 0000000..88fa402 --- /dev/null +++ b/ErgometerIPR/ErgometerServer/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerServer/ClientThread.cs b/ErgometerIPR/ErgometerServer/ClientThread.cs new file mode 100644 index 0000000..3194a9b --- /dev/null +++ b/ErgometerIPR/ErgometerServer/ClientThread.cs @@ -0,0 +1,137 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ErgometerServer +{ + class ClientThread + { + TcpClient client; + Server server; + + public string name; + public int session { get; } + + bool running; + bool loggedin; + + List metingen; + List chat; + + public ClientThread(TcpClient client, Server server) + { + this.client = client; + this.server = server; + this.name = "Unknown"; + this.session = 0; + this.running = false; + this.loggedin = false; + + metingen = new List(); + chat = new List(); + session = FileHandler.GenerateSession(); + Console.WriteLine("Generated new session: " + session); + } + + public void run() + { + running = true; + + NetHelper.SendNetCommand(client, new NetCommand(session)); + + while (running) + { + NetCommand input = NetHelper.ReadNetCommand(client); + + switch(input.Type) + { + case NetCommand.CommandType.SESSION: + + break; + case NetCommand.CommandType.LOGIN: + if(! server.CheckPassword(input.DisplayName, input.Password)) + { + NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.LOGINWRONG, session)); + loggedin = false; + } + else + { + NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.LOGINOK, session)); + loggedin = true; + + if (input.IsDoctor) + { + server.ChangeClientToDoctor(client, this); + Console.WriteLine("Doctor connected"); + running = false; + } + else + { + name = input.DisplayName; + loggedin = true; + FileHandler.CreateSession(session, name); + } + } + break; + case NetCommand.CommandType.DATA: + if (loggedin) + { + metingen.Add(input.Meting); + server.SendToDoctor(input); + } + else + NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.NOTLOGGEDIN, session)); + + break; + case NetCommand.CommandType.CHAT: + if (loggedin) + { + chat.Add(new ChatMessage(name, input.ChatMessage, false)); + server.SendToDoctor(input); + } + else + NetHelper.SendNetCommand(client, new NetCommand(NetCommand.ResponseType.NOTLOGGEDIN, session)); + break; + case NetCommand.CommandType.LOGOUT: + loggedin = false; + running = false; + Console.WriteLine(name + " logged out"); + FileHandler.WriteMetingen(session, metingen); + FileHandler.WriteChat(session, chat); + client.Close(); + break; + case NetCommand.CommandType.ERROR: + Console.WriteLine("An error occured, assuming client disconnected"); + loggedin = false; + running = false; + Console.WriteLine(name + " logged out due to an error"); + FileHandler.WriteMetingen(session, metingen); + FileHandler.WriteChat(session, chat); + client.Close(); + break; + default: + if(loggedin) + throw new FormatException("Unknown command"); + break; + } + } + + server.RemoveActiveSession(this); + } + + public void SendToClient(NetCommand command) + { + NetHelper.SendNetCommand(client, command); + if (command.Type == NetCommand.CommandType.CHAT) + { + chat.Add(new ChatMessage("Doctor", command.ChatMessage, true)); + } + } + } +} diff --git a/ErgometerIPR/ErgometerServer/DoctorThread.cs b/ErgometerIPR/ErgometerServer/DoctorThread.cs new file mode 100644 index 0000000..d4b062e --- /dev/null +++ b/ErgometerIPR/ErgometerServer/DoctorThread.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections; +using System.Net.Sockets; +using System.Runtime.Remoting.Lifetime; +using System.Threading; +using ErgometerLibrary; +using System.Collections.Generic; + +namespace ErgometerServer +{ + class DoctorThread + { + TcpClient client; + Server server; + + bool running; + + public DoctorThread(TcpClient client, Server server) + { + this.client = client; + this.server = server; + + this.running = false; + } + + public void run() + { + running = true; + while (running) + { + NetCommand input = NetHelper.ReadNetCommand(client); + + switch (input.Type) + { + case NetCommand.CommandType.LOGOUT: + running = false; + client.Close(); + Console.WriteLine("Doctor logged out"); + break; + case NetCommand.CommandType.CHAT: + server.SendToClient(input); + break; + case NetCommand.CommandType.BROADCAST: + server.BroadcastToClients(input.ChatMessage); + break; + case NetCommand.CommandType.VALUESET: + server.SendToClient(input); + break; + case NetCommand.CommandType.USER: + server.AddUser(input.DisplayName, input.Password); + break; + case NetCommand.CommandType.REQUEST: + switch (input.Request) + { + case NetCommand.RequestType.USERS: + sendToDoctor(new NetCommand(NetCommand.LengthType.USERS, server.users.Count-1, input.Session)); + foreach (KeyValuePair user in server.users) + { + Thread.Sleep(10); + if(user.Key != "Doctor0tVfW") + sendToDoctor(new NetCommand(user.Key, user.Value, input.Session)); + } + break; + case NetCommand.RequestType.CHAT: + List chat = FileHandler.ReadChat(input.Session); + foreach (ChatMessage msg in chat) + { + Thread.Sleep(10); + sendToDoctor(new NetCommand(msg.Message, msg.IsDoctor, input.Session)); + } + break; + case NetCommand.RequestType.OLDDATA: + List metingen = FileHandler.ReadMetingen(input.Session); + foreach (Meting meting in metingen) + { + Thread.Sleep(10); + sendToDoctor(new NetCommand(meting, input.Session)); + } + break; + case NetCommand.RequestType.ALLSESSIONS: + List> sessions = FileHandler.GetAllSessions(); + sendToDoctor(new NetCommand(NetCommand.LengthType.SESSIONS, sessions.Count, input.Session)); + foreach(Tuple session in sessions) + { + sendToDoctor(new NetCommand(session.Item2, session.Item3, session.Item1)); + + Thread.Sleep(10); + } + break; + case NetCommand.RequestType.SESSIONDATA: + List> currentsessionsdata = server.GetRunningSessionsData(); + sendToDoctor(new NetCommand(NetCommand.LengthType.SESSIONDATA, currentsessionsdata.Count, input.Session)); + foreach (Tuple ses in currentsessionsdata) + { + sendToDoctor(new NetCommand(ses.Item2, Helper.Now, ses.Item1)); + Thread.Sleep(10); + } + break; + default: + throw new FormatException("Unknown Command"); + } + + break; + case NetCommand.CommandType.ERROR: + Console.WriteLine("An error occured, assuming docter disconnected"); + running = false; + Console.WriteLine("Doctor logged out due to an error"); + client.Close(); + break; + default: + throw new FormatException("Unknown Command"); + } + } + } + + public void sendToDoctor(NetCommand command) + { + NetHelper.SendNetCommand(client, command); + } + } +} \ No newline at end of file diff --git a/ErgometerIPR/ErgometerServer/ErgometerServer.csproj b/ErgometerIPR/ErgometerServer/ErgometerServer.csproj new file mode 100644 index 0000000..ebff0f3 --- /dev/null +++ b/ErgometerIPR/ErgometerServer/ErgometerServer.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {398293F9-9DF4-4F7A-AC85-6CF488B08B29} + Exe + Properties + ErgometerServer + ErgometerServer + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\ErgometerLibrary\ErgometerLibrary\ErgometerLibrary\bin\Debug\ErgometerLibrary.dll + + + ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ErgometerIPR/ErgometerServer/FileHandler.cs b/ErgometerIPR/ErgometerServer/FileHandler.cs new file mode 100644 index 0000000..06839e6 --- /dev/null +++ b/ErgometerIPR/ErgometerServer/FileHandler.cs @@ -0,0 +1,204 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ErgometerServer +{ + public class FileHandler + { + public static string DataFolder { get; } = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments), "Ergometer"); + public static string UsersFile { get; } = Path.Combine(DataFolder, "users.ergo"); + + public static void CheckStorage() + { + if (!Directory.Exists(DataFolder)) + { + Directory.CreateDirectory(DataFolder); + } + + if (!File.Exists(UsersFile)) + { + using (Stream stream = File.Open(UsersFile, FileMode.Create)) + { + BinaryWriter writer = new BinaryWriter(stream); + writer.Write(1); + writer.Write("Doctor0tVfW"); + writer.Write(Helper.Base64Encode("password")); + } + } + } + + //SESSION + public static int GenerateSession() + { + string[] existingSessions = Directory.GetDirectories(DataFolder); + + Random rand = new Random(); + int sessionID = rand.Next(0, int.MaxValue); + + + while (existingSessions.Contains(sessionID.ToString())) + { + sessionID = rand.Next(int.MinValue, int.MaxValue); + } + + return sessionID; + } + + public static void CreateSession(int session, string naam) + { + Directory.CreateDirectory(GetSessionFolder(session)); + + using (File.Create(Path.Combine(GetSessionFile(session)))) ; + using (File.Create(Path.Combine(GetSessionMetingen(session)))) ; + using (File.Create(Path.Combine(GetSessionChat(session)))) ; + + File.WriteAllText(GetSessionFile(session), naam + Environment.NewLine + Helper.Now); + Console.WriteLine("Created session at " + Helper.MillisecondsToTime(Helper.Now)); + } + + public static void WriteMetingen(int session, List metingen) + { + if (metingen.Count <= 20 && Directory.Exists(GetSessionFolder(session))) + { + Directory.Delete(GetSessionFolder(session), true); + } + else + { + string json = Newtonsoft.Json.JsonConvert.SerializeObject(metingen.ToArray()); + File.WriteAllText(GetSessionMetingen(session), json); + Console.WriteLine("Writing metingen: " + GetSessionMetingen(session)); + File.WriteAllText(GetSessionFile(session), File.ReadAllText(GetSessionFile(session)) + Environment.NewLine + Helper.Now); + } + + } + + public static List ReadMetingen(int session) + { + string json = File.ReadAllText(GetSessionMetingen(session)); + + List metingen = Newtonsoft.Json.JsonConvert.DeserializeObject>(json); + Console.WriteLine("Reading metingen: " + GetSessionMetingen(session)); + return metingen; + } + + public static List> GetAllSessions() + { + string[] directories = Directory.GetDirectories(DataFolder); + List> sessiondata = new List>(); + + for (int i = 0; i < directories.Length; i++) + { + string directoryname = Path.GetFileName(directories[i]); + + string props = File.ReadAllText(GetSessionFile(int.Parse(directoryname))); + + string[] stringSeparators = new string[] { "\r\n" }; + string[] properties = props.Split(stringSeparators, StringSplitOptions.None); + + int session = int.Parse(directoryname); + + bool active = false; + + foreach(ClientThread t in Server.clients) + { + if (t.session == session) + active = true; + } + + string name = properties[0]; + double date = double.Parse(properties[1]); + + if (!active) + { + Tuple tup = new Tuple(session, name, date); + sessiondata.Add(tup); + } + } + + return sessiondata; + } + + public static void WriteChat(int session, List chat) + { + if (Directory.Exists(GetSessionFolder(session))) + { + /* + string write = ""; + foreach (ChatMessage c in chat) + { + write += c.ToString() + "\n"; + } + + File.WriteAllText(GetSessionChat(session), write); + Console.WriteLine("Writing chat: " + GetSessionChat(session)); + */ + string json = Newtonsoft.Json.JsonConvert.SerializeObject(chat.ToArray()); + File.WriteAllText(GetSessionChat(session), json); + Console.WriteLine("Writing chat: " + GetSessionChat(session)); + } + } + + public static List ReadChat(int session) + { + string json = File.ReadAllText(GetSessionChat(session)); + + List chat = Newtonsoft.Json.JsonConvert.DeserializeObject>(json); + return chat; + } + + private static string GetSessionFolder(int session) + { + return Path.Combine(DataFolder, session.ToString()); + } + private static string GetSessionFile(int session) + { + return Path.Combine(DataFolder, session.ToString(), "session.prop"); + } + private static string GetSessionMetingen(int session) + { + return Path.Combine(DataFolder, session.ToString(), "metingen.ergo"); + } + private static string GetSessionChat(int session) + { + return Path.Combine(DataFolder, session.ToString(), "chat.ergo"); + } + + //USER MANAGEMENT + public static Dictionary LoadUsers() + { + Dictionary users = new Dictionary(); + + using (Stream stream = File.Open(UsersFile, FileMode.Open)) + { + BinaryReader reader = new BinaryReader(stream); + int count = reader.ReadInt32(); + for (int n = 0; n < count; n++) + { + var key = reader.ReadString(); + var value = Helper.Base64Decode(reader.ReadString()); + users.Add(key, value); + } + } + + return users; + } + + public static void SaveUsers(Dictionary users) + { + using (Stream stream = File.Open(UsersFile, FileMode.Open)) + { + BinaryWriter writer = new BinaryWriter(stream); + writer.Write(users.Count); + foreach (var kvp in users) + { + writer.Write(kvp.Key); + writer.Write(Helper.Base64Encode(kvp.Value)); + } + writer.Flush(); + } + } + } +} diff --git a/ErgometerIPR/ErgometerServer/Properties/AssemblyInfo.cs b/ErgometerIPR/ErgometerServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c6e0abe --- /dev/null +++ b/ErgometerIPR/ErgometerServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("ErgometerServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ErgometerServer")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("398293f9-9df4-4f7a-ac85-6cf488b08b29")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ErgometerIPR/ErgometerServer/Server.cs b/ErgometerIPR/ErgometerServer/Server.cs new file mode 100644 index 0000000..22f3bdb --- /dev/null +++ b/ErgometerIPR/ErgometerServer/Server.cs @@ -0,0 +1,167 @@ +using ErgometerLibrary; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace ErgometerServer +{ + class Server + { + static void Main(string[] args) + { + new Server(); + } + + public static List clients = new List(); + private DoctorThread doctor; + public Dictionary users; + + public Server() + { + AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); + + FileHandler.CheckStorage(); + + users = FileHandler.LoadUsers(); + + TcpListener listener = new TcpListener(NetHelper.GetIP("127.0.0.1"), 8888); + //TcpListener listener = new TcpListener(NetHelper.GetIP(GetIp()), 8888); + listener.Start(); + + Console.WriteLine("Server started successfully..."); + + while (true) + { + Console.WriteLine("Waiting for connection with client..."); + + //AcceptTcpClient waits for a connection from the client + TcpClient client = listener.AcceptTcpClient(); + + Console.WriteLine("Client connected"); + + //Start new client + ClientThread cl = new ClientThread(client, this); + clients.Add(cl); + + //Run client on new thread + Thread thread = new Thread(new ThreadStart(cl.run)); + thread.IsBackground = true; + thread.Start(); + } + } + + public void ChangeClientToDoctor(TcpClient client, ClientThread clth) + { + clients.Remove(clth); + doctor = new DoctorThread(client, this); + Thread thread = new Thread(new ThreadStart(doctor.run)); + thread.IsBackground = true; + thread.Start(); + } + + public void SendToDoctor(NetCommand command) + { + if (doctor != null) + { + doctor.sendToDoctor(command); + } + } + + public void BroadcastToClients(string message) + { + foreach (ClientThread clientThread in clients) + { + clientThread.SendToClient(new NetCommand(message, true, clientThread.session)); + } + } + + public void SendToClient(NetCommand command) + { + foreach (ClientThread clientThread in clients) + { + if (clientThread.session == command.Session) + { + clientThread.SendToClient(command); + } + } + } + + public void AddUser(string name, string password) + { + users.Add(name, password); + FileHandler.SaveUsers(users); + } + + public void AddUser(Dictionary users) + { + foreach(KeyValuePair user in users) + { + users.Add(user.Key, user.Value); + } + + FileHandler.SaveUsers(users); + } + + public bool CheckPassword(string name, string password) + { + string pass; + bool isOk = users.TryGetValue(name, out pass); + + if (!isOk) return false; + + return pass == password; + } + + public List GetRunningSessions() + { + List sessions = new List(); + foreach (ClientThread thread in clients) + { + sessions.Add(thread.session); + } + return sessions; + } + + public List> GetRunningSessionsData() + { + List> sessions = new List>(); + foreach (ClientThread thread in clients) + { + sessions.Add(new Tuple(thread.session, thread.name)); + } + return sessions; + } + + internal void RemoveActiveSession(ClientThread clientThread) + { + clients.Remove(clientThread); + } + + private string GeneratePassword(int len = 8) + { + string pass = ""; + + char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray(); + + Random rand = new Random(); + + for (int i=0; i<=len; i++) + { + pass += chars[rand.Next(0, chars.Length - 1)]; + } + + return pass; + } + + private static void OnProcessExit(object sender, EventArgs e) + { + Console.WriteLine("Closing server"); + } + } + +} diff --git a/ErgometerIPR/ErgometerServer/packages.config b/ErgometerIPR/ErgometerServer/packages.config new file mode 100644 index 0000000..64b5d8e --- /dev/null +++ b/ErgometerIPR/ErgometerServer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file