/****************************************************************************** * FunctionName : esptouch_FailCb * Description : esp-touch fail callback *******************************************************************************/ void ICACHE_FLASH_ATTR esptouch_FailCb(void* data) { wifi_station_disconnect(); smartconfig_stop(); //wifi_set_opmode(STATIONAP_MODE); SC_INFO("ESP-TOUCH FAIL \r\n"); os_timer_disarm(&esptouch_tout_t); #if LIGHT_DEVICE light_shadeStart(HINT_RED,2000,0,1,NULL); #endif SC_INFO("ENABLE LIGHT ACTION(ESP-NOW)"); os_printf("debug: channel:%d\r\n",wifi_get_channel()); #if ESP_NOW_SUPPORT light_EspnowInit(); #endif #if ESP_MESH_SUPPORT SC_INFO("RESTART MESH NOW...\r\n"); #if LIGHT_DEVICE light_hint_stop(HINT_RED); #endif //user_MeshStart(); wifi_RestartMeshScan(5000); #else SC_INFO("ESP-TOUCH FAIL, OPEN WEBSERVER NOW"); mesh_SetSoftap();//check #endif }
/****************************************************************************** * FunctionName : mesh_FailCb * Description : callback func when mesh init failed(both timeout and failed) *******************************************************************************/ void ICACHE_FLASH_ATTR mesh_FailCb(void* arg) { MESH_INFO("mesh fail\r\n"); mesh_StopCheckTimer(); #if ESP_NOW_SUPPORT //initialize ESP-NOW light_EspnowInit(); #endif MESH_INFO("CALL MESH DISABLE HERE...\r\n"); //stop or disable mesh espconn_mesh_disable(mesh_DisableCb); //open softap interface //mesh_SetSoftap(); //try AP CACHE and connect //WIFI_StartAPScan(); //start Esptouch #if ESP_TOUCH_SUPPORT if(false == esptouch_getAckFlag()){ esptouch_FlowStart(); return; } #endif wifi_RestartMeshScan(5000); return; }
/****************************************************************************** * FunctionName : esptouch_SuccessCb * Description : esp-touch success callback *******************************************************************************/ void ICACHE_FLASH_ATTR esptouch_SuccessCb(void* data) { wifi_set_opmode(STATIONAP_MODE); os_timer_disarm(&esptouch_tout_t);//disable check timeout #if LIGHT_DEVICE light_hint_stop(HINT_WHITE); #endif SC_INFO("ESP-TOUCH SUCCESS \r\n"); SC_INFO("ENABLE LIGHT ACTION(ESP-NOW)"); SC_INFO("debug: channel:%d\r\n",wifi_get_channel()); #if ESP_MESH_SUPPORT if(MESH_DISABLE == espconn_mesh_get_status()){ //user_MeshStart(); //mesh_enable_task(); } user_esp_platform_connect_ap_cb(); //user_MeshStart(); #else user_esp_platform_connect_ap_cb(); #endif #if ESP_NOW_SUPPORT light_EspnowInit(); #endif SC_INFO("CONNECTED TO AP...ENABLE MESH AND RUN PLATFORM CODE ...WAIT...\r\n"); }
/****************************************************************************** * FunctionName : mesh_SuccessCb * Description : callback func when mesh init finished successfully In this demo , we run the platform code after mesh initialization *******************************************************************************/ void ICACHE_FLASH_ATTR mesh_SuccessCb(void* arg) { _LINE_DESP(); MESH_INFO("mesh log: mesh success!\r\n"); MESH_INFO("CONNECTED, DO RUN ESP PLATFORM...\r\n"); MESH_INFO("mesh status: %d\r\n",espconn_mesh_get_status()); _LINE_DESP(); //show light status at the first time mesh enables #if ESP_DEBUG_MODE struct ip_info sta_ip; wifi_get_ip_info(STATION_IF,&sta_ip); if( espconn_mesh_local_addr(&sta_ip.ip)){ MESH_INFO("THIS IS A MESH SUB NODE..\r\n"); uint32 mlevel = sta_ip.ip.addr&0xff; light_ShowDevLevel(mlevel);//debug }else{ MESH_INFO("THIS IS A MESH ROOT..\r\n"); light_ShowDevLevel(1);//debug } #else if(mesh_init_flag){ struct ip_info sta_ip; wifi_get_ip_info(STATION_IF,&sta_ip); if( espconn_mesh_local_addr(&sta_ip.ip)){ MESH_INFO("THIS IS A MESH SUB NODE..\r\n"); uint32 mlevel = sta_ip.ip.addr&0xff; light_ShowDevLevel(mlevel);//debug }else{ MESH_INFO("THIS IS A MESH ROOT..\r\n"); light_ShowDevLevel(1);//debug } mesh_init_flag = false; }else{ } #endif #if ESP_NOW_SUPPORT //init ESP-NOW ,so that light can be controlled by ESP-NOW SWITCHER. light_EspnowInit(); #endif WIFI_StartCheckIp();//debug //run esp-platform procedure,register to server. user_esp_platform_connect_ap_cb();//debug return; }
/*The main working flow of this demo: a. start mesh function, searching for existing mesh network b. if there is no mesh network, search AP cache to connect to a recorded router. c. If we still failed to establish a connection, start ESP-TOUCH wait for configure. d. If ESP-TOUCH time out, re-search mesh network and AP CACHE. e. During the whole procedure,we can control and configure the light via a restful webserver. f. ESP-NOW is the recently released function to control the light without any WiFi connection.You can find it in app_switch */ void ICACHE_FLASH_ATTR light_main_flow() { #if ESP_NOW_SUPPORT /*We have added esp-now feature in the light project */ /*So that the lights in a certain MAC group can be easily controlled by an ESP-NOW controller*/ /*The sample code is in APP_CONTROLLER/APP_SWITCH*/ sp_MacInit();//csc add button Mac add and delet light_EspnowInit(); #endif #if 1 #if ESP_PLATFORM /*Initialization of the peripheral drivers*/ /*For light demo , it is user_light_init();*/ /* Also check whether assigned ip addr by the router.If so, connect to ESP-server */ user_esp_platform_init_peripheral(); disp_heap(5); #endif /*Establish a udp socket to receive local device detect info.*/ /*Listen to the port 1025, as well as udp broadcast. /*If receive a string of device_find_request, it reply its IP address and MAC.*/ user_devicefind_init(); disp_heap(6); /*Establish a TCP server for http(with JSON) POST or GET command to communicate with the device.*/ /*You can find the command in "2B-SDK-Espressif IoT Demo.pdf" to see the details.*/ /*the JSON command for curl is like:*/ /*3 Channel mode: curl -X POST -H "Content-Type:application/json" -d "{\"period\":1000,\"rgb\":{\"red\":16000,\"green\":16000,\"blue\":16000}}" http://192.168.4.1/config?command=light */ /*5 Channel mode: curl -X POST -H "Content-Type:application/json" -d "{\"period\":1000,\"rgb\":{\"red\":16000,\"green\":16000,\"blue\":16000,\"cwhite\":3000,\"wwhite\",3000}}" http://192.168.4.1/config?command=light */ /***********NOTE!!**************/ /*in MESH mode, you need to add "sip","sport" and "mdev_mac" fields to send command to the desired device*/ /*see details in MESH documentation*/ /*MESH INTERFACE IS AT PORT 8000*/ #if ESP_WEB_SUPPORT //Initialize DNS server for captive portal //captdnsInit(); //Initialize espfs containing static webpages espFsInit((void*)(webpages_espfs_start)); //Initialize webserver httpdInit(builtInUrls, SERVER_PORT); //user_webserver_init(SERVER_PORT); #else #ifdef SERVER_SSL_ENABLE user_webserver_init(SERVER_SSL_PORT); #else user_webserver_init(SERVER_PORT); #endif #endif #endif ////simplepair_test();//debug only //In debug mode, if you restart the light within 2 seconds, it will get into softap mode and wait for local upgrading firmware. //Restart again, it will clear the system param and set to default status. #if ESP_DEBUG_MODE extern struct esp_platform_saved_param esp_param; if(esp_param.reset_flg == MODE_APMODE){ os_printf("==================\r\n"); os_printf("RESET FLG==2,STATIONAP_MODE \r\n"); os_printf("==================\r\n"); #if ESP_MESH_SUPPORT user_DeviceFindRespSet(false); #endif struct softap_config config_softap; char ssid[33]={0}; wifi_softap_get_config(&config_softap); os_memset(config_softap.password, 0, sizeof(config_softap.password)); os_memset(config_softap.ssid, 0, sizeof(config_softap.ssid)); os_sprintf(ssid,"ESP_%06X",system_get_chip_id()); os_memcpy(config_softap.ssid, ssid, os_strlen(ssid)); config_softap.ssid_len = os_strlen(ssid); config_softap.authmode = AUTH_OPEN; wifi_softap_set_config(&config_softap); os_printf("SET STATION-AP MODE\r\n"); //wifi_set_opmode(STATIONAP_MODE); wifi_set_opmode(STATIONAP_MODE); user_esp_platform_set_reset_flg(MODE_RESET); os_timer_disarm(&reset_flg_t); os_timer_setfn(&reset_flg_t,user_esp_platform_set_reset_flg,MODE_NORMAL); os_timer_arm(&reset_flg_t,2000,0); user_light_set_duty(0, LIGHT_RED); user_light_set_duty(0, LIGHT_GREEN); user_light_set_duty(0, LIGHT_BLUE); user_light_set_duty(22222, LIGHT_WARM_WHITE); user_light_set_duty(22222, LIGHT_COLD_WHITE); os_delay_us(5000); light_ShowDevLevel(5); return; } #if ESP_RESET_DEBUG_EN else if(esp_param.reset_flg == MODE_RESET){ os_printf("==================\r\n"); os_printf("RESET FLG==1,RESET IN 200 MS \r\n"); os_printf("==================\r\n"); user_esp_platform_set_reset_flg(MODE_APMODE); os_timer_disarm(&reset_flg_t); os_timer_setfn(&reset_flg_t,user_esp_platform_reset_default,0); os_timer_arm(&reset_flg_t,200,0); } else{ os_printf("==================\r\n"); os_printf("RESET FLG==0,NORMAL MODE \r\n"); os_printf("==================\r\n"); user_esp_platform_set_reset_flg(MODE_APMODE); os_timer_disarm(&reset_flg_t); os_timer_setfn(&reset_flg_t,user_esp_platform_set_reset_flg,0); os_timer_arm(&reset_flg_t,2000,0); } #endif #endif #if ESP_MESH_SUPPORT /*initialize mesh network. 1. search for existing mesh. 2. if failed , try connecting recorded router. */ //user_MeshSetInfo(); user_MeshInit(); #elif ESP_TOUCH_SUPPORT esptouch_FlowStart(); #endif }