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 } |