User | Revision | Line number | New contents of line |
group-ESP8266 |
0:6946b0b9e323
|
1
|
|
group-ESP8266 |
0:6946b0b9e323
|
2
|
/**
|
group-ESP8266 |
0:6946b0b9e323
|
3
|
* @file BufferedSerial.h
|
group-ESP8266 |
0:6946b0b9e323
|
4
|
* @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX
|
group-ESP8266 |
0:6946b0b9e323
|
5
|
* @author sam grove
|
group-ESP8266 |
0:6946b0b9e323
|
6
|
* @version 1.0
|
group-ESP8266 |
0:6946b0b9e323
|
7
|
* @see
|
group-ESP8266 |
0:6946b0b9e323
|
8
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
9
|
* Copyright (c) 2013
|
group-ESP8266 |
0:6946b0b9e323
|
10
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
11
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
group-ESP8266 |
0:6946b0b9e323
|
12
|
* you may not use this file except in compliance with the License.
|
group-ESP8266 |
0:6946b0b9e323
|
13
|
* You may obtain a copy of the License at
|
group-ESP8266 |
0:6946b0b9e323
|
14
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
15
|
* http://www.apache.org/licenses/LICENSE-2.0
|
group-ESP8266 |
0:6946b0b9e323
|
16
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
17
|
* Unless required by applicable law or agreed to in writing, software
|
group-ESP8266 |
0:6946b0b9e323
|
18
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
group-ESP8266 |
0:6946b0b9e323
|
19
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
group-ESP8266 |
0:6946b0b9e323
|
20
|
* See the License for the specific language governing permissions and
|
group-ESP8266 |
0:6946b0b9e323
|
21
|
* limitations under the License.
|
group-ESP8266 |
0:6946b0b9e323
|
22
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
23
|
|
group-ESP8266 |
0:6946b0b9e323
|
24
|
#ifndef BUFFEREDSERIAL_H
|
group-ESP8266 |
0:6946b0b9e323
|
25
|
#define BUFFEREDSERIAL_H
|
group-ESP8266 |
0:6946b0b9e323
|
26
|
|
group-ESP8266 |
0:6946b0b9e323
|
27
|
#include "mbed.h"
|
group-ESP8266 |
0:6946b0b9e323
|
28
|
#include "MyBuffer.h"
|
group-ESP8266 |
0:6946b0b9e323
|
29
|
|
group-ESP8266 |
0:6946b0b9e323
|
30
|
/** A serial port (UART) for communication with other serial devices
|
group-ESP8266 |
0:6946b0b9e323
|
31
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
32
|
* Can be used for Full Duplex communication, or Simplex by specifying
|
group-ESP8266 |
0:6946b0b9e323
|
33
|
* one pin as NC (Not Connected)
|
group-ESP8266 |
0:6946b0b9e323
|
34
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
35
|
* Example:
|
group-ESP8266 |
0:6946b0b9e323
|
36
|
* @code
|
group-ESP8266 |
0:6946b0b9e323
|
37
|
* #include "mbed.h"
|
group-ESP8266 |
0:6946b0b9e323
|
38
|
* #include "BufferedSerial.h"
|
group-ESP8266 |
0:6946b0b9e323
|
39
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
40
|
* BufferedSerial pc(USBTX, USBRX);
|
group-ESP8266 |
0:6946b0b9e323
|
41
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
42
|
* int main()
|
group-ESP8266 |
0:6946b0b9e323
|
43
|
* {
|
group-ESP8266 |
0:6946b0b9e323
|
44
|
* while(1)
|
group-ESP8266 |
0:6946b0b9e323
|
45
|
* {
|
group-ESP8266 |
0:6946b0b9e323
|
46
|
* Timer s;
|
group-ESP8266 |
0:6946b0b9e323
|
47
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
48
|
* s.start();
|
group-ESP8266 |
0:6946b0b9e323
|
49
|
* pc.printf("Hello World - buffered\n");
|
group-ESP8266 |
0:6946b0b9e323
|
50
|
* int buffered_time = s.read_us();
|
group-ESP8266 |
0:6946b0b9e323
|
51
|
* wait(0.1f); // give time for the buffer to empty
|
group-ESP8266 |
0:6946b0b9e323
|
52
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
53
|
* s.reset();
|
group-ESP8266 |
0:6946b0b9e323
|
54
|
* printf("Hello World - blocking\n");
|
group-ESP8266 |
0:6946b0b9e323
|
55
|
* int polled_time = s.read_us();
|
group-ESP8266 |
0:6946b0b9e323
|
56
|
* s.stop();
|
group-ESP8266 |
0:6946b0b9e323
|
57
|
* wait(0.1f); // give time for the buffer to empty
|
group-ESP8266 |
0:6946b0b9e323
|
58
|
*
|
group-ESP8266 |
0:6946b0b9e323
|
59
|
* pc.printf("printf buffered took %d us\n", buffered_time);
|
group-ESP8266 |
0:6946b0b9e323
|
60
|
* pc.printf("printf blocking took %d us\n", polled_time);
|
group-ESP8266 |
0:6946b0b9e323
|
61
|
* wait(0.5f);
|
group-ESP8266 |
0:6946b0b9e323
|
62
|
* }
|
group-ESP8266 |
0:6946b0b9e323
|
63
|
* }
|
group-ESP8266 |
0:6946b0b9e323
|
64
|
* @endcode
|
group-ESP8266 |
0:6946b0b9e323
|
65
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
66
|
|
group-ESP8266 |
0:6946b0b9e323
|
67
|
/**
|
group-ESP8266 |
0:6946b0b9e323
|
68
|
* @class BufferedSerial
|
group-ESP8266 |
0:6946b0b9e323
|
69
|
* @brief Software buffers and interrupt driven tx and rx for Serial
|
group-ESP8266 |
0:6946b0b9e323
|
70
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
71
|
class BufferedSerial : public RawSerial
|
group-ESP8266 |
0:6946b0b9e323
|
72
|
{
|
group-ESP8266 |
0:6946b0b9e323
|
73
|
private:
|
group-ESP8266 |
0:6946b0b9e323
|
74
|
MyBuffer <char> _rxbuf;
|
group-ESP8266 |
0:6946b0b9e323
|
75
|
MyBuffer <char> _txbuf;
|
group-ESP8266 |
0:6946b0b9e323
|
76
|
uint32_t _buf_size;
|
group-ESP8266 |
0:6946b0b9e323
|
77
|
uint32_t _tx_multiple;
|
group-ESP8266 |
0:6946b0b9e323
|
78
|
|
group-ESP8266 |
0:6946b0b9e323
|
79
|
void rxIrq(void);
|
group-ESP8266 |
0:6946b0b9e323
|
80
|
void txIrq(void);
|
group-ESP8266 |
0:6946b0b9e323
|
81
|
void prime(void);
|
group-ESP8266 |
0:6946b0b9e323
|
82
|
|
group-ESP8266 |
0:6946b0b9e323
|
83
|
Callback<void()> _cbs[2];
|
group-ESP8266 |
0:6946b0b9e323
|
84
|
|
group-ESP8266 |
0:6946b0b9e323
|
85
|
public:
|
group-ESP8266 |
0:6946b0b9e323
|
86
|
/** Create a BufferedSerial port, connected to the specified transmit and receive pins
|
group-ESP8266 |
0:6946b0b9e323
|
87
|
* @param tx Transmit pin
|
group-ESP8266 |
0:6946b0b9e323
|
88
|
* @param rx Receive pin
|
group-ESP8266 |
0:6946b0b9e323
|
89
|
* @param buf_size printf() buffer size
|
group-ESP8266 |
0:6946b0b9e323
|
90
|
* @param tx_multiple amount of max printf() present in the internal ring buffer at one time
|
group-ESP8266 |
0:6946b0b9e323
|
91
|
* @param name optional name
|
group-ESP8266 |
0:6946b0b9e323
|
92
|
* @note Either tx or rx may be specified as NC if unused
|
group-ESP8266 |
0:6946b0b9e323
|
93
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
94
|
BufferedSerial(PinName tx, PinName rx, uint32_t buf_size = 256, uint32_t tx_multiple = 4,const char* name=NULL);
|
group-ESP8266 |
0:6946b0b9e323
|
95
|
|
group-ESP8266 |
0:6946b0b9e323
|
96
|
/** Destroy a BufferedSerial port
|
group-ESP8266 |
0:6946b0b9e323
|
97
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
98
|
virtual ~BufferedSerial(void);
|
group-ESP8266 |
0:6946b0b9e323
|
99
|
|
group-ESP8266 |
0:6946b0b9e323
|
100
|
/** Check on how many bytes are in the rx buffer
|
group-ESP8266 |
0:6946b0b9e323
|
101
|
* @return 1 if something exists, 0 otherwise
|
group-ESP8266 |
0:6946b0b9e323
|
102
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
103
|
virtual int readable(void);
|
group-ESP8266 |
0:6946b0b9e323
|
104
|
|
group-ESP8266 |
0:6946b0b9e323
|
105
|
/** Check to see if the tx buffer has room
|
group-ESP8266 |
0:6946b0b9e323
|
106
|
* @return 1 always has room and can overwrite previous content if too small / slow
|
group-ESP8266 |
0:6946b0b9e323
|
107
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
108
|
virtual int writeable(void);
|
group-ESP8266 |
0:6946b0b9e323
|
109
|
|
group-ESP8266 |
0:6946b0b9e323
|
110
|
/** Get a single byte from the BufferedSerial Port.
|
group-ESP8266 |
0:6946b0b9e323
|
111
|
* Should check readable() before calling this.
|
group-ESP8266 |
0:6946b0b9e323
|
112
|
* @return A byte that came in on the Serial Port
|
group-ESP8266 |
0:6946b0b9e323
|
113
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
114
|
virtual int getc(void);
|
group-ESP8266 |
0:6946b0b9e323
|
115
|
|
group-ESP8266 |
0:6946b0b9e323
|
116
|
/** Write a single byte to the BufferedSerial Port.
|
group-ESP8266 |
0:6946b0b9e323
|
117
|
* @param c The byte to write to the Serial Port
|
group-ESP8266 |
0:6946b0b9e323
|
118
|
* @return The byte that was written to the Serial Port Buffer
|
group-ESP8266 |
0:6946b0b9e323
|
119
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
120
|
virtual int putc(int c);
|
group-ESP8266 |
0:6946b0b9e323
|
121
|
|
group-ESP8266 |
0:6946b0b9e323
|
122
|
/** Write a string to the BufferedSerial Port. Must be NULL terminated
|
group-ESP8266 |
0:6946b0b9e323
|
123
|
* @param s The string to write to the Serial Port
|
group-ESP8266 |
0:6946b0b9e323
|
124
|
* @return The number of bytes written to the Serial Port Buffer
|
group-ESP8266 |
0:6946b0b9e323
|
125
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
126
|
virtual int puts(const char *s);
|
group-ESP8266 |
0:6946b0b9e323
|
127
|
|
group-ESP8266 |
0:6946b0b9e323
|
128
|
/** Write a formatted string to the BufferedSerial Port.
|
group-ESP8266 |
0:6946b0b9e323
|
129
|
* @param format The string + format specifiers to write to the Serial Port
|
group-ESP8266 |
0:6946b0b9e323
|
130
|
* @return The number of bytes written to the Serial Port Buffer
|
group-ESP8266 |
0:6946b0b9e323
|
131
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
132
|
virtual int printf(const char* format, ...);
|
group-ESP8266 |
0:6946b0b9e323
|
133
|
|
group-ESP8266 |
0:6946b0b9e323
|
134
|
/** Write data to the Buffered Serial Port
|
group-ESP8266 |
0:6946b0b9e323
|
135
|
* @param s A pointer to data to send
|
group-ESP8266 |
0:6946b0b9e323
|
136
|
* @param length The amount of data being pointed to
|
group-ESP8266 |
0:6946b0b9e323
|
137
|
* @return The number of bytes written to the Serial Port Buffer
|
group-ESP8266 |
0:6946b0b9e323
|
138
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
139
|
virtual ssize_t write(const void *s, std::size_t length);
|
group-ESP8266 |
0:6946b0b9e323
|
140
|
|
group-ESP8266 |
0:6946b0b9e323
|
141
|
/** Attach a function to call whenever a serial interrupt is generated
|
group-ESP8266 |
0:6946b0b9e323
|
142
|
* @param func A pointer to a void function, or 0 to set as none
|
group-ESP8266 |
0:6946b0b9e323
|
143
|
* @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
|
group-ESP8266 |
0:6946b0b9e323
|
144
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
145
|
virtual void attach(Callback<void()> func, IrqType type=RxIrq);
|
group-ESP8266 |
0:6946b0b9e323
|
146
|
|
group-ESP8266 |
0:6946b0b9e323
|
147
|
/** Attach a member function to call whenever a serial interrupt is generated
|
group-ESP8266 |
0:6946b0b9e323
|
148
|
* @param obj pointer to the object to call the member function on
|
group-ESP8266 |
0:6946b0b9e323
|
149
|
* @param method pointer to the member function to call
|
group-ESP8266 |
0:6946b0b9e323
|
150
|
* @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
|
group-ESP8266 |
0:6946b0b9e323
|
151
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
152
|
template <typename T>
|
group-ESP8266 |
0:6946b0b9e323
|
153
|
void attach(T *obj, void (T::*method)(), IrqType type=RxIrq) {
|
group-ESP8266 |
0:6946b0b9e323
|
154
|
attach(Callback<void()>(obj, method), type);
|
group-ESP8266 |
0:6946b0b9e323
|
155
|
}
|
group-ESP8266 |
0:6946b0b9e323
|
156
|
|
group-ESP8266 |
0:6946b0b9e323
|
157
|
/** Attach a member function to call whenever a serial interrupt is generated
|
group-ESP8266 |
0:6946b0b9e323
|
158
|
* @param obj pointer to the object to call the member function on
|
group-ESP8266 |
0:6946b0b9e323
|
159
|
* @param method pointer to the member function to call
|
group-ESP8266 |
0:6946b0b9e323
|
160
|
* @param type Which serial interrupt to attach the member function to (Serial::RxIrq for receive, TxIrq for transmit buffer empty)
|
group-ESP8266 |
0:6946b0b9e323
|
161
|
*/
|
group-ESP8266 |
0:6946b0b9e323
|
162
|
template <typename T>
|
group-ESP8266 |
0:6946b0b9e323
|
163
|
void attach(T *obj, void (*method)(T*), IrqType type=RxIrq) {
|
group-ESP8266 |
0:6946b0b9e323
|
164
|
attach(Callback<void()>(obj, method), type);
|
group-ESP8266 |
0:6946b0b9e323
|
165
|
}
|
group-ESP8266 |
0:6946b0b9e323
|
166
|
};
|
group-ESP8266 |
0:6946b0b9e323
|
167
|
|
group-ESP8266 |
0:6946b0b9e323
|
168
|
#endif
|