| User | Revision | Line number | New contents of line |
| JonFreeman |
0:2c2b17c7b7a8
|
1
|
#ifndef MBED_CIRC_BUFFER_H
|
| JonFreeman |
0:2c2b17c7b7a8
|
2
|
#define MBED_CIRC_BUFFER_H
|
| JonFreeman |
0:2c2b17c7b7a8
|
3
|
|
| JonFreeman |
0:2c2b17c7b7a8
|
4
|
#include "mbed.h"
|
| JonFreeman |
0:2c2b17c7b7a8
|
5
|
|
| JonFreeman |
0:2c2b17c7b7a8
|
6
|
#define OVERWRITE_ENABLE 1
|
| JonFreeman |
0:2c2b17c7b7a8
|
7
|
#define SEEK_ENABLE 2
|
| JonFreeman |
0:2c2b17c7b7a8
|
8
|
|
| JonFreeman |
2:7f104b72b5eb
|
9
|
/** Classes circular_buffer_f and circular_buffer_c
|
| JonFreeman |
2:7f104b72b5eb
|
10
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
11
|
* Example use:-
|
| JonFreeman |
3:7ef4c240d5e3
|
12
|
* @code
|
| JonFreeman |
3:7ef4c240d5e3
|
13
|
* #include "mbed.h"
|
| JonFreeman |
3:7ef4c240d5e3
|
14
|
* #include "circular_buffer.h"
|
| JonFreeman |
3:7ef4c240d5e3
|
15
|
* Serial pc(USBTX, USBRX); // Comms to Tera Term on pc
|
| JonFreeman |
3:7ef4c240d5e3
|
16
|
* Serial gizmo(p28, p27); // Serial port for gizmo on pins 27, 28
|
| JonFreeman |
3:7ef4c240d5e3
|
17
|
* circular_buffer_c chatter; // create instance of circular_buffer_c for chars
|
| JonFreeman |
2:7f104b72b5eb
|
18
|
*
|
| JonFreeman |
3:7ef4c240d5e3
|
19
|
* void Rx_divert (void) { // Gets attached to Serial::RxIrq interrupt handler
|
| JonFreeman |
3:7ef4c240d5e3
|
20
|
* while (gizmo.readable()) // diverting rec'd chars into purpose provided,
|
| JonFreeman |
3:7ef4c240d5e3
|
21
|
* chatter.write(gizmo.getc()); // sufficiently sized, circular buffer
|
| JonFreeman |
3:7ef4c240d5e3
|
22
|
* }
|
| JonFreeman |
2:7f104b72b5eb
|
23
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
24
|
* main () {
|
| JonFreeman |
3:7ef4c240d5e3
|
25
|
* char buff[BUF_SIZE]; // allocate memory for circular buffer_c
|
| JonFreeman |
3:7ef4c240d5e3
|
26
|
* char x;
|
| JonFreeman |
2:7f104b72b5eb
|
27
|
* // Use init function to initialise (no constructor functions here)
|
| JonFreeman |
3:7ef4c240d5e3
|
28
|
* chatter.init(BUF_SIZE, buff, SEEK_ENABLE | OVERWRITE_ENABLE);
|
| JonFreeman |
3:7ef4c240d5e3
|
29
|
*
|
| JonFreeman |
3:7ef4c240d5e3
|
30
|
* gizmo.attach (Rx_divert, Serial::RxIrq); // gizmo rx now diverted to circ buff
|
| JonFreeman |
3:7ef4c240d5e3
|
31
|
* // serial_in buffer now ready to use
|
| JonFreeman |
3:7ef4c240d5e3
|
32
|
* while (1) {
|
| JonFreeman |
3:7ef4c240d5e3
|
33
|
* if (chatter.readable()) {
|
| JonFreeman |
3:7ef4c240d5e3
|
34
|
* chatter.read(&x);
|
| JonFreeman |
3:7ef4c240d5e3
|
35
|
* pc.putc(x);
|
| JonFreeman |
3:7ef4c240d5e3
|
36
|
* }
|
| JonFreeman |
2:7f104b72b5eb
|
37
|
* }
|
| JonFreeman |
3:7ef4c240d5e3
|
38
|
* }
|
| JonFreeman |
3:7ef4c240d5e3
|
39
|
* @endcode
|
| JonFreeman |
1:b5ab54497d2a
|
40
|
*/
|
| JonFreeman |
1:b5ab54497d2a
|
41
|
class circular_buffer_f { // Circular buffer of floats
|
| JonFreeman |
1:b5ab54497d2a
|
42
|
float *buffbase, *Onbuff, *Offbuff, *buffend;
|
| JonFreeman |
1:b5ab54497d2a
|
43
|
int buffsize;
|
| JonFreeman |
0:2c2b17c7b7a8
|
44
|
bool emptyf, fullf, // Buffer full and empty flags
|
| JonFreeman |
0:2c2b17c7b7a8
|
45
|
overwrite_enable, // To allow new data to overwrite old, unread data
|
| JonFreeman |
0:2c2b17c7b7a8
|
46
|
seek_enable; // To allow read pointer repositioning 'n' behind current newest
|
| JonFreeman |
0:2c2b17c7b7a8
|
47
|
public:
|
| JonFreeman |
2:7f104b72b5eb
|
48
|
|
| JonFreeman |
3:7ef4c240d5e3
|
49
|
/** Returns true if stuff is in buffer to be read
|
| JonFreeman |
3:7ef4c240d5e3
|
50
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
51
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
52
|
bool readable () {return !emptyf;}
|
| JonFreeman |
3:7ef4c240d5e3
|
53
|
|
| JonFreeman |
3:7ef4c240d5e3
|
54
|
/** Returns true if space exists in buffer to write more
|
| JonFreeman |
3:7ef4c240d5e3
|
55
|
*
|
| JonFreeman |
3:7ef4c240d5e3
|
56
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
57
|
bool writeable () {return !fullf;}
|
| JonFreeman |
0:2c2b17c7b7a8
|
58
|
|
| JonFreeman |
3:7ef4c240d5e3
|
59
|
/** Use init to setup buffer size, buffer mem address, and OVERWRITE_ENABLE and SEEK_ENABLE flags
|
| JonFreeman |
3:7ef4c240d5e3
|
60
|
* If OVERWRITE_ENABLE is set, allows new data to overwrite old, unread data.
|
| JonFreeman |
3:7ef4c240d5e3
|
61
|
* If OVERWRITE_ENABLE is clear, writes to a full buffer return false and new data is lost
|
| JonFreeman |
2:7f104b72b5eb
|
62
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
63
|
void init (int size, float *buffstart, int flags); // Size and address of buffer to work with
|
| JonFreeman |
2:7f104b72b5eb
|
64
|
|
| JonFreeman |
3:7ef4c240d5e3
|
65
|
/** If SEEK_ENABLE flag set, sets read pointer to some distance_back in prep for multiple read using get_samps
|
| JonFreeman |
2:7f104b72b5eb
|
66
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
67
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
68
|
bool seek (int distance_back) ; // Assumes at least that much has been written to buff beforehand
|
| JonFreeman |
2:7f104b72b5eb
|
69
|
|
| JonFreeman |
3:7ef4c240d5e3
|
70
|
/** Write places one sample into buffer. Returns false if buffer already full, true otherwise
|
| JonFreeman |
2:7f104b72b5eb
|
71
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
72
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
73
|
bool write (float a) ; // Put value into circular buffer
|
| JonFreeman |
2:7f104b72b5eb
|
74
|
|
| JonFreeman |
3:7ef4c240d5e3
|
75
|
/** Read one sample out from buffer. Returns false if nothing to be read, true otherwise
|
| JonFreeman |
2:7f104b72b5eb
|
76
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
77
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
78
|
bool read (float *rd) ;
|
| JonFreeman |
2:7f104b72b5eb
|
79
|
|
| JonFreeman |
2:7f104b72b5eb
|
80
|
|
| JonFreeman |
2:7f104b72b5eb
|
81
|
/** get_samps reads len samples from buffer into destination array
|
| JonFreeman |
2:7f104b72b5eb
|
82
|
*
|
| JonFreeman |
2:7f104b72b5eb
|
83
|
*/
|
| JonFreeman |
0:2c2b17c7b7a8
|
84
|
bool get_samps (float *dest, int len) ;
|
| JonFreeman |
1:b5ab54497d2a
|
85
|
} ; // end of class circular_buffer_f
|
| JonFreeman |
1:b5ab54497d2a
|
86
|
|
| JonFreeman |
0:2c2b17c7b7a8
|
87
|
|
| JonFreeman |
1:b5ab54497d2a
|
88
|
|
| JonFreeman |
1:b5ab54497d2a
|
89
|
class circular_buffer_c { // Circular buffer of char
|
| JonFreeman |
0:2c2b17c7b7a8
|
90
|
char *buffbase, *Onbuff, *Offbuff, *buffend;
|
| JonFreeman |
0:2c2b17c7b7a8
|
91
|
int buffsize;
|
| JonFreeman |
0:2c2b17c7b7a8
|
92
|
bool emptyf, fullf, // Buffer full and empty flags
|
| JonFreeman |
0:2c2b17c7b7a8
|
93
|
overwrite_enable, // To allow new data to overwrite old, unread data
|
| JonFreeman |
0:2c2b17c7b7a8
|
94
|
seek_enable; // To allow read pointer repositioning 'n' behind current newest
|
| JonFreeman |
0:2c2b17c7b7a8
|
95
|
public:
|
| JonFreeman |
0:2c2b17c7b7a8
|
96
|
bool readable () {return !emptyf;}
|
| JonFreeman |
0:2c2b17c7b7a8
|
97
|
bool writeable () {return !fullf;}
|
| JonFreeman |
0:2c2b17c7b7a8
|
98
|
|
| JonFreeman |
0:2c2b17c7b7a8
|
99
|
void init (int size, char *buffstart, int flags); // Size and address of buffer to work with
|
| JonFreeman |
0:2c2b17c7b7a8
|
100
|
bool seek (int distance_back) ; // Assumes at least that much has been written to buff beforehand
|
| JonFreeman |
0:2c2b17c7b7a8
|
101
|
bool write (char a) ; // Put value into circular buffer
|
| JonFreeman |
0:2c2b17c7b7a8
|
102
|
bool read (char *rd) ;
|
| JonFreeman |
0:2c2b17c7b7a8
|
103
|
bool get_samps (char *dest, int len) ;
|
| JonFreeman |
1:b5ab54497d2a
|
104
|
} ; // end of class circular_buffer_c
|
| JonFreeman |
1:b5ab54497d2a
|
105
|
|
| JonFreeman |
0:2c2b17c7b7a8
|
106
|
#endif
|