本章使用 FreeRTOS 托管入口接入通话状态、接听、拒接和挂断。先实现目标硬件的 HFP 或约定通话驱动,再声明通话能力。
通话控制与音频
先确认蓝牙芯片、音频栈和 HFP 驱动。P4+C6 参考工程没有接通 HFP,calls 默认关闭;仅有 BLE 不会提供免提音频。Wi-Fi 主业务只传控制和状态;独立 Wi-Fi 音频通道可传系统允许采集的播放声音,但不提供 HFP 通话。A2DP、Wi-Fi 音频与采集边界见音频接入。
已完成通话驱动的托管应用可设置 c.calls=true,使用以下接口:
| 方向 | 接口 |
|---|---|
| 驱动报告新状态 | moto_terminal_report_call(t, call_id, state, actions) |
| 用户操作有效通话 | moto_terminal_call_action(t, &saved_call_event, action) |
收到 MOTO_EVENT_CALL_ACTION |
交给驱动执行一次,用原事件调用 moto_terminal_complete 回报 |
call_id 非零。state:0 未知、1 响铃、2 接通、3 保持、4 结束。允许动作掩码为 1 接听、2 拒接、4 挂断;单次 action 为 0 接听、1 拒接、2 挂断。未知或结束时动作掩码为 0;data.call.valid=false 时移除按钮。以驱动后续上报的实际状态更新界面。
通话声音由手机、头盔或已接入的蓝牙音频设备播放。电话号码不写入普通日志。
从驱动状态到 APP
由真实 HFP 驱动确认状态后调用以下函数:响铃时传入驱动分配的非零 call_id、状态 1、动作掩码 3(接听或拒接);结束时仍使用该 ID,状态 4、动作掩码 0。
检查返回值;队列满时保留待上报快照并稍后重试。收到动作事件后,执行一次,再按车辆控制的回执规则回报;执行失败时保留驱动原状态。
#include <moto_freertos/terminal.h>
moto_result report_observed_call(moto_terminal *terminal,
uint64_t call_id, uint32_t state,
uint32_t allowed_actions) {
return moto_terminal_report_call(terminal, call_id,
state, allowed_actions);
}
