|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
Functions | |
| bool | ipc_ui_init (lv_obj_t *parent) |
| การเริ่มการทำงานของ UI handler — ลำดับสุดท้ายใน boot prologue และถูกกั้นด้วย display_ok | |
| void | ipc_ui_set_container (lv_obj_t *parent) |
| เป็นการส่งต่อบรรทัดเดียวไปยัง ui_widget_mgr_set_parent(); การส่ง NULL ตอนทำลายเป็นข้อบังคับ | |
| void | ipc_ui_input_activity (void) |
| ตั้ง fast drain 5 ms ให้พร้อมทำงานเป็นเวลาหนึ่งช่วง FAST_TIMEOUT | |
Header: ipc_ui.h ตัวโค้ดที่ทำงานจริง: ipc_ui.c ที่อยู่ใน archive (libbento_ipc.a) ครอบคลุมการเริ่มการทำงานของ UI handler การผูก container และ input hook "ISR callback -> FreeRTOS queue -> LVGL timer (50ms) processes commands in GFX task context" (ipc_ui.h): ฝั่ง ISR ทำเพียงใส่คิวเท่านั้น ทุกการดำเนินการกับ LVGL เกิดขึ้นบน timer ภายใน GFX task ส่วน weak hook 3 ตัวที่ประกาศหรืออ้างถึงที่นี่ (ipc_ui_ext_dispatch, ipc_ui_ext_clear_all, ipc_ui_platform_diag) อธิบายไว้รวมกับ hook ตัวอื่นที่ Weak hook (ให้นิยามเอง ห้ามเรียก)
| bool ipc_ui_init | ( | lv_obj_t * | parent | ) |
การเริ่มการทำงานของ UI handler — ลำดับสุดท้ายใน boot prologue และถูกกั้นด้วย display_ok
Initialize the IPC UI handler. Registers IPC callback, creates FreeRTOS queue, and LVGL timer. Must be called after LVGL and IPC Pipe are initialized.
| parent | LVGL parent object for user-created widgets (UX/UI tab container). |
cm55_ipc_communication_setup() ก่อน เพราะเป็นเจ้าของ Cy_IPC_Pipe_Init() ; (2) ipc_sensorhub_init() แล้วจึง ipc_service_init() ก่อนการเริ่มการทำงานของ GFXSS เพื่อให้ IPC ยังอยู่รอดเมื่อจอแสดงผลล้มเหลว; (3) ipc_ui_init() เป็น ลำดับสุดท้าย และ ถูกกั้น ด้วย display_ok เพราะมันเรียก lv_timer_create() (ipc_ui.c:911) — ขณะที่ ipc_lcd_init() ไม่ถูกกั้น: ป้าย ipc_only: คือสาระทั้งหมดของเรื่องนี้; (4) ทั้ง 2 ฟังก์ชันรับ NULL (deferred binding — การผูกแบบเลื่อนเวลา); (5) ค่าที่คืนชนิด bool ของทั้งสองถูก (void) -cast อย่างชัดแจ้ง — ความล้มเหลวห้ามทำให้การบูตหยุดกลางคัน ภายในฟังก์ชัน เมื่อ Cy_IPC_Pipe_RegisterCallback ล้มเหลว มันจะลบ queue ของตัวเองแล้วคืนค่า false (ipc_ui.c:885-913) มันเรียก ui_widget_mgr_init() เองเป็นคำสั่งแรก — ห้ามเรียกฟังก์ชันนั้นเอง ห้ามเรียก cm55_ipc_communication_setup() 2 ครั้ง (wifi_manager.c:65) หมายเหตุ: หลักฐานไม่พบข้อความยืนยันในโค้ดถึงกฎ "no printf in the CM55 IPC ISR" ที่จุดเหล่านี้ — จึงไม่มีการอ้างกฎนั้นไว้ที่นี่ | void ipc_ui_set_container | ( | lv_obj_t * | parent | ) |
เป็นการส่งต่อบรรทัดเดียวไปยัง ui_widget_mgr_set_parent(); การส่ง NULL ตอนทำลายเป็นข้อบังคับ
Update the widget parent container (for page-based navigation). Called when Playground page is created/destroyed. Pass NULL to invalidate (page destroyed), non-NULL to activate.
| parent | LVGL container or NULL. |
ui_widget_mgr_set_parent() (ipc_ui.c:918-921) มีข้อผูกพันเรื่องการส่ง NULL ตอนทำลายเหมือน ipc_lcd_set_container(): หน้า (page) จะผูก container ของเนื้อหาตอนสร้าง และ ต้องส่ง NULL ตอนทำลาย มิฉะนั้น IPC handler จะเขียนลงในอ็อบเจ็กต์ LVGL ที่ lv_screen_load_anim(auto_del) ปลดหน่วยความจำไปแล้ว ลำดับการผูกคือ ui แล้วตามด้วย lcd ตอนสร้าง และเหมือนกันตอนทำลาย คืนค่า void ทำงานใน GFX-task context พึงทราบว่า ui_widget_mgr_set_parent() เคลียร์ widget ที่มีอยู่ทั้งหมดเมื่อ parent เปลี่ยน — การสลับหน้า (page) จึงทิ้ง widget ของสคริปต์ MicroPython ไปโดยเจตนา | void ipc_ui_input_activity | ( | void | ) |
ตั้ง fast drain 5 ms ให้พร้อมทำงานเป็นเวลาหนึ่งช่วง FAST_TIMEOUT
FAST_TIMEOUT เพื่อให้การแตะครั้งแรกของแอปที่นิ่งอยู่ได้รับการตอบสนองที่ความหน่วงระดับ fast mode แทนที่จะต้องรอ idle tick 200 ms จนหมด ผู้เรียกเพียงรายเดียวคือ input event callback ของ widget manager ที่อยู่ใน archive (ui_widget_mgr.c:2667) ซึ่งคอมเมนต์ของมันคือตัวข้อกำหนด: "Runs in GFX task context (LVGL event callback) — same context the drain timer callback uses, so no locking is needed." โดยเจตนาแล้วฟังก์ชันนี้ ไม่ถูกต่อเข้ากับ POLL_EVENTS : การวนถาม (polling) เกิดขึ้นต่อเนื่อง การตั้งให้พร้อมทำงานที่จุดนั้นจึงจะตรึง fast mode ให้เปิดค้างถาวร และย้อนการปรับ GFX sleep-clamp ที่คุ้มครอง ai_infer / radar ไว้ (ipc_ui.h) นิยามอยู่ที่ ipc_ui.c:158-160 LVGL input callback ของผู้ใช้ไลบรารี (consumer) เองอาจเรียกฟังก์ชันนี้ด้วยเหตุผลเดียวกัน นอกเหนือจากนั้น ไม่มีสิ่งใดที่ควรเรียกฟังก์ชันนี้ BENTO-TESAIoT-libraries/claw/common/modules/ipc_ui/ui_widget_mgr.c:2667 (คอมไพล์รวมอยู่ใน archive ที่สร้างไว้ล่วงหน้า ไม่ได้ส่งมอบมาเป็นซอร์ส): input event callback ของ widget เรียก ipc_ui_input_activity() หนึ่งครั้งต่อการป้อนข้อมูลจริงของผู้ใช้หนึ่งครั้ง หลังผ่าน gate ของ event mask ประจำ widget จุดนี้ปักหมุดไว้ ไม่ได้ทำซ้ำ