using BBIWARG.Input.InputHandling; using BBIWARG.Recognition.PalmRecognition; using BBIWARG.Recognition.TouchRecognition; using BBIWARG.Utility; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using TUIO; namespace BBIWARG.TUIO { /// /// TuioCommunicator sends generated touch events and palm grid coordinates to tuio clients using a . /// internal class TuioCommunicator { /// /// the tuio server /// private TuioServer server; /// /// dictionary of lists of tuio cursors indexed by touch id /// private Dictionary tcursors; /// /// dictionary of lists of tuio objects indexed by palm id /// private Dictionary> tobjects; /// /// Constructs a TuioCommunicator. /// /// server ip /// server port public TuioCommunicator(string host, int port) { server = new TuioServer(host, port); tcursors = new Dictionary(); tobjects = new Dictionary>(); } /// /// Tries to parse an ip address string. /// /// the ip address string to parse /// out parameter for the ip address in *.*.*.* format if ipIn is valid and null otherwise /// true iff ipIn is a valid ip address public static bool tryParseIPAddress(String ipIn, out String ipOut) { IPAddress ipAddress; bool result = IPAddress.TryParse(ipIn, out ipAddress) && ipAddress.AddressFamily == AddressFamily.InterNetwork; if (result) ipOut = ipAddress.ToString(); else ipOut = null; return result; } /// /// Tries to parse a port string. /// /// the port string to parse /// out parameter for the port if portIn is valid and undefined otherwise /// true iff portIn is a valid port public static bool tryParsePort(String portIn, out Int16 portOut) { return Int16.TryParse(portIn, out portOut); } /// /// Closes the server. /// public void close() { server.close(); } /// /// Handles the event that a new frame is finished processing by updating the cursors and objects and sending them. /// /// event sender /// event arguments public void handleNewFrameData(object sender, NewProcessedFrameEventArgs e) { server.initFrame(); FrameData frameData = e.FrameData; lock (frameData) { if (frameData.ResetFlag) reset(); foreach (TouchEvent te in frameData.TouchEvents) { switch (te.Type) { case TouchEventType.Down: TuioCursor tcur = server.addTuioCursor(te.Touch.RelativePosition.X, te.Touch.RelativePosition.Y); tcursors.Add(te.Touch.TrackID, tcur); break; case TouchEventType.Move: server.updateTuioCursor(tcursors[te.Touch.TrackID], te.Touch.RelativePosition.X, te.Touch.RelativePosition.Y); break; case TouchEventType.Up: server.removeTuioCursor(tcursors[te.Touch.TrackID]); tcursors.Remove(te.Touch.TrackID); break; } } } server.commitFrame(); } /// /// Resets the server by removing all cursors and objects. /// public void reset() { foreach (int id in tcursors.Keys) server.removeTuioCursor(tcursors[id]); tcursors.Clear(); foreach (int id in tobjects.Keys) foreach (TuioObject tobj in tobjects[id]) server.removeTuioObject(tobj); tobjects.Clear(); } } }