4 /******************************************************************************
6 ******************************************************************************/
7 MAG3110::MAG3110(PinName sda, PinName scl, int addr): _i2c(sda, scl),
8 _i2c_address(addr), _pc(NULL), _debug(false)
13 MAG3110::MAG3110(PinName sda, PinName scl, int addr, Serial *pc): _i2c(sda, scl),
14 _i2c_address(addr), _pc(pc), _debug(true)
23 cmd[0] = MAG_CTRL_REG2;
25 _i2c.write(_i2c_address, cmd, 2);
27 cmd[0] = MAG_CTRL_REG1;
28 cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE;
29 _i2c.write(_i2c_address, cmd, 2);
31 // No adjustment initially
36 // Read a single byte form 8 bit register, return as int
37 int MAG3110::readReg(char regAddr)
42 _i2c.write(_i2c_address, cmd, 1);
45 _i2c.read(_i2c_address, cmd, 1);
46 return (int)( cmd[0]);
50 // read a register per, pass first reg value, reading 2 bytes increments register
51 // Reads MSB first then LSB
52 int MAG3110::readVal(char regAddr)
57 _i2c.write(_i2c_address, cmd, 1);
61 _i2c.read(_i2c_address, cmd, 2);
62 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
66 float MAG3110::getHeading()
68 int xVal = readVal(MAG_OUT_X_MSB);
69 int yVal = readVal(MAG_OUT_Y_MSB);
70 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
73 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
75 *xVal = readVal(MAG_OUT_X_MSB);
76 *yVal = readVal(MAG_OUT_Y_MSB);
77 *zVal = readVal(MAG_OUT_Z_MSB);
80 int16_t MAG3110::getMagX()
82 return readVal(MAG_OUT_X_MSB);
85 int16_t MAG3110::getMagY()
87 return readVal(MAG_OUT_Y_MSB);
90 int16_t MAG3110::getMagZ()
92 return readVal(MAG_OUT_Z_MSB);
95 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )