/* 传输适配器 → 命令处理器的入口(A12 定形状,A13 / A14 是调用方)。**只在 ESP 目标上有**。 §10.8:两条链路只是传输,命令处理器只有一个。适配器把切好的一行交到这里, 由**执行器任务**取出来调 `cmd_handle_line()`(cmd.h「在哪个任务里跑」), 回应经 `reply` 交还给适配器去发。 ⚠️ `reply` 是在**执行器任务**里被调的,不是在适配器自己的任务里: 它必须线程安全、不许阻塞太久(执行器还要按时推状态机,松键靠它)。 USB-Serial-JTAG 的写与 MQTT publish 都满足;做不到的适配器就在回调里只做入队。 */ #ifndef CMD_QUEUE_H #define CMD_QUEUE_H #include #include #include "cmd.h" #ifdef __cplusplus extern "C" { #endif typedef void (*cmd_reply_fn)(void *ctx, const char *line, size_t len); /* 投递一行(会被拷贝,调用方的缓冲可以立刻复用)。超过 `CMD_LINE_MAX − 1` 的行直接拒收。 队列满 / 超长 / 还没起来都返回 false —— 适配器应当回一条错误或者丢弃, **不许**自己去调 `cmd_handle_line()`(那会绕开「只在执行器任务里跑」这条)。 */ bool cmd_queue_submit(cmd_link_t link, const char *line, cmd_reply_fn reply, void *ctx); #ifdef __cplusplus } #endif #endif /* CMD_QUEUE_H */