nidas v1.2.3
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
nidas::dynld::UDPSampleOutput Class Reference

Interface of an output stream of samples. More...

#include <UDPSampleOutput.h>

Inheritance diagram for nidas::dynld::UDPSampleOutput:
Inheritance graph
[legend]

Classes

class  ConnectionMonitor
 Thread that waits for connections to die. More...
 
class  VariableListWorker
 Worker thread that is run when a connection comes in, sending XML over a socket. More...
 
class  XMLSocketListener
 Thread that waits for a connection on a tcp socket, starting a VariableListWorker on each connection. More...
 

Public Member Functions

 UDPSampleOutput ()
 
 ~UDPSampleOutput ()
 
void flush () throw ()
 Implementation of SampleClient::flush().
 
void allocateBuffer (size_t len)
 
nidas::core::SampleOutputconnected (nidas::core::IOChannel *) throw ()
 Implementation of IOChannelRequester::connected().
 
bool receive (const nidas::core::Sample *s) throw ()
 Return true if SampleOutputBase considers the sample handled, such as if it is outside the clipping window.
 
size_t write (const struct iovec *iov, int iovcnt)
 
void close ()
 
long long getNumOutputBytes () const
 Total number of bytes written with this IOStream.
 
void addNumOutputBytes (int val)
 
void fromDOMElement (const xercesc::DOMElement *node)
 
virtual void setIOChannel (IOChannel *val)
 Set the IOChannel for this SampleOutput.
 
SampleOutputgetOriginal () const
 Get pointer to SampleOutput that was cloned.
 
void setName (const std::string &val)
 
const std::string & getName () const
 
bool isRaw () const
 
void addRequestedSampleTag (SampleTag *tag)
 
std::list< const SampleTag * > getRequestedSampleTags () const
 
void addSourceSampleTag (const SampleTag *tag)
 
void addSourceSampleTags (const std::list< const SampleTag * > &tags)
 
std::list< const SampleTag * > getSourceSampleTags () const
 
void requestConnection (SampleConnectionRequester *)
 Request a connection, but don't wait for it.
 
int getReconnectDelaySecs () const
 Base class implementation.
 
void setReconnectDelaySecs (int val)
 
int getFd () const
 
dsm_time_t getNextFileTime () const
 
void createNextFile (dsm_time_t)
 
size_t write (const void *buf, size_t len)
 Raw write method, typically used to write the initial header.
 
IOChannelgetIOChannel () const
 
void setHeaderSource (HeaderSource *val)
 
void setDSMConfig (const DSMConfig *val)
 
const DSMConfiggetDSMConfig () const
 
size_t getNumDiscardedSamples () const
 
void addParameter (Parameter *val)
 Add a parameter to this DSMSensor.
 
const std::list< const Parameter * > & getParameters () const
 Get list of parameters.
 
const ParametergetParameter (const std::string &name) const
 Fetch a parameter by name.
 
void setLatency (float val)
 Set desired latency, providing some control over the response time vs buffer efficiency tradeoff.
 
float getLatency () const
 
void setTimeClippingWindow (const nidas::util::UTime &startTime, const nidas::util::UTime &endTime)
 The sample output can have a time window which clips the samples outside the window.
 
virtual xercesc::DOMElement * toDOMParent (xercesc::DOMElement *parent, bool complete) const
 Create a DOMElement and append it to the parent.
 
virtual xercesc::DOMElement * toDOMElement (xercesc::DOMElement *node, bool complete) const
 Add my content into a DOMElement.
 

Static Public Member Functions

static const XMLChgetNamespaceURI ()
 

Protected Member Functions

UDPSampleOutputclone (nidas::core::IOChannel *iochannel)
 This SampleOutput does not support cloning.
 
 UDPSampleOutput (UDPSampleOutput &, nidas::core::IOChannel *)
 This SampleOutput does not support a copy constructor with a new IOChannel.
 
size_t incrementDiscardedSamples ()
 
SampleConnectionRequestergetSampleConnectionRequester ()
 
void disconnect ()
 Close the IOChannel and notify whoever did the requestConnection that it is time to disconnect, perhaps because of an IOException.
 

Protected Attributes

std::string _name
 

