1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-12-24 13:21:23 +01:00

add RinStream::peek()

This commit is contained in:
Harald Barth 2022-07-31 00:50:59 +02:00
parent d29219f858
commit 26fc11d1a6
2 changed files with 11 additions and 8 deletions

View File

@ -95,21 +95,22 @@ _count=prevCount+plength;
return plength; return plength;
} }
int RingStream::read() { int RingStream::read(byte advance) {
if (_flashInsert) { if (_flashInsert) {
// we are reading out of a flash string // we are reading out of a flash string
byte fb=GETFLASH(_flashInsert); byte fb=GETFLASH(_flashInsert);
_flashInsert++; _flashInsert+=advance;
if (fb) return fb; // we have a byte from the flash if (fb) return fb; // we have a byte from the flash
// flash insert complete, clear and drop through to next buffer byte // flash insert complete, clear and drop through to next buffer byte
_flashInsert=NULL; _flashInsert=NULL;
} }
if ((_pos_read==_pos_write) && !_overflow) return -1; // empty if ((_pos_read==_pos_write) && !_overflow) return -1; // empty
byte b=readRawByte(); byte b=readRawByte(advance);
if (b!=FLASH_INSERT_MARKER) return b; if (b!=FLASH_INSERT_MARKER) return b;
// Detected a flash insert // Detected a flash insert
// read address bytes LSB first (size depends on CPU) // read address bytes LSB first (size depends on CPU)
if (advance == 0) readRawByte(); // read past it anyway
uintptr_t iFlash=0; uintptr_t iFlash=0;
for (byte f=0; f<sizeof(iFlash); f++) { for (byte f=0; f<sizeof(iFlash); f++) {
uintptr_t bf=readRawByte(); uintptr_t bf=readRawByte();
@ -119,12 +120,12 @@ int RingStream::read() {
} }
_flashInsert=reinterpret_cast<char * >( iFlash); _flashInsert=reinterpret_cast<char * >( iFlash);
// and try again... so will read the first byte of the insert. // and try again... so will read the first byte of the insert.
return read(); return read(advance);
} }
byte RingStream::readRawByte() { byte RingStream::readRawByte(byte advance) {
byte b=_buffer[_pos_read]; byte b=_buffer[_pos_read];
_pos_read++; _pos_read+=advance;
if (_pos_read==_len) _pos_read=0; if (_pos_read==_len) _pos_read=0;
_overflow=false; _overflow=false;
return b; return b;

View File

@ -39,15 +39,17 @@ class RingStream : public Print {
virtual int availableForWrite() override; virtual int availableForWrite() override;
using Print::write; using Print::write;
size_t printFlash(const FSH * flashBuffer); size_t printFlash(const FSH * flashBuffer);
int read(); inline int read() { return read(1); };
inline int peek() { return read(0); };
int count(); int count();
int freeSpace(); int freeSpace();
void mark(uint8_t b); void mark(uint8_t b);
bool commit(); bool commit();
uint8_t peekTargetMark(); uint8_t peekTargetMark();
void flush(); void flush();
byte readRawByte();
private: private:
int read(byte advance);
byte readRawByte(byte advance=1);
int _len; int _len;
int _pos_write; int _pos_write;
int _pos_read; int _pos_read;