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

Last change on this file since 94 was 94, checked in by DHERBOMEZ Gérald, 11 years ago

fix windows

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