对CH592 Peripheral例程的一些疑问

在Peripheral例程中,有一个特征值(characteristic)使用了Notify,通过linkDB_Register注册了一个回调函数用于重置CCCD的状态。

    // Register with Link DB to receive link status change callback
    linkDB_Register(simpleProfile_HandleConnStatusCB);
 
/*.........*/
static void simpleProfile_HandleConnStatusCB(uint16_t connHandle, uint8_t changeType)
{
    // Make sure this is not loopback connection
    if(connHandle != LOOPBACK_CONNHANDLE)
    {
        // Reset Client Char Config if connection has dropped
        if((changeType == LINKDB_STATUS_UPDATE_REMOVED) ||
           ((changeType == LINKDB_STATUS_UPDATE_STATEFLAGS) &&
            (!linkDB_Up(connHandle))))
        {
            GATTServApp_InitCharCfg(connHandle, simpleProfileChar4Config);
        }
    }
}

请问如果有多个特征值需要使用Notify,他们不全在在同一个service中,但要实现和示例代码一样的自动重置CCCD状态的功能。该如何实现?linkDB_Register能注册多个回调函数吗?


还有另一个疑问,代码出自同一个例程,请问为什么GATT_bm_free只在失败的情况下调用,成功的情况下不需要释放吗?

noti的pValue必须是GATT_bm_alloc分配出来的吗?

static void peripheralChar4Notify(uint8_t *pValue, uint16_t len)
{
    attHandleValueNoti_t noti;
    if(len > (peripheralMTU - 3))
    {
        PRINT("Too large noti\n");
        return;
    }
    noti.len = len;
    noti.pValue = GATT_bm_alloc(peripheralConnList.connHandle, ATT_HANDLE_VALUE_NOTI, noti.len, NULL, 0);
    if(noti.pValue)
    {
        tmos_memcpy(noti.pValue, pValue, noti.len);
        if(simpleProfile_Notify(peripheralConnList.connHandle, &noti) != SUCCESS)
        {
            GATT_bm_free((gattMsg_t *)&noti, ATT_HANDLE_VALUE_NOTI);
        }
    }
}



注册服务用的,每新注册一个服务就需要添加这个函数。

例如:image.png

数据发送成功会由协议栈进行释放缓存,发送失败需要手动释放缓存。



我看了HID_Keyborad的例程,在那个例程中是没有使用linkDB_Register注册回调来处理这个事情的,我是否可以理解为HID_Keyboard例程中的做法是更“正确”的做法?


第二个问题怪我之前没看手册,我在开发参考手册的API说明里看到了失败时需要释放的说明。


题外话,个人建议这类与内存分配和释放相关的信息还是要描述的清楚一些,毕竟蓝牙库代码不开源,如果代码注释里没有说明,用这个库的人要怎么知道调用某个API之前要用什么API去分配内存,什么情况下需要释放,什么情况下不需要释放呢?函数注释看起来详细,但这种关键信息却只在文档里提了一下失败时需要释放。我觉得代码注释中也进行说明是更合理的做法。


上面截图的是在HID例程添加透传服务的代码,截图进行讲解用的。

针对一些库函数的使用可以参考BLE文件夹下面的PDF文件或者函数的注释。如果还有一些用法问题也可以直接发送至lpc@wch.cn,我们这里可以进行讲解。


只有登录才能回复,可以选择微信账号登录