nidas  v1.2-1520
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. More...
 
virtual void setMessageParameters (unsigned int len, const std::string &val, bool eom)=0 throw (nidas::util::InvalidParameterException)
 Set the parameters associated with scanning of character messages. More...
 
virtual const std::string & getMessageSeparator () const
 Returns an empty string. More...
 
virtual const std::string getBackslashedMessageSeparator () const
 Returns an empty string. More...
 
virtual bool getMessageSeparatorAtEOM () const
 
virtual unsigned int getMessageLength () const
 Returns 0. More...
 
virtual bool getNullTerminate () const
 Should the SampleScanner append a null character, '\0', to the messages. More...
 
void setUsecsPerByte (int val)
 
int getUsecsPerByte () const
 
virtual size_t readBuffer (DSMSensor *sensor, bool &exhausted) throw (nidas::util::IOException)
 Read from the sensor into the internal buffer of this SampleScanner. More...
 
virtual size_t readBuffer (DSMSensor *sensor, bool &exhausted, int msecTimeout) throw (nidas::util::IOException)
 Read from the sensor into the internal buffer of this SampleScanner, providing a timeout in milliseconds. More...
 
virtual void clearBuffer ()
 
virtual SamplenextSample (DSMSensor *sensor)=0
 Extract the next sample from the buffer. More...
 
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. More...
 
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. More...
 
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. More...
 
int _separatorLen
 Length of messageSeparator. More...
 

Private Member Functions

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

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. More...
 
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::SampleScanner ( int  bufsize = 8192)

References resetStatistics().

SampleScanner::~SampleScanner ( )
virtual
nidas::core::SampleScanner::SampleScanner ( const SampleScanner )
private

No copy (could be added if needed).

Member Function Documentation

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

References _nbytes.

void nidas::core::SampleScanner::addSampleToStats ( unsigned int  val)
inline
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, and USECS_PER_SEC.

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

void SampleScanner::clearBuffer ( )
virtual

References _bufhead, and _buftail.

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

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

Returns an empty string.

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

References _emptyString.

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

References _bufhead, and _buftail.

unsigned int nidas::core::SampleScanner::getMaxSampleLength ( ) const
inline
virtual unsigned int nidas::core::SampleScanner::getMessageLength ( ) const
inlinevirtual
virtual const std::string& nidas::core::SampleScanner::getMessageSeparator ( ) const
inlinevirtual

Returns an empty string.

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

References _emptyString.

virtual bool nidas::core::SampleScanner::getMessageSeparatorAtEOM ( ) const
inlinevirtual
unsigned int nidas::core::SampleScanner::getMinSampleLength ( ) const
inline
virtual bool nidas::core::SampleScanner::getNullTerminate ( ) const
inlinevirtual

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

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

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

float SampleScanner::getObservedDataRate ( ) const
float SampleScanner::getObservedSamplingRate ( ) const
int nidas::core::SampleScanner::getUsecsPerByte ( ) const
inline
void nidas::core::SampleScanner::incrementBadTimeTags ( )
inline
void SampleScanner::init ( )
virtual

Initialize the scanner.

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

References resetStatistics().

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::DatagramSampleScanner, nidas::core::MessageStreamScanner, and nidas::core::DriverSampleScanner.

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

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

No assignment (could be added if needed).

size_t SampleScanner::readBuffer ( DSMSensor sensor,
bool &  exhausted 
)
throw (nidas::util::IOException
)
virtual
size_t SampleScanner::readBuffer ( DSMSensor sensor,
bool &  exhausted,
int  msecTimeout 
)
throw (nidas::util::IOException
)
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.

Reimplemented in nidas::core::MessageStreamScanner.

References MSECS_PER_SEC, NLOG, NSECS_PER_MSEC, and readBuffer().

void SampleScanner::resetStatistics ( )
virtual
virtual void nidas::core::SampleScanner::setMessageParameters ( unsigned int  len,
const std::string &  val,
bool  eom 
)
throw (nidas::util::InvalidParameterException
)
pure virtual
void nidas::core::SampleScanner::setUsecsPerByte ( int  val)
inline

Member Data Documentation

unsigned int nidas::core::SampleScanner::_badTimeTags
private
char* nidas::core::SampleScanner::_buffer
protected
unsigned int nidas::core::SampleScanner::_bufhead
protected
unsigned int nidas::core::SampleScanner::_buftail
protected
int nidas::core::SampleScanner::_currentIndex
private
float nidas::core::SampleScanner::_dataRateObs
private
std::string nidas::core::SampleScanner::_emptyString
private
struct dsm_sample nidas::core::SampleScanner::_header
protected
time_t nidas::core::SampleScanner::_initialTimeSecs
private
unsigned int nidas::core::SampleScanner::_maxSampleLength[2]
private
int nidas::core::SampleScanner::_messageLength
protected
std::string nidas::core::SampleScanner::_messageSeparator
protected
unsigned int nidas::core::SampleScanner::_minSampleLength[2]
private
size_t nidas::core::SampleScanner::_nbytes
private
size_t nidas::core::SampleScanner::_nsamples
private
Sample* nidas::core::SampleScanner::_osamp
protected
char* nidas::core::SampleScanner::_outSampDataPtr
protected
unsigned int nidas::core::SampleScanner::_outSampRead
protected
unsigned int nidas::core::SampleScanner::_outSampToRead
protected
int nidas::core::SampleScanner::_reportIndex
private
float nidas::core::SampleScanner::_sampleRateObs
private

Observed number of samples per second.

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

char* nidas::core::SampleScanner::_separator
protected
bool nidas::core::SampleScanner::_separatorAtEOM
protected
int nidas::core::SampleScanner::_separatorLen
protected
int nidas::core::SampleScanner::_usecsPerByte
private

Referenced by getUsecsPerByte(), and setUsecsPerByte().

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

Buffer size for reading from sensor.


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