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();
}
}
}