BLE芯片DA145XX系列:配置SDK支持多连接

Dialog的DA145XX系列BLE芯片可以配置允许多连接,需要修改SDK,下面主要说明如何实现多连接配置。

1、新增宏定义:__EXCLUDE_ROM_APP_TASK__
用于取消ROM里关于APP部分函数的调用,改为使用自定义的函数


2、部分宏定义(DA1458x_config_basic.h文件):

修改宏定义,配置支持的连接数,1453X系列最多支持3个连接:

/****************************************************************************************************************/
/* Determines maximum concurrent connections supported by application. It configures the heap memory allocated  */
/* to service multiple connections. It is used for GAP central role applications. For GAP peripheral role it    */
/* should be set to 1 for optimizing memory utilization.                                                        */
/*      - MAX value for DA14535: 3                                                                              */
/****************************************************************************************************************/
#define CFG_MAX_CONNECTIONS     (2)

新增宏定义:

/****************************************************************************************************************/
/* Enable multiple connections configuration                                                                    */
/****************************************************************************************************************/
#if CFG_MAX_CONNECTIONS > (1)
    #define CFG_ENABLE_MULTIPLE_CONN
#endif

3、app_task.h里修改宏定义:

/// Number of APP Task Instances
#ifndef CFG_ENABLE_MULTIPLE_CONN
#define APP_IDX_MAX      (1)
#else
#define APP_IDX_MAX      (APP_EASY_MAX_ACTIVE_CONNECTION)
#endif

4、app.h里修改宏定义:

/// Max connections supported by application task
#ifdef CFG_ENABLE_MULTIPLE_CONN
#define APP_EASY_MAX_ACTIVE_CONNECTION      (BLE_CONNECTION_MAX)
#else
#define APP_EASY_MAX_ACTIVE_CONNECTION      (1)
#endif


5、APP_task.c 修改部分函数:使用__WEAK关键字,用于在其它区域覆盖该函数,主要更改连接和断连两个回调函数:
gapc_disconnect_ind_handler
gapc_connection_req_ind_handler

/**
 ****************************************************************************************
 * @brief Handles connection complete event from the GAP. Will enable profile.
 * @param[in] msgid     Id of the message received.
 * @param[in] param     Pointer to the parameters of the message.
 * @param[in] dest_id   ID of the receiving task instance (TASK_GAP).
 * @param[in] src_id    ID of the sending task instance.
 * @return If the message was consumed or not.
 ****************************************************************************************
 */
#ifdef CFG_ENABLE_MULTIPLE_CONN
__WEAK int gapc_connection_req_ind_handler(ke_msg_id_t const msgid,
										struct gapc_connection_req_ind const *param,
										ke_task_id_t const dest_id,
										ke_task_id_t const src_id)
#else
static int gapc_connection_req_ind_handler(ke_msg_id_t const msgid,
										struct gapc_connection_req_ind const *param,
										ke_task_id_t const dest_id,
										ke_task_id_t const src_id)
#endif
{
    // Connection Index
    if (ke_state_get(dest_id) == APP_CONNECTABLE)
    {
        uint8_t conidx = KE_IDX_GET(src_id);
        ASSERT_WARNING(conidx < APP_EASY_MAX_ACTIVE_CONNECTION);
        app_env[conidx].conidx = conidx;

        if (conidx != GAP_INVALID_CONIDX)
        {
            app_env[conidx].connection_active = true;
            ke_state_set(TASK_APP, APP_CONNECTED);
            // Retrieve the connection info from the parameters
            app_env[conidx].conhdl = param->conhdl;
            app_env[conidx].peer_addr_type = param->peer_addr_type;
            memcpy(app_env[conidx].peer_addr.addr, param->peer_addr.addr, BD_ADDR_LEN);
            #if (BLE_APP_SEC)
                // send connection confirmation
                app_easy_gap_confirm(conidx, (enum gap_auth) app_sec_env[conidx].auth, 1);
            #else
                app_easy_gap_confirm(conidx, GAP_AUTH_REQ_NO_MITM_NO_BOND, 1);
            #endif
        }
        CALLBACK_ARGS_2(user_app_callbacks.app_on_connection, conidx, param)
    }
    else
    {
        // APP_CONNECTABLE state is used to wait the GAP_LE_CREATE_CONN_REQ_CMP_EVT message
        ASSERT_ERROR(0);
    }

    return (KE_MSG_CONSUMED);
}

