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

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

Beta-2 : Fix CMakeList (link), remove useless code and add improvement

  • 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/Log.h>
5#include <Pacpus/kernel/inputOutputBase.h>
6#include <QApplication>
7#include <typeinfo>
8
9#include <QDebug>
10#include <QThread>
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
17#define GET_OUTPUT(name,ComponentType, DataType) dynamic_cast<OutputInterface<DataType,ComponentType> *> (output.value(name))
18#define GET_INPUT(name,ComponentType, DataType) dynamic_cast<InputInterface<DataType,ComponentType> *> (input.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 size_t getDataSize() {return sizeof(T);}
29 QString getDataType() {return QString(typeid(T).name());}
30
31protected:
32
33public:
34
35 PacpusEvent* getEventTemplate() {return new PacpusTypedEvent<T>(TYPED_EVENT); }
36
37 void customEvent(QEvent* event) {
38
39 switch (event->type()) {
40
41 // from Component to Component (T->T)
42 case TYPED_EVENT: {
43 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
44
45 qDebug() << "Revever " << getSignature() << " thread " << QThread::currentThread() << " Data & " << & typedEvent->data_;
46
47 if(typedEvent->tr_ < 500 && readingMode_ == TimeBounded) {
48 //LOG_WARN("Incorrect TimeRange (0), switch to NeverSkip");
49 qDebug() << "Incorrect TimeRange (0), switch to NeverSkip";
50 readingMode_ = NeverSkip;}
51
52 switch (readingMode_){
53 case TimeBounded:
54 qDebug() << "Input " << this->getSignature().leftJustified(20) << QString("Time bournded").leftJustified(15) << road_time()- typedEvent->t_ << "\t" << typedEvent->tr_;
55
56 if(road_time() - typedEvent->t_> typedEvent->tr_)
57 {qDebug() << "Data skip " << this->getSignature(); break;}
58
59 (dynamic_cast<C*>(_component)->*method)(typedEvent->data_);
60 break;
61
62 case GetLast:
63 qDebug() << "Input " << this->getSignature().leftJustified(20) << QString("GetLast").leftJustified(15) << road_time() - typedEvent->t_ << "\t" << typedEvent->tr_;
64
65 (dynamic_cast<C*>(_component)->*method)(typedEvent->data_);
66 QCoreApplication::removePostedEvents(this,TYPED_EVENT); // delete all remining events
67 break;
68
69 case NeverSkip:
70 qDebug() << "Input " << this->getSignature().leftJustified(20) << QString("NeverSkip").leftJustified(15) << road_time() - typedEvent->t_ << "\t" << typedEvent->tr_;
71
72 default:
73 (dynamic_cast<C*>(_component)->*method)(typedEvent->data_);
74 }
75 break;
76 }
77
78 // from Connection interface to Component (G->T)
79 /* case GENERIC_EVENT2: {
80 PacpusTypedEvent<QByteArray> * genericEvent = dynamic_cast<PacpusTypedEvent<QByteArray> *> (event);
81 T data;
82 QByteArray& buf = (QByteArray&) genericEvent->data_;
83 QDataStream in(&buf,QIODevice::ReadOnly);
84
85 (dynamic_cast<C*>(_component)->*method)(data); // copy 8 X
86 break;
87 }
88
89 // from Component to Connection interface (T->G) (Typed in QByteArray)
90 case GENERIC_EVENT3: {
91 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
92 (dynamic_cast<C*>(_component)->*method)(typedEvent->data_); // copy 3 X
93
94 break;
95 }*/
96
97 default:
98
99 qDebug() << "Unknown event ID " << event->type();
100 break;
101 }
102 event->accept();
103 }
104
105 T& getData() {
106 T data;
107 // TODO ask output data;
108
109 //LOG4CXX_INFO(getLogger(), "Hello, World");
110
111 return data;
112 }
113
114protected:
115 void (C::*method)(const T&);
116
117 /* log4cxx::LoggerPtr& getLogger() {
118 static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger( LOG4CXX_LOCATION.getClassName()));
119 return logger;
120 }*/
121
122};
123
124template <class T, class C>
125class OutputInterface : public OutputInterfaceBase
126{
127public:
128 OutputInterface(QString name, C * component):OutputInterfaceBase(name,component,component) {}
129 ~OutputInterface() {}
130
131 // Used by Components to send data througth typed output
132 void send(const T & data, road_time_t t = road_time(), road_timerange_t tr = 0) {
133
134 //QSharedPointer<T> sharedPointer = new T(data);
135
136 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it){
137 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<T>(TYPED_EVENT,data,t,tr),it->getPriority()); // Event is delete by the event loop handler
138 qDebug() << "sender " << it->getInterface()->getSignature() << " thread " << QThread::currentThread() << " Data & " << &data << " ";
139 // TODO DAta SHAred
140 }
141 }
142
143 /* void send(const T & data, road_time_t t = road_time(), road_timerange_t tr = 0) {
144 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it){
145
146 if(it->getInterface()->getDataType() != QString(typeid(QByteArray).name()))
147 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<T>(TYPED_EVENT,data,t,tr),it->getPriority());
148 else {
149 QByteArray buf;
150 QDataStream out(&buf,QIODevice::ReadWrite);
151 PacpusTypedEvent<QByteArray> * ev =new PacpusTypedEvent<QByteArray>(GENERIC_EVENT3,buf);
152 QApplication::postEvent(it->getInterface(),ev,it->getPriority()); // Copy 2 (ctor)
153 }
154 }
155 }
156
157 // Used by Connection Interfaces only to pose generic event
158 void sendGenericData(char * data, size_t size) {
159 QByteArray buf(data,size); // copy 5
160 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it)
161 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<QByteArray>(GENERIC_EVENT2,buf),it->getPriority()); // Copy 6(ctor)
162
163
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.