update footstep and threshold

This commit is contained in:
Steven Dan
2026-04-23 17:05:35 +08:00
parent f9661b1bdb
commit 776e146404
3 changed files with 138 additions and 43 deletions

View File

@@ -101,6 +101,9 @@ unsigned g_led_enable = 1; // LED开关默认开启
// HID 0xB0 CMD_EXPAND_GAIN到达时由eq.c设置button_task读取后更新footstep LED // HID 0xB0 CMD_EXPAND_GAIN到达时由eq.c设置button_task读取后更新footstep LED
// -1 (0xFFFFFFFF) 表示无待处理请求 // -1 (0xFFFFFFFF) 表示无待处理请求
unsigned g_hid_expand_gain_request = (unsigned)-1; unsigned g_hid_expand_gain_request = (unsigned)-1;
// HID 0xB0 CMD_LMT_THRESHOLD到达时由eq.c设置button_task读取后保存到flash
// 存储值为-threshold (0~35)-1 (0xFFFFFFFF) 表示无待处理请求
unsigned g_hid_lmt_threshold_request = (unsigned)-1;
// HID 0x84 FACTORY_RESET命令到达时由eq.c设置button_task轮询后执行重启 // HID 0x84 FACTORY_RESET命令到达时由eq.c设置button_task轮询后执行重启
unsigned g_request_factory_reset = 0; unsigned g_request_factory_reset = 0;
uint32_t get_reference_time(); uint32_t get_reference_time();
@@ -402,8 +405,9 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
unsigned push_button_music_mode_state_old = 1; // Active low unsigned push_button_music_mode_state_old = 1; // Active low
unsigned push_button_ai71_onoff_state_old = 1; // Active low unsigned push_button_ai71_onoff_state_old = 1; // Active low
unsigned push_button_game_mode_state_old = 1; // Active low unsigned push_button_game_mode_state_old = 1; // Active low
unsigned push_button_footsteps_enhancement_state_old = 1; // Active low unsigned push_button_footsteps_enhancement_state_old = 0; // Active low
unsigned push_button_aidenoise_onoff_state_old = 1; // Active low unsigned push_button_aidenoise_onoff_state_old = 1; // Active low
unsigned char saved_footstep = 0;
@@ -470,14 +474,21 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
// 加载脚步增强状态保存值为expand_gain: 0/6/12 // 加载脚步增强状态保存值为expand_gain: 0/6/12
{ {
unsigned char footstep_path[] = "footstep"; unsigned char footstep_path[] = "footstep";
unsigned char saved_footstep = load_value(footstep_path); saved_footstep = load_value(footstep_path);
if (saved_footstep == 6) flag_footsteps_enhancement = 1; debug_printf("Loaded footstep gain from flash: %d\n", saved_footstep);
else if (saved_footstep == 12) flag_footsteps_enhancement = 2; if (saved_footstep == 0) {
else if (saved_footstep == 255) { flag_footsteps_enhancement = 0;
// 未初始化:出厂默认脚步增强开启(12dB)写入flash } else if (saved_footstep <= 6) {
flag_footsteps_enhancement = 1;
} else if (saved_footstep <= 20) {
flag_footsteps_enhancement = 2;
} else {
// 未初始化(255)或异常值:出厂默认脚步增强开启(12dB)写入flash
saved_footstep = 12;
flag_footsteps_enhancement = 2; flag_footsteps_enhancement = 2;
save_value(footstep_path, (unsigned char)12); save_value(footstep_path, (unsigned char)12);
} else flag_footsteps_enhancement = 0; debug_printf("Saved footstep gain to flash: %d\n", saved_footstep);
}
debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement); debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement);
} }
#endif #endif
@@ -726,12 +737,30 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
#if USE_EX3D == 1 #if USE_EX3D == 1
// 发送初始脚步增强expand_gain到tile1 // 发送初始脚步增强expand_gain到tile1
{ {
int init_expand = 0;
if (flag_footsteps_enhancement == 1) init_expand = 6;
else if (flag_footsteps_enhancement == 2) init_expand = 12;
cc_mic_level <: 0xFD; cc_mic_level <: 0xFD;
cc_mic_level <: (unsigned)init_expand; cc_mic_level <: (unsigned) saved_footstep;
debug_printf("Sent init expand_gain %d to hid_button_task\n", init_expand); debug_printf("set init expand_gain %d to hid_button_task\n", saved_footstep);
}
// 加载枪声阈值并同步到tile1
// 存储格式: -threshold (0~35, 0=threshold=0dB), 255=未初始化
{
unsigned char lmt_thresh_path[] = "lmt_thresh";
unsigned char raw = load_value(lmt_thresh_path);
int init_threshold;
if (raw == 255) {
// 未初始化,使用默认值-15
init_threshold = -15;
save_value(lmt_thresh_path, (unsigned char)15);
} else if (raw <= 36) {
// raw=0~35 全部有效: 0=threshold=0dB(不限幅), 35=threshold=-35dB(最大限幅)
init_threshold = -(int)(raw - 1);
} else {
init_threshold = -15;
}
cc_mic_level <: 0xFA;
cc_mic_level <: (unsigned)init_threshold;
debug_printf("Loaded lmt_threshold=%d from flash (raw=%d), sent to tile1\n", init_threshold, raw);
} }
// 恢复脚步增强LED初始状态 // 恢复脚步增强LED初始状态
@@ -1137,7 +1166,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
factory_reset_hold_count = 0; factory_reset_hold_count = 0;
if (!btn_combo_active) { if (!btn_combo_active) {
if (btn_music_hold_ticks == BTN_COMBO_DELAY_TICKS) { if (btn_music_hold_ticks == BTN_COMBO_DELAY_TICKS) {
debug_printf("========= Music button pressed for %d ticks\n", BTN_COMBO_DELAY_TICKS); debug_printf("Music button pressed for %d ticks\n", BTN_COMBO_DELAY_TICKS);
#if (F3_F4_FPS_UAC2 == 1) #if (F3_F4_FPS_UAC2 == 1)
active_mode = 1; active_mode = 1;
need_reboot = 1; need_reboot = 1;
@@ -1169,7 +1198,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
factory_reset_hold_count = 0; factory_reset_hold_count = 0;
if (!btn_combo_active) { if (!btn_combo_active) {
if (btn_game_hold_ticks == BTN_COMBO_DELAY_TICKS) { if (btn_game_hold_ticks == BTN_COMBO_DELAY_TICKS) {
debug_printf("========= Game button pressed for %d ticks\n", BTN_COMBO_DELAY_TICKS); debug_printf("Game button pressed for %d ticks\n", BTN_COMBO_DELAY_TICKS);
#if F1_MUSIC_UAC2 == 1 #if F1_MUSIC_UAC2 == 1
active_mode = 2; active_mode = 2;
need_reboot = 1; need_reboot = 1;
@@ -1402,35 +1431,35 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
// 3档循环: 0(关/0dB) → 1(中亮/6dB) → 2(高亮/12dB) → 0 // 3档循环: 0(关/0dB) → 1(中亮/6dB) → 2(高亮/12dB) → 0
flag_footsteps_enhancement = (flag_footsteps_enhancement + 1) % 3; flag_footsteps_enhancement = (flag_footsteps_enhancement + 1) % 3;
mode_change = 1; mode_change = 1;
debug_printf("Footstep mode changed: %d -> %d\n", flag_footsteps_enhancement, flag_footsteps_enhancement + 1);
} }
} }
push_button_footsteps_enhancement_state_old = button_footsteps_enhancement; push_button_footsteps_enhancement_state_old = button_footsteps_enhancement;
if(mode_change) if(mode_change)
{ {
int new_expand_gain;
if(flag_footsteps_enhancement == 0) if(flag_footsteps_enhancement == 0)
{ {
new_expand_gain = 0; saved_footstep = 0;
led_off(&led_ctx, LED_FOOTSTEP_MODE); led_off(&led_ctx, LED_FOOTSTEP_MODE);
} }
else if(flag_footsteps_enhancement == 1) else if(flag_footsteps_enhancement == 1)
{ {
new_expand_gain = 6; saved_footstep = 6;
led_on(&led_ctx, LED_FOOTSTEP_MODE); led_on(&led_ctx, LED_FOOTSTEP_MODE);
} }
else else
{ {
new_expand_gain = 12; saved_footstep = 12;
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128); led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
} }
led_update_all(&led_ctx); led_update_all(&led_ctx);
// 发送expand_gain到tile1执行 // 发送expand_gain到tile1执行
cc_mic_level <: 0xFD; cc_mic_level <: 0xFD;
cc_mic_level <: (unsigned)new_expand_gain; cc_mic_level <: (unsigned)saved_footstep;
// 掉电保存 // 掉电保存
unsigned char footstep_path[] = "footstep"; unsigned char footstep_path[] = "footstep";
save_value(footstep_path, (unsigned char)new_expand_gain); save_value(footstep_path, (unsigned char)saved_footstep);
debug_printf("Footstep state=%d, expand_gain=%d\n", flag_footsteps_enhancement, new_expand_gain); debug_printf("Footstep state=%d, expand_gain=%d\n", flag_footsteps_enhancement, saved_footstep);
} }
// HID 0xB0 CMD_EXPAND_GAIN请求同步footstep LED状态 // HID 0xB0 CMD_EXPAND_GAIN请求同步footstep LED状态
@@ -1458,11 +1487,29 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128); led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
} }
led_update_all(&led_ctx); led_update_all(&led_ctx);
}
unsigned char fp[] = "footstep"; unsigned char fp[] = "footstep";
save_value(fp, (unsigned char)hid_gain_req); save_value(fp, (unsigned char)hid_gain_req);
saved_footstep = hid_gain_req;
debug_printf("HID set footstep gain=%d, state=%d\n", hid_gain_req, flag_footsteps_enhancement); debug_printf("HID set footstep gain=%d, state=%d\n", hid_gain_req, flag_footsteps_enhancement);
} }
} }
// HID 0xB0 CMD_LMT_THRESHOLD请求保存阈值到flash
// eq.c以(-threshold+1)编码存入shared global范围1~36此处解码后存flash (0~35)
{
unsigned hid_thresh_req;
GET_SHARED_GLOBAL(hid_thresh_req, g_hid_lmt_threshold_request);
if (hid_thresh_req != (unsigned)-1) {
SET_SHARED_GLOBAL(g_hid_lmt_threshold_request, (unsigned)-1);
if (hid_thresh_req >= 1 && hid_thresh_req <= 36) {
unsigned char lmt_thresh_path[] = "lmt_thresh";
unsigned char flash_raw = (unsigned char)(hid_thresh_req - 1);
save_value(lmt_thresh_path, flash_raw);
debug_printf("HID set lmt_threshold=-%d, saved to flash\n", (int)(hid_thresh_req - 1));
}
}
} }
#endif #endif
@@ -2032,14 +2079,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
#if USE_EX3D == 1 #if USE_EX3D == 1
// HID脚步增强状态变化主动上报按键切换或HID 0xB0命令导致的变化含首次开机上报 // HID脚步增强状态变化主动上报按键切换或HID 0xB0命令导致的变化含首次开机上报
{ {
unsigned current_footstep_expand;
if (flag_footsteps_enhancement == 0) current_footstep_expand = 0;
else if (flag_footsteps_enhancement == 1) current_footstep_expand = 6;
else current_footstep_expand = 12;
#if HID_DFU_EN #if HID_DFU_EN
if (!g_in_fw_upgrade) if (!g_in_fw_upgrade)
#endif #endif
if (last_footstep_expand != current_footstep_expand) { if (last_footstep_expand != saved_footstep ) {
unsafe { unsafe {
unsigned char * unsafe ptr = (unsigned char * unsafe)hidSendData; unsigned char * unsafe ptr = (unsigned char * unsafe)hidSendData;
ptr[0] = 1; ptr[0] = 1;
@@ -2048,15 +2091,15 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
// EX3D GET CMD_EXPAND_GAIN = 0x193 (little-endian) // EX3D GET CMD_EXPAND_GAIN = 0x193 (little-endian)
ptr[3] = 0x93; ptr[4] = 0x01; ptr[5] = 0x00; ptr[6] = 0x00; ptr[3] = 0x93; ptr[4] = 0x01; ptr[5] = 0x00; ptr[6] = 0x00;
// 返回值: expand_gain (uint32, little-endian) // 返回值: expand_gain (uint32, little-endian)
ptr[7] = (unsigned char)current_footstep_expand; ptr[7] = (unsigned char)saved_footstep;
ptr[8] = 0x00; ptr[9] = 0x00; ptr[10] = 0x00; ptr[8] = 0x00; ptr[9] = 0x00; ptr[10] = 0x00;
for (int i = 11; i < HID_MAX_DATA_BYTES; i++) ptr[i] = 0x00; for (int i = 11; i < HID_MAX_DATA_BYTES; i++) ptr[i] = 0x00;
} }
hidSetChangePending(0x1); hidSetChangePending(0x1);
debug_printf("Footstep expand_gain changed: %d -> %d, HID 0xB1 report sent\n", debug_printf("Footstep expand_gain changed: %d -> %d, HID 0xB1 report sent\n",
last_footstep_expand, current_footstep_expand); last_footstep_expand, saved_footstep);
} }
last_footstep_expand = current_footstep_expand; last_footstep_expand = saved_footstep;
} }
#endif #endif
#endif #endif

