From b48b9fb2d80eee79ce03521fccd8633f8fa1964b Mon Sep 17 00:00:00 2001 From: Yilin Sun Date: Thu, 6 Jul 2023 23:58:42 +0800 Subject: [PATCH] BME280: Added static function declarations. Signed-off-by: Yilin Sun --- src/dht/dht_bme280.c | 249 ++++++++++++++++++++++--------------------- 1 file changed, 128 insertions(+), 121 deletions(-) diff --git a/src/dht/dht_bme280.c b/src/dht/dht_bme280.c index 7f82556..3e6eb00 100644 --- a/src/dht/dht_bme280.c +++ b/src/dht/dht_bme280.c @@ -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) {