Library to use BMX055 via I2C

Dependents:   NineIMUAttitude_MadgwickFilter

Revision:
0:be73a6efa20b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMX055.hpp	Fri Aug 21 03:11:36 2020 +0000
@@ -0,0 +1,84 @@
+#ifndef BMX055_HPP
+#define BMX055_HPP
+
+#include "mbed.h"
+
+//  Aux class
+template <typename T = float, unsigned char D = 3>
+class FixedLengthVector
+{
+public:
+    const unsigned char degree; // length of array, or num of elements
+    
+    T * const e; // elements
+    
+    //elements' alias
+    T &w, &x, &y, &z;
+    
+
+    FixedLengthVector (T* arg_init_vec = array_filled_0(D))
+        :degree(value_checked_degree(D))
+        ,e(new T[degree])
+        ,w(e[0])
+        ,x((degree > 3 ? e[1] : e[0]))
+        ,y((degree > 3 ? e[2] : e[1]))
+        ,z((degree > 3 ? e[3] : (degree == 3 ? e[2] : e[1])))
+    {        
+        for (int i = 0; i < degree; i++) e[i] = arg_init_vec[i];
+    }
+
+
+private:
+    static inline unsigned char value_checked_degree (unsigned char arg_degree)
+    {
+        if (arg_degree < 2) return 2;
+        else return arg_degree;
+    }
+    
+    static inline T * array_filled_0 (unsigned char arg_degree)
+    {
+        unsigned char l_degree = value_checked_degree(arg_degree);
+        T* tmp = new T[l_degree];
+
+        for(int i = 0; i < l_degree; i++) tmp[i] = 0;
+        return tmp;
+    }
+
+};
+
+class BMX055
+{
+public:
+    /** Main buffers which store 3 cubic data
+     * 
+     *  Acc: all x,y,z has 12 bits payload
+     *  Gyr: all x,y,z has 16 bits payload
+     *  Mag: x,y have 13 bits and z have 15 bits payload
+     */
+    FixedLengthVector<signed short, 3> acc, gyr, mag;
+    
+    // I2C pin of LPC 1768 is (p9, p10) or (p28, p27);
+    BMX055(
+        const char arg_addr_acc = 0x19, 
+        const char arg_addr_gyr = 0x69, 
+        const char arg_addr_mag = 0x13,
+        PinName arg_SDA = p9, 
+        PinName arg_SCL = p10)
+    : m_addr_acc(arg_addr_acc << 1)
+    , m_addr_gyr(arg_addr_gyr << 1)
+    , m_addr_mag(arg_addr_mag << 1)
+    {
+        Init_I2C(arg_SDA, arg_SCL);
+    }
+    void Update();
+    void UpdateIMU();
+    
+private:
+    I2C* i2c;
+    const char m_addr_acc;
+    const char m_addr_gyr;
+    const char m_addr_mag;
+    void Init_I2C(PinName arg_SDA, PinName arg_SCL);
+
+};
+#endif
\ No newline at end of file