CC2530 Note 1:( ProcessEvent, MSGpkt, MessageMSGCB)

搞了半天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;
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章