From 8177fc48c2eaec962535a4c3abedb8159c839353 Mon Sep 17 00:00:00 2001 From: Ricardo Ortiz <ricardo.ortiz@kitware.com> Date: Thu, 28 Jan 2016 09:56:53 -0500 Subject: [PATCH] ENH: Enable the vrpn_Phantom device in the device server. --- Devices/VRPNDeviceServer.cpp | 111 +++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 37 deletions(-) diff --git a/Devices/VRPNDeviceServer.cpp b/Devices/VRPNDeviceServer.cpp index 0e08d4652..a8c0d80c0 100644 --- a/Devices/VRPNDeviceServer.cpp +++ b/Devices/VRPNDeviceServer.cpp @@ -50,6 +50,7 @@ bool VRPNDeviceServer::addDeviceClient( std::string newDeviceIP = newDeviceURL.substr(newDeviceURL.find_last_of("@") + 1); if (newDeviceIP != "localhost") { + // TODO: Log this std::cerr<< "addDeviceClient error: VRPNDeviceServer can only communicate " << "with devices connected locally (devicename@localhost)." << std::endl; return EXIT_FAILURE; @@ -62,6 +63,7 @@ bool VRPNDeviceServer::addDeviceClient( && this->buttonDevicesList.find(newDeviceName) != this->buttonDevicesList.end() ) { + // TODO: Log this std::cerr<< "addDeviceClient error: name already use by another client (" << newDeviceName << ")" << std::endl; return EXIT_FAILURE; @@ -73,60 +75,90 @@ bool VRPNDeviceServer::addDeviceClient( std::shared_ptr<vrpn_Button> vrpnButtonDevice; switch( newDeviceClient->getDeviceType() ) { - case DeviceType::SPACE_EXPLORER_3DCONNEXION: - vrpnAnalogDevice = std::make_shared<vrpn_3DConnexion_SpaceExplorer> - (newDeviceName.c_str(), this->connection); - break; - case DeviceType::NAVIGATOR_3DCONNEXION: - vrpnAnalogDevice = std::make_shared<vrpn_3DConnexion_Navigator> - (newDeviceName.c_str(), this->connection); - break; - case DeviceType::RAZER_HYDRA: - vrpnTrackerDevice = std::make_shared<vrpn_Tracker_RazerHydra> - (newDeviceName.c_str(), this->connection); - break; - case DeviceType::XKEYS_XK3: - vrpnButtonDevice = std::make_shared<vrpn_Xkeys_XK3> - (newDeviceName.c_str(), this->connection); - break; - case DeviceType::OSVR_HDK: - vrpnTrackerDevice = std::make_shared<vrpn_Tracker_OSVRHackerDevKit> - (newDeviceName.c_str(), this->connection); - break; - case DeviceType::PHANTOM_OMNI: -#ifdef VRPN_USE_PHANTOM_SERVER - vrpnDevice = std::make_shared<vrpn_Phantom> // TODO - (newDeviceName.c_str(), this->connection, 60.0f, "Default PHANToM"); -#else - std::cerr<< "addDeviceClient error: needs VRPN_USE_PHANTOM_SERVER to be true " - << "to connect a Panthom omni device." << std::endl; - return EXIT_FAILURE; -#endif - break; - default: - std::cerr<< "addDeviceClient error: unknown device type." - << std::endl; - return EXIT_FAILURE; + case DeviceType::SPACE_EXPLORER_3DCONNEXION: + { + vrpnAnalogDevice = + std::make_shared<vrpn_3DConnexion_SpaceExplorer>(newDeviceName.c_str(), + this->connection); + break; + } + case DeviceType::NAVIGATOR_3DCONNEXION: + { + vrpnAnalogDevice = + std::make_shared<vrpn_3DConnexion_Navigator>(newDeviceName.c_str(), + this->connection); + break; + } + case DeviceType::RAZER_HYDRA: + { + vrpnTrackerDevice = + std::make_shared<vrpn_Tracker_RazerHydra>(newDeviceName.c_str(), + this->connection); + break; + } + case DeviceType::XKEYS_XK3: + { + vrpnButtonDevice = + std::make_shared<vrpn_Xkeys_XK3>(newDeviceName.c_str(), + this->connection); + break; + } + case DeviceType::OSVR_HDK: + { + vrpnTrackerDevice = + std::make_shared<vrpn_Tracker_OSVRHackerDevKit>(newDeviceName.c_str(), + this->connection); + break; + } + case DeviceType::PHANTOM_OMNI: + { + #ifdef VRPN_USE_PHANTOM_SERVER + // TODO: Add an extra parameter to set the name of the phantom omni. + // This is necessary because vrpn_Phantom only take non-const names. + char * deviceName = const_cast<char*>(newDeviceName.c_str()); + vrpnTrackerDevice = + std::make_shared<vrpn_Phantom>(deviceName, + this->connection, + 60.0f, "Default PHANToM"); + #else + // TODO: add to logger + std::cerr<< "addDeviceClient error: needs VRPN_USE_PHANTOM_SERVER defined " + << "to connect a Panthom omni device." << std::endl; + return EXIT_FAILURE; + #endif + break; + } + default: + { + // TODO: add to logger + std::cerr<< "addDeviceClient error: unknown device type." + << std::endl; + return EXIT_FAILURE; + } } // Add vrpn device in list if(vrpnAnalogDevice != nullptr) { this->analogDevicesList[newDeviceName] = vrpnAnalogDevice; + // TODO: add to logger std::cout<<newDeviceName<<" successfully added."<<std::endl; } else if(vrpnTrackerDevice != nullptr) { this->trackerDevicesList[newDeviceName] = vrpnTrackerDevice; + // TODO: add to logger std::cout<<newDeviceName<<" successfully added."<<std::endl; } else if(vrpnButtonDevice != nullptr) { this->buttonDevicesList[newDeviceName] = vrpnButtonDevice; + // TODO: add to logger std::cout<<newDeviceName<<" successfully added."<<std::endl; } else { + // TODO: add to logger std::cerr<< "addDeviceClient error: could not instantiate VRPN device." << std::endl; return EXIT_FAILURE; @@ -137,15 +169,18 @@ bool VRPNDeviceServer::addDeviceClient( { std::string filterName = newDeviceName +"_Filter"; - std::shared_ptr<vrpn_Tracker_FilterOneEuro> filter = - std::make_shared<vrpn_Tracker_FilterOneEuro> - (filterName.c_str(), this->connection, newDeviceName.c_str(), 7); + auto filter = std::make_shared<vrpn_Tracker_FilterOneEuro>(filterName.c_str(), + this->connection, + newDeviceName.c_str(), + 7); this->trackerDevicesList[filterName] = filter; + // TODO: add to logger std::cout<<filterName<<" successfully added."<<std::endl; } else if( addFiltering ) { + // TODO: add to logger std::cerr<< "addDeviceClient warning: can not filter device which is not a tracker." << std::endl; } @@ -177,9 +212,11 @@ void VRPNDeviceServer::exec() // connections allocated with vrpn_create_server_connection() // must decrement their reference to be auto-deleted by VRPN + // TODO: add to logger std::cout<<"VRPNDeviceServer: removing connection references"<<std::endl; this->connection->removeReference(); + // TODO: add to logger std::cout<<"VRPNDeviceServer: closing server"<<std::endl; delete(this->connection); -- GitLab