|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
Functions | |
| bool | ipc_sensorhub_init (void) |
| การลงทะเบียน callback ของ pipe — ลำดับที่สองใน boot prologue | |
| void | ipc_sensorhub_snapshot (sensorhub_snapshot_t *snap) |
| ต่อหนึ่ง tick มีผู้อ่านได้รายเดียว — การอ่านจะเคลียร์แฟล็ก changed | |
| bool | ipc_sensorhub_wifi_connected (void) |
| สถานะ WiFi ที่ได้จากการวนถาม — ต้อง edge-detect ก่อนแตะ LVGL | |
| bool | ipc_sensorhub_ble_connected (void) |
| คืน true เฉพาะขณะที่ NUS host อยู่ในสถานะ CONNECTED เท่านั้น; ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ | |
| bool | ipc_sensorhub_ntp_synced (void) |
| เป็น gate ของการอ่าน RTC ทั้งหมด | |
| bool | ipc_sensorhub_get_time_str (char *buf, size_t buf_size) |
| สตริงเวลาล่าสุดที่ CM33 ส่งมา; คืน false ก่อน NTP sync | |
| void | ipc_sensorhub_feed_capsense (const ipc_sensor_capsense_t *data) |
| การป้อนตัวอย่างค่า CapSense ที่อ่านในเครื่อง — ต้องกำหนดค่าเริ่มต้นครบทุกฟิลด์ และใช้ sequence ร่วมกัน | |
| void | ipc_sensorhub_feed_pot (const ipc_sensor_pot_t *data) |
| ค่าของ pot ที่ปรับเป็นค่ามาตรฐานแล้ว ไม่ใช่ค่านับจาก ADC; ต้องตรวจ pot_channels_ready() ก่อน | |
| void | ipc_sensorhub_feed_bmi270 (const ipc_sensor_bmi270_t *data) |
| การป้อนตัวอย่างค่า IMU ที่อ่านในเครื่อง; ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ | |
| void | ipc_sensorhub_feed_bmm350 (const ipc_sensor_bmm350_t *data) |
| การป้อนตัวอย่างค่าแมกนีโตมิเตอร์ที่อ่านในเครื่อง; ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ | |
Header: ipc_sensorhub.h ตัวโค้ดที่ทำงานจริง: ipc_sensorhub.c ที่อยู่ใน archive (libbento_ipc.a) ฝั่ง ISR (interrupt service routine) เก็บตัวอย่างค่าล่าสุดจากเซนเซอร์ทุกตัวที่ CM33_NS ส่งมา ส่วนผู้อ่านรับค่าเป็น sensorhub_snapshot_t บนบอร์ดที่ CM55 เป็นเจ้าของบัสของเซนเซอร์ (Eva Kit และบอร์ดฐานของ TESAIoT Dev Kit) ฟังก์ชัน feed_* จะป้อนตัวอย่างค่าที่อ่านได้ในเครื่องบน CM55 เข้าสู่ที่เก็บ (store) เดียวกัน
| bool ipc_sensorhub_init | ( | void | ) |
การลงทะเบียน callback ของ pipe — ลำดับที่สองใน boot prologue
Initialize IPC sensorhub receiver. Registers IPC pipe callback on CM55_IPC_SENSOR_CLIENT_ID. Must be called AFTER cm55_ipc_communication_setup().
ipc_sensorhub.h) display controller ที่อยู่ใน archive เรียกฟังก์ชันนี้เป็นลำดับที่สองใน boot prologue (ช่วงต้นของลำดับการบูต) ก่อน ipc_service_init() และก่อนการเริ่มการทำงานของ GFXSS เพื่อให้ IPC ของเซนเซอร์ยังอยู่รอดเมื่อจอแสดงผลล้มเหลว ลงทะเบียน callback ของ pipe บน CM55_IPC_SENSOR_CLIENT_ID ผู้ใช้ไลบรารี (consumer) ที่ใช้ display controller ที่ส่งมอบมาจะไม่เรียกฟังก์ชันนี้เลย | void ipc_sensorhub_snapshot | ( | sensorhub_snapshot_t * | snap | ) |
ต่อหนึ่ง tick มีผู้อ่านได้รายเดียว — การอ่านจะเคลียร์แฟล็ก changed
Take a snapshot of the latest sensor data. Clears the "changed" flags after reading. Safe to call from any task context.
| snap | Output snapshot struct. |
sensorhub_snapshot_t บน stack ของตนเอง และส่งที่อยู่ของมันเข้ามา header ระบุว่า "Safe to call from any task context" แต่ระบุด้วยว่า "Clears the 'changed' flags after reading" — ดังนั้นต่อหนึ่ง tick จึงมีผู้อ่านเรียกได้ เพียงรายเดียว พอดี นั่นคือเหตุผลที่ UI อ่าน snapshot ครั้งเดียวที่ 33 ms แล้วกระจายต่อผ่าน pm_render() แทนที่จะให้แต่ละหน้า (page) อ่าน snapshot ของตัวเองแยกกัน ผู้เรียกที่อยู่ใน archive อีก 2 รายซึ่งอยู่ในบริบทอื่นยืนยันข้ออ้างเรื่อง any-task นี้: AI inference task (ai_engine.c:795) และ IPC service task (ipc_service.c:729) คืนค่า void | bool ipc_sensorhub_wifi_connected | ( | void | ) |
สถานะ WiFi ที่ได้จากการวนถาม — ต้อง edge-detect ก่อนแตะ LVGL
Returns true if CM33_NS reported WiFi connected via IPC_CMD_WIFI_STATE_PUSH
add_flag / clear_flag ทุก tick โดยไม่มีเงื่อนไขทำให้แถวการ์ดกะพริบจนมองเห็นได้ มีตัวกัน (guard) กรณี widget เป็น null เพราะหน้า (page) อาจถูกทำลายระหว่าง tick ทำงานที่การจำกัดอัตรา (throttle) ของ topbar ประมาณ 6 fps และถูกข้ามระหว่างที่มีแอนิเมชัน | bool ipc_sensorhub_ble_connected | ( | void | ) |
คืน true เฉพาะขณะที่ NUS host อยู่ในสถานะ CONNECTED เท่านั้น; ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ
Returns true if CM33_NS reported BLE NUS host CONNECTED via IPC_CMD_BLE_STATE_PUSH. Only true while a host is connected; advertising/idle return false.
IPC_CMD_BLE_STATE_PUSH) ส่วนการกระจายสัญญาณ (advertising) และสถานะว่างอ่านได้เป็น false ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบที่ใดเลย — ตัวอย่างที่เขียนขึ้นเองสร้างตามรูปแบบ edge-detect ของ wifi_connected : ทำงานบน GFX task เท่านั้น มีตัวกันกรณี widget เป็น null และแตะ LVGL เฉพาะเมื่อมีการเปลี่ยนแปลงเท่านั้น | bool ipc_sensorhub_ntp_synced | ( | void | ) |
เป็น gate ของการอ่าน RTC ทั้งหมด
Returns true if CM33_NS has sent at least one IPC_CMD_TIME_PUSH (NTP synced)
Returns true after CM33_NS sends IPC_CMD_NTP_SYNCED (RTC is valid).
Cy_RTC_GetDateAndTime() ถูกเรียกเฉพาะหลังจาก CM33_NS ส่งการแจ้ง NTP-synced มาแล้วเท่านั้น การคืนค่า true เป็นเงื่อนไขจำเป็นแต่ยังไม่เพียงพอ — โค้ดที่ส่งมอบจริงยังตรวจช่วงค่าของ rtc.month และ rtc.dayOfWeek ก่อนนำไปใช้เป็นดัชนีของตารางชื่ออยู่ดี ให้สังเกต strcmp ที่อยู่ก่อน lv_label_set_text เพื่อไม่ให้ label ถูกทำให้เป็นโมฆะทุก tick (แถวการ์ดกะพริบ) จำกัดอัตรา (throttle) ที่ประมาณ 6 fps ภายใน pm_update_topbar และถูกข้ามระหว่างที่มีแอนิเมชัน | bool ipc_sensorhub_get_time_str | ( | char * | buf, |
| size_t | buf_size ) |
สตริงเวลาล่าสุดที่ CM33 ส่งมา; คืน false ก่อน NTP sync
Copy the latest time string from CM33_NS (e.g. "Mon 10 Mar 14:35"). Returns false if NTP not yet synced. buf must be >= 32 bytes.
false เมื่อ NTP ยังไม่ sync buf ต้องมีขนาดอย่างน้อย 32 ไบต์ ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ — topbar อ่าน RTC โดยตรงหลัง gate ntp_synced แทน ตัวอย่างที่เขียนขึ้นเองจับคู่ฟังก์ชันนี้เข้ากับ gate ดังกล่าว | void ipc_sensorhub_feed_capsense | ( | const ipc_sensor_capsense_t * | data | ) |
การป้อนตัวอย่างค่า CapSense ที่อ่านในเครื่อง — ต้องกำหนดค่าเริ่มต้นครบทุกฟิลด์ และใช้ sequence ร่วมกัน
reserved = 0 และ sequence ต้องเพิ่มขึ้นแบบไม่ย้อนกลับจากตัวนับที่ใช้ร่วมกับการป้อนข้อมูลของ pot — หนึ่งช่วงเลข sequence ต่อผู้ผลิตข้อมูล (producer) หนึ่งราย ผู้ผลิตข้อมูลเป็นผู้เขียนรายเดียวบน GFX task นั่นคือสิ่งที่ทำให้ฟิลด์แคชขนาดหนึ่งไบต์ถูกอ่านจากเส้นทาง snapshot ของ IPC_CMD_CONTROLS_STATE ฝั่ง CM33 ได้โดยไม่ต้องใช้ lock คืนค่า void ส่วนค่า bool ของ wrapper รายงานผลการอ่าน I2C ไม่ใช่ผลของการป้อนข้อมูล | void ipc_sensorhub_feed_pot | ( | const ipc_sensor_pot_t * | data | ) |
ค่าของ pot ที่ปรับเป็นค่ามาตรฐานแล้ว ไม่ใช่ค่านับจาก ADC; ต้องตรวจ pot_channels_ready() ก่อน
raw ถูกปรับสเกลไปเต็มช่วงของ uint16 และ percent_x10 อยู่ในหน่วยต่อพัน ทั้งคู่คำนวณจาก POT_ADC_MAX ทั้งฟังก์ชัน feed นี้อยู่ภายใน BSP_HAS_POTENTIOMETER ก่อนการป้อนข้อมูลทุกครั้ง โค้ดที่ส่งมอบจริงจะเรียก pot_channels_ready() (cm55_sensor_poll.c:189-198) : ผลการอ่าน SAR ที่เป็น 0 ไม่ใช่หลักฐานว่าช่องสัญญาณยังทำงานอยู่ จึงมีการตรวจบิตสถานะประจำช่องก่อน ใช้ตัวนับ s_seq ตัวเดียวกันร่วมกับ capsense | void ipc_sensorhub_feed_bmi270 | ( | const ipc_sensor_bmi270_t * | data | ) |
การป้อนตัวอย่างค่า IMU ที่อ่านในเครื่อง; ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ
feed_capsense ทุกประการ: กำหนดค่าเริ่มต้นให้ struct ครบทุกฟิลด์ ให้ sequence เพิ่มขึ้นแบบไม่ย้อนกลับจากตัวนับของผู้ผลิตข้อมูลเอง และทำงานใน GFX-task context แบบผู้เขียนรายเดียว | void ipc_sensorhub_feed_bmm350 | ( | const ipc_sensor_bmm350_t * | data | ) |
การป้อนตัวอย่างค่าแมกนีโตมิเตอร์ที่อ่านในเครื่อง; ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ
feed_bmi270 : กำหนดค่าครบทุกฟิลด์ รักษาวินัยของ sequence และมีผู้ผลิตข้อมูลรายเดียว