专栏首页嵌入式智能硬件QCC3040开发笔记之按键配置(3)

抱歉,你查看的文章已删除

QCC3040开发笔记之按键配置(3)

大部分参考了这位大神在云巅的博客https://blog.csdn.net/ylangeia/article/details/106619066?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

配置按键的文件的位置

..\adk\tools\buttonparsexml

对很多C开发的人,不熟悉python,但是可以了解下它里面的代码

类的基本用法:

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。定义在方法中
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。创建实例时声明
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

这几行代的意思是

创建一个Pio的类,__init__()设置三个属性。

这个脚本中的下面两个接口,生成了配置相对应的.c和.h.以9_button举例分析

配置文件如9_buttons.buttonxml

py脚本调用上面配置文件生成了9_buttons.c中的静态数组和9_buttons.h.

这个9_buttons很奇怪。没有一一对应生成。但是变量都能找到在数组中。

ButtonParseXML文件,在generate_source函数中OutputButtonTable的接口,该接口的主要作用就是将massage标签转化为一个InputActionMessage_t实体。

def OutputButtonTable(message_group_dict):

    def OutputButtonAction(message_dict, action):
        button_str = ""
        for v in message_dict.itervalues():
            if v.event == action:
                button_str += "\t{\n"
                pio_list = v.active_hi_pio_list
                pio_str = "0"
                for idx, pio in enumerate(pio_list):
                    if idx > 0:
                        pio_str += " | " + pio.name
                    else:
                        pio_str = pio.name
                pio_str += ","
                button_str += "\t\t" + format(pio_str, "40s") + "/* Input event bits */\n"
                pio_list = v.active_hi_pio_list + v.active_lo_pio_list
                pio_str = ""
                for idx, pio in enumerate(pio_list):
                    if idx > 0:
                        pio_str += " | "
                    pio_str += pio.name
                pio_str += ","
                button_str += "\t\t" + format(pio_str, "40s") + "/* Input event mask */\n"
                button_str += "\t\t" + format(v.event + ",", "40s") + "/* Action */\n"
                button_str += "\t\t" + format(str(v.timeout_ms) + ",", "40s") + "/* Timeout */\n"
                button_str += "\t\t" + format(str(v.repeat_ms) + ",", "40s") + "/* Repeat */\n"
                button_str += "\t\t" + format(v.name + ",", "40s") + "/* Message */\n"
                button_str += "\t},\n"
        return button_str

    table_str = ""
    for message_group_name, message_dict in message_group_dict.iteritems():
        table_str += "\nconst InputActionMessage_t " + message_group_name + "[" + str(GetNumberOfNotIgnoredMessages(message_dict)) + "] = \n"

        table_str += "{\n"
        table_str += OutputButtonAction(message_dict, "ENTER")
        table_str += OutputButtonAction(message_dict, "HELD")
        table_str += OutputButtonAction(message_dict, "SINGLE_CLICK")
        table_str += OutputButtonAction(message_dict, "HELD_RELEASE")
        table_str += OutputButtonAction(message_dict, "DOUBLE_CLICK")
        table_str += OutputButtonAction(message_dict, "RELEASE")
        table_str += "};\n"

    return table_str

从上面可以看出,生成c文件中的消息结构体,首先会匹配action,如果找不到就跳过,由于默认只有6种动作,所以我们要加新动作的话,比如“TRIPLE_CLICK”需要在这里新增一个类型,否则无法parse出来,并在input_event_manager.h的InputEventAction_t枚举定义中添加定义。

按键模块的逻辑

//硬件初始化,注册处理函数

PioMonitorInit(pioHandler)

//input_event_manager模块初始化,注册消息处理函数

//关联结构体数组,按键消息最终会根据消息id去map的处理函数

earbud_ui_config_table

//当io口状态发生改变的时候,发MESSAGE_PIO_CHANGED到monitor层

pioHandler

//封装io消息,并转发给与之关联的各个app task,这里只关注input_event_manager模块(app)

handleMessagePioChangedClients(state,mpc)

//遍历x_button.c中消息表内的消息,匹配io与动作,执行对应的操作

static void inputEventsChanged(InputEventState_t *state, input_event_bits_t input_event_bits)
{
    input_event_bits_t changed_bits = state->input_event_bits ^ input_event_bits;
    const InputActionMessage_t *input_action = state->action_table;
    const uint32 size = state->num_action_messages;

    IEM_DEBUG(("IEM: Updated input events %08x\n", input_event_bits));

    /* Go through the action table to determine what action to do and
       what message may need to be sent. */
    for (;input_action != &(state->action_table[size]); input_action++)
    {
        if (changed_bits & input_action->mask)
        {
            switch (input_action->action)
            {
                case ENTER:
                   
				    enterAction(state, input_action, input_event_bits);
                    break;

                case RELEASE:
                    
                    releaseAction(state, input_action, input_event_bits);
                    break;
                case SINGLE_CLICK:

                    singleClickAction(state, input_action, input_event_bits);
                    break;

                case DOUBLE_CLICK:
                    doubleClickAction(state, input_action, input_event_bits);
                    break;

                case HELD:
                    heldAction(state, input_action, input_event_bits);
                    break;

                case HELD_RELEASE:
                    heldReleaseAction(state, input_action, input_event_bits);
                    break;

                default:
                    break;
            }
        }
    }

    /* Store the bits previously reported */
    state->input_event_bits = input_event_bits;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 十六进制数组转换成ASCII码

    心跳包
  • C语言字符串指针

    运行结果: http://c.biancheng.net http://c.biancheng.net 字符数组归根结底还是一个数组,上节讲到的关于指针...

    心跳包
  • 音频系统噪声源分析及排除方法

      在录音扩声或音频传输过程中噪声是具有一定频率的纹波电压通过电源线路窜入音频设备的供电回路,普遍存在又非常令人头痛和不易解决。通常组成音频设备的设备越多或信号...

    心跳包
  • Python3 与 C# 基础语法对比(String专栏-新排版)

    在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master

    逸鹏
  • python计算器

    程序的逻辑很简单,取出括号,计算里面的乘除加减,结果替换原括号内容,再循环直到最终结果。难点在于正则匹配字符和计算细节上,怎么很好协调配合并正确获得结果。

    py3study
  • 剑指offer——字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,ba...

    AI那点小事
  • C/C++踩坑记录(二)一段有趣的常量字符串 原

    测试平台: Ubuntu 16.04 Windows Mingw GCC gcc version 5.3.0 (i686-posix-dwarf-rev0,...

    Pulsar-V
  • 剑指Offer-替换空格

    package String; /** * 替换空格 * 请实现一个函数,将一个字符串中的空格替换成“%20”。 * 例如,当字符串为We Are Ha...

    武培轩
  • C#字符串截取

    yaphetsfang
  • php安装程序制作原理

    过程: 1、(之前需要有安装协议)检查环境(操作系统、php版本、数据库、附件上传、目录权限、特殊环境要求(pdo、rewrtie、gd2、短标签等)) 2...

    苦咖啡

扫码关注云+社区

领取腾讯云代金券