main/co2meter.c

changeset 77
15dc572a7fcb
parent 74
34da2d2b12d5
child 78
e03d729aecb8
--- 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;

mercurial