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; using bbiwarg.Utility; namespace TUIO { class TuioServer { const int MAX_PACKET_SIZE = 65535 - 8; private OSCTransmitter transmitter = null; private String host = "127.0.0.1"; private int port = 3333; private long sessionID = 0; private TuioTime currentFrameTime; private List cursorList; private List updatedCursorList; private List objectList; private List updatedObjectList; public TuioServer() { init(); } public TuioServer(int port) { this.port = port; init(); } public TuioServer(String host, int port) { this.host = host; this.port = port; init(); } private void init() { TuioTime.initSession(); cursorList = new List(); objectList = new List(); transmitter = new OSCTransmitter(host, port); } public void close() { transmitter.Close(); } public TuioCursor addTuioCursor(float xp, float yp) { TuioCursor tcur = new TuioCursor(sessionID, cursorList.Count, xp, yp); cursorList.Add(tcur); updatedCursorList.Add(tcur); sessionID++; return tcur; } public void updateTuioCursor(TuioCursor tcur, float xp, float yp) { tcur.update(currentFrameTime, xp, yp); if (!updatedCursorList.Contains(tcur)) updatedCursorList.Add(tcur); } public void removeTuioCursor(TuioCursor tcur) { cursorList.Remove(tcur); } public TuioObject addTuioObject(float xp, float yp, float angle) { TuioObject tobj = new TuioObject(sessionID, objectList.Count, xp, yp, angle); objectList.Add(tobj); updatedObjectList.Add(tobj); sessionID++; return tobj; } public void updateTuioObject(TuioObject tobj, float xp, float yp) { tobj.update(currentFrameTime, xp, yp); if (!updatedObjectList.Contains(tobj)) updatedObjectList.Add(tobj); } public void removeTuioObject(TuioObject tobj) { objectList.Remove(tobj); } public void initFrame() { currentFrameTime = TuioTime.getSessionTime(); updatedCursorList = new List(); updatedObjectList = new List(); } public void commitFrame() { sendMessage(updatedCursorList, updatedObjectList); } public void sendFullMessages() { sendMessage(cursorList, objectList); } private void sendMessage(List cursorList, List objectList) { OSCBundle packet = new OSCBundle(); OSCMessage currentMessage; // cursors addAliveCursorMessagesToBundle(packet); TuioCursor tcur; for (int i = 0; i < cursorList.Count; i++) { tcur = cursorList[i]; currentMessage = new OSCMessage("/tuio/2Dcur"); currentMessage.Append("set"); currentMessage.Append((Int32)tcur.getSessionID()); currentMessage.Append(tcur.getX()); currentMessage.Append(tcur.getY()); currentMessage.Append(tcur.getXSpeed()); currentMessage.Append(tcur.getYSpeed()); currentMessage.Append(tcur.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(); addAliveCursorMessagesToBundle(packet); }*/ packet.Append(currentMessage); } currentMessage = new OSCMessage("/tuio/2Dcur"); currentMessage.Append("fseq"); currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle packet.Append(currentMessage); transmitter.Send(packet); // objects packet = new OSCBundle(); addAliveObjectMessagesToBundle(packet); TuioObject tobj; for (int i = 0; i < objectList.Count; i++) { tobj = objectList[i]; currentMessage = new OSCMessage("/tuio/2Dobj"); currentMessage.Append("set"); currentMessage.Append((Int32)tobj.getSessionID()); currentMessage.Append(tobj.getSymbolID()); currentMessage.Append(tobj.getX()); currentMessage.Append(tobj.getY()); currentMessage.Append(tobj.getAngle()); currentMessage.Append(tobj.getXSpeed()); currentMessage.Append(tobj.getYSpeed()); currentMessage.Append(tobj.getRotationSpeed()); currentMessage.Append(tobj.getMotionAccel()); currentMessage.Append(tobj.getRotationAccel()); packet.Append(currentMessage); } currentMessage = new OSCMessage("/tuio/2Dobj"); currentMessage.Append("fseq"); currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle packet.Append(currentMessage); transmitter.Send(packet); } private void addAliveCursorMessagesToBundle(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); } private void addAliveObjectMessagesToBundle(OSCBundle packet) { OSCMessage mssg = new OSCMessage("/tuio/2Dobj"); mssg.Append("alive"); for (int i = 0; i < objectList.Count; i++) { mssg.Append((Int32)objectList[i].getSessionID()); } packet.Append(mssg); } } }