source: pacpusframework/branches/2.0-beta1/include/Pacpus/kernel/inputOutputInterface.h@ 89

Last change on this file since 89 was 89, checked in by morasjul, 11 years ago

PACPUS 2.0 Beta deployed in new branch

Major changes:
-Add communication interface between components
-Add examples for communications interface (TestComponents)
-Move to Qt5 support

  • Property svn:executable set to *
File size: 6.6 KB
Line 
1#ifndef IN_OUT_INTERFACE_H
2#define IN_OUT_INTERFACE_H
3
4#include <Pacpus/kernel/inputOutputBase.h>
5#include <Pacpus/kernel/Log.h>
6#include <Pacpus/kernel/PacpusEvent.h>
7#include <Pacpus/kernel/CommunicationComponent.h>
8
9#include <typeinfo>
10#include <QThread>
11#include <QDebug>
12#include <QApplication>
13
14#include <QByteArray>
15
16#define ADD_INPUT(name,ComponentType, DataType, functionName) input.insert(name,new InputInterface<DataType,ComponentType> (name,this,&ComponentType::functionName))
17#define ADD_OUTPUT(name,ComponentType, DataType) output.insert(name,new OutputInterface<DataType,ComponentType> (name,this))
18#define GET_OUTPUT(name,ComponentType, DataType) dynamic_cast<OutputInterface<DataType,ComponentType> *> (output.value(name))
19
20namespace pacpus {
21
22template <class T, class C>
23class InputInterface : public InputInterfaceBase
24{
25public:
26 InputInterface(QString name, C * component, void (C::*m)(const T&)):InputInterfaceBase(name,component,component), method(m) {}
27 ~InputInterface() {}
28
29 enum ReadingMode {
30 NeverSkip,
31 TimeBounded,
32 GetLast
33 };
34
35 void setReadingMode(ReadingMode mode) { readingMode_ = mode;}
36 size_t getDataSize() {return sizeof(T);}
37 QString getDataType() {return QString(typeid(T).name());}
38
39 protected:
40 ReadingMode readingMode_;
41 int boundingTime_;
42
43 public:
44
45 void customEvent(QEvent* event) {
46
47 switch (event->type()) {
48
49 // from Component to Component (T->T)
50 case TYPED_EVENT: {
51 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
52 //qDebug() << "E1 ";
53 //qDebug() << "recived 2 thread " << QThread::currentThread();
54 if(typedEvent->tr_ == 0 && readingMode_ == TimeBounded) {
55 //LOG_WARN("Incorrect TimeRange (0), switch to NeverSkip");
56 readingMode_ = NeverSkip;}
57
58 switch (readingMode_){
59 case TimeBounded:
60 if(road_time() - typedEvent->t_> typedEvent->tr_)
61 break;
62 (dynamic_cast<C*>(_component)->*method)(typedEvent->_data);
63 break;
64 case GetLast:
65 (dynamic_cast<C*>(_component)->*method)(typedEvent->_data);
66 QCoreApplication::removePostedEvents(this,TYPED_EVENT); // delete all remining events
67 break;
68 case NeverSkip:
69 default:
70 (dynamic_cast<C*>(_component)->*method)(typedEvent->_data);
71 }
72 break;
73 }
74
75 // from Connection interface to Component (G->T)
76 case GENERIC_EVENT2: {
77 PacpusTypedEvent<QByteArray> * genericEvent = dynamic_cast<PacpusTypedEvent<QByteArray> *> (event);
78 qDebug() << "E2 ";
79 //if(sizeof(T) != genericEvent->_data.size())
80 // qDebug() << "Incorrecte size " << sizeof(T) << " " << genericEvent->_data.size();
81 qDebug() << "t[18]= " << road_time();
82 T data;
83 QByteArray& buf = (QByteArray&) genericEvent->_data;
84 //qDebug() << "DataSize " <<buf.size();
85 QDataStream in(&buf,QIODevice::ReadOnly);
86
87 qDebug() << "t[19]= " << road_time();
88 //in >> data; // copy 7
89 qDebug() << "t[20]= " << road_time();
90
91 (dynamic_cast<C*>(_component)->*method)(data); // copy 8 X
92
93 qDebug() << "t[21]= " << road_time();
94 break;
95 }
96
97 // from Component to Connection interface (T->G) (Typed in QByteArray)
98 case GENERIC_EVENT3: {
99 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
100 qDebug() << "E3 ";
101 qDebug() << "t[6]= " << road_time();
102 (dynamic_cast<C*>(_component)->*method)(typedEvent->_data); // copy 3 X
103 qDebug() << "t[7]= " << road_time();
104 break;
105 }
106
107 default:
108
109 qDebug() << "Bad event ID " << event->type();
110 break;
111 }
112
113
114 }
115
116protected:
117 void (C::*method)(const T&);
118
119};
120
121template <class T, class C>
122class OutputInterface : public OutputInterfaceBase
123{
124public:
125 OutputInterface(QString name, C * component):OutputInterfaceBase(name,component,component) {}
126 ~OutputInterface() {}
127
128 // Used by Components to send data througth typed output
129 void send(const T & data) {
130 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it){
131
132 if(it->getInputInterface()->getDataType() != QString(typeid(QByteArray).name()))
133 QApplication::postEvent(it->getInputInterface(),new PacpusTypedEvent<T>(QEvent::Type(TYPED_EVENT),data),it->getPriority());
134 else {
135 qDebug() << "t[1]= " << road_time();
136 //QByteArray buf((char*)(&data),sizeof(T));
137 QByteArray buf;
138 QDataStream out(&buf,QIODevice::ReadWrite);
139 qDebug() << "t[2]= " << road_time();
140 // out << data; // Copy 1
141 qDebug() << "t[3]= " << road_time();
142
143 PacpusTypedEvent<QByteArray> * ev =new PacpusTypedEvent<QByteArray>(QEvent::Type(GENERIC_EVENT3),buf);
144 qDebug() << "t[4]= " << road_time();
145 QApplication::postEvent(it->getInputInterface(),ev,it->getPriority()); // Copy 2 (ctor)
146 qDebug() << "t[5]= " << road_time();
147 //QApplication::postEvent(it->getInputInterface(),new PacpusTypedEvent<QByteArray>(QEvent::Type(GENERIC_EVENT3),buf),it->getPriority()); // Copy 2 (ctor)
148 }
149
150 //qDebug() << "send thread " << QThread::currentThread();
151 }
152 }
153
154 // Used by Connection Interfaces only to pose generic event
155 void sendGenericData(char * data, size_t size) {
156 qDebug() << "t[15]= " << road_time();
157 QByteArray buf(data,size); // copy 5
158 qDebug() << "t[16]= " << road_time();
159 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it)
160 QApplication::postEvent(it->getInputInterface(),new PacpusTypedEvent<QByteArray>(QEvent::Type(GENERIC_EVENT2),buf),it->getPriority()); // Copy 6(ctor)
161 qDebug() << "t[17]= " << road_time();
162 //qDebug() << "send thread " << QThread::currentThread();
163 }
164
165 size_t getDataSize() {return sizeof(T);}
166 QString getDataType() {return QString(typeid(T).name());}
167};
168
169
170} // namespace pacpus
171
172#endif // IN_OUT_INTERFACE_H
Note: See TracBrowser for help on using the repository browser.