3
* Implementation of input/output streams for the Arduino serial classes
5
* Created on: 2 Jan 2011
8
* http://andybrown.me.uk/ws/terms-and-conditions
11
#ifndef __810370EC_AD69_4ef7_91F5_B1AA16F14712
12
#define __810370EC_AD69_4ef7_91F5_B1AA16F14712
14
#include <basic_definitions>
16
//#include <stl_config.h>
22
#include <HardwareSerial.h>
28
* basic_serialbuf implements an unbuffered basic_streambuf as a backing buffer
32
template <class charT, class traits, class Tserial>
33
class basic_serialbuf : public basic_streambuf<charT,traits>
41
typedef charT char_type;
42
typedef typename traits::int_type int_type;
45
* constructor - wraps an existing Tserial class instance
48
explicit basic_serialbuf(Tserial& serial_,ios_base::openmode which_ = ios_base::in | ios_base::out)
51
basic_streambuf<charT,traits>::openedFor = which_;
55
* Required to maintain the chain
58
virtual ~basic_serialbuf() { }
61
* Get a reference to the wrapped object
64
Tserial& serial() { return _serial; }
69
* Get how many bytes available
72
virtual int showmanyc(){
73
return _serial.available();
80
virtual streamsize xsgetn(char_type* c, streamsize n) {
85
while((data=_serial.read())!=-1 && i < n ) {
96
virtual streamsize xsputn(const char_type* s, streamsize n){
98
//_serial.print("[PUT ");
100
//_serial.print("] ");
101
for(streamsize i=0;i<n;i++)
113
* write a single char
116
virtual int_type overflow (int_type c = traits::eof()) {
117
if(!traits::eq_int_type(c,traits::eof()))
119
//_serial.print("[OF]");
120
if ( (char_type)c == '\n' )
122
_serial.print((char_type)c);
124
return traits::not_eof(c);
129
* peek at a char where possible
132
virtual int_type underflow(){
133
if(_serial.available())
134
return _serial.peek();
136
return traits::eof();
140
* Read a char where possible
143
virtual int_type uflow(){
144
if(_serial.available())
145
return _serial.read();
147
return traits::eof();
151
* Our wrapped arduino class
162
template <class charT, class traits, class Tserial> class basic_iserialstream
163
: public basic_istream<charT,traits>
171
typedef charT char_type;
174
* Constructor - default the serial object to #1
175
* Mega users can explicity initialise with one of
179
explicit basic_iserialstream(Tserial& serial_)
180
: basic_ios<charT, traits>(&sb), basic_istream<charT,traits>(&sb), sb(serial_,ios_base::in)
185
* Required to maintain the chain
188
virtual ~basic_iserialstream() { }
191
* Initialise the baud rate
194
void begin(long speed_) {
195
sb.serial().begin(speed_);
196
sb.serial().println(__FUNCTION__);
204
basic_serialbuf<charT,traits,Tserial> sb;
212
template <class charT, class traits, class Tserial> class basic_oserialstream
213
: public basic_ostream<charT,traits>
221
typedef charT char_type;
224
* Constructor - default the serial object to #1
225
* Mega users can explicity initialise with one of
229
explicit basic_oserialstream(Tserial& serial_)
230
: basic_ios<charT, traits>(&sb), basic_ostream<charT,traits>(&sb), sb(serial_,ios_base::out)
235
* Required to maintain the chain
238
virtual ~basic_oserialstream() { }
241
* Initialise the baud rate
244
void begin(long speed_) {
245
sb.serial().begin(speed_);
253
basic_serialbuf<charT,traits,Tserial> sb;
258
* Input/output stream
261
template <class charT, class traits, class Tserial> class basic_ioserialstream
262
: public basic_iostream<charT,traits>
270
typedef charT char_type;
273
* Constructor - default the serial object to #1
274
* Mega users can explicity initialise with one of
278
explicit basic_ioserialstream(Tserial& serial_)
279
: basic_ios<charT, traits>(&sb), basic_iostream<charT,traits>(&sb), sb(serial_,ios_base::in | ios_base::out)
284
* Required to maintain the chain
287
virtual ~basic_ioserialstream(){ }
290
* Initialise the baud rate
293
void begin(long speed_) {
294
sb.serial().begin(speed_);
302
basic_serialbuf<charT, traits, Tserial> sb;