dnr button support

This commit is contained in:
Steven Dan
2026-05-19 13:45:29 +08:00
parent a8a8d22613
commit c3b4857ac9
3 changed files with 57 additions and 30 deletions

View File

@@ -112,8 +112,8 @@ timer tm;
// 改动原因C1的TIMER_PERIOD为20ms按DS1同类短按/长按模型换算阈值mode/mic 仍用 LONG 区分短按窗口;音量键已取消长按连调故不再使用 REPEAT 间隔宏。
#define C1_KEY_SHORT_TICKS 1
#define C1_KEY_LONG_TICKS 50
// 改动原因:规格要求 mic 键长按 1.5s 触发 AI 通话降噪开关20ms*75=1.5s,与 mode 键的 C1_KEY_LONG_TICKS(1s) 解耦,避免误触。
#define C1_KEY_MIC_AI_NR_TICKS 75
// 改动原因:规格要求 mic 键长按 1.5s 切换 g_dnr_enableAI 通话降噪/DNR20ms*75=1.5s,与 mode 键 LONG 解耦,避免误触。
#define C1_KEY_MIC_DNR_LONG_TICKS 75
// 改动原因:双击第二下需在首击释放后约 500ms 内按下否则判为单击静音20ms*25=500ms。
#define C1_MIC_DOUBLE_DEFER_TICKS 25
// 改动原因新增C1模式持久化文件路径使用LittleFS保存mode按键状态保证断电重启后可恢复。
@@ -514,13 +514,12 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned vol_down_press_ticks = 0;
unsigned mic_mute_press_ticks = 0;
unsigned vol_up_press_ticks = 0;
// 改动原因mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 AI 互斥靠 mic_ai_long_fired。
// 改动原因mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 DNR 互斥靠 mic_dnr_long_fired。
unsigned mic_dbl_stage = 0;
unsigned mic_defer_left = 0;
unsigned mic_ai_long_fired = 0;
// 改动原因:变声/美声仅按键+灯tile0 保存状态供下发橙色 mode 区AI 降噪无灯仅本地翻转供后续扩展
unsigned mic_dnr_long_fired = 0;
// 改动原因:变声/美声仅按键+灯tile0 保存状态供 set_mic_voice_fx 下发 mic 橙灯
unsigned c1_mic_voice_fx = 0;
unsigned c1_mic_ai_nr = 0;
// 改动原因mic mute红灯通过interface下发到tile1仅在状态变化时发送减少无意义跨tile调用。
unsigned last_mute_switch_for_led = 0xFFFFFFFF;
unsigned host_os = 0;
@@ -894,6 +893,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_dbl_stage = 2;
}
mic_mute_press_ticks++;
// 改动原因:按住满 1.5s 翻转 g_dnr_enableextra_i2s 中 GET_SHARED_GLOBAL 决定是否走 DNR松手时靠 mic_dnr_long_fired 屏蔽短按/双击。
if (mic_mute_press_ticks == C1_KEY_MIC_DNR_LONG_TICKS)
{
unsigned dnr_enable;
GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable);
dnr_enable = (dnr_enable != 0) ? 0 : 1;
SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable);
mic_dnr_long_fired = 1;
debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable);
}
// 改动原因同一时刻只允许mic mute键生效清除其它键状态避免释放时误执行音量或mode短按。
mode_press_ticks = 0;
vol_down_press_ticks = 0;
@@ -950,17 +959,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
}
}
// 改动原因mic短按静音改为延迟单击(防双击);双击短按切变声灯橙R+G按住满1.5sAI 状态变量无灯;长按与短/双互斥。
// 改动原因mic短按静音延迟单击防双击双击变声 mic 橙灯;长按1.5s g_dnr_enable 无灯;长按与短/双互斥。
{
unsigned mic_snap = mic_mute_press_ticks;
if (mic_snap > 0)
{
if ((mic_snap >= C1_KEY_MIC_AI_NR_TICKS) || mic_ai_long_fired)
if ((mic_snap >= C1_KEY_MIC_DNR_LONG_TICKS) || mic_dnr_long_fired)
{
if (mic_dbl_stage == 2)
mic_dbl_stage = 0;
}
else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_AI_NR_TICKS))
else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_DNR_LONG_TICKS))
{
if (mic_dbl_stage == 2)
{
@@ -976,7 +985,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_defer_left = C1_MIC_DOUBLE_DEFER_TICKS;
}
}
mic_ai_long_fired = 0;
mic_dnr_long_fired = 0;
}
}

