source: pacpusframework/branches/2.0-beta1/include/Pacpus/kernel/InputOutputInterface.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: 6.9 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
24 : public InputInterfaceBase
25{
26public:
27 InputInterface(QString name, C * component, void (C::*m)(const T&))
28 : InputInterfaceBase(name,component,component)
29 , method(m)
30 {}
31
32 ~InputInterface()
33 {}
34
35 size_t getDataSize()
36 {
37 return sizeof(T);
38 }
39
40 QString getDataType()
41 {
42 return QString(typeid(T).name());
43 }
44
45 PacpusEvent* getEventTemplate()
46 {
47 return new PacpusTypedEvent<T>(TYPED_EVENT);
48 }
49
50 void customEvent(QEvent* event)
51 {
52 // TODO check component state started
53 switch (event->type()) {
54 case TYPED_EVENT:
55 {
56 // cast from Component to Component (T->T)
57 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
58
59 //qDebug() << "Reciever " << getSignature() << " thread " << QThread::currentThread() << " Data & " << & typedEvent->data_;
60
61 //if(_component) get state
62
63 if (typedEvent->timerange() < 500 && readingMode() == TimeBounded) {
64 //LOG_WARN("Incorrect TimeRange (0), switch to NeverSkip");
65 qDebug() << "Incorrect TimeRange (0), switch to NeverSkip";
66 readingMode() = NeverSkip;}
67
68 switch (readingMode()) {
69 case TimeBounded:
70 //qDebug() << "Input " << this->getSignature().leftJustified(20) << QString("Time bournded").leftJustified(15) << road_time()- typedEvent->t_ << "\t" << typedEvent->tr_;
71
72 if (road_time() - typedEvent->time() > typedEvent->timerange()) {
73 qDebug() << "Data skip " << this->getSignature();
74 break;
75 }
76
77 (dynamic_cast<C*>(component())->*method)(typedEvent->data());
78 break;
79
80 case GetLast:
81 //qDebug() << "Input " << this->getSignature().leftJustified(20) << QString("GetLast").leftJustified(15) << road_time() - typedEvent->t_ << "\t" << typedEvent->tr_;
82
83 (dynamic_cast<C*>(component())->*method)(typedEvent->data());
84 QCoreApplication::removePostedEvents(this,TYPED_EVENT); // delete all remining events
85 break;
86
87 case NeverSkip:
88 //qDebug() << "Input " << this->getSignature().leftJustified(20) << QString("NeverSkip").leftJustified(15) << road_time() - typedEvent->t_ << "\t" << typedEvent->tr_;
89
90 default:
91 (dynamic_cast<C*>(component())->*method)(typedEvent->data());
92 }
93 break;
94 }
95
96 // from Connection interface to Component (G->T)
97 /* case GENERIC_EVENT2: {
98 PacpusTypedEvent<QByteArray> * genericEvent = dynamic_cast<PacpusTypedEvent<QByteArray> *> (event);
99 T data;
100 QByteArray& buf = (QByteArray&) genericEvent->data_;
101 QDataStream in(&buf,QIODevice::ReadOnly);
102
103 (dynamic_cast<C*>(_component)->*method)(data); // copy 8 X
104 break;
105 }
106
107 // from Component to Connection interface (T->G) (Typed in QByteArray)
108 case GENERIC_EVENT3: {
109 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
110 (dynamic_cast<C*>(_component)->*method)(typedEvent->data_); // copy 3 X
111
112 break;
113 }*/
114
115 default:
116
117 qDebug() << "Unknown event ID " << event->type();
118 break;
119 }
120 event->accept();
121 }
122
123 T& getData() {
124 T data;
125 // TODO ask output data;
126
127 //LOG4CXX_INFO(getLogger(), "Hello, World");
128
129 return data;
130 }
131
132protected:
133 void (C::*method)(const T&);
134
135 /* log4cxx::LoggerPtr& getLogger() {
136 static log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger( LOG4CXX_LOCATION.getClassName()));
137 return logger;
138 }*/
139
140};
141
142template <class T, class C>
143class OutputInterface : public OutputInterfaceBase
144{
145public:
146 OutputInterface(QString name, C * component):OutputInterfaceBase(name,component,component) {}
147 ~OutputInterface() {}
148
149 // Used by Components to send data througth typed output
150 void send(const T & data, road_time_t t = road_time(), road_timerange_t tr = 0) {
151
152 //QSharedPointer<T> sharedPointer = new T(data);
153
154 for(QList<ConnectionBase>::iterator it = connections().begin(); it != connections().end(); ++it){
155 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<T>(TYPED_EVENT,data,t,tr),it->getPriority()); // Event is delete by the event loop handler
156 //qDebug() << "sender " << it->getInterface()->getSignature() << " thread " << QThread::currentThread() << " Data & " << &data << " ";
157 // TODO Data Shared
158 }
159 }
160
161 /* void send(const T & data, road_time_t t = road_time(), road_timerange_t tr = 0) {
162 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it){
163
164 if(it->getInterface()->getDataType() != QString(typeid(QByteArray).name()))
165 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<T>(TYPED_EVENT,data,t,tr),it->getPriority());
166 else {
167 QByteArray buf;
168 QDataStream out(&buf,QIODevice::ReadWrite);
169 PacpusTypedEvent<QByteArray> * ev =new PacpusTypedEvent<QByteArray>(GENERIC_EVENT3,buf);
170 QApplication::postEvent(it->getInterface(),ev,it->getPriority()); // Copy 2 (ctor)
171 }
172 }
173 }
174
175 // Used by Connection Interfaces only to pose generic event
176 void sendGenericData(char * data, size_t size) {
177 QByteArray buf(data,size); // copy 5
178 for(QList<ConnectionBase>::iterator it = _connection.begin(); it!=_connection.end(); ++it)
179 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<QByteArray>(GENERIC_EVENT2,buf),it->getPriority()); // Copy 6(ctor)
180
181
182 }
183*/
184 size_t getDataSize()
185 {
186 return sizeof(T);
187 }
188
189 QString getDataType()
190 {
191 return QString(typeid(T).name());
192 }
193};
194
195
196} // namespace pacpus
197
198#endif // IN_OUT_INTERFACE_H
Note: See TracBrowser for help on using the repository browser.