source: pacpusframework/trunk/include/Pacpus/kernel/ComponentBase.h@ 342

Last change on this file since 342 was 312, checked in by Marek Kurdej, 10 years ago

ComponentBase: added addParameter.

  • Property svn:executable set to *
File size: 8.4 KB
Line 
1// %pacpus:license{
2// This file is part of the PACPUS framework distributed under the
3// CECILL-C License, Version 1.0.
4// %pacpus:license}
5/// @file
6/// @author Gerald Dhermobez <firstname.surname@utc.fr>
7/// @author Marek Kurdej <firstname.surname@utc.fr>
8/// @author Samuel Gosselin <firstname.surname@utc.fr>
9/// @author Julien Moras <firstname.surname@utc.fr>
10/// @date February, 2006
11/// @version $Id: ComponentBase.h 76 2013-01-10 17:05:10Z kurdejma $
12/// @copyright Copyright (c) UTC/CNRS Heudiasyc 2006 - 2013. All rights reserved.
13/// @brief Generic ComponentBase class. This is an abstract class.
14///
15/// Detailed description.
16/// @todo - see if some methods can be private with ComponentManager
17/// friendship
18/// - include the copy of Xml node in param here
19/// - see if there is a possibility to avoid the constraint
20/// on parameters in the constructor of derived class
21
22#ifndef DEF_PACPUS_COMPONENTBASE_H
23#define DEF_PACPUS_COMPONENTBASE_H
24
25//#include <Pacpus/kernel/ComponentManager.h>
26#include <Pacpus/kernel/InputOutputBase.h>
27// InputOutputInterface.h must be included, otherwise we could not use addInput, addOutput template methods
28#include <Pacpus/kernel/InputOutputInterface.h>
29#include <Pacpus/kernel/PacpusLibConfig.h>
30#include <Pacpus/kernel/XmlComponentConfig.h>
31
32#include <boost/noncopyable.hpp>
33#include <boost/program_options/options_description.hpp>
34#include <boost/program_options/value_semantic.hpp>
35#include <QMap>
36#include <QString>
37#include <string>
38
39class QWidget;
40
41namespace boost
42{
43class exception_ptr;
44
45namespace program_options
46{
47 class options_description_easy_init;
48} // namespace program_options
49
50} // namespace boost
51
52namespace pacpus
53{
54
55class ComponentBase;
56
57class ComponentManager;
58
59class InputInterfaceBase;
60class OutputInterfaceBase;
61
62template <typename T, class C>
63class InputInterface;
64template <typename T, class C>
65class OutputInterface;
66
67using boost::program_options::value;
68
69/// @brief Base class of a Pacpus component.
70class PACPUSLIB_API ComponentBase
71 : boost::noncopyable
72{
73 friend class ComponentManager;
74
75public:
76 /// Enumeration of the state that can take a component, the three last states suppose
77 /// that the component is started.
78 enum COMPONENT_STATE {
79 STOPPED,
80 NOT_MONITORED,
81 MONITOR_OK,
82 MONITOR_NOK
83 };
84
85 /// Resulting state of a component after its configuration.
86 enum COMPONENT_CONFIGURATION {
87 CONFIGURED_OK,
88 NOT_CONFIGURED,
89 CONFIGURATION_DELAYED,
90 CONFIGURED_FAILED
91 };
92
93 /// Ctor of ComponentBase.
94 /// @param name Name of your component.
95 ComponentBase(QString const& name);
96
97 /// Dtor of ComponentBase.
98 virtual ~ComponentBase();
99
100 /// Returns the state of the component.
101 /// @return Value of the current state.
102 COMPONENT_STATE getState();
103
104 /// Checks whether the component if configurer or not.
105 /// @return @b true if the component is configured, otherwise @b false.
106 bool isConfigured() const;
107
108 /// Returns the name of the component.
109 /// @return Name of the component.
110 QString getName() const;
111
112 /// @returns @b true if the component has been started and is active (working)
113 bool isActive() const;
114
115protected:
116 /// Changes the state of the component.
117 /// @param state New component state.
118 void setState(COMPONENT_STATE state);
119
120 /// Called when the component starts, you must override this function.
121 virtual void startActivity() = 0;
122
123 /// Called when the component stops, you must override this function.
124 virtual void stopActivity() = 0;
125
126 /// Called by the ComponentManager, it configure the component thanks a XML node.
127 /// @param config Component's XML node.
128 /// @return State of the configuration.
129 /// @todo FIXME: 'config' should be const, but it will be a breaking change
130 /// old stuff.
131 virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config) = 0;
132
133 // virtual QString getType() = 0;
134
135 /// @todo FIXME: should be pure virtual, but it will be a breaking change
136 virtual void addInputs() {}
137 virtual void addOutputs() {}
138
139 /// Returns an object permitting to add component parameters.
140 boost::program_options::options_description_easy_init addParameters();
141 void addParameter(const char* name, const char* description);
142 void addParameter(const char* name, const boost::program_options::value_semantic* s);
143 void addParameter(const char* name, const boost::program_options::value_semantic* s, const char* description);
144
145protected:
146 typedef QMap<QString, InputSharedPointer> InputsMap;
147 typedef QMap<QString, OutputSharedPointer> OutputsMap;
148
149 template <typename DataType, class ComponentType, typename Function>
150 void addInput(const char * name, Function function)
151 {
152 typedef InputInterface<DataType, ComponentType> InputType;
153 InputSharedPointer connection(new InputType(name, dynamic_cast<ComponentType *>(this), function));
154 inputs().insert(name, connection);
155 }
156
157 template <typename DataType, class ComponentType>
158 void addOutput(const char * name)
159 {
160 typedef OutputInterface<DataType, ComponentType> OutputType;
161 OutputSharedPointer connection(new OutputType(name, dynamic_cast<ComponentType *>(this)));
162 outputs().insert(name, connection);
163 }
164
165 /// @todo DOC
166 InputInterfaceBase* getInput(QString name) const;
167
168 /// @todo DOC
169 OutputInterfaceBase* getOutput(QString name) const;
170
171 template <typename DataType, class ComponentType>
172 InputInterface<DataType, ComponentType>* getTypedInput(const char * name) const
173 {
174 //using boost::dynamic_pointer_cast;
175 //return dynamic_pointer_cast<InputInterface<DataType, ComponentType> >(getInput(name));
176 return dynamic_cast<InputInterface<DataType, ComponentType>*>(getInput(name));
177 }
178
179 template <typename DataType, class ComponentType>
180 OutputInterface<DataType, ComponentType>* getTypedOutput(const char * name) const
181 {
182 //using boost::dynamic_pointer_cast;
183 //return dynamic_pointer_cast<OutputInterface<DataType, ComponentType> >(getOutput(name));
184 return dynamic_cast<OutputInterface<DataType, ComponentType>*>(getOutput(name));
185 }
186
187 void setActive(bool isActive);
188 bool isRecording() const;
189 void setRecording(bool isRecording);
190
191 InputsMap & inputs();
192 const InputsMap & inputs() const;
193 OutputsMap & outputs();
194 const OutputsMap & outputs() const;
195
196 COMPONENT_CONFIGURATION configurationState() const;
197 void setConfigurationState(COMPONENT_CONFIGURATION state);
198
199 const XmlComponentConfig xmlParameters() const;
200
201protected:
202 std::string mName;
203 std::string mTypeName;
204 //QThread mThread;
205
206 /// Whether to display or not the graphical interface (GUI)
207 bool hasGui() const;
208 bool isOutputVerbose() const;
209 int getVerbosityLevel() const;
210
211private:
212 /// Called by ComponentManager to handle parameters
213 /// @throws
214 void parseParameters(const XmlComponentConfig & cfg);
215
216 /// called by the ComponentManager to start the component
217 int startComponent();
218 void startComponentInThread();
219 void startComponentWithException(boost::exception_ptr& error);
220
221 /// called by the ComponentManager to stop the component
222 int stopComponent();
223
224private:
225 bool mHasGui;
226 bool mVerbose;
227 int mVerbosityLevel;
228
229 boost::program_options::options_description mOptionsDescription;
230
231 /// The XML node that is got in the configureComponent method
232 XmlComponentConfig param;
233
234 /// the name of the component. It is this one in the XML config file
235 QString m_componentName;
236
237 /// is the component active?
238 volatile bool m_isActive;
239
240 /// is the component is recording data?
241 bool mIsRecording;
242
243 /// a pointer to the manager of components
244 ComponentManager * m_manager;
245
246 InputsMap m_inputs;
247 OutputsMap m_outputs;
248
249 /// a pointer to an optional widget
250 QWidget * m_ui;
251
252 /// store the state of the component
253 COMPONENT_STATE m_componentState;
254
255 /// is the component configured (ie configureComponent method was called)
256 COMPONENT_CONFIGURATION m_configurationState;
257};
258
259} // pacpus
260
261#endif // DEF_PACPUS_COMPONENTBASE_H
Note: See TracBrowser for help on using the repository browser.