nidas v1.2.3
Public Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
nidas::core::SampleScanner Class Referenceabstract

A scanner of sample data. More...

#include <SampleScanner.h>

Inheritance diagram for nidas::core::SampleScanner:
Inheritance graph
[legend]

Public Member Functions

 SampleScanner (int bufsize=8192)
 
virtual ~SampleScanner ()
 
virtual void init ()
 Initialize the scanner.
 
virtual void setMessageParameters (unsigned int len, const std::string &val, bool eom)=0
 Set the parameters associated with scanning of character messages.
 
virtual const std::string & getMessageSeparator () const
 Returns an empty string.
 
virtual const std::string getBackslashedMessageSeparator () const
 Returns an empty string.
 
virtual bool getMessageSeparatorAtEOM () const
 
virtual unsigned int getMessageLength () const
 Returns 0.
 
virtual bool getNullTerminate () const
 Should the SampleScanner append a null character, '\0', to the messages.
 
void setUsecsPerByte (int val)
 
int getUsecsPerByte () const
 
virtual size_t readBuffer (DSMSensor *sensor, bool &exhausted)
 Read from the sensor into the internal buffer of this SampleScanner.
 
virtual size_t readBuffer (DSMSensor *sensor, bool &exhausted, int msecTimeout)
 Read from the sensor into the internal buffer of this SampleScanner, providing a timeout in milliseconds.
 
virtual void clearBuffer ()
 
virtual SamplenextSample (DSMSensor *sensor)=0
 Extract the next sample from the buffer.
 
unsigned int getBytesInBuffer () const
 
virtual void resetStatistics ()
 
virtual void calcStatistics (unsigned int periodUsec)
 Update the sensor sampling statistics: samples/sec, bytes/sec, min/max sample size, that can be accessed via getObservedSamplingRate(), getObservedDataRate() etc.
 
unsigned int getMaxSampleLength () const
 
unsigned int getMinSampleLength () const
 
unsigned int getBadTimeTagCount () const
 
float getObservedSamplingRate () const
 
float getObservedDataRate () const
 
void addNumBytesToStats (size_t val)
 
void addSampleToStats (unsigned int val)
 
void incrementBadTimeTags ()
 

Protected Attributes

const unsigned int BUFSIZE
 Buffer size for reading from sensor.
 
char_buffer
 
unsigned int _bufhead
 
unsigned int _buftail
 
Sample_osamp
 
struct dsm_sample _header
 
unsigned int _outSampRead
 
unsigned int _outSampToRead
 
char_outSampDataPtr
 
std::string _messageSeparator
 
int _messageLength
 
bool _separatorAtEOM
 
char_separator
 messageSeparator in a C string.
 
int _separatorLen
 Length of messageSeparator.
 

Private Member Functions

 SampleScanner (const SampleScanner &)
 No copy (could be added if needed).
 
SampleScanneroperator= (const SampleScanner &)
 No assignment (could be added if needed).
 

Private Attributes

std::string _emptyString
 
time_t _initialTimeSecs
 
unsigned int _minSampleLength [2]
 
unsigned int _maxSampleLength [2]
 
int _currentIndex
 
int _reportIndex
 
size_t _nsamples
 
size_t _nbytes
 
unsigned int _badTimeTags
 
float _sampleRateObs
 Observed number of samples per second.
 
float _dataRateObs
 
int _usecsPerByte
 

Detailed Description

A scanner of sample data.

Provides a readBuffer() method to read data from a DSMSensor into an internal buffer. Then defines a virtual nextSample() method to extract all available samples from that buffer.

Currently there are four implementations of SampleScanner, which differ in how they extract samples from the internal buffer:

DriverSampleScanner: A SampleScanner for reading samples that have been pre-formatted by a device driver - they already have a header consisting of a timetag, and a data length. This can be used, for example, to read samples from a driver supporting an A/D converter.

MessageSampleScanner: Subclass of DriverSampleScanner, supporting the set/get of the message separation parameters. This scanner does not itself break the input into samples, since this has been done by the driver module.

MessageStreamScanner: Provides sets and gets of message separation parameters used in parsing input messages from a sensor. Parses the stream input, breaking it into samples, by recognizing separators in the message stream.