View File

@@ -112,8 +112,8 @@ timer tm;
// 改动原因C1的TIMER_PERIOD为20ms按DS1同类短按/长按模型换算阈值mode/mic 仍用 LONG 区分短按窗口;音量键已取消长按连调故不再使用 REPEAT 间隔宏。
#define C1_KEY_SHORT_TICKS 1
#define C1_KEY_LONG_TICKS 50
// 改动原因:规格要求 mic 键长按 1.5s 触发 AI 通话降噪开关20ms*75=1.5s,与 mode 键的 C1_KEY_LONG_TICKS(1s) 解耦,避免误触。
#define C1_KEY_MIC_AI_NR_TICKS 75
// 改动原因:规格要求 mic 键长按 1.5s 切换 g_dnr_enableAI 通话降噪/DNR20ms*75=1.5s,与 mode 键 LONG 解耦,避免误触。
#define C1_KEY_MIC_DNR_LONG_TICKS 75
// 改动原因:双击第二下需在首击释放后约 500ms 内按下否则判为单击静音20ms*25=500ms。
#define C1_MIC_DOUBLE_DEFER_TICKS 25
// 改动原因新增C1模式持久化文件路径使用LittleFS保存mode按键状态保证断电重启后可恢复。
@@ -514,13 +514,12 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned vol_down_press_ticks = 0;
unsigned mic_mute_press_ticks = 0;
unsigned vol_up_press_ticks = 0;
// 改动原因mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 AI 互斥靠 mic_ai_long_fired。
// 改动原因mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 DNR 互斥靠 mic_dnr_long_fired。
unsigned mic_dbl_stage = 0;
unsigned mic_defer_left = 0;
unsigned mic_ai_long_fired = 0;
// 改动原因:变声/美声仅按键+灯tile0 保存状态供下发橙色 mode 区AI 降噪无灯仅本地翻转供后续扩展
unsigned mic_dnr_long_fired = 0;
// 改动原因:变声/美声仅按键+灯tile0 保存状态供 set_mic_voice_fx 下发 mic 橙灯
unsigned c1_mic_voice_fx = 0;
unsigned c1_mic_ai_nr = 0;
// 改动原因mic mute红灯通过interface下发到tile1仅在状态变化时发送减少无意义跨tile调用。
unsigned last_mute_switch_for_led = 0xFFFFFFFF;
unsigned host_os = 0;
@@ -894,6 +893,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_dbl_stage = 2;
}
mic_mute_press_ticks++;
// 改动原因:按住满 1.5s 翻转 g_dnr_enableextra_i2s 中 GET_SHARED_GLOBAL 决定是否走 DNR松手时靠 mic_dnr_long_fired 屏蔽短按/双击。
if (mic_mute_press_ticks == C1_KEY_MIC_DNR_LONG_TICKS)
{
unsigned dnr_enable;
GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable);
dnr_enable = (dnr_enable != 0) ? 0 : 1;
SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable);
mic_dnr_long_fired = 1;
debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable);
}
// 改动原因同一时刻只允许mic mute键生效清除其它键状态避免释放时误执行音量或mode短按。
mode_press_ticks = 0;
vol_down_press_ticks = 0;
@@ -950,17 +959,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
}
}
// 改动原因mic短按静音改为延迟单击(防双击);双击短按切变声灯橙R+G按住满1.5sAI 状态变量无灯;长按与短/双互斥。
// 改动原因mic短按静音延迟单击防双击双击变声 mic 橙灯;长按1.5s g_dnr_enable 无灯;长按与短/双互斥。
{
unsigned mic_snap = mic_mute_press_ticks;
if (mic_snap > 0)
{
if ((mic_snap >= C1_KEY_MIC_AI_NR_TICKS) || mic_ai_long_fired)
if ((mic_snap >= C1_KEY_MIC_DNR_LONG_TICKS) || mic_dnr_long_fired)
{
if (mic_dbl_stage == 2)
mic_dbl_stage = 0;
}
else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_AI_NR_TICKS))
else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_DNR_LONG_TICKS))
{
if (mic_dbl_stage == 2)
{
@@ -976,7 +985,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_defer_left = C1_MIC_DOUBLE_DEFER_TICKS;
}
}
mic_ai_long_fired = 0;
mic_dnr_long_fired = 0;
}
}

View File

