Fix read field return when InfoMsg empty
This commit is contained in:
parent
266c8b70ea
commit
2dd1b8f9ba
2 changed files with 49 additions and 27 deletions
|
@ -1,6 +1,8 @@
|
||||||
extern crate embedded_hal;
|
extern crate embedded_hal;
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
extern crate linux_embedded_hal as hal;
|
extern crate linux_embedded_hal as hal;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
extern crate bme680_rs;
|
extern crate bme680_rs;
|
||||||
|
|
||||||
use bme680_rs::*;
|
use bme680_rs::*;
|
||||||
|
@ -33,15 +35,32 @@ fn main() -> result::Result<(), Bme680Error<<hal::I2cdev as i2c::Read>::Error ,
|
||||||
DesiredSensorSettings::OSH_SEL |
|
DesiredSensorSettings::OSH_SEL |
|
||||||
DesiredSensorSettings::GAS_SENSOR_SEL;
|
DesiredSensorSettings::GAS_SENSOR_SEL;
|
||||||
|
|
||||||
let profile_dur = dev.get_profile_dur(&sensor_settings)?;
|
debug!("Settings {}", settings_sel.bits());
|
||||||
println!("Duration {}", profile_dur);
|
|
||||||
|
|
||||||
|
debug!("NBCONV_SEL {}", settings_sel == DesiredSensorSettings::NBCONV_SEL);
|
||||||
|
debug!("OSH_SEL {}", settings_sel == DesiredSensorSettings::OSH_SEL);
|
||||||
|
|
||||||
|
debug!("NBCONV_SEL {}", settings_sel.intersects(DesiredSensorSettings::NBCONV_SEL));
|
||||||
|
debug!("OSH_SEL {}", settings_sel.intersects(DesiredSensorSettings::OSH_SEL));
|
||||||
|
|
||||||
|
debug!("NBCONV_SEL {}", settings_sel.contains(DesiredSensorSettings::NBCONV_SEL));
|
||||||
|
debug!("OSH_SEL {}", settings_sel.contains(DesiredSensorSettings::OSH_SEL));
|
||||||
|
|
||||||
|
debug!("NBCONV_SEL {}", settings_sel & DesiredSensorSettings::NBCONV_SEL != DesiredSensorSettings::NBCONV_SEL);
|
||||||
|
debug!("OSH_SEL {}", settings_sel & DesiredSensorSettings::OSH_SEL != DesiredSensorSettings::OSH_SEL);
|
||||||
|
|
||||||
|
let profile_dur = dev.get_profile_dur(&sensor_settings)?;
|
||||||
|
info!("Duration {}", profile_dur);
|
||||||
|
info!("Setting sensor settings");
|
||||||
dev.set_sensor_settings(settings_sel, &sensor_settings)?;
|
dev.set_sensor_settings(settings_sel, &sensor_settings)?;
|
||||||
|
info!("Setting forced power modes");
|
||||||
dev.set_sensor_mode(PowerMode::ForcedMode)?;
|
dev.set_sensor_mode(PowerMode::ForcedMode)?;
|
||||||
|
|
||||||
thread::sleep(Duration::from_millis(profile_dur as u64));
|
loop {
|
||||||
|
thread::sleep(Duration::from_millis(profile_dur as u64));
|
||||||
let data = dev.get_sensor_data()?;
|
info!("Retrieving sensor data");
|
||||||
println!("Sensor Data {:?}", data);
|
let data = dev.get_sensor_data()?;
|
||||||
|
info!("Sensor Data {:?}", data);
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
45
src/lib.rs
45
src/lib.rs
|
@ -25,7 +25,7 @@ pub const BME680_COEFF_ADDR1_LEN: u8 = 25;
|
||||||
pub const BME680_COEFF_ADDR2_LEN: u8 = 16;
|
pub const BME680_COEFF_ADDR2_LEN: u8 = 16;
|
||||||
|
|
||||||
/** BME680 field_x related defines */
|
/** BME680 field_x related defines */
|
||||||
pub const BME680_FIELD_LENGTH: u8 = 15;
|
pub const BME680_FIELD_LENGTH: usize = 15;
|
||||||
pub const BME680_FIELD_ADDR_OFFSET: u8 = 17;
|
pub const BME680_FIELD_ADDR_OFFSET: u8 = 17;
|
||||||
|
|
||||||
pub const BME680_SOFT_RESET_CMD: u8 = 0xb6;
|
pub const BME680_SOFT_RESET_CMD: u8 = 0xb6;
|
||||||
|
@ -256,7 +256,7 @@ impl Clone for TphSett {
|
||||||
#[derive(Default, Copy)]
|
#[derive(Default, Copy)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct GasSett {
|
pub struct GasSett {
|
||||||
pub nb_conv: Option<u8>,
|
pub nb_conv: u8,
|
||||||
pub heatr_ctrl: Option<u8>,
|
pub heatr_ctrl: Option<u8>,
|
||||||
pub run_gas: Option<u8>,
|
pub run_gas: Option<u8>,
|
||||||
pub heatr_temp: Option<u16>,
|
pub heatr_temp: Option<u16>,
|
||||||
|
@ -384,17 +384,20 @@ fn boundary_check<I2C>(value: Option<u8>, min: u8, max: u8) -> Result<u8, <I2C a
|
||||||
let mut info_msg: InfoMsg = Default::default();
|
let mut info_msg: InfoMsg = Default::default();
|
||||||
|
|
||||||
// TODO give the nullptr here a different name
|
// TODO give the nullptr here a different name
|
||||||
let value = value.ok_or(Bme680Error::NulltPtr)?;
|
let value = value.unwrap();
|
||||||
|
|
||||||
if value < min {
|
if value < min {
|
||||||
|
error!("Boundary check failure max correction, {} < {}", value, min);
|
||||||
info_msg |= InfoMsg::MIN_CORRECTION;
|
info_msg |= InfoMsg::MIN_CORRECTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if value > max {
|
if value > max {
|
||||||
|
error!("Boundary check failure max correction, {} > {}", value, max);
|
||||||
info_msg |= InfoMsg::MAX_CORRECTION;
|
info_msg |= InfoMsg::MAX_CORRECTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if info_msg.is_empty() {
|
if !info_msg.is_empty() {
|
||||||
|
error!("Boundary check failure");
|
||||||
return Err(Bme680Error::BoundaryCheckFailure(info_msg, min, max));
|
return Err(Bme680Error::BoundaryCheckFailure(info_msg, min, max));
|
||||||
}
|
}
|
||||||
Ok(value)
|
Ok(value)
|
||||||
|
@ -441,6 +444,7 @@ where
|
||||||
tph_sett: Default::default(),
|
tph_sett: Default::default(),
|
||||||
gas_sett: Default::default(),
|
gas_sett: Default::default(),
|
||||||
};
|
};
|
||||||
|
info!("Finished device init");
|
||||||
Ok(dev)
|
Ok(dev)
|
||||||
} else {
|
} else {
|
||||||
error!("Device does not match chip id {}", BME680_CHIP_ID);
|
error!("Device does not match chip id {}", BME680_CHIP_ID);
|
||||||
|
@ -523,7 +527,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if desired_settings.contains(DesiredSensorSettings::OSP_SEL) {
|
if desired_settings.contains(DesiredSensorSettings::OSP_SEL) {
|
||||||
let tph_sett_os_pres = tph_sett.os_temp.ok_or(Bme680Error::NulltPtr)?;
|
let tph_sett_os_pres = tph_sett.os_temp.expect("OS TEMP");
|
||||||
data = (data as (i32) & !0x1ci32 | tph_sett_os_pres as (i32) << 2i32 & 0x1ci32)
|
data = (data as (i32) & !0x1ci32 | tph_sett_os_pres as (i32) << 2i32 & 0x1ci32)
|
||||||
as (u8);
|
as (u8);
|
||||||
}
|
}
|
||||||
|
@ -533,7 +537,7 @@ where
|
||||||
|
|
||||||
/* Selecting humidity oversampling for the sensor */
|
/* Selecting humidity oversampling for the sensor */
|
||||||
if desired_settings.contains(DesiredSensorSettings::OSH_SEL) {
|
if desired_settings.contains(DesiredSensorSettings::OSH_SEL) {
|
||||||
let tph_sett_os_hum = boundary_check::<I2C>(self.tph_sett.os_hum, 0, 5)?;
|
let tph_sett_os_hum = boundary_check::<I2C>(tph_sett.os_hum, 0, 5)?;
|
||||||
reg_addr = 0x72u8;
|
reg_addr = 0x72u8;
|
||||||
let mut data = I2CUtil::read_byte(&mut self.i2c, self.dev_id, reg_addr)?;
|
let mut data = I2CUtil::read_byte(&mut self.i2c, self.dev_id, reg_addr)?;
|
||||||
data = (data as (i32) & !0x7i32 | tph_sett_os_hum as (i32) & 0x7i32) as (u8);
|
data = (data as (i32) & !0x7i32 | tph_sett_os_hum as (i32) & 0x7i32) as (u8);
|
||||||
|
@ -554,7 +558,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if desired_settings.contains(DesiredSensorSettings::NBCONV_SEL) {
|
if desired_settings.contains(DesiredSensorSettings::NBCONV_SEL) {
|
||||||
let gas_sett_nb_conv = boundary_check::<I2C>(gas_sett.nb_conv, 0, 10)?;
|
let gas_sett_nb_conv = boundary_check::<I2C>(Some(gas_sett.nb_conv), 0, 10)?;
|
||||||
data = (data as (i32) & !0xfi32 | gas_sett_nb_conv as (i32) & 0xfi32) as (u8);
|
data = (data as (i32) & !0xfi32 | gas_sett_nb_conv as (i32) & 0xfi32) as (u8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -601,7 +605,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if desired_settings.contains(DesiredSensorSettings::RUN_GAS_SEL | DesiredSensorSettings::NBCONV_SEL) {
|
if desired_settings.contains(DesiredSensorSettings::RUN_GAS_SEL | DesiredSensorSettings::NBCONV_SEL) {
|
||||||
sensor_settings.gas_sett.nb_conv = Some((data_array[1usize] as (i32) & 0xfi32) as (u8));
|
sensor_settings.gas_sett.nb_conv = (data_array[1usize] as (i32) & 0xfi32) as (u8);
|
||||||
sensor_settings.gas_sett.run_gas =
|
sensor_settings.gas_sett.run_gas =
|
||||||
Some(((data_array[1usize] as (i32) & 0x10i32) >> 4i32) as (u8));
|
Some(((data_array[1usize] as (i32) & 0x10i32) >> 4i32) as (u8));
|
||||||
}
|
}
|
||||||
|
@ -679,20 +683,15 @@ where
|
||||||
tph_dur = tph_dur.wrapping_add(1u32);
|
tph_dur = tph_dur.wrapping_add(1u32);
|
||||||
let mut duration = tph_dur as (u16);
|
let mut duration = tph_dur as (u16);
|
||||||
if sensor_settings.gas_sett.run_gas.unwrap_or(0) != 0 {
|
if sensor_settings.gas_sett.run_gas.unwrap_or(0) != 0 {
|
||||||
duration = duration + sensor_settings.gas_sett.heatr_dur.ok_or(Bme680Error::NulltPtr)?;
|
duration = duration + sensor_settings.gas_sett.heatr_dur.expect("Heatrdur");
|
||||||
}
|
}
|
||||||
Ok(duration)
|
Ok(duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO remove
|
||||||
/// @returns (FieldData, IsNewFields)
|
/// @returns (FieldData, IsNewFields)
|
||||||
pub fn get_sensor_data(&mut self) -> Result<(FieldData, FieldDataState), <I2C as Read>::Error, <I2C as Write>::Error> {
|
pub fn get_sensor_data(&mut self) -> Result<(FieldData, FieldDataState), <I2C as Read>::Error, <I2C as Write>::Error> {
|
||||||
let field_data = self.read_field_data()?;
|
self.read_field_data()
|
||||||
if field_data.status & BME680_NEW_DATA_MSK != 0 {
|
|
||||||
// new fields
|
|
||||||
Ok((field_data, FieldDataState::NewData))
|
|
||||||
} else {
|
|
||||||
Ok((field_data, FieldDataState::NoNewData))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_calib_data<I2CX>(i2c:&mut I2CX, dev_id: u8) -> Result<CalibData, <I2CX as Read>::Error, <I2CX as Write>::Error>
|
fn get_calib_data<I2CX>(i2c:&mut I2CX, dev_id: u8) -> Result<CalibData, <I2CX as Read>::Error, <I2CX as Write>::Error>
|
||||||
|
@ -770,7 +769,7 @@ where
|
||||||
reg.push((BME680_RES_HEAT0_ADDR, self.calc_heater_res(gas_sett.heatr_temp.unwrap_or(0))));
|
reg.push((BME680_RES_HEAT0_ADDR, self.calc_heater_res(gas_sett.heatr_temp.unwrap_or(0))));
|
||||||
reg.push((BME680_GAS_WAIT0_ADDR, self.calc_heater_dur(gas_sett.heatr_dur.unwrap_or(0))));
|
reg.push((BME680_GAS_WAIT0_ADDR, self.calc_heater_dur(gas_sett.heatr_dur.unwrap_or(0))));
|
||||||
|
|
||||||
self.gas_sett.nb_conv = Some(0);
|
self.gas_sett.nb_conv = 0;
|
||||||
self.bme680_set_regs(reg.as_slice())
|
self.bme680_set_regs(reg.as_slice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -921,8 +920,10 @@ where
|
||||||
calc_gas_res
|
calc_gas_res
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_field_data(&mut self) -> Result<FieldData, <I2C as Read>::Error, <I2C as Write>::Error> {
|
fn read_field_data(&mut self) -> Result<(FieldData, FieldDataState), <I2C as Read>::Error, <I2C as Write>::Error> {
|
||||||
let mut buff = [0, BME680_FIELD_LENGTH];
|
let mut buff:[u8; BME680_FIELD_LENGTH] = [0; BME680_FIELD_LENGTH];
|
||||||
|
|
||||||
|
debug!("Buf {:?}, len: {}", buff, buff.len());
|
||||||
let mut data: FieldData = Default::default();
|
let mut data: FieldData = Default::default();
|
||||||
let mut gas_range: u8;
|
let mut gas_range: u8;
|
||||||
let mut adc_temp: u32;
|
let mut adc_temp: u32;
|
||||||
|
@ -934,6 +935,8 @@ where
|
||||||
loop {
|
loop {
|
||||||
I2CUtil::read_bytes(&mut self.i2c, self.dev_id, BME680_FIELD0_ADDR, &mut buff)?;
|
I2CUtil::read_bytes(&mut self.i2c, self.dev_id, BME680_FIELD0_ADDR, &mut buff)?;
|
||||||
|
|
||||||
|
debug!("Field data read {:?}, len: {}", buff, buff.len());
|
||||||
|
|
||||||
data.status = buff[0] & BME680_NEW_DATA_MSK;
|
data.status = buff[0] & BME680_NEW_DATA_MSK;
|
||||||
data.gas_index = buff[0] & BME680_GAS_INDEX_MSK;;
|
data.gas_index = buff[0] & BME680_GAS_INDEX_MSK;;
|
||||||
data.meas_index = buff[1];
|
data.meas_index = buff[1];
|
||||||
|
@ -955,7 +958,7 @@ where
|
||||||
data.pressure = self.calc_pressure(adc_pres);
|
data.pressure = self.calc_pressure(adc_pres);
|
||||||
data.humidity = self.calc_humidity(adc_hum);
|
data.humidity = self.calc_humidity(adc_hum);
|
||||||
data.gas_resistance = self.calc_gas_resistance(adc_gas_res, gas_range);
|
data.gas_resistance = self.calc_gas_resistance(adc_gas_res, gas_range);
|
||||||
return Ok(data);
|
return Ok((data, FieldDataState::NewData));
|
||||||
}
|
}
|
||||||
|
|
||||||
self.delay.delay_ms(BME680_POLL_PERIOD_MS);
|
self.delay.delay_ms(BME680_POLL_PERIOD_MS);
|
||||||
|
@ -965,6 +968,6 @@ where
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(Bme680Error::NoNewData)
|
Ok((data, FieldDataState::NoNewData))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue