source: pacpusframework/branches/2.0-beta1/include/Pacpus/kernel/InputOutputInterface.h@ 152

Last change on this file since 152 was 152, checked in by Marek Kurdej, 11 years ago

Major update.
Renamed: addInput -> addInputs, addOutput -> addOutputs and made pure virtual (=0).
Transformed macro definitions into template methods: ADD_INPUT -> ComponentBase::addInput, ADD_OUTPUT -> ComponentBase::addOutput, GET_INPUT -> ComponentBase::getTypedInput, GET_OUTPUT -> ComponentBase::getTypedOutput.
Fixed: added public/protected set/get methods in ComponentBase, made member fields private.

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