Get rssi value in cc2640 SimpleBLEPeripheral
时间:10-02
整理:3721RD
点击:
Hi All
[目的]
我希望當pc dongle連上cc2640 simpleBLEPeripheral時,pc dongle下cmd向cc2640取得cc2640的rssi。
[Issue]
當我執行GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE, sizeof(uint16_t), &rssi);
<peripheral.c>的gapRole_processStackMsg()的HCI_GAP_EVENT_EVENT不會被通知
[Code]
<simpleBLEPerpheral.c>
static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1)
{
....
Uint16_t rssiReadRate = 3000;
GAPRole_SetParameter(GAPROLE_RSSI_READ_RATE,
sizeof(uint16_t), &rssiReadRate);
....
}
<peripheral.c>
bStatus_t GAPRole_SetParameter(uint16_t param, uint8_t len, void *pValue)
{
…………
case GAPROLE_RSSI_READ_RATE:
if (len == sizeof(uint16_t))
{
gapRole_RSSIReadRate = *((uint16_t*)pValue);
if((gapRole_RSSIReadRate) && (gapRole_state == GAPROLE_CONNECTED))
{
Util_restartClock(&rssiReadClock, gapRole_RSSIReadRate);
}
}
else
{
ret = bleInvalidRange;
}
break;
…………
}
Static void gapRole_init(void)
{
GAP_RegisterForMsgs(selfEntity);
Util_constructClock(&rssiReadClock, gapRole_clockHandler, 0, 0, false, RSSI_READ_EVT);
}
Static void gapRole_taskFxn(Uarg a0, Uarg a1)
{
………
if (events & RSSI_READ_EVT)
{
events &= ~RSSI_READ_EVT;
// Only get RSSI when in a connection
if ((gapRole_state == GAPROLE_CONNECTED) || (gapRole_state == GAPROLE_CONNECTED_ADV))
{// Ask for RSSIhciStatus_t status = NULL;status = HCI_ReadRssiCmd(gapRole_ConnectionHandle); <======== return success// Setup the next eventif (gapRole_RSSIReadRate && !status){ Util_restartClock(&rssiReadClock, gapRole_RSSIReadRate);}
}
}
}
static void gapRole_processStackMsg(ICall_Hdr *pMsg)
{
Switch (pMsg->event)
{
Case HCI_GAP_EVENT_EVENT: <============ Never comingif (pMsg->status == HCI_COMMAND_COMPLETE_EVENT_CODE){ hciEvt_CmdComplete_t* pPkt = (hciEvt_CmdComplete_t*)pMsg; if(pPkt->cmdOpcode == HCI_READ_RSSI) { int8_t rssi = (int8_t)pPkt->pReturnParam[3]; if(((gapRole_state == GAPROLE_CONNECTED) || (gapRole_state == GAPROLE_CONNECTED_ADV)) && (rssi != RSSI_NOT_AVAILABLE)) { // Report RSSI to app if(pGapRoles_AppCGs && pGapRoles_AppCGs->pfnRssiRead) { pGapRoles_AppCGs->pfnRssiRead(rssi); } } }
}Break;
}
}
<peripheral.h>
typedef void (*gapRolesRssiRead_t)(int8_t newRSSI);
typedef struct
{
gapRolesStateNotify_t pfnStateChange;
gapRolesRssiRead_t pfnRssiRead;
} gapRolesCBs_t;
