2009年7月1日 星期三

Source Code 分析筆記-2

最近研究的Jennic公司提供的範例(ZigBee Home Sensor Demonstration)

今日的筆記是將每個函數的定義翻譯完成,了解每個函數的定義,日後研究內部寫法能夠提供一些靈感

coordinator code

ZigBee Home Sensor Demonstration(coordinator code)


AppColdStart()
這個函數是最主要的應用進入位置,在開機載入完畢之後將會呼叫它,此函數設置了channel以及Pan ID之後呼叫起始 function: vInitDemoSystem()

AppWarmStart()
當cpu暖開機或重啟時(ram的資料還保存)會呼叫此函數,在這個範例中這個模式並沒有被使用,所以這個函數只是呼叫AppColdStart() 於非安全機制下

JZA_boAppStart
此函數在初始化後會呼叫ZigBee的堆疊,並設置對profile的資訊以及敘述之後呼叫ZigBee堆疊中的函數開始建立起網路

JZA_vAppEventHandler()
ZigBee堆疊將會定期的呼叫此函數,是用來處理硬體的中斷序列,以這邊的例子而言只有一個每50ms觸發一次的wake timer,是用來讀取按鈕的讀取時間以及更新顯示

JZA_vPeripheralEvent()
當硬體周邊產生中斷,處理器處理中斷程序內容時,此函數將會被呼叫
此外為了縮減花在中斷程序的時間,關於中斷的資訊將會被置於FIFO queue,JZA_vAppEventHandler() 函數之後將會讀取這些資訊

JZA_vStackEvent()
這個函數被呼叫用來處理堆疊低層的雜項事件,例如APS層的資料傳輸確認,在這個應用示範中並沒有使用到這個函數

JZA_vAppDefineTasks()
這個函數可用來增加應用項目,在這個應用示範中並沒有使用到這個函數

JZA_eAfKvpObject()
當接收到KVP協定訊息時此函數將會被呼叫,同時也用來存取sensor node所傳送的資訊,它支援4個node並且從裝置的address確認裝置,若裝置的address並不在已知的裝置清單上頭,裝置將會被視為是新的node並且新增在清單上,同時螢幕也會更新

事實上,這個函數是用來切換 splash 畫面到 Network Display 畫面


JZA_vAfKvpResponse()
當KVP協定先前的請求被確認時,此函數將會被呼叫並且接收回應,這個應用範例並沒有使用到這個函數

JZA_pu8AfMsgObject()
當接受MSG協定時此函數將被呼叫,這個應用範例並沒有使用到這個函數

JZA_vZdpResponse()
當接受ZDP響應時此函數將被呼叫,這個應用範例並沒有使用到這個函數

vInitDemoSystem()
此函數將會呼叫ZigBee堆疊的初始化函數,並且初始化將會用到的硬體以及設置 Splash 螢幕畫面

20-Hz脈波的Wake-up timer在這裡將會被校準並且啟用,但是並不會開始動作

函數的最後動作是啟動BOS,當BOS啟動失敗時函數將會回傳

InitCoord()
涉及endpoint sensor的資訊在這裡將會被初始化

vSetTimer()
此函數使用Integrated Peripherals API 啟動1600循環的wake-up timer ,大約是1/20秒

vProcessCurrentTimeBlock()
此函數執行state machine,只有一個動作,就是更新顯示

vProcessKeys()
在正在顯示的畫面中這個函數傳達按鈕的表現給適當的函數,按鈕都是 soft 的,對應的函數根據不同的畫面有所不同

vUpdateTimeBlock()
如果Coordinator在正確的狀態下,此函數會增量state machine,state machine在某些螢幕顯示時將不會有作用



vSendData()
此函數製造協定KVP的傳輸請求,用來控制sensor node的LED

vProcessUpdateBlock()
此函數更新所有node的圖形量表,在相對應的螢幕下,縮放適合的資料然後更新顯示

Keypresses
vProcessSplashKeyPress
vProcessNetworkKeyPress
vProcessNodeKeyPress
這些函數的作用都是一樣的,對按鈕的表現調整數值,設置數據或是切換到其他螢幕

vUpdateNetworkSensor()
當 Network 螢幕畫面更新時,此函數將被呼叫,用來同時顯示所有node的相同sensor type

LCD screens
vBuildNetworkScreen()
vBuildNodeScreen()
這些函數都演示了LCD即時螢幕的創造物(字?),使用Board API,注意字體的定義需要odd 字元才能使用,如 \ 代表 + , ] 代表 –

通常呼叫vLcdRefreshAll() 是用來在LCD上產生一個新的顯示,但是在所有的案例中相關更新的函數會先被呼叫,然後才是呼叫vLcdRefreshAll()

廣泛使用的類型諸如vLcdWriteText()、vBuildSetChannelScreen()都是使用vLcdWriteBitmap() ,使用的是點陣圖,其定義在 JennicLogo.c 這個檔案裡頭

vUpdateSetChannelScreen()
vUpdateNetworkScreen()
vLcdUpdateElement()
vUpdateNodeScreen()
vUpdateNodeControlScreen()
vUpdateSetupScreen()
這些函數是用來更新即時的LCD螢幕,同時保留之前的資訊,注意空白字元是用來刪除不要的文字

vDrawGraph()
此函數在0到13的範圍製造出32值的陣列,並且製造出點陣圖型,可使用預設的點陣圖型或是允許沒有複雜演算法的簡單圖型

每個圖型都是由兩行資料所組成的陣列,一個常數陣列的定義包含了由每個必須在0到13之間的數值所組成的數值,陣列將會充滿適當的數據

點陣圖的結構是由一個占33列寬以及兩個字元行高的項目組成



上述的資料說明請參閱JN-UG-3033-ZigBee-HomeSensorDemo-1v3.pdf

沒有留言:

張貼留言