TuioServer.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. using OSC.NET;
  2. using System;
  3. using System.Collections.Generic;
  4. // using System.Runtime.InteropServices;
  5. namespace TUIO
  6. {
  7. /// <summary>
  8. /// Tuio server class to send tuio cursors and objects to tuio clients.
  9. /// </summary>
  10. internal class TuioServer
  11. {
  12. /// <summary>
  13. /// the maximum packet size
  14. /// </summary>
  15. private const int MAX_PACKET_SIZE = 65535 - 8;
  16. /// <summary>
  17. /// current tuio time
  18. /// </summary>
  19. private TuioTime currentFrameTime;
  20. /// <summary>
  21. /// list of generated cursors
  22. /// </summary>
  23. private List<TuioCursor> cursorList;
  24. /// <summary>
  25. /// server ip address
  26. /// </summary>
  27. private String host = "127.0.0.1";
  28. /// <summary>
  29. /// list of all generated objects
  30. /// </summary>
  31. private List<TuioObject> objectList;
  32. /// <summary>
  33. /// server port
  34. /// </summary>
  35. private int port = 3333;
  36. /// <summary>
  37. /// tuio session id
  38. /// </summary>
  39. private long sessionID = 0;
  40. /// <summary>
  41. /// transmitter to send packages over udp
  42. /// </summary>
  43. private OSCTransmitter transmitter = null;
  44. /// <summary>
  45. /// list of cursors updated in the current frame
  46. /// </summary>
  47. private List<TuioCursor> updatedCursorList;
  48. /// <summary>
  49. /// list of objects updated in the current frame
  50. /// </summary>
  51. private List<TuioObject> updatedObjectList;
  52. /// <summary>
  53. /// Creates a tuio server with default ip and port.
  54. /// </summary>
  55. public TuioServer()
  56. {
  57. init();
  58. }
  59. /// <summary>
  60. /// Creates a tuio server with default ip.
  61. /// </summary>
  62. /// <param name="port">server port</param>
  63. public TuioServer(int port)
  64. {
  65. this.port = port;
  66. init();
  67. }
  68. /// <summary>
  69. /// Creates a tuio server.
  70. /// </summary>
  71. /// <param name="host">server ip</param>
  72. /// <param name="port">server port</param>
  73. public TuioServer(String host, int port)
  74. {
  75. this.host = host;
  76. this.port = port;
  77. init();
  78. }
  79. /// <summary>
  80. /// Adds and returns a tuio cursor.
  81. /// </summary>
  82. /// <param name="xp">x position of the cursor</param>
  83. /// <param name="yp">y position of the cursor</param>
  84. /// <returns>the added cursor</returns>
  85. public TuioCursor addTuioCursor(float xp, float yp)
  86. {
  87. TuioCursor tcur = new TuioCursor(sessionID, cursorList.Count, xp, yp);
  88. cursorList.Add(tcur);
  89. updatedCursorList.Add(tcur);
  90. sessionID++;
  91. return tcur;
  92. }
  93. /// <summary>
  94. /// Adds and returns tuio object.
  95. /// </summary>
  96. /// <param name="xp">x position of the object</param>
  97. /// <param name="yp">y position of the object</param>
  98. /// <param name="angle">angle of the object</param>
  99. /// <returns>the added object</returns>
  100. public TuioObject addTuioObject(float xp, float yp, float angle)
  101. {
  102. TuioObject tobj = new TuioObject(sessionID, objectList.Count, xp, yp, angle);
  103. objectList.Add(tobj);
  104. updatedObjectList.Add(tobj);
  105. sessionID++;
  106. return tobj;
  107. }
  108. /// <summary>
  109. /// Closes the transmission.
  110. /// </summary>
  111. public void close()
  112. {
  113. transmitter.Close();
  114. }
  115. /// <summary>
  116. /// Sends cursors and objects which were updated in the current frame.
  117. /// </summary>
  118. public void commitFrame()
  119. {
  120. sendMessage(updatedCursorList, updatedObjectList);
  121. }
  122. /// <summary>
  123. /// Initializes cursor and object lists for sending information for a new frame.
  124. /// </summary>
  125. public void initFrame()
  126. {
  127. currentFrameTime = TuioTime.getSessionTime();
  128. updatedCursorList = new List<TuioCursor>();
  129. updatedObjectList = new List<TuioObject>();
  130. }
  131. /// <summary>
  132. /// Removes a tuio cursor.
  133. /// </summary>
  134. /// <param name="tcur">the cursor to remove</param>
  135. public void removeTuioCursor(TuioCursor tcur)
  136. {
  137. cursorList.Remove(tcur);
  138. }
  139. /// <summary>
  140. /// Removes a tuio object.
  141. /// </summary>
  142. /// <param name="tobj">the object to remove</param>
  143. public void removeTuioObject(TuioObject tobj)
  144. {
  145. objectList.Remove(tobj);
  146. }
  147. /// <summary>
  148. /// Sends all cursors and objects.
  149. /// </summary>
  150. public void sendFullMessages()
  151. {
  152. sendMessage(cursorList, objectList);
  153. }
  154. /// <summary>
  155. /// Updates a tui cursor.
  156. /// </summary>
  157. /// <param name="tcur">the cursor to update</param>
  158. /// <param name="xp">new x position</param>
  159. /// <param name="yp">new y position</param>
  160. public void updateTuioCursor(TuioCursor tcur, float xp, float yp)
  161. {
  162. tcur.update(currentFrameTime, xp, yp);
  163. if (!updatedCursorList.Contains(tcur))
  164. updatedCursorList.Add(tcur);
  165. }
  166. /// <summary>
  167. /// Updates a tuio object.
  168. /// </summary>
  169. /// <param name="tobj">the object to update</param>
  170. /// <param name="xp">new x position</param>
  171. /// <param name="yp">new y position</param>
  172. public void updateTuioObject(TuioObject tobj, float xp, float yp)
  173. {
  174. tobj.update(currentFrameTime, xp, yp);
  175. if (!updatedObjectList.Contains(tobj))
  176. updatedObjectList.Add(tobj);
  177. }
  178. /// <summary>
  179. /// Adds a tuio cursor alive message to a packet.
  180. /// </summary>
  181. /// <param name="packet">packet to add the message to</param>
  182. private void addAliveCursorMessagesToBundle(OSCBundle packet)
  183. {
  184. OSCMessage mssg = new OSCMessage("/tuio/2Dcur");
  185. mssg.Append("alive");
  186. for (int i = 0; i < cursorList.Count; i++)
  187. {
  188. mssg.Append((Int32)cursorList[i].getSessionID());
  189. }
  190. packet.Append(mssg);
  191. }
  192. /// <summary>
  193. /// Adds a tuio object alive message to a packet.
  194. /// </summary>
  195. /// <param name="packet">packet to add the message to</param>
  196. private void addAliveObjectMessagesToBundle(OSCBundle packet)
  197. {
  198. OSCMessage mssg = new OSCMessage("/tuio/2Dobj");
  199. mssg.Append("alive");
  200. for (int i = 0; i < objectList.Count; i++)
  201. {
  202. mssg.Append((Int32)objectList[i].getSessionID());
  203. }
  204. packet.Append(mssg);
  205. }
  206. /// <summary>
  207. /// Initializes the server, cursors and objects.
  208. /// </summary>
  209. private void init()
  210. {
  211. TuioTime.initSession();
  212. cursorList = new List<TuioCursor>();
  213. objectList = new List<TuioObject>();
  214. transmitter = new OSCTransmitter(host, port);
  215. }
  216. /// <summary>
  217. /// Sends cursors and objects.
  218. /// </summary>
  219. /// <param name="cursorList">list of cursors to send</param>
  220. /// <param name="objectList">list of objects to send</param>
  221. private void sendMessage(List<TuioCursor> cursorList, List<TuioObject> objectList)
  222. {
  223. OSCBundle packet = new OSCBundle();
  224. OSCMessage currentMessage;
  225. // cursors
  226. addAliveCursorMessagesToBundle(packet);
  227. TuioCursor tcur;
  228. for (int i = 0; i < cursorList.Count; i++)
  229. {
  230. tcur = cursorList[i];
  231. currentMessage = new OSCMessage("/tuio/2Dcur");
  232. currentMessage.Append("set");
  233. currentMessage.Append((Int32)tcur.getSessionID());
  234. currentMessage.Append(tcur.getX());
  235. currentMessage.Append(tcur.getY());
  236. currentMessage.Append(tcur.getXSpeed());
  237. currentMessage.Append(tcur.getYSpeed());
  238. currentMessage.Append(tcur.getMotionAccel());
  239. packet.Append(currentMessage);
  240. }
  241. currentMessage = new OSCMessage("/tuio/2Dcur");
  242. currentMessage.Append("fseq");
  243. currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle
  244. packet.Append(currentMessage);
  245. transmitter.Send(packet);
  246. // objects
  247. packet = new OSCBundle();
  248. addAliveObjectMessagesToBundle(packet);
  249. TuioObject tobj;
  250. for (int i = 0; i < objectList.Count; i++)
  251. {
  252. tobj = objectList[i];
  253. currentMessage = new OSCMessage("/tuio/2Dobj");
  254. currentMessage.Append("set");
  255. currentMessage.Append((Int32)tobj.getSessionID());
  256. currentMessage.Append(tobj.getSymbolID());
  257. currentMessage.Append(tobj.getX());
  258. currentMessage.Append(tobj.getY());
  259. currentMessage.Append(tobj.getAngle());
  260. currentMessage.Append(tobj.getXSpeed());
  261. currentMessage.Append(tobj.getYSpeed());
  262. currentMessage.Append(tobj.getRotationSpeed());
  263. currentMessage.Append(tobj.getMotionAccel());
  264. currentMessage.Append(tobj.getRotationAccel());
  265. packet.Append(currentMessage);
  266. }
  267. currentMessage = new OSCMessage("/tuio/2Dobj");
  268. currentMessage.Append("fseq");
  269. currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle
  270. packet.Append(currentMessage);
  271. transmitter.Send(packet);
  272. }
  273. }
  274. }