Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
circular_buffer.h@3:7ef4c240d5e3, 2012-01-31 (annotated)
- 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?
| 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 |