- Timestamp:
- 06/09/11 11:54:12 (12 months ago)
- Location:
- trunk/avango-display
- Files:
-
- 10 edited
-
include/avango/display/mt/MultitouchDevice.h (modified) (5 diffs)
-
include/avango/display/mt/MultitouchFinger.h (modified) (3 diffs)
-
src/avango/display/mt/MultitouchDevice.cpp (modified) (10 diffs)
-
src/avango/display/mt/MultitouchFinger.cpp (modified) (3 diffs)
-
src/avango/display/mt/multitouch/FingerClient.cpp (modified) (11 diffs)
-
src/avango/display/mt/multitouch/FingerClient.h (modified) (4 diffs)
-
src/avango/display/mt/multitouch/FingerInfo.cpp (modified) (1 diff)
-
src/avango/display/mt/multitouch/FingerInfo.h (modified) (4 diffs)
-
src/avango/display/mt/multitouch/FingerListener.h (modified) (1 diff)
-
wrapper/avango/display/mt/_display_mt.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/avango-display/include/avango/display/mt/MultitouchDevice.h
r567 r571 43 43 namespace mt 44 44 { 45 class AV_DISPLAY_MT_DLL MultitouchDevice : public FieldContainer, public FingerListener 45 class AV_DISPLAY_MT_DLL MultitouchDevice : public FieldContainer, public FingerListener, public UserListener 46 46 { 47 47 AV_FC_DECLARE(); … … 56 56 MFMultitouchFinger Removed; 57 57 58 MFMultitouchUser AddedUsers; 59 MFMultitouchUser AvailableUsers; 60 MFMultitouchUser RemovedUsers; 61 58 62 SFFloat TimeIn; 59 63 … … 61 65 SFInt FilterSize; 62 66 67 void handleFingers(); 68 void handleUsers(); 63 69 /* virtual */ void evaluate(); 64 70 … … 68 74 void fingerRemoved(FingerInfo *pFingerInfo); 69 75 76 // FingerListener interface 77 void userAdded(UserInfo *pUserInfo); 78 void userMoved(UserInfo *pUserInfo); 79 void userRemoved(UserInfo *pUserInfo); 80 70 81 private: 82 83 void processMessages(std::queue< std::pair< FingerClient::MyMessage, int > > &messages); 71 84 72 85 FingerClient *mFingerClient; … … 76 89 bool do_move; 77 90 bool do_remove; 78 int finger_id ;91 int finger_id, user_id; 79 92 Vec2 position; 80 93 float angle, width, height, area; 81 94 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) 83 107 { 84 108 } 85 109 }; 86 110 typedef std::map<int, FingerAction> FingerMap; 111 typedef std::map<int, UserAction> UserMap; 87 112 FingerMap mFingerMap; 113 UserMap mUserMap; 88 114 boost::mutex mMutex; 115 int mOriginalPort, mReceivedPort; 116 double mReceivedPortTime; 89 117 }; 90 118 } -
trunk/avango-display/include/avango/display/mt/MultitouchFinger.h
r567 r571 44 44 45 45 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); 47 47 virtual ~MultitouchFinger(); 48 48 49 av::SFInt Identifier ;49 av::SFInt Identifier, UserID; 50 50 av::osg::SFVec2 Position; 51 51 av::SFFloat Angle, Width, Height, Area; … … 56 56 typedef SingleField<Link<MultitouchFinger> > SFMultitouchFinger; 57 57 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; 58 75 } 59 76 } … … 62 79 template class AV_DISPLAY_MT_DLL SingleField<Link<display::mt::MultitouchFinger> >; 63 80 template class AV_DISPLAY_MT_DLL MultiField<Link<display::mt::MultitouchFinger> >; 81 82 template class AV_DISPLAY_MT_DLL SingleField<Link<display::mt::MultitouchUser> >; 83 template class AV_DISPLAY_MT_DLL MultiField<Link<display::mt::MultitouchUser> >; 64 84 #endif 65 85 } -
trunk/avango-display/src/avango/display/mt/MultitouchDevice.cpp
r567 r571 39 39 AV_FC_DEFINE(av::display::mt::MultitouchDevice); 40 40 41 av::display::mt::MultitouchDevice::MultitouchDevice() 41 av::display::mt::MultitouchDevice::MultitouchDevice() : mOriginalPort(3333), mReceivedPort(mOriginalPort), mReceivedPortTime(timeGetTime()) 42 42 { 43 43 AV_FC_ADD_FIELD(Added, MFMultitouchFinger::ContainerType()); … … 48 48 AV_FC_ADD_FIELD(TimeIn, 0.0); 49 49 50 mFingerClient = new FingerClient( 3333);50 mFingerClient = new FingerClient(mOriginalPort); 51 51 52 52 if (mFingerClient) 53 53 { 54 54 mFingerClient->registerFingerListener(this); 55 mFingerClient->registerUserListener(this); 55 56 56 57 alwaysEvaluate(true); … … 74 75 } 75 76 76 /* virtual */ void 77 av::display::mt::MultitouchDevice::evaluate() 78 { 79 boost::mutex::scoped_lock mLock(mMutex); 80 77 void 78 av::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 97 void 98 av::display::mt::MultitouchDevice::handleFingers() 99 { 81 100 mFingerClient->setPositionHistorySize(FilterSize.getValue()); 82 101 … … 110 129 if (action.do_add) 111 130 { 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); 113 132 Added.add1Value(action.finger); 114 133 action.do_add = false; … … 121 140 action.finger->Height.setValue(action.height); 122 141 action.finger->Area.setValue(action.area); 142 action.finger->UserID.setValue(action.user_id); 123 143 action.do_move = false; 124 144 } … … 130 150 action.finger->Height.setValue(action.height); 131 151 action.finger->Area.setValue(action.area); 152 action.finger->UserID.setValue(action.user_id); 132 153 Available.remove1Value(action.finger); 133 154 Removed.add1Value(action.finger); … … 138 159 ++iter; 139 160 } 161 } 162 163 void 164 av::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 215 av::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(); 140 238 } 141 239 … … 158 256 action.height = pFingerInfo->getHeight(); 159 257 action.area = pFingerInfo->getArea(); 258 action.user_id = pFingerInfo->getUserId(); 160 259 action.do_add = true; 161 260 } … … 176 275 action.height = pFingerInfo->getHeight(); 177 276 action.area = pFingerInfo->getArea(); 277 action.user_id = pFingerInfo->getUserId(); 178 278 action.do_move = true; 179 279 } … … 200 300 action.height = pFingerInfo->getHeight(); 201 301 action.area = pFingerInfo->getArea(); 302 action.user_id = pFingerInfo->getUserId(); 202 303 action.do_remove = true; 203 304 } 204 305 } 205 306 } 307 308 void 309 av::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 325 void 326 av::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 338 void 339 av::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 38 38 AV_FIELD_DEFINE(av::display::mt::MFMultitouchFinger); 39 39 40 av::display::mt::MultitouchFinger::MultitouchFinger(int _id, ::osg::Vec2 _position, float _creationTime, float _angle, float _width, float _height, float _area )40 av::display::mt::MultitouchFinger::MultitouchFinger(int _id, ::osg::Vec2 _position, float _creationTime, float _angle, float _width, float _height, float _area, int _user_id) 41 41 { 42 42 AV_FC_ADD_FIELD(Identifier, _id); … … 47 47 AV_FC_ADD_FIELD(Height, _height); 48 48 AV_FC_ADD_FIELD(Area, _area); 49 AV_FC_ADD_FIELD(UserID, _user_id); 49 50 } 50 51 … … 65 66 } 66 67 } 68 69 70 AV_FC_DEFINE(av::display::mt::MultitouchUser); 71 72 AV_FIELD_DEFINE(av::display::mt::SFMultitouchUser); 73 AV_FIELD_DEFINE(av::display::mt::MFMultitouchUser); 74 75 av::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 81 av::display::mt::MultitouchUser::~MultitouchUser() 82 {} 83 84 void 85 av::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 14 14 15 15 16 FingerClient::FingerClient(int port) : fingerlistener(0), historysize(0), current_fseq(0) 17 { 16 FingerClient::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 18 24 socket = 0; 19 25 try … … 55 61 } 56 62 63 void FingerClient::registerUserListener(UserListener *listener) 64 { 65 boost::mutex::scoped_lock lock(mutex); 66 userlistener = listener; 67 } 68 57 69 void 58 70 FingerClient::setPositionHistorySize(unsigned int size) … … 81 93 FingerClient::ProcessBundle(const osc::ReceivedBundle &bundle, const IpEndpointName &remoteEndpoint) 82 94 { 83 osc::int32 fseq = current_fseq; 95 osc::int32 fseq = 0; 96 int pattern = -1; 84 97 85 98 osc::ReceivedBundle::const_iterator iter = bundle.ElementsBegin(); 86 99 osc::ReceivedBundle::const_iterator iter_end = bundle.ElementsEnd(); 87 100 101 //std::cout << "Received Bundle" << std::endl; 88 102 // find fseq 89 103 for (; iter != iter_end; ++iter) … … 97 111 osc::ReceivedMessageArgumentStream args = message.ArgumentStream(); 98 112 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 180 osc::int32 181 FingerClient::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 192 void 193 FingerClient::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 216 void 217 FingerClient::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 } 238 void 239 FingerClient::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) 102 271 { 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); 108 286 } 109 287 } 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 0118 if (fseq < 0)119 current_fseq = fseq = 0;120 121 if (fseq >= current_fseq)122 {123 current_fseq = fseq;124 125 // process other messages126 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);132 288 else 133 289 { 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) 135 323 { 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); 137 331 } 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 } 145 367 } 146 368 … … 148 370 FingerClient::ProcessMessage(const osc::ReceivedMessage &message, const IpEndpointName &remoteEndpoint) 149 371 { 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 150 382 bool isBlob = false, isObject = false, isValid = true; 151 383 if(strcmp(message.AddressPattern(), "/tuio/2Dobj") == 0) … … 182 414 if (fingerinfo) 183 415 { 184 FingerListener *fingerlistener_secure;185 416 { 186 boost::mutex::scoped_lock lock(mutex);187 fingerlistener_secure = fingerlistener;188 417 fingerinfo->setPositionHistorySize(historysize); 189 418 if(isBlob) … … 195 424 fingerinfo->setAngle(angle); 196 425 } 426 fingerinfo->setUserId(getUserIdForFinger(s_id)); 427 //std::cout << "New finger " << s_id << " from user " << fingerinfo->getUserId() << std::endl; 197 428 cursor_id_map[s_id] = fingerinfo; 198 429 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); 201 437 } 202 438 } … … 207 443 if (pos != fingerinfo->getPosition(0)) 208 444 { 209 FingerListener *fingerlistener_secure;210 445 { 211 boost::mutex::scoped_lock lock(mutex);212 fingerlistener_secure = fingerlistener;213 446 fingerinfo->setPositionHistorySize(historysize); 214 447 if(isBlob) … … 221 454 } 222 455 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); 225 463 } 226 464 } … … 238 476 239 477 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 244 483 245 484 std::set<osc::int32>::const_iterator iter = removed_ids.begin(); … … 250 489 FingerInfo *fingerinfo = cursor_id_map[s_id]; 251 490 if (fingerlistener_secure) 252 fingerlistener_secure->fingerRemoved(fingerinfo);491 fingerlistener_secure->fingerRemoved(fingerinfo); 253 492 cursor_id_map.erase(s_id); 254 493 alive_ids.erase(s_id); -
trunk/avango-display/src/avango/display/mt/multitouch/FingerClient.h
r353 r571 11 11 #include <map> 12 12 #include <set> 13 #include <queue> 13 14 14 15 #include "ip/UdpSocket.h" … … 23 24 { 24 25 public: 26 enum MyMessage 27 { 28 MYMESS_SET_PORT = 0, 29 MYMESS_ENABLE_CALIB 30 }; 31 32 public: 25 33 FingerClient(int port); 26 34 ~FingerClient(); 27 35 28 36 void registerFingerListener(FingerListener *listener); 37 void registerUserListener(UserListener *listener); 29 38 30 39 void setPositionHistorySize(unsigned int size); … … 35 44 void ProcessBundle(const osc::ReceivedBundle &bundle, const IpEndpointName &remoteEndpoint); 36 45 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; } 37 49 38 50 private: … … 46 58 }; 47 59 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 48 65 boost::thread *thread; 49 boost::mutex mutex ;66 boost::mutex mutex, mutex2; 50 67 51 68 FingerListener *fingerlistener; 69 UserListener *userlistener; 52 70 unsigned int historysize; 53 71 UdpListeningReceiveSocket *socket; 54 72 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; 57 79 }; 58 80 -
trunk/avango-display/src/avango/display/mt/multitouch/FingerInfo.cpp
r567 r571 37 37 { 38 38 return m_iFingerId; 39 } 40 41 int 42 FingerInfo::getUserId() 43 { 44 return m_iUserId; 45 } 46 void 47 FingerInfo::setUserId(const int id) 48 { 49 m_iUserId = id; 39 50 } 40 51 -
trunk/avango-display/src/avango/display/mt/multitouch/FingerInfo.h
r567 r571 3 3 4 4 #include <deque> 5 #include <set> 5 6 6 7 class FingerClient; … … 23 24 24 25 int getFingerId(); 26 int getUserId(); 27 void setUserId(const int id); 25 28 26 29 void addPosition(Vec2 position); … … 41 44 typedef std::deque<Vec2> PositionHistory; 42 45 43 int m_iFingerId ;46 int m_iFingerId, m_iUserId; 44 47 float m_angle, m_width, m_height, m_area; 45 48 … … 51 54 52 55 56 class UserInfo 57 { 58 public: 59 UserInfo(int id) : m_iUserId(id) {} 60 int getUserId() { return m_iUserId; } 61 std::set< int > &FingerIds() { return m_FingerIds; } 62 63 private: 64 int m_iUserId; 65 std::set< int > m_FingerIds; 66 67 friend class FingerClient; 68 }; 69 70 53 71 #endif //FINGERINFO_H -
trunk/avango-display/src/avango/display/mt/multitouch/FingerListener.h
r567 r571 15 15 }; 16 16 17 class UserListener 18 { 19 public: 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 17 26 18 27 #endif //_FINGERLISTENER_H -
trunk/avango-display/wrapper/avango/display/mt/_display_mt.cpp
r409 r571 50 50 av::display::mt::MultitouchDevice::initClass(); 51 51 av::display::mt::MultitouchFinger::initClass(); 52 av::display::mt::MultitouchUser::initClass(); 52 53 53 54 // define python bindings here … … 58 59 "Docstring with explanations what this class can be used for."); 59 60 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 60 64 register_field<av::display::mt::SFMultitouchFinger>("SFMultitouchFinger"); 61 65 register_multifield<av::display::mt::MFMultitouchFinger>("MFMultitouchFinger"); 66 67 register_field<av::display::mt::SFMultitouchUser>("SFMultitouchUser"); 68 register_multifield<av::display::mt::MFMultitouchUser>("MFMultitouchUser"); 62 69 }
Note: See TracChangeset
for help on using the changeset viewer.
