小e开发板按键中断回调函数airkiss_key_poll_task分析
来源:互联网 发布:网络实用技术基础答案 编辑:程序博客网 时间:2024/04/27 21:44
外话:各位手头上没有esp8266的开发板注意了,目前开发快正在进行“免费开发板活动”,本人就是在他们那里申请到的开发板,开发快提供的不单单是开发板,还有他们强大的云端服务功能,实现了微信、云平台等物联网所需要的所有功能,其功能齐全,代码简洁,对于想用wifi作为产品和互联网沟通的桥梁的我们来说,确实是一个很好的选择,另外他们还有其他的模块,比如2G通信和GPS。目前论坛活动地址:http://bbs.kaifakuai.com/forum.php?mod=viewthread&tid=981&extra=page%3D1,开发快官网地址:http://www.kaifakuai.com/ 》》》》》》写于2017年1月12日
本文摘录于本人帖子:bbs.elecfans.com/forum.php?mod=viewthread&tid=1101310&extra=
在上面的帖子里分析了用户代码入口函数 user_init:http://bbs.elecfans.com/forum.ph ... =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 airkiss\n");
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 airkiss\n");
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 airkiss\n");
这里按键消斗之后进入程序的主要内容,下来:
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_WAIT\n");
break;
case SC_STATUS_FIND_CHANNEL:
set_wifi_spark_timer(300);
os_printf("SC_STATUS_FIND_CHANNEL\n");
break;
case SC_STATUS_GETTING_SSID_PSWD:
os_printf("SC_STATUS_GETTING_SSID_PSWD\n");
sc_type *type = pdata;
if (*type == SC_TYPE_ESPTOUCH)
{
os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n");
}
else
{
os_printf("SC_TYPE:SC_TYPE_AIRKISS\n");
}
break;
case SC_STATUS_LINK:
{
os_printf("SC_STATUS_LINK\n");
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_OVER\n");
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_CHANNEL\n");
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_PSWD\n");
sc_type *type = pdata;
if (*type == SC_TYPE_ESPTOUCH)
{
os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n");
}
else
{
os_printf("SC_TYPE:SC_TYPE_AIRKISS\n");
}
break;
这时候代表正在获取SSID和PSWD,并且知道配置类型并打印出来,这里配置类型是SC_TYPE_AIRKISS,接下来的内容是:
case SC_STATUS_LINK:
{
os_printf("SC_STATUS_LINK\n");
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_OVER\n");
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已经完成。
0 0
- 小e开发板按键中断回调函数airkiss_key_poll_task分析
- 小e开发板WiFi微信登录后的回调函数et_message_process、et_event_process
- 回调函数和中断处理函数
- 小程序-回调函数
- caffe 回调函数分析
- 开发板之按键中断流程
- STM32开发板学习笔记(一)-- 开篇及STM32按键中断分析
- STM32开发板学习笔记(一)-- 开篇及STM32按键中断分析(续)
- 小e开发板用户代码入口user_init函数分析
- AJAX----回调函数小问题
- 回调函数2小例
- 回调函数理解的小例子
- js回调函数小例子
- 小鸦-回调函数callback function
- 笔记:回调函数小程序
- STM32中断数据回调函数接收处理
- 回调函数实例与分析
- 回调函数实例与分析
- Django,ImageFiled 图片请求多APP 图片显示
- Bootstrap框架class="thumbnail"是什么意思?
- Volley返回值乱码
- ”正多边形的逼近“求π的近似值
- Freemarker list对象取前几条数据
- 小e开发板按键中断回调函数airkiss_key_poll_task分析
- GitHub 上 57 款最流行的开源深度学习项目
- 经典对白
- oracle11g安装时报主机名:主机名错误解决
- Java语言如何进行异常处理,关键字分别如何使用
- Android开发框架及注解的使用
- MySQL 数据库 lower_case_table_names参数 5.6
- 每日一省之————无向图(无向非赋权图)
- JavaScript高级程序设计7--客户端检测