1. 程式人生 > >ZigBee Z-Stack 3.14 按鍵驅動1-輪詢模式

ZigBee Z-Stack 3.14 按鍵驅動1-輪詢模式

(配套原始碼軟體開發板等資源,可移步部落格同名QQ群:拿破崙940911

(1)上面已經提及,Z-Stack協議棧中預設使用的就是“輪詢模式”,第一次觸發硬體抽象層任務(Hal_TaskID)中的按鍵查詢事件(HAL_KEY_EVENT)後,隨即也就觸發了間隔為100ms(1秒10次)的定時按鍵檢測(迴圈呼叫HalKeyPoll( )),故稱為“輪詢模式”:

uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
{
  ......

  if (events & HAL_KEY_EVENT)
  {

#if (defined HAL_KEY) && (HAL_KEY == TRUE)
    /* Check for keys */
    HalKeyPoll();

    /* if interrupt disabled, do next polling */
    if (!Hal_KeyIntEnable)
    {
      osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
    }
#endif // HAL_KEY

    return events ^ HAL_KEY_EVENT;
  }

  ......
}

(2)在HalKeyPoll( )函式中,對各個定義的按鍵狀態做完檢測之後,即呼叫前面指定的按鍵回撥函式OnBoard_KeyCallback( ),對鍵值做進一步處理:

void HalKeyPoll (void)
{
  ......
  /* Invoke Callback if new keys were depressed */
  if (keys && (pHalKeyProcessFunction))
  {
    (pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
  }
  ......
}
OnBoard_KeyCallback( )函式的程式碼如下,可見其中又進一步呼叫了OnBoard_SendKeys( ):
void OnBoard_KeyCallback ( uint8 keys, uint8 state )
{
  uint8 shift;
  (void)state;

  shift = (keys & HAL_KEY_SW_6) ? true : false;

  if ( OnBoard_SendKeys( keys, shift ) != ZSuccess )
  {
    ......
  }
}
在OnBoard_SendKeys( )函式中,最終將鍵值(keys)封裝成了一個keyChange_t型別的資料包,傳送至了registeredKeysTaskID任務:
uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
  ......
    // Send the address to the task
    msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
    if ( msgPtr )
    {
      msgPtr->hdr.event = KEY_CHANGE;
      msgPtr->state = state;
      msgPtr->keys = keys;

      osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
    }
  ......
}

至於registeredKeysTaskID,其實就是在RegisterForKeys( )函式中被賦值指定的:

uint8 RegisterForKeys( uint8 task_id )
{
  // Allow only the first task
  if ( registeredKeysTaskID == NO_TASK_ID )
  {
    registeredKeysTaskID = task_id;
    return ( true );
  }
  else
    return ( false );
}
而呼叫RegisterForKeys( )函式,則是在我們的應用層任務ProjectApp中,也就是所謂的“註冊按鍵”:
void ProjectApp_Init( uint8 task_id )
{
  ProjectApp_TaskID = task_id;
  ......
  RegisterForKeys( ProjectApp_TaskID );// Register for all key events - This app will handle all key events
  ......
}

(3)緊接著,我們的應用層任務ProjectApp就會收到鍵值所在的資料包,具體處理鍵值的程式碼如下:

uint16 ProjectApp_ProcessEvent( uint8 task_id, uint16 events )
{
  ......
  if ( events & SYS_EVENT_MSG )
  {
    ......
        case KEY_CHANGE         : ProjectApp_HandleKeys(((keyChange_t *)MSGpkt)->state,((keyChange_t *)MSGpkt)->keys);break;
    ......
  }
  ......
}

具體ProjectApp_HandleKeys( )這個鍵值處理函式實現什麼功能,就完全取決於大家自己啦~

(配套原始碼軟體開發板等資源,可移步部落格同名QQ群:拿破崙940911

相關推薦

ZigBee Z-Stack 3.14 按鍵驅動1-模式

(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)(1)上面已經提及,Z-Stack協議棧中預設使用的就是“輪詢模式”,第一次觸發硬體抽象層任務(Hal_TaskID)中的按鍵查詢事件(HAL_KEY_EVENT)後,隨即也就觸發了間隔為100ms

ZigBee Z-Stack 3.15 按鍵驅動2-中斷模式

(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)在Z-Stack協議棧中,對於按鍵的檢測,分為兩種不同的機制,分別稱為“輪詢模式”和“中斷模式”,類比微控制器中的按鍵檢測,還是很好理解的。但是相比我們之前所學所用,Z-Stack協議棧中的按鍵檢測

ZigBee Z-Stack 3.18 串列埠1-傳送

(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)這一節,基於《ZigBee CC2530 Z-Stack 06 建立基於Z-Stack的全新工程》一節中建立的全新工程ProjectApp進行進一步實驗,實現呼叫Z-Stack中現成的串列埠驅動函式

zigbee Z-Stack 3.0.1 利用廣播的方式修改通道

TI的zigbee協議棧的預設通道是11,如何快速修改為15通道呢? 方法就是給0xFFFF傳送廣播,來進行修改。 呼叫MTsys.c裡面提供的MT_ZdoMgmtNwkUpdateRequest函

ZigBee Z-Stack 3.17 串列埠00-總

(配套原始碼、文件、軟體等資源,可移步QQ群:拿破崙ZigBee) 一、前言 二、其他 關於如何在Z-Stack協議棧中使用串列埠實現資料的收發,很多朋友一上來就非常自信地開始按照自己的想法開始碼程式碼了。但是最終的實現效果卻總是不如意。 其實,作為一個協議

Z-Stack 3.0.1 ZNP開發(一)--通訊串列埠調整

概述 晶片:CC2530 協議棧: Z-Stack 3.0.1 功能:使用串列埠1的P1.6,P1.7連線MT7628,讓CC2530通過ZNP和MT7628進行通訊。 TI所提供的ZNP工程預設情況下是採用串列埠0與MCU進行通訊,所以接下來就需要通過修

zigbee z-stack實現按鍵的長按

由於按鍵檢測有中斷、和輪詢兩種方式,預設採用輪詢方式,對於輪詢方式的長按處理比較簡單,利用鬆開的時間點和松下的時間點之間的時間差即可實現。對於中斷的方式可以採用定時器方式,當中斷觸發的時候,開一個定時器,如果定時器到期了,按鈕還是按下狀態,就認為是長按。 vo

ZIGBEE-Z-stack協議棧

Z-stack--一個小作業系統。使用者通過 API 函式就可以輕易用 ZigBee。 協議棧主函式 ----Zmain.C /****************************************************************

ZigBee Z-Stack 4.02 基本網路引數設定

(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)一、Device Types(裝置型別)在ZigBee網路中存在三種邏輯裝置型別:Coordinator(協調器)、Router(路由器)和EndDevice(終端裝置)。ZigBee網路由一個Co

ZigBee Z-Stack 2.02 ZigBee規範版本

(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)一、ZigBee規範發展歷史2000年12月,成立了工作小組起草IEEE 802.15.4標準。2001年 8月,美國Honeywell等公司發起成立了ZigBee聯盟。2002年12月,IEEE8

ZigBee Z-Stack 2.05 搭建開發環境

(配套原始碼、軟體、開發板等資源,可移步部落格同名QQ群:拿破崙940911)一、安裝TI提供的半開源SDK—— ZStack-CC2530-2.5.1a.exe1、安裝過程非常簡單,全部選擇預設即可(可以更改安裝路徑);2、安裝好ZStack-CC2530-2.5.1a.e

十一、編寫按鍵混雜設備驅動

turn nbsp print gis tdi [] 運行 mage dynamic 1. 確定硬件連接   主要電路連接如下:   從電路圖中可以發現開發板上6個按鍵連接到了GPN0~5,當按鍵彈起時IO狀態應為高電平,當按鍵按下時IO口狀態為低電平。 2. 確定寄存器

ElasticSearch5.4.3 環境搭建 2017 (1-單節點模式/開發模式)

官網說:ElasticSearch-是分散式高可用全文搜尋-分析引擎。 官網入門教程:打我 居然還有中文版:再打我 軟體環境: ElasticSearch5.4.3 Centos 6.8 Java

zabbix-3.4監控nginx-1.14.0狀態

pid alt cto col stub tar ip地址 $1 mage zabbix需要監控nginx,則nginx需要配置nginx_status[root@nginx1 scripts]# /usr/local/nginx/sbin/nginx -Vnginx ve

基於Z-StackZigBee開發環境搭建

一、硬體環境 CC2530開發板 除錯工具:CC Debugger或SmartRF04EB ZigBee USB Dongle:用於抓包 二、軟體環境 2.1 Z-Stack 下載及安裝 Z-Stack下載路徑連結 下載HA協議棧 進入

演算法第四版習題1.3.141.3.19(Java實現)

近來在啃資料結構與演算法,歡迎交流。   1.3.14:用可變長度的陣列實現佇列(FIFO) 資料結構ResizingArrayQueueOfStrings 的實現: public class ResizingArrayQueueOfStrings { Stri

Method for Discovering Network Topology中文翻譯【Z-Stack Home 1.2.0開發文件】

1.Purpose 本文描述了在任何給定的網路測定網路技術的方法,使用Z-Stack的 ZDO(Zigbee Device Object)層的API。在繼續之前請先閱讀ZStack Developer’s Guide和ZStack API文件。 2.Method 使用ZDP_IE

linux裝置驅動3)字元驅動 -按鍵(查詢法)

本文描述查詢法。 所謂查詢法,就是在應用程式裡面執行 while (1) { read(fd, key_vals, sizeof(key_vals)); ... } 載入驅動並在後臺執行應用程式時, 通過top可以看到CPU利用率,該應用程序佔用9

kali 3.14 安裝RT3070 無線網絡卡驅動

最近對無線安全比較感興趣,買了個無線網絡卡,RT3070的晶片,去官網下了個linux的驅動,編譯安裝 rar, bunzip2, tar解壓,隨便說一下,tar解壓時需要自己重新命名,改為.tar的字尾 修改os/linux/ 下的config 檔案 # Support

Zigbee通訊之開發篇(基於TI 的Z-Stack

1.Zigbee協議和Z-Stack Zigbee協議和Z-Stack是什麼關係?這可能是初學Zigbee同學想知道的問題。給大家舉個例子吧,我們生活中使用的插排是要符合一定的標準的,現在國家標準是GB2099.3-2008,裡面規定了好多插排的電氣、機械等