BME280: Added static function declarations.
continuous-integration/drone/push Build is passing Details

Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
Yilin Sun 2023-07-06 23:58:42 +08:00
parent d1c07c0446
commit b48b9fb2d8
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
1 changed files with 128 additions and 121 deletions

View File

@ -96,6 +96,13 @@ static const ims_bme280_config_t ims_bme280_presets[] = {
},
};
static ims_ret_t ims_bme280_reset(ims_bme280_t *bme);
static ims_ret_t ims_bme280_read_trim_data(ims_bme280_t *bme);
static ims_ret_t ims_bme280_set_mode(ims_bme280_t *bme, ims_bme280_mode_t mode);
static ims_ret_t ims_bme_get_mode(ims_bme280_t *bme, ims_bme280_mode_t *mode);
static ims_ret_t ims_bme_wait_measure_complete(ims_bme280_t *bme, uint32_t timeout_ms);
static ims_ret_t ims_bme280_read_raw_data(ims_bme280_t *bme, uint32_t *raw_t, uint32_t *raw_p, uint32_t *raw_h);
static ims_ret_t ims_bme280_read_register(ims_bme280_t *bme, uint8_t reg, uint8_t *data, uint16_t len);
static ims_ret_t ims_bme280_write_register(ims_bme280_t *bme, uint8_t reg, uint8_t data);
@ -113,6 +120,127 @@ static uint32_t ims_bme280_compensate_H_int32(ims_bme280_t *bme, int32_t adc_H);
#endif
ims_ret_t ims_bme280_init(ims_bme280_t *bme) {
if (!bme) return IMS_FAIL;
if (ims_bme280_reset(bme) == IMS_FAIL) return IMS_FAIL;
bme->cb.delay(bme->pdev, 100);
if (ims_bme280_read_trim_data(bme) == IMS_FAIL) return IMS_FAIL;
return IMS_SUCCESS;
}
ims_ret_t ims_bme280_preset_config(ims_bme280_config_t *config, ims_bme280_mode_preset_t preset) {
if (preset >= IMS_BME280_PRESET_END) {
return IMS_FAIL;
}
memcpy(config, &ims_bme280_presets[preset], sizeof(ims_bme280_config_t));
return IMS_SUCCESS;
}
ims_ret_t ims_bme280_config(ims_bme280_t *bme, ims_bme280_config_t *config) {
ims_ret_t ret;
uint8_t reg_config = (config->filter << 0x02) | (config->t_sb << 0x05);
uint8_t reg_ctrl_measure = (uint8_t)((config->osrs_t << 0x05) | (config->osrs_p << 0x02) | config->mode);
uint8_t reg_ctrl_hum = config->osrs_h;
ims_bme280_mode_t mode;
ret = ims_bme_get_mode(bme, &mode);
if (ret != IMS_SUCCESS) return ret;
if (mode != IMS_BME280_MODE_SLEEP) {
ret = ims_bme280_set_mode(bme, IMS_BME280_MODE_SLEEP);
if (ret != IMS_SUCCESS) return ret;
}
ret = ims_bme280_write_register(bme, IMS_BME280_REG_CONFIG, reg_config);
if (ret != IMS_SUCCESS) return ret;
ret = ims_bme280_write_register(bme, IMS_BME280_REG_CTRL_HUM, reg_ctrl_hum);
if (ret != IMS_SUCCESS) return ret;
ret = ims_bme280_write_register(bme, IMS_BME280_REG_CTRL_MEAS, reg_ctrl_measure);
return ret;
}
ims_ret_t ims_bme280_read(ims_bme280_t *bme, ims_bme280_result_t *result) {
ims_ret_t ret;
uint32_t raw_P = 0x00;
uint32_t raw_T = 0x00;
uint32_t raw_H = 0x00;
ret = ims_bme280_read_raw_data(bme, &raw_T, &raw_P, &raw_H);
if (ret != IMS_SUCCESS) {
return ret;
}
#if IMS_CFG_DHT_BME280_ENABLE_FLOAT
result->temperature = ims_bme280_compensate_T_double(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_double(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_double(bme, (int32_t)raw_H);
#else
result->temperature = ims_bme280_compensate_T_int32(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_int64(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_int32(bme, (int32_t)raw_H);
#endif
return IMS_SUCCESS;
}
/**
* Force a new result to be sampled, or wait for a new result be available if the sensor is in NORMAL mode.
* @param bme
* @param result
* @return
*/
ims_ret_t ims_bme280_read_forced(ims_bme280_t *bme, ims_bme280_result_t *result) {
ims_ret_t ret;
uint32_t raw_P = 0x00;
uint32_t raw_T = 0x00;
uint32_t raw_H = 0x00;
ims_bme280_mode_t mode;
ret = ims_bme_get_mode(bme, &mode);
if (ret != IMS_SUCCESS) return ret;
/*
* If the sensor is in SLEEP mode, start a forced measurement;
* if the sensor is measuring or in NORMAL mode, wait for a new result to be sampled.
*/
if (mode == IMS_BME280_MODE_SLEEP) {
ret = ims_bme280_set_mode(bme, IMS_BME280_MODE_FORCED);
if (ret != IMS_SUCCESS) return ret;
}
ret = ims_bme_wait_measure_complete(bme, IMS_BME280_FORCED_TIMEOUT_MS);
if (ret != IMS_SUCCESS) {
return ret;
}
ret = ims_bme280_read_raw_data(bme, &raw_T, &raw_P, &raw_H);
if (ret != IMS_SUCCESS) {
return ret;
}
#if IMS_CFG_DHT_BME280_ENABLE_FLOAT
result->temperature = ims_bme280_compensate_T_double(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_double(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_double(bme, (int32_t)raw_H);
#else
result->temperature = ims_bme280_compensate_T_int32(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_int64(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_int32(bme, (int32_t)raw_H);
#endif
return IMS_SUCCESS;
}
static ims_ret_t ims_bme280_reset(ims_bme280_t *bme) {
return ims_bme280_write_register(bme, IMS_BME280_REG_RESET, IMS_BME280_CONST_RESET_MAGIC);
}
@ -263,51 +391,6 @@ static ims_ret_t ims_bme280_read_raw_data(ims_bme280_t *bme, uint32_t *raw_t, ui
return IMS_SUCCESS;
}
ims_ret_t ims_bme280_init(ims_bme280_t *bme) {
if (!bme) return IMS_FAIL;
if (ims_bme280_reset(bme) == IMS_FAIL) return IMS_FAIL;
bme->cb.delay(bme->pdev, 100);
if (ims_bme280_read_trim_data(bme) == IMS_FAIL) return IMS_FAIL;
return IMS_SUCCESS;
}
ims_ret_t ims_bme280_preset_config(ims_bme280_config_t *config, ims_bme280_mode_preset_t preset) {
if (preset >= IMS_BME280_PRESET_END) {
return IMS_FAIL;
}
memcpy(config, &ims_bme280_presets[preset], sizeof(ims_bme280_config_t));
return IMS_SUCCESS;
}
ims_ret_t ims_bme280_config(ims_bme280_t *bme, ims_bme280_config_t *config) {
ims_ret_t ret;
uint8_t reg_config = (config->filter << 0x02) | (config->t_sb << 0x05);
uint8_t reg_ctrl_measure = (uint8_t)((config->osrs_t << 0x05) | (config->osrs_p << 0x02) | config->mode);
uint8_t reg_ctrl_hum = config->osrs_h;
ims_bme280_mode_t mode;
ret = ims_bme_get_mode(bme, &mode);
if (ret != IMS_SUCCESS) return ret;
if (mode != IMS_BME280_MODE_SLEEP) {
ret = ims_bme280_set_mode(bme, IMS_BME280_MODE_SLEEP);
if (ret != IMS_SUCCESS) return ret;
}
ret = ims_bme280_write_register(bme, IMS_BME280_REG_CONFIG, reg_config);
if (ret != IMS_SUCCESS) return ret;
ret = ims_bme280_write_register(bme, IMS_BME280_REG_CTRL_HUM, reg_ctrl_hum);
if (ret != IMS_SUCCESS) return ret;
ret = ims_bme280_write_register(bme, IMS_BME280_REG_CTRL_MEAS, reg_ctrl_measure);
return ret;
}
static ims_ret_t ims_bme280_read_register(ims_bme280_t *bme, uint8_t reg, uint8_t *data, uint16_t len) {
ims_i2c_xfer_desc_t xfer_desc = {
.tx_size = 1U,
@ -331,82 +414,6 @@ static ims_ret_t ims_bme280_write_register(ims_bme280_t *bme, uint8_t reg, uint8
return bme->cb.i2c_xfer(bme->pdev, &xfer_desc);
}
ims_ret_t ims_bme280_read(ims_bme280_t *bme, ims_bme280_result_t *result) {
ims_ret_t ret;
uint32_t raw_P = 0x00;
uint32_t raw_T = 0x00;
uint32_t raw_H = 0x00;
ret = ims_bme280_read_raw_data(bme, &raw_T, &raw_P, &raw_H);
if (ret != IMS_SUCCESS) {
return ret;
}
#if IMS_CFG_DHT_BME280_ENABLE_FLOAT
result->temperature = ims_bme280_compensate_T_double(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_double(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_double(bme, (int32_t)raw_H);
#else
result->temperature = ims_bme280_compensate_T_int32(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_int64(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_int32(bme, (int32_t)raw_H);
#endif
return IMS_SUCCESS;
}
/**
* Force a new result to be sampled, or wait for a new result be available if the sensor is in NORMAL mode.
* @param bme
* @param result
* @return
*/
ims_ret_t ims_bme280_read_forced(ims_bme280_t *bme, ims_bme280_result_t *result) {
ims_ret_t ret;
uint32_t raw_P = 0x00;
uint32_t raw_T = 0x00;
uint32_t raw_H = 0x00;
ims_bme280_mode_t mode;
ret = ims_bme_get_mode(bme, &mode);
if (ret != IMS_SUCCESS) return ret;
/*
* If the sensor is in SLEEP mode, start a forced measurement;
* if the sensor is measuring or in NORMAL mode, wait for a new result to be sampled.
*/
if (mode == IMS_BME280_MODE_SLEEP) {
ret = ims_bme280_set_mode(bme, IMS_BME280_MODE_FORCED);
if (ret != IMS_SUCCESS) return ret;
}
ret = ims_bme_wait_measure_complete(bme, IMS_BME280_FORCED_TIMEOUT_MS);
if (ret != IMS_SUCCESS) {
return ret;
}
ret = ims_bme280_read_raw_data(bme, &raw_T, &raw_P, &raw_H);
if (ret != IMS_SUCCESS) {
return ret;
}
#if IMS_CFG_DHT_BME280_ENABLE_FLOAT
result->temperature = ims_bme280_compensate_T_double(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_double(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_double(bme, (int32_t)raw_H);
#else
result->temperature = ims_bme280_compensate_T_int32(bme, (int32_t)raw_T);
result->pressure = ims_bme280_compensate_P_int64(bme, (int32_t)raw_P);
result->humidity = ims_bme280_compensate_H_int32(bme, (int32_t)raw_H);
#endif
return IMS_SUCCESS;
}
#ifdef IMS_CFG_DHT_BME280_ENABLE_FLOAT
static double ims_bme280_compensate_T_double(ims_bme280_t *bme, int32_t adc_T) {