SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (ModusToolbox)
Loading...
Searching...
No Matches

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

Detailed Description

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 (ให้นิยามเอง ห้ามเรียก)

variant ที่ใช้ได้
mtb-mpy และ mtb-only

Function Documentation

◆ ipc_ui_init()

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.

Parameters
parentLVGL parent object for user-created widgets (UX/UI tab container).
Returns
true on success.
ข้อกำหนดการเรียกใช้
ข้อกำหนดของการ init ทั้งหมด เรียงตามลำดับ: (1) 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" ที่จุดเหล่านี้ — จึงไม่มีการอ้างกฎนั้นไว้ที่นี่
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก TESAIoT_KIT_PSE84_AI-Micropython-BentoClaw/proj_cm55/modules/lvgl_display/controller/tesaiot_display.c:470-479 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)
ลำดับช่วงต้นของการบูต (ไฟล์เดียวกัน บรรทัด 223-238)
ที่มา
ยกมาจาก tesaiot_display.c:223-238 (คอมไพล์รวมอยู่ใน archive สำเร็จรูป ไม่ได้ส่งมอบมาเป็นซอร์ส)

◆ ipc_ui_set_container()

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.

Parameters
parentLVGL 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 ไปโดยเจตนา
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ตัวอย่าง — ผูก container ตอนสร้าง (เทมเพลต)
/* ...context: inside page_playground_create() ... */
/* Store as UX/UI container for IPC widget creation */
s_uxui_container = content;
/* Terminal container: same as content — ipc_lcd creates terminal inside */
s_terminal_container = content;
/* Bind containers to IPC handlers (deferred from boot) */
ตัวอย่าง — ปลด container ตอนทำลาย (เทมเพลต)
void page_playground_destroy(void)
{
/* Unbind containers from IPC handlers — prevents writing to stale objects.
* The actual LVGL objects are destroyed by lv_screen_load_anim(auto_del). */
s_uxui_container = NULL;
s_terminal_container = NULL;

◆ ipc_ui_input_activity()

void ipc_ui_input_activity ( void )

ตั้ง fast drain 5 ms ให้พร้อมทำงานเป็นเวลาหนึ่งช่วง FAST_TIMEOUT

ข้อกำหนดการเรียกใช้
ตั้ง fast drain 5 ms ให้พร้อมทำงานเป็นเวลาหนึ่งช่วง 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) เองอาจเรียกฟังก์ชันนี้ด้วยเหตุผลเดียวกัน นอกเหนือจากนั้น ไม่มีสิ่งใดที่ควรเรียกฟังก์ชันนี้
variant ที่ใช้ได้
mtb-mpy และ mtb-only
ที่มา
ยกมาจาก 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 จุดนี้ปักหมุดไว้ ไม่ได้ทำซ้ำ