middleware/src/Communication/TuioServer.cs
author bastiena
Thu, 15 Mar 2012 13:33:21 +0100
changeset 3 92f19af39024
parent 0 6fefd4afe506
permissions -rw-r--r--
Middleware : Swipe & Push & Jump(Experimental) Detectors ant events added Server modified for gesture detection TUIO Server C# Modified : Hand cursors redirected to /TUIO/3DCur channel New kind of OSC message created (TuioString) for gesture detection, using /TUIO/_siP channel. TUIO Processing Java Modified : Hand cursors redirected to /TUIO/3DCur channel New kind of OSC message created (TuioString) for gesture detection, using /TUIO/_siP channel. Front Processing : Mask added and modifications in the drawing process New front for gesture detection (just showing a text message in the mask for the moment)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     1
using System;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     2
using System.Collections.Generic;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     3
using System.Drawing;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     4
using System.Linq;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     5
using System.Net;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     6
using System.Text;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     7
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     8
using Bespoke.Common.Osc;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
     9
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    10
namespace Tuio
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    11
{
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    12
    /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    13
    /// Simple, still uncomplete implementation of a TUIO server in C#.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    14
    /// 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    15
    /// Current shortcomings:
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    16
    /// Object support missing.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    17
    /// Does not implement frame times.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    18
    /// Only supports external TUIO cursors.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    19
    /// Allways commits all cursors.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    20
    /// 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    21
    /// (c) 2010 by Dominik Schmidt (schmidtd@comp.lancs.ac.uk)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    22
    /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    23
    public class TuioServer
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    24
    {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    25
        #region constants
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    26
        
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    27
        private const string _cursorAddressPattern = "/tuio/2Dcur";
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    28
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    29
        private const string _objectAddressPattern = "/tuio/2Dobj"; 
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    30
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    31
        #endregion
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    32
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    33
        #region fields
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    34
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    35
        private IPEndPoint _ipEndPoint;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    36
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    37
        private Dictionary<int, TuioCursor> _cursors;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    38
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    39
        private int _currentFrame;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    40
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    41
        #endregion
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    42
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    43
        #region constructors
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    44
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    45
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    46
        /// Creates a new server with and endpoint at localhost, port 3333.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    47
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    48
        public TuioServer() : this("127.0.0.1", 3333) { }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    49
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    50
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    51
        /// Creates a new server.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    52
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    53
        /// <param name="host">Endpoint host</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    54
        /// <param name="port">Endpoint port</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    55
        public TuioServer(string host, int port)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    56
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    57
            _cursors = new Dictionary<int, TuioCursor>();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    58
            _ipEndPoint = new IPEndPoint(IPAddress.Parse(host), port);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    59
            _currentFrame = 0;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    60
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    61
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    62
        #endregion
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    63
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    64
        #region frame related methods
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    65
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    66
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    67
        /// Initialized a new frame and increases the frame counter.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    68
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    69
        public void InitFrame()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    70
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    71
            _currentFrame++;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    72
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    73
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    74
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    75
        /// Commits the current frame.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    76
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    77
        public void CommitFrame()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    78
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    79
            GetFrameBundle().Send(_ipEndPoint);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    80
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    81
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    82
        #endregion
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    83
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    84
        #region cursor related methods
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    85
        
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    86
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    87
        /// Adds a TUIO cursor. A new id, not used before, must be provided.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    88
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    89
        /// <param name="id">New id</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    90
        /// <param name="location">Location</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    91
        public void AddTuioCursor(int id, PointF location)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    92
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    93
            lock(_cursors)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    94
                if(!_cursors.ContainsKey(id))
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    95
                    _cursors.Add(id, new TuioCursor(id, location));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    96
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    97
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    98
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
    99
        /// Updates a TUIO cursor. An id of an existing cursor must be provided.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   100
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   101
        /// <param name="id">Id</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   102
        /// <param name="location">Location</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   103
        public void UpdateTuioCursor(int id, PointF location)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   104
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   105
            TuioCursor cursor;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   106
            if(_cursors.TryGetValue(id, out cursor))
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   107
                cursor.Location = location;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   108
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   109
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   110
        /// <summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   111
        /// Deletes a TUIO cursor. An id of an existing cursor must be provided.
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   112
        /// </summary>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   113
        /// <param name="id">Id</param>
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   114
        public void DeleteTuioCursor(int id)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   115
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   116
            lock (_cursors)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   117
                _cursors.Remove(id);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   118
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   119
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   120
        #endregion
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   121
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   122
        #region osc message assembly
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   123
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   124
        private OscBundle GetFrameBundle()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   125
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   126
            OscBundle bundle = new OscBundle(_ipEndPoint);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   127
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   128
            bundle.Append(GetAliveMessage());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   129
            foreach (OscMessage msg in GetCursorMessages())
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   130
                bundle.Append(msg);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   131
            bundle.Append(GetSequenceMessage());
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   132
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   133
            return bundle;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   134
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   135
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   136
        private OscMessage GetAliveMessage()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   137
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   138
            OscMessage msg = new OscMessage(_ipEndPoint, _cursorAddressPattern);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   139
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   140
            msg.Append("alive");
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   141
            lock (_cursors)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   142
                foreach (TuioCursor cursor in _cursors.Values)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   143
                    msg.Append((Int32)cursor.Id);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   144
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   145
            return msg;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   146
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   147
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   148
        private OscMessage GetSequenceMessage()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   149
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   150
            OscMessage msg = new OscMessage(_ipEndPoint, _cursorAddressPattern);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   151
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   152
            msg.Append("fseq");
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   153
            msg.Append((Int32)_currentFrame);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   154
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   155
            return msg;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   156
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   157
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   158
        private OscMessage GetCursorMessage(TuioCursor cursor)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   159
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   160
            OscMessage msg = new OscMessage(_ipEndPoint, _cursorAddressPattern);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   161
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   162
            msg.Append("set");
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   163
            msg.Append((Int32)cursor.Id);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   164
            msg.Append(cursor.Location.X);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   165
            msg.Append(cursor.Location.Y);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   166
            msg.Append(cursor.Speed.X);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   167
            msg.Append(cursor.Speed.Y);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   168
            msg.Append(cursor.MotionAcceleration);
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   169
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   170
            return msg;
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   171
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   172
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   173
        private IEnumerable<OscMessage> GetCursorMessages()
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   174
        {
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   175
            List<OscMessage> msgs = new List<OscMessage>();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   176
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   177
            lock (_cursors)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   178
                foreach (TuioCursor cursor in _cursors.Values)
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   179
                    msgs.Add(GetCursorMessage(cursor));
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   180
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   181
            return msgs.AsEnumerable();
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   182
        }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   183
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   184
        #endregion
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   185
    }
6fefd4afe506 First Import
bastiena
parents:
diff changeset
   186
}