0%

QCC MDE 开发初窥(二)

[TOC]

前言

搭建好开发环境,输出log 信息之后,在阅读代码过程中发现,新的软件架构在task ,message方面,新增了一些应用,例如message_boker, Task list之类的。本文就针对新增的message , task list的原理做一个阐述

MESSAGE_BASE & MESSAGE_GROUP

在代码中出现了诸如LOGIC_INPUT_MESSAGE_BASE , UI_TELEPHONY_MESSAGE_GROUP 之类的,搜寻代码,无法找到它们这些消息ID的定义,其实这些定义都在domain_message.h 中已经定义,详情如下:

  • 首先了解xx_MESSAGE_GROUPxx_MESSAGE_BASE 之间的关系

    1
    xx_MESSAGE_GROUP =  xx_MESSAGE_BASE << 8
  • 所有的MESSAGE_GROUP的定义

    1
    2
    3
    4
    5
    6
    7
    8
    enum message_groups
    {
    FOREACH_DOMAINS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
    FOREACH_SERVICES_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
    FOREACH_TOPOLOGY_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
    FOREACH_APPS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
    FOREACH_UI_INPUTS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_GROUP_ENUM)
    };

    它等价于如下代码,具体的细节查看domain_message.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    enum message_groups
    {
    INTERNAL_MESSAGE_GROUP,
    AV_MESSAGE_GROUP, /* See #av_status_messages */ \ ................................................................
    LEAKTHROUGH_MESSAGE_GROUP, /* See leakthrough_msg_t */\
    QCOM_CON_MANAGER_MESSAGE_GROUP,

    HANDSET_SERVICE_MESSAGE_GROUP,
    ............................
    AUDIO_CURATION_SERVICE_MESSAGE_GROUP,

    TWS_TOPOLOGY_SERVICE_MESSAGE_GROUP, /* See #tws_topology_message_t */ \
    TWS_TOPOLOGY_CLIENT_NOTIFIER_SERVICE_MESSAGE_GROUP,
    HEADSET_TOPOLOGY_SERVICE_MESSAGE_GROUP,

    SYSTEM_SERVICE_MESSAGE_GROUP,
    CONN_RULES_SERVICE_MESSAGE_GROUP,
    EARBUD_ROLE_SERVICE_MESSAGE_GROUP,

    UI_INPUTS_TELEPHONY_MESSAGE_GROUP,
    .................................
    UI_INPUTS_BOUNDS_CHECK_MESSAGE_GROUP
    }
  • MESSAGE_GROUP 的值确定了,那么每个group的MESSAGE_BASE值也随之确认

    1
    2
    3
    4
    5
    6
    7
    8
    typedef enum
    {
    FOREACH_DOMAINS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
    FOREACH_SERVICES_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
    FOREACH_TOPOLOGY_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
    FOREACH_APPS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
    FOREACH_UI_INPUTS_MESSAGE_GROUP(EXPAND_AS_MESSAGE_BASE_ENUM)
    } message_base_t;

    它等价以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    enum message_groups
    {
    INTERNAL_MESSAGE_GROUP << 8,
    AV_MESSAGE_GROUP << 8, /* See #av_status_messages */ \ ................................................................
    LEAKTHROUGH_MESSAGE_GROUP << 8, /* See leakthrough_msg_t */\
    QCOM_CON_MANAGER_MESSAGE_GROUP << 8,

    HANDSET_SERVICE_MESSAGE_GROUP << 8,
    ............................
    AUDIO_CURATION_SERVICE_MESSAGE_GROUP << 8,

    TWS_TOPOLOGY_SERVICE_MESSAGE_GROUP << 8, /* See #tws_topology_message_t */ \
    TWS_TOPOLOGY_CLIENT_NOTIFIER_SERVICE_MESSAGE_GROUP << 8,
    HEADSET_TOPOLOGY_SERVICE_MESSAGE_GROUP << 8,

    SYSTEM_SERVICE_MESSAGE_GROUP << 8,
    CONN_RULES_SERVICE_MESSAGE_GROUP << 8,
    EARBUD_ROLE_SERVICE_MESSAGE_GROUP << 8,

    UI_INPUTS_TELEPHONY_MESSAGE_GROUP << 8,
    .................................
    UI_INPUTS_BOUNDS_CHECK_MESSAGE_GROUP << 8
    }

MESSAGE_BROKER

有关message_broker官方只有如下说明:

​ The Message Broker allows client modules to register interest
​ in System Messages by Message Group. The Message Broker registers
​ with the message group owner on behalf of the client module. The
​ message group owner subsequently messages the client module directly.
​ The message group owner’s messge group ID and registration function
​ is provides to message broker in MessageBroker_init().

意思是:message broker允许将感兴趣的message_group注册到系统消息中。

应该代码中只应用到两个API:

  • MessageBroker_Init()

代码中该代码中的涉及的参数message_broker_group_registrations_end[]message_broker_group_registrations_begain[]具体定义都不可见。所以 MessageGroupRegister

MessageGroupUnregister 两个函数的定义也未知。

  • void MessageBroker_RegisterInterestInMsgGroups(Task task, const message_group_t* msg_groups, unsigned num_groups)

num_groups是指在*msg_groups为第一个message_group,在此基础上的几个message_group.

此函数最后要调用registration->MessageGroupRegister(task, group) ,但由于MessageGroupRegister的具体定义未知,所以也无从查询它究竟做了什么.

  • 疑问?

message_broker的具体怎么应用,目前尚未知道,在后续的代码中希望可以找到答案。

Tasklist application

task list 中应用到的结构体如下图所示:

![](QCC MDE 开发初窥(二)/task_list_struct.png)

  • 创建task list

    • 动态的task list : TaskList_Create()
    • 静态的task list : TaskList_Initralise(), 它设置

    目前代码中,两者创建的容量都是1,唯一区别就是no_destroy的赋值不一样,动态赋值:false, 静态赋值TRUE

  • TaskList_AddTask(), 一般在register一个task的时候就需要该操作

  • 使用过程中,就可以利用task list 来发送消息:Tasklist_MessageSendId()

  • 动态创建tasklist后,unresgister 一个task的时候:

    • TaskList_RemoveTask()
    • 通过TaskList_Size()判断 task 是否为零,如果等于零,则TaskList_Destroy()