/**
 ****************************************************************************************
 * @brief Handles disconnection complete event from the GAP.
 * @param[in] msgid     Id of the message received.
 * @param[in] param     Pointer to the parameters of the message.
 * @param[in] dest_id   ID of the receiving task instance (TASK_GAP).
 * @param[in] src_id    ID of the sending task instance.
 * @return If the message was consumed or not.
 ****************************************************************************************
 */
#ifdef CFG_ENABLE_MULTIPLE_CONN
__WEAK int gapc_disconnect_ind_handler(ke_msg_id_t const msgid,
										struct gapc_disconnect_ind const *param,
										ke_task_id_t const dest_id,
										ke_task_id_t const src_id)
#else
static int gapc_disconnect_ind_handler(ke_msg_id_t const msgid,
									struct gapc_disconnect_ind const *param,
									ke_task_id_t const dest_id,
									ke_task_id_t const src_id)
#endif
{
    uint8_t state = ke_state_get(dest_id);
    uint8_t conidx = KE_IDX_GET(src_id);

    if (state == APP_CONNECTED)
    {
        app_env[conidx].conidx = GAP_INVALID_CONIDX;
        app_env[conidx].connection_active = false;
        CALLBACK_ARGS_1(user_app_callbacks.app_on_disconnect, param)
    }
    else
    {
        // We are not in Connected State
        ASSERT_ERROR(0);
    }

    return (KE_MSG_CONSUMED);
}

6、app.c里修改部分函数:主要是根据CFG_ENABLE_MULTIPLE_CONN宏定义是否开启,来重新配置函数app_db_init_start和app_db_init_next

/**
 ****************************************************************************************
 * @brief Initialize the database for all the included profiles.
 * @return true if succeeded, else false
 ****************************************************************************************
 */
#if (!defined (__DA14531__) || defined (__EXCLUDE_ROM_APP_TASK__)) && !defined (CFG_ENABLE_MULTIPLE_CONN)
static bool app_db_init_next(void)
#else
bool app_db_init_next(void)
#endif
{
    static uint8_t i __SECTION_ZERO("retention_mem_area0"); //@RETENTION MEMORY;
    static uint8_t k __SECTION_ZERO("retention_mem_area0"); //@RETENTION MEMORY;

    // initialise the databases for all the included profiles
    while(user_prf_funcs[k].task_id != TASK_ID_INVALID)
    {
        if (user_prf_funcs[k].db_create_func != NULL)
        {
            user_prf_funcs[k++].db_create_func();
            return false;
        }
        else k++;
    }

    // initialise the databases for all the included profiles
    while(prf_funcs[i].task_id != TASK_ID_INVALID)
    {
        if ((prf_funcs[i].db_create_func != NULL)
            && (!app_task_in_user_app(prf_funcs[i].task_id)))    //case that the this task has an entry in the user_prf as well
        {
            prf_funcs[i++].db_create_func();
            return false;
        }
        else i++;
    }

#if (BLE_CUSTOM_SERVER)
    {
        static uint8_t j __SECTION_ZERO("retention_mem_area0"); //@RETENTION MEMORY;

        while(cust_prf_funcs[j].task_id != TASK_ID_INVALID)
        {
            if(cust_prf_funcs[j].db_create_func != NULL)
            {
                cust_prf_funcs[j++].db_create_func();
                return false;
            }
            else j++;
        }
        j = 0;
    }
#endif

    k = 0;
    i = 0;

    return true;
}
#if !defined (__DA14531__) || defined (__EXCLUDE_ROM_APP_TASK__)
#if !defined (CFG_ENABLE_MULTIPLE_CONN)
bool app_db_init_start(void)
{
    // Indicate if more services need to be added in the database
    bool end_db_create;

    // We are now in Initialization State
    ke_state_set(TASK_APP, APP_DB_INIT);

    end_db_create = app_db_init_next();

    return end_db_create;
}
#endif

7、在工程自定义的其它文件中重新实现前面在ROM里不支持多连接的函数,使其支持多连接:

/**
 ****************************************************************************************
 * @brief Handles connection complete event from the GAP. Will enable profile.
 *          Custom function for multi-connection peripheral
 * @param[in] msgid     Id of the message received.
 * @param[in] param     Pointer to the parameters of the message.
 * @param[in] dest_id   ID of the receiving task instance (TASK_GAP).
 * @param[in] src_id    ID of the sending task instance.
 * @return If the message was consumed or not.
 ****************************************************************************************
 */
