-----------------------------------------------------------------simple_peripheral.c (初始化)
// After the connection is formed, the peripheral waits until the central
// device asks for its preferred connection parameters
#define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_WAIT_REMOTE_PARAMS
注意:需要特别注意DEFAULT_ENABLE_UPDATE_REQUEST
。需要在其 定义处修改成GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS
。这样双方都可以启动连接参数更新过程
uint8_t enableUpdateRequest = DEFAULT_ENABLE_UPDATE_REQUEST;
uint16_t desiredMinInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
uint16_t desiredMaxInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
uint16_t desiredSlaveLatency = DEFAULT_DESIRED_SLAVE_LATENCY;
uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT;
GAPRole_SetParameter(GAPROLE_PARAM_UPDATE_ENABLE, sizeof(uint8_t), &enableUpdateRequest);
GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desiredMinInterval);
GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desiredMaxInterval);
GAPRole_SetParameter(GAPROLE_SLAVE_LATENCY, sizeof(uint16_t), &desiredSlaveLatency);
GAPRole_SetParameter(GAPROLE_TIMEOUT_MULTIPLIER, sizeof(uint16_t), &desiredConnTimeout);
-----------------------------------------------------------------main.c
GAPRole_createTask();
-----------------------------------------------------------------peripheral.c
Task_construct(&gapRoleTask, gapRole_taskFxn, &taskParams, NULL);
-----------------------------------------------------------------peripheral.c
gapRole_init();
-----------------------------------------------------------------peripheral.c
Util_constructClock(&startUpdateClock, gapRole_clockHandler, 0, 0, false, START_CONN_UPDATE_EVT);
-----------------------------------------------------------------peripheral.c (触发)
static void gapRole_taskFxn(UArg a0, UArg a1)
{
// Initialize profile
gapRole_init();
// Profile main loop
for (;;)
{
if (events)
{
ICall_EntityID dest;
ICall_ServiceEnum src;
ICall_HciExtEvt *pMsg = NULL;
if (ICall_fetchServiceMsg(&src, &dest,
(void **)&pMsg) == ICALL_ERRNO_SUCCESS)
{
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity))
{
ICall_Stack_Event *pEvt = (ICall_Stack_Event *)pMsg;
// Check for BLE stack events first
if (pEvt->signature == 0xffff)
{
if (pEvt->event_flag & GAP_EVENT_SIGN_COUNTER_CHANGED)
{
// Sign counter changed, save it to NV
VOID osal_snv_write(BLE_NVID_SIGNCOUNTER, sizeof(uint32_t),
&gapRole_signCounter);
}
}
else
{
// Process inter-task message
gapRole_processStackMsg((ICall_Hdr *)pMsg);
}
}
if (pMsg)
{
ICall_freeMsg(pMsg);
}
}
}
....
}
....
}
static void gapRole_processStackMsg(ICall_Hdr *pMsg)
{
switch (pMsg->event)
{
case GAP_MSG_EVENT:
gapRole_processGAPMsg((gapEventHdr_t *)pMsg);
break;
......
}
......
}
static void gapRole_processGAPMsg(gapEventHdr_t *pMsg)
{
.....
case GAP_LINK_ESTABLISHED_EVENT:// 连接成功建立之后底层返回的事件
{
gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg;
if (pPkt->hdr.status == SUCCESS)
{
VOID memcpy(gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN);
gapRole_ConnectionHandle = pPkt->connectionHandle;
gapRole_state = GAPROLE_CONNECTED;
// Store connection information 保存连接刚建立时的连接参数
gapRole_ConnInterval = pPkt->connInterval;
gapRole_ConnSlaveLatency = pPkt->connLatency;
gapRole_ConnTimeout = pPkt->connTimeout;
gapRole_ConnectedDevAddrType = pPkt->devAddrType;
// 检测更新连接参数请求是否被使能
// Check whether update parameter request is enabled
if ((gapRole_updateConnParams.paramUpdateEnable ==
GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS) ||
(gapRole_updateConnParams.paramUpdateEnable ==
GAPROLE_LINK_PARAM_UPDATE_INITIATE_APP_PARAMS))
{
// Get the minimum time upon connection establishment before the
// peripheral can start a connection update procedure.
// 获取设置的时间间隔,
uint16_t timeout = GAP_GetParamValue(TGAP_CONN_PAUSE_PERIPHERAL);
//从机将在连接建立之后延时至少该时间间隔之后触发连接参数更新事件 // ----------->
Util_restartClock(&startUpdateClock, timeout*1000);
}
// Notify the Bond Manager to the connection
VOID GAPBondMgr_LinkEst(pPkt->devAddrType, pPkt->devAddr,
pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL);
}
else if (pPkt->hdr.status == bleGAPConnNotAcceptable)
{
// Set enabler to FALSE; device will become discoverable again when
// this value gets set to TRUE
gapRole_AdvEnabled = FALSE;
// Go to WAITING state, and then start advertising
gapRole_state = GAPROLE_WAITING;
}
else
{
gapRole_state = GAPROLE_ERROR;
}
notify = TRUE;
}
break;
.....
}
-----------------------------------------------------------------peripheral.c (执行)
static uint16_t gapRole_ConnInterval = 0;
static uint16_t gapRole_ConnSlaveLatency = 0;
static uint16_t gapRole_ConnTimeout = 0;
static uint8_t gapRole_ConnectedDevAddrType = 0;
static uint8_t gapRole_ConnTermReason = 0;
**********
#define DEFAULT_MIN_CONN_INTERVAL 0x0006 // 100 milliseconds
#define DEFAULT_MAX_CONN_INTERVAL 0x0C80 // 4 seconds
#define MIN_SLAVE_LATENCY 0
#define MAX_SLAVE_LATENCY 500
**********
// Connection parameter update parameters.
static gapRole_updateConnParams_t gapRole_updateConnParams =
{
// Default behavior is to accept the remote device's request until application changes local parameters.
.paramUpdateEnable = GAPROLE_LINK_PARAM_UPDATE_WAIT_REMOTE_PARAMS,
.minConnInterval = DEFAULT_MIN_CONN_INTERVAL,
.maxConnInterval = DEFAULT_MAX_CONN_INTERVAL,
.slaveLatency = MIN_SLAVE_LATENCY,
.timeoutMultiplier = DEFAULT_TIMEOUT_MULTIPLIER
};
**********
if (events & START_CONN_UPDATE_EVT)
{
// Start connection update procedure
gapRole_startConnUpdate(GAPROLE_NO_ACTION, &gapRole_updateConnParams);
}
-----------------------------------------------------------------peripheral.c
linkParams.connectionHandle = gapRole_ConnectionHandle;
linkParams.intervalMin = pConnParams->minConnInterval;
linkParams.intervalMax = pConnParams->maxConnInterval;
linkParams.connLatency = pConnParams->slaveLatency;
linkParams.connTimeout = pConnParams->timeoutMultiplier;
status = GAP_UpdateLinkParamReq( &linkParams );
if(status == SUCCESS)
{
paramUpdateNoSuccessOption = handleFailure;
// Let's wait either for L2CAP Connection Parameters Update Response or
// for Controller to update connection parameters
Util_restartClock(&updateTimeoutClock, timeout);
}
-----------------------------------------------------------------
-----------------------------------------------------------------