完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在上面的帖子里分析了用户代码入口函数 user_init:https://bbs.elecfans.com/forum.p ... =1100361&extra=
从上面和实验现象可以知道下一步要进行的就是按下airkiss按键,也就是进入函数airkiss_key_poll_task下面是这个函数的具体内容: airkiss_key_poll_task(void *pvParameters) { et_uint32 value, i; while(1) { value = gpio_get_value(AIRKISS_KEY_IO_NUM); if(!air_kiss_start_flag && !value) { delay_s(1); value = gpio_get_value(AIRKISS_KEY_IO_NUM); if(!air_kiss_start_flag && !value) { os_printf("begin to airkissn"); air_kiss_start_flag = 1; os_timer_disARM(&test_timer); to_stop_app = 1; //in airkiss mode, stop et_user_main thread if(g_cloud_handle != NULL) { et_logout_cloud(g_cloud_handle); et_destroy_context(g_cloud_handle); g_cloud_handle = NULL; } delay_s(1); wifi_reconnect_start_flag = 0; smartconfig_start(smartconfig_done); //airkiss start if(work_mode == WORK_MODE_OLED) { OLED_clear(); OLED_show_chn(0, 0, 15); //show 小e: OLED_show_str(18, 0, "e:", 2); OLED_show_chn(0, 2, 8); //show 网络配置中... OLED_show_chn(18, 2, 9); OLED_show_chn(36, 2, 10); OLED_show_chn(54, 2, 11); OLED_show_chn(72, 2, 12); OLED_show_str(90, 2, "...", 2); } os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL); os_timer_arm(&test_timer, 1000, 0); } } delay_ms(500); } os_printf("end airkissn"); vTaskDelete(NULL); } 下面具体分析这个函数: while(1) { value = gpio_get_value(AIRKISS_KEY_IO_NUM); if(!air_kiss_start_flag && !value) { delay_s(1); value = gpio_get_value(AIRKISS_KEY_IO_NUM); if(!air_kiss_start_flag && !value) { os_printf("begin to airkissn"); 这里按键消斗之后进入程序的主要内容,下来: air_kiss_start_flag = 1; os_timer_disarm(&test_timer); to_stop_app = 1; //in airkiss mode, stop et_user_main thread if(g_cloud_handle != NULL) { et_logout_cloud(g_cloud_handle); et_destroy_context(g_cloud_handle); g_cloud_handle = NULL; } delay_s(1); wifi_reconnect_start_flag = 0; 卸载掉定时器test_timer并且清除之前的云处理标志g_cloud_handle,清除wifi_reconnect_start_flag,下来: smartconfig_start(smartconfig_done); //airkiss start 这个语句开始简洁配置,也就是开始wifi的第一个程序,当smart-config 的状态改变的时候将调用回调函数smartconfig_done,这里先把smartconfig_done函数的分析先放一下,先把目前的函数分析完成。airkiss_key_poll_task函数接下来的内容如下: if(work_mode == WORK_MODE_OLED) { OLED_clear(); OLED_show_chn(0, 0, 15); //show 小e: OLED_show_str(18, 0, "e:", 2); OLED_show_chn(0, 2, 8); //show 网络配置中... OLED_show_chn(18, 2, 9); OLED_show_chn(36, 2, 10); OLED_show_chn(54, 2, 11); OLED_show_chn(72, 2, 12); OLED_show_str(90, 2, "...", 2); } 这里使用OLED输出信息,这里通过的方式是数组引索的方式,比如OLED_show_chn(0, 0, 15);中的15代表的是要显示的汉字在数组F16x16的引索值,可以看到这个数组的15号点阵正是“小”字: 0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00, 0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00,/*"小",15*/ 那么这些OLED显示整体就是“小e” 换行“网络配置中...”,和在屏幕看到的现象一样,接下来: os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL); os_timer_arm(&test_timer, 1000, 0); 这里又把定时器test_time打开,然后这个函数就到这里了。 下面来重点分析smartconfig_done函数,其内容如下: smartconfig_done(sc_status status, void *pdata) { switch(status) { case SC_STATUS_WAIT: os_printf("SC_STATUS_WAITn"); break; case SC_STATUS_FIND_CHANNEL: set_wifi_spark_timer(300); os_printf("SC_STATUS_FIND_CHANNELn"); break; case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWDn"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCHn"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISSn"); } break; case SC_STATUS_LINK: { os_printf("SC_STATUS_LINKn"); struct station_config *sta_conf = pdata; wifi_station_set_config(sta_conf); wifi_station_disconnect(); wifi_station_connect(); } break; case SC_STATUS_LINK_OVER: { os_printf("SC_STATUS_LINK_OVERn"); smartconfig_stop(); if(work_mode == WORK_MODE_OLED) { OLED_clear(); OLED_show_chn(0, 0, 15); //show 小e: OLED_show_str(18, 0, "e:", 2); OLED_show_chn(0, 2, 8); //show 网络配置完成 OLED_show_chn(18, 2, 9); OLED_show_chn(36, 2, 10); OLED_show_chn(54, 2, 11); OLED_show_chn(72, 2, 13); OLED_show_chn(90, 2, 14); OLED_show_str(108, 2, " ", 2); } delay_s(2); system_restart(); break; } } }整体来看这个函数就是判断设置wifi配置返回来的状态,然后做出不一样的响应,sc_status结构体如下: typedef enum { SC_STATUS_WAIT = 0, /**< waiting, do not start connection in this phase */ SC_STATUS_FIND_CHANNEL, /**< find target channel, start connection by APP in this phase */ SC_STATUS_GETTING_SSID_PSWD, /**< getting SSID and password of target AP */ SC_STATUS_LINK, /**< connecting to target AP */ SC_STATUS_LINK_OVER, /**< got IP, connect to AP successfully */ } sc_status; 下面我们来分析一些有用的地方: case SC_STATUS_FIND_CHANNEL: set_wifi_spark_timer(300); os_printf("SC_STATUS_FIND_CHANNELn"); break; 这是发现wifi通道的时候使能了一个定时器spark,其内容如下: void set_wifi_spark_timer(et_uint32 time) { os_timer_disarm(&wifi_led_spark_timer); os_timer_setfn(&wifi_led_spark_timer, (os_timer_func_t *)wifi_led_spark, NULL); os_timer_arm(&wifi_led_spark_timer, time, 1); } 从这个定时器的名字可以看出,这个应该是控制wifi指示灯(绿灯的设置),这里看看这个的定时器的回调函数: void wifi_led_spark(void *param) { static et_uchar out_value = LOGIC_LL; GPIO_OUTPUT_SET(WIFI_STATUS_IO_NUM, out_value); out_value = !out_value; } 从上面可以看出这里翻转了LED灯。下面回到smartconfig_done函数继续分析, case SC_STATUS_GETTING_SSID_PSWD: os_printf("SC_STATUS_GETTING_SSID_PSWDn"); sc_type *type = pdata; if (*type == SC_TYPE_ESPTOUCH) { os_printf("SC_TYPE:SC_TYPE_ESPTOUCHn"); } else { os_printf("SC_TYPE:SC_TYPE_AIRKISSn"); } break; 这时候代表正在获取SSID和PSWD,并且知道配置类型并打印出来,这里配置类型是SC_TYPE_AIRKISS,接下来的内容是: case SC_STATUS_LINK: { os_printf("SC_STATUS_LINKn"); struct station_config *sta_conf = pdata; wifi_station_set_config(sta_conf); wifi_station_disconnect(); wifi_station_connect(); } 这时候代表正在开始连接到AP,这里获取到station_config并且关掉连接,然后再次连接,接下来: case SC_STATUS_LINK_OVER: { os_printf("SC_STATUS_LINK_OVERn"); smartconfig_stop(); if(work_mode == WORK_MODE_OLED) { OLED_clear(); OLED_show_chn(0, 0, 15); //show 小e: OLED_show_str(18, 0, "e:", 2); OLED_show_chn(0, 2, 8); //show 网络配置完成 OLED_show_chn(18, 2, 9); OLED_show_chn(36, 2, 10); OLED_show_chn(54, 2, 11); OLED_show_chn(72, 2, 13); OLED_show_chn(90, 2, 14); OLED_show_str(108, 2, " ", 2); } delay_s(2); system_restart(); break; } 这里代编连接已经完成,调用smartconfig_stop停止smartconfig,然后再屏幕打印已经配置完成标志,2s之后重新复位系统。到了这里配置smartconfig已经完成。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
[小e体验板] 【小体积大智慧】关于体验板的技术问题,看这一篇就够了
2855 浏览 4 评论
【小e1开发板试用体验】分析程序架构四~/Share/SDK/makefile分析
3613 浏览 1 评论
6706 浏览 19 评论
29081 浏览 59 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 02:51 , Processed in 0.606976 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号