TuioServer.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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. /// Updates a tuio object.
  180. /// </summary>
  181. /// <param name="tobj">the object to update</param>
  182. /// <param name="xp">new x position</param>
  183. /// <param name="yp">new y position</param>
  184. public void updateTuioObject(TuioObject tobj, float xp, float yp, float angle)
  185. {
  186. tobj.update(currentFrameTime, xp, yp, angle);
  187. if (!updatedObjectList.Contains(tobj))
  188. updatedObjectList.Add(tobj);
  189. }
  190. /// <summary>
  191. /// Adds a tuio cursor alive message to a packet.
  192. /// </summary>
  193. /// <param name="packet">packet to add the message to</param>
  194. private void addAliveCursorMessagesToBundle(OSCBundle packet)
  195. {
  196. OSCMessage mssg = new OSCMessage("/tuio/2Dcur");
  197. mssg.Append("alive");
  198. for (int i = 0; i < cursorList.Count; i++)
  199. {
  200. mssg.Append((Int32)cursorList[i].getSessionID());
  201. }
  202. packet.Append(mssg);
  203. }
  204. /// <summary>
  205. /// Adds a tuio object alive message to a packet.
  206. /// </summary>
  207. /// <param name="packet">packet to add the message to</param>
  208. private void addAliveObjectMessagesToBundle(OSCBundle packet)
  209. {
  210. OSCMessage mssg = new OSCMessage("/tuio/2Dobj");
  211. mssg.Append("alive");
  212. for (int i = 0; i < objectList.Count; i++)
  213. {
  214. mssg.Append((Int32)objectList[i].getSessionID());
  215. }
  216. packet.Append(mssg);
  217. }
  218. /// <summary>
  219. /// Initializes the server, cursors and objects.
  220. /// </summary>
  221. private void init()
  222. {
  223. TuioTime.initSession();
  224. cursorList = new List<TuioCursor>();
  225. objectList = new List<TuioObject>();
  226. transmitter = new OSCTransmitter(host, port);
  227. }
  228. /// <summary>
  229. /// Sends cursors and objects.
  230. /// </summary>
  231. /// <param name="cursorList">list of cursors to send</param>
  232. /// <param name="objectList">list of objects to send</param>
  233. private void sendMessage(List<TuioCursor> cursorList, List<TuioObject> objectList)
  234. {
  235. OSCBundle packet = new OSCBundle();
  236. OSCMessage currentMessage;
  237. // cursors
  238. addAliveCursorMessagesToBundle(packet);
  239. TuioCursor tcur;
  240. for (int i = 0; i < cursorList.Count; i++)
  241. {
  242. tcur = cursorList[i];
  243. currentMessage = new OSCMessage("/tuio/2Dcur");
  244. currentMessage.Append("set");
  245. currentMessage.Append((Int32)tcur.getSessionID());
  246. currentMessage.Append(tcur.getX());
  247. currentMessage.Append(tcur.getY());
  248. currentMessage.Append(tcur.getXSpeed());
  249. currentMessage.Append(tcur.getYSpeed());
  250. currentMessage.Append(tcur.getMotionAccel());
  251. packet.Append(currentMessage);
  252. }
  253. currentMessage = new OSCMessage("/tuio/2Dcur");
  254. currentMessage.Append("fseq");
  255. currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle
  256. packet.Append(currentMessage);
  257. transmitter.Send(packet);
  258. // objects
  259. packet = new OSCBundle();
  260. addAliveObjectMessagesToBundle(packet);
  261. TuioObject tobj;
  262. for (int i = 0; i < objectList.Count; i++)
  263. {
  264. tobj = objectList[i];
  265. currentMessage = new OSCMessage("/tuio/2Dobj");
  266. currentMessage.Append("set");
  267. currentMessage.Append((Int32)tobj.getSessionID());
  268. currentMessage.Append(tobj.getSymbolID());
  269. currentMessage.Append(tobj.getX());
  270. currentMessage.Append(tobj.getY());
  271. currentMessage.Append(tobj.getAngle());
  272. currentMessage.Append(tobj.getXSpeed());
  273. currentMessage.Append(tobj.getYSpeed());
  274. currentMessage.Append(tobj.getRotationSpeed());
  275. currentMessage.Append(tobj.getMotionAccel());
  276. currentMessage.Append(tobj.getRotationAccel());
  277. packet.Append(currentMessage);
  278. }
  279. currentMessage = new OSCMessage("/tuio/2Dobj");
  280. currentMessage.Append("fseq");
  281. currentMessage.Append(-1); //sequence_id; actually -1 stands for redundant bundle
  282. packet.Append(currentMessage);
  283. transmitter.Send(packet);
  284. }
  285. }
  286. }