5 /******************************************************************************
7 ******************************************************************************/
8 MAG3110::MAG3110(PinName sda, PinName scl): _i2c(sda, scl),
9 _i2c_address(0x1D), _pc(NULL), _debug(false)
14 MAG3110::MAG3110(PinName sda, PinName scl, Serial *pc): _i2c(sda, scl),
15 _i2c_address(0x1D), _pc(pc), _debug(true)
24 cmd[0] = MAG_CTRL_REG2;
26 _i2c.write(_i2c_address, cmd, 2);
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);
32 // No adjustment initially
37 // Read a single byte form 8 bit register, return as int
38 int MAG3110::readReg(char regAddr)
43 _i2c.write(_i2c_address, cmd, 1);
46 _i2c.read(_i2c_address, cmd, 1);
47 return (int)( cmd[0]);
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)
58 _i2c.write(_i2c_address, cmd, 1);
62 _i2c.read(_i2c_address, cmd, 2);
63 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
67 float MAG3110::getHeading()
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;
74 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
76 *xVal = readVal(MAG_OUT_X_MSB);
77 *yVal = readVal(MAG_OUT_Y_MSB);
78 *zVal = readVal(MAG_OUT_Z_MSB);
82 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )