Python 已經能在 MPU 上執行,今天要把未來會收到的兩種訊息,一種是 MCU 回報狀態,一種是 Web 要求切換分別歸到兩個處理入口。
函式是一段有名稱的程式區塊,只有被呼叫時才會執行,後續收到事件時,不需要把所有判斷都塞在檔案最外層,而是依事件名稱交給對應函式處理。
本專案先建立 on_led_status() 與 on_toggle_led(),前者準備接收 MCU 回報的 LED 狀態,後者準備接收未來 Web 傳來的操作命令,名稱前面的 on_ 表示某件事情發生時要執行的入口。
在 Day 11 程式中加入以下兩個函式。
edge_box_name = "智慧路口 Edge Box"
service_ready = True
# 本日新增
def on_led_status(state: bool):
print("收到 MCU 狀態:", state)
def on_toggle_led(client_id, data):
print("收到切換要求:", client_id, data)
# 先以本地呼叫確認函式、參數與回呼結構。
on_led_status(False)
on_toggle_led("local-test", {})
def 後面接函式名稱,括號內放入它將來可能收到的參數,最後以冒號結束,下一行必須縮排,Python 依縮排判斷哪些內容屬於這個函式。
on_led_status(state: bool) 只有一個 state 參數,後面的 : bool 是型別提示,表示這裡預期收到 True 或 False,型別提示能讓閱讀者理解資料用途,但不會把函式變成另一套 C++ 宣告方式。
函式定義完成後,Python 只是記住這個名稱與區塊,並不會自動執行其中內容,也還不知道哪一個外部事件要交給它,真正的 callback 除了要有函式,後續還必須由 Bridge 或 WebUI 將事件名稱登記到對應入口,今天先把接收位置準備好,避免通訊加入後才臨時混在一起。
on_toggle_led(client_id, data) 預留兩個參數,client_id 將用來辨認事件來源,data 則代表事件附帶的資料,目前還沒有 Web 事件,因此函式不會被呼叫,也不需要提前猜測資料內容。
兩個函式內暫時只有 pass,它代表這個區塊先保留空白,Python 仍可正常解析程式,等真正接上 MCU 與 Web 後,再逐步將處理內容放進對應位置。
按下 Run 後,Python Console 應顯示如下圖結果,而兩個 callback 不會產生任何輸出,因為目前只有定義函式,程式尚未呼叫它們。

再次按下 D9,D2 LED 仍應正常切換,這表示新增 Python 函式並未改變 MCU 的現場控制,兩顆大腦依舊各自執行自己的工作。
def 建立兩個訊息處理入口。state: bool 說明預期資料型別。現在訊息已經有了固定入口,但 Python 程式執行完仍會結束,真正的 Edge Service 不能只跑一下就離開,下一篇要讓它留在 MPU 上持續等待事件。
下一篇|讓 Edge Service 保持運行