BME280: Added static function declarations.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
parent
d1c07c0446
commit
b48b9fb2d8
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user