]> Pileus Git - ~andy/csm213a-hw/blob - yue/MAG3110/MAG3110.cpp
Add sensors code from Yue
[~andy/csm213a-hw] / yue / MAG3110 / MAG3110.cpp
1
2 #include "MAG3110.h"
3 #include "mbed.h"
4
5 /******************************************************************************
6  * Constructors
7  ******************************************************************************/
8 MAG3110::MAG3110(PinName sda, PinName scl): _i2c(sda, scl), 
9     _i2c_address(0x1D), _pc(NULL), _debug(false)
10 {
11     begin();
12 }
13
14 MAG3110::MAG3110(PinName sda, PinName scl, Serial *pc): _i2c(sda, scl), 
15    _i2c_address(0x1D), _pc(pc), _debug(true)
16 {
17     begin();
18 }
19
20 void MAG3110::begin()
21 {
22     char cmd[2];
23
24     cmd[0] = MAG_CTRL_REG2;
25     cmd[1] = 0x80;
26     _i2c.write(_i2c_address, cmd, 2);
27
28     cmd[0] = MAG_CTRL_REG1;
29     cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE;
30     _i2c.write(_i2c_address, cmd, 2);
31     
32     // No adjustment initially
33     _avgX = 0;
34     _avgY = 0;
35 }
36
37 // Read a single byte form 8 bit register, return as int
38 int MAG3110::readReg(char regAddr)
39 {
40     char cmd[1];
41
42     cmd[0] = regAddr;
43     _i2c.write(_i2c_address, cmd, 1);
44
45     cmd[0] = 0x00;
46     _i2c.read(_i2c_address, cmd, 1);
47     return (int)( cmd[0]);
48 }
49
50
51 // read a register per, pass first reg value, reading 2 bytes increments register
52 // Reads MSB first then LSB
53 int MAG3110::readVal(char regAddr)
54 {
55     char cmd[2];
56
57     cmd[0] = regAddr;
58     _i2c.write(_i2c_address, cmd, 1);
59
60     cmd[0] = 0x00;
61     cmd[1] = 0x00;
62     _i2c.read(_i2c_address, cmd, 2);
63     return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
64 }
65
66
67 float MAG3110::getHeading()
68 {
69     int xVal = readVal(MAG_OUT_X_MSB);
70     int yVal = readVal(MAG_OUT_Y_MSB);
71     return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
72 }
73
74 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
75 {
76     *xVal = readVal(MAG_OUT_X_MSB);
77     *yVal = readVal(MAG_OUT_Y_MSB);
78     *zVal = readVal(MAG_OUT_Z_MSB);
79 }
80
81
82 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
83 {
84     _avgX=(maxX+minX)/2;
85     _avgY=(maxY+minY)/2;
86 }
87
88
89
90
91