| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- --[[
- 演示airtalk基本功能
- 按一次boot,开始1对1对讲,再按一次boot,结束对讲
- 按一次powerkey,开始1对多对讲,再按一次powerkey或者boot,结束对讲
- ]]
- -- 引入必要模块
- local extalk = require "extalk"
- local exaudio = require "exaudio"
- -- 配置日志格式
- log.style(1)
- -- 常量定义
- local USER_TASK_NAME = "user_task"
- local MSG_KEY_PRESS = 12 -- 按键消息
- -- 全局状态变量
- local g_dev_list = nil -- 设备列表
- local g_speech_active = false -- 对讲状态标记
- -- 音频初始化参数
- local audio_setup_param = {
- model = "es8311", -- 音频编解码类型,可填入"es8311","es8211"
- i2c_id = 0, -- i2c_id,可填入0,1 并使用pins工具配置对应的管脚
- pa_ctrl = 162, -- 音频放大器电源控制管脚
- dac_ctrl = 164, -- 音频编解码芯片电源控制管脚
- }
- -- 联系人列表回调函数
- local function contact_list_callback(dev_list)
- g_dev_list = dev_list
- if dev_list and #dev_list > 0 then
- log.info("联系人列表更新:")
- for i = 1, #dev_list do
- log.info(string.format(" %d. ID: %s, 名称: %s",
- i, dev_list[i]["id"], dev_list[i]["name"] or "未知"))
- end
- else
- log.info("联系人列表为空")
- end
- end
- -- 对讲状态回调函数
- local function speech_state_callback(event_table)
- if not event_table then return end
-
- if event_table.state == extalk.START then
- log.info("对讲开始,可以说话了")
- g_speech_active = true
- elseif event_table.state == extalk.STOP then
- log.info("对讲结束")
- g_speech_active = false
- elseif event_table.state == extalk.UNRESPONSIVE then
- log.info("对端未响应")
- g_speech_active = false
- elseif event_table.state == extalk.ONE_ON_ONE then
- g_speech_active = true
-
- local dev_name = "未知设备"
- if g_dev_list then
- for i = 1, #g_dev_list do
- if g_dev_list[i]["id"] == event_table.id then
- dev_name = g_dev_list[i]["name"] or "未知设备"
- break
- end
- end
- end
- log.info(string.format("%s 来电", dev_name))
- elseif event_table.state == extalk.BROADCAST then
- g_speech_active = true
-
- local dev_name = "未知设备"
- if g_dev_list then
- for i = 1, #g_dev_list do
- if g_dev_list[i]["id"] == event_table.id then
- dev_name = g_dev_list[i]["name"] or "未知设备"
- break
- end
- end
- end
- log.info(string.format("%s 开始广播", dev_name))
- end
- end
- -- extalk配置参数
- local extalk_configs = {
- key = PRODUCT_KEY,
- heart_break_time = 120, -- 心跳间隔(单位秒)
- contact_list_cbfnc = contact_list_callback,
- state_cbfnc = speech_state_callback,
- }
- -- 按键回调函数 - Boot键
- local function boot_key_callback()
- sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, false) -- false表示Boot键
- end
- -- 按键回调函数 - Power键
- local function power_key_callback()
- sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, true) -- true表示Power键
- end
- -- 初始化按键
- local function init_buttons()
- -- 配置Boot键 (GPIO0)
- gpio.setup(0, boot_key_callback, gpio.PULLDOWN, gpio.RISING)
- gpio.debounce(0, 200, 1) -- 200ms去抖
-
- -- 配置Power键
- gpio.setup(gpio.PWR_KEY, power_key_callback, gpio.PULLUP, gpio.FALLING)
- gpio.debounce(gpio.PWR_KEY, 200, 1) -- 200ms去抖
- end
- -- 查找第一个可用的对端设备ID
- local function find_first_remote_device()
- if not g_dev_list or #g_dev_list == 0 then
- log.warn("没有找到可用的设备")
- return nil
- end
-
- local local_id = mobile.imei()
- for i = 1, #g_dev_list do
- local dev_id = g_dev_list[i]["id"]
- if dev_id and dev_id ~= local_id then
- return dev_id
- end
- end
-
- log.warn("没有找到其他可用设备")
- return nil
- end
- -- 处理按键消息
- local function handle_key_press(is_power_key)
- if g_speech_active then
- -- 当前正在对讲,按任何键都结束对讲
- log.info("结束当前对讲")
- extalk.stop()
- g_speech_active = false
- else
- -- 当前未在对讲,根据按键类型开始不同对讲
- if is_power_key then
- -- Power键:开始一对多广播
- log.info("开始一对多广播")
- extalk.start() -- 不带参数表示广播
- else
- -- Boot键:开始一对一对讲
- log.info("开始一对一对讲")
- local remote_id = find_first_remote_device()
- if remote_id then
- extalk.start(remote_id)
- else
- log.error("无法开始一对一对讲,没有找到可用设备")
- end
- end
- end
- end
- -- 用户主任务
- local function user_main_task()
- -- 初始化音频
- local audio_init_ok = exaudio.setup(audio_setup_param)
- if not audio_init_ok then
- log.error("音频初始化失败")
- return
- end
- log.info("音频初始化成功")
-
- -- 初始化extalk
- local extalk_init_ok = extalk.setup(extalk_configs)
- if not extalk_init_ok then
- log.error("extalk初始化失败")
- return
- end
- log.info("extalk初始化成功")
-
- -- 等待按键消息并处理
- while true do
- local msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)
- if msg and msg[1] == MSG_KEY_PRESS then
- handle_key_press(msg[2]) -- msg[2]区分是Power键(true)还是Boot键(false)
- end
- end
- end
- -- 初始化按键
- init_buttons()
- -- 启动用户任务
- sys.taskInitEx(user_main_task, USER_TASK_NAME)
|