Application Software Of DA1458x Software Platform

Application Software

从BLE堆栈的不同层和配置文件代码生成消息,以向应用程序任务发送事件信号。另一方面,应用程序会生成消息并将其发送到堆栈以开始大量操作。消息有两个不同的方向。
●从堆栈和配置文件到应用程序任务的消息。
●从应用程序任务到堆栈和配置文件的消息。
Application Software在架构上由SDK Application和User Application两部分组成,见下图。
SDK Application:
这部分在SDK中定义,并实现了库功能。
User Application:
这部分包含配置常量和回调定义,由模板提供。 它配置SDK应用程序库的操作。 实际用户应用程序的源代码位于此处。
在这里插入图片描述如前所述,有两个消息指示。 API说明从用户应用程序可以向堆栈和配置文件发送消息的可能方式开始。 接下来,它描述了用户应用程序可以从其他任务和配置文件获取消息的可用方式。

1.Message API

在堆栈和配置文件中执行操作的标准和最通用的方法是使用消息API。 这包括内核的标准消息分配和消息发送功能,以及每个任务支持的消息列表。 消息列表和每个消息的数据结构通常在文件<destination_task> _task.h中定义。
请参阅每个任务的相关文档(gapm,gapc,gatt等)以获取更多详细信息。
只要没有从app_mid.h和app_easy.h API提供功能(如本文档后面所述),用户就可以使用消息API。

2.Mid Layer API

中间层API是一组轻量级的无状态宏,用于描述如何执行GAP和Security的最常见操作。 它描述了特定消息的生成,用数据填充消息以及将消息分发到所需任务。 其主旨是提供功能API而不是消息API。 使用以下模式:
●<message pointer*> app_<message_name>msg_create():分配消息并填写正确的目标任务。
●void app
<message_name>_msg_send(<message pointer*>):发送消息。
●void _op(parameters):执行完整的操作。 _op函数通常会创建一条消息,并使用调用者通过参数提供的所需数据填充该消息,然后分派该消息。
完整的中层API在app_mid.h文件中进行了描述。

3.Easy API

Easy API概念试图减轻应用程序程序员在正确执行堆栈或内核中某些操作所需的消息处理,任务处理和特殊序列方面的负担。
Easy API还解决了以下事实:消息中使用的大多数数据在编译时都是常量。在执行函数调用时要求程序员提供所有常量很麻烦,并且会产生更大的代码。而且,即使对于最简单的应用程序,也需要定义许多常量,这对新手程序员来说,使程序快速进入运行状态具有挑战性。
因此,大多数(如果不是全部)常量是在模板的用户应用程序空间中预定义的,并在编译时从Easy API访问。程序员可以快速启动他的应用程序,然后更改默认行为。通常,更改行为仅需要更改适当的常量参数并重新编译代码。另外,Easy API的函数调用中使用的参数数量较少,从而为程序员提供了更好的可读性和更好的可见性。
Easy API的设计模式如下图所示。
在这里插入图片描述向用户公开的每个app_easy_ 都有一个静态app_easy_ msg_create函数和一个指针(msg_pointer)。当用户调用app_easy 函数时,将调用相关的msg_create函数。消息创建功能将检查msg_pointer是否指向已为此操作创建的消息。如果消息已经存在,它将把现有消息返回给app_easy_ 函数。如果没有消息,它将创建一个新消息,用用户配置数据文件提供的常量数据填充它,并将其分配给msg_pointer。 app_easy_ 将发送消息并清除msg_pointer。
这意味着每次app_easy_ 要么创建新消息,要么发送并自动使用现有消息。为了支持消息的动态配置,提供了app_easy_ get_active函数。该函数将调用消息创建函数,并将指针返回到活动消息。这样,用户应用程序可以动态更改消息。
为了节省内存空间,有些操作可以共享msg_pointer,例如不同的app_easy
_advertise操作。

4.app_ API

