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.

Dependents:   SpindleBot_1_5b

Committer:
labmrd
Date:
Wed Apr 29 21:52:23 2015 +0000
Revision:
2:da00ed8a1cd5
Parent:
1:f109687a28fe
Collaborating!!!!

Who changed what in which revision?

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