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

Last change on this file since 195 was 195, checked in by Marek Kurdej, 11 years ago

Fixed: added missing include.

  • Property svn:executable set to *
File size: 7.5 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/pacpus.h>
30#include <Pacpus/kernel/XmlComponentConfig.h>
31
32#include <QString>
33#include <QMap>
34
35#include <boost/program_options/options_description.hpp>
36#include <boost/program_options/value_semantic.hpp>
37#include <string>
38
39class QWidget;
40
41namespace boost {
42namespace program_options {
43 class options_description_easy_init;
44}
45}
46
47namespace pacpus {
48
49class ComponentManager;
50
51class InputInterfaceBase;
52class OutputInterfaceBase;
53
54template <typename T, class C>
55class InputInterface;
56template <typename T, class C>
57class OutputInterface;
58
59/** ComponentBase
60 * @brief Base class of a Pacpus component.
61 */
62class PACPUSLIB_API ComponentBase
63{
64 friend class ComponentManager;
65
66public:
67 /**
68 * Enumeration of the state that can take a component, the three last states suppose
69 * that the component is started.
70 */
71 enum COMPONENT_STATE
72 {
73 STOPPED,
74 NOT_MONITORED,
75 MONITOR_OK,
76 MONITOR_NOK
77 };
78
79 /** Resulting state of a component after its configuration. */
80 enum COMPONENT_CONFIGURATION
81 {
82 CONFIGURED_OK,
83 NOT_CONFIGURED,
84 CONFIGURATION_DELAYED,
85 CONFIGURED_FAILED
86 };
87
88 /** Ctor of ComponentBase.
89 * @param name Name of your component.
90 */
91 ComponentBase(const QString& name);
92
93 /** Dtor of ComponentBase. */
94 virtual ~ComponentBase();
95
96 /** Return the state of the component.
97 * @return Value of the current state.
98 */
99 COMPONENT_STATE getState();
100
101 /** Check whether the component if configurer or not.
102 * @return True if the component is configured, otherwise false.
103 */
104 bool isConfigured() const;
105
106 /** Return the name of the component.
107 * @return Name of the component.
108 */
109 QString getName() const;
110
111 InputInterfaceBase * getInput(QString name) const;
112
113 OutputInterfaceBase * getOutput(QString name) const;
114
115protected:
116 /** Change the state of the component.
117 * @param state New component state.
118 */
119 void setState(COMPONENT_STATE state);
120
121 /** Called when the component starts, you must override this function. */
122 virtual void startActivity() = 0;
123
124 /** Called when the component stops, you must override this function. */
125 virtual void stopActivity() = 0;
126
127 /** Called by the ComponentManager, it configure the component thanks a XML node.
128 * @param config Component's XML node.
129 * @return State of the configuration.
130 * FIXME: 'config' should be const, but we can't change the prototype without breaking
131 * old stuff.
132 */
133 virtual COMPONENT_CONFIGURATION configureComponent(XmlComponentConfig config) = 0;
134
135 // virtual QString getType() = 0;
136
137 // Not Pure virtual, no need to implement if not needed !!!
138 virtual void addInputs() {}
139 virtual void addOutputs() {}
140
141 boost::program_options::options_description_easy_init addParameters();
142
143protected:
144 typedef QMap<QString, InputInterfaceBase *> InputsMap;
145 typedef QMap<QString, OutputInterfaceBase *> OutputsMap;
146
147 // TODO: use std::function<void (const DataType &)>
148 // TODO: use std::mem_fun<void (const DataType &)>
149 template <typename DataType, class ComponentType, typename Function>
150 void addInput(const char * name, Function function)
151 {
152 typedef InputInterface<DataType, ComponentType> InputType;
153 InputType * 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 OutputType * connection = new OutputType(name, dynamic_cast<ComponentType *>(this));
162 outputs().insert(name, connection);
163 }
164
165 template <typename DataType, class ComponentType>
166 InputInterface<DataType, ComponentType> *
167 getTypedInput(const char * name) const
168 {
169 return dynamic_cast<InputInterface<DataType, ComponentType> *>(getInput(name));
170 }
171
172 template <typename DataType, class ComponentType>
173 OutputInterface<DataType, ComponentType> *
174 getTypedOutput(const char * name) const
175 {
176 return dynamic_cast<OutputInterface<DataType, ComponentType> *>(getOutput(name));
177 }
178
179 bool isActive() const;
180 void setActive(bool isActive);
181 bool isRecording() const;
182 void setRecording(bool isRecording);
183
184 InputsMap & inputs();
185 const InputsMap & inputs() const;
186 OutputsMap & outputs();
187 const OutputsMap & outputs() const;
188
189 COMPONENT_CONFIGURATION configurationState() const;
190 void setConfigurationState(COMPONENT_CONFIGURATION state);
191
192 const XmlComponentConfig xmlParameters() const;
193
194protected:
195 std::string mName;
196 std::string mTypeName;
197
198 /// Whether to display or not the graphical interface (GUI)
199 bool hasGui() const;
200 bool isOutputVerbose() const;
201 int getVerbosityLevel() const;
202
203private:
204 /// Called by ComponentManager to handle parameters
205 /// @throws
206 void parseParameters(const XmlComponentConfig & cfg);
207
208 /// called by the ComponentManager to start the component
209 int startComponent();
210
211 /// called by the ComponentManager to stop the component
212 int stopComponent();
213
214private:
215 bool mHasGui;
216 bool mVerbose;
217 int mVerbosityLevel;
218
219 boost::program_options::options_description mOptionsDescription;
220
221 /// The XML node that is got in the configureComponent method
222 XmlComponentConfig param;
223
224 /// the name of the component. It is this one in the XML config file
225 QString m_componentName;
226
227 /// is the component active?
228 volatile bool m_isActive;
229
230 /// is the component is recording data?
231 bool mIsRecording;
232
233 /// a pointer to the manager of components
234 ComponentManager * m_manager;
235
236 InputsMap m_inputs;
237 OutputsMap m_outputs;
238
239 /// a pointer to an optional widget
240 QWidget * m_ui;
241
242 /// store the state of the component
243 COMPONENT_STATE m_componentState;
244
245 /// is the component configured (ie configureComponent method was called)
246 COMPONENT_CONFIGURATION m_configurationState;
247};
248
249} // pacpus
250
251#endif // DEF_PACPUS_COMPONENTBASE_H
Note: See TracBrowser for help on using the repository browser.