Add missing device functions

This commit is contained in:
marcelbuesing 2018-04-15 21:31:46 +02:00 committed by marcelbuesing
parent 6e85dee3e9
commit b213d691c6
No known key found for this signature in database
GPG key ID: EF3934305E975944
4 changed files with 199 additions and 3 deletions

1
Cargo.lock generated
View file

@ -52,6 +52,7 @@ name = "bme680-rs"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bindgen 0.35.0 (registry+https://github.com/rust-lang/crates.io-index)", "bindgen 0.35.0 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
] ]

View file

@ -8,4 +8,5 @@ authors = ["marcelbuesing <buesing.marcel@googlemail.com>"]
[build-dependencies] [build-dependencies]
bindgen = "0.35.0" bindgen = "0.35.0"
bitflags = "1.0.1"
gcc = "0.3.54" gcc = "0.3.54"

View file

@ -1,6 +1,29 @@
use consts; use consts;
use {to_result, Result, bme680_calib_data, bme680_dev, bme680_gas_sett, bme680_init, bme680_intf, use {to_result, PowerMode, Result, SensorSettings, bme680_calib_data, bme680_dev,
bme680_intf_BME680_I2C_INTF, bme680_tph_sett}; bme680_field_data, bme680_gas_sett, bme680_get_profile_dur, bme680_get_regs,
bme680_get_sensor_data, bme680_get_sensor_mode, bme680_get_sensor_settings, bme680_init,
bme680_intf, bme680_intf_BME680_I2C_INTF, bme680_set_profile_dur, bme680_set_sensor_mode,
bme680_set_sensor_settings, bme680_soft_reset, bme680_tph_sett};
impl Default for bme680_field_data {
fn default() -> bme680_field_data {
bme680_field_data {
status: Default::default(),
/// The index of the heater profile used
gas_index: Default::default(),
/// Measurement index to track order
meas_index: Default::default(),
/// Temperature in degree celsius x100
temperature: Default::default(),
/// Pressure in Pascal
pressure: Default::default(),
/// Humidity in % relative humidity x1000
humidity: Default::default(),
/// Gas resistance in Ohms
gas_resistance: Default::default(),
}
}
}
pub struct Bme680Device { pub struct Bme680Device {
dev: bme680_dev, dev: bme680_dev,
@ -17,6 +40,134 @@ impl Bme680Device {
let dev_ptr: *mut bme680_dev = &mut self.dev; let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe { to_result(bme680_init(dev_ptr)) } unsafe { to_result(bme680_init(dev_ptr)) }
} }
/// @brief This API writes the given data to the register address
/// of the sensor.
///
/// @param[in] reg_addr : Register address from where the data to be written.
/// @param[in] reg_data : Pointer to data buffer which is to be written
/// in the sensor.
/// @param[in] len : No of bytes of data to write..
/// @param[in] dev : Structure instance of bme680_dev.
///
/// @return Result of API execution status
pub fn set_regs(mut self, reg_addr: u8, reg_data: &mut [u8]) -> Result<()> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe {
to_result(bme680_get_regs(
reg_addr,
reg_data.as_mut_ptr(),
reg_data.len() as u16,
dev_ptr,
))
}
}
/// @brief This API reads the data from the given register address of the sensor.
///
/// @param[in] reg_addr : Register address from where the data to be read
/// @param[out] reg_data : buffer to store the read data.
///
/// @return Result of API execution status
pub fn get_regs(mut self, reg_addr: u8, reg_data: &mut [u8]) -> Result<()> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe {
to_result(bme680_get_regs(
reg_addr,
reg_data.as_mut_ptr(),
reg_data.len() as u16,
dev_ptr,
))
}
}
/// @brief This API performs the soft reset of the sensor.
///
/// @return Result of API execution status
pub fn soft_reset(mut self) -> Result<()> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe { to_result(bme680_soft_reset(dev_ptr)) }
}
/// @brief This API is used to set the power mode of the sensor.
///
/// @param[in] power_mode : Sensor power mode
///
/// @return Result of API execution status
pub fn set_sensor_mode(mut self, power_mode: PowerMode) -> Result<()> {
self.dev.power_mode = power_mode.value();
let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe { to_result(bme680_set_sensor_mode(dev_ptr)) }
}
/// @brief This API is used to get the power mode of the sensor.
///
/// @return Sensor power mode
pub fn get_sensor_mode(mut self) -> Result<PowerMode> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
let r = unsafe { to_result(bme680_get_sensor_mode(dev_ptr)) };
r.map(|_| PowerMode::from(self.dev.power_mode))
}
/// @brief This API is used to set the profile duration of the sensor.
///
/// @param[in] duration : Duration of the measurement in ms.
pub fn set_profile_dur(mut self, duration: u16) {
let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe { bme680_set_profile_dur(duration, dev_ptr) }
}
/// @brief This API is used to get the profile duration of the sensor.
///
/// @return Duration of the measurement in ms.
pub fn get_profile_dur(mut self) -> u16 {
let dev_ptr: *mut bme680_dev = &mut self.dev;
let mut duration = 0;
unsafe { bme680_get_profile_dur(&mut duration, dev_ptr) };
duration
}
/// @brief This API reads the pressure, temperature and humidity and gas data
/// from the sensor, compensates the data and store it in the bme680_data
/// structure instance passed by the user.
///
/// @param[out] data: Structure instance to hold the data.
/// @param[in] dev : Structure instance of bme680_dev.
///
/// @return Result of API execution status
pub fn get_sensor_data(mut self) -> Result<bme680_field_data> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
let mut field_data = Default::default();
let field_data_ptr: *mut bme680_field_data = &mut field_data;
let r = unsafe { to_result(bme680_get_sensor_data(field_data_ptr, dev_ptr)) };
r.map(|_| field_data)
}
/// @brief This API is used to set the oversampling, filter and T,P,H, gas selection
/// settings in the sensor.
///
/// @param[in] desired_settings : Variable used to select the settings which
/// @return Result of API execution status
pub fn set_sensor_settings(mut self, sensor_settings: SensorSettings) -> Result<()> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
unsafe { to_result(bme680_set_sensor_settings(sensor_settings.bits(), dev_ptr)) }
}
pub fn get_tph_sett(mut self) -> Result<bme680_tph_sett> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
let settings_sel = SensorSettings::OST_SEL | SensorSettings::OSP_SEL
| SensorSettings::OSH_SEL | SensorSettings::FILTER_SEL;
let r = unsafe { to_result(bme680_get_sensor_settings(settings_sel.bits(), dev_ptr)) };
r.map(|_| self.dev.tph_sett)
}
pub fn get_gas_sett(mut self) -> Result<bme680_gas_sett> {
let dev_ptr: *mut bme680_dev = &mut self.dev;
let settings_sel = SensorSettings::GAS_SENSOR_SEL;
let r = unsafe { to_result(bme680_get_sensor_settings(settings_sel.bits(), dev_ptr)) };
r.map(|_| self.dev.gas_sett)
}
} }
impl Default for bme680_calib_data { impl Default for bme680_calib_data {

View file

@ -1,10 +1,13 @@
#![allow(non_upper_case_globals)] #![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)] #![allow(non_camel_case_types)]
#![allow(non_snake_case)] #![allow(non_snake_case)]
#![feature(rustc_private)]
include!(concat!(env!("OUT_DIR"), "/bindings.rs")); include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
use std::default::Default; #[macro_use]
extern crate bitflags;
use std::result; use std::result;
#[link(name = "example", kind = "static")] #[link(name = "example", kind = "static")]
@ -75,3 +78,43 @@ pub enum PowerMode {
SleepMode, SleepMode,
ForcedMode, ForcedMode,
} }
impl PowerMode {
fn from(power_mode: u8) -> Self {
match power_mode {
consts::BME680_SLEEP_MODE => PowerMode::SleepMode,
consts::BME680_FORCED_MODE => PowerMode::ForcedMode,
_ => panic!("Unknown power mode: {}", power_mode),
}
}
fn value(&self) -> u8 {
match self {
PowerMode::SleepMode => consts::BME680_SLEEP_MODE,
PowerMode::ForcedMode => consts::BME680_FORCED_MODE,
}
}
}
bitflags! {
pub struct SensorSettings: u16 {
/// To set temperature oversampling
const OST_SEL = 1;
/// To set pressure oversampling.
const OSP_SEL = 2;
/// To set humidity oversampling.
const OSH_SEL = 4;
/// To set gas measurement setting.
const GAS_MEAS_SEL = 8;
/// To set filter setting.
const FILTER_SEL = 16;
/// To set humidity control setting.
const HCNTRL_SEL = 32;
/// To set run gas setting.
const RUN_GAS_SEL = 64;
/// To set NB conversion setting.
const NBCONV_SEL = 128;
/// To set all gas sensor related settings
const GAS_SENSOR_SEL = Self::GAS_MEAS_SEL.bits | Self::RUN_GAS_SEL.bits | Self::NBCONV_SEL.bits;
}
}