DatagramSampleScanner: Creates samples from input datagrams, a simple task since the OS maintains the separation of the input datagrams. Each datagram becomes a separate sample, with a timetag taken from the system clock at the time the scanner has determined that there is data available.

Constructor & Destructor Documentation

◆ SampleScanner() [1/2]

SampleScanner::SampleScanner ( int bufsize = 8192)

References resetStatistics().

◆ ~SampleScanner()

SampleScanner::~SampleScanner ( )
virtual

◆ SampleScanner() [2/2]

nidas::core::SampleScanner::SampleScanner ( const SampleScanner & )
private

No copy (could be added if needed).

Member Function Documentation

◆ addNumBytesToStats()

void nidas::core::SampleScanner::addNumBytesToStats ( size_t val)
inline

◆ addSampleToStats()

void nidas::core::SampleScanner::addSampleToStats ( unsigned int val)
inline

◆ calcStatistics()

void SampleScanner::calcStatistics ( unsigned int periodUsec)
virtual

Update the sensor sampling statistics: samples/sec, bytes/sec, min/max sample size, that can be accessed via getObservedSamplingRate(), getObservedDataRate() etc.

Should be called every periodUsec by a user of this sensor.

Parameters
periodUsecStatistics period.

References _currentIndex, _dataRateObs, _maxSampleLength, _minSampleLength, _nbytes, _nsamples, _reportIndex, _sampleRateObs, nidas::core::getSample(), and USECS_PER_SEC.

Referenced by nidas::core::DSMSensor::calcStatistics().

◆ clearBuffer()

void SampleScanner::clearBuffer ( )
virtual

References _bufhead, and _buftail.

Referenced by nidas::core::DSMSensor::clearBuffer().

◆ getBackslashedMessageSeparator()

virtual const std::string nidas::core::SampleScanner::getBackslashedMessageSeparator ( ) const
inlinevirtual

Returns an empty string.

Reimplemented in nidas::core::MessageSampleScanner, and nidas::core::MessageStreamScanner.

References _emptyString.

◆ getBadTimeTagCount()

unsigned int nidas::core::SampleScanner::getBadTimeTagCount ( ) const
inline

◆ getBytesInBuffer()

unsigned int nidas::core::SampleScanner::getBytesInBuffer ( ) const
inline

References _bufhead, and _buftail.

◆ getMaxSampleLength()

unsigned int nidas::core::SampleScanner::getMaxSampleLength ( ) const
inline

◆ getMessageLength()

virtual unsigned int nidas::core::SampleScanner::getMessageLength ( ) const
inlinevirtual

◆ getMessageSeparator()

virtual const std::string & nidas::core::SampleScanner::getMessageSeparator ( ) const
inlinevirtual

Returns an empty string.

Reimplemented in nidas::core::MessageSampleScanner, and nidas::core::MessageStreamScanner.

References _emptyString.

◆ getMessageSeparatorAtEOM()

virtual bool nidas::core::SampleScanner::getMessageSeparatorAtEOM ( ) const
inlinevirtual

◆ getMinSampleLength()

unsigned int nidas::core::SampleScanner::getMinSampleLength ( ) const
inline

◆ getNullTerminate()

virtual bool nidas::core::SampleScanner::getNullTerminate ( ) const
inlinevirtual

Should the SampleScanner append a null character, '\0', to the messages.

Reimplemented in nidas::core::MessageStreamScanner, and nidas::core::DatagramSampleScanner.

Referenced by nidas::core::CharacterSensor::getNullTerminated().

◆ getObservedDataRate()

float SampleScanner::getObservedDataRate ( ) const

◆ getObservedSamplingRate()

float SampleScanner::getObservedSamplingRate ( ) const

◆ getUsecsPerByte()

int nidas::core::SampleScanner::getUsecsPerByte ( ) const
inline

◆ incrementBadTimeTags()

void nidas::core::SampleScanner::incrementBadTimeTags ( )
inline

◆ init()

void SampleScanner::init ( )
virtual

Initialize the scanner.

Must be called by a user of SampleScanner prior to calling readSamples().

References resetStatistics().

Referenced by nidas::core::DSMSensor::open().

◆ nextSample()

virtual Sample * nidas::core::SampleScanner::nextSample ( DSMSensor * sensor)
pure virtual

Extract the next sample from the buffer.

