在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, ¬i) != SUCCESS) { GATT_bm_free((gattMsg_t *)¬i, ATT_HANDLE_VALUE_NOTI); } } }