upm/src/bmp280/bmp280.hpp
Mihai Tudor Panu 4a1eb99d6d doxygen: updated library brief description tags
Touched on all library brief descriptions for better integration with ISS and fixed a few typos and connection tags in the process.

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
2018-02-14 11:33:09 -08:00

278 lines
9.5 KiB
C++

/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016-2017 Intel Corporation.
*
* The MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <string>
#include "bmp280.h"
#include "interfaces/iPressureSensor.hpp"
#include "interfaces/iTemperatureSensor.hpp"
namespace upm {
/**
* @brief BMP280/BME280 Digital Pressure Sensors
* @defgroup bmp280 libupm-bmp280
* @ingroup i2c spi gpio pressure bosch adafruit
*/
/**
* @library bmp280
* @sensor bmp280
* @comname Digital Pressure Sensor
* @type pressure
* @man bosch adafruit
* @con i2c spi gpio
* @web https://www.adafruit.com/products/2651
*
* @brief API for the BMP280 Digital Pressure Sensor
*
* The BMP280 is an absolute barometric pressure sensor especially
* designed for mobile applications. The sensor module is housed in
* an extremely compact 8-pin metal-lid LGA package with a footprint
* of only 2.0 * 2.5 mm2 and 0.95 mm package height. Its small
* dimensions and its low power consumption of 2.7 uA @1Hz allow the
* implementation in battery driven devices such as mobile phones,
* GPS modules or watches.
*
* As the successor to the widely adopted BMP180, the BMP280
* delivers high performance in all applications that require
* precise pressure measurement. The BMP280 operates at lower noise,
* supports new filter modes and an SPI interface within a footprint
* 63% smaller than the BMP180.
*
* @snippet bmp280.cxx Interesting
*/
class BMP280 : public ITemperatureSensor, public IPressureSensor {
public:
/**
* BMP280 constructor.
*
* This driver supports both the BMP280 and the BME280. The
* BME280 adds a humidity sensor. The device type is detected
* automatically by querying the chip id register.
*
* This device can support both I2C and SPI. For SPI, set the addr
* to -1, and specify a positive integer representing the Chip
* Select (CS) pin for the cs argument. If you are using a
* hardware CS pin, then you can connect the proper pin to the
* hardware CS pin on your MCU and supply -1 for cs. The default
* operating mode is I2C.
*
* @param bus I2C or SPI bus to use.
* @param addr The I2C address for this device. Use -1 for SPI.
* @param cs The gpio pin to use for the SPI Chip Select. Use -1
* for I2C, or for SPI with a hardware controlled pin.
* @throws std::runtime_error on failure.
*/
BMP280(int bus=BMP280_DEFAULT_I2C_BUS, int addr=BMP280_DEFAULT_ADDR,
int cs=-1);
/**
* BMP280 Destructor.
*/
virtual ~BMP280();
/**
* Update the internal stored values from sensor data.
*
* @throws std::runtime_error on failure.
*/
virtual void update();
/**
* Return the chip ID.
*
* @return The chip ID (BMP280_CHIPID).
*/
uint8_t getChipID();
/**
* Reset the sensor, as if by a power-on-reset.
*/
void reset();
/**
* Return the current measured temperature. Note, this is not
* ambient temperature - this is the temperature used to fine tune
* the pressure measurement. update() must have been called prior
* to calling this method.
*
* @param fahrenheit true to return data in Fahrenheit, false for
* Celicus. Celsius is the default.
* @return The temperature in degrees Celsius or Fahrenheit.
*/
float getTemperature(bool fahrenheit=false);
/**
* Return the current measured pressure in Pascals (Pa). update()
* must have been called prior to calling this method.
*
* @return The pressure in Pascals (Pa).
*/
float getPressure();
/**
* Set the pressure at sea level in hecto-Pascals (hPA). This
* value is used to compute the altitude based on the
* pressure. At driver initialization time, this value is set
* to 1013.25 hPA.
*
* @param seaLevelhPA The pressure at sea level in hectoPascals
* (hPa). The default is 1013.25 hPA, (101325 Pa).
* @return The computed altitude in meters.
*/
void setSeaLevelPreassure(float seaLevelhPA=1013.25);
/**
* Return the current computed altitude in meters. update()
* must have been called prior to calling this method.
*
* @return The computed altitude in meters.
*/
float getAltitude();
/**
* Set a general usage mode. This function can be used to
* configure the filters and oversampling for a particular use
* case. These setting are documented in the BMP280 datasheet.
* The default mode set in the constructor is
* USAGE_MODE_INDOOR_NAV, the highest resolution mode.
*
* @param mode One of the BMP280_USAGE_MODE_T values.
*/
virtual void setUsageMode(BMP280_USAGE_MODE_T mode);
/**
* Set the temperature sensor oversampling parameter. See the
* data sheet for details. This value can be automatically set to
* a suitable value by using one of the predefined modes for
* setUsageMode().
*
* @param rate One of the BMP280_OSRS_T_T values.
*/
void setOversampleRateTemperature(BMP280_OSRS_T_T rate);
/**
* Set the pressure sensor oversampling parameter. See the
* data sheet for details. This value can be automatically set to
* a suitable value by using one of the predefined modes for
* setUsageMode().
*
* @param rate One of the BMP280_OSRS_P_T values.
*/
void setOversampleRatePressure(BMP280_OSRS_P_T rate);
/**
* Set the timer standby value. When in NORMAL operating mode,
* this timer governs how long the chip will wait before
* performing a measurement. See the data sheet for details.
*
* @param tsb One of the BMP280_T_SB_T values.
*/
void setTimerStandby(BMP280_T_SB_T tsb);
/**
* Set the IIR filtering parameter. See the data sheet for
* details. This value can be automatically set to a suitable
* value by using one of the predefined modes for setUsageMode().
*
* @param filter One of the BMP280_FILTER_T values.
*/
void setFilter(BMP280_FILTER_T filter);
/**
* Set the default measuring mode. Basic values are forced,
* sleep, and normal. See the data sheet for details. This value
* can be automatically set to a suitable value by using one of
* the predefined modes for setUsageMode().
*
* @param mode One of the BMP280_MODES_T values.
*/
void setMeasureMode(BMP280_MODES_T mode);
// Interface support
const char *getModuleName()
{
return "BMP280";
};
int getTemperatureCelsius()
{
return int(getTemperature(false));
};
int getPressurePa()
{
return int(getPressure());
};
protected:
bmp280_context m_bmp280;
/**
* Return the value of the BMP280_REG_STATUS register.
*
* @return Contents of the status register.
*/
uint8_t getStatus();
/**
* Read a register.
*
* @param reg The register to read
* @return The value of the register
*/
uint8_t readReg(uint8_t reg);
/**
* Read contiguous registers into a buffer.
*
* @param buffer The buffer to store the results
* @param len The number of registers to read
* @return The number of bytes read, or -1 on error
*/
int readRegs(uint8_t reg, uint8_t *buffer, int len);
/**
* Write to a register
*
* @param reg The register to write to
* @param val The value to write
* @throws std::runtime_error on failure.
*/
void writeReg(uint8_t reg, uint8_t val);
private:
/* Disable implicit copy and assignment operators */
BMP280(const BMP280&) = delete;
BMP280 &operator=(const BMP280&) = delete;
};
}