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
00009
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
00037
00038
00039
00040
00041
00042
00043
00044
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
00054 }
00055
00056 void ZyonzChlorophyllMeterDriverNode::mainNodeThread(void)
00057 {
00058
00059 this->driver_.lock();
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 this->driver_.unlock();
00075 }
00076
00077
00078
00079
00080
00081
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
00090 if(goal->close)
00091 {
00092 this->last_action_successful_ = this->driver_.close_meter();
00093 }
00094 else
00095 {
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
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
00114 usleep(200000);
00115
00116 driver_.lock();
00117
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
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
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
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
00195 }
00196
00197
00198 int main(int argc,char *argv[])
00199 {
00200 return driver_base::main<ZyonzChlorophyllMeterDriverNode>(argc, argv, "zyonz_chlorophyll_meter_driver_node");
00201 }