Changeset 571


Ignore:
Timestamp:
06/09/11 11:54:12 (12 months ago)
Author:
mschlatt
Message:

Modified MT-interface (Users added, now receiving Kinect Messages)

Location:
trunk/avango-display
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/avango-display/include/avango/display/mt/MultitouchDevice.h

    r567 r571  
    4343    namespace mt 
    4444    { 
    45       class AV_DISPLAY_MT_DLL MultitouchDevice : public FieldContainer, public FingerListener 
     45      class AV_DISPLAY_MT_DLL MultitouchDevice : public FieldContainer, public FingerListener, public UserListener 
    4646      { 
    4747        AV_FC_DECLARE(); 
     
    5656        MFMultitouchFinger Removed; 
    5757 
     58                MFMultitouchUser AddedUsers; 
     59        MFMultitouchUser AvailableUsers; 
     60        MFMultitouchUser RemovedUsers; 
     61 
    5862        SFFloat TimeIn; 
    5963 
     
    6165        SFInt FilterSize; 
    6266 
     67                void handleFingers(); 
     68                void handleUsers(); 
    6369        /* virtual */ void evaluate(); 
    6470 
     
    6874        void fingerRemoved(FingerInfo *pFingerInfo); 
    6975 
     76                // FingerListener interface 
     77        void userAdded(UserInfo *pUserInfo); 
     78        void userMoved(UserInfo *pUserInfo); 
     79        void userRemoved(UserInfo *pUserInfo); 
     80 
    7081      private: 
     82 
     83                void processMessages(std::queue< std::pair< FingerClient::MyMessage, int > > &messages); 
    7184 
    7285        FingerClient *mFingerClient; 
     
    7689          bool do_move; 
    7790          bool do_remove; 
    78           int finger_id; 
     91          int finger_id, user_id; 
    7992          Vec2 position; 
    8093                  float angle, width, height, area; 
    8194          Link<MultitouchFinger> finger; 
    82           FingerAction(int _finger_id = -1) : do_add(false), do_move(false), do_remove(false), finger_id(_finger_id) 
     95          FingerAction(int _finger_id = -1) : do_add(false), do_move(false), do_remove(false), finger_id(_finger_id), user_id(-1) 
     96          { 
     97          } 
     98        }; 
     99                struct UserAction 
     100        { 
     101          bool do_add; 
     102          bool do_move; 
     103          bool do_remove; 
     104          int user_id; 
     105          Link<MultitouchUser> user; 
     106          UserAction(int _user_id = -1) : do_add(false), do_move(false), do_remove(false), user_id(_user_id) 
    83107          { 
    84108          } 
    85109        }; 
    86110        typedef std::map<int, FingerAction> FingerMap; 
     111                typedef std::map<int, UserAction> UserMap; 
    87112        FingerMap mFingerMap; 
     113                UserMap mUserMap; 
    88114        boost::mutex mMutex; 
     115                int mOriginalPort, mReceivedPort; 
     116                double mReceivedPortTime; 
    89117      }; 
    90118    } 
  • trunk/avango-display/include/avango/display/mt/MultitouchFinger.h

    r567 r571  
    4444 
    4545      public: 
    46         MultitouchFinger(int _id = -1, OsgVec2 _position = OsgVec2(), float _creationTime= 0.0, float _angle = 0.0, float _width = 0.0, float _height = 0.0, float _area = 0.0); 
     46        MultitouchFinger(int _id = -1, OsgVec2 _position = OsgVec2(), float _creationTime= 0.0, float _angle = 0.0, float _width = 0.0, float _height = 0.0, float _area = 0.0, int _user_id = -1); 
    4747        virtual ~MultitouchFinger(); 
    4848 
    49         av::SFInt Identifier; 
     49        av::SFInt Identifier, UserID; 
    5050        av::osg::SFVec2 Position; 
    5151                av::SFFloat Angle, Width, Height, Area; 
     
    5656      typedef SingleField<Link<MultitouchFinger> > SFMultitouchFinger; 
    5757      typedef MultiField<Link<MultitouchFinger> > MFMultitouchFinger; 
     58 
     59 
     60          class AV_DISPLAY_MT_DLL MultitouchUser : public FieldContainer 
     61      { 
     62        AV_FC_DECLARE(); 
     63 
     64      public: 
     65        MultitouchUser(int _id = -1, float _creationTime= 0.0); 
     66        virtual ~MultitouchUser(); 
     67 
     68        av::SFInt Identifier; 
     69        av::SFFloat CreationTime; 
     70 
     71      }; 
     72 
     73      typedef SingleField<Link<MultitouchUser> > SFMultitouchUser; 
     74      typedef MultiField<Link<MultitouchUser> > MFMultitouchUser; 
    5875    } 
    5976  } 
     
    6279template class AV_DISPLAY_MT_DLL SingleField<Link<display::mt::MultitouchFinger> >; 
    6380template class AV_DISPLAY_MT_DLL MultiField<Link<display::mt::MultitouchFinger> >; 
     81 
     82template class AV_DISPLAY_MT_DLL SingleField<Link<display::mt::MultitouchUser> >; 
     83template class AV_DISPLAY_MT_DLL MultiField<Link<display::mt::MultitouchUser> >; 
    6484#endif 
    6585} 
  • trunk/avango-display/src/avango/display/mt/MultitouchDevice.cpp

    r567 r571  
    3939AV_FC_DEFINE(av::display::mt::MultitouchDevice); 
    4040 
    41 av::display::mt::MultitouchDevice::MultitouchDevice() 
     41av::display::mt::MultitouchDevice::MultitouchDevice() : mOriginalPort(3333), mReceivedPort(mOriginalPort), mReceivedPortTime(timeGetTime()) 
    4242{ 
    4343  AV_FC_ADD_FIELD(Added, MFMultitouchFinger::ContainerType()); 
     
    4848  AV_FC_ADD_FIELD(TimeIn, 0.0); 
    4949 
    50   mFingerClient = new FingerClient(3333); 
     50  mFingerClient = new FingerClient(mOriginalPort); 
    5151 
    5252  if (mFingerClient) 
    5353  { 
    5454    mFingerClient->registerFingerListener(this); 
     55        mFingerClient->registerUserListener(this); 
    5556 
    5657    alwaysEvaluate(true); 
     
    7475} 
    7576 
    76 /* virtual */ void 
    77 av::display::mt::MultitouchDevice::evaluate() 
    78 { 
    79   boost::mutex::scoped_lock mLock(mMutex); 
    80  
     77void 
     78av::display::mt::MultitouchDevice::processMessages(std::queue< std::pair< FingerClient::MyMessage, int > > &messages) 
     79{ 
     80        while(!messages.empty()) 
     81        { 
     82                std::pair< FingerClient::MyMessage, int > message = messages.front(); 
     83                messages.pop(); 
     84                switch(message.first) 
     85                { 
     86                case FingerClient::MYMESS_SET_PORT: 
     87                        mReceivedPort = message.second; 
     88                        mReceivedPortTime = timeGetTime(); 
     89                    break; 
     90                default: 
     91                        //todo: messages pushen 
     92                        break; 
     93                }; 
     94        } 
     95} 
     96 
     97void 
     98av::display::mt::MultitouchDevice::handleFingers() 
     99{ 
    81100  mFingerClient->setPositionHistorySize(FilterSize.getValue()); 
    82101 
     
    110129    if (action.do_add) 
    111130    { 
    112       action.finger = new MultitouchFinger(action.finger_id, ::osg::Vec2(action.position.x, action.position.y), time, action.angle, action.width, action.height, action.area); 
     131      action.finger = new MultitouchFinger(action.finger_id, ::osg::Vec2(action.position.x, action.position.y), time, action.angle, action.width, action.height, action.area, action.user_id); 
    113132      Added.add1Value(action.finger); 
    114133      action.do_add = false; 
     
    121140          action.finger->Height.setValue(action.height); 
    122141          action.finger->Area.setValue(action.area); 
     142          action.finger->UserID.setValue(action.user_id); 
    123143      action.do_move = false; 
    124144    } 
     
    130150          action.finger->Height.setValue(action.height); 
    131151          action.finger->Area.setValue(action.area); 
     152          action.finger->UserID.setValue(action.user_id); 
    132153      Available.remove1Value(action.finger); 
    133154      Removed.add1Value(action.finger); 
     
    138159    ++iter; 
    139160  } 
     161} 
     162 
     163void 
     164av::display::mt::MultitouchDevice::handleUsers() 
     165{ 
     166  if (!AddedUsers.getValue().empty()) 
     167  { 
     168    // hand over to Available 
     169    MFMultitouchUser::ContainerType::const_iterator iter = AddedUsers.getValue().begin(); 
     170    MFMultitouchUser::ContainerType::const_iterator iter_end = AddedUsers.getValue().end(); 
     171    for (; iter != iter_end; ++iter) 
     172      AvailableUsers.add1Value(*iter); 
     173 
     174    // clear Added 
     175    AddedUsers.setValue(MFMultitouchUser::ContainerType()); 
     176  } 
     177 
     178  if (!RemovedUsers.getValue().empty()) 
     179  { 
     180    // clear removed 
     181    RemovedUsers.setValue(MFMultitouchUser::ContainerType()); 
     182  } 
     183 
     184  UserMap::iterator iter = mUserMap.begin(); 
     185  UserMap::iterator iter_end = mUserMap.end(); 
     186 
     187  float time = TimeIn.getValue(); 
     188 
     189  while (iter != iter_end) 
     190  { 
     191    UserAction &action = iter->second; 
     192    if (action.do_add) 
     193    { 
     194      action.user = new MultitouchUser(action.user_id, time); 
     195      AddedUsers.add1Value(action.user); 
     196      action.do_add = false; 
     197    } 
     198    else if (action.do_move) 
     199    { 
     200      action.do_move = false; 
     201    } 
     202    else if (action.do_remove) 
     203    { 
     204      AvailableUsers.remove1Value(action.user); 
     205      RemovedUsers.add1Value(action.user); 
     206      mUserMap.erase(iter++); 
     207      action.do_remove = false; 
     208      continue; 
     209    } 
     210    ++iter; 
     211  } 
     212} 
     213 
     214/* virtual */ void 
     215av::display::mt::MultitouchDevice::evaluate() 
     216{ 
     217  boost::mutex::scoped_lock mLock(mMutex); 
     218 
     219  processMessages(mFingerClient->getMessages()); 
     220 
     221  if(mFingerClient->getPort() != mOriginalPort && (timeGetTime() - mReceivedPortTime) > 500.0) 
     222        mReceivedPort = mOriginalPort; 
     223 
     224  if(mReceivedPort != mFingerClient->getPort()) 
     225  { 
     226          if (mFingerClient) 
     227                delete mFingerClient; 
     228          mFingerClient = new FingerClient(mReceivedPort); 
     229          if (mFingerClient) 
     230          { 
     231                mFingerClient->registerFingerListener(this); 
     232                mFingerClient->registerUserListener(this); 
     233          } 
     234  }  
     235 
     236  handleFingers(); 
     237  handleUsers(); 
    140238} 
    141239 
     
    158256        action.height = pFingerInfo->getHeight(); 
    159257        action.area = pFingerInfo->getArea(); 
     258        action.user_id = pFingerInfo->getUserId(); 
    160259    action.do_add = true; 
    161260  } 
     
    176275        action.height = pFingerInfo->getHeight(); 
    177276        action.area = pFingerInfo->getArea(); 
     277        action.user_id = pFingerInfo->getUserId(); 
    178278    action.do_move = true; 
    179279  } 
     
    200300          action.height = pFingerInfo->getHeight(); 
    201301          action.area = pFingerInfo->getArea(); 
     302          action.user_id = pFingerInfo->getUserId(); 
    202303      action.do_remove = true; 
    203304    } 
    204305  } 
    205306} 
     307 
     308void 
     309av::display::mt::MultitouchDevice::userAdded(UserInfo *pUserInfo) 
     310{ 
     311  boost::mutex::scoped_lock mLock(mMutex); 
     312  // FIXME: Between two frames (evaluate() calls), it can happen, that a finger id 
     313  // is added again, before the former one was removed completely. 
     314  // In this case this id is ignored. 
     315  const int user_id = pUserInfo->getUserId(); 
     316  UserMap::iterator iter = mUserMap.find(user_id); 
     317  if (iter == mUserMap.end()) 
     318  { 
     319    iter = mUserMap.insert(UserMap::value_type(user_id, UserAction(user_id))).first; 
     320    UserAction &action = iter->second; 
     321    action.do_add = true; 
     322  } 
     323} 
     324 
     325void 
     326av::display::mt::MultitouchDevice::userMoved(UserInfo *pUserInfo) 
     327{ 
     328  boost::mutex::scoped_lock mLock(mMutex); 
     329  const int user_id = pUserInfo->getUserId(); 
     330  UserMap::iterator iter = mUserMap.find(user_id); 
     331  if (iter != mUserMap.end()) 
     332  { 
     333    UserAction &action = iter->second; 
     334    action.do_move = true; 
     335  } 
     336} 
     337 
     338void 
     339av::display::mt::MultitouchDevice::userRemoved(UserInfo *pUserInfo) 
     340{ 
     341  boost::mutex::scoped_lock mLock(mMutex); 
     342  const int user_id = pUserInfo->getUserId(); 
     343  UserMap::iterator iter = mUserMap.find(user_id); 
     344  if (iter != mUserMap.end()) 
     345  { 
     346    UserAction &action = iter->second; 
     347    if (action.do_add) 
     348      // Avango should not see fingers that are deleted before being added officially, so we delete them here directly 
     349      mUserMap.erase(iter); 
     350    else 
     351    { 
     352      action.do_remove = true; 
     353    } 
     354  } 
     355} 
  • trunk/avango-display/src/avango/display/mt/MultitouchFinger.cpp

    r567 r571  
    3838AV_FIELD_DEFINE(av::display::mt::MFMultitouchFinger); 
    3939 
    40 av::display::mt::MultitouchFinger::MultitouchFinger(int _id, ::osg::Vec2 _position, float _creationTime, float _angle, float _width, float _height, float _area) 
     40av::display::mt::MultitouchFinger::MultitouchFinger(int _id, ::osg::Vec2 _position, float _creationTime, float _angle, float _width, float _height, float _area, int _user_id) 
    4141{ 
    4242  AV_FC_ADD_FIELD(Identifier, _id); 
     
    4747  AV_FC_ADD_FIELD(Height, _height); 
    4848  AV_FC_ADD_FIELD(Area, _area); 
     49  AV_FC_ADD_FIELD(UserID, _user_id); 
    4950} 
    5051 
     
    6566  } 
    6667} 
     68 
     69 
     70AV_FC_DEFINE(av::display::mt::MultitouchUser); 
     71 
     72AV_FIELD_DEFINE(av::display::mt::SFMultitouchUser); 
     73AV_FIELD_DEFINE(av::display::mt::MFMultitouchUser); 
     74 
     75av::display::mt::MultitouchUser::MultitouchUser(int _id, float _creationTime) 
     76{ 
     77  AV_FC_ADD_FIELD(Identifier, _id); 
     78  AV_FC_ADD_FIELD(CreationTime, _creationTime); 
     79} 
     80 
     81av::display::mt::MultitouchUser::~MultitouchUser() 
     82{} 
     83 
     84void 
     85av::display::mt::MultitouchUser::initClass() 
     86{ 
     87  if (!isTypeInitialized()) 
     88  { 
     89    av::FieldContainer::initClass(); 
     90 
     91    AV_FC_INIT(av::FieldContainer, av::display::mt::MultitouchUser, true); 
     92 
     93    SFMultitouchFinger::initClass("av::display::mt::SFMultitouchUser", "av::Field"); 
     94    MFMultitouchFinger::initClass("av::display::mt::MFMultitouchUser", "av::Field"); 
     95  } 
     96} 
  • trunk/avango-display/src/avango/display/mt/multitouch/FingerClient.cpp

    r567 r571  
    1414 
    1515 
    16 FingerClient::FingerClient(int port) : fingerlistener(0), historysize(0), current_fseq(0) 
    17 { 
     16FingerClient::FingerClient(int port) : fingerlistener(0), historysize(0), mPort(port) 
     17{ 
     18  address_patterns.push_back("/tuio/2Dcur"); 
     19  address_patterns.push_back("/tuio/2Dobj"); 
     20  address_patterns.push_back("/tuio/2Dblb"); 
     21  address_patterns.push_back("/tuio/_kinect"); 
     22  current_fseqs.resize(address_patterns.size(), 0); 
     23 
    1824  socket = 0; 
    1925  try 
     
    5561} 
    5662 
     63void FingerClient::registerUserListener(UserListener *listener) 
     64{ 
     65  boost::mutex::scoped_lock lock(mutex); 
     66  userlistener = listener; 
     67} 
     68 
    5769void 
    5870FingerClient::setPositionHistorySize(unsigned int size) 
     
    8193FingerClient::ProcessBundle(const osc::ReceivedBundle &bundle, const IpEndpointName &remoteEndpoint) 
    8294{ 
    83   osc::int32 fseq = current_fseq; 
     95  osc::int32 fseq = 0; 
     96  int pattern = -1; 
    8497 
    8598  osc::ReceivedBundle::const_iterator iter = bundle.ElementsBegin(); 
    8699  osc::ReceivedBundle::const_iterator iter_end = bundle.ElementsEnd(); 
    87100 
     101  //std::cout << "Received Bundle" << std::endl; 
    88102  // find fseq 
    89103  for (; iter != iter_end; ++iter) 
     
    97111        osc::ReceivedMessageArgumentStream args = message.ArgumentStream(); 
    98112 
    99         if (strcmp(message.AddressPattern(), "/tuio/2Dcur") == 0 
    100                         || strcmp(message.AddressPattern(), "/tuio/2Dobj") == 0 
    101                         || strcmp(message.AddressPattern(), "/tuio/2Dblb") == 0) 
     113                { 
     114                        osc::ReceivedMessageArgumentStream args2 = message.ArgumentStream(); 
     115                        //std::cout << message.AddressPattern() << " "; 
     116 
     117                        if (!args2.Eos()) 
     118                        { 
     119                                const char *cmd; 
     120                                args2 >> cmd; 
     121                                //std::cout << cmd; 
     122                        } 
     123                        //args2 >> osc::EndMessage; 
     124                } 
     125                //std::cout << std::endl; 
     126 
     127                for(unsigned int i = 0; i < address_patterns.size(); ++i) 
     128                { 
     129                        if (strcmp(message.AddressPattern(), address_patterns[i].data()) == 0) 
     130                        { 
     131                          pattern = (int)i; 
     132                          const char *cmd; 
     133                          args >> cmd; 
     134 
     135                          if (strcmp(cmd, "fseq") == 0) 
     136                                args >> fseq >> osc::EndMessage; 
     137                        } 
     138                } 
     139      } 
     140      catch (osc::Exception &e) 
     141      { 
     142        logger.error() << "Error while parsing TUIO message: " << e.what(); 
     143      } 
     144    } 
     145  } 
     146 
     147  if (pattern >= 0) 
     148  { 
     149          // if fseq is negative, then reset current_fseq to 0 
     150          if (fseq < 0) 
     151                current_fseqs[pattern] = fseq = 0; 
     152 
     153          if (fseq >= current_fseqs[pattern]) 
     154          { 
     155                current_fseqs[pattern] = fseq; 
     156 
     157                // process other messages 
     158                iter = bundle.ElementsBegin(); 
     159                for (; iter != iter_end; ++iter) 
     160                { 
     161                  osc::ReceivedBundleElement element = *iter; 
     162                  if (iter->IsBundle()) 
     163                        ProcessBundle(osc::ReceivedBundle(element), remoteEndpoint); 
     164                  else 
     165                  { 
     166                        try 
     167                        { 
     168                          ProcessMessage(osc::ReceivedMessage(element), remoteEndpoint); 
     169                        } 
     170                        catch (osc::Exception &e) 
     171                        { 
     172                          logger.error() << "Error while parsing TUIO message: " << e.what(); 
     173                        } 
     174                  } 
     175                } 
     176          } 
     177  } 
     178} 
     179 
     180osc::int32 
     181FingerClient::getUserIdForFinger(osc::int32 s_id) 
     182{ 
     183        for(std::map<osc::int32, UserInfo*>::iterator it = uid_map.begin(); it != uid_map.end(); ++it) 
     184        { 
     185                std::set< int >::iterator itID = it->second->FingerIds().find(s_id); 
     186                if(itID != it->second->FingerIds().end()) 
     187                        return *itID; 
     188        } 
     189        return -1; 
     190} 
     191 
     192void 
     193FingerClient::addUserIdToFinger(osc::int32 u_id, osc::int32 s_id) 
     194{ 
     195  std::map<osc::int32, FingerInfo*>::iterator iter = cursor_id_map.find(s_id); 
     196  if (iter != cursor_id_map.end()) 
     197  { 
     198    FingerInfo *fingerinfo = iter->second; 
     199 
     200        /*if(fingerinfo->getUserId() != u_id) 
     201                std::cout << "Finger " << s_id << " switch from user " << fingerinfo->getUserId() << " to " << u_id << std::endl;*/ 
     202 
     203        fingerinfo->setUserId(u_id); 
     204      { 
     205                FingerListener *fingerlistener_secure; 
     206                { 
     207                        boost::mutex::scoped_lock lock(mutex); 
     208                        fingerlistener_secure = fingerlistener; 
     209                } 
     210                if (fingerlistener_secure) 
     211                        fingerlistener_secure->fingerMoved(fingerinfo); 
     212      } 
     213  } 
     214} 
     215 
     216void 
     217FingerClient::removeUserIdFromFinger(osc::int32 s_id) 
     218{ 
     219  std::map<osc::int32, FingerInfo*>::iterator iter = cursor_id_map.find(s_id); 
     220  if (iter != cursor_id_map.end()) 
     221  { 
     222    FingerInfo *fingerinfo = iter->second; 
     223        /*if(fingerinfo->getUserId() != -1) 
     224                std::cout << "Finger " << s_id << " switch from user " << fingerinfo->getUserId() << " to " << -1 << std::endl;*/ 
     225        fingerinfo->setUserId(-1); 
     226 
     227      { 
     228        FingerListener *fingerlistener_secure; 
     229                { 
     230                        boost::mutex::scoped_lock lock(mutex); 
     231                        fingerlistener_secure = fingerlistener; 
     232                } 
     233                if (fingerlistener_secure) 
     234                        fingerlistener_secure->fingerMoved(fingerinfo); 
     235      } 
     236  } 
     237} 
     238void 
     239FingerClient::ProcessKinectMessage(const osc::ReceivedMessage &message, const IpEndpointName &remoteEndpoint) 
     240{ 
     241        osc::ReceivedMessageArgumentStream args = message.ArgumentStream(); 
     242 
     243        const char *cmd; 
     244        args >> cmd; 
     245 
     246        //std::cout << message.AddressPattern(); 
     247 
     248        if (strcmp(cmd, "set") == 0) 
     249    { 
     250          //std::cout << " set"; 
     251          static osc::int32 u_id; 
     252          std::set< int > finger_ids; 
     253 
     254          args >> u_id; 
     255          //std::cout << " U" << u_id; 
     256 
     257          osc::int32 s_id; 
     258      while (!args.Eos()) { 
     259        args >> s_id; 
     260                //std::cout << " F" << s_id; 
     261        finger_ids.insert(s_id); 
     262      } 
     263      args >> osc::EndMessage; 
     264          //std::cout << std::endl; 
     265 
     266      std::map<osc::int32, UserInfo*>::iterator iter = uid_map.find(u_id); 
     267      if (iter == uid_map.end()) 
     268      { 
     269        UserInfo *userinfo = new UserInfo(u_id); 
     270        if (userinfo) 
    102271        { 
    103           const char *cmd; 
    104           args >> cmd; 
    105  
    106           if (strcmp(cmd, "fseq") == 0) 
    107             args >> fseq >> osc::EndMessage; 
     272                  userinfo->FingerIds() = finger_ids; 
     273                  for(std::set< int >::iterator it = finger_ids.begin(), end = finger_ids.end(); it != end; ++it) 
     274                        addUserIdToFinger(u_id, *it); 
     275 
     276          uid_map[u_id] = userinfo; 
     277          alive_uids.insert(u_id); 
     278 
     279                  UserListener *userlistener_secure; 
     280                  { 
     281                          boost::mutex::scoped_lock lock(mutex); 
     282                          userlistener_secure = userlistener; 
     283                  } 
     284                  if (userlistener_secure) 
     285                          userlistener_secure->userAdded(userinfo); 
    108286        } 
    109287      } 
    110       catch (osc::Exception &e) 
    111       { 
    112         logger.error() << "Error while parsing TUIO message: " << e.what(); 
    113       } 
    114     } 
    115   } 
    116  
    117   // if fseq is negative, then reset current_fseq to 0 
    118   if (fseq < 0) 
    119     current_fseq = fseq = 0; 
    120  
    121   if (fseq >= current_fseq) 
    122   { 
    123     current_fseq = fseq; 
    124  
    125     // process other messages 
    126     iter = bundle.ElementsBegin(); 
    127     for (; iter != iter_end; ++iter) 
    128     { 
    129       osc::ReceivedBundleElement element = *iter; 
    130       if (iter->IsBundle()) 
    131         ProcessBundle(osc::ReceivedBundle(element), remoteEndpoint); 
    132288      else 
    133289      { 
    134         try 
     290                int changed = false; 
     291        UserInfo *userinfo = iter->second; 
     292         
     293                std::set< int > &fIds = userinfo->FingerIds(); 
     294 
     295                // add new fingers 
     296                for(std::set< int >::iterator it = finger_ids.begin(), end = finger_ids.end(); it != end; ++it) 
     297                { 
     298                        if(fIds.insert(*it).second) 
     299                        { 
     300                                addUserIdToFinger(u_id, *it); 
     301                                //std::cout << "User ID " << u_id << " added to finger " << *it << std::endl; 
     302                                changed = true; 
     303                        } 
     304                } 
     305                // remove left fingers 
     306                if(fIds.size() > finger_ids.size()) 
     307                { 
     308                        std::vector< int > remove_fids; 
     309                        for(std::set< int >::iterator it = fIds.begin(), end = fIds.end(); it != end; ++it) 
     310                        { 
     311                                if(finger_ids.find(*it) == finger_ids.end()) 
     312                                { 
     313                                        removeUserIdFromFinger(*it); 
     314                                        remove_fids.push_back(*it); 
     315                                } 
     316                        } 
     317                        for(unsigned int i = 0; i < remove_fids.size(); ++i) 
     318                                fIds.erase(remove_fids[i]); 
     319                        changed = true; 
     320                } 
     321 
     322                if(changed) 
    135323        { 
    136           ProcessMessage(osc::ReceivedMessage(element), remoteEndpoint); 
     324                        UserListener *userlistener_secure; 
     325                          { 
     326                                  boost::mutex::scoped_lock lock(mutex); 
     327                                  userlistener_secure = userlistener; 
     328                          } 
     329                          if (userlistener_secure) 
     330                                  userlistener_secure->userMoved(userinfo); 
    137331        } 
    138         catch (osc::Exception &e) 
    139         { 
    140           logger.error() << "Error while parsing TUIO message: " << e.what(); 
    141         } 
    142       } 
    143     } 
    144   } 
     332      } 
     333    } 
     334        else if (strcmp(cmd, "alive") == 0) 
     335    { 
     336          //std::cout << " alive"; 
     337      std::set<osc::int32> removed_uids = alive_uids; 
     338 
     339      osc::int32 u_id; 
     340      while (!args.Eos()) { 
     341        args >> u_id; 
     342                //std::cout << " " << u_id; 
     343        removed_uids.erase(u_id); 
     344      } 
     345      args >> osc::EndMessage; 
     346          //std::cout << std::endl; 
     347 
     348          UserListener *userlistener_secure; 
     349          { 
     350                  boost::mutex::scoped_lock lock(mutex); 
     351                  userlistener_secure = userlistener; 
     352          } 
     353 
     354      std::set<osc::int32>::const_iterator iter = removed_uids.begin(); 
     355      std::set<osc::int32>::const_iterator iter_end = removed_uids.end(); 
     356      for (; iter != iter_end; ++iter) 
     357      { 
     358        u_id = *iter; 
     359        UserInfo *userinfo = uid_map[u_id]; 
     360        if (userlistener_secure) 
     361                  userlistener_secure->userRemoved(userinfo); 
     362        uid_map.erase(u_id); 
     363        alive_uids.erase(u_id); 
     364        delete userinfo; 
     365      } 
     366    } 
    145367} 
    146368 
     
    148370FingerClient::ProcessMessage(const osc::ReceivedMessage &message, const IpEndpointName &remoteEndpoint) 
    149371{ 
     372        boost::mutex::scoped_lock lock(mutex2); 
     373 
     374        //std::cout << message.AddressPattern(); 
     375        if(strcmp(message.AddressPattern(), "/tuio/_kinect") == 0) 
     376        { 
     377                ProcessKinectMessage(message, remoteEndpoint); 
     378                return; 
     379        } 
     380 
     381 
    150382        bool isBlob = false, isObject = false, isValid = true; 
    151383        if(strcmp(message.AddressPattern(), "/tuio/2Dobj") == 0) 
     
    182414        if (fingerinfo) 
    183415        { 
    184           FingerListener *fingerlistener_secure; 
    185416          { 
    186             boost::mutex::scoped_lock lock(mutex); 
    187             fingerlistener_secure = fingerlistener; 
    188417            fingerinfo->setPositionHistorySize(historysize); 
    189418                        if(isBlob) 
     
    195424                                fingerinfo->setAngle(angle); 
    196425          } 
     426                  fingerinfo->setUserId(getUserIdForFinger(s_id)); 
     427                  //std::cout << "New finger " << s_id << " from user " << fingerinfo->getUserId() << std::endl; 
    197428          cursor_id_map[s_id] = fingerinfo; 
    198429          alive_ids.insert(s_id); 
    199           if (fingerlistener_secure) 
    200             fingerlistener_secure->fingerAdded(fingerinfo); 
     430                  FingerListener *fingerlistener_secure; 
     431                        { 
     432                                boost::mutex::scoped_lock lock(mutex); 
     433                                fingerlistener_secure = fingerlistener; 
     434                        } 
     435                        if (fingerlistener_secure) 
     436                                fingerlistener_secure->fingerAdded(fingerinfo); 
    201437        } 
    202438      } 
     
    207443        if (pos != fingerinfo->getPosition(0)) 
    208444        { 
    209           FingerListener *fingerlistener_secure; 
    210445          { 
    211             boost::mutex::scoped_lock lock(mutex); 
    212             fingerlistener_secure = fingerlistener; 
    213446            fingerinfo->setPositionHistorySize(historysize); 
    214447                        if(isBlob) 
     
    221454          } 
    222455          fingerinfo->addPosition(pos); 
    223           if (fingerlistener_secure) 
    224             fingerlistener_secure->fingerMoved(fingerinfo); 
     456                  FingerListener *fingerlistener_secure; 
     457                        { 
     458                                boost::mutex::scoped_lock lock(mutex); 
     459                                fingerlistener_secure = fingerlistener; 
     460                        } 
     461                        if (fingerlistener_secure) 
     462                                fingerlistener_secure->fingerMoved(fingerinfo); 
    225463        } 
    226464      } 
     
    238476 
    239477      FingerListener *fingerlistener_secure; 
    240       { 
    241         boost::mutex::scoped_lock lock(mutex); 
    242         fingerlistener_secure = fingerlistener; 
    243       } 
     478                { 
     479                        boost::mutex::scoped_lock lock(mutex); 
     480                        fingerlistener_secure = fingerlistener; 
     481                } 
     482                 
    244483 
    245484      std::set<osc::int32>::const_iterator iter = removed_ids.begin(); 
     
    250489        FingerInfo *fingerinfo = cursor_id_map[s_id]; 
    251490        if (fingerlistener_secure) 
    252           fingerlistener_secure->fingerRemoved(fingerinfo); 
     491                        fingerlistener_secure->fingerRemoved(fingerinfo); 
    253492        cursor_id_map.erase(s_id); 
    254493        alive_ids.erase(s_id); 
  • trunk/avango-display/src/avango/display/mt/multitouch/FingerClient.h

    r353 r571  
    1111#include <map> 
    1212#include <set> 
     13#include <queue> 
    1314 
    1415#include "ip/UdpSocket.h" 
     
    2324{ 
    2425public: 
     26  enum MyMessage 
     27  { 
     28          MYMESS_SET_PORT = 0, 
     29          MYMESS_ENABLE_CALIB 
     30  }; 
     31 
     32public: 
    2533  FingerClient(int port); 
    2634  ~FingerClient(); 
    2735 
    2836  void registerFingerListener(FingerListener *listener); 
     37  void registerUserListener(UserListener *listener); 
    2938 
    3039  void setPositionHistorySize(unsigned int size); 
     
    3544  void ProcessBundle(const osc::ReceivedBundle &bundle, const IpEndpointName &remoteEndpoint); 
    3645  void ProcessMessage(const osc::ReceivedMessage &message, const IpEndpointName &remoteEndpoint); 
     46 
     47  int FingerClient::getPort() const { return mPort; } 
     48  std::queue< std::pair< MyMessage, int > > &getMessages() { return mMessages; } 
    3749 
    3850private: 
     
    4658  }; 
    4759 
     60  osc::int32 getUserIdForFinger(osc::int32 s_id); 
     61  void addUserIdToFinger(osc::int32 u_id, osc::int32 s_id); 
     62  void removeUserIdFromFinger(osc::int32 s_id); 
     63  void ProcessKinectMessage(const osc::ReceivedMessage &message, const IpEndpointName &remoteEndpoint); 
     64 
    4865  boost::thread *thread; 
    49   boost::mutex mutex; 
     66  boost::mutex mutex, mutex2; 
    5067 
    5168  FingerListener *fingerlistener; 
     69  UserListener *userlistener; 
    5270  unsigned int historysize; 
    5371  UdpListeningReceiveSocket *socket; 
    5472  std::map<osc::int32, FingerInfo*> cursor_id_map; 
    55   std::set<osc::int32> alive_ids; 
    56   osc::int32 current_fseq; 
     73  std::map<osc::int32, UserInfo*> uid_map; 
     74  std::set<osc::int32> alive_ids, alive_uids; 
     75  std::vector< osc::int32 > current_fseqs; 
     76  std::vector< std::string > address_patterns; 
     77  int mPort; 
     78  std::queue< std::pair< MyMessage, int > > mMessages; 
    5779}; 
    5880 
  • trunk/avango-display/src/avango/display/mt/multitouch/FingerInfo.cpp

    r567 r571  
    3737{ 
    3838  return m_iFingerId; 
     39} 
     40 
     41int 
     42FingerInfo::getUserId() 
     43{ 
     44  return m_iUserId; 
     45} 
     46void 
     47FingerInfo::setUserId(const int id) 
     48{ 
     49  m_iUserId = id; 
    3950} 
    4051 
  • trunk/avango-display/src/avango/display/mt/multitouch/FingerInfo.h

    r567 r571  
    33 
    44#include <deque> 
     5#include <set> 
    56 
    67class FingerClient; 
     
    2324 
    2425  int getFingerId(); 
     26  int getUserId(); 
     27  void setUserId(const int id); 
    2528 
    2629  void addPosition(Vec2 position); 
     
    4144  typedef std::deque<Vec2> PositionHistory; 
    4245 
    43   int m_iFingerId; 
     46  int m_iFingerId, m_iUserId; 
    4447  float m_angle, m_width, m_height, m_area; 
    4548 
     
    5154 
    5255 
     56class UserInfo 
     57{ 
     58public: 
     59  UserInfo(int id) : m_iUserId(id) {} 
     60  int getUserId() { return m_iUserId; } 
     61  std::set< int > &FingerIds() { return m_FingerIds; } 
     62 
     63private: 
     64  int m_iUserId; 
     65  std::set< int > m_FingerIds; 
     66 
     67  friend class FingerClient; 
     68}; 
     69 
     70 
    5371#endif //FINGERINFO_H 
  • trunk/avango-display/src/avango/display/mt/multitouch/FingerListener.h

    r567 r571  
    1515}; 
    1616 
     17class UserListener 
     18{ 
     19public: 
     20  virtual ~UserListener(){}; 
     21  virtual void userAdded(UserInfo *pUserInfo) = 0; 
     22  virtual void userMoved(UserInfo *pUserInfo) = 0; 
     23  virtual void userRemoved(UserInfo *pUserInfo) = 0; 
     24}; 
     25 
    1726 
    1827#endif //_FINGERLISTENER_H 
  • trunk/avango-display/wrapper/avango/display/mt/_display_mt.cpp

    r409 r571  
    5050  av::display::mt::MultitouchDevice::initClass(); 
    5151  av::display::mt::MultitouchFinger::initClass(); 
     52  av::display::mt::MultitouchUser::initClass(); 
    5253 
    5354  // define python bindings here 
     
    5859          "Docstring with explanations what this class can be used for."); 
    5960 
     61  class_<av::display::mt::MultitouchUser, av::Link<av::display::mt::MultitouchUser>, bases<av::FieldContainer>, boost::noncopyable >("MultitouchUser", 
     62          "Docstring with explanations what this class can be used for."); 
     63 
    6064  register_field<av::display::mt::SFMultitouchFinger>("SFMultitouchFinger"); 
    6165  register_multifield<av::display::mt::MFMultitouchFinger>("MFMultitouchFinger"); 
     66 
     67  register_field<av::display::mt::SFMultitouchUser>("SFMultitouchUser"); 
     68  register_multifield<av::display::mt::MFMultitouchUser>("MFMultitouchUser"); 
    6269} 
Note: See TracChangeset for help on using the changeset viewer.