@@ -128,8 +128,8 @@ timer tm;
// 改动原因C1的TIMER_PERIOD为20ms按DS1同类短按/长按模型换算阈值mode/mic 仍用 LONG 区分短按窗口;音量键已取消长按连调故不再使用 REPEAT 间隔宏。
#define C1_KEY_SHORT_TICKS 1
#define C1_KEY_LONG_TICKS 50
// 改动原因:规格要求 mic 键长按 1.5s 触发 AI 通话降噪开关20ms*75=1.5s,与 mode 键的 C1_KEY_LONG_TICKS(1s) 解耦,避免误触。
#define C1_KEY_MIC_AI_NR_TICKS 75
// 改动原因:规格要求 mic 键长按 1.5s 切换 g_dnr_enableAI 通话降噪/DNR20ms*75=1.5s,与 mode 键 LONG 解耦,避免误触。
#define C1_KEY_MIC_DNR_LONG_TICKS 75
// 改动原因:双击第二下需在首击释放后约 500ms 内按下否则判为单击静音20ms*25=500ms。
#define C1_MIC_DOUBLE_DEFER_TICKS 25
// 改动原因新增C1模式持久化文件路径使用LittleFS保存mode按键状态保证断电重启后可恢复。
@@ -533,13 +533,12 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned vol_down_press_ticks = 0;
unsigned mic_mute_press_ticks = 0;
unsigned vol_up_press_ticks = 0;
// 改动原因mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 AI 互斥靠 mic_ai_long_fired。
// 改动原因mic 键双击需延迟首轮短按的静音动作,用 stage1=等超时单击 / stage2=已收到第二下按下等释放;与长按 DNR 互斥靠 mic_dnr_long_fired。
unsigned mic_dbl_stage = 0;
unsigned mic_defer_left = 0;
unsigned mic_ai_long_fired = 0;
// 改动原因:变声/美声仅按键+灯tile0 保存状态供下发橙色 mode 区AI 降噪无灯仅本地翻转供后续扩展
unsigned mic_dnr_long_fired = 0;
// 改动原因:变声/美声仅按键+灯tile0 保存状态供 set_mic_voice_fx 下发 mic 橙灯
unsigned c1_mic_voice_fx = 0;
unsigned c1_mic_ai_nr = 0;
// 改动原因mic mute红灯通过interface下发到tile1仅在状态变化时发送减少无意义跨tile调用。
unsigned last_mute_switch_for_led = 0xFFFFFFFF;
unsigned host_os = 0;
@@ -913,6 +912,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_dbl_stage = 2;
}
mic_mute_press_ticks++;
// 改动原因:按住满 1.5s 翻转 g_dnr_enableextra_i2s 中 GET_SHARED_GLOBAL 决定是否走 DNR松手时靠 mic_dnr_long_fired 屏蔽短按/双击。
if (mic_mute_press_ticks == C1_KEY_MIC_DNR_LONG_TICKS)
{
unsigned dnr_enable;
GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable);
dnr_enable = (dnr_enable != 0) ? 0 : 1;
SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable);
mic_dnr_long_fired = 1;
debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable);
}
// 改动原因同一时刻只允许mic mute键生效清除其它键状态避免释放时误执行音量或mode短按。
mode_press_ticks = 0;
vol_down_press_ticks = 0;
@@ -969,17 +978,17 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
}
}
// 改动原因mic短按静音改为延迟单击(防双击);双击短按切变声灯橙R+G按住满1.5sAI 状态变量无灯;长按与短/双互斥。
// 改动原因mic短按静音延迟单击防双击双击变声 mic 橙灯;长按1.5s g_dnr_enable 无灯;长按与短/双互斥。
{
unsigned mic_snap = mic_mute_press_ticks;
if (mic_snap > 0)
{
if ((mic_snap >= C1_KEY_MIC_AI_NR_TICKS) || mic_ai_long_fired)
if ((mic_snap >= C1_KEY_MIC_DNR_LONG_TICKS) || mic_dnr_long_fired)
{
if (mic_dbl_stage == 2)
mic_dbl_stage = 0;
}
else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_AI_NR_TICKS))
else if ((mic_snap >= C1_KEY_SHORT_TICKS) && (mic_snap < C1_KEY_MIC_DNR_LONG_TICKS))
{
if (mic_dbl_stage == 2)
{
@@ -995,7 +1004,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_defer_left = C1_MIC_DOUBLE_DEFER_TICKS;
}
}
mic_ai_long_fired = 0;
mic_dnr_long_fired = 0;
}
}