TinyRobotics
Loading...
Searching...
No Matches
BaseStream.h
1#pragma once
2#include "Stream.h"
3#include "TinyRobotics/utils/Buffers.h"
4
5#define STREAM_READ_OVERRIDE
6#define STREAM_READCHAR_OVERRIDE
7#define DEFAULT_BUFFER_SIZE 256
8#define MAX_SINGLE_CHARS 16
9
10namespace tinyrobotics {
11
12/**
13 * @class BaseStream
14 * @ingroup utils
15 * @brief Base class for all Streams. It relies on write(const uint8_t *buffer,
16 * size_t size) and readBytes(uint8_t *buffer, size_t length).
17 * @author Phil Schatzmann
18
19 */
20class BaseStream : public Stream {
21 public:
22 BaseStream() = default;
23 virtual ~BaseStream() = default;
24 BaseStream(BaseStream &) = default;
25 BaseStream &operator=(BaseStream &) = default;
26
27 virtual bool begin(){return true;}
28 virtual void end(){}
29
30 virtual size_t readBytes(uint8_t *data,
31 size_t len) STREAM_READ_OVERRIDE = 0;
32 virtual size_t write(const uint8_t *data, size_t len) override = 0;
33
34 virtual size_t write(uint8_t ch) override {
35 tmp_out.resize(write_buffer_size);
36 if (tmp_out.isFull()) {
37 flush();
38 }
39 return tmp_out.write(ch);
40 }
41
42 virtual int available() { return DEFAULT_BUFFER_SIZE; };
43
44 virtual int availableForWrite() { return DEFAULT_BUFFER_SIZE; }
45
46 virtual void flush() override {
47 if (tmp_out.available() > 0) {
48 int len = tmp_out.available();
49 uint8_t bytes[len];
50 tmp_out.readArray((uint8_t *)bytes, len);
51 write((const uint8_t *)bytes, len);
52 }
53 }
54
55
56 virtual size_t readBytes(char *data, size_t len) STREAM_READCHAR_OVERRIDE {
57 return readBytes((uint8_t *)data, len);
58 }
59
60 virtual int read() override {
61 refillReadBuffer();
62 // if it is empty we need to return an int -1
63 if (tmp_in.isEmpty()) return -1;
64 uint8_t result = 0;
65 if (!tmp_in.read(result)) return -1;
66 return result;
67 }
68
69 virtual int peek() override {
70 refillReadBuffer();
71 // if it is empty we need to return an int -1
72 if (tmp_in.isEmpty()) return -1;
73 uint8_t result = 0;
74 if (!tmp_in.peek(result)) return -1;
75 return result;
76 }
77
78 void setWriteBufferSize(int size) { write_buffer_size = size;}
79
80 protected:
81 RingBuffer<uint8_t> tmp_in{0};
82 RingBuffer<uint8_t> tmp_out{0};
83 int write_buffer_size = MAX_SINGLE_CHARS;
84
85 void refillReadBuffer() {
86 tmp_in.resize(DEFAULT_BUFFER_SIZE);
87 if (tmp_in.isEmpty()) {
88 const int len = tmp_in.size();
89 uint8_t bytes[len];
90 int len_eff = readBytes(bytes, len);
91 // LOGD("tmp_in available: %d / size: %d / to be written %d",
92 // tmp_in.available(), tmp_in.size(), len_eff);
93 tmp_in.writeArray((const uint8_t*)bytes, len_eff);
94 }
95 }
96};
97
98
99} // namespace tinyrobotics
#define STREAM_READCHAR_OVERRIDE
Definition: BaseStream.h:6
#define MAX_SINGLE_CHARS
Definition: BaseStream.h:8
#define DEFAULT_BUFFER_SIZE
Definition: BaseStream.h:7
#define STREAM_READ_OVERRIDE
Definition: BaseStream.h:5
Base class for all Streams. It relies on write(const uint8_t *buffer, size_t size) and readBytes(uint...
Definition: BaseStream.h:20
Implements a typed Ringbuffer.
Definition: Buffers.h:304