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

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

Pacpus 2.0 beta fix : windows exports and remove miss-placed inc file

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