Skip to content

Commit

Permalink
wip: proper bsec implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
aldwinhermanudin committed Dec 19, 2023
1 parent 355bfb6 commit 0ac279e
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 38 deletions.
155 changes: 121 additions & 34 deletions src/mbedos/test-bme688/source/bme688/BME688.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,34 +288,90 @@ BME688::SensorData BME688::GetLatest()
*
*/

// /**
// * @brief Set the BME68X sensor configuration to forced mode
// */
// void Bsec2::setBme68xConfigForced(void)
// {
// /* Set the filter, odr, temperature, pressure and humidity settings */
/**
* @brief Set the BME68X sensor configuration to forced mode
*/
BME688::ReturnCode BME688::SetBme68xConfigForced( const bsec_bme_settings_t &bsec_bme_conf )
{
ReturnCode status = ReturnCode::kError;

// sensor.setTPH(bmeConf.temperature_oversampling, bmeConf.pressure_oversampling, bmeConf.humidity_oversampling);
// Set the filter, odr, temperature, pressure and humidity settings */
status = SetTphOverSampling( bsec_bme_conf.temperature_oversampling,
bsec_bme_conf.pressure_oversampling,
bsec_bme_conf.humidity_oversampling );
if( status != ReturnCode::kOk )
{
return status;
}

// if (sensor.checkStatus() == BME68X_ERROR)
// return;
// set heater profile
status = SetHeaterProfile( bsec_bme_conf.heater_temperature,
bsec_bme_conf.heater_duration );
if( status != ReturnCode::kOk )
{
return status;
}

// set operation mode
status = SetOperationMode( BME68X_FORCED_MODE );
if( status != ReturnCode::kOk )
{
return status;
}

this->bsec_conf.op_mode = BME68X_FORCED_MODE;
return status;
}


/**
* @brief Set the BME68X sensor configuration to parallel mode
*/
BME688::ReturnCode BME688::SetBme68xConfigParallel( bsec_bme_settings_t& bsec_bme_conf )
{
uint16_t shared_heater_dur = 0;

ReturnCode status = ReturnCode::kError;

// Set the filter, odr, temperature, pressure and humidity settings */
status = SetTphOverSampling( bsec_bme_conf.temperature_oversampling,
bsec_bme_conf.pressure_oversampling,
bsec_bme_conf.humidity_oversampling );
if( status != ReturnCode::kOk )
{
return status;
}

// sensor.setHeaterProf(bmeConf.heater_temperature, bmeConf.heater_duration);
// calculate heater duration
shared_heater_dur = BSEC_TOTAL_HEAT_DUR - (GetMeasurementDuration(BME68X_PARALLEL_MODE) / INT64_C(1000));

// if (sensor.checkStatus() == BME68X_ERROR)
// return;
// set heater profile
status = SetHeaterProfile( bsec_bme_conf.heater_temperature_profile,
bsec_bme_conf.heater_duration_profile,
shared_heater_dur,
bsec_bme_conf.heater_profile_len );
if( status != ReturnCode::kOk )
{
return status;
}

// sensor.setOpMode(BME68X_FORCED_MODE);
// if (sensor.checkStatus() == BME68X_ERROR)
// return;
// set bme688 operation mode
status = SetOperationMode( BME68X_PARALLEL_MODE );
if( status != ReturnCode::kOk )
{
return status;
}

// opMode = BME68X_FORCED_MODE;
// }
this->bsec_conf.op_mode = BME68X_PARALLEL_MODE;
return status;
}

