Skip to content

Commit

Permalink
namespace clean-up and implement GetChipId
Browse files Browse the repository at this point in the history
  • Loading branch information
aldwinhermanudin committed Dec 30, 2023
1 parent 44befa1 commit a7a317a
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 56 deletions.
58 changes: 33 additions & 25 deletions src/mbedos/test-bme688/source/bme688/BME688.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

using namespace std::chrono;

namespace teapotlabs {
namespace sensors {
namespace bme688 {

// *********************************************************************
// SENSOR STATIC CALLBACK FORWARD DECLARATION
// *********************************************************************
Expand All @@ -29,14 +33,14 @@ BME688::BME688( PinName i2c_sda, PinName i2c_scl, uint32_t bme688_addr ):bsec({0
this->callback = nullptr;
}

BME688::ReturnCode BME688::Initialise( bsec_virtual_sensor_t sensor_list[], uint8_t n_sensors, float sample_rate )
ReturnCode BME688::Initialise( bsec_virtual_sensor_t* sensor_list, uint8_t n_sensors, float sample_rate )
{
/* enable I2C */
I2C i2c_temp( i2c_sda, i2c_scl ); // will be freed after function return
this->i2c_local = &i2c_temp; // set i2c object for bsec to use, see SensorInternalWriteRegisterCb and SensorInternalReadRegisterCb
Defer<I2C*> i2c_defer( this->i2c_local, nullptr ); // defer changing i2c_local to nullptr at function return

BME688::ReturnCode result;
ReturnCode result;

/* copy virtual sensor list and sample rate */
this->bsec.sample_rate = sample_rate;
Expand Down Expand Up @@ -71,7 +75,7 @@ BME688::ReturnCode BME688::Initialise( bsec_virtual_sensor_t sensor_list[], uint
return ReturnCode::kOk;
}

BME688::ReturnCode BME688::SetCallback( Callback cb )
ReturnCode BME688::SetCallback( Callback cb )
{
if( cb == nullptr )
{
Expand All @@ -82,7 +86,7 @@ BME688::ReturnCode BME688::SetCallback( Callback cb )
return ReturnCode::kOk;
}

BME688::ReturnCode BME688::SetTemperatureOffset( const float temp_offset )
ReturnCode BME688::SetTemperatureOffset( const float temp_offset )
{
this->bsec.temperature_offset = temp_offset;
return ReturnCode::kOk;
Expand All @@ -91,7 +95,7 @@ BME688::ReturnCode BME688::SetTemperatureOffset( const float temp_offset )
/**
* @brief Callback from the user to read data from the BME68X using parallel mode/forced mode, process and store outputs
*/
BME688::ReturnCode BME688::Run(void)
ReturnCode BME688::Run(void)
{
/* enable I2C */
I2C i2c_temp( i2c_sda, i2c_scl ); // will be freed after function return
Expand Down Expand Up @@ -182,7 +186,7 @@ bsec_library_return_t BME688::GetLastBsecCallStatus()
// PRIVATE
// *********************************************************************

BME688::ReturnCode BME688::InitialiseSensor()
ReturnCode BME688::InitialiseSensor()
{
sensor.dev.intf_ptr = this;
sensor.dev.intf = BME68X_I2C_INTF;
Expand All @@ -194,22 +198,22 @@ BME688::ReturnCode BME688::InitialiseSensor()
this->sensor.status = bme68x_init(&sensor.dev);
if( this->sensor.status != BME68X_OK )
{
return BME688::ReturnCode::kSensorInitFail;
return ReturnCode::kSensorInitFail;
}
return BME688::ReturnCode::kOk;
return ReturnCode::kOk;
}

BME688::ReturnCode BME688::InitialiseBsec()
ReturnCode BME688::InitialiseBsec()
{
this->bsec.status = bsec_init();
if( this->bsec.status != BSEC_OK )
{
return BME688::ReturnCode::kBsecInitFail;
return ReturnCode::kBsecInitFail;
}
return BME688::ReturnCode::kOk;
return ReturnCode::kOk;
}

BME688::ReturnCode BME688::UpdateSubscription(bsec_virtual_sensor_t* sensor_list, uint8_t n_sensors, float sample_rate)
ReturnCode BME688::UpdateSubscription(bsec_virtual_sensor_t* sensor_list, uint8_t n_sensors, float sample_rate)
{
bsec_sensor_configuration_t virtual_sensors[BSEC_NUMBER_OUTPUTS];
bsec_sensor_configuration_t sensor_settings[BSEC_MAX_PHYSICAL_SENSOR];
Expand Down Expand Up @@ -241,7 +245,7 @@ int64_t BME688::GetNextRunTimeNs(){
/**
* @brief Set the BME68X sensor configuration to forced mode
*/
BME688::ReturnCode BME688::SetSensorToForcedMode( const bsec_bme_settings_t &conf )
ReturnCode BME688::SetSensorToForcedMode( const bsec_bme_settings_t &conf )
{
ReturnCode status = ReturnCode::kError;

Expand Down Expand Up @@ -277,7 +281,7 @@ BME688::ReturnCode BME688::SetSensorToForcedMode( const bsec_bme_settings_t &con
/**
* @brief Set the BME68X sensor configuration to parallel mode
*/
BME688::ReturnCode BME688::SetSensorToParallelMode( const bsec_bme_settings_t& conf )
ReturnCode BME688::SetSensorToParallelMode( const bsec_bme_settings_t& conf )
{
uint16_t shared_heater_dur = 0;

Expand All @@ -293,7 +297,7 @@ BME688::ReturnCode BME688::SetSensorToParallelMode( const bsec_bme_settings_t& c
}

// calculate heater duration
shared_heater_dur = BSEC_TOTAL_HEAT_DUR - (GetSensorMeasurementDuration(BME68X_PARALLEL_MODE) / INT64_C(1000));
shared_heater_dur = kBsecTotalHeatDur - (GetSensorMeasurementDuration(BME68X_PARALLEL_MODE) / INT64_C(1000));

// set heater profile
status = SetSensorHeaterProfile( (uint16_t*) conf.heater_temperature_profile,
Expand All @@ -319,7 +323,7 @@ BME688::ReturnCode BME688::SetSensorToParallelMode( const bsec_bme_settings_t& c
/**
* @brief Function to set the Temperature, Pressure and Humidity over-sampling
*/
BME688::ReturnCode BME688::SetSensorTphOverSampling( const uint8_t os_temp,
ReturnCode BME688::SetSensorTphOverSampling( const uint8_t os_temp,
const uint8_t os_pres,
const uint8_t os_hum )
{
Expand All @@ -343,7 +347,7 @@ BME688::ReturnCode BME688::SetSensorTphOverSampling( const uint8_t os_temp,
/**
* @brief Function to set the heater profile for Forced mode
*/
BME688::ReturnCode BME688::SetSensorHeaterProfile( const uint16_t temp,
ReturnCode BME688::SetSensorHeaterProfile( const uint16_t temp,
const uint16_t dur )
{
bme68x_heatr_conf heater_conf
Expand All @@ -365,7 +369,7 @@ BME688::ReturnCode BME688::SetSensorHeaterProfile( const uint16_t temp,
/**
* @brief Function to set the heater profile for Parallel mode
*/
BME688::ReturnCode BME688::SetSensorHeaterProfile( uint16_t* const temp,
ReturnCode BME688::SetSensorHeaterProfile( uint16_t* const temp,
uint16_t* const mul,
const uint16_t shared_heater_dur,
const uint8_t profile_len )
Expand All @@ -392,7 +396,7 @@ BME688::ReturnCode BME688::SetSensorHeaterProfile( uint16_t* const temp,
/**
* @brief Function to set the operation mode
*/
BME688::ReturnCode BME688::SetSensorOperationMode(const uint8_t op_mode)
ReturnCode BME688::SetSensorOperationMode(const uint8_t op_mode)
{
this->sensor.status = bme68x_set_op_mode(op_mode, &sensor.dev);
if( this->sensor.status == BME68X_OK &&
Expand Down Expand Up @@ -425,7 +429,7 @@ uint32_t BME688::GetSensorMeasurementDuration(const uint8_t op_mode)
/**
* @brief Function to fetch data from the sensor into the local buffer
*/
BME688::ReturnCode BME688::FetchSensorData( Bme688FetchedData &data_out )
ReturnCode BME688::FetchSensorData( Bme688FetchedData &data_out )
{
data_out.n_fields = 0;
data_out.i_fields = 0;
Expand Down Expand Up @@ -480,7 +484,7 @@ uint8_t BME688::GetSensorData( Bme688FetchedData &data_in,
/**
* @brief Reads data from the BME68X sensor and process it
*/
BME688::ReturnCode BME688::ProcessData(const int64_t curr_time_ns, const bme68x_data &data)
ReturnCode BME688::ProcessData(const int64_t curr_time_ns, const bme68x_data &data)
{
bsec_input_t inputs[BSEC_MAX_PHYSICAL_SENSOR]; /* Temp, Pres, Hum & Gas */
uint8_t n_inputs = 0;
Expand Down Expand Up @@ -564,14 +568,14 @@ BME688::ReturnCode BME688::ProcessData(const int64_t curr_time_ns, const bme68x_
return ReturnCode::kOk;
}

BME688::ReturnCode BME688::GetChipId( uint8_t& chip_id_out )
ReturnCode BME688::GetChipId( uint8_t& chip_id_out )
{
// TODO: implement chip id read
return ReturnCode::kOk;
return ReadRegister( kBme688ChipIdAddr, &chip_id_out, 1 );
}

BME688::ReturnCode BME688::ReadRegister( uint8_t reg_addr, uint8_t* reg_data, uint32_t length )
ReturnCode BME688::ReadRegister( const uint8_t reg_addr, uint8_t* const reg_data, uint32_t length )
{
// re-use static function from bme68x_init()
if( SensorInternalReadRegisterCb( reg_addr, reg_data, length, this ) != 0 )
{
return ReturnCode::kSensorReadRegisterFail;
Expand Down Expand Up @@ -645,4 +649,8 @@ static void SensorInternalDelayUsCb(uint32_t time_us, void *intf_ptr)
wait_us ( time_us );
}

} // namespace bme688
} // namespace sensors
} // namespace teapotlabs


66 changes: 38 additions & 28 deletions src/mbedos/test-bme688/source/bme688/BME688.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,36 +7,41 @@
#include "bsec_datatypes.h"
#include "bsec_interface.h"

#define BME688_CHIP_ID_ADDR 0xD0
#define BSEC_TOTAL_HEAT_DUR UINT16_C(140)
namespace teapotlabs {
namespace sensors {
namespace bme688 {

/* defining constexpr in header might not be the best way to replace macro */
constexpr uint8_t kBme688ChipIdAddr = 0xD0;
constexpr uint16_t kBsecTotalHeatDur = UINT16_C(140);

enum class ReturnCode
{
// success code
kOk = 0,
// error code
kError,
kSensorStructureFail,
kSensorConfigFail,
kSensorHeaterFail,
kSensorSetOperationFail,
kSensorOperationSeqFail,
kSensorBsecFail,
kSensorBsecSubscriptionFail,
kSensorBsecProcessFail,
kSensorGetDataFail,
kBsecInitFail,
kBsecRunFail,
kSensorInitFail,
kNullPointer,
kSensorReadRegisterFail
};

using Callback = void (*)( const bme68x_data data, bsec_output_t* const outputs, const uint8_t n_outputs );

class BME688{

// enum and struct definition
public:
enum class ReturnCode
{
// success code
kOk = 0,
// error code
kError,
kSensorStructureFail,
kSensorConfigFail,
kSensorHeaterFail,
kSensorSetOperationFail,
kSensorOperationSeqFail,
kSensorBsecFail,
kSensorBsecSubscriptionFail,
kSensorBsecProcessFail,
kSensorGetDataFail,
kBsecInitFail,
kBsecRunFail,
kSensorInitFail,
kNullPointer,
kSensorReadRegisterFail
};

using Callback = void (*)( const bme68x_data data, bsec_output_t* const outputs, const uint8_t n_outputs );

/* Stores the version of the BSEC algorithm */
bsec_version_t version;
Expand All @@ -57,7 +62,7 @@ class BME688{
* @param sample_rate : The sample rate of requested sensors
* @return ReturnCode::kOk if everything initialized correctly
*/
ReturnCode Initialise( bsec_virtual_sensor_t sensor_list[], uint8_t n_sensors, float sample_rate );
ReturnCode Initialise( bsec_virtual_sensor_t* sensor_list, uint8_t n_sensors, float sample_rate );
ReturnCode SetCallback( Callback cb );
ReturnCode SetTemperatureOffset( const float temp_offset );
int64_t GetNextRunTimeNs();
Expand All @@ -66,6 +71,8 @@ class BME688{
bsec_library_return_t GetLastBsecCallStatus();

private:

// enum and struct definition
struct Bme688FetchedData
{
bme68x_data data[3];
Expand Down Expand Up @@ -126,9 +133,12 @@ class BME688{
ReturnCode ProcessData( const int64_t curr_time_ns, const bme68x_data &data );


ReturnCode ReadRegister( const uint8_t reg_addr, uint8_t* const reg_data, uint32_t length );
ReturnCode GetChipId( uint8_t& chip_id_out );
ReturnCode ReadRegister( uint8_t reg_addr, uint8_t* reg_data, uint32_t length );
};

} // bme688
} // namespace sensors
} // namespace teapotlabs

#endif
8 changes: 5 additions & 3 deletions src/mbedos/test-bme688/source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ mbed::DigitalOut led0(PA_15);
mbed::DigitalOut led1(PA_1);
#endif

using namespace teapotlabs::sensors::bme688;

static void data_available( const bme68x_data data, bsec_output_t* const outputs, const uint8_t n_outputs )
{
if (!n_outputs)
Expand Down Expand Up @@ -85,8 +87,8 @@ int main()
// for Ultra-Low Power mode, refreshed every 300s
auto sample_rate = BSEC_SAMPLE_RATE_ULP;

BME688::ReturnCode result = iaq_sensor.Initialise( sensor_list, ARRAY_LEN(sensor_list), sample_rate );
if( result != BME688::ReturnCode::kOk )
ReturnCode result = iaq_sensor.Initialise( sensor_list, ARRAY_LEN(sensor_list), sample_rate );
if( result != ReturnCode::kOk )
{
while( true )
{
Expand All @@ -104,7 +106,7 @@ int main()
{
// get measurement
result = iaq_sensor.Run();
if( result != BME688::ReturnCode::kOk )
if( result != ReturnCode::kOk )
{
printf("fail to call bsec run(), err: %d \n\r", result);
}
Expand Down

0 comments on commit a7a317a

Please sign in to comment.