int gapc_connection_req_ind_handler(ke_msg_id_t const msgid,
                                           struct gapc_connection_req_ind const *param,
                                           ke_task_id_t const dest_id,  // dest_id -> TASK_APP
                                           ke_task_id_t const src_id)   // src_id -> TASK_GAPC
{
    uint8_t conidx = KE_IDX_GET(src_id);
    uint8_t current_state = ke_state_get(KE_BUILD_ID(KE_TYPE_GET(dest_id), conidx));
    
    // Connection Index
    if (current_state == APP_CONNECTABLE)
    {
        ASSERT_WARNING(conidx < APP_EASY_MAX_ACTIVE_CONNECTION);
        app_env[conidx].conidx = conidx;

        if (conidx != GAP_INVALID_CONIDX)
        {
            app_env[conidx].connection_active = true;
            ke_state_set(KE_BUILD_ID(KE_TYPE_GET(dest_id), conidx), APP_CONNECTED); //SUPBLE_6975
            // Retrieve the connection info from the parameters
            app_env[conidx].conhdl = param->conhdl;
            app_env[conidx].peer_addr_type = param->peer_addr_type;
            memcpy(app_env[conidx].peer_addr.addr, param->peer_addr.addr, BD_ADDR_LEN);
            #if (BLE_APP_SEC)
            // send connection confirmation
                app_easy_gap_confirm(conidx, (enum gap_auth) app_sec_env[conidx].auth, 1);
            #else
                app_easy_gap_confirm(conidx, GAP_AUTH_REQ_NO_MITM_NO_BOND, 1);
            #endif
        }
        CALLBACK_ARGS_2(user_app_callbacks.app_on_connection, conidx, param)
    }
    else
    {
        // APP_CONNECTABLE state is used to wait the GAP_LE_CREATE_CONN_REQ_CMP_EVT message
        ASSERT_ERROR(0);
    }

    return (KE_MSG_CONSUMED);
}

/**
 ****************************************************************************************
 * @brief Handles disconnection complete event from the GAP. Custom function for the 
 *          multiconnection.
 * @param[in] msgid     Id of the message received.
 * @param[in] param     Pointer to the parameters of the message.
 * @param[in] dest_id   ID of the receiving task instance (TASK_GAP).
 * @param[in] src_id    ID of the sending task instance.
 * @return If the message was consumed or not.
 ****************************************************************************************
 */
int gapc_disconnect_ind_handler(ke_msg_id_t const msgid,
                                       struct gapc_disconnect_ind const *param,
                                       ke_task_id_t const dest_id,
                                       ke_task_id_t const src_id)
{
    uint8_t conidx = KE_IDX_GET(src_id);
    uint8_t state = ke_state_get(KE_BUILD_ID(KE_TYPE_GET(dest_id), conidx));
    
    if (state == APP_CONNECTED)
    {
        app_env[conidx].conidx = GAP_INVALID_CONIDX;
        app_env[conidx].connection_active = false;
        ke_state_set(KE_BUILD_ID(KE_TYPE_GET(dest_id), conidx), APP_CONNECTABLE);
        CALLBACK_ARGS_1(user_app_callbacks.app_on_disconnect, param);
    }
    else
    {
        // We are not in Connected State
        ASSERT_ERROR(0);
    }

    return (KE_MSG_CONSUMED);
}

/**
 ****************************************************************************************
 * @brief Start placing services in the database.
 * @return true if succeeded, else false
 ****************************************************************************************
 */
bool app_db_init_start(void)
{
    // Indicate if more services need to be added in the database
    bool end_db_create;

    // We are now in Initialization State
    for(uint8_t idx = 0; idx < APP_IDX_MAX; idx++)
        ke_state_set(KE_BUILD_ID(TASK_APP, idx), APP_DB_INIT);

    end_db_create = app_db_init_next();

    return end_db_create;
}

8、修改da145xx_symbols.txt文件(在sdk\common_project_files\misc目录下),去除app.c、app_entry_point.c、app_task.c部分函数引用
原先为:

