From a46f7bee9354819713e7befa2b2941cae72f9466 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 8 Oct 2015 22:40:53 +0200 Subject: [PATCH] Added login, connecting and showing data --- .../.vs/ErgometerApplication/v14/.suo | Bin 85504 -> 85504 bytes .../ClientApplicatie.Designer.cs | 14 ++--- .../ErgometerApplication/ClientApplicatie.cs | 31 ++++++++-- .../ErgometerApplication/DataSaving.cs | 46 -------------- .../ErgometerApplication.csproj | 2 - .../ErgometerApplication/MainClient.cs | 58 ++++++++++-------- .../ErgometerApplication/PanelClientData.cs | 29 +++++++-- .../ServerCommunicator.cs | 18 ------ .../bin/Debug/ErgometerLibrary.dll | Bin 17920 -> 18944 bytes 9 files changed, 90 insertions(+), 108 deletions(-) delete mode 100644 ErgometerApplication/ErgometerApplication/DataSaving.cs delete mode 100644 ErgometerApplication/ErgometerApplication/ServerCommunicator.cs diff --git a/ErgometerApplication/.vs/ErgometerApplication/v14/.suo b/ErgometerApplication/.vs/ErgometerApplication/v14/.suo index 43cbfe447ccb200cbf6f8f7b47e5289ed9db8670..448324ad2f31309da02d889f941b7c3169c81ef2 100644 GIT binary patch delta 1901 zcmdUwZ)h839LMiDlk1XR(xy$@Bu%sAdTX<+|CavIwQG`Q>1gK=Tk1qb*wE>l>1H-% z6t|^Ax9SFK^MiJSi1FU|7t4CiSA$kJ5ryK!3Pby1AoxOx$f&}KZTvp%Ws6c@xi=ns z_&v|>&vVcBclX?-GUimqJoYHta(SRyl(JjCuQ!R56i>4b{dcjRoyy^A76f4%uz@nL z6|BO4(y+y_CBOOegR zf_&aKj2oChQ&vl$8RHfs7KUvFZJ^!ot&Sh)(w)U#_CMOKZBf+hqE=?oTrBNUNZB2* z2~j+UUB)w^0k4z?c%@X>PwBXHSN7&s>GJ`d2a*LI>oiUxNhB-CelmlTXZX8r9(-Xq@?}bS(UNs zgF+JDnP-HfLSsqb>lN)AVQQrH=$+dMt1v!L?nnyH3x|algoDB{fK)vf=w)&oy7=kO zw>9lC(ec_*EiR^?ye{)&$RqsX4@zI!xtFn3Vxb?64R|OPoz?nG>6nX^<31LLQF3W~ zpjm%5mSNM6h$3Zu5q5@He7$V(eWkR^+4SRgt%7-de~Ik?FF)?&6qJ-#TrNj?4C!&7sjEO99dn#VIFsIIqU=zcV`cc0y6%p^6Y6#O=@;MmRN(irS%^MrQ|ZVXm8EBUZr|85H`n}f=V*Uo i>g~^IOg-`+%W2S^q!!Vxrw*lx`Abl<;Y*+m&;JE~)K`)K delta 1298 zcmZ`(%}*0i5Z`%jmyd3-U}=#r3zRQKC>Rq$KtT2Yq(R|e@H2pL>wyrs5JMX-5+$+S zF(H~Jn*9fq?tz;j!a+?)AmKpJc=tvKHGxFyOuID==p?_+yqS43^Ly`g!!cVpW{cd0 z`qkkwp-j69AMOIqh(*XT6QUkMrIIAI5ON4fOB`g&gayKH%Xi+gi%5G3ncNz(FA^#V zgM?><1_H-jq<@k2kbYtL>PRb=y(md-sl*b?;kR^~rMbvuvYQA#LM!0{Zprs;*T@QB zG~h8cTLUQX6P=U$XX4d9zdlMLya=b?a zwVMj?xI74^iu5j{;VZ$|fXi(1{RFIbKRQ+HZ&7{Fi{7R^@m<1`y3Y>j1{EsEDrVoI zMJdpaB$>&^P2qrEGPxHE_fuBMk-fjmO5mV*bXCn?8L5VHv;4s%th5zD*ys?tw&9R2 zohoD=X#rU4kzpP5KuK#=R+xJ|r*)y_du8be=_o-bltqWj%*j9ujGH3funx|ry@%U_ zTU#x29ZLh+yEh+Kwu`}UM1;{V8x0~pBm|0pyS3J;#XVU5)rb9O`-}*j@x?H9uiaU# z)`q{{`7m+l__6<5@vLHG*o_C>%Gn{DRdA5HH$JA!5oGR7AJtU;n|iI8(*DuiGp|I~ zHd7bRgR!K~T2nzEn^l%*w^PFTu@hLpx$zJ@!NhnHrZ6!Pf=QfvJmipaDThB4nawJ{ zD_W<-7?b188-N?4)y{X%$s}fS3Pe2e339XFoBb`vI8Bl;dF43$mIhI)@#Ad$t+Q`R z*`dr*ppir97dd7)7`E%pecVkMqR=-V&NmO`W local_data = null; - //private List ReadFile() - //{ - // string path; - // OpenFileDialog file = new OpenFileDialog(); - // file.Filter = "Ergometer files(*.ergo) | *.ergo | All files(*.*) | *.*"; - // if (file.ShowDialog() == DialogResult.OK) - // { - // path = file.FileName; - // List readFile = Newtonsoft.Json.JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(path)); - // return readFile; - // } - // else - // { - // return null; - // } - //} - //private List SaveData(Meting meting, List _data) - //{ - // List local_data = _data; - // local_data.Add(meting); - // return local_data; - //} - //private void WriteFile(List _data) - //{ - // string json = Newtonsoft.Json.JsonConvert.SerializeObject(_data); - // string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "ErgometerSessionData.ergo"); - // System.IO.File.WriteAllText(path, json); - // Console.WriteLine("Writing file: " + path); - //} - - - } -} diff --git a/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj b/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj index 6ff639d..fc4e4bc 100644 --- a/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj +++ b/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj @@ -70,8 +70,6 @@ Component - - Form diff --git a/ErgometerApplication/ErgometerApplication/MainClient.cs b/ErgometerApplication/ErgometerApplication/MainClient.cs index a6e709b..547c67c 100644 --- a/ErgometerApplication/ErgometerApplication/MainClient.cs +++ b/ErgometerApplication/ErgometerApplication/MainClient.cs @@ -17,6 +17,7 @@ namespace ErgometerApplication public static List Metingen { get; } public static int Session; + public static bool Loggedin; public static string HOST = "127.0.0.1"; public static int PORT = 8888; @@ -28,10 +29,37 @@ namespace ErgometerApplication Metingen = new List(); Session = 0; + Loggedin = false; } - public static void Connect(string comport, string name, string password) + public static bool Connect(string comport, string name, string password) { + if (!Doctor.Connected) + { + Doctor.Connect(HOST, PORT); + + NetCommand net = NetHelper.ReadNetCommand(Doctor); + if (net.Type == NetCommand.CommandType.SESSION) + Session = net.Session; + else + throw new Exception("Session not assigned"); + } + + 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; + return false; + } + + Loggedin = true; + } + if (!ComPort.IsOpen()) { if (ComPort.Connect(comport)) @@ -52,25 +80,8 @@ namespace ErgometerApplication else throw new Exception("Comport was unable to connect"); } - else - throw new Exception("Comport is already connected"); - - if(!Doctor.Connected) - { - Doctor.Connect(HOST, PORT); - - NetCommand net = NetHelper.ReadNetCommand(Doctor); - if (net.Type == NetCommand.CommandType.SESSION) - Session = net.Session; - else - throw new Exception("Session not assigned"); - - NetCommand command = new NetCommand(name, false, password, Session); - NetHelper.SendNetCommand(Doctor, command); - } - else - throw new Exception("Client is already connected"); + return true; } public static void Disconnect() @@ -84,19 +95,16 @@ namespace ErgometerApplication else throw new Exception("Comport was unable to disconnect"); } - else - throw new Exception("Comport is already closed"); if (Doctor.Connected) { NetHelper.SendNetCommand(Doctor, new NetCommand(NetCommand.CommandType.LOGOUT, Session)); + Loggedin = false; Doctor.Close(); } - else - throw new Exception("Client is already disconnected"); } - public static void SaveMeting(string meting) + public static Meting SaveMeting(string meting) { Meting m = Meting.Parse(meting); Metingen.Add(m); @@ -104,6 +112,8 @@ namespace ErgometerApplication { NetHelper.SendNetCommand(Doctor, new NetCommand(m, Session)); } + + return m; } } } diff --git a/ErgometerApplication/ErgometerApplication/PanelClientData.cs b/ErgometerApplication/ErgometerApplication/PanelClientData.cs index 9a39e06..375a764 100644 --- a/ErgometerApplication/ErgometerApplication/PanelClientData.cs +++ b/ErgometerApplication/ErgometerApplication/PanelClientData.cs @@ -13,8 +13,14 @@ namespace ErgometerApplication public ProgressBar progressBarMeting; public Label metingName; - public PanelClientData(string name) : base() + private int min; + private int max; + + public PanelClientData(string name, int min, int max) : base() { + this.min = min; + this.max = max; + this.metingName = new System.Windows.Forms.Label(); this.progressBarMeting = new System.Windows.Forms.ProgressBar(); this.labelMetingCurrentValue = new System.Windows.Forms.Label(); @@ -47,7 +53,7 @@ namespace ErgometerApplication this.progressBarMeting.Name = "progressBarMeting"; this.progressBarMeting.Size = new System.Drawing.Size(183, 23); this.progressBarMeting.TabIndex = 1; - this.progressBarMeting.Value = 50; + this.progressBarMeting.Value = 0; // // labelMetingCurrentValue // @@ -58,7 +64,7 @@ namespace ErgometerApplication this.labelMetingCurrentValue.Name = "labelMetingCurrentValue"; this.labelMetingCurrentValue.Size = new System.Drawing.Size(57, 32); this.labelMetingCurrentValue.TabIndex = 2; - this.labelMetingCurrentValue.Text = "255"; + this.labelMetingCurrentValue.Text = "0"; } public void setText(string text) @@ -69,19 +75,30 @@ namespace ErgometerApplication public void updateValue(int value) { this.labelMetingCurrentValue.Text = value.ToString(); - this.progressBarMeting.Value = value; + this.progressBarMeting.Value = ValueToPercentage(value); } public void updateValue(double value) { this.labelMetingCurrentValue.Text = value.ToString(); - this.progressBarMeting.Value = (int)value; + this.progressBarMeting.Value = ValueToPercentage((int)value); } public void updateValue(decimal value) { this.labelMetingCurrentValue.Text = value.ToString(); - this.progressBarMeting.Value = (int)value; + 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/ErgometerApplication/ErgometerApplication/ServerCommunicator.cs b/ErgometerApplication/ErgometerApplication/ServerCommunicator.cs deleted file mode 100644 index 79c49cf..0000000 --- a/ErgometerApplication/ErgometerApplication/ServerCommunicator.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Sockets; -using System.Text; -using System.Threading.Tasks; -//using ErgometerLibrary; - -namespace ErgometerApplication -{ - class ServerCommunicator - { - public TcpClient client { get; set; } - public int sessionId { get; set; } -// public List data { get; set; } - } -} diff --git a/ErgometerApplication/ErgometerApplication/bin/Debug/ErgometerLibrary.dll b/ErgometerApplication/ErgometerApplication/bin/Debug/ErgometerLibrary.dll index 46d1c577ca4e5ba65baae29340e6bdf3c4a66531..2bfff150faaceeb891bad757475e500fc9d7290e 100644 GIT binary patch delta 8210 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