From 1c8d49f9d9ea2217c30511ee1651d910271eb424 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Mon, 25 Jan 2016 15:06:54 +0000 Subject: [PATCH] Weiter weiter... --- TimeKeeper/Models/MTray.cs | 122 +++++++++++++++++++++++- TimeKeeper/Models/Types/WorkMessages.cs | 21 ++++ TimeKeeper/TimeKeeper.csproj | 1 + TimeKeeper/View/VTray.cs | 1 + TimeKeeper/bin/Release/TimeKeeper.exe | Bin 32256 -> 53248 bytes 5 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 TimeKeeper/Models/Types/WorkMessages.cs diff --git a/TimeKeeper/Models/MTray.cs b/TimeKeeper/Models/MTray.cs index d1fef55..0f6dedb 100644 --- a/TimeKeeper/Models/MTray.cs +++ b/TimeKeeper/Models/MTray.cs @@ -3,16 +3,25 @@ using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; +using System.Threading; using System.Threading.Tasks; +using TimeKeeper.Models.Types; namespace TimeKeeper.Models { class Tray : OwnModel { - private Boolean isConnectedValue; + private Boolean isConnectedValue = false; + private TimeSpan OffsetTimeValue = new TimeSpan(); private SerialPort serial; + private Thread serialConnectThread; + private Thread setTimeThread; private InIReader settingsfile; + private FileLogger sLogger; + private Stack MessagesValue = new Stack(); private Tray() { + this.sLogger = FileLogger.getInstance("serial.log", true); this.init(); } @@ -21,14 +30,117 @@ namespace TimeKeeper.Models { set { this.isConnectedValue = value; this.update(); } } + public TimeSpan OffsetTime { + get { return this.OffsetTimeValue; } + set { this.OffsetTimeValue = value; this.update(); } + } + + public Stack Messages { + get { return this.MessagesValue; } + } + + public void MessagesPush(WorkMessages m) { + this.MessagesValue.Push(m); + this.update(); + } + override protected void init() { this.settingsfile = InIReader.getInstance("settings.ini"); this.serial = new SerialPort(this.settingsfile.getValue("general", "comport")); - try { - this.serial.Open(); - } catch(Exception) { - this.isConnected = false; + this.serial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); + this.serialConnectThread = new Thread(connectRunner); + this.serialConnectThread.Start(); + this.setTimeThread = new Thread(timeRunner); + this.setTimeThread.Start(); + } + + internal void Dispose() { + this.serialConnectThread.Abort(); + this.setTimeThread.Abort(); + if(this.serial.IsOpen) { + this.serial.Close(); } } + + private void timeRunner() { + Thread.Sleep(1000 * 10); + while(true) { + DateTime n = DateTime.UtcNow; + this.DataSendHandler("time=" + ((int)((n - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds)).ToString()); + Thread.Sleep(1000 * 60 * 5); + } + } + + private void connectRunner() { + while(true) { + if(!this.serial.IsOpen) { + try { + this.serial.Open(); + this.serial.DtrEnable = true; + this.isConnected = true; + this.serial.WriteLine(""); + } catch(Exception) { + this.isConnected = false; + } + } + Thread.Sleep(1000 * 60); //Check Every Minute + } + } + + private void DataReceivedHandler(Object sender, SerialDataReceivedEventArgs e) { + SerialPort sp = (SerialPort)sender; + string s = sp.ReadLine().Trim(); + sLogger.setLine("<-: " + s); + this.parseSerial(s); + } + + [MethodImpl(MethodImplOptions.Synchronized)] + private void DataSendHandler(String v) { + sLogger.setLine("->: " + v); + this.serial.WriteLine(v); + } + + private void parseSerial(String s) { + if(s == "requestKeep=1") { + this.DataSendHandler("keep=1"); + } else if(s == "Init...." || s == "Init loading!" || s == "Init finished!") { + //Ignore that Stuff + } else if((s.Length > 4 && s.Substring(0, 4) == "d->:") || (s.Length > 4 && s.Substring(0, 4) == "i<-:")) { + //Ignore that Stuff also.... + } else if(s.Length > 2 && s.Substring(0, 2) == "t=") { + this.setOffset(s.Split('=')[1]); + } else if(s.Length > 4 && s.Substring(0, 4) == "tag=") { + this.parseTag(s); + } else { + throw new NotImplementedException(); + } + } + + private void parseTag(String s) { + string[] parts = s.Split(';'); + long userID = 0; + DateTime time = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + int jobID = 0; + int working = 0; + foreach(String part in parts) { + string[] t = part.Split('='); + if(t[0] == "tag") { + userID = long.Parse(t[1]); + } else if(t[0] == "time") { + time = time.AddSeconds(int.Parse(t[1])).ToLocalTime(); + } else if(t[0] == "job") { + jobID = int.Parse(t[1]); + } else if(t[0] == "online") { + working = int.Parse(t[1]); + } + } + this.MessagesPush(new WorkMessages(userID, time, jobID, working)); + } + + private void setOffset(String v) { + DateTime ctime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + ctime = ctime.AddSeconds(int.Parse(v)).ToLocalTime(); + this.OffsetTime = ctime - DateTime.Now; + } } } diff --git a/TimeKeeper/Models/Types/WorkMessages.cs b/TimeKeeper/Models/Types/WorkMessages.cs new file mode 100644 index 0000000..c529668 --- /dev/null +++ b/TimeKeeper/Models/Types/WorkMessages.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TimeKeeper.Models.Types { + class WorkMessages { + public Int32 jobID; + public DateTime time; + public Int64 userID; + public Int32 working; + + public WorkMessages(Int64 userID, DateTime time, Int32 jobID, Int32 working) { + this.userID = userID; + this.time = time; + this.jobID = jobID; + this.working = working; + } + } +} diff --git a/TimeKeeper/TimeKeeper.csproj b/TimeKeeper/TimeKeeper.csproj index 34c2649..97d3a5e 100644 --- a/TimeKeeper/TimeKeeper.csproj +++ b/TimeKeeper/TimeKeeper.csproj @@ -53,6 +53,7 @@ + diff --git a/TimeKeeper/View/VTray.cs b/TimeKeeper/View/VTray.cs index 5e236d4..233fc55 100644 --- a/TimeKeeper/View/VTray.cs +++ b/TimeKeeper/View/VTray.cs @@ -35,6 +35,7 @@ namespace TimeKeeper.View { override public void Dispose() { this.trayi.Visible = false; + this.Model.Dispose(); Application.ExitThread(); } diff --git a/TimeKeeper/bin/Release/TimeKeeper.exe b/TimeKeeper/bin/Release/TimeKeeper.exe index 8cf13ceffa8e92f26905ae8537963bbc8d18a748..00c5717f9657852142a82d377fd6b59ba9a6febe 100644 GIT binary patch delta 10660 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 delta 3970 zcmZ`+3v?9K8UF6<%-z{#nQS&M5+d0oB-yM91fhb83QAN2fe_*mEh<{50qx?h^@Yh! zz#?Fah7px2h>wa=4(HHqQM5kNAT}y0QmZ|!6y#W?)G8jVwZ8h@JBtTA$2n)d`M>{l z|NER7cSFGaQrx+G%EnJNT!{R&4>cGhT7aok@S(103kY%EE^kcmWdkr38@f$2)+0+mg@)kTr#fe87ItElh}*Ee~yMMHSj`BcSuPxV%c+K@|W1n+6yHc=IN zo)TNYE#6*HQ{SQr;B_8v0~R86z++`VfK0Ic-;M{OP0XD1W*CD-!n@SCVcdx{WU7F0 zB2F+8mE?(Pipljxca+uFHJ8r1dV>R3WLF!BMirGx>R9FqCqi^G z61Kur6BWtxjl~=S(?~efrJ9urMJ*;SQnm6jGRzz9(mvX=EH#n}KT6kAm8eQ&ILhJF zsBaDFO8{@GSy01H%FJkG978zTTB**F_<>S+S+hyhdz;M}qQU#hTv)Gb&IB0PWvR;Y z<(KH1&r%^L8H+7%l~s13wkMP&MNv}CfYc=AGv6o1*OFuGk4vhShWg|%V=*V&Ox75I zE-k2ZDy~((?E|X!delAFqGhsR)ut*zHlNokh91zL8spNPQ zr%NPHHWFMaoQo+$RRSl%OrFXTlwc&dQaSJ#%8^$K1X(ro>Cw!TxPYdvLCVWmtRCqL zs7=oyq^8l7;W7<(g_V7=!qg1%z2SPJG{K_eUL*wvhVp1kA z%rH*6T-|1-QAvY=S$cdD^`yxW-Bg&VVSw{lChQ%=lMieW~gLp?`i3RNgqk;wq{ z&`#8IO-WZR(WH03J^b|h+2Pu5z-FURa{G1Z&Y%1^qiVE^fJNL4wH@uak?pC%YtQYN z%o)XU^0@bv-OxOdj02&qT%2GKScBR{;0A%(b6l_B>|v1C7Ansk;B2W&q9tGlCDv)2 zV*FVa;7Ynl{M@+Bk|+u&Jfh`WwLC*(r^bi1{zl`Vlz3k#d`oK@jRbQ(YkU%rD7RlU zCAL~GnqeF;cLg1+l<6#0uL#w!OG6A#*|}gCv#edjk2L;{u3=PAcJQf~#?%oOC($5P z>gTM5Rw*vFs?1WnOmy&sNE0tJ(#+P39HXwczX`?=lR4roM2XcwRmAe(u3$Ed%a~fi zF;#VGp$u=@s>u$G@6suZR$abqH(Tg05gt8@C(4^NyF$(-y@8<{H_mnc&3!#oT0HK*m#m z>>u_fdk$spKe9h)W`XOCY-BJUY~@rB$$LJ?l0q1k_k56Di6F~UQKy+N*O3m-8x?cV zh(L7|+(~Ff0h-w8ax)6)4w#@D@uN5ZdSF6JWJ@#eh^`t4^s2j9! zmu5S$QAoa%9@A_G;!MLglo~edWD|TJ7b;Ft^_T7tJV* zr)Zq0ak9oXjk7h*C6=I5%hzhWNn?-3$B7dAi4{1g<#I6~<2Xe;9mqfePO^3) z+lQ4**N3Te>cbnB;Owg+igiJ~?6Jh>x*u~zvv`Gv)W`OlILv1LN-VVxuxM3iB;O5n zT8t9?_$TpCfx~EIV^QKaJgADbXR-F&uFsCPtT@{q&zVpu9PZ$d7{N{SF0lxQh(q}? zG6J8d?-?6pRHiyou+jPE0L z9k1J^n*WaOMeTBYwr9TU$B!gY^=&TYd`i&UTy(KlQC#EAEUxtKE&h9Mb;(M@YaY_! zts3HbMdhb?v&$dz3My*6u@&>YJr!kMXy`e)IYWcOb1TpBUa!2%TXe!0@6i+5bJnnv zh4(W_d@aL2@k)0NtH9`e@}Xecw2TWN6>Mc!7vNm?T%CEK2zxSS#d*D z4v}#oV(tt6qsNYu?25U&6)$x6v*sdL%4Lqmd3HQNj~?6h1KyKCBi0$~^x21295MG( z5(vKP)Uw{9WgZ)*tELF#h1+CE+FO#^wGyJt%U| z)SuSKA1>hNPp?6_l5@K6D&FSugate1VGd zuQQbF?d~iyS{CH?u5S@u{FhI9&V~b`C-=#QC+ftb-lm0qs