diff --git a/examples/protocols/sddc/main/sddc_esp8266_example.c b/examples/protocols/sddc/main/sddc_esp8266_example.c index 2a11df83ad961816c1c9057efc3faf69d48badae..e4d156a8fc9eb79d6a33b2b18a47e8596bd721c3 100644 --- a/examples/protocols/sddc/main/sddc_esp8266_example.c +++ b/examples/protocols/sddc/main/sddc_esp8266_example.c @@ -28,6 +28,17 @@ #include "sddc.h" #include "cJSON.h" +#include "driver/gpio.h" +#include "tcpip_adapter.h" +#include "esp_smartconfig.h" +#include "smartconfig_ack.h" + +static EventGroupHandle_t wifi_event_group; +static const int CONNECTED_BIT = BIT0; +static const int ESPTOUCH_DONE_BIT = BIT1; +static const char *TAG = "sc"; +static int start_wifi_flag = 0; + /* * handle MESSAGE */ @@ -152,7 +163,7 @@ static char *esp8266_report_data_create(void) str = cJSON_Print(root); sddc_printf("REPORT DATA: %s\n", str); - + start_wifi_flag = 1; cJSON_Delete(root); return str; @@ -188,6 +199,127 @@ static char *esp8266_invite_data_create(void) return str; } +static void on_wifi_disconnect(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + system_event_sta_disconnected_t *event = (system_event_sta_disconnected_t *)event_data; + + ESP_LOGI(TAG, "Wi-Fi disconnected, trying to reconnect..."); + if (event->reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT) { + /*Switch to 802.11 bgn mode */ + esp_wifi_set_protocol(ESP_IF_WIFI_STA, WIFI_PROTOCAL_11B | WIFI_PROTOCAL_11G | WIFI_PROTOCAL_11N); + } +} + +static void on_got_ip(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); +} + +static void initialise_wifi(void) +{ + tcpip_adapter_init(); + wifi_event_group = xEventGroupCreate(); + ESP_ERROR_CHECK( esp_wifi_stop() ); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + + ESP_ERROR_CHECK( esp_wifi_init(&cfg) ); + + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &on_wifi_disconnect, NULL)); + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &on_got_ip, NULL)); + + ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK( esp_wifi_start() ); + ESP_ERROR_CHECK( esp_wifi_connect() ); +} + +static void sc_callback(smartconfig_status_t status, void *pdata) +{ + switch (status) { + case SC_STATUS_WAIT: + ESP_LOGI(TAG, "SC_STATUS_WAIT"); + break; + case SC_STATUS_FIND_CHANNEL: + ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL"); + break; + case SC_STATUS_GETTING_SSID_PSWD: + ESP_LOGI(TAG, "SC_STATUS_GETTING_SSID_PSWD"); + break; + case SC_STATUS_LINK: + ESP_LOGI(TAG, "SC_STATUS_LINK"); + wifi_config_t *wifi_config = pdata; + ESP_LOGI(TAG, "SSID:%s", wifi_config->sta.ssid); + ESP_LOGI(TAG, "PASSWORD:%s", wifi_config->sta.password); + ESP_ERROR_CHECK( esp_wifi_disconnect() ); + ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config) ); + ESP_ERROR_CHECK( esp_wifi_connect() ); + break; + case SC_STATUS_LINK_OVER: + ESP_LOGI(TAG, "SC_STATUS_LINK_OVER"); + if (pdata != NULL) { + sc_callback_data_t *sc_callback_data = (sc_callback_data_t *)pdata; + switch (sc_callback_data->type) { + case SC_ACK_TYPE_ESPTOUCH: + ESP_LOGI(TAG, "Phone ip: %d.%d.%d.%d", sc_callback_data->ip[0], sc_callback_data->ip[1], sc_callback_data->ip[2], sc_callback_data->ip[3]); + ESP_LOGI(TAG, "TYPE: ESPTOUCH"); + break; + case SC_ACK_TYPE_AIRKISS: + ESP_LOGI(TAG, "TYPE: AIRKISS"); + break; + default: + ESP_LOGE(TAG, "TYPE: ERROR"); + break; + } + } + xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT); + break; + default: + break; + } +} + +void smartconfig_example_task(void * parm) +{ + EventBits_t uxBits; + ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS) ); + ESP_ERROR_CHECK( esp_smartconfig_start(sc_callback) ); + while (1) { + uxBits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY); + if(uxBits & CONNECTED_BIT) { + ESP_LOGI(TAG, "WiFi Connected to ap"); + } + if(uxBits & ESPTOUCH_DONE_BIT) { + ESP_LOGI(TAG, "smartconfig over"); + esp_smartconfig_stop(); + vTaskDelete(NULL); + start_wifi_flag = 0; + } + } +} + +static void flash_key_gpio_task_example(void *arg) +{ + int i = 0; + while (1) { + vTaskDelay(1000 / portTICK_RATE_MS); + if (!gpio_get_level(0)) { + i++; + } else { + i = 0; + } + if (i > 3) { + i = 0; + sddc_printf("start smart config....\n"); + if (!start_wifi_flag) { + initialise_wifi(); + xTaskCreate(smartconfig_example_task, "smartconfig_example_task", 2048, NULL, 10, NULL); + start_wifi_flag = 1; + } + } + } +} + static void sddc_example_task(void *arg) { sddc_t *sddc; @@ -272,7 +404,7 @@ void app_main() ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); - + xTaskCreate(flash_key_gpio_task_example, "flash_key_gpio_task_example", 4096, NULL, 5, NULL); ESP_ERROR_CHECK(example_connect()); xTaskCreate(sddc_example_task, "sddc_example_task", 4096, NULL, 5, NULL);