; app.c (controlled by __EXCLUDE_ROM_APP_TASK__)
0x07f22b35 T app_db_init_start
0x07f22b51 T app_db_init
0x07f22b5d T app_easy_gap_confirm
0x07f22b89 T append_device_name
0x07f22bad T app_easy_gap_update_adv_data
0x07f22bf5 T active_conidx_to_conhdl
0x07f22c19 T active_conhdl_to_conidx
0x07f22c55 T app_easy_gap_disconnect
0x07f22c91 T app_easy_gap_advertise_stop
0x07f22cad T app_timer_set
0x07f22cc9 T app_easy_gap_set_data_packet_length
0x07f22d09 T get_user_prf_srv_perm
0x07f22d31 T app_set_prf_srv_perm
0x07f22d61 T prf_init_srv_perm
0x07f22d85 T app_gattc_svc_changed_cmd_send
0x07f231fd T app_gap_process_handler

; app_entry_point.c (controlled by __EXCLUDE_ROM_APP_TASK__)
0x07f23219 T app_entry_point_handler
0x07f23261 T app_std_process_event

; app_task.c (controlled by __EXCLUDE_ROM_APP_TASK__)
0x07f23b98 D app_default_handler

更改为:

; app.c (controlled by __EXCLUDE_ROM_APP_TASK__)
0x07f23515 T append_device_name                              
;0x07f23715 T app_gattc_svc_changed_cmd_send 

; app_entry_point.c (controlled by __EXCLUDE_ROM_APP_TASK__)
;0x07f23219 T app_entry_point_handler
;0x07f23261 T app_std_process_event

; app_task.c (controlled by __EXCLUDE_ROM_APP_TASK__)
;0x07f23b98 D app_default_handler

 至此修改完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/677653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能专业现代学徒制人才培养质量评价体系构建

一、 引 言 随着信息时代的发展&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞跃进步对各行各业产生了深远影响&#xff0c;对专业人才的培养提出了更高要求。现代学徒制作为一种创新人才培养模式&#xff0c;通过校企合作&#xff0c;强调理论与实践的深度结合&…

Nexus3(nexus-3.19.1-01)忘记管理员密码

1、停服 ./nexus stop 2、进入OrientDB控制台&#xff1a; cd /apply/nexus3/nexus-3.42.0-01/lib/support/ java -jar ./nexus-orient-console.jar 3、在控制台执行&#xff1a; connect plocal:/apply/nexus3/sonatype-work/nexus3/db/security admin admin 4、重置密码…

海外仓代发系统选择标准:功能稳定和性价比高一个都不能少

对海外仓来说&#xff0c;一件代发基本都是比较核心的业务。不过这个核心业务现在的竞争确实也比较大&#xff0c;对海外仓企业而言&#xff0c;想在一件代发上做到让客户满意&#xff0c;还是需要多方面努力的。 一方面&#xff0c;需要自己的仓库管理模式足够标准化&#xf…

GAT1399协议分析(二)--注册流程分析

一、官方流程说明 二、官方流程解析 1 : 发起方向接收方发送注册 HTTP POST 请求/VIID/System/Register。 2: 接收方向发送方发送响应401 Unauthorized, 并在响应的消息头 WWW-Authenticate 字段中给 出适合发送方的认证机制和参数。 3: 发起方重新向接收方发送注册 HTTP POST…

设备维修管理系统

设备维修管理系统是一个集故障处理、巡检处理、设备管理、维修管理、系统管理以及手机客户端功能等六大功能于一体的信息化管理系统。该系统旨在实现设备管理的科学化、规范化和网络化&#xff0c;通过整合设备维修的各个环节和流程&#xff0c;提高设备维修的效率和质量&#…

Windows系统WDS+MDT网络启动自动化安装

Windows系统WDS+MDT网络启动自动化安装 适用于在Windows系统上WDS+MDT网络启动自动化安装 1. 安装准备 1.下载windows server 2019、windows 10 pro的ISO文件,并安装好windows server 2019 2.下载windows 10 2004版ADK及镜像包 1.1 安装平台 Windows 111.2. 软件信息 软件…

香橙派AI Pro开箱初体验

一、前言 上周很荣幸在CSDN上收到香橙派的测评邀请&#xff0c;这是一款专为边缘计算和嵌入式AI应用设计的高性能计算平台。因为之前一直做的是GPU Tensorrt部署相关工作&#xff0c;对边缘计算平台也不是很熟悉&#xff0c;花了一些时间摸索&#xff0c;今天我就简单与大家分…

【高阶数据结构(八)】跳表详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多数据结构   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 跳表的概…

Linux---用户及权限配置

