Committer:
JonFreeman
Date:
Tue Jan 31 09:56:38 2012 +0000
Revision:
3:7ef4c240d5e3
Parent:
2:7f104b72b5eb
Rev3a, still learning how to document nicely

Who changed what in which revision?

UserRevisionLine numberNew 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