From b05954660aed44a00540d4a35323cf7e101c8bc6 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Mon, 30 Nov 2015 17:25:00 -0200 Subject: [PATCH] AP_Baro: BMP085: use I2CDevice interface --- libraries/AP_Baro/AP_Baro.cpp | 7 +++--- libraries/AP_Baro/AP_Baro_BMP085.cpp | 36 +++++++++++++--------------- libraries/AP_Baro/AP_Baro_BMP085.h | 8 +++++-- libraries/AP_HAL/AP_HAL_Boards.h | 2 ++ 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/libraries/AP_Baro/AP_Baro.cpp b/libraries/AP_Baro/AP_Baro.cpp index fd79a298fc..a61baf7007 100644 --- a/libraries/AP_Baro/AP_Baro.cpp +++ b/libraries/AP_Baro/AP_Baro.cpp @@ -295,10 +295,9 @@ void AP_Baro::init(void) drivers[0] = new AP_Baro_HIL(*this); _num_drivers = 1; #elif HAL_BARO_DEFAULT == HAL_BARO_BMP085 - { - drivers[0] = new AP_Baro_BMP085(*this); - _num_drivers = 1; - } + drivers[0] = new AP_Baro_BMP085(*this, + hal.i2c_mgr->get_device(HAL_BARO_BMP085_BUS, HAL_BARO_BMP085_I2C_ADDR)); + _num_drivers = 1; #elif HAL_BARO_DEFAULT == HAL_BARO_MS5611 && HAL_BARO_MS5611_I2C_BUS == 0 { drivers[0] = new AP_Baro_MS5611(*this, new AP_SerialBus_I2C(hal.i2c, HAL_BARO_MS5611_I2C_ADDR), false); diff --git a/libraries/AP_Baro/AP_Baro_BMP085.cpp b/libraries/AP_Baro/AP_Baro_BMP085.cpp index 09d5b6f8af..0c3efc611e 100644 --- a/libraries/AP_Baro/AP_Baro_BMP085.cpp +++ b/libraries/AP_Baro/AP_Baro_BMP085.cpp @@ -15,14 +15,13 @@ */ #include "AP_Baro_BMP085.h" +#include + #include #include extern const AP_HAL::HAL &hal; -// 0xEE >> 1 -#define BMP085_ADDRESS 0x77 - #ifndef BMP085_EOC #define BMP085_EOC -1 #endif @@ -30,16 +29,17 @@ extern const AP_HAL::HAL &hal; // oversampling 3 gives 26ms conversion time. We then average #define OVERSAMPLING 3 -AP_Baro_BMP085::AP_Baro_BMP085(AP_Baro &baro) +AP_Baro_BMP085::AP_Baro_BMP085(AP_Baro &baro, AP_HAL::OwnPtr dev) : AP_Baro_Backend(baro) + , _dev(std::move(dev)) { uint8_t buff[22]; // get pointer to i2c bus semaphore - AP_HAL::Semaphore *i2c_sem = hal.i2c->get_semaphore(); + AP_HAL::Semaphore *sem = _dev->get_semaphore(); // take i2c bus sempahore - if (!i2c_sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) { + if (!sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) { AP_HAL::panic("BMP085: unable to get semaphore"); } @@ -49,7 +49,7 @@ AP_Baro_BMP085::AP_Baro_BMP085(AP_Baro &baro) } // We read the calibration data registers - if (hal.i2c->readRegisters(BMP085_ADDRESS, 0xAA, 22, buff) != 0) { + if (!_dev->read_registers(0xAA, buff, 22)) { AP_HAL::panic("BMP085: bad calibration registers"); } @@ -75,7 +75,7 @@ AP_Baro_BMP085::AP_Baro_BMP085(AP_Baro &baro) BMP085_State = 0; - i2c_sem->give(); + sem->give(); } /* @@ -83,15 +83,14 @@ AP_Baro_BMP085::AP_Baro_BMP085(AP_Baro &baro) */ void AP_Baro_BMP085::accumulate(void) { - // get pointer to i2c bus semaphore - AP_HAL::Semaphore *i2c_sem = hal.i2c->get_semaphore(); + AP_HAL::Semaphore *sem = _dev->get_semaphore(); if (!_data_ready()) { return; } // take i2c bus sempahore - if (!i2c_sem->take(1)) { + if (!sem->take(1)) { return; } @@ -109,7 +108,7 @@ void AP_Baro_BMP085::accumulate(void) _cmd_read_pressure(); } - i2c_sem->give(); + sem->give(); } /* @@ -138,8 +137,7 @@ void AP_Baro_BMP085::update(void) void AP_Baro_BMP085::_cmd_read_pressure() { // Mode 0x34+(OVERSAMPLING << 6) is osrs=3 when OVERSAMPLING=3 => 25.5ms conversion time - hal.i2c->writeRegister(BMP085_ADDRESS, 0xF4, - 0x34 + (OVERSAMPLING << 6)); + _dev->write_register(0xF4, 0x34 + (OVERSAMPLING << 6)); _last_press_read_command_time = AP_HAL::millis(); } @@ -148,9 +146,9 @@ bool AP_Baro_BMP085::_read_pressure() { uint8_t buf[3]; - if (hal.i2c->readRegisters(BMP085_ADDRESS, 0xF6, 3, buf) != 0) { + if (!_dev->read_registers(0xF6, buf, 3)) { _retry_time = AP_HAL::millis() + 1000; - hal.i2c->setHighSpeed(false); + _dev->set_speed(AP_HAL::Device::SPEED_LOW); return false; } @@ -163,7 +161,7 @@ bool AP_Baro_BMP085::_read_pressure() // Send Command to Read Temperature void AP_Baro_BMP085::_cmd_read_temp() { - hal.i2c->writeRegister(BMP085_ADDRESS, 0xF4, 0x2E); + _dev->write_register(0xF4, 0x2E); _last_temp_read_command_time = AP_HAL::millis(); } @@ -173,8 +171,8 @@ void AP_Baro_BMP085::_read_temp() uint8_t buf[2]; int32_t _temp_sensor; - if (hal.i2c->readRegisters(BMP085_ADDRESS, 0xF6, 2, buf) != 0) { - hal.i2c->setHighSpeed(false); + if (!_dev->read_registers(0xF6, buf, 2)) { + _dev->set_speed(AP_HAL::Device::SPEED_LOW); return; } _temp_sensor = buf[0]; diff --git a/libraries/AP_Baro/AP_Baro_BMP085.h b/libraries/AP_Baro/AP_Baro_BMP085.h index bbb3d61621..b76bf917ea 100644 --- a/libraries/AP_Baro/AP_Baro_BMP085.h +++ b/libraries/AP_Baro/AP_Baro_BMP085.h @@ -1,13 +1,15 @@ /// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- #pragma once +#include +#include + #include "AP_Baro_Backend.h" class AP_Baro_BMP085 : public AP_Baro_Backend { public: - // Constructor - AP_Baro_BMP085(AP_Baro &baro); + AP_Baro_BMP085(AP_Baro &baro, AP_HAL::OwnPtr dev); /* AP_Baro public interface: */ void update(); @@ -21,6 +23,8 @@ private: void _calculate(); bool _data_ready(); + AP_HAL::OwnPtr _dev; + uint8_t _instance; float _temp_sum; float _press_sum; diff --git a/libraries/AP_HAL/AP_HAL_Boards.h b/libraries/AP_HAL/AP_HAL_Boards.h index 06397c9bf0..c844dad924 100644 --- a/libraries/AP_HAL/AP_HAL_Boards.h +++ b/libraries/AP_HAL/AP_HAL_Boards.h @@ -148,6 +148,8 @@ #define HAL_STORAGE_SIZE_AVAILABLE HAL_STORAGE_SIZE #define HAL_INS_DEFAULT HAL_INS_FLYMAPLE #define HAL_BARO_DEFAULT HAL_BARO_BMP085 +#define HAL_BARO_BMP085_BUS 1 +#define HAL_BARO_BMP085_I2C_ADDR 0x77 #define HAL_COMPASS_DEFAULT HAL_COMPASS_HMC5843 #define HAL_SERIAL0_BAUD_DEFAULT 115200 #define CONFIG_HAL_BOARD_SUBTYPE HAL_BOARD_SUBTYPE_NONE