00001 // Copyright (C) 2012 Austin Robot Technology, Jack O'Quin 00002 // All rights reserved. 00003 // 00004 // Software License Agreement (BSD License 2.0) 00005 // 00006 // Redistribution and use in source and binary forms, with or without 00007 // modification, are permitted provided that the following conditions 00008 // are met: 00009 // 00010 // * Redistributions of source code must retain the above copyright 00011 // notice, this list of conditions and the following disclaimer. 00012 // * Redistributions in binary form must reproduce the above 00013 // copyright notice, this list of conditions and the following 00014 // disclaimer in the documentation and/or other materials provided 00015 // with the distribution. 00016 // * Neither the name of {copyright_holder} nor the names of its 00017 // contributors may be used to endorse or promote products derived 00018 // from this software without specific prior written permission. 00019 // 00020 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00021 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00022 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00023 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00024 // COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00025 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00026 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00027 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00028 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00029 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00030 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00031 // POSSIBILITY OF SUCH DAMAGE. 00032 00038 #include <string> 00039 #include <boost/thread.hpp> 00040 00041 #include <ros/ros.h> 00042 #include <pluginlib/class_list_macros.h> 00043 #include <nodelet/nodelet.h> 00044 00045 #include "velodyne_driver/driver.h" 00046 00047 namespace velodyne_driver 00048 { 00049 00050 class DriverNodelet: public nodelet::Nodelet 00051 { 00052 public: 00053 00054 DriverNodelet(): 00055 running_(false) 00056 {} 00057 00058 ~DriverNodelet() 00059 { 00060 if (running_) 00061 { 00062 NODELET_INFO("shutting down driver thread"); 00063 running_ = false; 00064 deviceThread_->join(); 00065 NODELET_INFO("driver thread stopped"); 00066 } 00067 } 00068 00069 private: 00070 00071 virtual void onInit(void); 00072 virtual void devicePoll(void); 00073 00074 volatile bool running_; 00075 boost::shared_ptr<boost::thread> deviceThread_; 00076 00077 boost::shared_ptr<VelodyneDriver> dvr_; 00078 }; 00079 00080 void DriverNodelet::onInit() 00081 { 00082 // start the driver 00083 dvr_.reset(new VelodyneDriver(getNodeHandle(), getPrivateNodeHandle())); 00084 00085 // spawn device poll thread 00086 running_ = true; 00087 deviceThread_ = boost::shared_ptr< boost::thread > 00088 (new boost::thread(boost::bind(&DriverNodelet::devicePoll, this))); 00089 } 00090 00092 void DriverNodelet::devicePoll() 00093 { 00094 while(ros::ok()) 00095 { 00096 // poll device until end of file 00097 running_ = dvr_->poll(); 00098 if (!running_) 00099 ROS_ERROR_THROTTLE(1.0, "DriverNodelet::devicePoll - Failed to poll device."); 00100 } 00101 running_ = false; 00102 } 00103 00104 } // namespace velodyne_driver 00105 00106 // Register this plugin with pluginlib. Names must match nodelet_velodyne.xml. 00107 // 00108 // parameters are: class type, base class type 00109 PLUGINLIB_EXPORT_CLASS(velodyne_driver::DriverNodelet, nodelet::Nodelet)