Revision f7556b0d

View differences:

Adafruit_BNO055.cpp
27 27
 *  MIT license, all text above must be included in any redistribution
28 28
 */
29 29

  
30
#if ARDUINO >= 100
31 30
#include "Arduino.h"
32
#else
33
#include "WProgram.h"
34
#endif
35 31

  
36 32
#include <limits.h>
37 33
#include <math.h>
......
40 36

  
41 37
/*!
42 38
 *  @brief  Instantiates a new Adafruit_BNO055 class
43
 *  @param  sensorID
44
 *  @param  address
45 39
 */
46
Adafruit_BNO055::Adafruit_BNO055(int32_t sensorID, uint8_t address) {
47
  _sensorID = sensorID;
48
  _address = address;
40
Adafruit_BNO055::Adafruit_BNO055() {}
41

  
42
/*!
43
 *  @brief  Sets up the HW
44
 *  @param  mode
45
 *          mode values
46
 *           [OPERATION_MODE_CONFIG,
47
 *            OPERATION_MODE_ACCONLY,
48
 *            OPERATION_MODE_MAGONLY,
49
 *            OPERATION_MODE_GYRONLY,
50
 *            OPERATION_MODE_ACCMAG,
51
 *            OPERATION_MODE_ACCGYRO,
52
 *            OPERATION_MODE_MAGGYRO,
53
 *            OPERATION_MODE_AMG,
54
 *            OPERATION_MODE_IMUPLUS,
55
 *            OPERATION_MODE_COMPASS,
56
 *            OPERATION_MODE_M4G,
57
 *            OPERATION_MODE_NDOF_FMC_OFF,
58
 *            OPERATION_MODE_NDOF]
59
 *  @param  *theWire
60
 *          Wire object
61
 *  @return true if process is successful
62
 */
63
bool Adafruit_BNO055::begin() {
64
  _wire = &Wire;
65
#if defined(ARDUINO_SAMD_ZERO) && !(ARDUINO_SAMD_FEATHER_M0)
66
#error                                                                         \
67
    "On an arduino Zero, BNO055's ADR pin must be high. Fix that, then delete this line."
68
  _address = BNO055_ADDRESS_B;
69
#else
70
  _address = BNO055_ADDRESS_A;
71
#endif
72

  
73
  return init(OPERATION_MODE_NDOF);
49 74
}
50 75

  
51 76
/*!
52 77
 *  @brief  Sets up the HW
53 78
 *  @param  mode
54
 *  @return true if process is sucessfull
79
 *          mode values
80
 *           [OPERATION_MODE_CONFIG,
81
 *            OPERATION_MODE_ACCONLY,
82
 *            OPERATION_MODE_MAGONLY,
83
 *            OPERATION_MODE_GYRONLY,
84
 *            OPERATION_MODE_ACCMAG,
85
 *            OPERATION_MODE_ACCGYRO,
86
 *            OPERATION_MODE_MAGGYRO,
87
 *            OPERATION_MODE_AMG,
88
 *            OPERATION_MODE_IMUPLUS,
89
 *            OPERATION_MODE_COMPASS,
90
 *            OPERATION_MODE_M4G,
91
 *            OPERATION_MODE_NDOF_FMC_OFF,
92
 *            OPERATION_MODE_NDOF]
93
 *  @param  *theWire
94
 *          Wire object
95
 *  @return true if process is successful
55 96
 */
56
bool Adafruit_BNO055::begin(adafruit_bno055_opmode_t mode) {
97
bool Adafruit_BNO055::begin(adafruit_bno055_opmode_t mode, uint8_t address,
98
                            TwoWire *theWire) {
99
  _wire = theWire;
100
  _address = address;
101

  
102
  return init(mode);
103
}
104

  
105
bool Adafruit_BNO055::init(adafruit_bno055_opmode_t mode) {
57 106
  /* Enable I2C */
58
  Wire.begin();
107
  _wire->begin();
59 108

  
60 109
  /* BNO055 clock stretches for 500us or more! */
61 110
#ifdef ESP8266
62 111
  /* Allow for 1000us of clock stretching */
112
<<<<<<< HEAD
113
  _wire->setClockStretchLimit(1000);
114
=======
63 115
  Wire.setClockStretchLimit(1000);
116
>>>>>>> 75f03d2e1fd440e7febc0de8c47a52bab09c51b0
64 117
#endif
65 118

  
66 119
  /* Make sure we have the right device */
......
113 166
/*!
114 167
 *  @brief  Puts the chip in the specified operating mode
115 168
 *  @param  mode
169
 *          mode values
170
 *           [OPERATION_MODE_CONFIG,
171
 *            OPERATION_MODE_ACCONLY,
172
 *            OPERATION_MODE_MAGONLY,
173
 *            OPERATION_MODE_GYRONLY,
174
 *            OPERATION_MODE_ACCMAG,
175
 *            OPERATION_MODE_ACCGYRO,
176
 *            OPERATION_MODE_MAGGYRO,
177
 *            OPERATION_MODE_AMG,
178
 *            OPERATION_MODE_IMUPLUS,
179
 *            OPERATION_MODE_COMPASS,
180
 *            OPERATION_MODE_M4G,
181
 *            OPERATION_MODE_NDOF_FMC_OFF,
182
 *            OPERATION_MODE_NDOF]
116 183
 */
117 184
void Adafruit_BNO055::setMode(adafruit_bno055_opmode_t mode) {
118 185
  _mode = mode;
......
123 190
/*!
124 191
 *  @brief  Changes the chip's axis remap
125 192
 *  @param  remapcode
193
 *          remap code possible values
194
 *          [REMAP_CONFIG_P0
195
 *           REMAP_CONFIG_P1 (default)
196
 *           REMAP_CONFIG_P2
197
 *           REMAP_CONFIG_P3
198
 *           REMAP_CONFIG_P4
199
 *           REMAP_CONFIG_P5
200
 *           REMAP_CONFIG_P6
201
 *           REMAP_CONFIG_P7]
126 202
 */
127 203
void Adafruit_BNO055::setAxisRemap(
128 204
    adafruit_bno055_axis_remap_config_t remapcode) {
......
140 216
/*!
141 217
 *  @brief  Changes the chip's axis signs
142 218
 *  @param  remapsign
219
 *          remap sign possible values
220
 *          [REMAP_SIGN_P0
221
 *           REMAP_SIGN_P1 (default)
222
 *           REMAP_SIGN_P2
223
 *           REMAP_SIGN_P3
224
 *           REMAP_SIGN_P4
225
 *           REMAP_SIGN_P5
226
 *           REMAP_SIGN_P6
227
 *           REMAP_SIGN_P7]
143 228
 */
144 229
void Adafruit_BNO055::setAxisSign(adafruit_bno055_axis_remap_sign_t remapsign) {
145 230
  adafruit_bno055_opmode_t modeback = _mode;
......
155 240

  
156 241
/*!
157 242
 *  @brief  Use the external 32.768KHz crystal
158
 *  @param  usextal boolean
243
 *  @param  usextal
244
 *          use external crystal boolean
159 245
 */
160 246
void Adafruit_BNO055::setExtCrystalUse(boolean usextal) {
161 247
  adafruit_bno055_opmode_t modeback = _mode;
......
178 264
/*!
179 265
 *   @brief  Gets the latest system status info
180 266
 *   @param  system_status
267
 *           system status info
181 268
 *   @param  self_test_result
269
 *           self test result
182 270
 *   @param  system_error
271
 *           system error info
183 272
 */
184 273
void Adafruit_BNO055::getSystemStatus(uint8_t *system_status,
185 274
                                      uint8_t *self_test_result,
......
235 324

  
236 325
/*!
237 326
 *  @brief  Gets the chip revision numbers
327
 *  @param  info
328
 *          revision info
238 329
 */
239 330
void Adafruit_BNO055::getRevInfo(adafruit_bno055_rev_info_t *info) {
240 331
  uint8_t a, b;
......
262 353
 *  @brief  Gets current calibration state.  Each value should be a uint8_t
263 354
 *          pointer and it will be set to 0 if not calibrated and 3 if
264 355
 *          fully calibrated.
356
 *          See section 34.3.54
265 357
 *  @param  sys
358
 *          Current system calibration status, depends on status of all sensors,
359
 * read-only
266 360
 *  @param  gyro
361
 *          Current calibration status of Gyroscope, read-only
267 362
 *  @param  accel
363
 *          Current calibration status of Accelerometer, read-only
268 364
 *  @param  mag
365
 *          Current calibration status of Magnetometer, read-only
269 366
 */
270 367
void Adafruit_BNO055::getCalibration(uint8_t *sys, uint8_t *gyro,
271 368
                                     uint8_t *accel, uint8_t *mag) {
......
296 393
/*!
297 394
 *  @brief   Gets a vector reading from the specified source
298 395
 *  @param   vector_type
396
 *           possible vector type values
397
 *           [VECTOR_ACCELEROMETER
398
 *            VECTOR_MAGNETOMETER
399
 *            VECTOR_GYROSCOPE
400
 *            VECTOR_EULER
401
 *            VECTOR_LINEARACCEL
402
 *            VECTOR_GRAVITY]
299 403
 *  @return  vector from specified source
300 404
 */
301 405
imu::Vector<3> Adafruit_BNO055::getVector(adafruit_vector_type_t vector_type) {
......
501 605

  
502 606
/*!
503 607
 *  @brief  Writes an array of calibration values to the sensor's offset
608
<<<<<<< HEAD
609
 * registers
610
=======
504 611
 *          registers
612
>>>>>>> 75f03d2e1fd440e7febc0de8c47a52bab09c51b0
505 613
 *  @param  calibData
614
 *          calibration data
506 615
 */
507 616
void Adafruit_BNO055::setSensorOffsets(const uint8_t *calibData) {
508 617
  adafruit_bno055_opmode_t lastMode = _mode;
......
548 657
/*!
549 658
 *  @brief  Writes to the sensor's offset registers from an offset struct
550 659
 *  @param  offsets_type
660
<<<<<<< HEAD
661
 *          accel_offset_x = acceleration offset x
662
 *          accel_offset_y = acceleration offset y
663
 *          accel_offset_z = acceleration offset z
664
 *
665
 *          mag_offset_x   = magnetometer offset x
666
 *          mag_offset_y   = magnetometer offset y
667
 *          mag_offset_z   = magnetometer offset z
668
 *
669
 *          gyro_offset_x  = gyroscrope offset x
670
 *          gyro_offset_y  = gyroscrope offset y
671
 *          gyro_offset_z  = gyroscrope offset z
672
 *
673
 *
674
=======
675
>>>>>>> 75f03d2e1fd440e7febc0de8c47a52bab09c51b0
551 676
 */
552 677
void Adafruit_BNO055::setSensorOffsets(
553 678
    const adafruit_bno055_offsets_t &offsets_type) {
......
606 731
 *  @brief  Writes an 8 bit value over I2C
607 732
 */
608 733
bool Adafruit_BNO055::write8(adafruit_bno055_reg_t reg, byte value) {
609
  Wire.beginTransmission(_address);
734
  _wire->beginTransmission(_address);
610 735
#if ARDUINO >= 100
611
  Wire.write((uint8_t)reg);
612
  Wire.write((uint8_t)value);
736
  _wire->write((uint8_t)reg);
737
  _wire->write((uint8_t)value);
613 738
#else
614
  Wire.send(reg);
615
  Wire.send(value);
739
  _wire->send(reg);
740
  _wire->send(value);
616 741
#endif
617
  Wire.endTransmission();
742
  _wire->endTransmission();
618 743

  
619 744
  /* ToDo: Check for error! */
620 745
  return true;
......
626 751
byte Adafruit_BNO055::read8(adafruit_bno055_reg_t reg) {
627 752
  byte value = 0;
628 753

  
629
  Wire.beginTransmission(_address);
754
  _wire->beginTransmission(_address);
630 755
#if ARDUINO >= 100
631
  Wire.write((uint8_t)reg);
756
  _wire->write((uint8_t)reg);
632 757
#else
633
  Wire.send(reg);
758
  _wire->send(reg);
634 759
#endif
635
  Wire.endTransmission();
636
  Wire.requestFrom(_address, (byte)1);
760
  _wire->endTransmission();
761
  _wire->requestFrom(_address, (byte)1);
637 762
#if ARDUINO >= 100
638
  value = Wire.read();
763
  value = _wire->read();
639 764
#else
640
  value = Wire.receive();
765
  value = _wire->receive();
641 766
#endif
642 767

  
643 768
  return value;
......
648 773
 */
649 774
bool Adafruit_BNO055::readLen(adafruit_bno055_reg_t reg, byte *buffer,
650 775
                              uint8_t len) {
651
  Wire.beginTransmission(_address);
776
  _wire->beginTransmission(_address);
652 777
#if ARDUINO >= 100
653
  Wire.write((uint8_t)reg);
778
  _wire->write((uint8_t)reg);
654 779
#else
655
  Wire.send(reg);
780
  _wire->send(reg);
656 781
#endif
657
  Wire.endTransmission();
658
  Wire.requestFrom(_address, (byte)len);
782
  _wire->endTransmission();
783
  _wire->requestFrom(_address, (byte)len);
659 784

  
660 785
  for (uint8_t i = 0; i < len; i++) {
661 786
#if ARDUINO >= 100
662
    buffer[i] = Wire.read();
787
    buffer[i] = _wire->read();
663 788
#else
664
    buffer[i] = Wire.receive();
789
    buffer[i] = _wire->receive();
665 790
#endif
666 791
  }
667 792

  
Adafruit_BNO055.h
22 22
#ifndef __ADAFRUIT_BNO055_H__
23 23
#define __ADAFRUIT_BNO055_H__
24 24

  
25
#if (ARDUINO >= 100)
26 25
#include "Arduino.h"
27
#else
28
#include "WProgram.h"
29
#endif
30

  
31
#ifdef __AVR_ATtiny85__
32
#include <TinyWireM.h>
33
#define Wire TinyWireM
34
#else
35 26
#include <Wire.h>
36
#endif
37 27

  
38 28
#include <Adafruit_Sensor.h>
39 29
#include <utility/imumaths.h>
......
290 280
    VECTOR_GRAVITY = BNO055_GRAVITY_DATA_X_LSB_ADDR
291 281
  } adafruit_vector_type_t;
292 282

  
293
#if defined(ARDUINO_SAMD_ZERO) && !(ARDUINO_SAMD_FEATHER_M0)
294
#error                                                                         \
295
    "On an arduino Zero, BNO055's ADR pin must be high. Fix that, then delete \
296
         this line."
297
  Adafruit_BNO055(int32_t sensorID = -1, uint8_t address = BNO055_ADDRESS_B);
298
#else
299
  Adafruit_BNO055(int32_t sensorID = -1, uint8_t address = BNO055_ADDRESS_A);
300
#endif
301
  bool begin(adafruit_bno055_opmode_t mode = OPERATION_MODE_NDOF);
283
  Adafruit_BNO055();
284

  
285
  bool begin();
286
  bool begin(adafruit_bno055_opmode_t mode,
287
             uint8_t address, TwoWire *wire);
288
  bool init(adafruit_bno055_opmode_t mode);
302 289
  void setMode(adafruit_bno055_opmode_t mode);
303 290
  void setAxisRemap(adafruit_bno055_axis_remap_config_t remapcode);
304 291
  void setAxisSign(adafruit_bno055_axis_remap_sign_t remapsign);
......
330 317
  bool write8(adafruit_bno055_reg_t, byte value);
331 318

  
332 319
  uint8_t _address;
320
  TwoWire *_wire;
321

  
333 322
  int32_t _sensorID;
334 323
  adafruit_bno055_opmode_t _mode;
335 324
};

Also available in: Unified diff