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

ServoRingBuffer.h

Committer:
labmrd
Date:
2015-04-29
Revision:
2:da00ed8a1cd5
Parent:
1:f109687a28fe

File content as of revision 2:da00ed8a1cd5:

/* mbed Ring Buffer for Servos
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#ifndef SERVORINGBUFFER_H
#define SERVORINGBUFFER_H

// Define variables for structure
#define NUMBER_OF_SPINDLES         2
#define LEFT_SERVO_INDEX           0
#define RIGHT_SERVO_INDEX          1

// Define variables for ring buffer
#define BUFFER_SIZE     512            //This sets the ring buffer size to 512 elements

// Define a structure hierarchy for storing data
struct servoData {
    unsigned short pos;
    unsigned int force;
};
struct spindleData {
    servoData myServoData[NUMBER_OF_SPINDLES];
    unsigned char direction;
    unsigned char cycle;
    int time;
};

/** Servo ring buffer class, to store data between acquisiton and export
 *
 * Example:
 * @code
 * #include "mbed.h"
 * #include "ServoRingBuffer.h"
 *
 * int main() {
 *
 *   ServoRingBuffer Buffer;     //Set up ring buffer
 *   AnalogIn Ain(p20);          //Set up potentiometer on pin 20
 *
 *   while (1) {
 *
 *       // This section of code should run whenever data needs to be acquired
 *       Buffer.write(Ain.read_u16(),Ain.read_u16());
 *
 *       // This section of code should run whenever there is free time to print to the screen
 *       Buffer.dumpBufferToSerial();
 *       wait (0.1);
 *   }
 * }
 * @endcode
 */
class ServoRingBuffer
{

public:
    ServoRingBuffer();

    void purge();
    void write(spindleData data);
    void write(unsigned short pos0, unsigned short force0, unsigned short pos1=0, unsigned short force1=0);
    spindleData read(void);
    void dumpBufferToSerial(void);
    void dumpBufferToSD(FILE * txtFile);
    unsigned int writesRemaining(void);
    unsigned int readsRemaining(void);
    float percentFull(void);

private:

    volatile unsigned int lastWritten;  //This is the variable to track the last written index
    volatile unsigned int lastRead;     //This is the variable to track the last read index
    unsigned int idx;                       //Buffer index counter
    Timer t;
    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 )

};

#endif // SERVORINGBUFFER_H