osal_memcpy( simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN ); 函数如何发送数据的
bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )
{
bStatus_t ret = SUCCESS;
switch ( param )
{
case SIMPLEPROFILE_CHAR1:
...
case SIMPLEPROFILE_CHAR2:
...
case SIMPLEPROFILE_CHAR3:
...
case SIMPLEPROFILE_CHAR4:
...
case SIMPLEPROFILE_CHAR5:
if ( len == SIMPLEPROFILE_CHAR5_LEN )
{
VOID osal_memcpy( simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN );
}
else
{
ret = bleInvalidRange;
}
break;
default:
ret = INVALIDPARAMETER;
break;
}
return ( ret );
}
由主机主动读取吗,没有见到GATT_Notification();
该函数主要功能是Generic memory copy 复制内存,将源地址的内容拷贝到目的地址
void *osal_memcpy( void *dst, const void GENERIC *src, unsigned int len ) 的参数说明
dst - destination address 目的地址
src - source address 源地址
len - number of bytes to copy 拷贝长度
case SIMPLEPROFILE_CHAR4: if ( len == sizeof ( uint8 ) ) { simpleProfileChar4 = *((uint8*)value); // See if Notification has been enabled GATTServApp_ProcessCharCfg( simpleProfileChar4Config, &simpleProfileChar4, FALSE, simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ), INVALID_TASK_ID, simpleProfile_ReadAttrCB ); } else { ret = bleInvalidRange; }
/*********************************************************************
* @fn GATTServApp_ProcessCharCfg
*
* @brief Process Client Characteristic Configuration change.
*
* @param charCfgTbl - characteristic configuration table.
* @param pValue - pointer to attribute value.
* @param authenticated - whether an authenticated link is required.
* @param attrTbl - attribute table.
* @param numAttrs - number of attributes in attribute table.
* @param taskId - task to be notified of confirmation.
* @param pfnReadAttrCB - read callback function pointer.
*
* @return Success or Failure
*/
bStatus_t GATTServApp_ProcessCharCfg( gattCharCfg_t *charCfgTbl, uint8 *pValue,
uint8 authenticated, gattAttribute_t *attrTbl,
uint16 numAttrs, uint8 taskId,
pfnGATTReadAttrCB_t pfnReadAttrCB )
{
uint8 i;
bStatus_t status = SUCCESS;
// Verify input parameters
if ( ( charCfgTbl == NULL ) || ( pValue == NULL ) ||
( attrTbl == NULL ) || ( pfnReadAttrCB == NULL ) )
{
return ( INVALIDPARAMETER );
}
for ( i = 0; i < linkDBNumConns; i++ )
{
gattCharCfg_t *pItem = &(charCfgTbl[i]);
if ( ( pItem->connHandle != INVALID_CONNHANDLE ) &&
( pItem->value != GATT_CFG_NO_OPERATION ) )
{
gattAttribute_t *pAttr;
// Find the characteristic value attribute
pAttr = GATTServApp_FindAttr( attrTbl, numAttrs, pValue );
if ( pAttr != NULL )
{
if ( pItem->value & GATT_CLIENT_CFG_NOTIFY )
{
status |= gattServApp_SendNotiInd( pItem->connHandle, GATT_CLIENT_CFG_NOTIFY,
authenticated, pAttr, taskId, pfnReadAttrCB );
}
if ( pItem->value & GATT_CLIENT_CFG_INDICATE )
{
status |= gattServApp_SendNotiInd( pItem->connHandle, GATT_CLIENT_CFG_INDICATE,
authenticated, pAttr, taskId, pfnReadAttrCB );
}
}
}
} // for
return ( status );
}
