LSM303DLH interface library
Dependents: LSM303DLH_Example Arch_Test
Diff: LSM303DLH.h
- Revision:
- 0:9b2a0b783bfc
diff -r 000000000000 -r 9b2a0b783bfc LSM303DLH.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LSM303DLH.h Thu Oct 06 08:38:06 2011 +0000 @@ -0,0 +1,66 @@ +#ifndef LSM303DLH_H +#define LSM303DLH_H + +#include "mbed.h" + +/**/ +enum ACC_ODR { + ACC_ODR_50HZ = 0, + ACC_ODR_100HZ = 1, + ACC_ODR_400HZ = 2, + ACC_ODR_1000HZ = 3, +}; + +enum ACC_RANGE { + ACC_RANGE_2G = 0, + ACC_RANGE_4G = 1, + ACC_RANGE_8G = 3, +}; + +enum MAG_ODR { + MAG_ODR_0_75HZ = 0, + MAG_ODR_1_5HZ = 1, + MAG_ODR_3_0HZ = 2, + MAG_ODR_7_5HZ = 3, + MAG_ODR_15HZ = 4, + MAG_ODR_30HZ = 5, + MAG_ODR_75HZ = 6, +}; + +enum MAG_RANGE { + MAG_RANGE_1_3GAUSS = 1, + MAG_RANGE_1_9GAUSS = 2, + MAG_RANGE_2_5GAUSS = 3, + MAG_RANGE_4_0GAUSS = 4, + MAG_RANGE_4_7GAUSS = 5, + MAG_RANGE_5_6GAUSS = 6, + MAG_RANGE_8_1GAUSS = 7, +}; + +enum INT_TYPE {INT1, INT2}; + +class LSM303DLH { +public: + float ax, ay, az; + float mx, my, mz; + + LSM303DLH(PinName sda = p9, PinName scl = p10, PinName int1 = NC, PinName int2 = NC); + bool setOutputDataRate(ACC_ODR acc_odr, MAG_ODR mag_odr); + bool setMeasurementRange(ACC_RANGE acc_range, MAG_RANGE mag_range); + bool read(); + bool read(float *ax, float *ay, float *az, float *mx, float *my, float *mz); + float getHeading(); + float getHeading(float x, float y, float z); + void attach(INT_TYPE type, char config, char threshold, char duration, void (*handler)(void)); + template<typename T> void attach(T *t, INT_TYPE type, char config, char threshold, char duration, void (*handler)(void)); + +private: + I2C i2c; + int acc_range, mag_range; + InterruptIn int1, int2; + + bool recv(char sad, char sub, char *buf, int length); + bool send(char sad, char sub, char data); +}; + +#endif \ No newline at end of file