00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef OCL_DEPLOYMENTCOMPONENT_HPP
00030 #define OCL_DEPLOYMENTCOMPONENT_HPP
00031
00032 #include <rtt/RTT.hpp>
00033 #include <rtt/TaskContext.hpp>
00034 #include <rtt/extras/Properties.hpp>
00035 #include <rtt/Attribute.hpp>
00036 #include <rtt/InputPort.hpp>
00037 #include <rtt/OutputPort.hpp>
00038 #include <ocl/OCL.hpp>
00039 #include <vector>
00040 #include <map>
00041 #include <rtt/marsh/PropertyDemarshaller.hpp>
00042
00043
00044 #ifndef OCL_STATIC
00045 #define OCL_STATIC
00046 #include <ocl/Component.hpp>
00047 #undef OCL_STATIC
00048 #else
00049 #include <ocl/Component.hpp>
00050 #endif
00051
00052 namespace OCL
00053 {
00054
00086 class OCL_API DeploymentComponent
00087 : public RTT::TaskContext
00088 {
00089 protected:
00094 RTT::PropertyBag root;
00095 std::string compPath;
00096 int defaultWaitPeriodPolicy;
00097 RTT::Property<bool> autoUnload;
00098 RTT::Attribute<bool> validConfig;
00099 RTT::Constant<int> sched_RT;
00100 RTT::Constant<int> sched_OTHER;
00101 RTT::Constant<int> lowest_Priority;
00102 RTT::Constant<int> highest_Priority;
00103 RTT::Attribute<std::string> target;
00105 int nextGroup;
00106
00112 struct ComponentData {
00113 ComponentData()
00114 : instance(0), act(0), loaded(false), loadedProperties(false),
00115 autostart(false), autoconf(false),
00116 autoconnect(false), autosave(false),
00117 proxy(false), server(false),
00118 use_naming(true),
00119 configfile(""),
00120 group(0)
00121 {}
00125 RTT::TaskContext* instance;
00130 base::ActivityInterface* act;
00136 bool loaded;
00141 bool loadedProperties;
00142 bool autostart, autoconf, autoconnect, autosave;
00143 bool proxy, server, use_naming;
00144 std::string configfile;
00145 std::vector<std::string> plugins;
00147 int group;
00148 };
00149
00153 struct ConnectionData {
00154 typedef std::vector<RTT::base::PortInterface*> Ports;
00155 typedef std::vector<RTT::TaskContext*> Owners;
00156 Ports ports;
00157 Owners owners;
00158 RTT::ConnPolicy policy;
00159 };
00160
00164 typedef std::map<std::string, ConnectionData> ConMap;
00165 ConMap conmap;
00166
00170 typedef std::map<std::string, ComponentData> CompMap;
00171 typedef std::list<std::string> CompList;
00172 CompMap compmap;
00173 CompList comps;
00174
00181 bool configureHook();
00182
00187 bool unloadComponentImpl( CompMap::iterator cit );
00188
00189
00197 virtual bool componentLoaded(RTT::TaskContext* c);
00198
00204 virtual void componentUnloaded(RTT::TaskContext* c);
00205
00214 Service::shared_ptr stringToService(std::string const& names);
00223 ServiceRequester::shared_ptr stringToServiceRequester(std::string const& names);
00232 base::PortInterface* stringToPort(std::string const& names);
00233
00238 bool waitForSignal(int signumber);
00239
00244 bool waitForInterrupt();
00245
00246 public:
00266 DeploymentComponent(std::string name = "Deployer", std::string siteFile = "");
00267
00274 ~DeploymentComponent();
00275
00276 RTT::TaskContext* myGetPeer(std::string name) {return compmap[ name ].instance; }
00277
00288 bool connectPeers(const std::string& one, const std::string& other);
00289
00290 using TaskContext::connectPorts;
00308 bool connectPorts(const std::string& one, const std::string& other);
00309
00325 bool connectPorts(const std::string& one, const std::string& one_port,
00326 const std::string& other, const std::string& other_port);
00327
00338 bool connect(const std::string& one, const std::string& other, ConnPolicy policy);
00339
00347 bool stream(const std::string& port, ConnPolicy policy);
00348
00352 bool createStream(const std::string& component, const std::string& port, ConnPolicy policy);
00353
00354 using TaskContext::connectServices;
00363 bool connectServices(const std::string& one, const std::string& other);
00364
00371 bool connectOperations(const std::string& required, const std::string& provided);
00372
00383 bool addPeer(const std::string& from, const std::string& target);
00384
00396 bool aliasPeer(const std::string& from, const std::string& target, const std::string& alias);
00397
00398 using RTT::TaskContext::addPeer;
00399 using RTT::TaskContext::connectPeers;
00400
00415 bool import(const std::string& package);
00416
00424 void path(const std::string& path);
00425
00435 bool loadLibrary(const std::string& name);
00436
00446 bool reloadLibrary(const std::string& filepath);
00447
00459 bool loadComponent(const std::string& name, const std::string& type);
00460
00475 bool loadService(const std::string& component, const std::string& service);
00476
00485 bool unloadComponent(const std::string& name);
00486
00492 void displayComponentTypes() const;
00493
00499 std::vector<std::string> getComponentTypes() const;
00500
00512 bool setPeriodicActivity(const std::string& comp_name,
00513 double period, int priority,
00514 int scheduler);
00515
00527 bool setActivity(const std::string& comp_name,
00528 double period, int priority,
00529 int scheduler);
00530
00542 bool setFileDescriptorActivity(const std::string& comp_name,
00543 double timeout, int priority,
00544 int scheduler);
00545
00558 bool setActivityOnCPU(const std::string& comp_name,
00559 double period, int priority,
00560 int scheduler, unsigned int cpu_nr);
00561
00570 bool setSequentialActivity(const std::string& comp_name);
00571
00581 bool setSlaveActivity(const std::string& comp_name,
00582 double period);
00583
00592 bool setMasterSlaveActivity(const std::string& comp_name,
00593 const std::string& master_name);
00594
00610 bool setNamedActivity(const std::string& comp_name,
00611 const std::string& act_type,
00612 double period, int priority,
00613 int scheduler, const std::string& master_name = "");
00614
00629 bool setNamedActivity(const std::string& comp_name,
00630 const std::string& act_type,
00631 double period, int priority,
00632 int scheduler, unsigned cpu_affinity,
00633 const std::string& master_name = "");
00634
00643 bool setWaitPeriodPolicy(const std::string& comp_name,
00644 int policy);
00645
00661 bool loadComponents(const std::string& config_file);
00675 bool loadComponentsInGroup(const std::string& config_file,
00676 const int group);
00677
00704 bool configureComponents();
00705
00713 bool configureComponentsGroup(const int group);
00714
00720 bool startComponents();
00726 bool startComponentsGroup(const int group);
00727
00732 void clearConfiguration();
00733
00737 bool stopComponents();
00743 bool stopComponentsGroup(const int group);
00744
00748 bool cleanupComponents();
00754 bool cleanupComponentsGroup(const int group);
00755
00759 bool unloadComponents();
00765 bool unloadComponentsGroup(const int group);
00766
00771 bool kickStart(const std::string& file_name);
00772
00778 bool kickOutComponent(const std::string& comp_name);
00779
00784 void kickOut(const std::string& config_file);
00785
00791 bool kickOutAll();
00796 bool kickOutGroup(const int group);
00797
00802 bool runScript(const std::string& file_name);
00803
00804 using base::TaskCore::configure;
00805
00814 bool configure(const std::string& name);
00815
00825 bool configureFromFile(const std::string& name, const std::string& filename);
00826
00841 bool loadConfiguration(const std::string& config_file);
00842
00849 bool loadConfigurationString(const std::string& config_text);
00850
00855 const RTT::FactoryMap& getFactories() const;
00856
00862 bool configureComponent(RTT::TaskContext *instance);
00863
00869 bool configureComponent(const std::string& comp_name)
00870 {
00871 return this->configureComponent( this->getPeer(comp_name) );
00872 }
00873
00879 bool startComponent(RTT::TaskContext *instance);
00880
00886 bool startComponent(const std::string& comp_name)
00887 {
00888 return this->startComponent( this->getPeer(comp_name) );
00889 }
00890
00896 bool stopComponent(RTT::TaskContext *instance);
00897
00903 bool stopComponent(const std::string& comp_name)
00904 {
00905 return this->stopComponent( this->getPeer(comp_name) );
00906 }
00907
00913 bool cleanupComponent(RTT::TaskContext *instance);
00914
00920 bool cleanupComponent(const std::string& comp_name)
00921 {
00922 return this->cleanupComponent( this->getPeer(comp_name) );
00923 }
00924
00932 void shutdownDeployment();
00933
00934 };
00935
00936
00937 }
00938 #endif