Thu, 13 Apr 2023 12:08:24 +0200
Version 0.4.0. Disable normal logging mqtt.
/** * @file task_bmp280.c * @brief The FreeRTOS task to query the BMP280 sensor. */ #include "config.h" static const char *TAG = "task_bmp280"; SemaphoreHandle_t xSemaphoreBMP280 = NULL; ///< Semaphore BMP280 task EventGroupHandle_t xEventGroupBMP280; ///< Events BMP280 task BMP280_State *bmp280_state; ///< Public state for other tasks extern bmp280_params_t bmp280_params; extern bmp280_t bmp280_dev; const int TASK_BMP280_REQUEST_DONE = BIT0; ///< All requests are done. const int TASK_BMP280_REQUEST_TB = BIT1; ///< Request Temperature and Barometer void request_bmp280(void) { xEventGroupClearBits(xEventGroupBMP280, TASK_BMP280_REQUEST_DONE); xEventGroupSetBits(xEventGroupBMP280, TASK_BMP280_REQUEST_TB); } bool ready_bmp280(void) { if (xEventGroupGetBits(xEventGroupBMP280) & TASK_BMP280_REQUEST_DONE) return true; return false; } /* * Task to read BMP280 sensor on request. */ void task_bmp280(void *pvParameter) { float pressure, temperature, humidity; int error = 0; ESP_LOGI(TAG, "Starting task BMP280 sda=%d scl=%d", CONFIG_I2C_MASTER_SDA, CONFIG_I2C_MASTER_SCL); bmp280_state = malloc(sizeof(BMP280_State)); bmp280_state->valid = false; bmp280_state->fake = (bmp280_dev.i2c_dev.addr == 0) ? true:false; bmp280_state->address = bmp280_dev.i2c_dev.addr; bmp280_state->error = BMP280_ERR_NONE; /* event handler and event group for this task */ xEventGroupBMP280 = xEventGroupCreate(); EventBits_t uxBits; /* * Task loop forever. */ ESP_LOGI(TAG, "Starting loop BMP280 sensor 0x%02x %d", bmp280_state->address, bmp280_state->fake); while (1) { uxBits = xEventGroupWaitBits(xEventGroupBMP280, TASK_BMP280_REQUEST_TB, pdFALSE, pdFALSE, portMAX_DELAY ); if (uxBits & TASK_BMP280_REQUEST_TB) { if (! bmp280_state->fake) { /* Real sensor is present */ error = bmp280_read_float(&bmp280_dev, &temperature, &pressure, &humidity); if (xSemaphoreTake(xSemaphoreBMP280, 25) == pdTRUE) { if (error == ESP_OK) { bmp280_state->error = BMP280_ERR_NONE; bmp280_state->valid = true; bmp280_state->temperature = temperature; bmp280_state->pressure = pressure; bmp280_state->humidity = humidity; } else { bmp280_state->error = BMP280_ERR_READ; bmp280_state->valid = false; bmp280_state->temperature = 0; bmp280_state->pressure = 0; bmp280_state->humidity = 0; } xSemaphoreGive(xSemaphoreBMP280); } } else { /* Use fake values */ if (xSemaphoreTake(xSemaphoreBMP280, 25) == pdTRUE) { bmp280_state->error = BMP280_ERR_NONE; bmp280_state->valid = true; bmp280_state->temperature = 21.23; bmp280_state->pressure = 101360; bmp280_state->humidity = 0; xSemaphoreGive(xSemaphoreBMP280); } } xEventGroupClearBits(xEventGroupBMP280, TASK_BMP280_REQUEST_TB); xEventGroupSetBits(xEventGroupBMP280, TASK_BMP280_REQUEST_DONE); #if 1 ESP_LOGI(TAG, " TB: %.3f C, %.1f hPa, error: %d", bmp280_state->temperature, bmp280_state->pressure / 100, bmp280_state->error); #endif } } }