文章目录 目录 文章目录 前言 一.基本概念 二.用户管理 创建用户 修改用户属性 用户组管理 用户授权 前言 用户在操作系统中是非常重要的&#xff0c;我们登录系统&#xff0c;访问共享文件夹等都需要用户进行验证。所以&#xff0c;掌握管理用户的知识非常有必要的 一.基…

靠偷也能赚大钱!

很多人搞钱总喜欢去钻牛角尖&#xff0c;喜欢去死磕&#xff0c;喜欢创新&#xff0c;却不知道就是赚钱的那群人其实都不屑于去创新&#xff0c;他们习惯了去抄&#xff0c;去做调整。 像我们的公众号爆文训练营&#xff0c;学员写出10w的文章&#xff0c;其实只来源一点&#…

【全开源】企业官网移动端自适应模板

&#x1f4f1;企业官网移动端自适应模板&#xff1a;打造完美移动体验 在移动互联网时代&#xff0c;手机已经成为人们获取信息、沟通交流的重要工具。因此&#xff0c;企业官网移动端的建设显得尤为重要。为了满足不同移动设备用户的需求&#xff0c;一款优秀的企业官网移动端…

B站内核隔离技术的应用与实践之大数据混部篇

背景 随着B站大数据业务的高速发展&#xff0c;各类业务资源需求也随之快速增长。与此同时&#xff0c;大数据集群有效的资源利用率低于预期&#xff0c;究其原因主要有以下两点&#xff0c; 业务出于性能、稳定性考量会向平台申请过量的系统资源&#xff0c;导致平台不会调度更…

【递归、搜索与回溯】递归、搜索与回溯准备+递归主题

递归、搜索与回溯准备递归主题 1.递归2.搜索3.回溯与剪枝4.汉诺塔问题5.合并两个有序链表6.反转链表7.两两交换链表中的节点8.Pow(x, n)-快速幂&#xff08;medium&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你…

个人笔记--python用tanh画圆形,正方形,长方形(epsilon界面宽度)

用tanh函数画图 圆形 import numpy as np import matplotlib.pyplot as plt# 创建一个二维网格 xx np.linspace(-1, 1, 1000) yy np.linspace(-1, 1, 1000) x_i, y_i np.meshgrid(xx, yy)# 圆的半径和中心 r 0.4 center_x, center_y 0, 0 # 假设圆心在(0, 0)# 计算每个网…

使用Jmeter进行性能测试

学习视频 B站UP主&#xff1a;白月黑羽编程 目录 Jmeter的下载 Jmeter界面 Jmeter操作 线程组与HTTP请求 测试一个请求 解决响应数据中 中文乱码的问题 HTTP请求默认值 录制网站流量 添加录制控制器 添加HTTP代理服务器 在浏览器配置代理 进行录制 模拟间隔时间 …

快薅羊毛,这款企业级数据库监控诊断平台终于免费啦

没错&#xff0c;这是一篇薅羊毛的帖子&#xff0c;真的免费&#xff0c;而且是无任何套路的免费。第一不限使用时间&#xff0c;第二不限实例个数&#xff0c;第三不限用户个数&#xff0c;第四不限数据库引擎。功能包含&#xff1a;数据库监控&#xff08;不限指标&#xff0…

MacOS - 为什么 Mac 安装软件后安装包在桌面上无法删除?

只要你将这磁盘里面的软件放到应用程序里面去了&#xff0c;那么用鼠标选中这个跟磁盘一样的东西&#xff0c;然后按下键盘上的 Command E 即可移除桌面上的这个磁盘。

H5进度条样式,自定义进度条

进度条样式预览 实现代码&#xff1a; <view class"mainPro"><view class"proBg"><view class"proDetail" :style"{ width: ${schedule}% }"></view></view><view class"proTxt">完成进…

《欢乐钓鱼大师》新手攻略大全!新手逆袭之路!

《欢乐钓鱼大师》是一款趣味十足的模拟钓鱼游戏&#xff0c;适合各类玩家&#xff0c;从钓鱼新手到钓鱼高手都能在游戏中找到乐趣。为了帮助新手玩家更快地掌握游戏技巧&#xff0c;提高钓鱼水平&#xff0c;我们准备了一些实用的攻略和技巧&#xff0c;帮助大家轻松入门&#…

STM32—USART 串口通讯

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c usart.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 STM32F103RCT6开发板——全集成开发板,让开发更简单&#xff01; 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 …