Custom ring buffer written from scratch to allow data collection at a rigid rate, while allowing writing that data to either serial or an SD card whenever time allows.
ServoRingBuffer.h@2:da00ed8a1cd5, 2015-04-29 (annotated)
- Committer:
- labmrd
- Date:
- Wed Apr 29 21:52:23 2015 +0000
- Revision:
- 2:da00ed8a1cd5
- Parent:
- 1:f109687a28fe
Collaborating!!!!
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| labmrd | 0:01fb4588b738 | 1 | /* mbed Ring Buffer for Servos |
| labmrd | 0:01fb4588b738 | 2 | * |
| labmrd | 0:01fb4588b738 | 3 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| labmrd | 0:01fb4588b738 | 4 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| labmrd | 0:01fb4588b738 | 5 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| labmrd | 0:01fb4588b738 | 6 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| labmrd | 0:01fb4588b738 | 7 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| labmrd | 0:01fb4588b738 | 8 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| labmrd | 0:01fb4588b738 | 9 | * THE SOFTWARE. |
| labmrd | 0:01fb4588b738 | 10 | */ |
| labmrd | 0:01fb4588b738 | 11 | |
| labmrd | 0:01fb4588b738 | 12 | #ifndef SERVORINGBUFFER_H |
| labmrd | 0:01fb4588b738 | 13 | #define SERVORINGBUFFER_H |
| labmrd | 0:01fb4588b738 | 14 | |
| labmrd | 0:01fb4588b738 | 15 | // Define variables for structure |
| labmrd | 0:01fb4588b738 | 16 | #define NUMBER_OF_SPINDLES 2 |
| labmrd | 0:01fb4588b738 | 17 | #define LEFT_SERVO_INDEX 0 |
| labmrd | 0:01fb4588b738 | 18 | #define RIGHT_SERVO_INDEX 1 |
| labmrd | 0:01fb4588b738 | 19 | |
| labmrd | 0:01fb4588b738 | 20 | // Define variables for ring buffer |
| labmrd | 0:01fb4588b738 | 21 | #define BUFFER_SIZE 512 //This sets the ring buffer size to 512 elements |
| labmrd | 0:01fb4588b738 | 22 | |
| labmrd | 0:01fb4588b738 | 23 | // Define a structure hierarchy for storing data |
| labmrd | 0:01fb4588b738 | 24 | struct servoData { |
| labmrd | 0:01fb4588b738 | 25 | unsigned short pos; |
| labmrd | 1:f109687a28fe | 26 | unsigned int force; |
| labmrd | 0:01fb4588b738 | 27 | }; |
| labmrd | 0:01fb4588b738 | 28 | struct spindleData { |
| labmrd | 0:01fb4588b738 | 29 | servoData myServoData[NUMBER_OF_SPINDLES]; |
| labmrd | 0:01fb4588b738 | 30 | unsigned char direction; |
| labmrd | 0:01fb4588b738 | 31 | unsigned char cycle; |
| labmrd | 0:01fb4588b738 | 32 | int time; |
| labmrd | 0:01fb4588b738 | 33 | }; |
| labmrd | 0:01fb4588b738 | 34 | |
| labmrd | 0:01fb4588b738 | 35 | /** Servo ring buffer class, to store data between acquisiton and export |
| labmrd | 0:01fb4588b738 | 36 | * |
| labmrd | 0:01fb4588b738 | 37 | * Example: |
| labmrd | 0:01fb4588b738 | 38 | * @code |
| labmrd | 0:01fb4588b738 | 39 | * #include "mbed.h" |
| labmrd | 0:01fb4588b738 | 40 | * #include "ServoRingBuffer.h" |
| labmrd | 0:01fb4588b738 | 41 | * |
| labmrd | 0:01fb4588b738 | 42 | * int main() { |
| labmrd | 0:01fb4588b738 | 43 | * |
| labmrd | 0:01fb4588b738 | 44 | * ServoRingBuffer Buffer; //Set up ring buffer |
| labmrd | 0:01fb4588b738 | 45 | * AnalogIn Ain(p20); //Set up potentiometer on pin 20 |
| labmrd | 0:01fb4588b738 | 46 | * |
| labmrd | 0:01fb4588b738 | 47 | * while (1) { |
| labmrd | 0:01fb4588b738 | 48 | * |
| labmrd | 0:01fb4588b738 | 49 | * // This section of code should run whenever data needs to be acquired |
| labmrd | 0:01fb4588b738 | 50 | * Buffer.write(Ain.read_u16(),Ain.read_u16()); |
| labmrd | 0:01fb4588b738 | 51 | * |
| labmrd | 0:01fb4588b738 | 52 | * // This section of code should run whenever there is free time to print to the screen |
| labmrd | 0:01fb4588b738 | 53 | * Buffer.dumpBufferToSerial(); |
| labmrd | 0:01fb4588b738 | 54 | * wait (0.1); |
| labmrd | 0:01fb4588b738 | 55 | * } |
| labmrd | 0:01fb4588b738 | 56 | * } |
| labmrd | 0:01fb4588b738 | 57 | * @endcode |
| labmrd | 0:01fb4588b738 | 58 | */ |
| labmrd | 0:01fb4588b738 | 59 | class ServoRingBuffer |
| labmrd | 0:01fb4588b738 | 60 | { |
| labmrd | 0:01fb4588b738 | 61 | |
| labmrd | 0:01fb4588b738 | 62 | public: |
| labmrd | 0:01fb4588b738 | 63 | ServoRingBuffer(); |
| labmrd | 0:01fb4588b738 | 64 | |
| labmrd | 0:01fb4588b738 | 65 | void purge(); |
| labmrd | 0:01fb4588b738 | 66 | void write(spindleData data); |
| labmrd | 0:01fb4588b738 | 67 | void write(unsigned short pos0, unsigned short force0, unsigned short pos1=0, unsigned short force1=0); |
| labmrd | 0:01fb4588b738 | 68 | spindleData read(void); |
| labmrd | 0:01fb4588b738 | 69 | void dumpBufferToSerial(void); |
| labmrd | 0:01fb4588b738 | 70 | void dumpBufferToSD(FILE * txtFile); |
| labmrd | 0:01fb4588b738 | 71 | unsigned int writesRemaining(void); |
| labmrd | 0:01fb4588b738 | 72 | unsigned int readsRemaining(void); |
| labmrd | 0:01fb4588b738 | 73 | float percentFull(void); |
| labmrd | 0:01fb4588b738 | 74 | |
| labmrd | 0:01fb4588b738 | 75 | private: |
| labmrd | 0:01fb4588b738 | 76 | |
| labmrd | 0:01fb4588b738 | 77 | volatile unsigned int lastWritten; //This is the variable to track the last written index |
| labmrd | 0:01fb4588b738 | 78 | volatile unsigned int lastRead; //This is the variable to track the last read index |
| labmrd | 0:01fb4588b738 | 79 | unsigned int idx; //Buffer index counter |
| labmrd | 0:01fb4588b738 | 80 | Timer t; |
| labmrd | 0:01fb4588b738 | 81 | spindleData ringBuffer[BUFFER_SIZE]; //This creates a structure of structures with indeces from 0 to BUFFER_SIZE - 1 (i.e.-There are BUFFER_SIZE amount of indeces ) |
| labmrd | 0:01fb4588b738 | 82 | |
| labmrd | 0:01fb4588b738 | 83 | }; |
| labmrd | 0:01fb4588b738 | 84 | |
| labmrd | 0:01fb4588b738 | 85 | #endif // SERVORINGBUFFER_H |