TuioServer.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. //using Ventuz.OSC;
  7. using OSC.NET;
  8. //using System.Runtime.InteropServices;
  9. using bbiwarg.Utility;
  10. namespace TUIO
  11. {
  12. class TuioServer
  13. {
  14. const int MAX_PACKET_SIZE = 65535 - 8;
  15. private OSCTransmitter transmitter = null;
  16. private String host = "127.0.0.1";
  17. private int port = 3333;
  18. private long sessionID = 0;
  19. private TuioTime currentFrameTime;
  20. private List<TuioCursor> cursorList;
  21. private List<TuioCursor> updatedCursorList;
  22. private List<TuioObject> objectList;
  23. private List<TuioObject> updatedObjectList;
  24. public TuioServer() { init(); }
  25. public TuioServer(int port)
  26. {
  27. this.port = port;
  28. init();
  29. }
  30. public TuioServer(String host, int port)
  31. {
  32. this.host = host;
  33. this.port = port;
  34. init();
  35. }
  36. private void init()
  37. {
  38. TuioTime.initSession();
  39. cursorList = new List<TuioCursor>();
  40. objectList = new List<TuioObject>();
  41. transmitter = new OSCTransmitter(host, port);
  42. }
  43. public void close()
  44. {
  45. transmitter.Close();
  46. }
  47. public TuioCursor addTuioCursor(float xp, float yp)
  48. {
  49. TuioCursor tcur = new TuioCursor(sessionID, cursorList.Count, xp, yp);
  50. cursorList.Add(tcur);
  51. updatedCursorList.Add(tcur);
  52. sessionID++;
  53. return tcur;
  54. }
  55. public void updateTuioCursor(TuioCursor tcur, float xp, float yp)
  56. {
  57. tcur.update(currentFrameTime, xp, yp);
  58. if (!updatedCursorList.Contains(tcur))
  59. updatedCursorList.Add(tcur);
  60. }
  61. public void removeTuioCursor(TuioCursor tcur)
  62. {
  63. cursorList.Remove(tcur);
  64. }
  65. public TuioObject addTuioObject(float xp, float yp, float angle)
  66. {
  67. TuioObject tobj = new TuioObject(sessionID, objectList.Count, xp, yp, angle);
  68. objectList.Add(tobj);
  69. updatedObjectList.Add(tobj);
  70. sessionID++;
  71. return tobj;
  72. }
  73. public void updateTuioObject(TuioObject tobj, float xp, float yp)
  74. {
  75. tobj.update(currentFrameTime, xp, yp);
  76. if (!updatedObjectList.Contains(tobj))
  77. updatedObjectList.Add(tobj);
  78. }
  79. public void removeTuioObject(TuioObject tobj)
  80. {
  81. objectList.Remove(tobj);
  82. }
  83. public void initFrame()
  84. {
  85. currentFrameTime = TuioTime.getSessionTime();
  86. updatedCursorList = new List<TuioCursor>();
  87. updatedObjectList = new List<TuioObject>();
  88. }
  89. public void commitFrame()
  90. {
  91. sendMessage(updatedCursorList, updatedObjectList);
  92. }
  93. public void sendFullMessages()
  94. {
  95. sendMessage(cursorList, objectList);
  96. }
  97. private void sendMessage(List<TuioCursor> cursorList, List<TuioObject> objectList)
  98. {
  99. OSCBundle packet = new OSCBundle();
  100. OSCMessage currentMessage;
  101. // cursors
  102. addAliveCursorMessagesToBundle(packet);
  103. TuioCursor tcur;
  104. for (int i = 0; i < cursorList.Count; i++)
  105. {
  106. tcur = cursorList[i];
  107. currentMessage = new OSCMessage("/tuio/2Dcur");
  108. currentMessage.Append("set");
  109. currentMessage.Append((Int32)tcur.getSessionID());
  110. currentMessage.Append(tcur.getX());
  111. currentMessage.Append(tcur.getY());
  112. currentMessage.Append(tcur.getXSpeed());
  113. currentMessage.Append(tcur.getYSpeed());
  114. currentMessage.Append(tcur.getMotionAccel());
  115. /*if (Marshal.SizeOf(packet) + Marshal.SizeOf(currentOscElement) >= MAX_PACKET_SIZE)
  116. {
  117. packet.AddElement(new OscElement("/tuio/2Dcur", new Object[] { "fseq", -1 }));
  118. udpwriter.Send(packet);
  119. packet = new OscBundle();
  120. addAliveCursorMessagesToBundle(packet);
  121. }*/
  122. packet.Append(currentMessage);
  123. }
  124. currentMessage = new OSCMessage("/tuio/2Dcur");
  125. currentMessage.Append("fseq");
  126. currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle
  127. packet.Append(currentMessage);
  128. transmitter.Send(packet);
  129. // objects
  130. packet = new OSCBundle();
  131. addAliveObjectMessagesToBundle(packet);
  132. TuioObject tobj;
  133. for (int i = 0; i < objectList.Count; i++)
  134. {
  135. tobj = objectList[i];
  136. currentMessage = new OSCMessage("/tuio/2Dobj");
  137. currentMessage.Append("set");
  138. currentMessage.Append((Int32)tobj.getSessionID());
  139. currentMessage.Append(tobj.getSymbolID());
  140. currentMessage.Append(tobj.getX());
  141. currentMessage.Append(tobj.getY());
  142. currentMessage.Append(tobj.getAngle());
  143. currentMessage.Append(tobj.getXSpeed());
  144. currentMessage.Append(tobj.getYSpeed());
  145. currentMessage.Append(tobj.getRotationSpeed());
  146. currentMessage.Append(tobj.getMotionAccel());
  147. currentMessage.Append(tobj.getRotationAccel());
  148. packet.Append(currentMessage);
  149. }
  150. currentMessage = new OSCMessage("/tuio/2Dobj");
  151. currentMessage.Append("fseq");
  152. currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle
  153. packet.Append(currentMessage);
  154. transmitter.Send(packet);
  155. }
  156. private void addAliveCursorMessagesToBundle(OSCBundle packet)
  157. {
  158. OSCMessage mssg = new OSCMessage("/tuio/2Dcur");
  159. mssg.Append("alive");
  160. for (int i = 0; i < cursorList.Count; i++)
  161. {
  162. mssg.Append((Int32)cursorList[i].getSessionID());
  163. }
  164. packet.Append(mssg);
  165. }
  166. private void addAliveObjectMessagesToBundle(OSCBundle packet)
  167. {
  168. OSCMessage mssg = new OSCMessage("/tuio/2Dobj");
  169. mssg.Append("alive");
  170. for (int i = 0; i < objectList.Count; i++)
  171. {
  172. mssg.Append((Int32)objectList[i].getSessionID());
  173. }
  174. packet.Append(mssg);
  175. }
  176. }
  177. }