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

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

Corrections in PacpusEvent, InputOutputBase, InputOutputInterface.
Fixed: DLL import/export in geodesie.h.

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