source: pacpusframework/branches/2.0-beta1/include/Pacpus/kernel/InputOutputBase.h@ 152

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

Major update.
Renamed: addInput -> addInputs, addOutput -> addOutputs and made pure virtual (=0).
Transformed macro definitions into template methods: ADD_INPUT -> ComponentBase::addInput, ADD_OUTPUT -> ComponentBase::addOutput, GET_INPUT -> ComponentBase::getTypedInput, GET_OUTPUT -> ComponentBase::getTypedOutput.
Fixed: added public/protected set/get methods in ComponentBase, made member fields private.

  • Property svn:executable set to *
File size: 5.0 KB
Line 
1#ifndef IN_OUT_BASE_H
2#define IN_OUT_BASE_H
3
4#include <Pacpus/kernel/pacpus.h>
5#include <Pacpus/kernel/ConnectionBase.h>
6#include <Pacpus/kernel/PacpusEvent.h>
7
8#include <QApplication>
9#include <QList>
10#include <QString>
11#include <QStringList>
12#include <typeinfo>
13
14namespace pacpus {
15
16class ComponentBase;
17
18class PACPUSLIB_API AbstractInterface
19 : public QObject
20{
21 Q_OBJECT
22
23protected:
24 AbstractInterface(QString name, ComponentBase * component, QObject * parent = 0)
25 : m_name(name)
26 , m_component(component)
27 , QObject(parent)
28 {}
29
30 ~AbstractInterface()
31 {}
32
33public:
34 QString getSignature();
35 QString getName()
36 {
37 return m_name;
38 }
39
40 virtual QString getDataType() = 0;
41
42 ComponentBase * getComponent()
43 {
44 return m_component;
45 }
46
47 void addConnection(ConnectionBase connection)
48 {
49 m_connections.append(connection);
50 }
51
52 bool removeConnection(ConnectionBase connection)
53 {
54 return m_connections.removeOne(connection);
55 }
56
57 bool hasConnection()
58 {
59 return m_connections.size() > 0;
60 }
61
62protected:
63 QList<ConnectionBase> & connections()
64 {
65 return m_connections;
66 }
67
68 const QList<ConnectionBase> & connections() const
69 {
70 return m_connections;
71 }
72
73 QString name()
74 {
75 return m_name;
76 }
77
78 ComponentBase * component()
79 {
80 return m_component;
81 }
82
83 const ComponentBase * component() const
84 {
85 return m_component;
86 }
87
88private:
89 QString m_name;
90 ComponentBase * m_component;
91 QList<ConnectionBase> m_connections;
92};
93
94class PACPUSLIB_API InputInterfaceBase
95 : public AbstractInterface
96{
97 Q_OBJECT
98
99protected:
100 InputInterfaceBase(QString name, ComponentBase * component, QObject * parent = 0)
101 : AbstractInterface(name, component, parent)
102 {}
103
104public:
105 //InputInterfaceBase(QString name, ComponentBase * component,int a, QObject * parent = 0):AbstractInterface(name,component,parent) {} // TODO add ctor with function pointer
106
107 enum ReadingMode {
108 NeverSkip,
109 TimeBounded,
110 GetLast
111 };
112
113 virtual ~InputInterfaceBase()
114 {}
115
116 virtual void customEvent(QEvent* e)
117 {
118 //if(event->type())
119 //TODO get event Type anf call callback function
120
121 PacpusEvent * event = dynamic_cast<PacpusEvent *>(e);
122 QByteArray buf;
123 QDataStream out(&buf, QIODevice::WriteOnly);
124 event->streamOut(out);
125 // Callback QByteArray
126 }
127
128 ReadingMode & readingMode()
129 {
130 return m_readingMode;
131 }
132
133 const ReadingMode & readingMode() const
134 {
135 return m_readingMode;
136 }
137
138 void setReadingMode(ReadingMode mode)
139 {
140 m_readingMode = mode;
141 }
142
143 virtual PacpusEvent* getEventTemplate()
144 {
145 // TODO: check
146 return new PacpusEvent(GENERIC_EVENT);
147 }
148
149private:
150 ReadingMode m_readingMode;
151
152 // metode(QByteArray)
153 //QQueue jobQueue_;
154};
155
156class PACPUSLIB_API OutputInterfaceBase
157 : public AbstractInterface
158{
159 Q_OBJECT
160
161public:
162 OutputInterfaceBase(QString name, ComponentBase * component, QObject * parent = 0)
163 : AbstractInterface(name, component, parent)
164 {}
165
166 virtual ~OutputInterfaceBase()
167 {}
168
169 QStringList getInputConnectedList()
170 {
171 QStringList list;
172 for(QList<ConnectionBase>::iterator it = connections().begin(); it != connections().end(); ++it) {
173 list.append(it->getInterface()->getName());
174 }
175 return list;
176 }
177
178 void send(/*const*/ QByteArray & data)
179 {
180 // TODO check at least one Typed connection
181
182 for(QList<ConnectionBase>::iterator it = connections().begin(); it!=connections().end(); ++it){
183 QDataStream in(&data,QIODevice::ReadOnly);
184 PacpusEvent* event = dynamic_cast<InputInterfaceBase*>(connections().at(0).getInterface())->getEventTemplate();
185 event->streamIn(in);
186 QApplication::postEvent(it->getInterface(),event,it->getPriority());
187 }
188 }
189
190};
191
192static bool connectInterface(OutputInterfaceBase* out, InputInterfaceBase * in, int priority, InputInterfaceBase::ReadingMode mode = InputInterfaceBase::GetLast)
193{
194 if(out->getDataType() == in->getDataType() || out->getDataType() == QString(typeid(QByteArray).name()) || in->getDataType() == QString(typeid(QByteArray).name())) {
195 // Add connection
196 out->addConnection(ConnectionBase(in,priority)); // TODO make connect function
197 in->addConnection(ConnectionBase(out,priority));
198 in->setReadingMode(mode);
199 //LOG_INFO("connection : Output " << out->getSignature() << " => Input " << in->getSignature());
200 return true;
201 } else {
202 //LOG_WARN("connecting " << out->getSignature() << ":" << out->getDataType() << " to " << in->getSignature() << ":" << in->getDataType() << " failled : DataType incompatible " << QString(typeid(QByteArray).name()));
203 return false;
204 }
205}
206
207} // namespace pacpus
208
209#endif // IN_OUT_BASE_H
Note: See TracBrowser for help on using the repository browser.