using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //using Ventuz.OSC; using OSC.NET; //using System.Runtime.InteropServices; namespace TUIO { class TuioServer { const int MAX_PACKET_SIZE = 65535 - 8; OSCTransmitter transmitter = null; String host = "127.0.0.1"; int port = 3333; List cursorList = new List(); List updatedCursorList; public TuioServer() { transmitter = new OSCTransmitter(host, port); } public TuioServer(int port) { this.port = port; transmitter = new OSCTransmitter(host, port); } public TuioServer(String host, int port) { this.host = host; this.port = port; transmitter = new OSCTransmitter(host, port); } public void close() { transmitter.Close(); } public TuioCursor addTuioCursor(float x, float y) { TuioCursor tcur = new TuioCursor(cursorList.Count, cursorList.Count, x, y); cursorList.Add(tcur); updatedCursorList.Add(tcur); return tcur; } public void updateTuioCursor(TuioCursor tcur, float xp, float yp) { tcur.update(new TuioTime(0, 0), xp, yp); if (!updatedCursorList.Contains(tcur)) updatedCursorList.Add(tcur); } public void removeTuioCursor(TuioCursor tcur) { cursorList.Remove(tcur); } public void initFrame() { updatedCursorList = new List(); } public void commitFrame() { sendMessage(updatedCursorList); } public void sendFullMessages() { sendMessage(cursorList); } private void sendMessage(List list) { OSCBundle packet = new OSCBundle(); addAliveMessagesToBundle(packet); OSCMessage currentMessage; TuioCursor cursor; for (int i = 0; i < list.Count; i++) { cursor = cursorList[i]; currentMessage = new OSCMessage("/tuio/2Dcur"); currentMessage.Append("set"); currentMessage.Append((int)cursor.getSessionID()); currentMessage.Append((float)cursor.getX()); currentMessage.Append((float)cursor.getY()); currentMessage.Append((float)cursor.getXSpeed()); currentMessage.Append((float)cursor.getYSpeed()); currentMessage.Append((float)cursor.getMotionAccel()); /*if (Marshal.SizeOf(packet) + Marshal.SizeOf(currentOscElement) >= MAX_PACKET_SIZE) { packet.AddElement(new OscElement("/tuio/2Dcur", new Object[] { "fseq", -1 })); udpwriter.Send(packet); packet = new OscBundle(); addAliveMessagesToBundle(packet); }*/ packet.Append(currentMessage); } currentMessage = new OSCMessage("/tuio/2Dcur"); currentMessage.Append("fseq"); currentMessage.Append(-1); packet.Append(currentMessage); transmitter.Send(packet); } private void addAliveMessagesToBundle(OSCBundle packet) { OSCMessage mssg = new OSCMessage("/tuio/2Dcur"); mssg.Append("alive"); for (int i = 0; i < cursorList.Count; i++) { mssg.Append((Int32)cursorList[i].getSessionID()); } packet.Append(mssg); } public List getTuioCursor() { return cursorList; } public TuioCursor getTuioCursor(long s_id) { for (int i = 0; i < cursorList.Count; i++) { if (cursorList[i].getSessionID() == s_id) return cursorList[i]; } return null; } } }