This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::BeaconEmitter Class Reference

#include "beaconEmitter.h"

+ Inheritance diagram for epics::pvAccess::BeaconEmitter:
+ Collaboration diagram for epics::pvAccess::BeaconEmitter:

Public Types

typedef std::tr1::shared_ptr< BeaconEmittershared_pointer
 
typedef std::tr1::shared_ptr< const BeaconEmitterconst_shared_pointer
 

Public Member Functions

 BeaconEmitter (std::string const &protocol, Transport::shared_pointer const &transport, std::tr1::shared_ptr< ServerContextImpl > &context)
 
virtual ~BeaconEmitter ()
 
void send (epics::pvData::ByteBuffer *buffer, TransportSendControl *control)
 
void timerStopped ()
 
void start ()
 
void reschedule ()
 
void callback ()
 
void destroy ()
 
- Public Member Functions inherited from epics::pvAccess::TransportSender
 POINTER_DEFINITIONS (TransportSender)
 
 TransportSender ()
 
virtual ~TransportSender ()
 
- Public Member Functions inherited from epics::pvAccess::Lockable
 POINTER_DEFINITIONS (Lockable)
 
virtual ~Lockable ()
 
virtual void lock ()
 
virtual void unlock ()
 
- Public Member Functions inherited from epics::pvAccess::fair_queue< T >::entry
 entry ()
 
 ~entry ()
 
- Public Member Functions inherited from epics::pvData::TimerCallback
 POINTER_DEFINITIONS (TimerCallback)
 
 TimerCallback ()
 
virtual ~TimerCallback ()
 

Additional Inherited Members

- Public Attributes inherited from epics::pvAccess::TransportSender
size_t bytesTX
 
size_t bytesRX
 

Detailed Description

BeaconEmitter

Author
gjansa

Definition at line 40 of file beaconEmitter.h.

Member Typedef Documentation

Definition at line 47 of file beaconEmitter.h.

Definition at line 46 of file beaconEmitter.h.

Constructor & Destructor Documentation

epics::pvAccess::BeaconEmitter::BeaconEmitter ( std::string const &  protocol,
Transport::shared_pointer const &  transport,
std::tr1::shared_ptr< ServerContextImpl > &  context 
)

Constructor.

Parameters
protocola protocol (transport) name to report.
transporttransport to be used to send beacons.
contextPVA context.

Definition at line 25 of file beaconEmitter.cpp.

26  :
27  _protocol(protocol),
28  _transport(transport),
29  _beaconSequenceID(0),
30  _guid(context->getGUID()),
31  _fastBeaconPeriod(std::max(context->getBeaconPeriod(), EPICS_PVA_MIN_BEACON_PERIOD)),
32  _slowBeaconPeriod(std::max(180.0, _fastBeaconPeriod)), // TODO configurable
33  _beaconCountLimit((int16)std::max(10.0f, EPICS_PVA_MIN_BEACON_COUNT_LIMIT)), // TODO configurable
34  _serverAddress(*(context->getServerInetAddress())),
35  _serverPort(context->getServerPort()),
36  _serverStatusProvider(context->getBeaconServerStatusProvider()),
37  _timer(context->getTimer())
38 {
39 }
#define max(x, y)
Definition: flexdef.h:81
int16_t int16
Definition: pvType.h:79
epics::pvAccess::BeaconEmitter::~BeaconEmitter ( )
virtual

Definition at line 41 of file beaconEmitter.cpp.

42 {
43  // shared_from_this is not yet allows in destructor
44  // be sure to call destroy() first !!!
45  // destroy();
46 }

Member Function Documentation

void epics::pvAccess::BeaconEmitter::callback ( )
virtual

Timer callback.

Implements epics::pvData::TimerCallback.

Definition at line 131 of file beaconEmitter.cpp.

132 {
133  _transport->enqueueSendRequest(shared_from_this());
134 }
void epics::pvAccess::BeaconEmitter::destroy ( )

