## For instruction on writing tutorials
## http://www.ros.org/wiki/WritingTutorials
####################################
##FILL ME IN
####################################
## for a custom note with links:
## note =
## for the canned note of "This tutorial assumes that you have completed the previous tutorials:" just add the links
## note.0=
## descriptive title for the tutorial
## title = Actionlib API support
## multi-line description to be displayed in search
## description = Create remote tasks as Actionlib Client
## the next tutorial description (optional)
## next =
## links to next tutorial (optional)
## next.0.link=
## next.1.link=
## what level user is this tutorial for
## level= BeginnerCategory
## keywords = decision_making
####################################
<<IncludeCSTemplate(TutorialCSHeaderTemplate)>>

<<TableOfContents(4)>>

= C++ =
== Node : node.cpp ==
Entry point of node

{{{
#include <ros/ros.h>
#include "Tasks.hpp"
....
int main(int argc, char** argv){
	  ros::init(argc, argv, "Name_of_node");
	  Task1 task1;
	  Task2 task2;
	  ros::spin();
	  return 0;
}
}}}
== Tasks: Tasks.hpp ==
{{{
#include <actionlib/server/simple_action_server.h>
#include <robot_task/RobotTask.h>
#include <robot_task/RobotTaskAction.h>
#include <robot_task/StringOperations.h>


using namespace std;
using namespace robot_task;

}}}
=== example of persistent task (do something forever) ===
{{{
class Task1:public RobotTask{
public:
   Task1(string name="/Name_Of_Task1"):
      RobotTask(name) ...
   {
       ...
   }
   ...
   TaskResult task(const string& name, const string& uid, Arguments& args){
      //hear you can advertise your topics and services, subscribes to others topics, etc.
      //for example
      ros::ServiceServer my_service =
    	_node.advertiseService<MyNodeName::MyServiceRequest, MyNodeName::MyServiceResponse>(
    	     "service_name",boost::bind(&Task1::FunciontNameForService,this,_1,_2)
    	);
      ...
      while(true){
            if (isPreempt()){

                /* HERE PROCESS PREEMPTION OR INTERAPT */

            	return TaskResult::Preempted();
            }

            /* HERE PROCESS TASK */
            
            ...

            /* SLEEP BETWEEN LOOP ITERATIONS */
            sleep(1000);
      }
      return TaskResult::FAIL();
   }
   ...
};

}}}

=== example of one action task (do something and finish with success or fail) ===
{{{
class Task2:public RobotTask{
public:
   Task1(string name="/Name_Of_Task2"):
      RobotTask(name) ...
   {
       ...
   }
   ...
   TaskResult task(const string& name, const string& uid, Arguments& args){
      //hear proc your arguments
      string target("");
      double distance(-1);
      if( args.find("target")!=args.end() ){
          target = args["target"];
      }
      if( args.find("distance")!=args.end() ){
          std::stringstream tmp; tmp << (args["distance"]);
          tmp >> distance;
      }
      ...
      if(...){
         ...
         return TaskResult(SUCCESS, "OK. Task is done.");
      }
      if(...){
         ...
         return TaskResult(FAIL, "Error. Task aborted because ...");
      }
      return TaskResult::FAIL();
   }
   ...
};

}}}

= Python =
== Manifest ==
{{{
<package>
  ....
  <depend package="robot_task"/>
  ...
</package>
}}}
== MyTask.py ==
{{{
#! /usr/bin/env python

import roslib; roslib.load_manifest('MyTaskProject')
import rospy
import actionlib
from RobotTaskPy import *
		
class MyTask(RobotTask):
	def __init__(self, name):
		print "Init",name
		RobotTask.__init__(self, name)	
	def task(self, name, uid, parameters):
		print "Start",name
		r = rospy.Rate(1)
		#parameters is a dictionary with task arguments
		#{arg_name: arg_value, arg_name: arg_value, ...}
		#while True:			
		for i in xrange(1, 10):
			if self.isPreepted():
				print "Preempt MyTask"
				return RTResult_PREEPTED()
			print '-- ',i,'Do something in MyTask'
			r.sleep()
		print "Finish MyTask"
		#error_code = RobotTask_FAIL + 1
		#return RTResult_ABORT(error_code,"Some Error detected: finished with error code "+str(error_code));
		return RTResult_SUCCESSED("Finished in Success")
if __name__ == '__main__':
	rospy.init_node('MyTaskNode')
	MyTask("MyTask")
	rospy.spin()
}}}

## AUTOGENERATED DO NOT DELETE
## TutorialCategory
## FILL IN THE STACK TUTORIAL CATEGORY HERE