From a0829841bbad06a6fe9316605dd4d24d18107690 Mon Sep 17 00:00:00 2001
From: Joan Perez Ibarz <jperez@iri.upc.edu>
Date: Tue, 28 Jun 2011 17:20:08 +0000
Subject: [PATCH] - first working version for iri action server: including stop
 callback, preempt handling

---
 include/iri_action_server/iri_action_server.h | 65 ++++++++++++++-----
 1 file changed, 48 insertions(+), 17 deletions(-)

diff --git a/include/iri_action_server/iri_action_server.h b/include/iri_action_server/iri_action_server.h
index 55f218f..3ecc4f3 100755
--- a/include/iri_action_server/iri_action_server.h
+++ b/include/iri_action_server/iri_action_server.h
@@ -47,10 +47,11 @@ class IriActionServer
     
   private:
     boost::function<void (const GoalConstPtr&)> start_action_callback_;
+    boost::function<void ()> stop_action_callback_;
     boost::function<bool ()> is_finished_callback_;
     boost::function<bool ()> has_succeed_callback_;
     boost::function<void (ResultPtr&)> get_result_callback_;
-    boost::function<void (FeedbackPtr&)> publish_feedback_callback_;
+    boost::function<void (FeedbackPtr&)> get_feedback_callback_;
     
     void executeCallback(const GoalConstPtr& goal);
 
@@ -87,13 +88,15 @@ class IriActionServer
     */
     ~IriActionServer(void);
     
+    void start(void);
     void setLoopRate(ros::Rate r);
 
     void registerStartCallback(boost::function<void (const GoalConstPtr&)> cb);
+    void registerStopCallback(boost::function<void ()> cb);
     void registerIsFinishedCallback( boost::function<bool ()> cb);
     void registerHasSucceedCallback( boost::function<bool ()> cb);
     void registerGetResultCallback(boost::function<void (ResultPtr&)> cb);
-    void registerPublishFeedbackCallback(boost::function<void (FeedbackPtr&)> cb);
+    void registerGetFeedbackCallback(boost::function<void (FeedbackPtr&)> cb);
     
 };
 
@@ -103,13 +106,13 @@ IriActionServer<ActionSpec>::IriActionServer(ros::NodeHandle & nh, const std::st
   as_(nh, action_name_, boost::bind(&IriActionServer<ActionSpec>::executeCallback, this, _1), false),
   loop_rate_(10)
 {
-  // launch action server
-  as_.start();
+  ROS_DEBUG("IriActionServer::Constructor");
 }
 
 template <class ActionSpec>
 IriActionServer<ActionSpec>::~IriActionServer(void)
 {
+  ROS_DEBUG("IriActionServer::Destructor");
 }
 
 template <class ActionSpec>
@@ -119,19 +122,30 @@ void IriActionServer<ActionSpec>::setLoopRate(ros::Rate r)
 }
 
 template <class ActionSpec>
-void IriActionServer<ActionSpec>::executeCallback(const GoalConstPtr& goal)
+void IriActionServer<ActionSpec>::start(void)
 {
+  ROS_DEBUG("IriActionServer::Start");
+
   // check if all callbacks have been registered
-  if( !start_action_callback_ || 
-      !is_finished_callback_  || 
-      !has_succeed_callback_  || 
-      !get_result_callback_   || 
-      !publish_feedback_callback_ )
+  if( start_action_callback_ && 
+      stop_action_callback_  &&
+      is_finished_callback_  && 
+      has_succeed_callback_  && 
+      get_result_callback_   && 
+      get_feedback_callback_ )
   {
-    ROS_ERROR("Some Callbacks have not been registered yet!");
-    return;
+    // launch action server
+    as_.start();
   }
+  else
+    ROS_FATAL("Some Callbacks have not been registered yet!");
+}
 
+template <class ActionSpec>
+void IriActionServer<ActionSpec>::executeCallback(const GoalConstPtr& goal)
+{
+  ROS_DEBUG("IriActionServer::executeCallback::start");
+  
   // init action 
   start_action_callback_(goal);
 
@@ -141,30 +155,40 @@ void IriActionServer<ActionSpec>::executeCallback(const GoalConstPtr& goal)
   // while action is active
   while( is_active )
   {
+    ROS_DEBUG("IriActionServer::executeCallback::Active!");
+    
     // check if preempt has been requested
     // and if ROS connection is OK
     if( as_.isPreemptRequested() || !ros::ok() )
     {
+      ROS_DEBUG("IriActionServer::executeCallback::PREEMPTED!");
       is_active = false;
+      
+      // stop action
+      stop_action_callback_();
+      as_.setPreempted();
     }
     // check if action has finished
     else if( is_finished_callback_() )
     {
+      ROS_DEBUG("IriActionServer::executeCallback::FINISH!");
       is_active = false;
 
       // get action result
-      ResultPtr result;
+      ResultPtr result(new Result);
       get_result_callback_(result);
       
       // action has been successfully accomplished
       if( has_succeed_callback_() )
       {
+	ROS_DEBUG("IriActionServer::executeCallback::SUCCEED!");
         // set action as succeeded
         as_.setSucceeded(*result); 
       }
       // action needs to be aborted
       else
       {
+	ROS_DEBUG("IriActionServer::executeCallback::ABORTED!");
         // set action as aborted
         as_.setAborted(*result); 
       }
@@ -172,9 +196,10 @@ void IriActionServer<ActionSpec>::executeCallback(const GoalConstPtr& goal)
     // action has not finished yet
     else
     {
+      ROS_DEBUG("IriActionServer::executeCallback::feedback");
       // get action feedback and publish it
-      FeedbackPtr feedback;
-      publish_feedback_callback_(feedback);
+      FeedbackPtr feedback(new Feedback);
+      get_feedback_callback_(feedback);
       as_.publishFeedback(*feedback); 
     }
     
@@ -189,6 +214,12 @@ void IriActionServer<ActionSpec>::registerStartCallback(boost::function<void (co
   start_action_callback_ = cb;
 }
 
+template <class ActionSpec>
+void IriActionServer<ActionSpec>::registerStopCallback(boost::function<void ()> cb)
+{
+  stop_action_callback_ = cb;
+}
+
 template <class ActionSpec>
 void IriActionServer<ActionSpec>::registerIsFinishedCallback( boost::function<bool ()> cb)
 {
@@ -208,9 +239,9 @@ void IriActionServer<ActionSpec>::registerGetResultCallback(boost::function<void
 }
 
 template <class ActionSpec>
-void IriActionServer<ActionSpec>::registerPublishFeedbackCallback(boost::function<void (FeedbackPtr&)> cb)
+void IriActionServer<ActionSpec>::registerGetFeedbackCallback(boost::function<void (FeedbackPtr&)> cb)
 {
-  publish_feedback_callback_ = cb;
+  get_feedback_callback_ = cb;
 }
 
 #endif
-- 
GitLab