00001
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef RtcSubscriber_h
00028 #define RtcSubscriber_h
00029
00030 #include <ace/Task.h>
00031 #include <ace/Thread.h>
00032 #include <ace/Synch.h>
00033 #include "rtm/RtcOutPortBase.h"
00034 #include "rtm/RtcInPortBase.h"
00035
00036 namespace RTM {
00037
00067 class SubscriberBase
00068 : public ACE_Task<ACE_MT_SYNCH>
00069 {
00070 public:
00090 SubscriberBase(OutPortBase* parent, InPort_ptr inport,
00091 const SubscriptionID id, SubscriberProfile profile);
00092
00100 ~SubscriberBase();
00101
00109 virtual int open(void *args);
00110
00118 virtual int close(unsigned long flags);
00119
00127 virtual int svc(void) = 0;
00128
00136 virtual bool update() = 0;
00137
00145 virtual void release();
00146
00154 virtual SubscriberProfile get_profile();
00155
00163 virtual InPort_ptr get_inport();
00164
00172 virtual std::string get_id();
00173
00181 inline bool is_running();
00182
00192 virtual void stop_thread();
00193
00194 protected:
00196 SubscriberProfile m_Profile;
00197
00199 InPort_ptr m_pInPort;
00200
00202 OutPortBase* m_pParent;
00203
00205
00206 std::string m_Id;
00207
00209 bool m_Running;
00210
00211 struct NewData
00212 {
00213 NewData() : m_Cond(m_Mutex), m_Updated(false) {};
00214 bool m_Updated;
00215 ACE_Thread_Mutex m_Mutex;
00216 ACE_Condition<ACE_Thread_Mutex> m_Cond;
00217 };
00218
00219
00220 NewData m_NewData;
00221
00222 };
00223
00224
00225
00232 class SubscriberOnce
00233 : public SubscriberBase
00234 {
00235 public:
00236 SubscriberOnce(OutPortBase* parent, InPort_ptr inport,
00237 const SubscriptionID id, SubscriberProfile profile);
00238 virtual bool update();
00239 virtual int svc(void);
00240
00241 };
00242
00243
00250 class SubscriberPeriodic
00251 : public SubscriberBase
00252 {
00253 public:
00254 SubscriberPeriodic(OutPortBase* parent, InPort_ptr inport,
00255 const SubscriptionID id, SubscriberProfile profile);
00256 virtual bool update();
00257 virtual int svc(void);
00258 };
00259
00260
00261
00268 class SubscriberNew
00269 : public SubscriberBase
00270 {
00271 public:
00272 SubscriberNew(OutPortBase* parent, InPort_ptr inport,
00273 const SubscriptionID id, SubscriberProfile profile);
00274 virtual bool update();
00275 virtual int svc(void);
00276 };
00277
00278
00279
00286 class SubscriberTriggerd
00287 : public SubscriberBase
00288 {
00289 public:
00290 SubscriberTriggerd(OutPortBase* parent, InPort_ptr inport,
00291 const SubscriptionID id, SubscriberProfile profile);
00292 virtual bool update(){};
00293 virtual int svc (void){};
00294 };
00295
00296
00297
00304 class SubscriberPeriodicNew
00305 : public SubscriberBase
00306 {
00307 public:
00308 SubscriberPeriodicNew(OutPortBase* parent, InPort_ptr inport,
00309 const SubscriptionID id, SubscriberProfile profile);
00310 virtual bool update(){};
00311 virtual int svc (void){};
00312 };
00313
00314
00315
00322 class SubscriberNewPeriodic
00323 : public SubscriberBase
00324 {
00325 public:
00326 SubscriberNewPeriodic(OutPortBase* parent, InPort_ptr inport,
00327 const SubscriptionID id, SubscriberProfile profile);
00328 virtual bool update(){};
00329 virtual int svc (void){};
00330 };
00331
00332
00333
00334
00341 class SubscriberPeriodicTriggerd
00342 : public SubscriberBase
00343 {
00344 public:
00345 SubscriberPeriodicTriggerd(OutPortBase* parent, InPort_ptr inport,
00346 const SubscriptionID id, SubscriberProfile profile);
00347 virtual bool update(){};
00348 virtual int svc (void){};
00349 };
00350
00351
00352
00353
00360 class SubscriberTriggerdPeriodic
00361 : public SubscriberBase
00362 {
00363 public:
00364 SubscriberTriggerdPeriodic(OutPortBase* parent, InPort_ptr inport,
00365 const SubscriptionID id, SubscriberProfile profile);
00366 virtual bool update(){};
00367 virtual int svc (void){};
00368 };
00369
00370
00371
00372
00373
00374 };
00375
00376
00377
00378 #endif // end of __RtcSubscriber_h__