main/co2meter.c

changeset 77
15dc572a7fcb
parent 74
34da2d2b12d5
child 78
e03d729aecb8
equal deleted inserted replaced
76:0432d9147682 77:15dc572a7fcb
24 extern ADC_State *adc_state; ///< ADC state 24 extern ADC_State *adc_state; ///< ADC state
25 extern SemaphoreHandle_t xSemaphoreADC; ///< ADC lock semaphore 25 extern SemaphoreHandle_t xSemaphoreADC; ///< ADC lock semaphore
26 extern SemaphoreHandle_t xSemaphoreWiFi; 26 extern SemaphoreHandle_t xSemaphoreWiFi;
27 extern WIFI_State *wifi_state; ///< WiFi state 27 extern WIFI_State *wifi_state; ///< WiFi state
28 extern EventGroupHandle_t xEventGroupUser; 28 extern EventGroupHandle_t xEventGroupUser;
29 extern bool _wifi_ScanDone;
30 extern int8_t _wifi_RSSI;
29 extern int count_pub; ///< Published MQTT messages in transit 31 extern int count_pub; ///< Published MQTT messages in transit
30 extern uint32_t AlarmTimer; ///< Alarm timer 32 extern uint32_t AlarmTimer; ///< Alarm timer
31 extern uint32_t err_connect; ///< Connect error counter 33 extern uint32_t err_connect; ///< Connect error counter
34
35 char hostname[32];
36 char uuid[37];
32 37
33 38
34 /** 39 /**
35 * @brief Main program entry 40 * @brief Main program entry
36 */ 41 */
37 void app_main() 42 void app_main()
38 { 43 {
39 esp_err_t ret; 44 esp_err_t ret;
40 45
41 Main_Loop1 = ML1_INIT; 46 Main_Loop1 = ML1_INIT;
42 app_desc = esp_ota_get_app_description(); 47 app_desc = esp_app_get_description();
43 /* 48 /*
44 * event handler and event group for the user interface 49 * event handler and event group for the user interface
45 */ 50 */
46 xEventGroupUser = xEventGroupCreate(); 51 xEventGroupUser = xEventGroupCreate();
47 user_cold(); 52 user_cold();
48 53
49 /* 54 /*
50 * Initialize NVS 55 * Initialize NVS
51 */ 56 */
52 ret = nvs_flash_init(); 57 ret = nvs_flash_init();
53 if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { 58 if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
54 ESP_ERROR_CHECK(nvs_flash_erase()); 59 ESP_ERROR_CHECK(nvs_flash_erase());
55 ret = nvs_flash_init(); 60 ret = nvs_flash_init();
56 } 61 }
57 ESP_ERROR_CHECK(ret); 62 ESP_ERROR_CHECK(ret);
58 63
111 #endif 116 #endif
112 117
113 /* 118 /*
114 * Read or create configuration 119 * Read or create configuration
115 */ 120 */
116 read_config(); 121 // unlink("/spiffs/config.conf");
122 // read_config();
117 read_units(); 123 read_units();
118 vTaskDelay(500 / portTICK_PERIOD_MS); 124 vTaskDelay(500 / portTICK_PERIOD_MS);
125
126 uint8_t mac_addr[8] = {0};
127 // Set the configured hostname for the dhcp client.
128 esp_efuse_mac_get_default(mac_addr);
129 sprintf(hostname, "co2meter-%02x%02x%02x", mac_addr[3], mac_addr[4], mac_addr[5]);
130 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]);
119 131
120 /* 132 /*
121 * Create FreeRTOS tasks 133 * Create FreeRTOS tasks
122 */ 134 */
123 xSemaphoreDS18B20 = xSemaphoreCreateMutex(); 135 xSemaphoreDS18B20 = xSemaphoreCreateMutex();
125 xSemaphoreUnits = xSemaphoreCreateMutex(); 137 xSemaphoreUnits = xSemaphoreCreateMutex();
126 138
127 xTaskCreate(&task_user, "task_user", 4096, NULL,10, &xTaskUser); 139 xTaskCreate(&task_user, "task_user", 4096, NULL,10, &xTaskUser);
128 xTaskCreate(&task_ds18b20, "task_ds18b20", 2560, NULL, 8, &xTaskDS18B20); 140 xTaskCreate(&task_ds18b20, "task_ds18b20", 2560, NULL, 8, &xTaskDS18B20);
129 xTaskCreate(&task_adc, "task_adc", 2560, NULL, 8, &xTaskADC); 141 xTaskCreate(&task_adc, "task_adc", 2560, NULL, 8, &xTaskADC);
130 esp_log_level_set("MQTT_CLIENT", ESP_LOG_ERROR); 142 // esp_log_level_set("MQTT_CLIENT", ESP_LOG_ERROR);
131 xTaskCreate(&task_mqtt, "task_mqtt", 4096, NULL, 5, &xTaskMQTT); 143 xTaskCreate(&task_mqtt, "task_mqtt", 4096, NULL, 5, &xTaskMQTT);
132 esp_log_level_set("wifi", ESP_LOG_ERROR); 144 esp_log_level_set("wifi", ESP_LOG_ERROR);
133 xTaskCreate(&task_wifi, "task_wifi", 4096, NULL, 3, &xTaskWifi); 145 xTaskCreate(&task_wifi, "task_wifi", 4096, NULL, 3, &xTaskWifi);
134 vTaskDelay(10 / portTICK_PERIOD_MS); 146
135 int wait = 150; 147 int wait = 150;
136 while (wait) { 148 while (wait) {
149 vTaskDelay(100 / portTICK_PERIOD_MS);
137 if (ready_WiFi()) { 150 if (ready_WiFi()) {
138 ESP_LOGI(TAG, "Online in %.1f seconds", (150 - wait) / 10.0); 151 ESP_LOGI(TAG, "Online in %.1f seconds", (150 - wait) / 10.0);
139 wait = 0; 152 wait = 0;
140 } else { 153 } else {
141 wait--; 154 wait--;
142 if (wait < 1) 155 if (wait < 1)
143 ESP_LOGE(TAG, "Timeout network connection"); 156 ESP_LOGE(TAG, "Timeout network connection");
144 } 157 }
145 vTaskDelay(100 / portTICK_PERIOD_MS);
146 } 158 }
147 159
148 /* 160 /*
149 * Main application loop. 161 * Main application loop.
150 */ 162 */
154 166
155 /* Measure process */ 167 /* Measure process */
156 while (1) { 168 while (1) {
157 switch (Main_Loop1) { 169 switch (Main_Loop1) {
158 case ML1_INIT: 170 case ML1_INIT:
159 status_WiFi();
160 Main_Loop1 = ML1_CONNECT; 171 Main_Loop1 = ML1_CONNECT;
161 request_ds18b20(); 172 request_ds18b20();
162 request_adc(); 173 request_adc();
163 AlarmTimer = 30; 174 AlarmTimer = 30 * 100;
164 if (! ready_WiFi()) { /* If WiFi was lost, try a new connection */ 175 if (! ready_WiFi()) { /* If WiFi was lost, try a new connection */
165 ESP_LOGI(TAG, "Try WiFi restore"); 176 ESP_LOGI(TAG, "Try WiFi restore");
166 request_WiFi(); 177 request_WiFi();
167 err_connect++; 178 err_connect++;
168 } 179 }
180 ESP_LOGI(TAG, "Loop => ML1_CONNECT");
169 break; 181 break;
170 182
171 case ML1_CONNECT: 183 case ML1_CONNECT:
172 if (ready_WiFi()) { 184 if (ready_WiFi()) {
173 Main_Loop1 = ML1_MQTT_CONNECT; 185 Main_Loop1 = ML1_MQTT_CONNECT;
174 user_refresh(); 186 user_refresh();
175 if (! ready_mqtt()) 187 if (! ready_mqtt())
176 connect_mqtt(true); 188 connect_mqtt(true);
177 } 189 }
190 ESP_LOGI(TAG, "Loop => ML1_MQTT_CONNECT");
178 break; 191 break;
179 192
180 case ML1_MQTT_CONNECT: 193 case ML1_MQTT_CONNECT:
181 if (ready_ds18b20() && ready_adc()) { 194 if (ready_ds18b20() && ready_adc()) {
182 Main_Loop1 = ML1_WAITCON; 195 Main_Loop1 = ML1_WAITCON;
248 xSemaphoreGive(xSemaphoreUnits); 261 xSemaphoreGive(xSemaphoreUnits);
249 } else { 262 } else {
250 ESP_LOGE(TAG, "ML1_MQTT_CONNECT write_units lock error"); 263 ESP_LOGE(TAG, "ML1_MQTT_CONNECT write_units lock error");
251 } 264 }
252 user_refresh(); 265 user_refresh();
266 ESP_LOGI(TAG, "Loop => ML1_MQTT_WAITCON");
253 } 267 }
254 break; 268 break;
255 269
256 case ML1_WAITCON: 270 case ML1_WAITCON:
257 if (ready_mqtt()) 271 if (ready_mqtt()) {
258 Main_Loop1 = ML1_SEND; 272 Main_Loop1 = ML1_SEND;
273 ESP_LOGI(TAG, "Loop => ML1_SEND");
274 }
259 break; 275 break;
260 276
261 case ML1_SEND: 277 case ML1_SEND:
262 publishNode(); 278 publishNode();
263 publishUnits(); 279 publishUnits();
264 publishLogs(); 280 publishLogs();
265 Main_Loop1 = ML1_WAITACK; 281 Main_Loop1 = ML1_WAITACK;
282 ESP_LOGI(TAG, "Loop => ML1_WAITACK");
266 break; 283 break;
267 284
268 case ML1_WAITACK: 285 case ML1_WAITACK:
269 if (count_pub == 0) { // Wait until all published messages are sent. 286 if (count_pub == 0) { // Wait until all published messages are sent.
287 status_WiFi();
270 ESP_LOGD(TAG, "Main loop: Done, user busy: %s", user_busy() ? "true":"false"); 288 ESP_LOGD(TAG, "Main loop: Done, user busy: %s", user_busy() ? "true":"false");
289 Main_Loop1 = ML1_STATUS;
290 user_refresh();
291 ESP_LOGI(TAG, "Loop => ML1_STATUS");
292 }
293 break;
294
295 case ML1_STATUS:
296 /*
297 * If rssi is too low, scan for beter AP.
298 */
299 if (_wifi_RSSI < CONFIG_ESP_WIFI_ROAMING_LEVEL) {
300 scan_WiFi();
301 Main_Loop1 = ML1_SCAN;
302 ESP_LOGI(TAG, "Loop => ML1_SCAN");
303 } else {
271 Main_Loop1 = ML1_DONE; 304 Main_Loop1 = ML1_DONE;
272 user_refresh(); 305 ESP_LOGI(TAG, "Loop => ML1_DONE");
273 } 306 }
274 break; 307 break;
308
309 case ML1_SCAN:
310 if (_wifi_ScanDone == true) {
311 Main_Loop1 = ML1_DONE;
312 ESP_LOGI(TAG, "Loop => ML1_DONE");
313 }
314 break;
275 315
276 case ML1_DONE: 316 case ML1_DONE:
277 /* Wait here until the timer resets the loop */ 317 /* Wait here until the timer resets the loop */
278 AlarmTimer = 0; 318 if (AlarmTimer == 0) {
319 Main_Loop1 = ML1_INIT;
320 ESP_LOGI(TAG, "Loop => ML1_INIT");
321 }
279 break; 322 break;
280 } 323 }
281 vTaskDelay(10 / portTICK_PERIOD_MS); 324 vTaskDelay(10 / portTICK_PERIOD_MS);
325 if (AlarmTimer > 0)
326 AlarmTimer--;
282 } 327 }
283 328
284 Main_Loop1 = ML1_INIT; 329 Main_Loop1 = ML1_INIT;
285 } 330 }
286 } 331 }

mercurial