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

Topics

Functions

bool bento_link_ipc_init (void)
 เริ่มการทำงานของ backend IPC และลงทะเบียนตัวเองในชื่อ "ipc"; ต้องมาก่อน bento_link_get()
bento_link_tbento_link_get (const char *name)
 ค้นหา backend ตามชื่อ; คืน NULL เมื่อไม่มี — ต้องตรวจ NULL เสมอ
bento_link_tbento_link_at (uint32_t index)
 ไล่รายการใน registry; คืน NULL เมื่อเลยรายการสุดท้าย
bool bento_link_register (bento_link_t *link)
 API สำหรับผู้เขียน backend: ลงทะเบียน bento_link_t ของ transport เพียงครั้งเดียว

Detailed Description

5 symbol: registry ของ bento_link (bento_link_register(), bento_link_get(), bento_link_at()) และจุดเข้า 2 จุดของ backend "ipc" ที่ส่งมอบมา (bento_link_ipc_init(), bento_link_ipc_query) เขียนไว้ใน bento_link.c และ bento_link_ipc.c คอมไพล์รวมอยู่ใน libbento_mpy.a ไม่ได้ส่งมอบมาเป็นซอร์ส bento_link.h ประกาศฟังก์ชันของ registry ไว้ 3 ตัว; bento_secure_undeclared.h เก็บ prototype ของ bento_link_ipc_init() ที่กู้กลับมา และบันทึกไว้ว่า bento_link_ipc_query() ไม่มีคำประกาศอยู่ที่ใดเลยในทรีนี้ — ผู้ใช้ไลบรารีเป็นผู้เขียน extern ขึ้นเอง

ตัวอย่างอ้างอิงที่ส่งมอบมาคือ template/bento_libs/claw/common/mpy/moddeepcraft.c และลำดับที่มันบังคับไว้คือข้อกำหนด: bento_link_ipc_init() → bento_link_get("ipc") → ตรวจ NULL → ต่อ bento_link_t ที่ได้คืนมาเข้ากับ adapter ของ DEEPCRAFT™

variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)

Function Documentation

◆ bento_link_ipc_init()

bool bento_link_ipc_init ( void )
extern

เริ่มการทำงานของ backend IPC และลงทะเบียนตัวเองในชื่อ "ipc"; ต้องมาก่อน bento_link_get()

ข้อกำหนดการเรียกใช้
เริ่มการทำงานของ backend ที่เป็น pipe ระหว่าง CM33 กับ CM55 และลงทะเบียนตัวเองไว้ใน registry ของ link ภายใต้ชื่อ "ipc" (ภายในเรียก bento_link_register()) เป็น idempotent ต้องมาก่อน bento_link_get("ipc") — ก่อนหน้านั้นการค้นหาจะคืนค่า NULL คืนค่า false เมื่อปลายทางของ pipe ยังไม่พร้อม; binding ในของที่ส่งมอบจริงจะ raise OSError เมื่อได้ false ทำงานใน task context; ผู้เรียกที่มีอยู่จริงในของที่ส่งมอบคือ ensure_inited() แบบ lazy ของ MicroPython task prototype ตัวนี้คือตัวที่ bento_secure_undeclared.h กู้กลับมา — ไม่มี header อื่นที่ส่งมอบมาประกาศฟังก์ชันนี้ไว้เลย
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
เริ่มระบบ, ค้นหา, ตรวจ NULL, แล้วต่อเข้าใช้งาน
static void ensure_inited(void)
{
if (s_inited) {
return;
}
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("model link init failed"));
}
s_adapter.base.send = adapter_send;
s_adapter.base.register_receive_cb = adapter_register_receive;
s_adapter.link = bento_link_get("ipc");
if (s_adapter.link == NULL) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("ipc link unavailable"));
}
s_iface.IPC = &s_adapter.base;
model_type_t model = { .va_model = DEEPCRAFT_VA_MODEL };
deepcraft_engine_init(&s_engine, model, &s_iface);
deepcraft_engine_set_event_cb(&s_engine, engine_event_cb);

◆ bento_link_get()

bento_link_t * bento_link_get ( const char * name)

ค้นหา backend ตามชื่อ; คืน NULL เมื่อไม่มี — ต้องตรวจ NULL เสมอ

Look up a backend by name; NULL if not compiled in / not registered.

ข้อกำหนดการเรียกใช้
ค้นหา backend ตามชื่อ ("ipc", "usb", "ble", "wifi"); คืนค่า NULL เมื่อ backend นั้นไม่ได้ถูกคอมไพล์เข้ามาหรือยังไม่ได้ลงทะเบียน ต้องตรวจ NULL เสมอ — การมีอยู่ของ backend เป็นไปตาม persona ของบอร์ดและลำดับการเริ่มระบบ ลำดับที่ต้องทำ: bento_link_ipc_init() → bento_link_get("ipc") → ตรวจ NULL → เก็บพอยน์เตอร์ไว้ใน adapter ไม่มีการจับ lock; ทำงานใน task context
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
snippet เดียวกันจากของที่ส่งมอบจริง
static void ensure_inited(void)
{
if (s_inited) {
return;
}
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("model link init failed"));
}
s_adapter.base.send = adapter_send;
s_adapter.base.register_receive_cb = adapter_register_receive;
s_adapter.link = bento_link_get("ipc");
if (s_adapter.link == NULL) {
mp_raise_msg(&mp_type_OSError, MP_ERROR_TEXT("ipc link unavailable"));
}
s_iface.IPC = &s_adapter.base;
model_type_t model = { .va_model = DEEPCRAFT_VA_MODEL };
deepcraft_engine_init(&s_engine, model, &s_iface);
deepcraft_engine_set_event_cb(&s_engine, engine_event_cb);

