# libbno055-linux API Reference
Table of Contents - [Namespaces & Types](#namespaces--types) - [Class BNO055](#class-bno055) - [Lifecycle](#lifecycle) - [Configuration](#configuration) - [Sensor Data (Throwing APIs)](#sensor-data-throwing-apis) - [Sensor Data (Exception-free / noexcept APIs)](#sensor-data-exception-free--noexcept-apis) - [Diagnostics & Calibration](#diagnostics--calibration) - [Power Management](#power-management) - [Logging](#logging) - [Utilities (Class-External)](#utilities-class-external)
## Namespaces & Types ```cpp namespace bno055lib { // 3D coordinate vector (used for accelerometer, gyroscope, magnetometer, euler, gravity, linear accel) struct Vector3 { float x; float y; float z; }; // 3D orientation quaternion representation struct Quaternion { float w; // Real part float x; // Imaginary X float y; // Imaginary Y float z; // Imaginary Z }; // Transport interface representing I/O connection to the BNO055 hardware class Transport { public: virtual ~Transport() = default; virtual bool open() = 0; virtual void close() = 0; virtual bool isOpen() const = 0; virtual bool write8(uint8_t reg, uint8_t value) = 0; virtual bool writeLen(uint8_t reg, const uint8_t* buffer, uint8_t len) = 0; virtual bool read8(uint8_t reg, uint8_t& value) = 0; virtual bool readLen(uint8_t reg, uint8_t* buffer, uint8_t len) = 0; }; // Mock implementation of Transport for hardware-independent verification class MockTransport : public Transport { public: MockTransport(); void setRegister(uint8_t reg, uint8_t value); void setRegister16LE(uint8_t reg, int16_t value); void setFailOpen(bool fail); void setFailReads(bool fail); void setFailWrites(bool fail); uint32_t getWriteCount() const; uint32_t getReadCount() const; void reset(); }; // Bundled structure representing all sensor physical data struct AllData { Vector3 accel; Vector3 mag; Vector3 gyro; Vector3 euler; Vector3 linear_accel; Vector3 gravity; Quaternion quat; int8_t temp; }; using AsyncDataCallback = std::function; // Binary calibration offsets (22 bytes total) for saving/restoring sensor profile struct Offsets { int16_t accel_offset_x, accel_offset_y, accel_offset_z; int16_t mag_offset_x, mag_offset_y, mag_offset_z; int16_t gyro_offset_x, gyro_offset_y, gyro_offset_z; int16_t accel_radius, mag_radius; }; // Dynamic calibration status of the sensor (0 = uncalibrated, 3 = fully calibrated) struct CalibrationStatus { uint8_t sys; // Overall system calibration status [0-3] uint8_t gyro; // Gyroscope calibration status [0-3] uint8_t accel; // Accelerometer calibration status [0-3] uint8_t mag; // Magnetometer calibration status [0-3] // Returns true if gyro, accel, and mag are fully calibrated (status == 3) bool isFullyCalibrated() const; }; // Cumulative telemetry diagnostics tracking error rates for health monitoring struct Diagnostics { uint32_t write_failures; // Number of failed register write transactions uint32_t read_failures; // Number of failed register read transactions uint32_t reconnect_attempts; // Number of I2C bus auto-reconnect triggers }; // Operating mode configuration enum class OpMode : uint8_t { Config = 0X00, // Configuration mode (required to write map/sign/crystal settings) AccOnly = 0X01, // Non-fusion Accelerometer only MagOnly = 0X02, // Non-fusion Magnetometer only GyroOnly = 0X03, // Non-fusion Gyroscope only AccMag = 0X04, // Non-fusion Accelerometer + Magnetometer AccGyro = 0X05, // Non-fusion Accelerometer + Gyroscope MagGyro = 0X06, // Non-fusion Magnetometer + Gyroscope AMG = 0X07, // Non-fusion Accelerometer + Magnetometer + Gyroscope (raw outputs) IMUPlus = 0X08, // 6-axis Fusion (Acc + Gyro). Yaw relative to boot position. Recommended indoors. Compass = 0X09, // 6-axis Fusion (Acc + Mag). Absolute Yaw. M4G = 0X0A, // 6-axis Fusion (Mag + Gyro). NDOF_FMC_Off = 0X0B, // 9-axis Fusion (Acc + Mag + Gyro) with Fast Magnetometer Calibration disabled NDOF = 0X0C // 9-axis Fusion (Acc + Mag + Gyro) with FMC enabled. Absolute Yaw (North-referenced). }; enum class LogLevel { Debug, Info, Warning, Error }; using LoggerCallback = std::function; } ``` ### Class BNO055 All functions in the `BNO055` class are thread-safe and protect access to the underlying I2C bus using internal mutexes. #### Lifecycle * **explicit BNO055(uint8_t i2c_address = 0x28, std::string_view i2c_device = "/dev/i2c-1")** * *Parameters*: * `i2c_address`: `uint8_t`. The I2C slave address of the BNO055 (typically `0x28` or `0x29`). * `i2c_device`: `std::string_view`. The Linux file path to the I2C adapter (e.g., `/dev/i2c-1`). * *Returns*: None (Constructor). * *Description*: Creates a BNO055 handler. If compiled on macOS/Windows, it falls back to the mock mode and accepts any mock device name. * **explicit BNO055(std::unique_ptr transport)** * *Parameters*: * `transport`: `std::unique_ptr`. Custom transport implementation (e.g., a `MockTransport` instance). * *Returns*: None (Constructor). * *Description*: Creates a BNO055 handler using a custom transport layer. Extremely useful for unit testing (dependency injection) and porting. * **bool begin(OpMode mode = OpMode::NDOF)** * *Parameters*: * `mode`: `OpMode`. The target operation mode to start in. * *Returns*: `bool`. `true` if initialization, self-test verification, and mode transition succeeded; `false` on boot timeouts or I2C failures. * *Description*: Power-cycles the sensor, verifies the Chip ID, configures default Axis Maps and Unit settings, and spawns the background auto-recovery thread. * **bool reset()** * *Parameters*: None. * *Returns*: `bool`. `true` if reset and mode restoration succeeded; `false` on failure. * *Description*: Triggers a software hardware-reset using the `SYS_TRIGGER` register and completely re-initializes the device into the previously active operating mode. Useful for recovery from external hardware lockups. #### Configuration * **void setMode(OpMode mode)** * *Parameters*: * `mode`: `OpMode`. The target operation mode to switch into. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on permanent I2C communication failures. * *Description*: Switches the operating mode of the sensor. Handles transition delay requirements automatically. * **OpMode getMode()** * *Parameters*: None. * *Returns*: `OpMode`. The active operation mode currently registered on the sensor. * *Exceptions*: Throws `bno055lib::IMUError` on I2C failure. * **void setAxisRemap(AxisMapConfig config)** * *Parameters*: * `config`: `AxisMapConfig`. The remap configuration matching the sensor's mounting orientation. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on I2C failure. * **void setAxisSign(AxisMapSign sign)** * *Parameters*: * `sign`: `AxisMapSign`. The axis sign configuration to adjust rotation/acceleration directions. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on I2C failure. * **void setExtCrystalUse(bool use_xtal)** * *Parameters*: * `use_xtal`: `bool`. Set to `true` to use the external 32.768kHz crystal oscillator for enhanced fusion stability. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on I2C failure. #### Sensor Data (Throwing APIs) These functions query raw data registers and convert them to SI units. They throw `bno055lib::IMUError` on permanent I2C communication loss. * **Vector3 getAccelerometer()** * *Parameters*: None. * *Returns*: `Vector3`. 3-axis acceleration in meters per second squared (m/s^2). * *Exceptions*: Throws `bno055lib::IMUError`. * **Vector3 getMagnetometer()** * *Parameters*: None. * *Returns*: `Vector3`. 3-axis magnetic field strength in microteslas (uT). * *Exceptions*: Throws `bno055lib::IMUError`. * **Vector3 getGyroscope()** * *Parameters*: None. * *Returns*: `Vector3`. 3-axis angular velocity in radians per second (rad/s). * *Exceptions*: Throws `bno055lib::IMUError`. * **Vector3 getEulerAngles()** * *Parameters*: None. * *Returns*: `Vector3`. Roll, Pitch, Yaw in radians (rad). Mapping: `x` = Roll, `y` = Pitch, `z` = Yaw. * *Exceptions*: Throws `bno055lib::IMUError`. * **Vector3 getLinearAcceleration()** * *Parameters*: None. * *Returns*: `Vector3`. 3-axis linear acceleration (accelerometer excluding gravity) in m/s^2. * *Exceptions*: Throws `bno055lib::IMUError`. * **Vector3 getGravity()** * *Parameters*: None. * *Returns*: `Vector3`. 3-axis gravity vector in m/s^2. * *Exceptions*: Throws `bno055lib::IMUError`. * **Quaternion getQuaternion()** * *Parameters*: None. * *Returns*: `Quaternion`. Normalized 3D orientation unit quaternion (w, x, y, z). * *Exceptions*: Throws `bno055lib::IMUError`. * **int8_t getTemperature()** * *Parameters*: None. * *Returns*: `int8_t`. Chip temperature in degrees Celsius (C). * *Exceptions*: Throws `bno055lib::IMUError`. * **RawSensorData getRawSensorData()** * *Parameters*: None. * *Returns*: `RawSensorData`. Struct containing converted raw accelerometer, magnetometer, and gyroscope vectors. * *Exceptions*: Throws `bno055lib::IMUError`. * *Description*: Sequentially reads 18 bytes of raw sensor data in a single burst I2C transaction, minimizing bus occupancy. #### Sensor Data (Exception-free / noexcept APIs) These companion APIs perform the exact same register queries and conversions but never throw exceptions. * **std::optional\ getAccelerometerNoexcept() noexcept** * **std::optional\ getMagnetometerNoexcept() noexcept** * **std::optional\ getGyroscopeNoexcept() noexcept** * **std::optional\ getEulerAnglesNoexcept() noexcept** * **std::optional\ getLinearAccelerationNoexcept() noexcept** * **std::optional\ getGravityNoexcept() noexcept** * **std::optional\ getQuaternionNoexcept() noexcept** * **std::optional\ getTemperatureNoexcept() noexcept** * **std::optional\ getRawSensorDataNoexcept() noexcept** * *Parameters*: None. * *Returns*: `std::optional`. Contains the requested struct on success; `std::nullopt` on communication failure. * *Description*: Safety-hardened read path that increments I2C diagnostic counters upon failure without generating CPU exceptions. * *Parameters*: None. * *Returns*: The requested struct directly (`Vector3`, `Quaternion`, or `int8_t`). On temporary bus drops, returns the last cached valid frame (or zero/identity). #### Diagnostics & Calibration * **Diagnostics getDiagnostics() const noexcept** * *Parameters*: None. * *Returns*: `Diagnostics`. The telemetry diagnostic struct containing I2C read/write error counts and reconnection attempts. * **CalibrationStatus getCalibrationStatus()** * *Parameters*: None. * *Returns*: `CalibrationStatus`. Current calibration state values (0 to 3) for the system, gyro, accelerometer, and magnetometer. * *Exceptions*: Throws `bno055lib::IMUError` on I2C failure. * **bool getSensorOffsets(Offsets& offsets)** * *Parameters*: * `offsets`: `Offsets&` (output). Structure to store the retrieved calibration offsets. * *Returns*: `bool`. `true` if offsets were read and stored successfully; `false` on I2C failure. * **bool getSensorOffsets(std::array& calib_data)** * *Parameters*: * `calib_data`: `std::array&` (output). Raw byte array to store the 22 bytes of offsets. * *Returns*: `bool`. `true` if read succeeded; `false` on failure. * **void setSensorOffsets(const Offsets& offsets)** * *Parameters*: * `offsets`: `const Offsets&`. Calibration offset parameters to load into the sensor registers. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on failure. * *Description*: Writes offsets using a single-batch sequential I2C write transaction to minimize bus occupation. * **void setSensorOffsets(const std::array& calib_data)** * *Parameters*: * `calib_data`: `const std::array&`. Raw 22-byte array containing calibration offsets. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on failure. * **bool saveCalibrationFile(std::string_view filepath)** * *Parameters*: * `filepath`: `std::string_view`. Destination file path to save the 22-byte profile (e.g., `calib.bin`). * *Returns*: `bool`. `true` if offsets were read and successfully written to disk; `false` on I2C or file I/O errors. * **bool loadCalibrationFile(std::string_view filepath)** * *Parameters*: * `filepath`: `std::string_view`. Source path of the 22-byte binary profile. * *Returns*: `bool`. `true` if file read, register upload, and cache storage succeeded; `false` on file I/O or I2C errors. * *Description*: Uploads calibration to the sensor and caches it locally so it can be automatically restored during an I2C hot-reconnect recovery. #### Power Management * **void enterSuspendMode()** * *Parameters*: None. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on failure. * *Description*: Places the sensor into suspend mode to reduce power consumption. Suspends accelerometer, gyroscope, and magnetometer blocks. * **void enterNormalMode()** * *Parameters*: None. * *Returns*: `void`. * *Exceptions*: Throws `bno055lib::IMUError` on failure. * *Description*: Awakes the sensor from suspend mode back to active normal operation. #### Logging * **void setLogger(LoggerCallback callback)** * *Parameters*: * `callback`: `LoggerCallback`. Callback function of signature `void(LogLevel level, std::string_view message)`. * *Returns*: `void`. * *Description*: Hooks a custom logging function (such as `std::cout` or ROS 2 logging macros) to direct library diagnostics, warnings, and reconnect traces. #### Asynchronous Reading * **bool startAsyncReading(double rate_hz, AsyncDataCallback callback)** * *Parameters*: * `rate_hz`: `double`. The target frequency in Hz to query the sensor data. * `callback`: `AsyncDataCallback`. Callback function executed on the background thread whenever new measurements are gathered. * *Returns*: `bool`. `true` if background polling thread successfully spawned; `false` if already running. * *Description*: Spawns a high-priority background polling thread that sleeps to minimize timing jitter. Calls `callback` with a thread-safe copy of `AllData`. * **void stopAsyncReading()** * *Parameters*: None. * *Returns*: `void`. * *Description*: Signals the background async thread to terminate and blocks until it joins. * **bool startRawAsyncReading(double rate_hz, RawAsyncDataCallback callback)** * *Parameters*: * `rate_hz`: `double`. Polling frequency. * `callback`: `RawAsyncDataCallback`. Callback executing with raw 3-axis readings. * *Returns*: `bool`. * *Description*: Spawns a lightweight async thread polling only raw IMU data via burst transaction. * **void stopRawAsyncReading()** * *Parameters*: None. * *Returns*: `void`. * *Description*: Stops the raw async polling thread. #### Interrupt Driven Reading (IRQ) * **bool startInterruptDrivenReading(int gpio_pin, RawAsyncDataCallback callback)** * *Parameters*: * `gpio_pin`: `int`. Linux GPIO pin connected to the BNO055 INT pin. * `callback`: `RawAsyncDataCallback`. Handler triggered on interrupt. * *Returns*: `bool`. `true` if background IRQ waiting thread spawned. * *Description*: Registers a rising-edge trigger on the specified Linux GPIO pin. When BNO055 triggers INT, the kernel interrupt immediately unblocks POSIX `poll()` on the GPIO sysfs file descriptors, firing the callback with raw burst readings at sub-millisecond latency. * **void stopInterruptDrivenReading()** * *Parameters*: None. * *Returns*: `void`. * *Description*: Stops the interrupt-driven IRQ monitoring thread. #### Automatic Calibration * **void enableAutoCalibration(std::string_view filepath)** * *Parameters*: * `filepath`: `std::string_view`. The binary calibration profile path to load from on `begin()` and save to. * *Returns*: `void`. * *Description*: Activates automated calibration loading on startup and writes offsets back to the disk target once fully calibrated status is reached. * **void disableAutoCalibration()** * *Parameters*: None. * *Returns*: `void`. * *Description*: Deactivates the automated calibration load/save helper logic. ### Utilities (Class-External) * **Vector3 toEulerDegrees(const Quaternion& q) noexcept** * *Parameters*: * `q`: `const Quaternion&`. The normalized unit quaternion representation of orientation. * *Returns*: `Vector3`. Roll, Pitch, and Yaw in degrees (Mapping: `x` = Roll `[-180, 180]`, `y` = Pitch `[-90, 90]`, `z` = Yaw `[0, 360)`). * *Description*: Utility function to convert Quaternion orientation into human-readable Euler angles in degrees (now executing on single-precision `float` elements).