L3GD20 Library using FIFO and Interrupt

Fork of L3GD20_SPI by Tatsuki Fukuda

L3GD20.h

Committer:
lelect
Date:
2014-05-12
Revision:
0:175bf093daa8
Child:
1:2ebc045424af

File content as of revision 0:175bf093daa8:

#ifndef MBED_SPI
#define MBED_SPI
#include "mbed.h"
#include "L3GD20_Resister.h"
/** @file
 *
 * This is test program.
 */
class L3GD20
{
public:
    L3GD20(PinName miso, PinName mosi, PinName scl, PinName cs,PinName interrupt2=NC);
    typedef enum {
        null=0x00,WhoAmI=0x0F,CtrlReg1=0x20,CtrlReg2=0x21,CtrlReg3=0x22,CtrlReg4=0x23,CtrlReg5=0x24,Reference=0x25,OutTemp=0x26,StatusReg=0x27,OutXL=0x28,OutXH=0x29,OutYL=0x2A,OutYH=0x2B,OutZL=0x2C,OutZH=0x2D,FIFOCtrlReg=0x2E,FIFOSrcReg=0x2F,INT1Cfg=0x30,INT1Src=0x31,INT1ThsXH=0x32,INT1ThsXL=0x33,INT1ThsYH=0x34,INT1ThsYL=0x35,INT1ThsZH=0x36,INT1ThsZL=0x37,INT1Duration=0x38,READ=0x80
    } RESISTER;
    typedef enum {
        Y=0x1,X=0x1<<1,Z=0x1<<2,XY=X|Y,XZ=X|Z,YZ=Y|Z,XYZ=X|Y|Z
    } DIRECTION;
    typedef enum {
        BYPASSmode=0x0,FIFOmode,STREAMmode,STREAMtoFIFOmode,BYPASStoSTREAMmode
    } FIFO_mode;
    typedef enum {
        none=0,empty,watermark,overrun
    } FIFOstatus;
    struct tagFIFO {
        FIFOstatus status;
        int level;
    } FIFO;
    struct config {
//read and write resister
        union CTRL_REG1 CTRL_REG1;
        union CTRL_REG2 CTRL_REG2;
        union CTRL_REG3 CTRL_REG3;
        union CTRL_REG4 CTRL_REG4;
        union CTRL_REG5 CTRL_REG5;
        union REF_DATACAP REF_DATACAP;
        union OUT_TEMP OUT_TEMP;
        union STATUS_REG STATUS_REG;
        union FIFO_CTRL_REG FIFO_CTRL_REG;
        union INT1_CFG INT1_CFG;
        union INT1_TSH_XH INT1_TSH_XH;
        union INT1_TSH_XL INT1_TSH_XL;
        union INT1_TSH_YH INT1_TSH_YH;
        union INT1_TSH_YL INT1_TSH_YL;
        union INT1_TSH_ZH INT1_TSH_ZH;
        union INT1_TSH_ZL INT1_TSH_ZL;
        union INT1_DURATION INT1_DURATION;
    } _config;
    struct status {
//read only resister
        int OUT_TEMP;
        int STATUS_REG;
        union FIFO_SRC_REG FIFO_SRC_REG;
        int INT1_SRC;
    } _status;
//Class method
    /** Power_OnOff
    *
    * @param enable L3GD20 channel
    */
    void start(DIRECTION enable);
    void start(DIRECTION enable,void (*func)(anglerrates*));
    /** stop sampling
    */
    void stop();
    void sleep();
    //only read data and calcurate dps
    void read(anglerrates* val,DIRECTION direction);
    //only read temperature (I don't know meanig of this data)
    int readTemperature();
    //L3GD20mode change need reset(bypass) when filled FIFObuffor
    void enableFIFO(FIFO_mode mode,FIFOstatus interrupt,const int threshold);
    //status Update
    int updateFIFO(void);
    anglerrates _value;
protected:
    //write command to resister
    void write(RESISTER reg,int val);
    //read resister for resister
    void read(RESISTER reg,int* val);
    //just send reboot command
    void reboot();
    //read all configration rester
    void configReadOut(void);
    //read all status rester
    void statusReadOut(void);
    //for InterruptIn function ,call userFunction in this methed
    void interrupt(void);
    /*
    void datarate(uint8_t rate,uint8_t bandwidth);
    void setDataFormat();
    void filter(uint8_t mode,uint8_t frequency);
    void channelSource(uint8_t channnel,uint8_t dataSelection,uint8_t interruptSelection);
    void FIFO(uint8_t mode,uint8_t watermark);
    void interrupt(uint8_t source,uint8_t threthold,uint8_t duration,uint8_t Wait);
    */
    void (*userFunction)(anglerrates*);
    SPI _spi;
    DigitalOut _cs;
    InterruptIn _int2;
};

#endif