◆ bento_link_at()

bento_link_t * bento_link_at ( uint32_t index)

ไล่รายการใน registry; คืน NULL เมื่อเลยรายการสุดท้าย

Enumerate registered backends: index 0..n-1, NULL past the end.

ข้อกำหนดการเรียกใช้
ไล่รายการใน registry: ดัชนี 0 ถึง n-1 คืน backend หนึ่งตัว และคืน NULL เมื่อเลยรายการสุดท้าย ให้วนตั้งแต่ 0 ถึง BENTO_LINK_MAX_BACKENDS แล้วหยุดที่ NULL ตัวแรก — registry เก็บเรียงชิดกันไม่มีช่องว่าง NULL จึงหมายความว่า "ไม่มีอีกแล้ว" เป็นที่มาของข้อมูลให้ deepcraft.links() ฝั่ง Python ไม่มีการจับ lock; ทำงานใน task context
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
deepcraft_links()
static mp_obj_t deepcraft_links(void)
{
ensure_inited();
mp_obj_t items[BENTO_LINK_MAX_BACKENDS];
uint32_t n = 0;
for (uint32_t i = 0; i < BENTO_LINK_MAX_BACKENDS; i++) {
if (l == NULL) {
break;
}
items[n++] = mp_obj_new_str(l->name, strlen(l->name));
}
return mp_obj_new_tuple(n, items);
}

◆ bento_link_register()

bool bento_link_register ( bento_link_t * link)

API สำหรับผู้เขียน backend: ลงทะเบียน bento_link_t ของ transport เพียงครั้งเดียว

Register a backend (called once from each backend's init).

ข้อกำหนดการเรียกใช้
เป็น API สำหรับผู้เขียน backend ไม่ใช่ API สำหรับแอปพลิเคชัน backend ของ transport จะลงทะเบียนโครงสร้างฐาน bento_link_t ของตัวเองเพียงครั้งเดียว จากฟังก์ชัน init ของตัวเอง ก่อนที่ผู้ใช้ไลบรารีรายใดจะ bento_link_get() มันได้ — แบบที่ใช้จริงในของที่ส่งมอบคือ backend "ipc" ที่ลงทะเบียนตัวเองอยู่ภายใน bento_link_ipc_init() registry เก็บได้มากที่สุด BENTO_LINK_MAX_BACKENDS (4) รายการ; ค่า false หมายถึงเต็มหรือซ้ำ และ backend ต้องรายงานว่าตัวเองใช้งานไม่ได้ ห้ามวนลองใหม่ callback รับข้อมูลที่ลงทะเบียนผ่านโครงสร้างฐานนี้ ต้องถูกส่งมอบนอกบริบทของอินเทอร์รัปต์ (ISR → คิว → task ที่ทำหน้าที่ส่งมอบ) ตามที่ bento_link.h กำหนด ไม่มี call site ในเทมเพลตเลย; ผู้เรียกรายเดียวอยู่ภายใน archive
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง (เขียนขึ้นเอง — ไม่มี call site ในของที่ส่งมอบจริง)
static bool my_backend_send_ctrl(bento_link_t *self, uint8_t cmd,
uint32_t value)
{
(void)self; (void)cmd; (void)value;
return false; /* transport busy/unavailable */
}
static bool my_backend_send_data(bento_link_t *self, uint8_t stream_id,
const void *buf, uint16_t len)
{
(void)self; (void)stream_id; (void)buf; (void)len;
return false; /* v1: data plane reserved */
}
static void my_backend_register_receive(bento_link_t *self,
void (*ctrl_cb)(uint8_t cmd, uint32_t value),
void (*data_cb)(uint8_t stream_id, const void *buf,
uint16_t len, uint16_t seq))
{
(void)self; (void)ctrl_cb; (void)data_cb;
/* Backends MUST deliver callbacks OFF interrupt context
* (ISR -> queue -> delivery task), per bento_link.h. */
}
static bento_link_t s_my_backend = {
.send_ctrl = my_backend_send_ctrl,
.send_data = my_backend_send_data,
.register_receive = my_backend_register_receive,
.name = "wifi", /* the name consumers pass to _get() */
.mtu = 512u,
.bandwidth_bps = 100000u, /* honest sustained budget */
.flags = BL_F_LOSSY,
};
static void bento_ex_bento_link_register(void)
{
/* Called once from the backend's own init. False = registry full
* (BENTO_LINK_MAX_BACKENDS) or duplicate — the backend must report
* itself unavailable, not retry. */
if (!bento_link_register(&s_my_backend)) {
return;
}
}