Brief description of class still missing. More...
#include <DynamicBuffer.h>
Public Member Functions | |
DynamicBuffer (int fileDescriptor) | |
bool | read () |
int | send (const char *bytes, int bytesCount) const |
int | sendNoGateway (const char *bytes, int bytesCount) const |
int | sendPartial (const char *bytes, int bytesCount) const |
int | sendPartialNoGateway (const char *bytes, int bytesCount) const |
void | setFileDescriptor (int fileDescriptor) |
virtual | ~DynamicBuffer () |
Protected Member Functions | |
virtual int | bytesAvailable (char *bytes, int bytesCount)=0 |
void | debugBuffer () const |
void | debugEndIgnoreByte () |
void | debugIgnoreByte () |
Brief description of class still missing.
Full description of class still missing
GpCoreTools::DynamicBuffer::DynamicBuffer | ( | int | fileDescriptor | ) |
GpCoreTools::DynamicBuffer::~DynamicBuffer | ( | ) | [virtual] |
virtual int GpCoreTools::DynamicBuffer::bytesAvailable | ( | char * | bytes, |
int | bytesCount | ||
) | [protected, pure virtual] |
Implemented in CubeBuffer, LinkBuffer, UbxBuffer, GpsBuffer, CubeTcpBuffer, MasterBuffer, PPSBuffer, TimeMasterBuffer, TimeSlaveBuffer, NetBuffer, CrystalfontzBuffer, and SystemBuffer.
Referenced by read().
void GpCoreTools::DynamicBuffer::debugBuffer | ( | ) | const [protected] |
References GpCoreTools::Log::stream(), TRACE, and GpCoreTools::Log::write().
Referenced by UbxBuffer::bytesAvailable(), and CubeBuffer::bytesAvailable().
{ TRACE; Log::write(0, "out %i in %i (available %i) capacity %i\n", _bufferOut, _bufferIn, _bufferIn-_bufferOut, _bufferCapacity); int nLine=7; for(int i=0; i<_bufferIn; i++) { if(nLine==7) { nLine=0; fprintf(Log::stream(), "\n%05i ", i); } else { nLine++; } fprintf(Log::stream(), "%02hhX ", _buffer[i]); } fprintf(Log::stream(), "\n"); }
void GpCoreTools::DynamicBuffer::debugEndIgnoreByte | ( | ) | [protected] |
References GpCoreTools::Log::stream().
Referenced by CubeBuffer::bytesAvailable().
{ if(_debugIgnoreByteCount>0) { fprintf(Log::stream(), "\n"); _debugIgnoreByteColumnCount=8; _debugIgnoreByteCount=0; } }
void GpCoreTools::DynamicBuffer::debugIgnoreByte | ( | ) | [protected] |
References GpCoreTools::Log::stream(), TRACE, and GpCoreTools::Log::write().
Referenced by UbxBuffer::bytesAvailable(), and CubeBuffer::bytesAvailable().
{ TRACE; if(_debugIgnoreByteCount==0) { Log::write(0, "start ignoring bytes"); } if(_debugIgnoreByteColumnCount==8) { _debugIgnoreByteColumnCount=1; fprintf(Log::stream(), "\n%05i ", _debugIgnoreByteCount); } else { _debugIgnoreByteColumnCount++; } fprintf(Log::stream(), "%02hhX ", _buffer[_bufferOut]); _debugIgnoreByteCount++; }
bool GpCoreTools::DynamicBuffer::read | ( | ) |
Returns false if data cannot be read.
References bytesAvailable(), TRACE, and GpCoreTools::Log::write().
Referenced by SystemBuffer::bytesAvailable(), TimeMasterBuffer::bytesAvailable(), TimeSlaveBuffer::bytesAvailable(), UbxBuffer::bytesAvailable(), CubeBuffer::bytesAvailable(), GpCoreTools::UnixClientStream::event(), GpCoreTools::Serial::event(), and GpCoreTools::TcpClientStream::event().
{ TRACE; // Makes as much space as possible without moving anything if(_bufferOut==_bufferIn) { // Everything is processed, force return to 0 _bufferIn=0; _bufferOut=0; } // Reads as much as possible int maxNRead=0, nRead=0; while(nRead==maxNRead) { if(_bufferIn==_bufferCapacity) { _bufferCapacity=_bufferCapacity << 1; Log::write(10, "increase capacity to %i\n", _bufferCapacity); _buffer=(char *)realloc(_buffer, _bufferCapacity); } maxNRead=_bufferCapacity-_bufferIn; nRead=::read(_fileDescriptor, _buffer+_bufferIn, maxNRead); if(nRead>0) { _bufferIn+=nRead; } else { break; } } // Processes read bytes //Log::write(10, "buffer filled up to %i (%.1f %%)\n", _bufferIn, (float)_bufferIn*100.0/_bufferCapacity); int nProcessed=0; do { nProcessed=bytesAvailable(_buffer+_bufferOut, _bufferIn-_bufferOut); _bufferOut+=nProcessed; } while (nProcessed>0 && _bufferOut<_bufferIn); assert(_bufferOut<=_bufferIn); return true; }
int GpCoreTools::DynamicBuffer::send | ( | const char * | bytes, |
int | bytesCount | ||
) | const [inline] |
Referenced by GpsBuffer::broadcast(), SystemBuffer::bytesAvailable(), NetBuffer::sendNeighbors(), UbxDevice::sendRaw(), and UbxDevice::sendState().
{ return ::write(_fileDescriptor, bytes, bytesCount); }
int GpCoreTools::DynamicBuffer::sendNoGateway | ( | const char * | bytes, |
int | bytesCount | ||
) | const [inline] |
Referenced by LinkBuffer::bytesAvailable(), LinkBuffer::startMeasure(), and LinkBuffer::startTest().
{ return ::send(_fileDescriptor, bytes, bytesCount, MSG_DONTROUTE); }
int GpCoreTools::DynamicBuffer::sendPartial | ( | const char * | bytes, |
int | bytesCount | ||
) | const [inline] |
{ return ::send(_fileDescriptor, bytes, bytesCount, MSG_MORE); }
int GpCoreTools::DynamicBuffer::sendPartialNoGateway | ( | const char * | bytes, |
int | bytesCount | ||
) | const [inline] |
Referenced by LinkBuffer::bytesAvailable().
{ return ::send(_fileDescriptor, bytes, bytesCount, MSG_DONTROUTE | MSG_MORE); }
void GpCoreTools::DynamicBuffer::setFileDescriptor | ( | int | fileDescriptor | ) | [inline] |
{_fileDescriptor=fileDescriptor;}