搞了半天CC2530 GenericApp 的總結:
最概況的話是
事件(Events) 觸發 用戶函數XXXApp_ProcessEvent()
判斷event 類型
1. System event: 接收MSGpkt
判斷 MSGpkt-> hdr.event: case : XXXApp_MessageMSGCB或者xxx_SendTheMessage()
2. 自定義Event: 自定義函數func()
具體追溯:
1. 系統運行函數:
void osal_run_system( void )
{
uint8 idx = 0;
....
do {
if (tasksEvents[idx]) // 檢測觸發事件
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
uint16 events;
halIntState_t intState;
HAL_ENTER_CRITICAL_SECTION(intState); //關閉中斷
events = tasksEvents[idx];
tasksEvents[idx] = 0; // Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState);
activeTaskID = idx;
events = (tasksArr[idx])( idx, events );
// 執行用戶應用, 用戶的idx在taskArry[ ]對應的是XXXApp_Process_Event(idx,events)
activeTaskID = TASK_NO_TASK;
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
}
//..........
}
備註:
OSAL_XXXApp.c 中
將XXXApp_ProcessEvent 加入taskArry[ ]:
taskArr[idx] = XXXApp_Process_Event(idx, events):
初始化 tasksArr [ ]:
osalInitTasks():XXXApp_Init(idx)
2. 觸發Process_Event(idx,events):
執行過程:
XXXApp_Process_Event(idx, events):
if (events & SYS_EVENT_MSG)
MSGpkt = osal_msg_receive(idx); 消息列表裏收消息
switch MSGpkt->hdr.event:
消息是否爲命令(Cluster)種類 (最常用的!)
case AF_INCOMING_MSG_CMD:
XXXApp_MessageMSGCB(MSGpkt);
MessageMSGCB裏面格式: [switch ( pkt->clusterId ) case GENERICAPP_CLUSTERID: 自定義XXX()]
消息是否爲設備狀態改變(終端加入網絡時會用到!)
case ZDO_STATE_CHANGE:
XXXApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( XXXApp_NwkState ==DEV_ZB_COORD/DEV_ROUTER/DEV_END_DEVICE )
XXXApp_SendTheMessage();
還沒研究清楚==:case ZDO_CB_MSG: XXXApp_ProcessZDOMsgs(MSGpkt);
消息是按鍵case KEY_CHANGE: XXXApp_HandleKeys( MSGpkt)->state, MSGpkt)->keys );
//自己定義MSG_EVT和函數:
if (events & XXXApp_SEND_MSG_EVT)XXXApp_SendTheMessage()
(什麼時候會用到還沒搞明白。。。待更新)
一些小細節:
1. Coordinator's short address is fixed to 0x0000
比如要發送給 coordinator:先設置my_DstAddr.addr.shortAddr = 0x0000, 然後AF_DataRequest(&my_DstAddr, ....)
2. 在 SimpleDescriptionFormat_t 中AppNumIn(Out)Clusters的含義
舉例:(《Zigbee無線傳感器網絡設計與實現》pp43~57)
Coordinator:只接收一種命令,不發送命令時
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
GENERICAPP_ENDPOINT, // int Endpoint;
GENERICAPP_PROFID, // uint16 AppProfId[2];
GENERICAPP_DEVICEID, // uint16 AppDeviceId[2];
GENERICAPP_DEVICE_VERSION, // int AppDevVer:4;
GENERICAPP_FLAGS, // int AppFlags:4;
GENERICAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)GenericApp_ClusterList, // byte *pAppInClusterList;
0, // byte AppNumOutClusters;
(cId_t *)NULL // byte *pAppOutClusterList;
};
Enddeivce:只發送一種命令,不接收命令時
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
GENERICAPP_ENDPOINT, // int Endpoint;
GENERICAPP_PROFID, // uint16 AppProfId[2];
GENERICAPP_DEVICEID, // uint16 AppDeviceId[2];
GENERICAPP_DEVICE_VERSION, // int AppDevVer:4;
GENERICAPP_FLAGS, // int AppFlags:4;
0, // byte AppNumInClusters;
(cId_t *)NULL, // byte *pAppInClusterList;
GENERICAPP_MAX_CLUSTERS, // byte AppNumOutClusters;
(cId_t *)GenericApp_ClusterList // byte *pAppOutClusterList;
};