1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-12-23 12:51:24 +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;
}
int RingStream::read() {
int RingStream::read(byte advance) {
if (_flashInsert) {
// we are reading out of a flash string
byte fb=GETFLASH(_flashInsert);
_flashInsert++;
_flashInsert+=advance;
if (fb) return fb; // we have a byte from the flash
// flash insert complete, clear and drop through to next buffer byte
_flashInsert=NULL;
}
if ((_pos_read==_pos_write) && !_overflow) return -1; // empty
byte b=readRawByte();
byte b=readRawByte(advance);
if (b!=FLASH_INSERT_MARKER) return b;
// Detected a flash insert
// read address bytes LSB first (size depends on CPU)
if (advance == 0) readRawByte(); // read past it anyway
uintptr_t iFlash=0;
for (byte f=0; f<sizeof(iFlash); f++) {
uintptr_t bf=readRawByte();
@ -119,12 +120,12 @@ int RingStream::read() {
}
_flashInsert=reinterpret_cast<char * >( iFlash);
// 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];
_pos_read++;
_pos_read+=advance;
if (_pos_read==_len) _pos_read=0;
_overflow=false;
return b;

View File

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