Returns NULL if there are no more samples in the buffer.

Implemented in nidas::core::DriverSampleScanner, nidas::core::MessageStreamScanner, and nidas::core::DatagramSampleScanner.

Referenced by nidas::core::DSMSensor::nextSample().

◆ operator=()

SampleScanner & nidas::core::SampleScanner::operator= ( const SampleScanner & )
private

No assignment (could be added if needed).

◆ readBuffer() [1/2]

size_t SampleScanner::readBuffer ( DSMSensor * sensor,
bool & exhausted )
virtual

◆ readBuffer() [2/2]

size_t SampleScanner::readBuffer ( DSMSensor * sensor,
bool & exhausted,
int msecTimeout )
virtual

Read from the sensor into the internal buffer of this SampleScanner, providing a timeout in milliseconds.

This will throw nidas::util::IOTimeoutException if the read fails due to a timeout.

Exceptions
nidas::util::IOException

Reimplemented in nidas::core::MessageStreamScanner.

References nidas::core::DSMSensor::getName(), nidas::core::DSMSensor::getReadFd(), nidas::core::getSample(), MSECS_PER_SEC, NLOG, NSECS_PER_MSEC, and readBuffer().

◆ resetStatistics()

void SampleScanner::resetStatistics ( )
virtual

◆ setMessageParameters()

virtual void nidas::core::SampleScanner::setMessageParameters ( unsigned int len,
const std::string & val,
bool eom )
pure virtual

◆ setUsecsPerByte()

void nidas::core::SampleScanner::setUsecsPerByte ( int val)
inline

Member Data Documentation

◆ _badTimeTags

unsigned int nidas::core::SampleScanner::_badTimeTags
private

◆ _buffer

char* nidas::core::SampleScanner::_buffer
protected

◆ _bufhead

unsigned int nidas::core::SampleScanner::_bufhead
protected

◆ _buftail

unsigned int nidas::core::SampleScanner::_buftail
protected

◆ _currentIndex

int nidas::core::SampleScanner::_currentIndex
private

◆ _dataRateObs

float nidas::core::SampleScanner::_dataRateObs
private

◆ _emptyString

std::string nidas::core::SampleScanner::_emptyString
private

◆ _header

struct dsm_sample nidas::core::SampleScanner::_header
protected

◆ _initialTimeSecs

time_t nidas::core::SampleScanner::_initialTimeSecs
private

◆ _maxSampleLength

unsigned int nidas::core::SampleScanner::_maxSampleLength[2]
private

◆ _messageLength

int nidas::core::SampleScanner::_messageLength
protected

◆ _messageSeparator

std::string nidas::core::SampleScanner::_messageSeparator
protected

◆ _minSampleLength

unsigned int nidas::core::SampleScanner::_minSampleLength[2]
private

◆ _nbytes

size_t nidas::core::SampleScanner::_nbytes
private

◆ _nsamples

size_t nidas::core::SampleScanner::_nsamples
private

◆ _osamp

Sample* nidas::core::SampleScanner::_osamp
protected

◆ _outSampDataPtr

char* nidas::core::SampleScanner::_outSampDataPtr
protected

◆ _outSampRead

unsigned int nidas::core::SampleScanner::_outSampRead
protected

◆ _outSampToRead

unsigned int nidas::core::SampleScanner::_outSampToRead
protected

◆ _reportIndex

int nidas::core::SampleScanner::_reportIndex
private

◆ _sampleRateObs

float nidas::core::SampleScanner::_sampleRateObs
private

Observed number of samples per second.

Referenced by calcStatistics(), getObservedSamplingRate(), and resetStatistics().

◆ _separator

char* nidas::core::SampleScanner::_separator
protected

◆ _separatorAtEOM

bool nidas::core::SampleScanner::_separatorAtEOM
protected

◆ _separatorLen

int nidas::core::SampleScanner::_separatorLen
protected

◆ _usecsPerByte

int nidas::core::SampleScanner::_usecsPerByte
private

Referenced by getUsecsPerByte(), and setUsecsPerByte().

◆ BUFSIZE

const unsigned int nidas::core::SampleScanner::BUFSIZE
protected

Buffer size for reading from sensor.

Referenced by readBuffer(), and nidas::core::DatagramSampleScanner::readBuffer().


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