这里我问些基础性的问题。比如结构体指针强制转换
比如在主机Central.c文件中有gapCentralRole_ProcessGAPMsg函数,传来一个gapEventHdr_t *pMsg类型的指针变量。指向gapEventHdr_t结构体。
该结构体的类型申明如下
typedef struct { osal_event_hdr_t hdr; //!< GAP_MSG_EVENT and status uint8 opcode; //!< GAP type of command. Ref: @ref GAP_MSG_EVENT_DEFINES } gapEventHdr_t;
在该函数下面该死的是有如下回调代码,还强制转换为gapCentralRoleEvent_t结构体。
// Pass event to app if ( pGapCentralRoleCB && pGapCentralRoleCB->eventCB ) { pGapCentralRoleCB->eventCB( (gapCentralRoleEvent_t *) pMsg ); }
这里补充gapCentralRoleEvent_t结构体申明代码。
typedef union { gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure. gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure. gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure. gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure. } gapCentralRoleEvent_t;
讲了那么多无关又好像有关的背景知识后回归主题,现在说出我的困惑。我们追踪代码可以发现这里回调的是simpleBLECentral.c文件下的simpleBLECentralEventCB函数。但是simpleBLECentralEventCB函数和gapCentralRole_ProcessGAPMsg都是通过一个switch分支来选择执行那个分支。那么这样的话,在simpleBLECentralEventCB函数下switch ( pEvent->gap.opcode) 和gapCentralRole_ProcessGAPMsg函数下的switch ( pMsg->opcode )这两个判断条件下的case 常量表达式应该是一样的。。。但是理想很丰满,,,现实让我很矛盾。。。。
比如simpleBLECentralEventCB函数下有 case GAP_DEVICE_INFO_EVENT: 分支 但是呢我在gapCentralRole_ProcessGAPMsg函数下的switch ( pMsg->opcode )怎么没有看到GAP_DEVICE_INFO_EVENT事件啊。这个理解超出我的脑容量啦啊
求TI大神就我。比如Yan大神,Mark_xu大神
不同层的应用回调,所用的东西不一样,所以有的回调里面有,有的没有,你可以把没有的添加加进去,然后打印一下,自己测试一下,理论上是一样的……