Private Member Functions

xercesc::DOMDocument * getProjectDOM ()
 Get a pointer to the current project DOM.
 
void releaseProjectDOM ()
 
 UDPSampleOutput (const UDPSampleOutput &)
 No copying.
 
UDPSampleOutputoperator= (const UDPSampleOutput &)
 No assignment.
 

Private Attributes

nidas::core::MultipleUDPSockets_mochan
 
xercesc::DOMDocument * _doc
 
bool _projectChanged
 
nidas::util::Mutex _docLock
 
nidas::util::RWLock _docRWLock
 
nidas::util::Mutex _listenerLock
 
unsigned short _xmlPortNumber
 
unsigned short _multicastOutPort
 
XMLSocketListener_listener
 
ConnectionMonitor_monitor
 
long long _nbytesOut
 
char_buffer
 data buffer
 
char_head
 where we insert bytes into the buffer
 
char_tail
 where we remove bytes from the buffer
 
size_t _buflen
 The actual buffer size.
 
char_eob
 One past end of buffer.
 
nidas::core::dsm_time_t _lastWrite
 Time of last physical write.
 
int _maxUsecs
 Maximum number of microseconds between physical writes.
 
nidas::util::Mutex _tagsMutex
 
std::list< SampleTag * > _requestedTags
 
std::list< const SampleTag * > _constRequestedTags
 
IOChannel_iochan
 
SampleConnectionRequester_connectionRequester
 
dsm_time_t _nextFileTime
 
HeaderSource_headerSource
 
const DSMConfig_dsm
 
size_t _nsamplesDiscarded
 
std::map< std::string, Parameter * > _parameters
 Map of parameters by name.
 
std::list< const Parameter * > _constParameters
 List of const pointers to Parameters for providing via getParameters().
 
std::list< const SampleTag * > _sourceTags
 
SampleOutput_original
 Pointer to the SampleOutput that I was cloned from.
 
float _latency
 
int _reconnectDelaySecs
 
dsm_time_t _startTime
 Clipping time window.
 
dsm_time_t _endTime
 

Static Private Attributes

static XMLChnamespaceURI = 0
 

Detailed Description

Interface of an output stream of samples.

Constructor & Destructor Documentation

◆ UDPSampleOutput() [1/3]

UDPSampleOutput::UDPSampleOutput ( )

◆ ~UDPSampleOutput()

UDPSampleOutput::~UDPSampleOutput ( )

◆ UDPSampleOutput() [2/3]

UDPSampleOutput::UDPSampleOutput ( UDPSampleOutput & ,
nidas::core::IOChannel *  )
protected

This SampleOutput does not support a copy constructor with a new IOChannel.

It will die with an assert.

References nidas::core::getSample(), and LOG_ERR.

◆ UDPSampleOutput() [3/3]

nidas::dynld::UDPSampleOutput::UDPSampleOutput ( const UDPSampleOutput & )
private

No copying.

Member Function Documentation

◆ addNumOutputBytes()

void nidas::dynld::UDPSampleOutput::addNumOutputBytes ( int val)
inline

References _nbytesOut, and nidas::core::getSample().

Referenced by write().

◆ addParameter()

void SampleOutputBase::addParameter ( Parameter * val)
inherited

Add a parameter to this DSMSensor.

DSMSensor will then own the pointer and will delete it in its destructor. If a Parameter exists with the same name, it will be replaced with the new Parameter.

References nidas::core::SampleOutputBase::_constParameters, nidas::core::SampleOutputBase::_parameters, and nidas::core::getSample().

Referenced by nidas::core::SampleOutputBase::fromDOMElement().

◆ addRequestedSampleTag()

void SampleOutputBase::addRequestedSampleTag ( SampleTag * tag)
virtualinherited

◆ addSourceSampleTag()

void SampleOutputBase::addSourceSampleTag ( const SampleTag * tag)
virtualinherited

◆ addSourceSampleTags()

void SampleOutputBase::addSourceSampleTags ( const std::list< const SampleTag * > & tags)
virtualinherited

◆ allocateBuffer()

void UDPSampleOutput::allocateBuffer ( size_t len)

◆ clone()

