add ability to build and upload sketches from the bash command line (via beta ino2cpp...
[zumo-cc3200/zumo-cc3200.git] / src / Energia / ZumoTest / L3G.h
1 /*
2  *  ======== L3G ========
3  *  
4  */
6 #ifndef L3G_h
7 #define L3G_h
9 #include <Arduino.h> // for byte data type
11 class L3G
12 {
13   public:
15     /*
16      *  ======== vector ========
17      */
18     template <typename T> struct vector {
19         T x, y, z;
20     };
22     enum deviceType { device_4200D, device_D20, device_D20H, device_auto };
23     enum sa0State { sa0_low, sa0_high, sa0_auto };
25     // register addresses
26     enum regAddr
27     {
28         WHO_AM_I       = 0x0F,
30         CTRL1          = 0x20, // D20H
31         CTRL_REG1      = 0x20, // D20, 4200D
32         CTRL2          = 0x21, // D20H
33         CTRL_REG2      = 0x21, // D20, 4200D
34         CTRL3          = 0x22, // D20H
35         CTRL_REG3      = 0x22, // D20, 4200D
36         CTRL4          = 0x23, // D20H
37         CTRL_REG4      = 0x23, // D20, 4200D
38         CTRL5          = 0x24, // D20H
39         CTRL_REG5      = 0x24, // D20, 4200D
40         REFERENCE      = 0x25,
41         OUT_TEMP       = 0x26,
42         STATUS         = 0x27, // D20H
43         STATUS_REG     = 0x27, // D20, 4200D
45         OUT_X_L        = 0x28,
46         OUT_X_H        = 0x29,
47         OUT_Y_L        = 0x2A,
48         OUT_Y_H        = 0x2B,
49         OUT_Z_L        = 0x2C,
50         OUT_Z_H        = 0x2D,
52         FIFO_CTRL      = 0x2E, // D20H
53         FIFO_CTRL_REG  = 0x2E, // D20, 4200D
54         FIFO_SRC       = 0x2F, // D20H
55         FIFO_SRC_REG   = 0x2F, // D20, 4200D
57         IG_CFG         = 0x30, // D20H
58         INT1_CFG       = 0x30, // D20, 4200D
59         IG_SRC         = 0x31, // D20H
60         INT1_SRC       = 0x31, // D20, 4200D
61         IG_THS_XH      = 0x32, // D20H
62         INT1_THS_XH    = 0x32, // D20, 4200D
63         IG_THS_XL      = 0x33, // D20H
64         INT1_THS_XL    = 0x33, // D20, 4200D
65         IG_THS_YH      = 0x34, // D20H
66         INT1_THS_YH    = 0x34, // D20, 4200D
67         IG_THS_YL      = 0x35, // D20H
68         INT1_THS_YL    = 0x35, // D20, 4200D
69         IG_THS_ZH      = 0x36, // D20H
70         INT1_THS_ZH    = 0x36, // D20, 4200D
71         IG_THS_ZL      = 0x37, // D20H
72         INT1_THS_ZL    = 0x37, // D20, 4200D
73         IG_DURATION    = 0x38, // D20H
74         INT1_DURATION  = 0x38, // D20, 4200D
76         LOW_ODR        = 0x39  // D20H
77     };
79     /*
80      *  ======== g ========
81      *  gyro angular velocity readings
82      */
83     vector<int16_t> g;
85     /*
86      *  ======== last_status ========
87      *  status of last I2C transmission
88      */
89     byte last_status;
91     /*
92      *  ======== L3G ========
93      *  Constructor
94      */
95     L3G(void);
97     /*
98      *  ======== init ========
99      */
100     bool init(deviceType device = device_auto, sa0State sa0 = sa0_auto);
102     /*
103      *  ======== getDeviceType ========
104      */
105     deviceType getDeviceType(void) { return _device; }
107     /*
108      *  ======== enableDefault ========
109      */
110     void enableDefault(void);
112     /*
113      *  ======== writeReg ========
114      */
115     void writeReg(byte reg, byte value);
117     /*
118      *  ======== readReg ========
119      */
120     byte readReg(byte reg);
122     /*
123      *  ======== read ========
124      */
125     void read(void);
127     /*
128      *  ======== setTimeout ========
129      */
130     void setTimeout(unsigned int timeout);
132     /*
133      *  ======== getTimeout ========
134      */
135     unsigned int getTimeout(void);
137     /*
138      *  ======== timeoutOccurred ========
139      */
140     bool timeoutOccurred(void);
142     /*
143      *  ======== vector_cross ========
144      */
145     template <typename Ta, typename Tb, typename To>
146         static void vector_cross(
147             const vector<Ta> *a, const vector<Tb> *b, vector<To> *out);
149     /*
150      *  ======== vector_dot ========
151      */
152     template <typename Ta, typename Tb>
153         static float vector_dot(const vector<Ta> *a, const vector<Tb> *b);
155     /*
156      *  ======== vector_normalize ========
157      */
158     static void vector_normalize(vector<float> *a);
160   private:
161     deviceType   _device; // chip type (D20H, D20, or 4200D)
162     byte         address;
164     unsigned int io_timeout;
165     bool         did_timeout;
166 };
168 /*
169  *  ======== vector_cross ========
170  */
171 template <typename Ta, typename Tb, typename To>
172     void L3G::vector_cross(
173         const vector<Ta> *a, const vector<Tb> *b, vector<To> *out)
175     out->x = (a->y * b->z) - (a->z * b->y);
176     out->y = (a->z * b->x) - (a->x * b->z);
177     out->z = (a->x * b->y) - (a->y * b->x);
180 /*
181  *  ======== vector_dot ========
182  */
183 template <typename Ta, typename Tb>
184     float L3G::vector_dot(const vector<Ta> *a, const vector<Tb> *b)
186     return (a->x * b->x) + (a->y * b->y) + (a->z * b->z);
189 #endif