00001
00013 #ifndef __RtcSubscriber_h__
00014 #define __RtcSubscriber_h__
00015
00016 #include <ace/Task.h>
00017 #include <ace/Thread.h>
00018 #include <ace/Synch.h>
00019 #include "rtm/RtcOutPortBase.h"
00020 #include "rtm/RtcInPortBase.h"
00021
00022 namespace RTM {
00023
00053 class SubscriberBase
00054 : public ACE_Task<ACE_MT_SYNCH>
00055 {
00056 public:
00076 SubscriberBase(OutPortBase* parent, InPort_ptr inport,
00077 const SubscriptionID id, SubscriberProfile profile);
00078
00086 ~SubscriberBase();
00087
00095 virtual int open(void *args);
00096
00104 virtual int close(unsigned long flags);
00105
00113 virtual int svc(void) = 0;
00114
00122 virtual bool update() = 0;
00123
00131 virtual void release();
00132
00140 virtual SubscriberProfile get_profile();
00141
00149 virtual InPort_ptr get_inport();
00150
00158 virtual std::string get_id();
00159
00167 inline bool is_running();
00168
00178 virtual void stop_thread();
00179
00180 protected:
00182 SubscriberProfile m_Profile;
00183
00185 InPort_ptr m_pInPort;
00186
00188 OutPortBase* m_pParent;
00189
00191
00192 std::string m_Id;
00193
00195 bool m_Running;
00196
00197 struct NewData
00198 {
00199 NewData() : m_Cond(m_Mutex), m_Updated(false) {};
00200 bool m_Updated;
00201 ACE_Thread_Mutex m_Mutex;
00202 ACE_Condition<ACE_Thread_Mutex> m_Cond;
00203 };
00204
00205
00206 NewData m_NewData;
00207
00208 };
00209
00210
00211
00218 class SubscriberOnce
00219 : public SubscriberBase
00220 {
00221 public:
00222 SubscriberOnce(OutPortBase* parent, InPort_ptr inport,
00223 const SubscriptionID id, SubscriberProfile profile);
00224 virtual bool update();
00225 virtual int svc(void);
00226
00227 };
00228
00229
00236 class SubscriberPeriodic
00237 : public SubscriberBase
00238 {
00239 public:
00240 SubscriberPeriodic(OutPortBase* parent, InPort_ptr inport,
00241 const SubscriptionID id, SubscriberProfile profile);
00242 virtual bool update();
00243 virtual int svc(void);
00244 };
00245
00246
00247
00254 class SubscriberNew
00255 : public SubscriberBase
00256 {
00257 public:
00258 SubscriberNew(OutPortBase* parent, InPort_ptr inport,
00259 const SubscriptionID id, SubscriberProfile profile);
00260 virtual bool update();
00261 virtual int svc(void);
00262 };
00263
00264
00265
00272 class SubscriberTriggerd
00273 : public SubscriberBase
00274 {
00275 public:
00276 SubscriberTriggerd(OutPortBase* parent, InPort_ptr inport,
00277 const SubscriptionID id, SubscriberProfile profile);
00278 virtual bool update(){};
00279 virtual int svc (void){};
00280 };
00281
00282
00283
00290 class SubscriberPeriodicNew
00291 : public SubscriberBase
00292 {
00293 public:
00294 SubscriberPeriodicNew(OutPortBase* parent, InPort_ptr inport,
00295 const SubscriptionID id, SubscriberProfile profile);
00296 virtual bool update(){};
00297 virtual int svc (void){};
00298 };
00299
00300
00301
00308 class SubscriberNewPeriodic
00309 : public SubscriberBase
00310 {
00311 public:
00312 SubscriberNewPeriodic(OutPortBase* parent, InPort_ptr inport,
00313 const SubscriptionID id, SubscriberProfile profile);
00314 virtual bool update(){};
00315 virtual int svc (void){};
00316 };
00317
00318
00319
00320
00327 class SubscriberPeriodicTriggerd
00328 : public SubscriberBase
00329 {
00330 public:
00331 SubscriberPeriodicTriggerd(OutPortBase* parent, InPort_ptr inport,
00332 const SubscriptionID id, SubscriberProfile profile);
00333 virtual bool update(){};
00334 virtual int svc (void){};
00335 };
00336
00337
00338
00339
00346 class SubscriberTriggerdPeriodic
00347 : public SubscriberBase
00348 {
00349 public:
00350 SubscriberTriggerdPeriodic(OutPortBase* parent, InPort_ptr inport,
00351 const SubscriptionID id, SubscriberProfile profile);
00352 virtual bool update(){};
00353 virtual int svc (void){};
00354 };
00355
00356
00357
00358
00359
00360 };
00361
00362
00363
00364 #endif // end of __RtcSubscriber_h__