From 2d2af7f8651981725a24c0040c10a8f09b26d92c Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Wed, 8 Jun 2016 15:57:16 +0000 Subject: [PATCH] Adding some Network stuff --- TimeKeeper.sln | 22 +++++- TimeKeeper/Exceptions/DbConnectException.cs | 4 - TimeKeeper/Exceptions/IllegalDataException.cs | 7 ++ TimeKeeper/Misc/UDPListener.cs | 75 +++++++++++++++++++ TimeKeeper/Models/MTray.cs | 58 +++++--------- TimeKeeper/Models/Types/MyMessageArgs.cs | 11 +++ TimeKeeper/Models/Types/WorkMessage.cs | 4 - TimeKeeper/Program.cs | 6 +- TimeKeeper/TimeKeeper.csproj | 3 + TimeKeeper/settings.ini | 3 +- 10 files changed, 141 insertions(+), 52 deletions(-) create mode 100644 TimeKeeper/Exceptions/IllegalDataException.cs create mode 100644 TimeKeeper/Misc/UDPListener.cs create mode 100644 TimeKeeper/Models/Types/MyMessageArgs.cs diff --git a/TimeKeeper.sln b/TimeKeeper.sln index 0c45a0d..fbf9a03 100644 --- a/TimeKeeper.sln +++ b/TimeKeeper.sln @@ -1,24 +1,44 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TimeKeeper", "TimeKeeper\TimeKeeper.csproj", "{25F58397-71CB-4298-979E-BAACE80C61CB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Zeit-V2", "Arduino\Zeit\Zeit-V2\Zeit-V2.vcxproj", "{C5F80730-F44F-4478-BDAE-6634EFC2CA88}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {25F58397-71CB-4298-979E-BAACE80C61CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {25F58397-71CB-4298-979E-BAACE80C61CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Debug|x86.ActiveCfg = Debug|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Debug|x86.Build.0 = Debug|Any CPU {25F58397-71CB-4298-979E-BAACE80C61CB}.Release|Any CPU.ActiveCfg = Release|Any CPU {25F58397-71CB-4298-979E-BAACE80C61CB}.Release|Any CPU.Build.0 = Release|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Release|x86.ActiveCfg = Release|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Release|x86.Build.0 = Release|Any CPU {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|x86.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|x86.Build.0 = Debug|Any CPU {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|x86.ActiveCfg = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|x86.Build.0 = Release|Any CPU + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.ActiveCfg = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Debug|x86.Build.0 = Debug|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|Any CPU.ActiveCfg = Release|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.ActiveCfg = Release|Win32 + {C5F80730-F44F-4478-BDAE-6634EFC2CA88}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TimeKeeper/Exceptions/DbConnectException.cs b/TimeKeeper/Exceptions/DbConnectException.cs index 71545b6..2ba1f73 100644 --- a/TimeKeeper/Exceptions/DbConnectException.cs +++ b/TimeKeeper/Exceptions/DbConnectException.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace TimeKeeper.Exceptions { class DbConnectException : Exception { diff --git a/TimeKeeper/Exceptions/IllegalDataException.cs b/TimeKeeper/Exceptions/IllegalDataException.cs new file mode 100644 index 0000000..2fdf29e --- /dev/null +++ b/TimeKeeper/Exceptions/IllegalDataException.cs @@ -0,0 +1,7 @@ +using System; + +namespace TimeKeeper.Exceptions { + class IllegalDataException : Exception { + public IllegalDataException(string Message, Exception Inner) : base(Message, Inner) { } + } +} diff --git a/TimeKeeper/Misc/UDPListener.cs b/TimeKeeper/Misc/UDPListener.cs new file mode 100644 index 0000000..dc6ab0b --- /dev/null +++ b/TimeKeeper/Misc/UDPListener.cs @@ -0,0 +1,75 @@ +using System; +using System.Text; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using TimeKeeper.Models.Types; + +namespace TimeKeeper { + class UDPListener { + private int m_portToListen = 2003; + private volatile bool listening; + Thread m_ListeningThread; + public event EventHandler NewMessageReceived; + UdpClient listener = null; + private IPAddress lastAddress; + private Int32 tport; + + //constructor + public UDPListener(int port, int targetPort) { + this.tport = targetPort; + this.listening = false; + this.m_portToListen = port; + this.listener = new UdpClient(this.m_portToListen); + } + + public void StartListener() { + if(!this.listening) { + m_ListeningThread = new Thread(ListenForUDPPackages); + m_ListeningThread.IsBackground = true; + this.listening = true; + m_ListeningThread.Start(); + } + } + + public void StopListener() { + this.listening = false; + this.listener.Close(); + } + + public void ListenForUDPPackages() { + + try { + + } catch(SocketException) { + //do nothing + } + + if(this.listener != null) { + IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, m_portToListen); + + try { + while(this.listening) { + Console.WriteLine("Waiting for UDP broadcast to port " + m_portToListen); + byte[] bytes = this.listener.Receive(ref groupEP); + this.lastAddress = groupEP.Address; + string s = Encoding.ASCII.GetString(bytes); + //raise event + NewMessageReceived(this, new MyMessageArgs(s)); + } + } catch(Exception e) { + Console.WriteLine(e.ToString()); + } finally { + this.listener.Close(); + Console.WriteLine("Done listening for UDP broadcast"); + } + } + } + + internal void WriteLine(String text) { + byte[] s = Encoding.ASCII.GetBytes(text); + IPEndPoint endpoint = new IPEndPoint(this.lastAddress, this.tport); + this.listener.SendAsync(s, s.Length, endpoint); + } + } +} diff --git a/TimeKeeper/Models/MTray.cs b/TimeKeeper/Models/MTray.cs index d7d117d..0bab95d 100644 --- a/TimeKeeper/Models/MTray.cs +++ b/TimeKeeper/Models/MTray.cs @@ -1,20 +1,16 @@ using BlubbFish.Utils; 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.Exceptions; using TimeKeeper.Models.Types; namespace TimeKeeper.Models { class Tray : OwnModel { private Boolean isConnectedValue = false; private TimeSpan OffsetTimeValue = new TimeSpan(); - private SerialPort serial; - private Thread serialConnectThread; + private UDPListener network; private Thread setTimeThread; private InIReader settingsfile; private FileLogger sLogger; @@ -23,7 +19,7 @@ namespace TimeKeeper.Models { private Boolean initComplete = false; private Tray() { - this.sLogger = FileLogger.getInstance("serial.log", false); + this.sLogger = FileLogger.getInstance("network.log", false); this.init(); } @@ -50,21 +46,18 @@ namespace TimeKeeper.Models { override protected void init() { this.settingsfile = InIReader.getInstance("settings.ini"); - this.serial = new SerialPort(this.settingsfile.getValue("general", "comport")); - this.serial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); - this.serialConnectThread = new Thread(connectRunner); - this.serialConnectThread.Start(); + this.network = new UDPListener(Int32.Parse(this.settingsfile.getValue("general", "port")), Int32.Parse(this.settingsfile.getValue("general", "arduinoport"))); + this.network.NewMessageReceived += DataReceivedHandler; + this.network.StartListener(); this.setTimeThread = new Thread(timeRunner); this.setTimeThread.Start(); this.DatabaseModel = Database.Instance; } internal void Dispose() { - this.serialConnectThread.Abort(); this.setTimeThread.Abort(); - if(this.serial.IsOpen) { - this.serial.Close(); - } + this.network.NewMessageReceived -= DataReceivedHandler; + this.network.StopListener(); } private void timeRunner() { @@ -78,39 +71,25 @@ namespace TimeKeeper.Models { } } - 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, DateTime.Now); - this.parseSerial(s); + private void DataReceivedHandler(Object sender, MyMessageArgs s) { + sLogger.setLine("<-: " + s.data, DateTime.Now); + this.parseSerial(s.data); } [MethodImpl(MethodImplOptions.Synchronized)] private void DataSendHandler(String v) { sLogger.setLine("->: " + v, DateTime.Now); - this.serial.WriteLine(v); + this.network.WriteLine(v); } private void parseSerial(String s) { if(s == "requestKeep=1") { this.DataSendHandler("keep=1"); - } else if(s == "Init...." || s == "Init loading!") { + } else if(s == "Init...." || + s == "Init loading!" || + s == "Start Network!" || + s == "DHCP Request" || + s == "Ethernet Started! IP: 129.26.160.107.") { //Ignore that Stuff } else if(s == "Init finished!") { this.initComplete = true; @@ -139,6 +118,9 @@ namespace TimeKeeper.Models { time = time.AddSeconds(int.Parse(t[1])).ToLocalTime(); } else if(t[0] == "job") { jobID = int.Parse(t[1]); + if(jobID == -1) { + throw new IllegalDataException("JobID ist -1", null); + } } else if(t[0] == "online") { working = int.Parse(t[1]); } diff --git a/TimeKeeper/Models/Types/MyMessageArgs.cs b/TimeKeeper/Models/Types/MyMessageArgs.cs new file mode 100644 index 0000000..b971cbc --- /dev/null +++ b/TimeKeeper/Models/Types/MyMessageArgs.cs @@ -0,0 +1,11 @@ +using System; + +namespace TimeKeeper.Models.Types { + public class MyMessageArgs : EventArgs { + public string data { get; set; } + + public MyMessageArgs(string newData) { + data = newData; + } + } +} diff --git a/TimeKeeper/Models/Types/WorkMessage.cs b/TimeKeeper/Models/Types/WorkMessage.cs index 4af57ad..2890028 100644 --- a/TimeKeeper/Models/Types/WorkMessage.cs +++ b/TimeKeeper/Models/Types/WorkMessage.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace TimeKeeper.Models.Types { class WorkMessage { diff --git a/TimeKeeper/Program.cs b/TimeKeeper/Program.cs index be7e5de..e25bdf5 100644 --- a/TimeKeeper/Program.cs +++ b/TimeKeeper/Program.cs @@ -1,13 +1,11 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; +using BlubbFish.Utils; namespace TimeKeeper { class Program { static void Main(string[] args) { + FileLogger.setLogDir("logs"); try { Controller.Tray t = new Controller.Tray(); t.execute(); diff --git a/TimeKeeper/TimeKeeper.csproj b/TimeKeeper/TimeKeeper.csproj index e873357..ba84299 100644 --- a/TimeKeeper/TimeKeeper.csproj +++ b/TimeKeeper/TimeKeeper.csproj @@ -62,10 +62,13 @@ + + + diff --git a/TimeKeeper/settings.ini b/TimeKeeper/settings.ini index 7d6880b..a0c817d 100644 --- a/TimeKeeper/settings.ini +++ b/TimeKeeper/settings.ini @@ -1,5 +1,6 @@ [general] -comport=COM4 +port=28654 +arduinoport=25987 [database] engine=Mysql