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 svc(void) = 0;
00105
00113 virtual bool update() = 0;
00114
00122 virtual void release();
00123
00131 virtual SubscriberProfile get_profile();
00132
00140 virtual InPort_ptr get_inport();
00141
00149 virtual std::string get_id();
00150
00151 protected:
00153 SubscriberProfile m_Profile;
00154
00156 InPort_ptr m_pInPort;
00157
00159 OutPortBase* m_pParent;
00160
00162
00163 std::string m_Id;
00164
00165
00166 struct NewData
00167 {
00168 NewData() : m_Cond(m_Mutex), m_Updated(false) {};
00169 bool m_Updated;
00170 ACE_Thread_Mutex m_Mutex;
00171 ACE_Condition<ACE_Thread_Mutex> m_Cond;
00172 };
00173
00174
00175 NewData m_NewData;
00176
00177 };
00178
00179
00180
00187 class SubscriberOnce
00188 : public SubscriberBase
00189 {
00190 public:
00191 SubscriberOnce(OutPortBase* parent, InPort_ptr inport,
00192 const SubscriptionID id, SubscriberProfile profile);
00193 virtual bool update();
00194 virtual int svc(void);
00195
00196 };
00197
00198
00205 class SubscriberPeriodic
00206 : public SubscriberBase
00207 {
00208 public:
00209 SubscriberPeriodic(OutPortBase* parent, InPort_ptr inport,
00210 const SubscriptionID id, SubscriberProfile profile);
00211 virtual bool update();
00212 virtual int svc(void);
00213 };
00214
00215
00216
00223 class SubscriberNew
00224 : public SubscriberBase
00225 {
00226 public:
00227 SubscriberNew(OutPortBase* parent, InPort_ptr inport,
00228 const SubscriptionID id, SubscriberProfile profile);
00229 virtual bool update();
00230 virtual int svc(void);
00231 };
00232
00233
00234
00241 class SubscriberTriggerd
00242 : public SubscriberBase
00243 {
00244 public:
00245 SubscriberTriggerd(OutPortBase* parent, InPort_ptr inport,
00246 const SubscriptionID id, SubscriberProfile profile);
00247 virtual bool update(){};
00248 virtual int svc (void){};
00249 };
00250
00251
00252
00259 class SubscriberPeriodicNew
00260 : public SubscriberBase
00261 {
00262 public:
00263 SubscriberPeriodicNew(OutPortBase* parent, InPort_ptr inport,
00264 const SubscriptionID id, SubscriberProfile profile);
00265 virtual bool update(){};
00266 virtual int svc (void){};
00267 };
00268
00269
00270
00277 class SubscriberNewPeriodic
00278 : public SubscriberBase
00279 {
00280 public:
00281 SubscriberNewPeriodic(OutPortBase* parent, InPort_ptr inport,
00282 const SubscriptionID id, SubscriberProfile profile);
00283 virtual bool update(){};
00284 virtual int svc (void){};
00285 };
00286
00287
00288
00289
00296 class SubscriberPeriodicTriggerd
00297 : public SubscriberBase
00298 {
00299 public:
00300 SubscriberPeriodicTriggerd(OutPortBase* parent, InPort_ptr inport,
00301 const SubscriptionID id, SubscriberProfile profile);
00302 virtual bool update(){};
00303 virtual int svc (void){};
00304 };
00305
00306
00307
00308
00315 class SubscriberTriggerdPeriodic
00316 : public SubscriberBase
00317 {
00318 public:
00319 SubscriberTriggerdPeriodic(OutPortBase* parent, InPort_ptr inport,
00320 const SubscriptionID id, SubscriberProfile profile);
00321 virtual bool update(){};
00322 virtual int svc (void){};
00323 };
00324
00325
00326
00327
00328
00329 };
00330
00331
00332
00333 #endif // end of __RtcSubscriber_h__