UDPSampleOutput * UDPSampleOutput::clone ( nidas::core::IOChannel * iochannel)
protectedvirtual

This SampleOutput does not support cloning.

It will die with an assert.

Implements nidas::core::SampleOutput.

References nidas::core::getSample(), and LOG_ERR.

◆ close()

void UDPSampleOutput::close ( )
virtual

◆ connected()

SampleOutput * UDPSampleOutput::connected ( nidas::core::IOChannel * ochan)
throw ( )
virtual

Implementation of IOChannelRequester::connected().

How an IOChannel calls back to a SampleConnectionRequester that it is connected. The ConnectionRequester can then return a clone of itself if the IOChannel is a new instance.

Reimplemented from nidas::core::SampleOutputBase.

References nidas::core::SampleOutputBase::connected(), nidas::core::Project::getInstance(), nidas::core::getSample(), nidas::dynld::InitialUDPDataRequestReply::strings, and WLOG.

◆ createNextFile()

void SampleOutputBase::createNextFile ( dsm_time_t tt)
inherited

◆ disconnect()

void SampleOutputBase::disconnect ( )
protectedinherited

Close the IOChannel and notify whoever did the requestConnection that it is time to disconnect, perhaps because of an IOException.

This is typically called in the receive() method of a SampleOutput if it gets an IOException when writing data. A common implementation of a connection requester is to delete this SampleOutput after the removing it from the sample stream. So the caller method should immediately return after calling disconnect().

Exceptions
nidas::util::IOException

References nidas::core::SampleOutputBase::_connectionRequester, nidas::core::SampleOutputBase::close(), nidas::core::SampleConnectionRequester::disconnect(), nidas::core::SampleOutputBase::getName(), nidas::core::getSample(), and ILOG.

Referenced by nidas::dynld::AsciiOutput::receive(), and nidas::dynld::raf::CVIOutput::receive().

◆ flush()

void nidas::dynld::UDPSampleOutput::flush ( )
throw ( )
inlinevirtual

Implementation of SampleClient::flush().

Implements nidas::core::SampleClient.

◆ fromDOMElement()

void UDPSampleOutput::fromDOMElement ( const xercesc::DOMElement * node)
virtual

◆ getDSMConfig()

const DSMConfig * nidas::core::SampleOutputBase::getDSMConfig ( ) const
inlinevirtualinherited

◆ getFd()

int SampleOutputBase::getFd ( ) const
virtualinherited

◆ getIOChannel()

IOChannel * nidas::core::SampleOutputBase::getIOChannel ( ) const
inlinevirtualinherited

◆ getLatency()

float nidas::core::SampleOutputBase::getLatency ( ) const
inlinevirtualinherited

◆ getName()

const std::string & nidas::core::SampleOutputBase::getName ( ) const
inlinevirtualinherited

◆ getNamespaceURI()

static const XMLCh * nidas::core::DOMable::getNamespaceURI ( )
inlinestaticinherited

◆ getNextFileTime()

dsm_time_t nidas::core::SampleOutputBase::getNextFileTime ( ) const
inlineinherited

◆ getNumDiscardedSamples()

size_t nidas::core::SampleOutputBase::getNumDiscardedSamples ( ) const
inlineinherited

◆ getNumOutputBytes()

long long nidas::dynld::UDPSampleOutput::getNumOutputBytes ( ) const
inline

Total number of bytes written with this IOStream.

References _nbytesOut.

◆ getOriginal()

SampleOutput * nidas::core::SampleOutputBase::getOriginal ( ) const
inlinevirtualinherited

Get pointer to SampleOutput that was cloned.

Will be NULL if this SampleOutput is an un-cloned original.

Implements nidas::core::SampleOutput.

References nidas::core::SampleOutputBase::_original.

◆ getParameter()

const Parameter * SampleOutputBase::getParameter ( const std::string & name) const
inherited

Fetch a parameter by name.

Returns a NULL pointer if no such parameter exists.

References nidas::core::SampleOutputBase::_parameters.

◆ getParameters()

const std::list< const Parameter * > & nidas::core::SampleOutputBase::getParameters ( ) const
inlineinherited

Get list of parameters.

References nidas::core::SampleOutputBase::_constParameters.

