小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