TuioServer.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. /*
  2. TUIO Server Component - part of the reacTIVision project
  3. http://reactivision.sourceforge.net/
  4. Copyright (c) 2005-2009 Martin Kaltenbrunner <[email protected]>
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. */
  17. #include "TuioServer.h"
  18. using namespace TUIO;
  19. using namespace osc;
  20. #ifndef WIN32
  21. static void* ThreadFunc( void* obj )
  22. #else
  23. static DWORD WINAPI ThreadFunc( LPVOID obj )
  24. #endif
  25. {
  26. TuioServer *tuioServer = static_cast<TuioServer*>(obj);
  27. while ((tuioServer->isConnected()) && (tuioServer->periodicMessagesEnabled())) {
  28. tuioServer->sendFullMessages();
  29. #ifndef WIN32
  30. usleep(USEC_SECOND*tuioServer->getUpdateInterval());
  31. #else
  32. Sleep(MSEC_SECOND*tuioServer->getUpdateInterval());
  33. #endif
  34. }
  35. return 0;
  36. };
  37. void TuioServer::enablePeriodicMessages(int interval) {
  38. if (periodic_update) return;
  39. update_interval = interval;
  40. periodic_update = true;
  41. #ifndef WIN32
  42. pthread_create(&thread , NULL, ThreadFunc, this);
  43. #else
  44. DWORD threadId;
  45. thread = CreateThread( 0, 0, ThreadFunc, this, 0, &threadId );
  46. #endif
  47. }
  48. void TuioServer::disablePeriodicMessages() {
  49. if (!periodic_update) return;
  50. periodic_update = false;
  51. #ifdef WIN32
  52. if( thread ) CloseHandle( thread );
  53. #endif
  54. thread = NULL;
  55. }
  56. void TuioServer::sendFullMessages() {
  57. // prepare the cursor packet
  58. fullPacket->Clear();
  59. (*fullPacket) << osc::BeginBundleImmediate;
  60. // add the cursor alive message
  61. (*fullPacket) << osc::BeginMessage( "/tuio/2Dcur") << "alive";
  62. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++)
  63. (*fullPacket) << (int32)((*tuioCursor)->getSessionID());
  64. (*fullPacket) << osc::EndMessage;
  65. // add all current cursor set messages
  66. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
  67. // start a new packet if we exceed the packet capacity
  68. if ((fullPacket->Capacity()-fullPacket->Size())<CUR_MESSAGE_SIZE) {
  69. // add the immediate fseq message and send the cursor packet
  70. (*fullPacket) << osc::BeginMessage( "/tuio/2Dcur") << "fseq" << -1 << osc::EndMessage;
  71. (*fullPacket) << osc::EndBundle;
  72. socket->Send( fullPacket->Data(), fullPacket->Size() );
  73. // prepare the new cursor packet
  74. fullPacket->Clear();
  75. (*fullPacket) << osc::BeginBundleImmediate;
  76. // add the cursor alive message
  77. (*fullPacket) << osc::BeginMessage( "/tuio/2Dcur") << "alive";
  78. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++)
  79. (*fullPacket) << (int32)((*tuioCursor)->getSessionID());
  80. (*fullPacket) << osc::EndMessage;
  81. }
  82. // add the actual cursor set message
  83. (*fullPacket) << osc::BeginMessage( "/tuio/2Dcur") << "set";
  84. (*fullPacket) << (int32)((*tuioCursor)->getSessionID()) << (*tuioCursor)->getX() << (*tuioCursor)->getY();
  85. (*fullPacket) << (*tuioCursor)->getXSpeed() << (*tuioCursor)->getYSpeed() <<(*tuioCursor)->getMotionAccel();
  86. (*fullPacket) << osc::EndMessage;
  87. }
  88. // add the immediate fseq message and send the cursor packet
  89. (*fullPacket) << osc::BeginMessage( "/tuio/2Dcur") << "fseq" << -1 << osc::EndMessage;
  90. (*fullPacket) << osc::EndBundle;
  91. socket->Send( fullPacket->Data(), fullPacket->Size() );
  92. // prepare the object packet
  93. fullPacket->Clear();
  94. (*fullPacket) << osc::BeginBundleImmediate;
  95. // add the object alive message
  96. (*fullPacket) << osc::BeginMessage( "/tuio/2Dobj") << "alive";
  97. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++)
  98. (*fullPacket) << (int32)((*tuioObject)->getSessionID());
  99. (*fullPacket) << osc::EndMessage;
  100. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
  101. // start a new packet if we exceed the packet capacity
  102. if ((fullPacket->Capacity()-fullPacket->Size())<OBJ_MESSAGE_SIZE) {
  103. // add the immediate fseq message and send the object packet
  104. (*fullPacket) << osc::BeginMessage( "/tuio/2Dobj") << "fseq" << -1 << osc::EndMessage;
  105. (*fullPacket) << osc::EndBundle;
  106. socket->Send( fullPacket->Data(), fullPacket->Size() );
  107. // prepare the new object packet
  108. fullPacket->Clear();
  109. (*fullPacket) << osc::BeginBundleImmediate;
  110. // add the object alive message
  111. (*fullPacket) << osc::BeginMessage( "/tuio/2Dobj") << "alive";
  112. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++)
  113. (*fullPacket) << (int32)((*tuioObject)->getSessionID());
  114. (*fullPacket) << osc::EndMessage;
  115. }
  116. // add the actual object set message
  117. (*fullPacket) << osc::BeginMessage( "/tuio/2Dobj") << "set";
  118. (*fullPacket) << (int32)((*tuioObject)->getSessionID()) << (*tuioObject)->getSymbolID() << (*tuioObject)->getX() << (*tuioObject)->getY() << (*tuioObject)->getAngle();
  119. (*fullPacket) << (*tuioObject)->getXSpeed() << (*tuioObject)->getYSpeed() << (*tuioObject)->getRotationSpeed() << (*tuioObject)->getMotionAccel() << (*tuioObject)->getRotationAccel();
  120. (*fullPacket) << osc::EndMessage;
  121. }
  122. // add the immediate fseq message and send the object packet
  123. (*fullPacket) << osc::BeginMessage( "/tuio/2Dobj") << "fseq" << -1 << osc::EndMessage;
  124. (*fullPacket) << osc::EndBundle;
  125. socket->Send( fullPacket->Data(), fullPacket->Size() );
  126. }
  127. TuioServer::TuioServer() {
  128. initialize("127.0.0.1",3333,MAX_UDP_SIZE);
  129. }
  130. TuioServer::TuioServer(const char *host, int port) {
  131. initialize(host,port,IP_MTU_SIZE);
  132. }
  133. TuioServer::TuioServer(const char *host, int port, int size) {
  134. initialize(host,port,size);
  135. }
  136. void TuioServer::initialize(const char *host, int port, int size) {
  137. if (size>MAX_UDP_SIZE) size = MAX_UDP_SIZE;
  138. else if (size<MIN_UDP_SIZE) size = MIN_UDP_SIZE;
  139. try {
  140. long unsigned int ip = GetHostByName(host);
  141. socket = new UdpTransmitSocket(IpEndpointName(ip, port));
  142. oscBuffer = new char[size];
  143. oscPacket = new osc::OutboundPacketStream(oscBuffer,size);
  144. fullBuffer = new char[size];
  145. fullPacket = new osc::OutboundPacketStream(fullBuffer,size);
  146. } catch (std::exception &e) {
  147. std::cout << "could not create socket" << std::endl;
  148. socket = NULL;
  149. }
  150. currentFrameTime = TuioTime::getSessionTime().getSeconds();
  151. currentFrame = sessionID = maxCursorID = -1;
  152. verbose = updateObject = updateCursor = false;
  153. lastObjectUpdate = lastCursorUpdate = currentFrameTime.getSeconds();
  154. sendEmptyCursorBundle();
  155. sendEmptyObjectBundle();
  156. periodic_update = false;
  157. full_update = false;
  158. connected = true;
  159. }
  160. TuioServer::~TuioServer() {
  161. connected = false;
  162. sendEmptyCursorBundle();
  163. sendEmptyObjectBundle();
  164. delete oscPacket;
  165. delete []oscBuffer;
  166. delete fullPacket;
  167. delete []fullBuffer;
  168. delete socket;
  169. }
  170. TuioObject* TuioServer::addTuioObject(int f_id, float x, float y, float a) {
  171. sessionID++;
  172. TuioObject *tobj = new TuioObject(currentFrameTime, sessionID, f_id, x, y, a);
  173. objectList.push_back(tobj);
  174. updateObject = true;
  175. if (verbose)
  176. std::cout << "add obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle() << std::endl;
  177. return tobj;
  178. }
  179. void TuioServer::addExternalTuioObject(TuioObject *tobj) {
  180. if (tobj==NULL) return;
  181. objectList.push_back(tobj);
  182. updateObject = true;
  183. if (verbose)
  184. std::cout << "add obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle() << std::endl;
  185. }
  186. void TuioServer::updateTuioObject(TuioObject *tobj, float x, float y, float a) {
  187. if (tobj==NULL) return;
  188. if (tobj->getTuioTime()==currentFrameTime) return;
  189. tobj->update(currentFrameTime,x,y,a);
  190. updateObject = true;
  191. if (verbose && tobj->isMoving())
  192. std::cout << "set obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle()
  193. << " " << tobj->getXSpeed() << " " << tobj->getYSpeed() << " " << tobj->getRotationSpeed() << " " << tobj->getMotionAccel() << " " << tobj->getRotationAccel() << std::endl;
  194. }
  195. void TuioServer::updateExternalTuioObject(TuioObject *tobj) {
  196. if (tobj==NULL) return;
  197. updateObject = true;
  198. if (verbose && tobj->isMoving())
  199. std::cout << "set obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle()
  200. << " " << tobj->getXSpeed() << " " << tobj->getYSpeed() << " " << tobj->getRotationSpeed() << " " << tobj->getMotionAccel() << " " << tobj->getRotationAccel() << std::endl;
  201. }
  202. void TuioServer::removeTuioObject(TuioObject *tobj) {
  203. if (tobj==NULL) return;
  204. objectList.remove(tobj);
  205. delete tobj;
  206. updateObject = true;
  207. if (verbose)
  208. std::cout << "del obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ")" << std::endl;
  209. }
  210. void TuioServer::removeExternalTuioObject(TuioObject *tobj) {
  211. if (tobj==NULL) return;
  212. objectList.remove(tobj);
  213. updateObject = true;
  214. if (verbose)
  215. std::cout << "del obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ")" << std::endl;
  216. }
  217. TuioCursor* TuioServer::addTuioCursor(float x, float y) {
  218. sessionID++;
  219. int cursorID = (int)cursorList.size();
  220. if (((int)(cursorList.size())<=maxCursorID) && ((int)(freeCursorList.size())>0)) {
  221. std::list<TuioCursor*>::iterator closestCursor = freeCursorList.begin();
  222. for(std::list<TuioCursor*>::iterator iter = freeCursorList.begin();iter!= freeCursorList.end(); iter++) {
  223. if((*iter)->getDistance(x,y)<(*closestCursor)->getDistance(x,y)) closestCursor = iter;
  224. }
  225. TuioCursor *freeCursor = (*closestCursor);
  226. cursorID = (*closestCursor)->getCursorID();
  227. freeCursorList.erase(closestCursor);
  228. delete freeCursor;
  229. } else maxCursorID = cursorID;
  230. TuioCursor *tcur = new TuioCursor(currentFrameTime, sessionID, cursorID, x, y);
  231. cursorList.push_back(tcur);
  232. updateCursor = true;
  233. if (verbose)
  234. std::cout << "add cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY() << std::endl;
  235. return tcur;
  236. }
  237. void TuioServer::addExternalTuioCursor(TuioCursor *tcur) {
  238. if (tcur==NULL) return;
  239. cursorList.push_back(tcur);
  240. updateCursor = true;
  241. if (verbose)
  242. std::cout << "add cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY() << std::endl;
  243. }
  244. void TuioServer::updateTuioCursor(TuioCursor *tcur,float x, float y) {
  245. if (tcur==NULL) return;
  246. if (tcur->getTuioTime()==currentFrameTime) return;
  247. tcur->update(currentFrameTime,x,y);
  248. updateCursor = true;
  249. if (verbose && tcur->isMoving())
  250. std::cout << "set cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY()
  251. << " " << tcur->getXSpeed() << " " << tcur->getYSpeed() << " " << tcur->getMotionAccel() << " " << std::endl;
  252. }
  253. void TuioServer::updateExternalTuioCursor(TuioCursor *tcur) {
  254. if (tcur==NULL) return;
  255. updateCursor = true;
  256. if (verbose && tcur->isMoving())
  257. std::cout << "set cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY()
  258. << " " << tcur->getXSpeed() << " " << tcur->getYSpeed() << " " << tcur->getMotionAccel() << " " << std::endl;
  259. }
  260. void TuioServer::removeTuioCursor(TuioCursor *tcur) {
  261. if (tcur==NULL) return;
  262. cursorList.remove(tcur);
  263. tcur->remove(currentFrameTime);
  264. updateCursor = true;
  265. if (verbose)
  266. std::cout << "del cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ")" << std::endl;
  267. if (tcur->getCursorID()==maxCursorID) {
  268. maxCursorID = -1;
  269. delete tcur;
  270. if (cursorList.size()>0) {
  271. std::list<TuioCursor*>::iterator clist;
  272. for (clist=cursorList.begin(); clist != cursorList.end(); clist++) {
  273. int cursorID = (*clist)->getCursorID();
  274. if (cursorID>maxCursorID) maxCursorID=cursorID;
  275. }
  276. freeCursorBuffer.clear();
  277. for (std::list<TuioCursor*>::iterator flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++) {
  278. TuioCursor *freeCursor = (*flist);
  279. if (freeCursor->getCursorID()>maxCursorID) delete freeCursor;
  280. else freeCursorBuffer.push_back(freeCursor);
  281. }
  282. freeCursorList = freeCursorBuffer;
  283. } else {
  284. for (std::list<TuioCursor*>::iterator flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++) {
  285. TuioCursor *freeCursor = (*flist);
  286. delete freeCursor;
  287. }
  288. freeCursorList.clear();
  289. }
  290. } else if (tcur->getCursorID()<maxCursorID) {
  291. freeCursorList.push_back(tcur);
  292. }
  293. }
  294. void TuioServer::removeExternalTuioCursor(TuioCursor *tcur) {
  295. if (tcur==NULL) return;
  296. cursorList.remove(tcur);
  297. updateCursor = true;
  298. if (verbose)
  299. std::cout << "del cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ")" << std::endl;
  300. }
  301. long TuioServer::getSessionID() {
  302. sessionID++;
  303. return sessionID;
  304. }
  305. long TuioServer::getFrameID() {
  306. return currentFrame;
  307. }
  308. TuioTime TuioServer::getFrameTime() {
  309. return currentFrameTime;
  310. }
  311. void TuioServer::initFrame(TuioTime ttime) {
  312. currentFrameTime = ttime;
  313. currentFrame++;
  314. }
  315. void TuioServer::commitFrame() {
  316. if(updateCursor) {
  317. startCursorBundle();
  318. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
  319. // start a new packet if we exceed the packet capacity
  320. if ((oscPacket->Capacity()-oscPacket->Size())<CUR_MESSAGE_SIZE) {
  321. sendCursorBundle(currentFrame);
  322. startCursorBundle();
  323. }
  324. TuioCursor *tcur = (*tuioCursor);
  325. if ((full_update) || (tcur->getTuioTime()==currentFrameTime)) addCursorMessage(tcur);
  326. }
  327. sendCursorBundle(currentFrame);
  328. } else if ((!periodic_update) && (lastCursorUpdate<currentFrameTime.getSeconds())) {
  329. lastCursorUpdate = currentFrameTime.getSeconds();
  330. startCursorBundle();
  331. sendCursorBundle(currentFrame);
  332. }
  333. updateCursor = false;
  334. if(updateObject) {
  335. startObjectBundle();
  336. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
  337. // start a new packet if we exceed the packet capacity
  338. if ((oscPacket->Capacity()-oscPacket->Size())<OBJ_MESSAGE_SIZE) {
  339. sendObjectBundle(currentFrame);
  340. startObjectBundle();
  341. }
  342. TuioObject *tobj = (*tuioObject);
  343. if ((full_update) || (tobj->getTuioTime()==currentFrameTime)) addObjectMessage(tobj);
  344. }
  345. sendObjectBundle(currentFrame);
  346. } else if ((!periodic_update) && (lastObjectUpdate<currentFrameTime.getSeconds())) {
  347. lastObjectUpdate = currentFrameTime.getSeconds();
  348. startObjectBundle();
  349. sendObjectBundle(currentFrame);
  350. }
  351. updateObject = false;
  352. }
  353. void TuioServer::sendEmptyCursorBundle() {
  354. oscPacket->Clear();
  355. (*oscPacket) << osc::BeginBundleImmediate;
  356. (*oscPacket) << osc::BeginMessage( "/tuio/2Dcur") << "alive" << osc::EndMessage;
  357. (*oscPacket) << osc::BeginMessage( "/tuio/2Dcur") << "fseq" << -1 << osc::EndMessage;
  358. (*oscPacket) << osc::EndBundle;
  359. socket->Send( oscPacket->Data(), oscPacket->Size() );
  360. }
  361. void TuioServer::startCursorBundle() {
  362. oscPacket->Clear();
  363. (*oscPacket) << osc::BeginBundleImmediate;
  364. (*oscPacket) << osc::BeginMessage( "/tuio/2Dcur") << "alive";
  365. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
  366. (*oscPacket) << (int32)((*tuioCursor)->getSessionID());
  367. }
  368. (*oscPacket) << osc::EndMessage;
  369. }
  370. void TuioServer::addCursorMessage(TuioCursor *tcur) {
  371. (*oscPacket) << osc::BeginMessage( "/tuio/2Dcur") << "set";
  372. (*oscPacket) << (int32)(tcur->getSessionID()) << tcur->getX() << tcur->getY();
  373. (*oscPacket) << tcur->getXSpeed() << tcur->getYSpeed() << tcur->getMotionAccel();
  374. (*oscPacket) << osc::EndMessage;
  375. }
  376. void TuioServer::sendCursorBundle(long fseq) {
  377. (*oscPacket) << osc::BeginMessage( "/tuio/2Dcur") << "fseq" << (int32)fseq << osc::EndMessage;
  378. (*oscPacket) << osc::EndBundle;
  379. socket->Send( oscPacket->Data(), oscPacket->Size() );
  380. }
  381. void TuioServer::sendEmptyObjectBundle() {
  382. oscPacket->Clear();
  383. (*oscPacket) << osc::BeginBundleImmediate;
  384. (*oscPacket) << osc::BeginMessage( "/tuio/2Dobj") << "alive" << osc::EndMessage;
  385. (*oscPacket) << osc::BeginMessage( "/tuio/2Dobj") << "fseq" << -1 << osc::EndMessage;
  386. (*oscPacket) << osc::EndBundle;
  387. socket->Send( oscPacket->Data(), oscPacket->Size() );
  388. }
  389. void TuioServer::startObjectBundle() {
  390. oscPacket->Clear();
  391. (*oscPacket) << osc::BeginBundleImmediate;
  392. (*oscPacket) << osc::BeginMessage( "/tuio/2Dobj") << "alive";
  393. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
  394. (*oscPacket) << (int32)((*tuioObject)->getSessionID());
  395. }
  396. (*oscPacket) << osc::EndMessage;
  397. }
  398. void TuioServer::addObjectMessage(TuioObject *tobj) {
  399. (*oscPacket) << osc::BeginMessage( "/tuio/2Dobj") << "set";
  400. (*oscPacket) << (int32)(tobj->getSessionID()) << tobj->getSymbolID() << tobj->getX() << tobj->getY() << tobj->getAngle();
  401. (*oscPacket) << tobj->getXSpeed() << tobj->getYSpeed() << tobj->getRotationSpeed() << tobj->getMotionAccel() << tobj->getRotationAccel();
  402. (*oscPacket) << osc::EndMessage;
  403. }
  404. void TuioServer::sendObjectBundle(long fseq) {
  405. (*oscPacket) << osc::BeginMessage( "/tuio/2Dobj") << "fseq" << (int32)fseq << osc::EndMessage;
  406. (*oscPacket) << osc::EndBundle;
  407. socket->Send( oscPacket->Data(), oscPacket->Size() );
  408. }
  409. TuioObject* TuioServer::getTuioObject(long s_id) {
  410. for (std::list<TuioObject*>::iterator iter=objectList.begin(); iter != objectList.end(); iter++)
  411. if((*iter)->getSessionID()==s_id) return (*iter);
  412. return NULL;
  413. }
  414. TuioCursor* TuioServer::getTuioCursor(long s_id) {
  415. for (std::list<TuioCursor*>::iterator iter=cursorList.begin(); iter != cursorList.end(); iter++)
  416. if((*iter)->getSessionID()==s_id) return (*iter);
  417. return NULL;
  418. }
  419. TuioObject* TuioServer::getClosestTuioObject(float xp, float yp) {
  420. TuioObject *closestObject = NULL;
  421. float closestDistance = 1.0f;
  422. for (std::list<TuioObject*>::iterator iter=objectList.begin(); iter != objectList.end(); iter++) {
  423. float distance = (*iter)->getDistance(xp,yp);
  424. if(distance<closestDistance) {
  425. closestObject = (*iter);
  426. closestDistance = distance;
  427. }
  428. }
  429. return closestObject;
  430. }
  431. TuioCursor* TuioServer::getClosestTuioCursor(float xp, float yp) {
  432. TuioCursor *closestCursor = NULL;
  433. float closestDistance = 1.0f;
  434. for (std::list<TuioCursor*>::iterator iter=cursorList.begin(); iter != cursorList.end(); iter++) {
  435. float distance = (*iter)->getDistance(xp,yp);
  436. if(distance<closestDistance) {
  437. closestCursor = (*iter);
  438. closestDistance = distance;
  439. }
  440. }
  441. return closestCursor;
  442. }
  443. std::list<TuioObject*> TuioServer::getTuioObjects() {
  444. return objectList;
  445. }
  446. std::list<TuioCursor*> TuioServer::getTuioCursors() {
  447. return cursorList;
  448. }
  449. std::list<TuioObject*> TuioServer::getUntouchedObjects() {
  450. std::list<TuioObject*> untouched;
  451. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
  452. TuioObject *tobj = (*tuioObject);
  453. if (tobj->getTuioTime()!=currentFrameTime) untouched.push_back(tobj);
  454. }
  455. return untouched;
  456. }
  457. void TuioServer::stopUntouchedMovingObjects() {
  458. std::list<TuioObject*> untouched;
  459. for (std::list<TuioObject*>::iterator tuioObject = objectList.begin(); tuioObject!=objectList.end(); tuioObject++) {
  460. TuioObject *tobj = (*tuioObject);
  461. if ((tobj->getTuioTime()!=currentFrameTime) && (tobj->isMoving())) {
  462. tobj->stop(currentFrameTime);
  463. updateObject = true;
  464. if (verbose)
  465. std::cout << "set obj " << tobj->getSymbolID() << " (" << tobj->getSessionID() << ") "<< tobj->getX() << " " << tobj->getY() << " " << tobj->getAngle()
  466. << " " << tobj->getXSpeed() << " " << tobj->getYSpeed() << " " << tobj->getRotationSpeed() << " " << tobj->getMotionAccel() << " " << tobj->getRotationAccel() << std::endl;
  467. }
  468. }
  469. }
  470. void TuioServer::removeUntouchedStoppedObjects() {
  471. std::list<TuioObject*>::iterator tuioObject = objectList.begin();
  472. while (tuioObject!=objectList.end()) {
  473. TuioObject *tobj = (*tuioObject);
  474. if ((tobj->getTuioTime()!=currentFrameTime) && (!tobj->isMoving())) {
  475. removeTuioObject(tobj);
  476. tuioObject = objectList.begin();
  477. } else tuioObject++;
  478. }
  479. }
  480. std::list<TuioCursor*> TuioServer::getUntouchedCursors() {
  481. std::list<TuioCursor*> untouched;
  482. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
  483. TuioCursor *tcur = (*tuioCursor);
  484. if (tcur->getTuioTime()!=currentFrameTime) untouched.push_back(tcur);
  485. }
  486. return untouched;
  487. }
  488. void TuioServer::stopUntouchedMovingCursors() {
  489. std::list<TuioCursor*> untouched;
  490. for (std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin(); tuioCursor!=cursorList.end(); tuioCursor++) {
  491. TuioCursor *tcur = (*tuioCursor);
  492. if ((tcur->getTuioTime()!=currentFrameTime) && (tcur->isMoving())) {
  493. tcur->stop(currentFrameTime);
  494. updateCursor = true;
  495. if (verbose)
  496. std::cout << "set cur " << tcur->getCursorID() << " (" << tcur->getSessionID() << ") " << tcur->getX() << " " << tcur->getY()
  497. << " " << tcur->getXSpeed() << " " << tcur->getYSpeed()<< " " << tcur->getMotionAccel() << " " << std::endl;
  498. }
  499. }
  500. }
  501. void TuioServer::removeUntouchedStoppedCursors() {
  502. if (cursorList.size()==0) return;
  503. std::list<TuioCursor*>::iterator tuioCursor = cursorList.begin();
  504. while (tuioCursor!=cursorList.end()) {
  505. TuioCursor *tcur = (*tuioCursor);
  506. if ((tcur->getTuioTime()!=currentFrameTime) && (!tcur->isMoving())) {
  507. removeTuioCursor(tcur);
  508. tuioCursor = cursorList.begin();
  509. } else tuioCursor++;
  510. }
  511. }