00001
00020 #ifndef RTC_PUBLISHERNEW_H
00021 #define RTC_PUBLISHERNEW_H
00022
00023 #include <coil/Task.h>
00024 #include <coil/Mutex.h>
00025 #include <coil/Condition.h>
00026 #include <coil/PeriodicTask.h>
00027
00028 #include <rtm/RTC.h>
00029 #include <rtm/PublisherBase.h>
00030 #include <rtm/CdrBufferBase.h>
00031 #include <rtm/DataPortStatus.h>
00032 #include <rtm/SystemLogger.h>
00033 #include <rtm/ConnectorBase.h>
00034 #include <rtm/ConnectorListener.h>
00035
00036 namespace coil
00037 {
00038 class Properties;
00039 };
00040
00041 namespace RTC
00042 {
00043 class InPortConsumer;
00069 class PublisherNew
00070 : public PublisherBase
00071 {
00072 public:
00073 typedef coil::Mutex Mutex;
00074 typedef coil::Condition<Mutex> Condition;
00075 typedef coil::Guard<coil::Mutex> Guard;
00076 DATAPORTSTATUS_ENUM
00077
00099 PublisherNew();
00100
00114 virtual ~PublisherNew(void);
00115
00123 virtual ReturnCode init(coil::Properties& prop);
00132 virtual ReturnCode setConsumer(InPortConsumer* consumer);
00146 virtual ReturnCode setBuffer(CdrBufferBase* buffer);
00162 virtual ReturnCode setListener(ConnectorInfo& info,
00163 ConnectorListeners* listeners);
00179 virtual ReturnCode write(const cdrMemoryStream& data,
00180 unsigned long sec,
00181 unsigned long usec);
00202 virtual bool isActive();
00215 virtual ReturnCode activate();
00228 virtual ReturnCode deactivate();
00229
00249 virtual int svc(void);
00250
00274
00275
00295
00296
00297 protected:
00298 enum Policy
00299 {
00300 ALL,
00301 FIFO,
00302 SKIP,
00303 NEW
00304 };
00305
00313 void setPushPolicy(const coil::Properties& prop);
00314
00322 bool createTask(const coil::Properties& prop);
00323
00327 ReturnCode pushAll();
00328
00332 ReturnCode pushFifo();
00333
00337 ReturnCode pushSkip();
00338
00342 ReturnCode pushNew();
00343
00349 ReturnCode convertReturn(BufferStatus::Enum status,
00350 const cdrMemoryStream& data);
00351
00368 ReturnCode invokeListener(DataPortStatus::Enum status,
00369 const cdrMemoryStream& data);
00370
00383 inline void onBufferWrite(const cdrMemoryStream& data)
00384 {
00385 m_listeners->
00386 connectorData_[ON_BUFFER_WRITE].notify(m_profile, data);
00387 }
00388
00398 inline void onBufferFull(const cdrMemoryStream& data)
00399 {
00400 m_listeners->
00401 connectorData_[ON_BUFFER_FULL].notify(m_profile, data);
00402 }
00403
00413 inline void onBufferWriteTimeout(const cdrMemoryStream& data)
00414 {
00415 m_listeners->
00416 connectorData_[ON_BUFFER_WRITE_TIMEOUT].notify(m_profile, data);
00417 }
00418
00428 inline void onBufferWriteOverwrite(const cdrMemoryStream& data)
00429 {
00430 m_listeners->
00431 connectorData_[ON_BUFFER_OVERWRITE].notify(m_profile, data);
00432 }
00433
00443 inline void onBufferRead(const cdrMemoryStream& data)
00444 {
00445 m_listeners->
00446 connectorData_[ON_BUFFER_READ].notify(m_profile, data);
00447 }
00448
00458 inline void onSend(const cdrMemoryStream& data)
00459 {
00460 m_listeners->
00461 connectorData_[ON_SEND].notify(m_profile, data);
00462 }
00463
00473 inline void onReceived(const cdrMemoryStream& data)
00474 {
00475 m_listeners->
00476 connectorData_[ON_RECEIVED].notify(m_profile, data);
00477 }
00478
00488 inline void onReceiverFull(const cdrMemoryStream& data)
00489 {
00490 m_listeners->
00491 connectorData_[ON_RECEIVER_FULL].notify(m_profile, data);
00492 }
00493
00503 inline void onReceiverTimeout(const cdrMemoryStream& data)
00504 {
00505 m_listeners->
00506 connectorData_[ON_RECEIVER_TIMEOUT].notify(m_profile, data);
00507 }
00508
00518 inline void onReceiverError(const cdrMemoryStream& data)
00519 {
00520 m_listeners->
00521 connectorData_[ON_RECEIVER_ERROR].notify(m_profile, data);
00522 }
00523
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00560 inline void onSenderError()
00561 {
00562 m_listeners->
00563 connector_[ON_SENDER_ERROR].notify(m_profile);
00564 }
00565
00566
00567 private:
00568 Logger rtclog;
00569 InPortConsumer* m_consumer;
00570 CdrBufferBase* m_buffer;
00571 ConnectorInfo m_profile;
00572 coil::PeriodicTaskBase* m_task;
00573 ConnectorListeners* m_listeners;
00574 ReturnCode m_retcode;
00575 Mutex m_retmutex;
00576 Policy m_pushPolicy;
00577 int m_skipn;
00578 bool m_active;
00579 int m_leftskip;
00580 };
00581 };
00582
00583 extern "C"
00584 {
00585 void DLL_EXPORT PublisherNewInit();
00586 };
00587
00588 #endif // RTC_PUBLISHERNEW_H
00589