/* TUIO Server Component - part of the reacTIVision project http://reactivision.sourceforge.net/ Copyright (c) 2005-2009 Martin Kaltenbrunner 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 #include #else #include #endif #include #include #include #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 { /** *

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.

*

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.

*

* TuioClient *server = new TuioServer();
* ...
* server->initFrame(TuioTime::getSessionTime());
* TuioObject *tobj = server->addTuioObject(xpos,ypos, angle);
* TuioCursor *tcur = server->addTuioObject(xpos,ypos);
* server->commitFrame();
* ...
* server->initFrame(TuioTime::getSessionTime());
* server->updateTuioObject(tobj, xpos,ypos, angle);
* server->updateTuioCursor(tcur, xpos,ypos);
* server->commitFrame();
* ...
* server->initFrame(TuioTime::getSessionTime());
* server->removeTuioObject(tobj);
* server->removeTuioCursor(tcur);
* server->commitFrame();
*

* * @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 getUntouchedObjects(); /** * Returns a List of all currently inactive TuioCursors * * @return a List of all currently inactive TuioCursors */ std::list 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 getTuioObjects(); /** * Returns a List of all currently active TuioCursors * * @return a List of all currently active TuioCursors */ std::list 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 objectList; std::list cursorList; int maxCursorID; std::list freeCursorList; std::list 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 */