Referenced by fromDOMElement().

◆ getProjectDOM()

xercesc::DOMDocument * UDPSampleOutput::getProjectDOM ( )
private

Get a pointer to the current project DOM.

The caller acquires a read lock on the DOM, and must call releaseProjectDOM() when they are finised.

References _doc, _docLock, _docRWLock, _projectChanged, nidas::core::XMLImplementation::getImplementation(), nidas::core::Project::getInstance(), nidas::core::DOMable::getNamespaceURI(), nidas::core::getSample(), and nidas::util::RWLock::rdlock().

◆ getReconnectDelaySecs()

int SampleOutputBase::getReconnectDelaySecs ( ) const
virtualinherited

Base class implementation.

If setReconnectDelaySecs() has been called on this SampleOutput, then that value will be returned. Otherwise this will return the value of the IOChannel.

Implements nidas::core::SampleOutput.

References nidas::core::SampleOutputBase::_iochan, nidas::core::SampleOutputBase::_reconnectDelaySecs, and nidas::core::IOChannel::getReconnectDelaySecs().

◆ getRequestedSampleTags()

std::list< const SampleTag * > SampleOutputBase::getRequestedSampleTags ( ) const
virtualinherited

◆ getSampleConnectionRequester()

SampleConnectionRequester * nidas::core::SampleOutputBase::getSampleConnectionRequester ( )
inlineprotectedinherited

◆ getSourceSampleTags()

list< const SampleTag * > SampleOutputBase::getSourceSampleTags ( ) const
virtualinherited

◆ incrementDiscardedSamples()

size_t nidas::core::SampleOutputBase::incrementDiscardedSamples ( )
inlineprotectedinherited

◆ isRaw()

bool nidas::core::SampleOutputBase::isRaw ( ) const
inlinevirtualinherited

◆ operator=()

UDPSampleOutput & nidas::dynld::UDPSampleOutput::operator= ( const UDPSampleOutput & )
private

No assignment.

◆ receive()

bool UDPSampleOutput::receive ( const nidas::core::Sample * s)
throw ( )
virtual

Return true if SampleOutputBase considers the sample handled, such as if it is outside the clipping window.

Otherwise return false to indicate the subclass should handle the sample.

Reimplemented from nidas::core::SampleOutputBase.

References nidas::core::getSample(), nidas::core::SampleHeader::getSizeOf(), LOG_ERR, LOG_WARNING, nidas::core::SampleHeader::setDataByteLength(), nidas::core::SampleHeader::setRawId(), and nidas::core::SampleHeader::setTimeTag().

◆ releaseProjectDOM()

void UDPSampleOutput::releaseProjectDOM ( )
private

◆ requestConnection()

void SampleOutputBase::requestConnection ( SampleConnectionRequester * requester)
virtualinherited

Request a connection, but don't wait for it.

Requester will be notified via SampleConnectionRequester interface when the connection has been made. It is not necessary to call this method if a SampleOutput is constructed with a connected IOChannel.

Exceptions
nidas::util::IOException

Implements nidas::core::SampleOutput.

References nidas::core::SampleOutputBase::_connectionRequester, nidas::core::SampleOutputBase::_iochan, nidas::core::getSample(), and nidas::core::IOChannel::requestConnection().

Referenced by nidas::dynld::AsciiOutput::requestConnection(), and nidas::dynld::raf::CVIOutput::requestConnection().

◆ setDSMConfig()

void nidas::core::SampleOutputBase::setDSMConfig ( const DSMConfig * val)
inlinevirtualinherited

◆ setHeaderSource()

void nidas::core::SampleOutputBase::setHeaderSource ( HeaderSource * val)
inlinevirtualinherited

◆ setIOChannel()

void SampleOutputBase::setIOChannel ( IOChannel * val)
virtualinherited

Set the IOChannel for this SampleOutput.

This IOChannel is not yet connected. The IOChannel must be connected before the SampleOutput is used for I/O, using the requestConnection() method, or by IOChannel::connect() followed by SampleOutput::connected(IOChannel*).

Reimplemented in nidas::dynld::raf::CVIOutput.

