asebaros.h
Go to the documentation of this file.
00001 #ifndef __ASEBA_ROS_H
00002 #define __ASEBA_ROS_H
00003 
00004 #include <dashel/dashel.h>
00005 #include <boost/thread.hpp>
00006 #include <boost/thread/mutex.hpp>
00007 
00008 #include <aseba/msg/msg.h>
00009 #include <aseba/msg/descriptions-manager.h>
00010 
00011 #include "ros/ros.h"
00012 #include "std_msgs/String.h"
00013 
00014 #include "asebaros/LoadScripts.h"
00015 #include "asebaros/GetNodeList.h"
00016 #include "asebaros/GetNodeId.h"
00017 #include "asebaros/GetNodeName.h"
00018 #include "asebaros/GetVariableList.h"
00019 #include "asebaros/SetVariable.h"
00020 #include "asebaros/GetVariable.h"
00021 #include "asebaros/GetEventId.h"
00022 #include "asebaros/GetEventName.h"
00023 
00024 #include "asebaros/AsebaEvent.h"
00025 #include "asebaros/AsebaAnonymousEvent.h"
00026 
00027 #include <vector>
00028 
00029 
00030 class AsebaROS;
00031 
00032 class AsebaDashelHub: public Dashel::Hub
00033 {
00034 private:
00035         boost::thread* thread; 
00036         AsebaROS* asebaROS; 
00037         bool forward; 
00038         
00039 public:
00044         AsebaDashelHub(AsebaROS* asebaROS, unsigned port, bool forward);
00045         
00051         void sendMessage(Aseba::Message *message, bool doLock, Dashel::Stream* sourceStream = 0);
00052 
00054         void operator()();
00056         void startThread();
00058         void stopThread();
00059         
00060 protected:
00061         virtual void connectionCreated(Dashel::Stream *stream);
00062         virtual void incomingData(Dashel::Stream *stream);
00063         virtual void connectionClosed(Dashel::Stream *stream, bool abnormal);
00064 };
00065 
00066 using namespace asebaros;
00067 
00068 typedef std::vector<ros::ServiceServer> ServiceServers;
00069 typedef std::vector<ros::Publisher> Publishers;
00070 typedef std::vector<ros::Subscriber> Subscribers;
00071 
00072 class AsebaROS: public Aseba::DescriptionsManager
00073 {
00074 protected:
00075         typedef std::map<std::string, unsigned> NodesNamesMap;
00076         typedef std::map<std::string, Aseba::Compiler::VariablesMap> UserDefinedVariablesMap;
00077         class GetVariableQueryKey
00078         {
00079         public:
00080                 GetVariableQueryKey(unsigned nodeId, unsigned pos) : nodeId(nodeId), pos(pos) { }
00081                 bool operator<(const GetVariableQueryKey &that) const {
00082                         return (nodeId < that.nodeId && pos < that.pos);
00083                 }
00084                 unsigned nodeId;
00085                 unsigned pos;
00086                 
00087         };
00088         struct GetVariableQueryValue
00089         {
00090                 typedef std::vector<sint16> DataVector;
00091                 DataVector data;
00092                 boost::condition_variable cond;
00093         };
00094         typedef std::map<GetVariableQueryKey, GetVariableQueryValue*> GetVariableQueryMap;
00095         
00096         ros::NodeHandle n; 
00097         ServiceServers s; 
00098         
00099         ros::Publisher anonPub; 
00100         ros::Subscriber anonSub; 
00101         Publishers pubs; 
00102         Subscribers subs; 
00103 
00104         AsebaDashelHub hub; 
00105         boost::mutex mutex; 
00106         
00107         Aseba::CommonDefinitions commonDefinitions; 
00108         NodesNamesMap nodesNames; 
00109         UserDefinedVariablesMap userDefinedVariablesMap; 
00110         GetVariableQueryMap getVariableQueries; 
00111         
00112 protected:
00113         bool loadScript(LoadScripts::Request& req, LoadScripts::Response& res);
00114         
00115         bool getNodeList(GetNodeList::Request& req, GetNodeList::Response& res);
00116         bool getNodeId(GetNodeId::Request& req, GetNodeId::Response& res);
00117         bool getNodeName(GetNodeName::Request& req, GetNodeName::Response& res);
00118         
00119         bool getVariableList(GetVariableList::Request& req, GetVariableList::Response& res);
00120         bool setVariable(SetVariable::Request& req, SetVariable::Response& res);
00121         bool getVariable(GetVariable::Request& req, GetVariable::Response& res);
00122         
00123         bool getEventId(GetEventId::Request& req, GetEventId::Response& res);
00124         bool getEventName(GetEventName::Request& req, GetEventName::Response& res);
00125         
00126         // utility
00127         bool getNodePosFromNames(const std::string& nodeName, const std::string& variableName, unsigned& nodeId, unsigned& pos) const;
00128         void sendEventOnROS(const Aseba::UserMessage* asebaMessage);
00129         
00130         // callbacks
00131         void nodeDescriptionReceived(unsigned nodeId);
00132         void eventReceived(const AsebaAnonymousEventConstPtr& event);
00133         void knownEventReceived(const uint16 id, const AsebaEventConstPtr& event);
00134         
00135 public:
00136         AsebaROS(unsigned port, bool forward);
00137         ~AsebaROS();
00138         
00139         void run();
00140         
00141         void processAsebaMessage(Aseba::Message *message);
00142         
00143         void connectTarget(const std::string& target) { hub.connect(target); }
00144 };
00145 
00146 
00147 
00148 #endif // __ASEBA_ROS_H


asebaros
Author(s): Stéphane Magnenat
autogenerated on Sun Oct 5 2014 23:47:01