我是 Maker! WiFi995 無線求救信標 (4) WiFi995 程式解說

WiFi995 的程式架構是並不複雜,但行數並不少,所有的功能大概有 600 行。其中包含信標用的程式、搜尋模式的程式、還有一些設定的程式碼。所以解說上可能會有點太漫長,會儘量挑重點講,一些太直覺的程式碼用途,就不再贅述。

 

程式流程

軟體流程

ESP8266 的使用者程式,最後都是呼叫到 user_init() @ user_main.c 的這支程式開始。而WiFi995 的程式流程,我們先稍微解說一下,再來看細部的程式碼。

  1. user_init() 裡,會先判斷是否是第一次上電。在信標模式下,進省電模式再醒來,基本上就是類似重上電的行為。差別在於 RTC 沒重上電,ESP8266 就是靠它來重新啟用。因此,每次醒來後,軟體的所有的變數都變成預設值。好在 RTC 內部有一小塊的記憶體可以供使用者使用,因此我們可以將一些狀態存在 RTC Memory 裡。在這裡,我們只是單純的在第一次開機會發出 BEEP 的聲音而已,用以通知硬體已準備完成。
  2. 接下來會判斷是否為信標模式或搜尋模式。搜尋模式每300ms, 會執行的 tm_stafunc() 這個 function, 做一些檢查或亮燈的動作,最重要是還會進入 Monitor Mode,來接收所有的 WiFi 資料,並註冊其處理 function 為 promisc_cb()。而在收到 WiFi 資料時,系統就會呼叫 promisc_cb(),判斷是否收到我們想要的信標訊號,是的話則會發出 BEEP 聲,並啟動 LED 燈閃爍機制
  3. 信標模式,則是每2ms會執行一次 tm_apfunc()。在第一次執行時,會檢查設定,第二次發出信標,第三次進入省電模式。所以在ESP8266都初始完成後,大概又花了6ms發出信標後,又進入省電模式。下次醒來後,就會從 user_init() 又開始執行。

 

細部程式

程式的說明,我們就都內嵌在程式碼內了,這樣解說方便些。

user_init() – 主程式

 

tm_apfunc() – 信標定時器

 

tm_stafunc() – 搜尋定時器

 

send_mybcn() – 發送信標

 

promisc_cb() – 判斷信標

voltage_check() – 檢查電壓

 

sta_startup_beep() – 搜尋模式啟動聲音

 

start_mybeep(), mybeep() – 發現搜尋信標警示音

 

is_ssid_mon() – 比對信標識別碼

 

其它程式

剩下沒解說到的程式碼,大部份就是比較直覺的。像是 parse/save user config data 或是透過API dump system memory 。還蠻多的,就不再贅述。

值得提的一點是,由於 ESP8266 使用者可用的 RAM 大約是40K 左右,如果把全部的程式碼放到 RAM,有時就會產生不足的現象。並非所有的程式都需要一次全部載入到 RAM 裡面,透過 ICACHE_FLASH_ATTR 修飾語句,可以讓function在執行時才載入到記憶體中。這特別適合那些 CLI 的測試功能。

Leave a Reply