mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-13 05:53:06 +01:00
intermediate: actisense format on USB
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
void GwBuffer::lp(const char *fkt, int p)
|
||||
{
|
||||
LOG_DEBUG(GwLog::DEBUG + 1, "Buffer[%s]: buf=%p,wp=%d,rp=%d,used=%d,free=%d, p=%d",
|
||||
LOG_DEBUG(GwLog::DEBUG+2 , "Buffer[%s]: buf=%p,wp=%d,rp=%d,used=%d,free=%d, p=%d",
|
||||
fkt, buffer, offset(writePointer), offset(readPointer), usedSpace(), freeSpace(), p);
|
||||
}
|
||||
|
||||
@@ -37,6 +37,19 @@ size_t GwBuffer::usedSpace()
|
||||
return writePointer - readPointer;
|
||||
return writePointer+bufferSize-readPointer;
|
||||
}
|
||||
int GwBuffer::read(){
|
||||
if (! usedSpace()) return -1;
|
||||
int rt=*readPointer;
|
||||
readPointer++;
|
||||
if (offset(readPointer) >= bufferSize)
|
||||
readPointer -= bufferSize;
|
||||
lp("read");
|
||||
return rt;
|
||||
}
|
||||
int GwBuffer::peek(){
|
||||
if (! usedSpace()) return -1;
|
||||
return *readPointer;
|
||||
}
|
||||
size_t GwBuffer::addData(const uint8_t *data, size_t len, bool addPartial)
|
||||
{
|
||||
lp("addDataE", len);
|
||||
|
||||
@@ -20,7 +20,7 @@ class GwBufferWriter{
|
||||
class GwBuffer{
|
||||
public:
|
||||
static const size_t TX_BUFFER_SIZE=1620; // app. 20 NMEA messages
|
||||
static const size_t RX_BUFFER_SIZE=200; // enough for 1 NMEA message...
|
||||
static const size_t RX_BUFFER_SIZE=400; // enough for 1 NMEA message or actisense message
|
||||
typedef enum {
|
||||
OK,
|
||||
ERROR,
|
||||
@@ -47,6 +47,8 @@ class GwBuffer{
|
||||
size_t freeSpace();
|
||||
size_t usedSpace();
|
||||
size_t addData(const uint8_t *data,size_t len,bool addPartial=false);
|
||||
int read();
|
||||
int peek();
|
||||
/**
|
||||
* write some data to the buffer writer
|
||||
* return an error if the buffer writer returned < 0
|
||||
|
||||
@@ -1,4 +1,44 @@
|
||||
#include "GwSerial.h"
|
||||
|
||||
class GwSerialStream: public Stream{
|
||||
private:
|
||||
GwSerial *serial;
|
||||
bool partialWrites;
|
||||
public:
|
||||
GwSerialStream(GwSerial *serial,bool partialWrites=false){
|
||||
this->serial=serial;
|
||||
this->partialWrites=partialWrites;
|
||||
}
|
||||
virtual int available(){
|
||||
if (! serial->isInitialized()) return 0;
|
||||
if (! serial->readBuffer) return 0;
|
||||
return serial->readBuffer->usedSpace();
|
||||
}
|
||||
virtual int read(){
|
||||
if (! serial->isInitialized()) return -1;
|
||||
if (! serial->readBuffer) return -1;
|
||||
return serial->readBuffer->read();
|
||||
}
|
||||
virtual int peek(){
|
||||
if (! serial->isInitialized()) return -1;
|
||||
if (! serial->readBuffer) return -1;
|
||||
return serial->readBuffer->peek();
|
||||
}
|
||||
virtual void flush() {};
|
||||
virtual size_t write(uint8_t v){
|
||||
if (! serial->isInitialized()) return 0;
|
||||
size_t rt=serial->buffer->addData(&v,1,partialWrites);
|
||||
return rt;
|
||||
}
|
||||
virtual size_t write(const uint8_t *buffer, size_t size){
|
||||
if (! serial->isInitialized()) return 0;
|
||||
size_t rt=serial->buffer->addData(buffer,size,partialWrites);
|
||||
return rt;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class SerialWriter : public GwBufferWriter{
|
||||
private:
|
||||
HardwareSerial *serial;
|
||||
@@ -90,4 +130,7 @@ void GwSerial::flush(){
|
||||
while (buffer->fetchData(writer,-1,false) == GwBuffer::AGAIN){
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Stream * GwSerial::getStream(bool partialWrite){
|
||||
return new GwSerialStream(this,partialWrite);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "GwLog.h"
|
||||
#include "GwBuffer.h"
|
||||
class SerialWriter;
|
||||
class GwSerialStream;
|
||||
class GwSerial{
|
||||
private:
|
||||
GwBuffer *buffer;
|
||||
@@ -28,5 +29,7 @@ class GwSerial{
|
||||
void loop(bool handleRead=true);
|
||||
bool readMessages(GwBufferWriter *writer);
|
||||
void flush();
|
||||
Stream *getStream(bool partialWrites);
|
||||
friend GwSerialStream;
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user