对于SDK随附的某些配置文件,存在一个附加的应用程序层,该层公开了创建数据库,初始化和特定于配置文件的操作功能。 请参阅相关的头文件以获取每个配置文件支持的功能列表。

5.App Entry Point API

在SDK 5.0.2中,引入了一个新的模块,用于处理到达应用程序任务中的消息。该模块称为app_entry_point.c。 到达app_entry_point_handler的消息将传递到SDK包含的所有应用程序模块,直到模块确认已处理该消息为止,在这种情况下,应用程序入口点将向kernel scheduler返回已消息的状态。
如果消息没有被任何模块处理,它将通过app_process_catch_rest_cb函数指针传递到应用程序,用户可以在其中钩住他的消息处理程序。到达用户空间的消息始终被视为已消耗,无法保存或转发。
app_entry_point.c模块与app_entry_point_handler和app_process_catch_rest_cb函数指针一起还公开了在user_modules_config.h中定义的一组EXCLUDE_DLG_ 选项。这些选项可用于禁止SDK的特定消息处理程序通过app_process_catch_rest_cb在用户应用程序空间中接收消息。这使用户可以覆盖或扩展现有SDK模块的功能,而无需修改任何SDK文件。

6.User Callback API

SDK提供了许多挂钩在入口点上的模块,用于处理发送给应用程序任务的消息。 模块的主要功能是将接收到的消息转换为事件,这些事件作为具有有意义名称和参数的函数指针公开给用户应用程序空间。 还有一些模块可以实现许多应用程序功能,例如app_spotar_task.c。 遵循此模式的模块是Gap, Security和所有现有的app_ task.c模块。
该库在user_callback_config.h中查找指针的值。 在那里,用户可以分配其应用程序的新功能,以在发生特定事件时被调用。Gap, Security函数指针分在struct user_app_callbacks结构中,而与配置文件相关的指针(对于具有app
_task.c的配置文件)在user_profile_callbacks结构中分组。

struct app_callbacks{
void (*app_on_connection) (const uint8_t, struct gapc_connection_req_ind const *);
void (*app_on_disconnect) (struct gapc_disconnect_ind const *); //app disconnect
void (*app_on_update_params_rejected) (const uint8_t);
void (*app_on_update_params_complete)(void);
void (*app_on_set_dev_config_complete)(void);
void (*app_on_adv_undirect_complete) (const uint8_t);
void (*app_on_adv_direct_complete) (const uint8_t);
void (*app_on_db_init_complete)(void);
void (*app_on_scanning_completed)(void);
void (*app_on_adv_report_ind)(struct gapm_adv_report_ind const *);
void (*app_on_connect_failed)(void);
void (*app_on_pairing_request) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_tk_exch_nomitm) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_irk_exch)(struct gapc_bond_req_ind const *);
void (*app_on_csrk_exch) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_ltk_exch) (uint8_t const, struct gapc_bond_req_ind const *);
void (*app_on_pairing_succeded)(void);
void (*app_on_encrypt_ind) (const uint8_t);
void (*app_on_mitm_passcode_req) (const uint8_t);
void (*app_on_encrypt_req_ind) (uint8_t const, struct gapc_encrypt_req_ind const *);
};

7.Default Handlers

简单的BLE外围应用在很大程度上共享通用功能。 他们应该发布广告并响应中央设备的特定请求以建立连接。 为了最大程度地减少应用程序程序员启动应用程序所需的代码量,已创建了默认处理程序函数库。 这些功能已经从用户回调中的模板项目中勾勒出来,使外围设备可以正常工作,而无需编写任何代码。 然后,程序员可以更改功能,从而覆盖默认功能。
默认处理程序具有其自己的配置选项和功能挂钩。 用户可以在user_default_hnd_conf文件中配置由默认处理程序实现的外围设备的发布操作方案或安全性请求方案。 还可以在user_default_app_operations结构中完全覆盖advertise操作。

发布了19 篇原创文章 · 获赞 4 · 访问量 1710

猜你喜欢

转载自blog.csdn.net/ydgd118/article/details/104461314