/**
* @brief Function to set the Temperature, Pressure and Humidity over-sampling
*/
BME688::ReturnCode BME688::SetTphOverSampling(uint8_t os_temp, uint8_t os_pres, uint8_t os_hum)
BME688::ReturnCode BME688::SetTphOverSampling( const uint8_t os_temp,
const uint8_t os_pres,
const uint8_t os_hum )
{
if( bme68x_get_conf(&bsec_conf.sensor_config, &bsec_conf.sensor_structure) == BME68X_OK )
{
Expand All @@ -325,34 +381,64 @@ BME688::ReturnCode BME688::SetTphOverSampling(uint8_t os_temp, uint8_t os_pres,
bsec_conf.sensor_config.os_temp = os_temp;
if( bme68x_set_conf(&bsec_conf.sensor_config, &bsec_conf.sensor_structure) == BME68X_OK )
{
return BME688::ReturnCode::kOk;
return ReturnCode::kOk;
}
}

return BME688::ReturnCode::kError;
return ReturnCode::kSensorConfigFail;
}

/**
* @brief Function to set the heater profile for Forced mode
*/
BME688::ReturnCode BME688::SetHeaterProfile(uint16_t temp, uint16_t dur)
BME688::ReturnCode BME688::SetHeaterProfile( const uint16_t temp,
const uint16_t dur )
{
bme68x_heatr_conf heater_conf
{
.enable = BME68X_ENABLE,
.heatr_temp = temp,
.heatr_dur = dur
};

bsec_conf.sensor_heater_config.enable = BME68X_ENABLE;
bsec_conf.sensor_heater_config.heatr_temp = temp;
bsec_conf.sensor_heater_config.heatr_dur = dur;
if( bme68x_set_heatr_conf(BME68X_FORCED_MODE, &bsec_conf.sensor_heater_config, &bsec_conf.sensor_structure) == BME68X_OK )
if( bme68x_set_heatr_conf(BME68X_FORCED_MODE, &heater_conf, &bsec_conf.sensor_structure) == BME68X_OK )
{
return BME688::ReturnCode::kOk;
return ReturnCode::kOk;
}

return BME688::ReturnCode::kSensorHeaterFail;
return ReturnCode::kSensorHeaterFail;
}

/**
* @brief Function to set the heater profile for Parallel mode
*/
BME688::ReturnCode BME688::SetHeaterProfile( uint16_t* const temp,
uint16_t* const mul,
const uint16_t shared_heater_dur,
const uint8_t profile_len )
{
bme68x_heatr_conf heater_conf
{
.enable = BME68X_ENABLE,
.heatr_temp_prof = temp,
.heatr_dur_prof = mul,
.shared_heatr_dur = shared_heater_dur,
.profile_len = profile_len
};

if( bme68x_set_heatr_conf( BME68X_PARALLEL_MODE, &heater_conf, &bsec_conf.sensor_structure) == BME68X_OK )
{
return ReturnCode::kOk;
}

return ReturnCode::kSensorHeaterFail;
}


/**
* @brief Function to set the operation mode
*/
BME688::ReturnCode BME688::SetOperationMode(uint8_t op_mode)
BME688::ReturnCode BME688::SetOperationMode(const uint8_t op_mode)
{
int8_t status = bme68x_set_op_mode(op_mode, &bsec_conf.sensor_structure);
if( (status == BME68X_OK) &&
Expand All @@ -363,22 +449,23 @@ BME688::ReturnCode BME688::SetOperationMode(uint8_t op_mode)

if( status == BME68X_OK )
{
return BME688::ReturnCode::kOk;
return ReturnCode::kOk;
}
return BME688::ReturnCode::kSensorSetOperationFail;
return ReturnCode::kSensorSetOperationFail;
}

/**
* @brief Function to get the measurement duration in microseconds
*/
uint32_t BME688::GetMeasurementDuration(uint8_t op_mode)
uint32_t BME688::GetMeasurementDuration(const uint8_t op_mode)
{
if (op_mode == BME68X_SLEEP_MODE)
uint8_t target_op_mode = op_mode;
if (target_op_mode == BME68X_SLEEP_MODE)
{
op_mode = this->bsec_conf.last_op_mode;
target_op_mode = this->bsec_conf.last_op_mode;
}

return bme68x_get_meas_dur(op_mode, &bsec_conf.sensor_config, &bsec_conf.sensor_structure);
return bme68x_get_meas_dur(target_op_mode, &bsec_conf.sensor_config, &bsec_conf.sensor_structure);
}

// Static function
Expand Down
20 changes: 16 additions & 4 deletions src/mbedos/test-bme688/source/bme688/BME688.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#define BME688_CHIP_ID_LOCATION 0xD0
#define BSEC_REQUESTED_VIRTUAL_SENSORS_NUMBER 4
#define BSEC_TEMPERATURE_OFFSET 7.0f
#define BSEC_TOTAL_HEAT_DUR UINT16_C(140)

class BME688{

Expand Down Expand Up @@ -53,6 +54,8 @@ class BME688{
uint8_t last_op_mode;

// bsec libray configuration
bsec_bme_settings_t bme_conf;
uint8_t op_mode; // current sensor operation mode
uint8_t data_fields;
bsec_sensor_configuration_t requested_virtual_sensors[4];
uint8_t number_required_sensor_settings;
Expand Down Expand Up @@ -90,16 +93,25 @@ class BME688{
ReturnCode InitialiseSensorFilterSettings();
ReturnCode InitialiseSensorHeaterSettings();
ReturnCode SetSequentialMode();
ReturnCode SetTphOverSampling(uint8_t os_temp, uint8_t os_pres, uint8_t os_hum);
ReturnCode SetOperationMode(uint8_t opMode);
ReturnCode SetHeaterProfile(uint16_t temp, uint16_t dur);
uint32_t GetMeasurementDuration(uint8_t op_mode);
ReturnCode SetTphOverSampling( const uint8_t os_temp,
const uint8_t os_pres,
const uint8_t os_hum );
ReturnCode SetOperationMode(const uint8_t op_mode);
ReturnCode SetHeaterProfile( const uint16_t temp,
const uint16_t dur );
ReturnCode SetHeaterProfile( uint16_t* const temp,
uint16_t* const mul,
const uint16_t sharedHeatrDur,
const uint8_t profileLen );
uint32_t GetMeasurementDuration(const uint8_t op_mode);

// BSEC specific method
ReturnCode InitialiseBsec();
ReturnCode UpdateSubscription();
ReturnCode ProcessData();
void BsecProcessing();
ReturnCode SetBme68xConfigForced( const bsec_bme_settings_t& bsec_bme_conf );
ReturnCode SetBme68xConfigParallel( bsec_bme_settings_t& bsec_bme_conf );
};


Expand Down

0 comments on commit 0ac279e

Please sign in to comment.