--- a/main/co2meter.c Thu Sep 28 11:29:23 2023 +0200 +++ b/main/co2meter.c Tue Oct 03 17:24:06 2023 +0200 @@ -26,10 +26,15 @@ extern SemaphoreHandle_t xSemaphoreWiFi; extern WIFI_State *wifi_state; ///< WiFi state extern EventGroupHandle_t xEventGroupUser; +extern bool _wifi_ScanDone; +extern int8_t _wifi_RSSI; extern int count_pub; ///< Published MQTT messages in transit extern uint32_t AlarmTimer; ///< Alarm timer extern uint32_t err_connect; ///< Connect error counter +char hostname[32]; +char uuid[37]; + /** * @brief Main program entry @@ -39,7 +44,7 @@ esp_err_t ret; Main_Loop1 = ML1_INIT; - app_desc = esp_ota_get_app_description(); + app_desc = esp_app_get_description(); /* * event handler and event group for the user interface */ @@ -50,7 +55,7 @@ * Initialize NVS */ ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } @@ -113,10 +118,17 @@ /* * Read or create configuration */ - read_config(); +// unlink("/spiffs/config.conf"); +// read_config(); read_units(); vTaskDelay(500 / portTICK_PERIOD_MS); + uint8_t mac_addr[8] = {0}; + // Set the configured hostname for the dhcp client. + esp_efuse_mac_get_default(mac_addr); + sprintf(hostname, "co2meter-%02x%02x%02x", mac_addr[3], mac_addr[4], mac_addr[5]); + sprintf(uuid, "c0ffeeee-dead-beef-cafe-%02x%02x%02x%02x%02x%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + /* * Create FreeRTOS tasks */ @@ -127,13 +139,14 @@ xTaskCreate(&task_user, "task_user", 4096, NULL,10, &xTaskUser); xTaskCreate(&task_ds18b20, "task_ds18b20", 2560, NULL, 8, &xTaskDS18B20); xTaskCreate(&task_adc, "task_adc", 2560, NULL, 8, &xTaskADC); - esp_log_level_set("MQTT_CLIENT", ESP_LOG_ERROR); +// esp_log_level_set("MQTT_CLIENT", ESP_LOG_ERROR); xTaskCreate(&task_mqtt, "task_mqtt", 4096, NULL, 5, &xTaskMQTT); esp_log_level_set("wifi", ESP_LOG_ERROR); xTaskCreate(&task_wifi, "task_wifi", 4096, NULL, 3, &xTaskWifi); - vTaskDelay(10 / portTICK_PERIOD_MS); + int wait = 150; while (wait) { + vTaskDelay(100 / portTICK_PERIOD_MS); if (ready_WiFi()) { ESP_LOGI(TAG, "Online in %.1f seconds", (150 - wait) / 10.0); wait = 0; @@ -142,7 +155,6 @@ if (wait < 1) ESP_LOGE(TAG, "Timeout network connection"); } - vTaskDelay(100 / portTICK_PERIOD_MS); } /* @@ -156,16 +168,16 @@ while (1) { switch (Main_Loop1) { case ML1_INIT: - status_WiFi(); Main_Loop1 = ML1_CONNECT; request_ds18b20(); request_adc(); - AlarmTimer = 30; + AlarmTimer = 30 * 100; if (! ready_WiFi()) { /* If WiFi was lost, try a new connection */ ESP_LOGI(TAG, "Try WiFi restore"); request_WiFi(); err_connect++; } + ESP_LOGI(TAG, "Loop => ML1_CONNECT"); break; case ML1_CONNECT: @@ -175,6 +187,7 @@ if (! ready_mqtt()) connect_mqtt(true); } + ESP_LOGI(TAG, "Loop => ML1_MQTT_CONNECT"); break; case ML1_MQTT_CONNECT: @@ -250,12 +263,15 @@ ESP_LOGE(TAG, "ML1_MQTT_CONNECT write_units lock error"); } user_refresh(); + ESP_LOGI(TAG, "Loop => ML1_MQTT_WAITCON"); } break; case ML1_WAITCON: - if (ready_mqtt()) + if (ready_mqtt()) { Main_Loop1 = ML1_SEND; + ESP_LOGI(TAG, "Loop => ML1_SEND"); + } break; case ML1_SEND: @@ -263,22 +279,51 @@ publishUnits(); publishLogs(); Main_Loop1 = ML1_WAITACK; + ESP_LOGI(TAG, "Loop => ML1_WAITACK"); break; case ML1_WAITACK: if (count_pub == 0) { // Wait until all published messages are sent. + status_WiFi(); ESP_LOGD(TAG, "Main loop: Done, user busy: %s", user_busy() ? "true":"false"); - Main_Loop1 = ML1_DONE; + Main_Loop1 = ML1_STATUS; user_refresh(); + ESP_LOGI(TAG, "Loop => ML1_STATUS"); } break; + case ML1_STATUS: + /* + * If rssi is too low, scan for beter AP. + */ + if (_wifi_RSSI < CONFIG_ESP_WIFI_ROAMING_LEVEL) { + scan_WiFi(); + Main_Loop1 = ML1_SCAN; + ESP_LOGI(TAG, "Loop => ML1_SCAN"); + } else { + Main_Loop1 = ML1_DONE; + ESP_LOGI(TAG, "Loop => ML1_DONE"); + } + break; + + case ML1_SCAN: + if (_wifi_ScanDone == true) { + Main_Loop1 = ML1_DONE; + ESP_LOGI(TAG, "Loop => ML1_DONE"); + } + break; + case ML1_DONE: /* Wait here until the timer resets the loop */ - AlarmTimer = 0; + if (AlarmTimer == 0) { + Main_Loop1 = ML1_INIT; + ESP_LOGI(TAG, "Loop => ML1_INIT"); + } break; } vTaskDelay(10 / portTICK_PERIOD_MS); + if (AlarmTimer > 0) + AlarmTimer--; } Main_Loop1 = ML1_INIT;