zyonz_chlorophyll_meter_driver_node.cpp
Go to the documentation of this file.
00001 #include "zyonz_chlorophyll_meter_driver_node.h"
00002 
00003 ZyonzChlorophyllMeterDriverNode::ZyonzChlorophyllMeterDriverNode(ros::NodeHandle &nh) : 
00004     iri_base_driver::IriBaseNodeDriver<ZyonzChlorophyllMeterDriver>(nh),
00005     last_action_successful_(false),
00006     take_sample_aserver_(public_node_handle_, "take_sample")
00007 {
00008     //init class attributes if necessary
00009     //this->loop_rate_ = 2;//in [Hz]
00010 
00011     int baudrate(1000000);
00012     private_node_handle_.param<int>("baudrate", baudrate, 1000000);
00013     driver_.set_baudrate(baudrate);
00014     ROS_INFO("Baudrate: %d", baudrate);
00015     int bus_id(255);
00016     private_node_handle_.param<int>("bus_id", bus_id, 255);
00017     driver_.set_bus_id(bus_id);
00018     ROS_INFO("Bus ID.: %d", bus_id);
00019     int servo_id(0);
00020     private_node_handle_.param<int>("servo_id", servo_id, 0);
00021     driver_.set_servo_id((unsigned char)servo_id);
00022     ROS_INFO("Servo ID.: %d", servo_id);
00023     double max_angle(-25.0f);
00024     private_node_handle_.param<double>("max_angle", max_angle, -25.0);
00025     driver_.set_max_angle(max_angle);
00026     ROS_INFO("Max. Angle: %f", max_angle);
00027     double min_angle(-46.0f);
00028     private_node_handle_.param<double>("min_angle", min_angle, -46.0);
00029     driver_.set_min_angle(min_angle);
00030     ROS_INFO("Min. Angle: %f", min_angle);
00031     double effort(10.0f);
00032     private_node_handle_.param<double>("effort", effort, 10.0);
00033     driver_.set_effort(effort);
00034     ROS_INFO("Effort: %f", effort);
00035 
00036     // [init publishers]
00037 
00038     // [init subscribers]
00039 
00040     // [init services]
00041 
00042     // [init clients]
00043 
00044     // [init action servers]
00045     take_sample_aserver_.registerStartCallback(boost::bind(&ZyonzChlorophyllMeterDriverNode::take_sampleStartCallback, this, _1)); 
00046     take_sample_aserver_.registerStopCallback(boost::bind(&ZyonzChlorophyllMeterDriverNode::take_sampleStopCallback, this)); 
00047     take_sample_aserver_.registerIsFinishedCallback(boost::bind(&ZyonzChlorophyllMeterDriverNode::take_sampleIsFinishedCallback, this)); 
00048     take_sample_aserver_.registerHasSucceedCallback(boost::bind(&ZyonzChlorophyllMeterDriverNode::take_sampleHasSucceedCallback, this)); 
00049     take_sample_aserver_.registerGetResultCallback(boost::bind(&ZyonzChlorophyllMeterDriverNode::take_sampleGetResultCallback, this, _1)); 
00050     take_sample_aserver_.registerGetFeedbackCallback(boost::bind(&ZyonzChlorophyllMeterDriverNode::take_sampleGetFeedbackCallback, this, _1)); 
00051     take_sample_aserver_.start(); 
00052 
00053     // [init action clients]
00054 }
00055 
00056 void ZyonzChlorophyllMeterDriverNode::mainNodeThread(void)
00057 {
00058     //lock access to driver if necessary
00059     this->driver_.lock();
00060 
00061     // [fill msg Header if necessary]
00062     //<publisher_name>.header.stamp = ros::Time::now();
00063     //<publisher_name>.header.frame_id = "<publisher_topic_name>";
00064 
00065     // [fill msg structures]
00066 
00067     // [fill srv structure and make request to the server]
00068 
00069     // [fill action structure and make request to the action server]
00070 
00071     // [publish messages]
00072 
00073     //unlock access to driver if previously blocked
00074     this->driver_.unlock();
00075 }
00076 
00077 /*  [subscriber callbacks] */
00078 
00079 /*  [service callbacks] */
00080 
00081 /*  [action callbacks] */
00082 void ZyonzChlorophyllMeterDriverNode::take_sampleStartCallback(const zyonz_msgs::chlorophyll_sampleGoalConstPtr& goal)
00083 { 
00084     driver_.lock(); 
00085     std::cout << "Received a new take_sample action request" << std::endl;
00086 
00087     this->last_action_successful_ = false;
00088 
00089     //check goal 
00090     if(goal->close)
00091     {//execute close action
00092         this->last_action_successful_ = this->driver_.close_meter();
00093     }
00094     else
00095     {//execute open action
00096         this->last_action_successful_ = this->driver_.open_meter();
00097     }
00098     driver_.unlock(); 
00099 } 
00100 
00101 void ZyonzChlorophyllMeterDriverNode::take_sampleStopCallback(void) 
00102 { 
00103     driver_.lock(); 
00104     //stop action 
00105     this->driver_.stop_meter();
00106     driver_.unlock(); 
00107 } 
00108 
00109 bool ZyonzChlorophyllMeterDriverNode::take_sampleIsFinishedCallback(void) 
00110 { 
00111     ROS_DEBUG("take_sampleIsFinishedCallback");
00112     bool ret = false; 
00113     // wait for the motor to move
00114     usleep(200000);
00115 
00116     driver_.lock(); 
00117     //if action has finish for any reason 
00118     if (driver_.is_at_max_angle() || driver_.is_at_min_angle())
00119     {
00120         ret = true;
00121     }
00122 
00123     driver_.unlock(); 
00124 
00125     return ret; 
00126 } 
00127 
00128 bool ZyonzChlorophyllMeterDriverNode::take_sampleHasSucceedCallback(void) 
00129 { 
00130     bool ret = false; 
00131 
00132     driver_.lock(); 
00133     //if goal was accomplished 
00134     ret = true; 
00135     driver_.unlock(); 
00136 
00137     return ret; 
00138 } 
00139 
00140 void ZyonzChlorophyllMeterDriverNode::take_sampleGetResultCallback(zyonz_msgs::chlorophyll_sampleResultPtr& result) 
00141 { 
00142     driver_.lock(); 
00143     //update result data to be sent to client 
00144     result->successful = last_action_successful_;
00145     driver_.unlock(); 
00146 } 
00147 
00148 void ZyonzChlorophyllMeterDriverNode::take_sampleGetFeedbackCallback(zyonz_msgs::chlorophyll_sampleFeedbackPtr& feedback) 
00149 {
00150     ROS_DEBUG("take_sampleGetFeedbackCallback"); 
00151     driver_.lock(); 
00152     try
00153     {
00154         feedback->angle = driver_.get_current_angle();
00155         feedback->effort = driver_.get_current_effort();
00156         ROS_DEBUG("[angle]: %f, [effort]: %f", feedback->angle, feedback->effort); 
00157     }
00158     catch(...)
00159     {
00160         ROS_WARN("Uncatched exception");
00161     }
00162     driver_.unlock();
00163 }
00164 
00165 /*  [action requests] */
00166 
00167 void ZyonzChlorophyllMeterDriverNode::postNodeOpenHook(void)
00168 {
00169     take_sample_aserver_.start();
00170 }
00171 
00172 void ZyonzChlorophyllMeterDriverNode::addNodeDiagnostics(void)
00173 {
00174 }
00175 
00176 void ZyonzChlorophyllMeterDriverNode::addNodeOpenedTests(void)
00177 {
00178 }
00179 
00180 void ZyonzChlorophyllMeterDriverNode::addNodeStoppedTests(void)
00181 {
00182 }
00183 
00184 void ZyonzChlorophyllMeterDriverNode::addNodeRunningTests(void)
00185 {
00186 }
00187 
00188 void ZyonzChlorophyllMeterDriverNode::reconfigureNodeHook(int level)
00189 {
00190 }
00191 
00192 ZyonzChlorophyllMeterDriverNode::~ZyonzChlorophyllMeterDriverNode(void)
00193 {
00194     // [free dynamic memory]
00195 }
00196 
00197 /* main function */
00198 int main(int argc,char *argv[])
00199 {
00200     return driver_base::main<ZyonzChlorophyllMeterDriverNode>(argc, argv, "zyonz_chlorophyll_meter_driver_node");
00201 }


zyonz_chlorophyll_meter
Author(s): Sergi Hernandez Juan
autogenerated on Fri Dec 6 2013 20:05:20