View File

@@ -41,6 +41,12 @@ extern void device_reboot(void);
unsigned g_ex3d_key_verified = 0; unsigned g_ex3d_key_verified = 0;
int32_t sys_vol = 0; int32_t sys_vol = 0;
unsigned g_mic_vol_cmd_pending = 0; unsigned g_mic_vol_cmd_pending = 0;
// 0xFA boot sync收到后置1ex3d_task用此标志决定是否保留boot sync的阈值
static volatile int g_boot_lmt_threshold_loaded = 0;
static volatile int g_boot_footstep_expand_gain_loaded = 0;
// audio_ex3d_init会覆盖Ex3dExpandGain为库默认值用此变量保存0xFD boot sync收到的值
static volatile int32_t g_boot_footstep_expand_gain_value = 12;
static volatile int32_t g_boot_lmt_threshold_value = -5;
chanend_t uc_ex3d_to_ubm, uc_eq_data; chanend_t uc_ex3d_to_ubm, uc_eq_data;
static unsigned ubm_sample_freq = 0; static unsigned ubm_sample_freq = 0;
@@ -665,10 +671,9 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
} }
threshold = Ex3dLimiterThreshold + (sys_vol + Ex3dOnGain + Ex3dExpandGain); threshold = Ex3dLimiterThreshold + (sys_vol + Ex3dOnGain + Ex3dExpandGain);
if (threshold > 0) threshold = 0;
if((-35 <= threshold) && (threshold <= 0)) { if (threshold < -35) threshold = -35;
EX3DAudio_SetLimiterThreshold(threshold); EX3DAudio_SetLimiterThreshold(threshold);
}
} else { // Get } else { // Get
debug_printf("Get CMD_LMT_THRESHOLD : %d\r\n", Ex3dLimiterThreshold); debug_printf("Get CMD_LMT_THRESHOLD : %d\r\n", Ex3dLimiterThreshold);
@@ -934,8 +939,24 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if ((0 <= gain) && (gain <= 20)) { if ((0 <= gain) && (gain <= 20)) {
Ex3dExpandGain = gain; Ex3dExpandGain = gain;
EX3DAudio_SetExpandGain(Ex3dExpandGain); EX3DAudio_SetExpandGain(Ex3dExpandGain);
g_boot_footstep_expand_gain_value = gain;
g_boot_footstep_expand_gain_loaded = 1;
debug_printf("Button set CMD_EXPAND_GAIN: %d\n", gain); debug_printf("Button set CMD_EXPAND_GAIN: %d\n", gain);
} }
#endif
} else if (tmp == 0xFA) {
// 开机同步枪声阈值从tile0 flash加载的Ex3dLimiterThreshold
// 必须先读取payload无论是否启用EX3D
int32_t threshold = (int32_t)chan_in_word(cc_mic_level);
#if USE_EX3D == 1
if ((-35 <= threshold) && (threshold <= 0)) {
Ex3dLimiterThreshold = threshold;
g_boot_lmt_threshold_loaded = 1;
g_boot_lmt_threshold_value = threshold;
EX3DAudio_SetLimiterThreshold(threshold);
// audio_ex3d_init尚未运行T≈200msex3d_task将在T=500ms后用正确的OnGain重新应用
debug_printf("Boot sync lmt_threshold=%d stored, will apply after ex3d init\n", threshold);
}
#endif #endif
} else if (tmp == 0xFE) { } else if (tmp == 0xFE) {
// 数字监听开关同步命令:来自 tile0所有模式都需要处理 // 数字监听开关同步命令:来自 tile0所有模式都需要处理
@@ -1007,11 +1028,10 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
#if USE_EX3D == 1 #if USE_EX3D == 1
sys_vol = sys_vol * (-1); sys_vol = sys_vol * (-1);
int32_t threshold = Ex3dLimiterThreshold + (sys_vol + Ex3dOnGain + Ex3dExpandGain); int32_t threshold = Ex3dLimiterThreshold + (sys_vol + Ex3dOnGain + Ex3dExpandGain);
if (threshold > 0) threshold = 0;
if((-35 <= threshold) && (threshold <= 0)) { if (threshold < -35) threshold = -35;
EX3DAudio_SetLimiterThreshold(threshold); EX3DAudio_SetLimiterThreshold(threshold);
debug_printf("Set CMD_LMT_THRESHOLD : %d\r\n", threshold); debug_printf("Set CMD_LMT_THRESHOLD : %d\r\n", threshold);
}
debug_printf("sys_vol:%d\n", sys_vol); debug_printf("sys_vol:%d\n", sys_vol);
#endif #endif
} }
@@ -1084,11 +1104,29 @@ void ex3d_task(){
Ex3dOffGain = -5; Ex3dOffGain = -5;
Ex3dOnGain = -5; Ex3dOnGain = -5;
Ex3dLfeGain = -5; Ex3dLfeGain = -5;
// 若boot sync (0xFA) 已到达保留flash加载的阈值否则使用默认值-15
if (!g_boot_lmt_threshold_loaded) {
Ex3dLimiterThreshold = -15; Ex3dLimiterThreshold = -15;
}
// audio_ex3d_init内部会将Ex3dExpandGain重置为库默认值(6),这里始终用保存值恢复
Ex3dExpandGain = g_boot_footstep_expand_gain_loaded ? g_boot_footstep_expand_gain_value : 12;
Ex3dLimiterThreshold = g_boot_lmt_threshold_loaded ? g_boot_lmt_threshold_value : -15;
EX3DAudio_SetOnGain(Ex3dOnGain); EX3DAudio_SetOnGain(Ex3dOnGain);
EX3DAudio_SetOffGain(Ex3dOffGain); EX3DAudio_SetOffGain(Ex3dOffGain);
EX3DAudio_SetLimiterThreshold(Ex3dLimiterThreshold); // audio_ex3d_init完成后用正确的增益链重新计算并应用阈值
{
int32_t init_effective = Ex3dLimiterThreshold + (sys_vol + Ex3dOnGain + Ex3dExpandGain);
if (init_effective > 0) init_effective = 0;
if (init_effective < -35) init_effective = -35;
EX3DAudio_SetLimiterThreshold(init_effective);
debug_printf("ex3d_task init: lmt_threshold=%d effective=%d expand=%d\n",
Ex3dLimiterThreshold, init_effective, Ex3dExpandGain);
}
// 0xFD boot sync在init前调用了EX3DAudio_SetExpandGaininit后重新应用
EX3DAudio_SetExpandGain(Ex3dExpandGain);
debug_printf("ex3d_task init: expand_gain=%d\n", Ex3dExpandGain);
#endif #endif

View File

@@ -464,6 +464,7 @@ extern void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData);
static chanend_t g_ex3d_hid_chanend = 0; static chanend_t g_ex3d_hid_chanend = 0;
static unsigned ex3d_b0b1_result[HID_MAX_DATA_BYTES / 4] = {0}; static unsigned ex3d_b0b1_result[HID_MAX_DATA_BYTES / 4] = {0};
extern unsigned g_hid_expand_gain_request; extern unsigned g_hid_expand_gain_request;
extern unsigned g_hid_lmt_threshold_request;
void SetEx3dHidChan(chanend_t c) { g_ex3d_hid_chanend = c; } void SetEx3dHidChan(chanend_t c) { g_ex3d_hid_chanend = c; }
#endif #endif
@@ -823,6 +824,19 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
SET_SHARED_GLOBAL(g_hid_expand_gain_request, gain_val); SET_SHARED_GLOBAL(g_hid_expand_gain_request, gain_val);
} }
// 若是SET CMD_LMT_THRESHOLD (0x87)通知button_task保存阈值到flash
// 存储编码: -threshold (0~35)避免与哨兵值0xFFFFFFFF冲突
if (data[1] == 0xB0 && ex3d_cmd == 0x87 && params_len >= 4) {
int32_t threshold_val = (int32_t)((uint32_t)data[6] | ((uint32_t)data[7] << 8) |
((uint32_t)data[8] << 16) | ((uint32_t)data[9] << 24));
if (threshold_val >= -35 && threshold_val <= 0) {
// Encode as (-threshold_val + 1) so range is 1~36.
// Avoids save_code=0 (flash "uninitialized" sentinel) when threshold_val=0.
uint32_t save_code = (uint32_t)(-threshold_val) + 1;
SET_SHARED_GLOBAL(g_hid_lmt_threshold_request, save_code);
}
}
// 发送命令到tile1并同步等待结果 // 发送命令到tile1并同步等待结果
// 协议: cmd(1 byte) + ex3d_cmd_code(4 bytes) + params_len(1 byte) + params(N bytes) // 协议: cmd(1 byte) + ex3d_cmd_code(4 bytes) + params_len(1 byte) + params(N bytes)
chan_out_byte(g_ex3d_hid_chanend, data[1]); chan_out_byte(g_ex3d_hid_chanend, data[1]);