update mic button support detail

This commit is contained in:
Steven Dan
2026-05-22 15:35:40 +08:00
parent bba34bbcd5
commit 34e83ace9f
4 changed files with 148 additions and 52 deletions

View File

@@ -126,6 +126,10 @@ timer tm;
// 改动原因DAC 音量单独持久化路径,与 mode 的 c1_mode 文件分离,避免互相覆盖且便于维护。
#define C1_DAC_VOL_INFO_PATH "c1_dac_vol"
// 改动原因:麦克风按键三种状态(静音/变声/DNR均需断电保存上电恢复并同步LED显示。
#define C1_MIC_MUTE_INFO_PATH "c1_mic_mute"
#define C1_VOICE_FX_INFO_PATH "c1_voice_fx"
#define C1_DNR_EN_INFO_PATH "c1_dnr_en"
// 改动原因:与 FORMAT_DELAY(30000000) 相同时间基准get_reference_time 滴答),用户停止调节 300ms 后再写 Flash减少磨损并满足需求。
#define C1_DAC_VOL_SAVE_DELAY (30000000)
@@ -615,14 +619,35 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
dac_vol_persist_deadline = 0;
}
// 改动原因tile1 上电已硬件全灭;先下发当前 g_mute_switch 再下发 Flash 中的 c1_mode使首帧 apply 时 mic 已正确,避免仅 set_mode 时用占位 mic 闪错 mute 灯。
unsigned init_mute_for_led;
GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch);
i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led);
i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode));
// 改动原因:上电默认关闭变声灯效覆盖,避免未初始化随机亮橙。
i_c1_led_ctrl.set_mic_voice_fx(0);
last_mute_switch_for_led = init_mute_for_led;
// 改动原因:三种 mic 状态(静音/变声/DNR均需断电保存上电从 Flash 读取并恢复;无效値(非 0/1时使用默认値。
{
unsigned char loaded_mute = load_value(C1_MIC_MUTE_INFO_PATH);
unsigned init_mute = (loaded_mute == 0 || loaded_mute == 1) ? (unsigned)loaded_mute : 1u;
SET_SHARED_GLOBAL(g_mute_switch, init_mute);
}
{
unsigned char loaded_vfx = load_value(C1_VOICE_FX_INFO_PATH);
c1_mic_voice_fx = (loaded_vfx == 1) ? 1u : 0u;
}
{
unsigned char loaded_dnr = load_value(C1_DNR_EN_INFO_PATH);
unsigned init_dnr = (loaded_dnr == 0 || loaded_dnr == 1) ? (unsigned)loaded_dnr : 1u;
SET_SHARED_GLOBAL(g_dnr_enable, init_dnr);
}
// 改动原因tile1 上电已硬件全灯先下发三种mic状态再下发 mode使首帧 apply 时 mic 已正确。
{
unsigned init_mute_for_led;
unsigned init_dnr_for_led;
GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch);
GET_SHARED_GLOBAL(init_dnr_for_led, g_dnr_enable);
i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led);
i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode));
i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx);
i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led);
last_mute_switch_for_led = init_mute_for_led;
}
while(1)
{
@@ -886,6 +911,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_volume(effective_adc_vol, i2c);
}
SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch);
// 改动原因静音状态变化后立即保存到Flash保证断电后恢复正确的静音灯状态。
save_value(C1_MIC_MUTE_INFO_PATH, (unsigned char)current_mute_switch);
i_c1_led_ctrl.set_mic_mute_state(current_mute_switch);
last_mute_switch_for_led = current_mute_switch;
debug_printf("C1 key mic mute toggle (deferred single): %d\n", current_mute_switch);
@@ -934,6 +961,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable);
dnr_enable = (dnr_enable != 0) ? 0 : 1;
SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable);
// 改动原因DNR状态变化后立即下发LED开亮蓝灯/关灯并保存到Flash供断电恢复。
i_c1_led_ctrl.set_mic_dnr_state(dnr_enable);
save_value(C1_DNR_EN_INFO_PATH, (unsigned char)dnr_enable);
mic_dnr_long_fired = 1;
debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable);
}
@@ -1005,6 +1035,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
{
c1_mic_voice_fx = (c1_mic_voice_fx ? 0 : 1);
i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx);
// 改动原因变声状态变化后立即保存到Flash保证断电后恢复正确的变声灯状态。
save_value(C1_VOICE_FX_INFO_PATH, (unsigned char)c1_mic_voice_fx);
mic_dbl_stage = 0;
mic_defer_left = 0;
debug_printf("C1 mic voice/beautifier toggle: %d\n", c1_mic_voice_fx);
@@ -1948,23 +1980,29 @@ static inline void c1_panel_leds_force_all_off_hw(void)
p_mic_mute_led_blue <: 1;
}
// 改动原因c1_mode 与灯索引一致1= 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_mode_led_red + p_leds bit0/1不受 mic 变声影响。
// mic_voice_fx_on规格变声/美声橙灯在 mic 区——p_leds bit2 红 + bit3 绿同时点亮;关变声时 mic 区仅由静音决定 bit2bit3 熄灭。
static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned &led_shadow)
// 改动原因c1_mode 与灯索引一致1= 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_mode_led_red + p_leds bit0/1不受 mic 变声影响。
// 改动原因mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR非静音时变声=橙(R+G)DNR=蓝(p_mic_mute_led_blue)
// 两者同开=橙+蓝混合,两者均关=全灯。
static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned mic_dnr_on, unsigned &led_shadow)
{
unsigned mode_red = 0;
unsigned mode_green = 0;
unsigned mode_blue = 0;
// 改动原因:与 user_main.h 约定一致——mic_mute_switch 存的是“非静音=1、静音=0”静音时 mic 红灯bit2亮。
unsigned mic_red = 0;
unsigned mic_green = 0;
if (mic_voice_fx_on) {
// 改动原因:变声开为橙=R+G映射到 XS1_PORT_4D 的 mic 专用 bit2/bit3不占用 mode 的 bit0/bit1。
mic_red = 1;
mic_green = 1;
} else {
mic_red = (mic_mute_switch == 0) ? 1 : 0;
unsigned mic_blue = 0;
// 改动原因:静音优先——静音(mic_mute_switch==0)时只亮红灯屏蔽变声橙灯和DNR蓝灯
// 关闭静音后恢复为变声/DNR/混合/全灯的组合状态,满足“关闭静音时回到其他模式的灯颜色”需求。
if (mic_mute_switch == 0) {
mic_red = 1;
mic_green = 0;
mic_blue = 0;
} else {
// 改动原因:变声=橙(R+G)DNR=蓝,两者同时开=橙+蓝混合,两者均关=全灯。
mic_red = mic_voice_fx_on ? 1 : 0;
mic_green = mic_voice_fx_on ? 1 : 0;
mic_blue = mic_dnr_on ? 1 : 0;
}
if (mode_led_color_idx == 1) {
@@ -1987,7 +2025,8 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic
mode_blue = 0;
}
// 改动原因硬件LED为低电平点亮1/0亮低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿统一刷新避免旧代码固定 |=0x8 导致 bit3 永灭
// 改动原因硬件LED为低电平点亮1/0亮低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿统一刷新。
// 改动原因p_mic_mute_led_blue 由 mic_blue 驱动DNR开且非静音时亮蓝灯输出0=亮)。
p_mode_led_red <: (mode_red ? 0 : 1);
led_shadow &= ~0xF;
led_shadow |= (mode_green ? 0x0 : 0x1);
@@ -1995,18 +2034,19 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic
led_shadow |= (mic_red ? 0x0 : 0x4);
led_shadow |= (mic_green ? 0x0 : 0x8);
p_leds <: led_shadow;
// 改动原因该蓝灯当前不参与功能保持熄灭低电平有效下输出1表示灭
p_mic_mute_led_blue <: 1;
p_mic_mute_led_blue <: (mic_blue ? 0 : 1);
}
void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl)
{
// 改动原因tile1 先于 tile0 运行,上电先把硬件灯全且不调用 apply避免用占位 mic/mode 组合误亮shadow 置为全电平便于首包 set_* 时 apply 与端口一致。
// 改动原因tile1 先于 tile0 运行,上电先把硬件灯全且不调用 apply避免用占位 mic/mode 组合误亮shadow 置为全灯灯电平便于首包 set_* 时 apply 与端口一致。
unsigned led_shadow = 0xF;
unsigned mode_led_color_idx = 1;
unsigned mic_mute_switch = 1;
// 改动原因:变声/美声开时仅 p_leds bit2/bit3 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。
unsigned mic_voice_fx_on = 0;
// 改动原因AI通话降噪DNR开时点亮p_mic_mute_led_blue蓝灯与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。
unsigned mic_dnr_on = 0;
c1_panel_leds_force_all_off_hw();
unsigned eq_mode_time = 0;
@@ -2025,19 +2065,24 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl)
unsafe {
select{
case i_c1_led_ctrl.set_mode_led_color(unsigned color_idx):
// 改动原因color_idx 与 c1_mode 同 1~5越界时位为默认灯码,避免未定义索引。
// 改动原因color_idx 与 c1_mode 同 1~5越界时位为默认灯码,避免未定义索引。
mode_led_color_idx = color_idx;
if (mode_led_color_idx > 5 || mode_led_color_idx < 1)
mode_led_color_idx = C1_MODE_VALUE_DEFAULT;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow);
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
case i_c1_led_ctrl.set_mic_mute_state(unsigned mute_state):
mic_mute_switch = (mute_state != 0) ? 1 : 0;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow);
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
case i_c1_led_ctrl.set_mic_voice_fx(unsigned voice_fx_enabled):
mic_voice_fx_on = (voice_fx_enabled != 0) ? 1 : 0;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow);
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
case i_c1_led_ctrl.set_mic_dnr_state(unsigned dnr_enabled):
// 改动原因:接收 tile0 按键逻辑下发的 DNR 状态,刷新 mic 区蓝灯;静音优先在 apply 内部处理。
mic_dnr_on = (dnr_enabled != 0) ? 1 : 0;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
}
}

