source: pacpusframework/trunk/include/Pacpus/kernel/InputOutputInterface.h@ 184

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

Minor fixes.

  • Property svn:executable set to *
File size: 3.7 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>
[153]7#include <QByteArray>
8#include <QThread>
[110]9#include <typeinfo>
[89]10
11namespace pacpus {
12
[152]13template <typename T, class C>
[148]14class InputInterface
15 : public InputInterfaceBase
[89]16{
17public:
[148]18 InputInterface(QString name, C * component, void (C::*m)(const T&))
[152]19 : InputInterfaceBase(name, component, component)
[148]20 , method(m)
21 {}
[89]22
[148]23 ~InputInterface()
24 {}
[89]25
[148]26 size_t getDataSize()
27 {
28 return sizeof(T);
29 }
[89]30
[148]31 QString getDataType()
32 {
33 return QString(typeid(T).name());
34 }
[96]35
[148]36 PacpusEvent* getEventTemplate()
37 {
38 return new PacpusTypedEvent<T>(TYPED_EVENT);
39 }
40
[184]41 void customEvent(QEvent * event)
[148]42 {
43 // TODO check component state started
[182]44 //if (_component) get state
[89]45 switch (event->type()) {
[148]46 case TYPED_EVENT:
47 {
[159]48
[110]49 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event);
[89]50
[159]51 LOG_DEBUG("Receiver " << getSignature() << " thread " << QThread::currentThread());
[110]52
[119]53
[159]54
[148]55 if (typedEvent->timerange() < 500 && readingMode() == TimeBounded) {
[153]56 LOG_WARN("Incorrect TimeRange (0), switch to NeverSkip");
57 readingMode() = NeverSkip;
58 }
[110]59
[148]60 switch (readingMode()) {
[110]61 case TimeBounded:
62
[148]63 if (road_time() - typedEvent->time() > typedEvent->timerange()) {
[153]64 LOG_DEBUG("Data skip " << this->getSignature());
[148]65 break;
66 }
[110]67
[148]68 (dynamic_cast<C*>(component())->*method)(typedEvent->data());
[89]69 break;
[110]70
71 case GetLast:
72
[148]73 (dynamic_cast<C*>(component())->*method)(typedEvent->data());
[153]74 // delete all remaining events
75 QCoreApplication::removePostedEvents(this, TYPED_EVENT);
[110]76 break;
77
78 case NeverSkip:
[159]79 (dynamic_cast<C*>(component())->*method)(typedEvent->data());
80 break;
[110]81
82 default:
[159]83 LOG_WARN("Unknown reading mode " << readingMode());
[89]84 }
[110]85 break;
86 }
[89]87
[184]88 // Add here new event type if needed
[89]89
[110]90 default:
[153]91 LOG_WARN("Unknown event ID " << event->type());
[110]92 break;
[89]93 }
[110]94 event->accept();
95 }
[89]96
[159]97 // TODO for Pulling mode (not yet implemented !!!)
[110]98 T& getData() {
99 T data;
100 // TODO ask output data;
[89]101
[110]102 return data;
[89]103 }
104
105protected:
106 void (C::*method)(const T&);
107
108};
109
[152]110template <typename T, class C>
[89]111class OutputInterface : public OutputInterfaceBase
112{
113public:
[184]114 OutputInterface(QString name, C * component)
115 :OutputInterfaceBase(name,component,component)
116 {}
[89]117 ~OutputInterface() {}
118
119 // Used by Components to send data througth typed output
[184]120 void send(const T & data, road_time_t t = road_time(), road_timerange_t tr = 0);
121
122 void send(const T & data, road_time_t t, road_timerange_t tr)
[153]123 {
[159]124 // FIXME Data Shared
[110]125 //QSharedPointer<T> sharedPointer = new T(data);
126
[153]127 for (QList<ConnectionBase>::iterator it = connections().begin(); it != connections().end(); ++it) {
[110]128 QApplication::postEvent(it->getInterface(),new PacpusTypedEvent<T>(TYPED_EVENT,data,t,tr),it->getPriority()); // Event is delete by the event loop handler
[122]129 //qDebug() << "sender " << it->getInterface()->getSignature() << " thread " << QThread::currentThread() << " Data & " << &data << " ";
[110]130 }
131 }
[89]132
[148]133 size_t getDataSize()
134 {
135 return sizeof(T);
136 }
137
138 QString getDataType()
139 {
140 return QString(typeid(T).name());
141 }
[89]142};
143
144} // namespace pacpus
145
146#endif // IN_OUT_INTERFACE_H
Note: See TracBrowser for help on using the repository browser.