References nidas::core::SampleOutputBase::_iochan, nidas::core::SampleOutputBase::getDSMConfig(), nidas::core::getSample(), and nidas::core::IOChannel::setDSMConfig().

Referenced by nidas::dynld::AsciiOutput::connect(), nidas::core::SampleOutputBase::connected(), nidas::core::SampleOutputBase::fromDOMElement(), and nidas::dynld::raf::CVIOutput::setIOChannel().

◆ setLatency()

void nidas::core::SampleOutputBase::setLatency ( float val)
inlinevirtualinherited

Set desired latency, providing some control over the response time vs buffer efficiency tradeoff.

Setting a latency of 1/10 sec means buffer data in the IOStream for a 1/10 sec, then send the data to the physical device.

Parameters
valLatency, in seconds.
Exceptions
nidas::util::InvalidParameterException

Implements nidas::core::SampleOutput.

Reimplemented in nidas::dynld::SampleOutputStream.

References nidas::core::SampleOutputBase::_latency, and nidas::core::getSample().

Referenced by nidas::core::SampleOutputBase::fromDOMElement(), and nidas::dynld::SampleOutputStream::setLatency().

◆ setName()

void nidas::core::SampleOutputBase::setName ( const std::string & val)
inlinevirtualinherited

◆ setReconnectDelaySecs()

void SampleOutputBase::setReconnectDelaySecs ( int val)
virtualinherited

◆ setTimeClippingWindow()

void SampleOutputBase::setTimeClippingWindow ( const nidas::util::UTime & startTime,
const nidas::util::UTime & endTime )
inherited

The sample output can have a time window which clips the samples outside the window.

Only samples at or after startTime and before endTime will be passed along. One or both of start and end time can be zero, in which case only the non-zero times are used to clip samples.

References nidas::core::SampleOutputBase::_endTime, nidas::core::SampleOutputBase::_startTime, and nidas::util::UTime::toUsecs().

Referenced by nidas::core::NidasApp::setOutputClipping().

◆ toDOMElement()

xercesc::DOMElement * DOMable::toDOMElement ( xercesc::DOMElement * node,
bool complete ) const
virtualinherited

◆ toDOMParent()

xercesc::DOMElement * DOMable::toDOMParent ( xercesc::DOMElement * parent,
bool complete ) const
virtualinherited

Create a DOMElement and append it to the parent.

Exceptions
xercesc::DOMException

Reimplemented in nidas::core::DSMConfig, nidas::core::DSMSensor, nidas::core::Project, nidas::core::SampleTag, nidas::core::Site, nidas::core::ServerSocket, and nidas::core::Variable.

◆ write() [1/2]

size_t UDPSampleOutput::write ( const struct iovec * iov,
int iovcnt )

◆ write() [2/2]

size_t SampleOutputBase::write ( const void * buf,
size_t len )
virtualinherited

Raw write method, typically used to write the initial header.

Exceptions
nidas::util::IOException

Implements nidas::core::SampleOutput.

References nidas::core::SampleOutputBase::_iochan, nidas::core::getSample(), len, and nidas::core::IOChannel::write().

Member Data Documentation

◆ _buffer

char* nidas::dynld::UDPSampleOutput::_buffer
private

data buffer

Referenced by allocateBuffer(), and write().

◆ _buflen

size_t nidas::dynld::UDPSampleOutput::_buflen
private

The actual buffer size.

Referenced by allocateBuffer(), and write().

◆ _connectionRequester

SampleConnectionRequester* nidas::core::SampleOutputBase::_connectionRequester
privateinherited

◆ _constParameters

std::list<const Parameter*> nidas::core::SampleOutputBase::_constParameters
privateinherited

List of const pointers to Parameters for providing via getParameters().

Referenced by nidas::core::SampleOutputBase::addParameter(), and nidas::core::SampleOutputBase::getParameters().

◆ _constRequestedTags

std::list<const SampleTag*> nidas::core::SampleOutputBase::_constRequestedTags
privateinherited

◆ _doc

xercesc::DOMDocument* nidas::dynld::UDPSampleOutput::_doc
private

Referenced by getProjectDOM().

◆ _docLock

nidas::util::Mutex nidas::dynld::UDPSampleOutput::_docLock
private