View File

@@ -14,6 +14,9 @@ interface c1_led_ctrl_if {
// 改动原因:麦克风键双击“变声/美声”仅改灯效时,在 tile1 点亮 p_leds 的 mic 区非0=bit2 红 + bit3 绿0=仅按静音规则驱动 bit2、bit3 熄灭。
// 改动原因:参数名不能用 xC 保留字 onon tile[:]: 语法),否则编译器在解析 interface 时报 parse error before "on"。
void set_mic_voice_fx(unsigned voice_fx_enabled);
// 改动原因麦克风键长按1.5s切换AI通话降噪(DNR)开时点亮p_mic_mute_led_blue蓝灯
// 与变声同时开时橙+蓝混合静音优先静音时所有mic灯被红灯取代。断电需保存。
void set_mic_dnr_state(unsigned dnr_enabled);
};
void switch_handler(void);
void flag_handler();

View File

@@ -126,6 +126,10 @@ timer tm;
// 改动原因DAC 音量单独持久化路径,与 mode 的 c1_mode 文件分离,避免互相覆盖且便于维护。
#define C1_DAC_VOL_INFO_PATH "c1_dac_vol"
// 改动原因:麦克风按键三种状态(静音/变声/DNR均需断电保存上电恢复并同步LED显示。
#define C1_MIC_MUTE_INFO_PATH "c1_mic_mute"
#define C1_VOICE_FX_INFO_PATH "c1_voice_fx"
#define C1_DNR_EN_INFO_PATH "c1_dnr_en"
// 改动原因:与 FORMAT_DELAY(30000000) 相同时间基准get_reference_time 滴答),用户停止调节 300ms 后再写 Flash减少磨损并满足需求。
#define C1_DAC_VOL_SAVE_DELAY (30000000)
@@ -618,14 +622,35 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
dac_vol_persist_deadline = 0;
}
// 改动原因tile1 上电已硬件全灭;先下发当前 g_mute_switch 再下发 Flash 中的 c1_mode使首帧 apply 时 mic 已正确,避免仅 set_mode 时用占位 mic 闪错 mute 灯。
unsigned init_mute_for_led;
GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch);
i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led);
i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode));
// 改动原因:上电默认关闭变声灯效覆盖,避免未初始化随机亮橙。
i_c1_led_ctrl.set_mic_voice_fx(0);
last_mute_switch_for_led = init_mute_for_led;
// 改动原因:三种 mic 状态(静音/变声/DNR均需断电保存上电从 Flash 读取并恢复;无效値(非 0/1时使用默认値。
{
unsigned char loaded_mute = load_value(C1_MIC_MUTE_INFO_PATH);
unsigned init_mute = (loaded_mute == 0 || loaded_mute == 1) ? (unsigned)loaded_mute : 1u;
SET_SHARED_GLOBAL(g_mute_switch, init_mute);
}
{
unsigned char loaded_vfx = load_value(C1_VOICE_FX_INFO_PATH);
c1_mic_voice_fx = (loaded_vfx == 1) ? 1u : 0u;
}
{
unsigned char loaded_dnr = load_value(C1_DNR_EN_INFO_PATH);
unsigned init_dnr = (loaded_dnr == 0 || loaded_dnr == 1) ? (unsigned)loaded_dnr : 1u;
SET_SHARED_GLOBAL(g_dnr_enable, init_dnr);
}
// 改动原因tile1 上电已硬件全灯先下发三种mic状态再下发 mode使首帧 apply 时 mic 已正确。
{
unsigned init_mute_for_led;
unsigned init_dnr_for_led;
GET_SHARED_GLOBAL(init_mute_for_led, g_mute_switch);
GET_SHARED_GLOBAL(init_dnr_for_led, g_dnr_enable);
i_c1_led_ctrl.set_mic_mute_state(init_mute_for_led);
i_c1_led_ctrl.set_mode_led_color(c1_mode_to_tile_mode_led_code(c1_mode));
i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx);
i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led);
last_mute_switch_for_led = init_mute_for_led;
}
while(1)
{
@@ -889,6 +914,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
mic_volume(effective_adc_vol, i2c);
}
SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch);
// 改动原因静音状态变化后立即保存到Flash保证断电后恢复正确的静音灯状态。
save_value(C1_MIC_MUTE_INFO_PATH, (unsigned char)current_mute_switch);
i_c1_led_ctrl.set_mic_mute_state(current_mute_switch);
last_mute_switch_for_led = current_mute_switch;
debug_printf("C1 key mic mute toggle (deferred single): %d\n", current_mute_switch);
@@ -937,6 +964,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
GET_SHARED_GLOBAL(dnr_enable, g_dnr_enable);
dnr_enable = (dnr_enable != 0) ? 0 : 1;
SET_SHARED_GLOBAL(g_dnr_enable, dnr_enable);
// 改动原因DNR状态变化后立即下发LED开亮蓝灯/关灯并保存到Flash供断电恢复。
i_c1_led_ctrl.set_mic_dnr_state(dnr_enable);
save_value(C1_DNR_EN_INFO_PATH, (unsigned char)dnr_enable);
mic_dnr_long_fired = 1;
debug_printf("C1 mic DNR toggle (hold 1.5s): %d\n", dnr_enable);
}
@@ -1008,6 +1038,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
{
c1_mic_voice_fx = (c1_mic_voice_fx ? 0 : 1);
i_c1_led_ctrl.set_mic_voice_fx(c1_mic_voice_fx);
// 改动原因变声状态变化后立即保存到Flash保证断电后恢复正确的变声灯状态。
save_value(C1_VOICE_FX_INFO_PATH, (unsigned char)c1_mic_voice_fx);
mic_dbl_stage = 0;
mic_defer_left = 0;
debug_printf("C1 mic voice/beautifier toggle: %d\n", c1_mic_voice_fx);
@@ -1951,23 +1983,29 @@ static inline void c1_panel_leds_force_all_off_hw(void)
p_mic_mute_led_blue <: 1;
}
// 改动原因c1_mode 与灯索引一致1= 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_mode_led_red + p_leds bit0/1不受 mic 变声影响。
// mic_voice_fx_on规格变声/美声橙灯在 mic 区——p_leds bit2 红 + bit3 绿同时点亮;关变声时 mic 区仅由静音决定 bit2bit3 熄灭。
static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned &led_shadow)
// 改动原因c1_mode 与灯索引一致1= 2=蓝 3=绿 4=橙(R+G) 5=紫(R+B);仅驱动 mode 区p_mode_led_red + p_leds bit0/1不受 mic 变声影响。
// 改动原因mic 区灯优先级:静音=只亮红灯(覆盖变声/DNR非静音时变声=橙(R+G)DNR=蓝(p_mic_mute_led_blue)
// 两者同开=橙+蓝混合,两者均关=全灯。
static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic_mute_switch, unsigned mic_voice_fx_on, unsigned mic_dnr_on, unsigned &led_shadow)
{
unsigned mode_red = 0;
unsigned mode_green = 0;
unsigned mode_blue = 0;
// 改动原因:与 user_main.h 约定一致——mic_mute_switch 存的是“非静音=1、静音=0”静音时 mic 红灯bit2亮。
unsigned mic_red = 0;
unsigned mic_green = 0;
if (mic_voice_fx_on) {
// 改动原因:变声开为橙=R+G映射到 XS1_PORT_4D 的 mic 专用 bit2/bit3不占用 mode 的 bit0/bit1。
mic_red = 1;
mic_green = 1;
} else {
mic_red = (mic_mute_switch == 0) ? 1 : 0;
unsigned mic_blue = 0;
// 改动原因:静音优先——静音(mic_mute_switch==0)时只亮红灯屏蔽变声橙灯和DNR蓝灯
// 关闭静音后恢复为变声/DNR/混合/全灯的组合状态,满足“关闭静音时回到其他模式的灯颜色”需求。
if (mic_mute_switch == 0) {
mic_red = 1;
mic_green = 0;
mic_blue = 0;
} else {
// 改动原因:变声=橙(R+G)DNR=蓝,两者同时开=橙+蓝混合,两者均关=全灯。
mic_red = mic_voice_fx_on ? 1 : 0;
mic_green = mic_voice_fx_on ? 1 : 0;
mic_blue = mic_dnr_on ? 1 : 0;
}
if (mode_led_color_idx == 1) {
@@ -1990,7 +2028,8 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic
mode_blue = 0;
}
// 改动原因硬件LED为低电平点亮1/0亮低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿统一刷新避免旧代码固定 |=0x8 导致 bit3 永灭
// 改动原因硬件LED为低电平点亮1/0亮低四位 bit0~3 分别为 mode绿、mode蓝、mic红、mic绿统一刷新。
// 改动原因p_mic_mute_led_blue 由 mic_blue 驱动DNR开且非静音时亮蓝灯输出0=亮)。
p_mode_led_red <: (mode_red ? 0 : 1);
led_shadow &= ~0xF;
led_shadow |= (mode_green ? 0x0 : 0x1);
@@ -1998,18 +2037,19 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic
led_shadow |= (mic_red ? 0x0 : 0x4);
led_shadow |= (mic_green ? 0x0 : 0x8);
p_leds <: led_shadow;
// 改动原因该蓝灯当前不参与功能保持熄灭低电平有效下输出1表示灭
p_mic_mute_led_blue <: 1;
p_mic_mute_led_blue <: (mic_blue ? 0 : 1);
}
void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_eq_data)
{
// 改动原因tile1 先于 tile0 运行,上电先把硬件灯全且不调用 apply避免用占位 mic/mode 组合误亮shadow 置为全电平便于首包 set_* 时 apply 与端口一致。
// 改动原因tile1 先于 tile0 运行,上电先把硬件灯全且不调用 apply避免用占位 mic/mode 组合误亮shadow 置为全灯灯电平便于首包 set_* 时 apply 与端口一致。
unsigned led_shadow = 0xF;
unsigned mode_led_color_idx = 1;
unsigned mic_mute_switch = 1;
// 改动原因:变声/美声开时仅 p_leds bit2/bit3 显橙,与 set_mode_led_color 下发的 mode 灯独立;此处状态与 tile0 set_mic_voice_fx 同步。
unsigned mic_voice_fx_on = 0;
// 改动原因AI通话降噪DNR开时点亮p_mic_mute_led_blue蓝灯与变声同时开时橙+蓝混合;静音优先在 apply 内部处理。
unsigned mic_dnr_on = 0;
c1_panel_leds_force_all_off_hw();
unsigned eq_mode_time = 0;
@@ -2028,19 +2068,24 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_
unsafe {
select{
case i_c1_led_ctrl.set_mode_led_color(unsigned color_idx):
// 改动原因color_idx 与 c1_mode 同 1~5越界时位为默认灯码,避免未定义索引。
// 改动原因color_idx 与 c1_mode 同 1~5越界时位为默认灯码,避免未定义索引。
mode_led_color_idx = color_idx;
if (mode_led_color_idx > 5 || mode_led_color_idx < 1)
mode_led_color_idx = C1_MODE_VALUE_DEFAULT;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow);
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
case i_c1_led_ctrl.set_mic_mute_state(unsigned mute_state):
mic_mute_switch = (mute_state != 0) ? 1 : 0;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow);
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
case i_c1_led_ctrl.set_mic_voice_fx(unsigned voice_fx_enabled):
mic_voice_fx_on = (voice_fx_enabled != 0) ? 1 : 0;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, led_shadow);
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
case i_c1_led_ctrl.set_mic_dnr_state(unsigned dnr_enabled):
// 改动原因:接收 tile0 按键逻辑下发的 DNR 状态,刷新 mic 区蓝灯;静音优先在 apply 内部处理。
mic_dnr_on = (dnr_enabled != 0) ? 1 : 0;
apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, mic_voice_fx_on, mic_dnr_on, led_shadow);
break;
}
}

View File

@@ -13,6 +13,9 @@ interface c1_led_ctrl_if {
// 改动原因:麦克风键双击“变声/美声”仅改灯效时,在 tile1 点亮 p_leds 的 mic 区非0=bit2 红 + bit3 绿0=仅按静音规则驱动 bit2、bit3 熄灭。
// 改动原因:参数名不能用 xC 保留字 onon tile[:]: 语法),否则编译器在解析 interface 时报 parse error before "on"。
void set_mic_voice_fx(unsigned voice_fx_enabled);
// 改动原因麦克风键长按1.5s切换AI通话降噪(DNR)开时点亮p_mic_mute_led_blue蓝灯
// 与变声同时开时橙+蓝混合静音优先静音时所有mic灯被红灯取代。断电需保存。
void set_mic_dnr_state(unsigned dnr_enabled);
};
void switch_handler(void);
void flag_handler();