| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- /*
- TUIO Server Component - part of the reacTIVision project
- http://reactivision.sourceforge.net/
-
- Copyright (c) 2005-2009 Martin Kaltenbrunner <[email protected]>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- #ifndef INCLUDED_TuioServer_H
- #define INCLUDED_TuioServer_H
- #ifndef WIN32
- #include <pthread.h>
- #include <sys/time.h>
- #else
- #include <windows.h>
- #endif
- #include <iostream>
- #include <list>
- #include <algorithm>
- #include "osc/OscOutboundPacketStream.h"
- #include "ip/NetworkingUtils.h"
- #include "ip/UdpSocket.h"
- #include "TuioObject.h"
- #include "TuioCursor.h"
- #define IP_MTU_SIZE 1500
- #define MAX_UDP_SIZE 65536
- #define MIN_UDP_SIZE 576
- #define OBJ_MESSAGE_SIZE 108 // setMessage + seqMessage size
- #define CUR_MESSAGE_SIZE 88
- namespace TUIO {
- /**
- * <p>The TuioServer class is the central TUIO protocol encoder component.
- * In order to encode and send TUIO messages an instance of TuioServer needs to be created. The TuioServer instance then generates TUIO messaged
- * which are sent via OSC over UDP to the configured IP address and port.</p>
- * <p>During runtime the each frame is marked with the initFrame and commitFrame methods,
- * while the currently present TuioObjects are managed by the server with ADD, UPDATE and REMOVE methods in analogy to the TuioClient's TuioListener interface.</p>
- * <p><code>
- * TuioClient *server = new TuioServer();<br/>
- * ...<br/>
- * server->initFrame(TuioTime::getSessionTime());<br/>
- * TuioObject *tobj = server->addTuioObject(xpos,ypos, angle);<br/>
- * TuioCursor *tcur = server->addTuioObject(xpos,ypos);<br/>
- * server->commitFrame();<br/>
- * ...<br/>
- * server->initFrame(TuioTime::getSessionTime());<br/>
- * server->updateTuioObject(tobj, xpos,ypos, angle);<br/>
- * server->updateTuioCursor(tcur, xpos,ypos);<br/>
- * server->commitFrame();<br/>
- * ...<br/>
- * server->initFrame(TuioTime::getSessionTime());<br/>
- * server->removeTuioObject(tobj);<br/>
- * server->removeTuioCursor(tcur);<br/>
- * server->commitFrame();<br/>
- * </code></p>
- *
- * @author Martin Kaltenbrunner
- * @version 1.4
- */
- class TuioServer {
-
- public:
- /**
- * The default constructor creates a TuioServer that sends to the default TUIO port 3333 on localhost
- * using the maximum packet size of 65536 bytes to use single packets on the loopback device
- */
- TuioServer();
- /**
- * This constructor creates a TuioServer that sends to the provided port on the the given host
- * using a default packet size of 1492 bytes to deliver unfragmented UDP packets on a LAN
- *
- * @param host the receiving host name
- * @param port the outgoing TUIO UDP port number
- */
- TuioServer(const char *host, int port);
- /**
- * This constructor creates a TuioServer that sends to the provided port on the the given host
- * the packet UDP size can be set to a value between 576 and 65536 bytes
- *
- * @param host the receiving host name
- * @param port the outgoing TUIO UDP port number
- * @param size the maximum UDP packet size
- */
- TuioServer(const char *host, int port, int size);
- /**
- * The destructor is doing nothing in particular.
- */
- ~TuioServer();
-
- /**
- * Creates a new TuioObject based on the given arguments.
- * The new TuioObject is added to the TuioServer's internal list of active TuioObjects
- * and a reference is returned to the caller.
- *
- * @param sym the Symbol ID to assign
- * @param xp the X coordinate to assign
- * @param yp the Y coordinate to assign
- * @param a the angle to assign
- * @return reference to the created TuioObject
- */
- TuioObject* addTuioObject(int sym, float xp, float yp, float a);
- /**
- * Updates the referenced TuioObject based on the given arguments.
- *
- * @param tobj the TuioObject to update
- * @param xp the X coordinate to assign
- * @param yp the Y coordinate to assign
- * @param a the angle to assign
- */
- void updateTuioObject(TuioObject *tobj, float xp, float yp, float a);
- /**
- * Removes the referenced TuioObject from the TuioServer's internal list of TuioObjects
- * and deletes the referenced TuioObject afterwards
- *
- * @param tobj the TuioObject to remove
- */
- void removeTuioObject(TuioObject *tobj);
- /**
- * Adds an externally managed TuioObject to the TuioServer's internal list of active TuioObjects
- *
- * @param tobj the TuioObject to add
- */
- void addExternalTuioObject(TuioObject *tobj);
- /**
- * Updates an externally managed TuioObject
- *
- * @param tobj the TuioObject to update
- */
- void updateExternalTuioObject(TuioObject *tobj);
- /**
- * Removes an externally managed TuioObject from the TuioServer's internal list of TuioObjects
- * The referenced TuioObject is not deleted
- *
- * @param tobj the TuioObject to remove
- */
- void removeExternalTuioObject(TuioObject *tobj);
-
- /**
- * Creates a new TuioCursor based on the given arguments.
- * The new TuioCursor is added to the TuioServer's internal list of active TuioCursors
- * and a reference is returned to the caller.
- *
- * @param xp the X coordinate to assign
- * @param yp the Y coordinate to assign
- * @return reference to the created TuioCursor
- */
- TuioCursor* addTuioCursor(float xp, float yp);
- /**
- * Updates the referenced TuioCursor based on the given arguments.
- *
- * @param tcur the TuioObject to update
- * @param xp the X coordinate to assign
- * @param yp the Y coordinate to assign
- */
- void updateTuioCursor(TuioCursor *tcur, float xp, float yp);
- /**
- * Removes the referenced TuioCursor from the TuioServer's internal list of TuioCursors
- * and deletes the referenced TuioCursor afterwards
- *
- * @param tcur the TuioCursor to remove
- */
- void removeTuioCursor(TuioCursor *tcur);
- /**
- * Updates an externally managed TuioCursor
- *
- * @param tcur the TuioCursor to update
- */
- void addExternalTuioCursor(TuioCursor *tcur);
- /**
- * Updates an externally managed TuioCursor
- *
- * @param tcur the TuioCursor to update
- */
- void updateExternalTuioCursor(TuioCursor *tcur);
- /**
- * Removes an externally managed TuioCursor from the TuioServer's internal list of TuioCursor
- * The referenced TuioCursor is not deleted
- *
- * @param tcur the TuioCursor to remove
- */
- void removeExternalTuioCursor(TuioCursor *tcur);
-
- /**
- * Initializes a new frame with the given TuioTime
- *
- * @param ttime the frame time
- */
- void initFrame(TuioTime ttime);
-
- /**
- * Commits the current frame.
- * Generates and sends TUIO messages of all currently active and updated TuioObjects and TuioCursors.
- */
- void commitFrame();
- /**
- * Returns the next available Session ID for external use.
- * @return the next available Session ID for external use
- */
- long getSessionID();
- /**
- * Returns the current frame ID for external use.
- * @return the current frame ID for external use
- */
- long getFrameID();
-
- /**
- * Returns the current frame ID for external use.
- * @return the current frame ID for external use
- */
- TuioTime getFrameTime();
- /**
- * Generates and sends TUIO messages of all currently active TuioObjects and TuioCursors.
- */
- void sendFullMessages();
- /**
- * Disables the periodic full update of all currently active TuioObjects and TuioCursors
- *
- * @param interval update interval in seconds, defaults to one second
- */
- void enablePeriodicMessages(int interval=1);
- /**
- * Disables the periodic full update of all currently active and inactive TuioObjects and TuioCursors
- */
- void disablePeriodicMessages();
- /**
- * Enables the full update of all currently active and inactive TuioObjects and TuioCursors
- *
- */
- void enableFullUpdate() {
- full_update = true;
- }
-
- /**
- * Disables the full update of all currently active and inactive TuioObjects and TuioCursors
- */
- void disableFullUpdate() {
- full_update = false;
- }
-
- /**
- * Returns true if the periodic full update of all currently active TuioObjects and TuioCursors is enabled.
- * @return true if the periodic full update of all currently active TuioObjects and TuioCursors is enabled
- */
- bool periodicMessagesEnabled() {
- return periodic_update;
- }
-
- /**
- * Returns the periodic update interval in seconds.
- * @return the periodic update interval in seconds
- */
- int getUpdateInterval() {
- return update_interval;
- }
-
- /**
- * Returns a List of all currently inactive TuioObjects
- *
- * @return a List of all currently inactive TuioObjects
- */
- std::list<TuioObject*> getUntouchedObjects();
- /**
- * Returns a List of all currently inactive TuioCursors
- *
- * @return a List of all currently inactive TuioCursors
- */
- std::list<TuioCursor*> getUntouchedCursors();
-
- /**
- * Calculates speed and acceleration values for all currently inactive TuioObjects
- */
- void stopUntouchedMovingObjects();
- /**
- * Calculates speed and acceleration values for all currently inactive TuioCursors
- */
- void stopUntouchedMovingCursors();
-
- /**
- * Removes all currently inactive TuioObjects from the TuioServer's internal list of TuioObjects
- */
- void removeUntouchedStoppedObjects();
- /**
- * Removes all currently inactive TuioCursors from the TuioServer's internal list of TuioCursors
- */
- void removeUntouchedStoppedCursors();
- /**
- * Returns a List of all currently active TuioObjects
- *
- * @return a List of all currently active TuioObjects
- */
- std::list<TuioObject*> getTuioObjects();
-
-
- /**
- * Returns a List of all currently active TuioCursors
- *
- * @return a List of all currently active TuioCursors
- */
- std::list<TuioCursor*> getTuioCursors();
-
- /**
- * Returns the TuioObject corresponding to the provided Session ID
- * or NULL if the Session ID does not refer to an active TuioObject
- *
- * @return an active TuioObject corresponding to the provided Session ID or NULL
- */
- TuioObject* getTuioObject(long s_id);
-
- /**
- * Returns the TuioCursor corresponding to the provided Session ID
- * or NULL if the Session ID does not refer to an active TuioCursor
- *
- * @return an active TuioCursor corresponding to the provided Session ID or NULL
- */
- TuioCursor* getTuioCursor(long s_id);
- /**
- * Returns the TuioObject closest to the provided coordinates
- * or NULL if there isn't any active TuioObject
- *
- * @return the closest TuioObject to the provided coordinates or NULL
- */
- TuioObject* getClosestTuioObject(float xp, float yp);
-
- /**
- * Returns the TuioCursor closest to the provided coordinates
- * or NULL if there isn't any active TuioCursor
- *
- * @return the closest TuioCursor corresponding to the provided coordinates or NULL
- */
- TuioCursor* getClosestTuioCursor(float xp, float yp);
-
- /**
- * Returns true if this TuioServer is currently connected.
- * @return true if this TuioServer is currently connected
- */
- bool isConnected() { return connected; }
-
- /**
- * The TuioServer prints verbose TUIO event messages to the console if set to true.
- * @param verbose verbose message output if set to true
- */
- void setVerbose(bool verbose) { this->verbose=verbose; }
-
- private:
- std::list<TuioObject*> objectList;
- std::list<TuioCursor*> cursorList;
-
- int maxCursorID;
- std::list<TuioCursor*> freeCursorList;
- std::list<TuioCursor*> freeCursorBuffer;
-
- UdpTransmitSocket *socket;
- osc::OutboundPacketStream *oscPacket;
- char *oscBuffer;
- osc::OutboundPacketStream *fullPacket;
- char *fullBuffer;
-
- void initialize(const char *host, int port, int size);
- void sendEmptyCursorBundle();
- void startCursorBundle();
- void addCursorMessage(TuioCursor *tcur);
- void sendCursorBundle(long fseq);
-
- void sendEmptyObjectBundle();
- void startObjectBundle();
- void addObjectMessage(TuioObject *tobj);
- void sendObjectBundle(long fseq);
-
- bool full_update;
- int update_interval;
- bool periodic_update;
- long currentFrame;
- TuioTime currentFrameTime;
- bool updateObject, updateCursor;
- long lastCursorUpdate, lastObjectUpdate;
- long sessionID;
- bool verbose;
- #ifndef WIN32
- pthread_t thread;
- #else
- HANDLE thread;
- #endif
- bool connected;
- };
- };
- #endif /* INCLUDED_TuioServer_H */
|