- Timestamp:
- Oct 30, 2013, 12:26:34 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/examples/ProducerConsumerExample/ConsumerExample.cpp
r179 r206 91 91 setState(MONITOR_OK); 92 92 } 93 94 void testPacpusTypedEventConverts() 95 { 96 PacpusTypedEvent<float> floatEvent(TYPED_EVENT, 1.0f); 97 PacpusTypedEvent<double> doubleEvent = floatEvent; 98 99 PacpusTypedEvent<int> intEvent(TYPED_EVENT, 2); 100 //PacpusTypedEvent<QImage> imageEvent = intEvent; 101 } -
trunk/include/Pacpus/kernel/ComponentBase.h
r202 r206 84 84 /// Ctor of ComponentBase. 85 85 /// @param name Name of your component. 86 ComponentBase(const QString & name);86 ComponentBase(const QString & name); 87 87 88 88 /// Dtor of ComponentBase. … … 100 100 /// @return Name of the component. 101 101 QString getName() const; 102 103 /// @returns @b true if the component has been started and is active (working) 104 bool isActive() const; 102 105 103 106 protected: … … 170 173 } 171 174 172 bool isActive() const;173 175 void setActive(bool isActive); 174 176 bool isRecording() const; -
trunk/include/Pacpus/kernel/InputOutputBase.h
r200 r206 32 32 virtual std::size_t getDataSize() const = 0; 33 33 virtual const std::type_info & getDataType() const = 0; 34 35 //virtual PacpusEvent * getEventTemplate() = 0; 34 36 35 37 void addConnection(ConnectionBase connection); … … 99 101 QStringList getInputConnectedList(); 100 102 101 void send(/*const*/ QByteArray & data);103 //void send(/*const*/ QByteArray & data); 102 104 }; 103 105 -
trunk/include/Pacpus/kernel/InputOutputInterface.h
r202 r206 23 23 : InputInterfaceBase(name, component, component) 24 24 , method(processMethod) 25 {} 25 { 26 } 26 27 27 28 ~InputInterface() 28 {} 29 { 30 } 29 31 30 32 std::size_t getDataSize() const … … 39 41 40 42 // FIXME: what's the purpose of this function? 41 PacpusEvent * getEventTemplate()42 {43 return new PacpusTypedEvent<T>(TYPED_EVENT);44 }43 //PacpusEvent * getEventTemplate() 44 //{ 45 // return new PacpusTypedEvent<T>(TYPED_EVENT); 46 //} 45 47 46 48 // FIXME: what's the purpose of this function? 47 49 void customEvent(QEvent * event) 48 50 { 49 // TODO check component state started 50 //if (_component) get state 51 // check that component has been started 52 if ((NULL == getComponent()) || (!getComponent()->isActive())) { 53 LOG_DEBUG("component is not active"); 54 return; 55 } 56 57 LOG_DEBUG("Receiver: " << getSignature()); 58 59 //PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *>(event); 60 PacpusEvent * pacpusEvent = dynamic_cast<PacpusEvent *>(event); 61 if (!pacpusEvent) { 62 LOG_WARN("dynamic_cast failed: not a PacpusEvent"); 63 return; 64 } 65 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *>(pacpusEvent); 66 if (!typedEvent) { 67 LOG_WARN("dynamic_cast failed: incompatible event types"); 68 return; 69 } 70 51 71 switch (event->type()) { 52 72 case TYPED_EVENT: 53 { 54 PacpusTypedEvent<T> * typedEvent = dynamic_cast<PacpusTypedEvent<T> *> (event); 55 56 LOG_DEBUG("Receiver: " << getSignature()); 57 58 if (typedEvent->timerange() < 500 && readingMode() == TimeBounded) { 73 if (TimeBounded == readingMode() && typedEvent->timerange() < 500) { 59 74 LOG_WARN("Incorrect TimeRange (0), switch to NeverSkip"); 60 75 readingMode() = NeverSkip; … … 63 78 switch (readingMode()) { 64 79 case TimeBounded: 65 66 80 if (road_time() - typedEvent->time() > typedEvent->timerange()) { 67 LOG_ DEBUG("Data skipped, receiver: " << this->getSignature());81 LOG_TRACE("Data skipped, receiver: " << this->getSignature()); 68 82 break; 69 83 } … … 73 87 74 88 case GetLast: 75 76 89 (dynamic_cast<C*>(component())->*method)(typedEvent->data()); 77 90 // delete all remaining events … … 85 98 default: 86 99 LOG_WARN("Unknown reading mode " << readingMode()); 100 break; 87 101 } 88 102 break; 89 }90 103 91 104 // Add here new event type if needed … … 95 108 break; 96 109 } 97 event->accept();110 event->accept(); 98 111 } 99 112 100 113 // TODO for Pulling mode (not yet implemented !!!) 101 T & getData() { 114 T & getData() 115 { 102 116 T data; 103 117 // TODO ask output data; 104 105 118 return data; 106 119 } … … 125 138 {} 126 139 127 // Used by Components to send data througthtyped output140 /// Send data through a typed output 128 141 void send(const T & data, road_time_t t = road_time(), road_timerange_t tr = 0); 129 142 … … 150 163 // It is not safe to access the event after it has been posted. 151 164 QEvent * newEvent = new PacpusTypedEvent<T>(TYPED_EVENT, data, t, tr); 152 QCoreApplication::postEvent(it->getInterface(), newEvent, it->getPriority()); 165 QCoreApplication::postEvent( 166 it->getInterface(), 167 newEvent, 168 it->getPriority() 169 ); 153 170 LOG_DEBUG("Sender: " << it->getInterface()->getSignature()); 154 171 LOG_DEBUG("Data &: " << &data); -
trunk/include/Pacpus/kernel/PacpusEvent.h
r196 r206 38 38 39 39 // TODO: should we make it virtual pure ??? 40 virtual QDataStream & streamOut(QDataStream& out)40 virtual QDataStream & streamOut(QDataStream & out) 41 41 { 42 42 return out; … … 77 77 { 78 78 public: 79 TypedData(const T & data)80 : m_data(data)79 TypedData(const T & data) 80 : m_data(data) 81 81 { 82 82 } … … 96 96 } 97 97 98 s ize_t size() const98 std::size_t size() const 99 99 { 100 100 return sizeof(T); … … 112 112 public: 113 113 // FIXME: why we need `data = T()` ??? 114 PacpusTypedEvent(PacpusEventType type, const T & data = T(), road_time_t t = road_time(), road_timerange_t tr = 0)114 PacpusTypedEvent(PacpusEventType type, const T & data/* = T()*/, road_time_t t = road_time(), road_timerange_t tr = 0) 115 115 : PacpusEvent(type, t, tr) 116 116 , TypedData<T>(data) 117 {} 117 { 118 } 119 120 /// Conversion constructor from another PacpusTypedEvent, 121 /// when T is convertible to S 122 template <typename S> 123 PacpusTypedEvent(const PacpusTypedEvent<S> & other) 124 : PacpusEvent(static_cast<PacpusEventType>(other.type()), other.time(), other.timerange()) 125 , TypedData<T>(other.data()) 126 { 127 } 118 128 119 129 ~PacpusTypedEvent() 120 {} 121 122 QDataStream& streamOut(QDataStream& out) 130 { 131 } 132 133 QDataStream & streamOut(QDataStream & out) 123 134 { 124 135 // FIXME Stream Data errors … … 126 137 } 127 138 128 QDataStream & streamIn(QDataStream& in)139 QDataStream & streamIn(QDataStream & in) 129 140 { 130 141 return in >> (quint64&) time() >> timerange() /*>> m_data*/; … … 135 146 { 136 147 public: 137 GenericData(const char * data, size_t size)148 GenericData(const char * data, size_t size) 138 149 : m_data(NULL) 139 150 , m_dataSize(size) … … 164 175 } 165 176 166 s ize_t size() const177 std::size_t size() const 167 178 { 168 179 return m_dataSize; … … 170 181 171 182 private: 172 char * m_data;173 s ize_t m_dataSize;183 char * m_data; 184 std::size_t m_dataSize; 174 185 }; 175 186 … … 179 190 { 180 191 public: 181 PacpusGenericEvent(PacpusEventType type, const char * data, size_t size)192 PacpusGenericEvent(PacpusEventType type, const char * data, size_t size) 182 193 : PacpusEvent(type) 183 194 , GenericData(data, size) … … 192 203 } // namespace pacpus 193 204 194 PACPUSLIB_API inline QDataStream & operator<< (QDataStream& out, pacpus::PacpusEvent& ev)205 PACPUSLIB_API inline QDataStream & operator<<(QDataStream & out, pacpus::PacpusEvent & ev) 195 206 { 196 207 /*return ev.streamOut(out);*/ … … 198 209 } 199 210 200 PACPUSLIB_API inline QDataStream & operator>> (QDataStream& in, pacpus::PacpusEvent& ev)211 PACPUSLIB_API inline QDataStream & operator>>(QDataStream & in, pacpus::PacpusEvent & ev) 201 212 { 202 213 /*return ev.streamIn(in);*/ -
trunk/src/PacpusLib/ComponentBase.cpp
r204 r206 214 214 OutputInterfaceBase * ComponentBase::getOutput(QString outputName) const 215 215 { 216 /* QList<QString> keys = output.keys();217 for (int i=0; i<keys.size();++i)218 LOG_INFO("Key : " << keys[i])*/;219 220 216 if (outputs().contains(outputName)) { 221 217 return outputs()[outputName]; 222 218 } 223 LOG_WARN("Component " << getName() << " does not contain toutput " << outputName);219 LOG_WARN("Component " << getName() << " does not contain output " << outputName); 224 220 return NULL; 225 221 } -
trunk/src/PacpusLib/ComponentManager.cpp
r204 r206 22 22 using namespace pacpus; 23 23 24 //template <typename _Elem, typename _Traits, typename _ListElem> 25 //std::basic_ostream<_Elem, _Traits> & operator<<(std::basic_ostream<_Elem, _Traits> & os, const QList<_ListElem> & list) 26 //{ 27 // typedef QList<_ListElem> ListType; 28 // for (ListType::const_iterator it = list.cbegin(), itend = list.cend(); it != itend; ++it) { 29 // os << *it << "\n"; 30 // } 31 // return os; 32 //} 33 24 34 template <typename _Elem, typename _Traits, typename _ListElem> 25 35 std::basic_ostream<_Elem, _Traits> & operator<<(std::basic_ostream<_Elem, _Traits> & os, const QList<_ListElem> & list) … … 36 46 //////////////////////////////////////////////////////////////////////////////// 37 47 48 /// Connects OutputInterfaceBase @b out to InputInterfaceBase @b in using given priority and reading mode. 49 /// @returns @b true if connection has been added successfully, @b false otherwise. 38 50 bool connectInterface(OutputInterfaceBase * out, InputInterfaceBase * in, int priority, InputInterfaceBase::ReadingMode mode = InputInterfaceBase::GetLast); 39 51 … … 42 54 bool connectInterface(OutputInterfaceBase * out, InputInterfaceBase * in, int priority, InputInterfaceBase::ReadingMode mode) 43 55 { 44 if ((out->getDataType() == in->getDataType()) 45 || (out->getDataType() == typeid(QByteArray)) 46 || (in->getDataType() == typeid(QByteArray))) { 47 // Add connection 48 out->addConnection(ConnectionBase(in, priority)); // TODO make connect function 49 in->addConnection(ConnectionBase(out, priority)); 50 in->setReadingMode(mode); 51 //LOG_INFO("connection : Output " << out->getSignature() << " => Input " << in->getSignature()); 52 return true; 53 } else { 54 //LOG_WARN("connecting " << out->getSignature() << ":" << out->getDataType() << " to " << in->getSignature() << ":" << in->getDataType() << " failled : DataType incompatible " << QString(typeid(QByteArray).name())); 55 return false; 56 } 56 // check connections 57 if (!out || !in) { 58 LOG_WARN("null connection"); 59 return false; 60 } 61 62 // check if connection type are compatible 63 // FIXME: it should permit an OutputType to be a type conversible to InputType 64 if (out->getDataType() != in->getDataType()) { 65 LOG_WARN("connection types do not match: " 66 << out->getSignature() << "." << out->getDataType().name() 67 << " -> " 68 << in->getSignature() << "." << in->getDataType().name() 69 ); 70 return false; 71 } 72 //if ((out->getDataType() == in->getDataType()) 73 // || (out->getDataType() == typeid(QByteArray)) 74 // || (in->getDataType() == typeid(QByteArray))) { 75 76 // add connection 77 out->addConnection(ConnectionBase(in, priority)); // TODO make connect function 78 in->addConnection(ConnectionBase(out, priority)); 79 in->setReadingMode(mode); 80 //LOG_INFO("connection : Output " << out->getSignature() << " => Input " << in->getSignature()); 81 return true; 57 82 } 58 83 … … 145 170 LOG_TRACE("registerComponent(name="<< name << ")"); 146 171 147 if (componentMap_.contains(name)) 148 { 172 if (componentMap_.contains(name)) { 149 173 LOG_WARN("cannot register component '" << name << "'. A component with the same name exists already"); 150 174 return false; … … 235 259 } 236 260 237 bool ComponentManager::createConnection(const QString & outputSignature, const QString& inputSignature, const QString& type, int priority = 0)261 bool ComponentManager::createConnection(const QString & outputSignature, const QString & inputSignature, const QString & type, int priority = 0) 238 262 { 239 263 // FIXME: use 2 signatures (output component + output connection) instead of 1 separated by a (".") dot … … 247 271 return false; 248 272 } 249 // NOTECreate communicationInterface if needed ??273 // FIXME: Create communicationInterface if needed ?? 250 274 return connectInterface( 251 275 getComponent(output[0])->getOutput(output[1]), -
trunk/src/PacpusLib/ConnectionManager.cpp
r89 r206 1 2 1 #include <Pacpus/kernel/ConnectionManager.h> 3 2 #include <Pacpus/kernel/Log.h> … … 15 14 { 16 15 LOG_TRACE("destructor"); 17 18 19 16 } 20 17 … … 41 38 LOG_TRACE(Q_FUNC_INFO); 42 39 43 ComponentManager *mgr = ComponentManager::getInstance(); 44 40 ComponentManager * mgr = ComponentManager::getInstance(); 45 41 46 42 // TODO read XML file and build ConnectionList 47 43 QList<ConnectionDescriptor> ConnectionList; 48 ConnectionList.append(ConnectionDescriptor("testComponent1", "image","testComponent2","image","type"));44 ConnectionList.append(ConnectionDescriptor("testComponent1", "image", "testComponent2", "image", "type")); 49 45 50 46 ComponentBase * sender, * receiver; … … 52 48 OutputInterfaceBase * out; 53 49 54 for(QList<ConnectionDescriptor>::iterator i = ConnectionList.begin(); i != ConnectionList.end(); ++i) { 55 50 for (QList<ConnectionDescriptor>::iterator i = ConnectionList.begin(); i != ConnectionList.end(); ++i) { 56 51 // TODO Handle errors 57 52 sender = mgr->getComponent(i->_outputComponent); 58 53 out = sender->getOutput(i->_outputName); 59 60 54 61 55 receiver = mgr->getComponent(i->_inputComponent); … … 66 60 LOG_INFO(" Output " << "out" << " connected to " << "in") // TODO replace out / in 67 61 } 68 69 62 70 63 // CledComponent * cledComponent = (CledComponent*) m_component[cName]; … … 82 75 // in1->setConnection(buffer,true); 83 76 // out1->setConnection(buffer,true); 84 85 86 77 } 87 -
trunk/src/PacpusLib/InputOutputBase.cpp
r200 r206 5 5 #include <Pacpus/kernel/InputOutputInterface.h> 6 6 #include <Pacpus/kernel/Log.h> 7 8 #include <QApplication>9 7 10 8 using namespace pacpus; … … 124 122 } 125 123 126 // TODO for serialization prupose (not yet implemented !!!) 127 void OutputInterfaceBase::send(/*const*/ QByteArray & data) 128 { 129 // TODO check at least one Typed connection 130 131 for (QList<ConnectionBase>::iterator it = connections().begin(); it!=connections().end(); ++it) { 132 QDataStream in(&data,QIODevice::ReadOnly); 133 PacpusEvent * event = dynamic_cast<InputInterfaceBase*>(connections().at(0).getInterface())->getEventTemplate(); 134 event->streamIn(in); 135 QApplication::postEvent(it->getInterface(),event,it->getPriority()); 136 } 137 } 124 // TODO for serialization purpose (not yet implemented !!!) 125 //void OutputInterfaceBase::send(/*const*/ QByteArray & data) 126 //{ 127 // // TODO check at least one Typed connection 128 // 129 // for (QList<ConnectionBase>::iterator it = connections().begin(), itend = connections().end(); it != itend; ++it) { 130 // QDataStream in(&data, QIODevice::ReadOnly); 131 // InputInterfaceBase * interfaceBase 132 // = dynamic_cast<InputInterfaceBase *>(connections().at(0).getInterface()); 133 // //AbstractInterface * interfaceBase = connections().at(0).getInterface(); 134 // if (!interfaceBase) { 135 // continue; 136 // } 137 // PacpusEvent * event = interfaceBase->getEventTemplate(); 138 // if (!event) { 139 // continue; 140 // } 141 // event->streamIn(in); 142 // QCoreApplication::postEvent( 143 // it->getInterface(), 144 // event, 145 // it->getPriority() 146 // ); 147 // } 148 //}
Note:
See TracChangeset
for help on using the changeset viewer.