Definition at line 106 of file beaconEmitter.cpp.

107 {
108  Timer::shared_pointer timer(_timer.lock());
109  if(timer)
110  timer->cancel(shared_from_this());
111 }
void cancel()
Definition: timer.cpp:135
void epics::pvAccess::BeaconEmitter::reschedule ( )

Reschedule timer.

Definition at line 120 of file beaconEmitter.cpp.

121 {
122  const double period = (_beaconSequenceID >= _beaconCountLimit) ? _slowBeaconPeriod : _fastBeaconPeriod;
123  if (period > 0)
124  {
125  Timer::shared_pointer timer(_timer.lock());
126  if(timer)
127  timer->scheduleAfterDelay(shared_from_this(), period);
128  }
129 }
void epics::pvAccess::BeaconEmitter::send ( epics::pvData::ByteBuffer buffer,
TransportSendControl control 
)
virtual

Called by transport. By this call transport gives callee ownership over the buffer. Calls on TransportSendControl instance must be made from calling thread. Moreover, ownership is valid only for the time of call of this method. NOTE: these limitations allow efficient implementation.

Implements epics::pvAccess::TransportSender.

Definition at line 48 of file beaconEmitter.cpp.

49 {
50  // get server status
51  PVField::shared_pointer serverStatus;
52  if(_serverStatusProvider.get())
53  {
54  try
55  {
56  serverStatus = _serverStatusProvider->getServerStatusData();
57  }
58  catch (...) {
59  // we have to proctect internal code from external implementation...
60  LOG(logLevelDebug, "BeaconServerStatusProvider implementation thrown an exception.");
61  }
62  }
63 
64  // send beacon
65  control->startMessage((int8)CMD_BEACON, 12+2+2+16+2);
66 
67  buffer->put(_guid.value, 0, sizeof(_guid.value));
68 
69  // TODO qos/flags (e.g. multicast/unicast)
70  buffer->putByte(0);
71 
72  buffer->putByte(_beaconSequenceID);
73 
74  // TODO for now fixed changeCount
75  buffer->putShort(0);
76 
77  // NOTE: is it possible (very likely) that address is any local address ::ffff:0.0.0.0
78  encodeAsIPv6Address(buffer, &_serverAddress);
79  buffer->putShort((int16)_serverPort);
80 
81  SerializeHelper::serializeString(_protocol, buffer, control);
82 
83  if (serverStatus)
84  {
85  // introspection interface + data
86  serverStatus->getField()->serialize(buffer, control);
87  serverStatus->serialize(buffer, control);
88  }
89  else
90  {
92  }
93  control->flush(true);
94 
95  // increment beacon sequence ID
96  _beaconSequenceID++;
97 
98  reschedule();
99 }
int8_t int8
Definition: pvType.h:75
static void serializeNullField(epics::pvData::ByteBuffer *buffer, epics::pvData::SerializableControl *control)
#define LOG(level, format,...)
Definition: logger.h:48
void encodeAsIPv6Address(ByteBuffer *buffer, const osiSockAddr *address)
EPICS_ALWAYS_INLINE void putByte(int8 value)
Definition: byteBuffer.h:525
static void serializeString(const std::string &value, ByteBuffer *buffer, SerializableControl *flusher)
int16_t int16
Definition: pvType.h:79
EPICS_ALWAYS_INLINE void putShort(int16 value)
Definition: byteBuffer.h:531
void epics::pvAccess::BeaconEmitter::start ( )

Start emitting.

Definition at line 113 of file beaconEmitter.cpp.

114 {
115  Timer::shared_pointer timer(_timer.lock());
116  if(timer)
117  timer->scheduleAfterDelay(shared_from_this(), 0.0);
118 }
void epics::pvAccess::BeaconEmitter::timerStopped ( )
virtual

The timer has stopped.

Implements epics::pvData::TimerCallback.

Definition at line 101 of file beaconEmitter.cpp.

102 {
103  //noop
104 }

The documentation for this class was generated from the following files: