default settings

This commit is contained in:
Steven Dan
2026-03-26 14:58:38 +08:00
parent f3d757417c
commit 80d3dda19d
4 changed files with 200 additions and 16 deletions

View File

@@ -96,6 +96,8 @@ unsigned g_led_enable = 1; // LED开关默认开启
// HID 0xB0 CMD_EXPAND_GAIN到达时由eq.c设置button_task读取后更新footstep LED
// -1 (0xFFFFFFFF) 表示无待处理请求
unsigned g_hid_expand_gain_request = (unsigned)-1;
// HID 0x84 FACTORY_RESET命令到达时由eq.c设置button_task轮询后执行重启
unsigned g_request_factory_reset = 0;
uint32_t get_reference_time();
unsigned g_disable_i2c = 0;
unsigned g_dac_mode = 10;
@@ -319,9 +321,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
//port_enable(p_button_music_mode);
int codec_adc_pga_gain_reg_value = NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE;// NAU88L21_PGA_GAIN_REG_MAX_VALUE;//0x01;//0x1f;
// 出厂默认麦克风21dB (reg=22), 监听-14dB (level=15)
int codec_adc_pga_gain_reg_value = 22; // 21dB
int dac_level = DAC_LEVEL_DEFAULT;
int dac_level = 15; // -14dB (DAC_LEVEL_MAX - 14 = 29 - 14 = 15)
// mic endcoder 变量
uint8_t prev_encode_input1 = 0;
@@ -344,9 +347,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
// active_mode: 0=off, 1=music (LED_MUSIC, no algorithm),
// 2=game (LED_GAME_MODE, IR_GAME), 3=AI7.1 (LED_AI7_1, IR_7_1_GAME)
unsigned active_mode = 0;
// 脚步增强3档状态: 0=关(0dB), 1=中亮/6dB, 2=高亮/12dB
unsigned flag_footsteps_enhancement = 0;
unsigned flag_aidenoise_onoff = 0;
// 脚步增强3档状态: 0=关(0dB), 1=中亮/6dB, 2=高亮/12dB;出厂默认开启(12dB)
unsigned flag_footsteps_enhancement = 2;
// 出厂默认AI降噪开启
unsigned flag_aidenoise_onoff = 1;
// Buttons state
unsigned push_button_music_mode_state_old = 1; // Active low
@@ -390,7 +394,11 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
unsigned char saved_footstep = load_value(footstep_path);
if (saved_footstep == 6) flag_footsteps_enhancement = 1;
else if (saved_footstep == 12) flag_footsteps_enhancement = 2;
else flag_footsteps_enhancement = 0;
else if (saved_footstep == 255) {
// 未初始化:出厂默认脚步增强开启(12dB)写入flash
flag_footsteps_enhancement = 2;
save_value(footstep_path, (unsigned char)12);
} else flag_footsteps_enhancement = 0;
debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement);
}
#endif
@@ -409,13 +417,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
}
#else
if (saved_mode == 255) {
#if defined(F1_MUSIC_UAC2)
saved_mode = 1; // f1: default music mode
#elif defined(F3_F4_FPS_UAC2)
saved_mode = 3; // f3/f4: default AI7.1 (IR_7_1_GAME)
#else
saved_mode = 0;
#endif
// 出厂默认AI7.1开启(mode=3)
saved_mode = 3;
save_value(path, saved_mode);
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
}
@@ -502,13 +505,13 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
if(saved_mic >= NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && saved_mic <= NAU88L21_PGA_GAIN_REG_MAX_VALUE)
codec_adc_pga_gain_reg_value = saved_mic;
else
save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value);
save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value); // 出厂默认22(21dB)
unsigned char saved_dac = load_value(dac_vol_path);
if(saved_dac <= DAC_LEVEL_MAX)
dac_level = saved_dac;
else
save_value(dac_vol_path, (unsigned char)dac_level);
save_value(dac_vol_path, (unsigned char)dac_level); // 出厂默认15(-14dB)
}
// 同步全局音量变量与从Flash恢复的dac_level / codec_adc_pga_gain_reg_value
g_volume_level = dac_level;
@@ -588,7 +591,16 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
led_on(&led_ctx, LED_FOOTSTEP_MODE);
led_update_all(&led_ctx);
}
#endif
#endif
// 出厂默认AI降噪开启初始化LED和算法
#if DNR_ENABLE == 1
if (flag_aidenoise_onoff) {
led_on(&led_ctx, LED_ANC);
led_update_all(&led_ctx);
dnr_set_mode(1);
}
#endif
// port_enable(p_ctrl_keys);
port_ctrl_keys = 0;//port_in(p_ctrl_keys);
@@ -991,6 +1003,18 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
//led_update_all(&led_ctx);
#endif
// 检查HID 0x84 FACTORY_RESET请求
{
unsigned factory_reset_req;
GET_SHARED_GLOBAL(factory_reset_req, g_request_factory_reset);
if (factory_reset_req) {
SET_SHARED_GLOBAL(g_request_factory_reset, 0);
debug_printf("Factory reset: rebooting...\n");
delay_milliseconds(500);
device_reboot();
while (1);
}
}
mode_change = 0;
if(button_mic_mute == 0)

View File

@@ -460,6 +460,10 @@ static unsigned ex3d_b0b1_result[HID_MAX_DATA_BYTES / 4] = {0};
extern unsigned g_hid_expand_gain_request;
void SetEx3dHidChan(chanend_t c) { g_ex3d_hid_chanend = c; }
#endif
// 0x84 FACTORY_RESET: 删除Flash参数后触发重启由button_task轮询执行
extern unsigned g_request_factory_reset;
extern int lfs_remove_file(const char *path);
unsigned char process_send_params(uint8_t data[], uint16_t len) {
if (len < 60) {
return false;
@@ -722,6 +726,21 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
return true;
}
// 处理恢复出厂默认命令 (0x84) - FACTORY_RESET
if (data[1] == 0x84) {
// 删除所有Flash保存的参数文件
lfs_remove_file("game_mode");
lfs_remove_file("mic_vol");
lfs_remove_file("dac_vol");
lfs_remove_file("footstep");
// 删除EQ flash数据
eq_flash_clear_all();
// 通知button_task在合适时机重启避免在USB上下文中直接reboot
SET_SHARED_GLOBAL(g_request_factory_reset, 1);
read_request.pending_cmd = 0x84;
return true;
}
// 处理发送/读取EX3D命令 (0xB0/0xB1) - SET_EX3D_CMD / GET_EX3D_CMD
// 数据通过 g_ex3d_hid_chanend 直接传到tile1的hid_button_task执行结果同步返回
if (data[1] == 0xB0 || data[1] == 0xB1) {
@@ -1073,6 +1092,14 @@ unsigned char process_read_params(uint8_t response[]) {
return true;
}
// 处理恢复出厂默认响应 (0x84) - FACTORY_RESET
if (read_request.pending_cmd == 0x84) {
RSP_HDR(response, 0x84);
response[2] = 0x00; // 成功
read_request.pending_cmd = 0;
return true;
}
// 处理发送EX3D命令响应 (0xB0) - SET_EX3D_CMD
// 结果已在process_send_params中同步从tile1获取存于ex3d_b0b1_result
if (ex3d_request.pending_cmd == 0xB0) {

View File

@@ -678,6 +678,13 @@ class EQDesigner(QMainWindow):
firmware_btn_layout.addWidget(self.get_firmware_version_btn)
device_mode_layout.addRow(firmware_btn_layout)
# 恢复出厂默认按钮
factory_reset_btn_layout = QHBoxLayout()
self.factory_reset_btn = QPushButton("恢复出厂默认 (0x84)")
self.factory_reset_btn.clicked.connect(self.on_factory_reset)
factory_reset_btn_layout.addWidget(self.factory_reset_btn)
device_mode_layout.addRow(factory_reset_btn_layout)
left_content_layout.addWidget(device_mode_group)
@@ -2022,6 +2029,83 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{
except Exception as e:
log_message(LOG_LEVEL_ERROR, f"复位EQ参数时出错: {str(e)}", self.log_level)
def on_factory_reset(self):
"""恢复出厂默认发送0x84命令"""
if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return
reply = QMessageBox.warning(
self,
"确认恢复出厂默认",
"这将删除所有已保存的参数音效模式、麦克风增益、监听音量、脚步声增强、EQ预设\n"
"恢复出厂默认值,并重启设备。\n\n"
"出厂默认值:\n"
" · 音效模式: AI7.1 (3)\n"
" · 脚步声增强: 12dB (全亮)\n"
" · 麦克风增益: 21dB\n"
" · 监听音量: -14dB\n"
" · AI降噪: 开启\n"
" · EQ预设: 头文件默认值\n\n"
"是否继续?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
self.send_factory_reset()
def send_factory_reset(self):
"""发送恢复出厂默认命令0x84命令"""
if self.device_combo.currentData() is None:
log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level)
return
try:
device_info = self.device_combo.currentData()
h = hid.device()
h.open(device_info['vendor_id'], device_info['product_id'])
h.set_nonblocking(1)
# 构建0x84数据包
data = bytearray(63) # 63字节数据包
data[0] = 0x77 # 同步头1
data[1] = 0x84 # 命令码 (FACTORY_RESET)
# data[2..62] 保留保持为0
log_message(LOG_LEVEL_INFO, "正在发送恢复出厂默认命令...", self.log_level)
h.write([0x01] + list(data)) # 0x01是report_id
# 读取响应(设备重启前会先回复)
reply = h.get_input_report(0x1, 64)
if reply and len(reply) == 64:
if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x84:
status = reply[3]
if status == 0x00:
log_message(LOG_LEVEL_INFO, "恢复出厂默认成功,设备即将重启...", self.log_level)
QMessageBox.information(
self,
"恢复出厂默认",
"命令已发送设备将在500ms后重启。\n请稍候重新连接设备。"
)
else:
log_message(LOG_LEVEL_ERROR, f"恢复出厂默认失败 (状态码: 0x{status:02x})", self.log_level)
else:
log_message(LOG_LEVEL_ERROR, f"无效的0x84响应: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level)
else:
# 设备可能已开始重启,视为成功
log_message(LOG_LEVEL_INFO, "未收到响应,设备可能已开始重启", self.log_level)
QMessageBox.information(
self,
"恢复出厂默认",
"命令已发送,设备将重启。\n请稍候重新连接设备。"
)
h.close()
except Exception as e:
log_message(LOG_LEVEL_ERROR, f"恢复出厂默认时出错: {str(e)}", self.log_level)
def on_get_mode_count(self):
"""获取EQ模式总数发送0x91命令"""
if self.device_combo.currentData() is None:

View File

@@ -10,6 +10,7 @@
|--------|----------|------|------|------|
| 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益0=静音, 1-37=0dB~36dB, 1dB/步) |
| 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别0=静音, 1-37=0dB~36dB |
| 0x84 | FACTORY_RESET | 恢复出厂默认设置 | 主机→设备 | 删除Flash中所有已保存参数设备重启后自动恢复出厂默认值 |
| 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 |
| 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 |
| 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 |
@@ -98,6 +99,54 @@
- 编码器旋转导致增益变化时设备主动向主机上报当前增益最大上报37内部38时上报37
- HID SET_MIC_VOLUME0x82命令成功执行后设备也主动上报新增益
### 2.0c 0x84 - FACTORY_RESET (恢复出厂默认设置)
**功能**: 删除Flash中所有已保存的用户参数设备重启后自动恢复出厂默认值
**方向**: 主机→设备
**数据包格式**:
```
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x77 | 同步头1
1 | 1 | 0x84 | 命令码
2-62 | 61 | 0x00 | 保留字节
```
**出厂默认参数**:
| 参数 | 出厂默认值 | 说明 |
|------|-----------|------|
| AI7.1音效模式 | 3 (AI7.1开启) | 音效模式 0=无音效, 1=音乐, 2=游戏, 3=AI7.1 |
| 脚步增强 | 12dB (全亮, 状态2) | LED全亮, 扩展增益12dB |
| 麦克风音量 | 22 (21dB) | PGA寄存器值22 = 21dB |
| 监听音量 | 15 (-14dB) | DAC level 15 = 0dB - 14 = -14dB |
| EQ参数 | 头文件预设 | 删除所有用户EQ参数恢复固件内置预设 |
| AI降噪 | 开启 | 每次上电默认开启不保存到Flash |
**设备端处理**:
1. 删除Flash中保存的以下参数文件
- `game_mode`(音效模式)
- `mic_vol`(麦克风音量)
- `dac_vol`(监听音量)
- `footstep`(脚步增强状态)
- 所有EQ参数文件调用eq_flash_clear_all
2. 设置重启标志约500ms后设备自动重启
3. 重启后自动加载出厂默认参数
**响应数据包格式**:
```
字节位置 | 长度 | 内容 | 描述
---------|------|------|------
0 | 1 | 0x01 | Report ID
1 | 1 | 0x77 | 同步头1
2 | 1 | 0x84 | 同步头2
3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败)
4-62 | 59 | 0x00 | 保留字节
```
**注意**:
- 执行后设备将在约500ms后自动重启USB连接会短暂断开后重连
- 重启后所有参数将恢复为出厂默认值
- 此操作不可撤销
### 2.1 0x8A - SET_EQ_MODE (切换EQ模式)
**功能**: 切换当前EQ模式
**方向**: 主机→设备