|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
Functions | |
| void | tacp_init (void) |
| รีเซ็ต state machine, ล้าง ring, ระบาย FIFO; ครั้งเดียวต่อหนึ่ง soft reset | |
| bool | tacp_poll_uart (void) |
| pump UART; ต้องเรียกจากลูปรอแบบบล็อกทุกลูป | |
| void | tacp_request_delete_main_from_isr (void) |
| ทางออกฉุกเฉินที่เรียกจาก ISR ได้: หยุดสคริปต์, สั่ง soft reset, ลบ /main.py | |
| void | tacp_claw_respond (uint8_t sub_cmd, const char *payload, uint16_t payload_len) |
| ส่งเฟรมคำตอบไบนารีของ BentoClaw หนึ่งเฟรมออกทาง UART | |
| int | tacp_ring_buf_read (void) |
| ดึงไบต์ของ REPL ออกมาหนึ่งไบต์ หรือคืน -1 เมื่อว่าง ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ | |
| bool | tacp_ring_buf_readable (void) |
| การทดสอบแบบไม่บล็อกว่ามีข้อมูลพร้อมหรือไม่ ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ | |
6 ฟังก์ชัน: เป็นโปรโตคอลควบคุมฝั่ง UART ที่ BENTO IDE ใช้คุยกับบอร์ด (magic 0xAA 0x55, คำสั่งควบคุม, การโอนไฟล์แบบไบนารี และ sub-protocol 0x30 ของ BentoClaw) เขียนไว้ใน tacp.c คอมไพล์รวมอยู่ใน libbento_mpy.a ไม่ได้ส่งมอบมาเป็นซอร์ส เทมเพลตส่งมอบ tacp.h มาให้
4 ตัวมี call site อยู่จริงในของที่ส่งมอบ (ใน mpy_main.c, modui.c, modsensors.c, modbentoclaw.c และ sensor_auto_task.c) ส่วนอีก 2 ตัว คือ tacp_ring_buf_read() และ tacp_ring_buf_readable() ไม่มีผู้เรียกที่ใดเลย: ในเฟิร์มแวร์ที่ส่งมอบจริง REPL ของ MicroPython กิน ring อยู่ภายใน ตัวอย่างของทั้งสองเป็นตัวอย่างที่เขียนขึ้นเองและกำกับไว้
| void tacp_init | ( | void | ) |
รีเซ็ต state machine, ล้าง ring, ระบาย FIFO; ครั้งเดียวต่อหนึ่ง soft reset
Initialize TACP state machine and ring buffer.
soft_reset ของ MicroPython task ไบต์ค้างจากก่อนรีเซ็ตจึงถูกนำมา parse ซ้ำจนเกิดการรีเซ็ตซ้อนสองครั้งไม่ได้ ต้องเรียกก่อนฟังก์ชัน TACP ตัวอื่นทุกตัวในกลุ่มฟังก์ชันนี้ — tacp_poll_uart() ระหว่างการเริ่มต้นระบบปลอดภัยได้ก็เพราะ tacp_init() ทำงานไปก่อนแล้วเท่านั้น ทำงานใน MicroPython task context; เป็น void mpy_main.c | bool tacp_poll_uart | ( | void | ) |
pump UART; ต้องเรียกจากลูปรอแบบบล็อกทุกลูป
Poll UART for TACP commands and REPL bytes. Returns true if a command was detected.
MICROPY_EVENT_POLL_HOOK ส่วนรูปแบบฝั่ง FreeRTOS จับคู่กับ vTaskDelay(pdMS_TO_TICKS(1)) แทน ไม่มีการจับ lock ไม่ปลอดภัยต่อการเรียกจาก ISR — ดู tacp_request_delete_main_from_isr() สำหรับทางออกฉุกเฉินทางเดียวเมื่อสคริปต์ที่หลุดการควบคุมทำให้ pump นี้ไม่ได้ทำงาน modui.c): รูปแบบที่คืนคิวแบบ FreeRTOS (modsensors.c):
| void tacp_request_delete_main_from_isr | ( | void | ) |
ทางออกฉุกเฉินที่เรียกจาก ISR ได้: หยุดสคริปต์, สั่ง soft reset, ลบ /main.py
ISR-safe trigger for the CM55 "Delete main.py" button. Breaks a running / looping script (keyboard interrupt) and forces a MicroPython soft reset so the boot path removes /main.py. Safe to call from interrupt context.
/main.py ทิ้ง ไม่มีการจองหน่วยความจำ ไม่มี hard reset; แฟล็กใน SRAM อยู่รอดข้าม soft reset นี่คือ ทางสำรองสำหรับกรณีที่ลูปใน /main.py หลุดการควบคุมจนยึด CPU ไว้ผู้เดียวและทำให้ tacp_poll_uart() ไม่ได้ทำงาน — เส้นทางแบบนุ่มนวล (s_delete_pending ซึ่งวนถามใน task context) ยังคงมีอยู่เคียงกัน ถูกเรียกจาก IPC ISR ของการควบคุมเซนเซอร์บน CM33_NS โดยมี BENTO_HAS_MPY เป็น guard: บน variant mtb-only ไม่มี VM และไม่มี /main.py ให้ลบ guard จึงคอมไพล์การเรียกนั้นทิ้งไป เป็น void sensor_auto_task.c | void tacp_claw_respond | ( | uint8_t | sub_cmd, |
| const char * | payload, | ||
| uint16_t | payload_len ) |
ส่งเฟรมคำตอบไบนารีของ BentoClaw หนึ่งเฟรมออกทาง UART
Send a BentoClaw TACP binary response frame. Frame: [0xAA][0x55][0x30][sub_cmd][len_lo][len_hi][payload][crc_lo][crc_hi] Use sub_cmd matching request for success, TACP_CLAW_ERROR (0xFF) for errors.
0xAA 0x55 0x30, sub-command, ความยาว, payload, CRC-16/CCITT) ให้ใช้ sub_cmd ของคำขอสำหรับกรณีสำเร็จ และใช้ TACP_CLAW_ERROR (0xFF) สำหรับข้อผิดพลาด ต้องเรียก tacp_init() มาก่อน payload_len คือความยาวจริง — ค่าที่ snprintf คืนมาแล้ว cast เป็น uint16_t — ห้ามใช้ strlen ของบัฟเฟอร์ที่อาจถูกตัดทอนไปแล้ว โค้ดในของที่ส่งมอบจริงไม่เคยเรียกฟังก์ชันนี้ตรง ๆ: เรียกผ่าน wrapper claw_respond / claw_respond_err เสมอ เฟรม TACP_CLAW_READY ที่ส่งขึ้นเองโดยไม่มีคำขอจะถูกส่ง ก็ต่อเมื่อ tacp_init(), mp_init(), การเมานต์ VFS และ boot.py / main.py ทำงานจบแล้วเท่านั้น IDE จึงไม่มีทางเห็น READY จากบอร์ดที่ยังรับคำขอไม่ได้ เป็น void ไม่มีเส้นทางแจ้งข้อผิดพลาด; ทำงานใน MicroPython task context ตัวตอบภายในของ archive อีก 20 ตัวใน tacp.c ไม่ใช่ส่วนที่ผู้ใช้ไลบรารีเรียกได้ — ส่วนที่ผู้ใช้ไลบรารีเรียกได้ในของที่ส่งมอบจริงคือจุดเรียก 3 แห่งใน modbentoclaw.c พอดี | int tacp_ring_buf_read | ( | void | ) |
ดึงไบต์ของ REPL ออกมาหนึ่งไบต์ หรือคืน -1 เมื่อว่าง ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ
Read one byte from the ring buffer (for REPL consumption). Returns -1 if empty.
tacp.c) ไม่ได้ส่งมอบมาเป็นซอร์ส | bool tacp_ring_buf_readable | ( | void | ) |
การทดสอบแบบไม่บล็อกว่ามีข้อมูลพร้อมหรือไม่ ไม่มีผู้เรียกที่มีอยู่จริงในของที่ส่งมอบ
Check if the ring buffer has data.