00001
#ifndef _ACSAMP_OBJ_IMPL_H
00002
#define _ACSAMP_OBJ_IMPL_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
#ifndef __cplusplus
00037
#error This is a C++ include file and cannot be used from plain C
00038
#endif
00039
00040
#include "acssampImpl.h"
00041
#include "acssampS.h"
00042
#include <acsncSimpleSupplier.h>
00043
#include <ace/Message_Queue.h>
00044
00045
#include <sstream>
00046
00047
00048 #define ACS_SAMP_C class T, class T_var, class Tval
00049 #define ACS_SAMP_TL T, T_var, Tval
00050
00051
00059
00060
template<ACS_SAMP_C>
00061
class ACSSampObjImpl;
00062
00063
template<ACS_SAMP_C>
00064 class SamplingThread :
public ACS::Thread
00065 {
00066
public:
00067 SamplingThread(
const ACE_CString& name,
00068
ACSSampObjImpl<ACS_SAMP_TL> *sampObj,
00069
const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime,
00070
const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime) :
00071 ACS::Thread(name, responseTime, sleepTime),
00072 sampObj_p(sampObj) {}
00073
00074 ~SamplingThread() {}
00075
00076 virtual void runLoop()
00077 {
00078
if ( sampObj_p->
isInDestructState() )
exit();
00079
00080
00081 sampObj_p->
doSamp();
00082 }
00083
00084
private:
00085
00086 ACSSampObjImpl<ACS_SAMP_TL> *sampObj_p;
00087 };
00088
00089
00090
template<ACS_SAMP_C>
00091 class SamplingThreadFlush :
public ACS::Thread
00092 {
00093
public:
00094 SamplingThreadFlush(
const ACE_CString& name,
00095
ACSSampObjImpl<ACS_SAMP_TL> *sampObj,
00096
const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime,
00097
const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime) :
00098 ACS::Thread(name, responseTime, sleepTime),
00099 sampObj_p(sampObj) {}
00100
00101 ~SamplingThreadFlush() {}
00102
00103 virtual void runLoop()
00104 {
00105
ACS_DEBUG_PARAM(
"acssamp::ACSSampObjImpl::sampThreadFlush",
"Starting thread %s",
getName().c_str());
00106
00107
if (sampObj_p->
isInDestructState())
exit();
00108
00109 sampObj_p->
flushSamp();
00110 }
00111
00112
private:
00113
00114 ACSSampObjImpl<ACS_SAMP_TL> *sampObj_p;
00115 };
00116
00117
00118
00119
00136
template <ACS_SAMP_C>
00137 class ACSSampObjImpl:
public virtual POA_acssamp::
SampObj,
00138
public virtual PortableServer::
RefCountServantBase
00139 {
00140
00141
public:
00168
ACSSampObjImpl(
const ACE_CString& _cobName,
const ACE_CString& _propertyName,
00169 ACS::TimeInterval _sampFrequency, ACS::TimeInterval _sampReportRate,
baci::BACIComponent *_m_cob, ACS::Property_var _genProperty,
ACSSampImpl * _sampPtr);
00170
00174
virtual ~ACSSampObjImpl();
00175
00176
00186
virtual void start ();
00187
00197
virtual void stop ();
00198
00208
virtual void destroy();
00209
00219
virtual void suspend();
00220
00230
virtual void resume();
00231
00232
00247
virtual void setFrequency (ACS::TimeInterval sFrequency);
00248
00249
00263
virtual void getFrequency (ACS::TimeInterval_out sFrequency);
00264
00265
00266
00280
virtual void setRate (ACS::TimeInterval rRate);
00281
00282
00283
00296
virtual void getRate (ACS::TimeInterval_out rRate);
00297
00298
00299
00313
virtual void initialize( );
00314
00324
virtual void doSamp();
00325
00326
00335
virtual void flushSamp();
00336
00337
00346 ACS::TimeInterval
getSampFrequency()
const {
return sampFrequency; }
00347
00357
void setSampFrequency(
const ACS::TimeInterval& _sampFrequency);
00358
00367 ACS::TimeInterval
getReportRate()
const {
return sampReportRate; }
00368
00378
void setReportRate(
const ACS::TimeInterval& _sampReportRate);
00379
00389 CORBA::Object_ptr
getCORBAReference()
const {
return reference_p; }
00390
00391
00406
virtual char *
getChannelName();
00407
00408
00414 struct SampData {
00415 ACS::Time
timeStamp;
00416 Tval
val;
00417 };
00418
00419
00429 bool isInDestructState()
const {
return inDestructState; };
00430
00431
private:
00432
00433
00434
00435 ACE_CString cobName;
00436 ACE_CString propertyName;
00437 ACE_CString sampObjName;
00438 ACE_CString sampChannelName;
00439
00440 ACS::TimeInterval sampFrequency;
00441 ACS::TimeInterval sampReportRate;
00442
00443 bool inDestructState;
00444
00448 baci::BACIComponent *cob_p;
00449
00455 SamplingThread<ACS_SAMP_TL> *controlLoop_p;
00456
00463 SamplingThreadFlush<ACS_SAMP_TL> *flush_p;
00464
00465
00466
00467 ACS::Property_var genProperty_p;
00468
00469 T_var propToSamp_p;
00470
00475 ACE_Message_Queue<ACE_SYNCH> *mq_p;
00476
00477
00478
00479 nc::SimpleSupplier *sampSupplier_p;
00480
00481 CORBA::Object_ptr reference_p;
00482
00483 ACSSampImpl *samp_p;
00484 };
00485
00486
00487
00491
#include "acssampObjImpl.i"
00492
00493
00494
#endif