Referenced by getProjectDOM().

◆ _docRWLock

nidas::util::RWLock nidas::dynld::UDPSampleOutput::_docRWLock
private

Referenced by getProjectDOM(), and releaseProjectDOM().

◆ _dsm

const DSMConfig* nidas::core::SampleOutputBase::_dsm
privateinherited

◆ _endTime

dsm_time_t nidas::core::SampleOutputBase::_endTime
privateinherited

◆ _eob

char* nidas::dynld::UDPSampleOutput::_eob
private

One past end of buffer.

Referenced by allocateBuffer(), and write().

◆ _head

char* nidas::dynld::UDPSampleOutput::_head
private

where we insert bytes into the buffer

Referenced by allocateBuffer(), and write().

◆ _headerSource

HeaderSource* nidas::core::SampleOutputBase::_headerSource
privateinherited

◆ _iochan

IOChannel* nidas::core::SampleOutputBase::_iochan
privateinherited

◆ _lastWrite

nidas::core::dsm_time_t nidas::dynld::UDPSampleOutput::_lastWrite
private

Time of last physical write.

Referenced by write().

◆ _latency

float nidas::core::SampleOutputBase::_latency
privateinherited

◆ _listener

XMLSocketListener* nidas::dynld::UDPSampleOutput::_listener
private

Referenced by close(), and ~UDPSampleOutput().

◆ _listenerLock

nidas::util::Mutex nidas::dynld::UDPSampleOutput::_listenerLock
private

◆ _maxUsecs

int nidas::dynld::UDPSampleOutput::_maxUsecs
private

Maximum number of microseconds between physical writes.

Referenced by write().

◆ _mochan

nidas::core::MultipleUDPSockets* nidas::dynld::UDPSampleOutput::_mochan
private

Referenced by fromDOMElement().

◆ _monitor

ConnectionMonitor* nidas::dynld::UDPSampleOutput::_monitor
private

◆ _multicastOutPort

unsigned short nidas::dynld::UDPSampleOutput::_multicastOutPort
private

Referenced by fromDOMElement().

◆ _name

std::string nidas::core::SampleOutputBase::_name
protectedinherited

◆ _nbytesOut

long long nidas::dynld::UDPSampleOutput::_nbytesOut
private

◆ _nextFileTime

dsm_time_t nidas::core::SampleOutputBase::_nextFileTime
privateinherited

◆ _nsamplesDiscarded

size_t nidas::core::SampleOutputBase::_nsamplesDiscarded
privateinherited

◆ _original

SampleOutput* nidas::core::SampleOutputBase::_original
privateinherited

Pointer to the SampleOutput that I was cloned from.

Referenced by nidas::core::SampleOutputBase::getOriginal().

◆ _parameters

std::map<std::string,Parameter*> nidas::core::SampleOutputBase::_parameters
privateinherited

◆ _projectChanged

bool nidas::dynld::UDPSampleOutput::_projectChanged
private

Referenced by getProjectDOM().

◆ _reconnectDelaySecs

int nidas::core::SampleOutputBase::_reconnectDelaySecs
privateinherited

◆ _requestedTags

std::list<SampleTag*> nidas::core::SampleOutputBase::_requestedTags
privateinherited

◆ _sourceTags

std::list<const SampleTag*> nidas::core::SampleOutputBase::_sourceTags
privateinherited

◆ _startTime

dsm_time_t nidas::core::SampleOutputBase::_startTime
privateinherited

Clipping time window.

Samples outside the given time window will not pass.

Referenced by nidas::core::SampleOutputBase::receive(), and nidas::core::SampleOutputBase::setTimeClippingWindow().

◆ _tagsMutex

nidas::util::Mutex nidas::core::SampleOutputBase::_tagsMutex
mutableprivateinherited

◆ _tail

char* nidas::dynld::UDPSampleOutput::_tail
private

where we remove bytes from the buffer

Referenced by allocateBuffer(), and write().

◆ _xmlPortNumber

unsigned short nidas::dynld::UDPSampleOutput::_xmlPortNumber
private

◆ namespaceURI

XMLCh * DOMable::namespaceURI = 0
staticprivateinherited

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