Allwize Library
StreamInjector.h
1 /*
2 
3 StreamInjector
4 
5 Copyright (C) 2016-2018 by Xose PĂ©rez <xose dot perez at gmail dot com>
6 
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 
20 */
21 
22 #pragma once
23 
24 #include <stdlib.h>
25 #include <Stream.h>
26 
27 class StreamInjector : public Stream {
28 
29  public:
30 
31  typedef void (*writeCallback)(uint8_t);
32 
33  StreamInjector(size_t buflen = 128) : _buffer_size(buflen) {
34  _buffer = new char[buflen];
35  }
36 
37  ~StreamInjector() {
38  delete[] _buffer;
39  }
40 
41  // ---------------------------------------------------------------------
42 
43  virtual uint16_t inject(char ch) {
44  _buffer[_buffer_write] = ch;
45  _buffer_write = (_buffer_write + 1) % _buffer_size;
46  return 1;
47  }
48 
49  virtual uint16_t inject(char *data, size_t len) {
50  for (uint16_t i=0; i<len; i++) {
51  inject(data[i]);
52  }
53  return len;
54  }
55 
56  virtual void callback(writeCallback c) {
57  _callback = c;
58  }
59 
60  // ---------------------------------------------------------------------
61 
62  virtual size_t write(uint8_t ch) {
63  if (_callback) _callback(ch);
64  return 1;
65  }
66 
67  virtual int read() {
68  int ch = -1;
69  if (_buffer_read != _buffer_write) {
70  ch = _buffer[_buffer_read];
71  _buffer_read = (_buffer_read + 1) % _buffer_size;
72  }
73  return ch;
74  }
75 
76  virtual int available() {
77  int bytes = 0;
78  if (_buffer_read > _buffer_write) {
79  bytes += (_buffer_write - _buffer_read + _buffer_size);
80  } else if (_buffer_read < _buffer_write) {
81  bytes += (_buffer_write - _buffer_read);
82  }
83  return bytes;
84  }
85 
86  virtual int peek() {
87  int ch = -1;
88  if (_buffer_read != _buffer_write) {
89  ch = _buffer[_buffer_read];
90  }
91  return ch;
92  }
93 
94  virtual void flush() {
95  _buffer_read = _buffer_write;
96  }
97 
98  private:
99 
100  char * _buffer;
101  size_t _buffer_size;
102  uint16_t _buffer_write = 0;
103  uint16_t _buffer_read = 0;
104  writeCallback _callback = NULL;
105 
106 };