From 6bbf4fbe9b383fbae699c202507578a41a340120 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Mon, 22 Jun 2026 16:21:58 +0800 Subject: [PATCH] sync fps with C3 --- .../src/extensions/audiohw.xc | 252 ++- .../src/extensions/br_wrapper.c | 55 - .../src/extensions/dfu_upgrade.c | 11 + .../src/extensions/dnr/libxmos_fps.a | Bin 656806 -> 966636 bytes .../app_usb_aud_fosi_c1/src/extensions/eq.c | 1219 +++++++++---- .../app_usb_aud_fosi_c1/src/extensions/eq.h | 33 +- .../src/extensions/eq_designer_new.py | 539 +++++- .../src/extensions/eq_flash_storage.c | 177 +- .../src/extensions/eq_flash_storage.h | 6 +- .../src/extensions/eq_hid_protocol.md | 441 +++-- .../src/extensions/eq_params_44100.h | 1513 +++++++++++++---- .../src/extensions/fps_api.h | 47 + .../src/extensions/fps_eq_flash.c | 173 ++ .../src/extensions/fps_eq_flash.h | 32 + .../src/extensions/fps_eq_sync.h | 22 + .../src/extensions/fps_tile_sync.c | 93 + .../src/extensions/fps_tile_sync.h | 16 + .../src/extensions/fps_wrapper.c | 281 ++- .../src/extensions/main.xc | 10 +- .../src/extensions/user_main.h | 54 +- .../src/extensions/user_uart.h | 46 +- .../src/extensions/user_uart.xc | 694 +++----- 22 files changed, 4152 insertions(+), 1562 deletions(-) create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_api.h create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.c create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.h create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_sync.h create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.c create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.h diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc index 2587dd5..f6610ae 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc @@ -21,13 +21,37 @@ #include "xua_hid_report.h" #include "nau88c21.h" #include "tile1_clk.h" +#include "dfu_upgrade.h" #if MQA_EN #include "MQA_XMOS.h" #endif extern "C" { #include "sw_pll.h" - #include "dfu_upgrade.h" + extern unsigned g_sync_t0_to_t1_cmd; + extern unsigned g_sync_t0_to_t1_data; + /* 改动原因:tile0/tile1 内存不共享,sync 第二数据字用于上电经 0x03 传递 FPS 三模块使能 */ + extern unsigned g_sync_t0_to_t1_data2; + extern unsigned g_fps_game_select; + extern unsigned g_fps_level_select; + extern unsigned g_fps_drc_enable; + extern unsigned g_fps_sub_enable; + extern unsigned g_fps_eq_enable; + extern unsigned g_fps_drc_mode; +#if XMOS_FPS_EN + #include "fps_eq_sync.h" + /* 改动原因:HID 0xBF/0xB5/0xBD/0xB7/0xB9经tile同步后调用FPS库接口,不在DSP任务内轮询 */ + void fps_apply_game_level_select(void); + void fps_apply_module_enable(void); + void fps_apply_drc_mode(void); + void fps_apply_eq_mode(void); + void fps_apply_eq_band_gain(unsigned band, int16_t gain); + void fps_eq_boot_publish_to_tile1(void); + void fps_drc_boot_sync_to_tile1(void); + void fps_boot_load_from_flash(void); + void sync_t0_promote_pending_to_tile1(void); +#endif + } #define TIMER_PERIOD 2000000 @@ -529,8 +553,52 @@ static void codec_init_on_i2c(client interface i2c_master_if i2c) void save_value(unsigned char * unsafe path, unsigned char value); unsigned char load_value(unsigned char * unsafe path); #define C1_MODE_INFO_PATH "c1_mode" + +#if XMOS_FPS_EN +/* 改动原因:将 g_sync_t0_to_t1_cmd 经 c_app_sync 发到 tile1;供定时器与上电 flush 复用 */ +static int tile0_send_one_sync_to_tile1(chanend c_app_sync) +{ + unsigned sync_cmd = 0; + + GET_SHARED_GLOBAL(sync_cmd, g_sync_t0_to_t1_cmd); + if (sync_cmd == 0) { + return 0; + } + + { + unsigned sync_data = 0; + unsigned sync_data2 = 0; + GET_SHARED_GLOBAL(sync_data, g_sync_t0_to_t1_data); + GET_SHARED_GLOBAL(sync_data2, g_sync_t0_to_t1_data2); + + c_app_sync <: (unsigned)(0x80 | sync_cmd); + c_app_sync <: sync_data; + c_app_sync <: sync_data2; + + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, 0); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data2, 0); + sync_t0_promote_pending_to_tile1(); + debug_printf("tile0: Sent sync 0x%02X to tile1, data=%u data2=%u\n", + sync_cmd, sync_data, sync_data2); + } + return 1; +} + +/* 改动原因:上电 fps_boot_load 会排队 0x03+0x0C+0x09+五包0x0B,须立即 drain 而非等 20ms 定时器 */ +static void tile0_flush_sync_queue_to_tile1(chanend c_app_sync) +{ + unsigned sync_cmd = 0; + + do { + while (tile0_send_one_sync_to_tile1(c_app_sync) != 0) {} + sync_t0_promote_pending_to_tile1(); + GET_SHARED_GLOBAL(sync_cmd, g_sync_t0_to_t1_cmd); + } while (sync_cmd != 0); +} +#endif + /* 改动原因:c_dfu 仅接收 FIRMWARE_UPGRADE_START,在此线程执行 handle_firmware_upgrade_start */ -void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, client interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_erase, streaming chanend c_dfu) +void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, client interface c1_led_ctrl_if i_c1_led_ctrl, streaming chanend c_dfu, chanend c_app_sync) { unsigned cmd; int value; @@ -683,6 +751,14 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli old_adc_vol = boot_effective_adc_vol; } +#if XMOS_FPS_EN + /* 改动原因:C1 无 UART/MCU,不经过 c_uart_sync;上电直接在 tile0 从 Flash 恢复 FPS 并 sync 到 tile1 */ + /* 改动原因:tile1 app_control_slave 有约 100ms 延时,此处再等 50ms 确保 c_sync 已进 select */ + delay_milliseconds(50); + fps_boot_load_from_flash(); + tile0_flush_sync_queue_to_tile1(c_app_sync); +#endif + while(1) { select @@ -1091,6 +1167,10 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli #if ((HID_CONTROLS == 1) && (EQ_EN == 1)) + // 改动原因:检测tile0到tile1的同步命令,如果有命令则通过channel发送到tile1 +#if XMOS_FPS_EN + (void)tile0_send_one_sync_to_tile1(c_app_sync); +#endif // 改动原因:检测增益模式变化请求,当g_request_gain_mode != -1且与当前模式不同时应用 { unsigned request_gain_mode, gain_mode; @@ -1187,7 +1267,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli g_last_mute_switch = current_mute; } - // 改动原因:规格DNR无指示灯,按键长按切换后通过HID 0xB5主动上报APP(与0xB4监听开关上报方式一致)。 + // 改动原因:规格DNR无指示灯,按键长按切换后通过HID主动上报APP + // 改动原因:XMOS_FPS_EN 时 0xB5 为 SET_FPS_MODULE_ENABLE,DNR 上报改用 0xC5 { unsigned current_dnr; GET_SHARED_GLOBAL(current_dnr, g_dnr_enable); @@ -1197,12 +1278,16 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli { unsigned char * unsafe reportPtr = g_hid_pass_data; reportPtr[0] = 0x77; +#if XMOS_FPS_EN + reportPtr[1] = 0xC5; // GET_DNR_ENABLE(FPS 构建下与 0xB5 区分) +#else reportPtr[1] = 0xB5; // GET_DNR_ENABLE +#endif reportPtr[2] = (unsigned char)current_dnr; for (int i = 3; i < 63; i++) reportPtr[i] = 0x00; hidSetChangePending(0x1); } - debug_printf("DNR enable changed: %d -> %d, HID 0xB5 report prepared\n", g_last_dnr_enable, current_dnr); + debug_printf("DNR enable changed: %d -> %d, HID report prepared\n", g_last_dnr_enable, current_dnr); } g_last_dnr_enable = current_dnr; } @@ -1570,6 +1655,11 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli } } +// 改动原因:用于tile0到tile1同步命令的共享变量 +unsigned g_sync_t0_to_t1_cmd = 0; // 0=无命令,0x01=SET_GAME_MODE +unsigned g_sync_t0_to_t1_data = 0; // 命令数据 +unsigned g_sync_t0_to_t1_data2 = 0; // 改动原因:sync 第二数据字,上电 0x03 携带 FPS 模块使能 + extern void SetKeyFlag(unsigned x); void flag_handler() { @@ -1588,14 +1678,14 @@ void flag_handler() } -void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_erase, streaming chanend c_dfu) +void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, streaming chanend c_dfu, chanend c_app_sync) { i2c_master_if i2c[1]; par { i2c_master(i2c, 1, p_scl, p_sda, 100); - AudioHwRemote2(c, i2c[0], i_c1_led_ctrl, c_erase, c_dfu); + AudioHwRemote2(c, i2c[0], i_c1_led_ctrl, c_dfu, c_app_sync); } } @@ -1985,7 +2075,7 @@ static inline void apply_c1_panel_leds(unsigned mode_led_color_idx, unsigned mic p_mode_led_blue <: (mode_blue ? 0 : 1); } -void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl) +void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_sync) { // 改动原因:tile1 先于 tile0 运行,上电先把硬件灯全灯且不调用 apply,避免用占位 mic/mode 组合误亮;shadow 置为全灯灯电平便于首包 set_* 时 apply 与端口一致。 unsigned led_shadow = 0xF; @@ -2022,6 +2112,154 @@ void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl) mic_mute_switch = (mute_state != 0) ? 1 : 0; apply_c1_panel_leds(mode_led_color_idx, mic_mute_switch, led_shadow); break; + // 改动原因:接收从tile0通过channel发送的同步命令(命令码 >= 0x80表示tile0到tile1的命令) + case c_sync :> unsigned sync_cmd: + if ((sync_cmd & 0x80) != 0) { + // 这是从tile0发送的命令 + unsigned sync_data1, sync_data2; + c_sync :> sync_data1; + c_sync :> sync_data2; + + unsigned actual_cmd = sync_cmd & 0x7F; // 去掉0x80标志 + + if (actual_cmd == 0x01) { // SYNC_CMD_T0_TO_T1_SET_GAME_MODE + debug_printf("tile1: Received SET_GAME_MODE command from tile0 via channel, game_mode=%d\n", sync_data1); + // 改动原因:调用UART 0x5A命令处理函数,将命令透传给MCU +#if EQ_EN + process_uart_set_game_mode((uint8_t)sync_data1); +#endif + } + else if (actual_cmd == 0x02) { // SYNC_CMD_T0_TO_T1_SET_UAC_MODE + debug_printf("tile1: Received SET_UAC_MODE command from tile0 via channel, uac_mode=%d\n", sync_data1); + // 改动原因:调用UART 0x51命令处理函数,将命令透传给MCU +#if EQ_EN + process_uart_set_uac_mode((uint8_t)sync_data1); +#endif + } + else if (actual_cmd == 0x03) { // SYNC_CMD_T0_TO_T1_SET_FPS_XMOS_GAME_SELECT + // 改动原因:sync_data1中同时打包了game和level,低8位为game,高8位为level + unsigned game_select = (sync_data1 & 0xFF); + unsigned level_select = ((sync_data1 >> 8) & 0xFF); + if (game_select > 2) { + game_select = 0; + } + // 改动原因:tile1 与 tile0/协议一致,level 有效 0-4;无效时回默认 2(与 0xBF 一致) + if (level_select > 4) { + level_select = 2; + } + debug_printf("tile1: Received SET_FPS_XMOS_GAME_SELECT command from tile0 via channel, game=%u level=%u\n", + game_select, level_select); + // 改动原因:更新全局变量后由fps_apply_game_level_select调用fps_xmos_xc_game_select,DSP任务内不再轮询 + SET_SHARED_GLOBAL(g_fps_game_select, game_select); + SET_SHARED_GLOBAL(g_fps_level_select, level_select); +#if XMOS_FPS_EN + fps_apply_game_level_select(); + /* 改动原因:tile0/tile1 内存不共享,上电使能经 sync data2(bit31) 下发后再 apply */ + if ((sync_data2 & (1u << 31)) != 0) { + unsigned drc_enable = (sync_data2 & 0xFF); + unsigned fps_sub_enable = ((sync_data2 >> 8) & 0xFF); + unsigned eq_enable = ((sync_data2 >> 16) & 0xFF); + if (drc_enable > 1) { drc_enable = 0; } + if (fps_sub_enable > 1) { fps_sub_enable = 1; } + if (eq_enable > 1) { eq_enable = 0; } + debug_printf("tile1: boot FPS module enable from sync drc=%u fps=%u eq=%u\n", + drc_enable, fps_sub_enable, eq_enable); + SET_SHARED_GLOBAL(g_fps_drc_enable, drc_enable); + SET_SHARED_GLOBAL(g_fps_sub_enable, fps_sub_enable); + SET_SHARED_GLOBAL(g_fps_eq_enable, eq_enable); + } + fps_apply_module_enable(); + /* 改动原因:fps_eq 由后续排队 sync 0x09+0x0B 应用,此处不读 tile1 默认 pack */ +#endif + } + else if (actual_cmd == 0x09) { // SYNC_CMD_T0_TO_T1_SET_FPS_EQ_MODE + unsigned mode = (sync_data1 & 0xFF); + if (mode >= 5) { + mode = 0; + } + debug_printf("tile1: SET_FPS_EQ_MODE %u\n", mode); + SET_SHARED_GLOBAL(g_fps_eq_mode, mode); + /* 改动原因:增益由紧随的 0x0B 包同步,末包 apply 时再 fps_apply_eq_mode */ + } + else if (actual_cmd == 0x0B) { // SYNC_CMD_T0_TO_T1_SET_FPS_EQ_PACK + unsigned pack_idx = (sync_data1 & 0xFF); + unsigned apply_eq = ((sync_data1 >> 8) & 0xFF); + int32_t pack_val = (int32_t)sync_data2; + + if (pack_idx < 5) { + debug_printf("tile1: SET_FPS_EQ_PACK idx=%u apply=%u\n", pack_idx, apply_eq); + switch (pack_idx) { + case 0: SET_SHARED_GLOBAL(g_fps_eq_pack0, pack_val); break; + case 1: SET_SHARED_GLOBAL(g_fps_eq_pack1, pack_val); break; + case 2: SET_SHARED_GLOBAL(g_fps_eq_pack2, pack_val); break; + case 3: SET_SHARED_GLOBAL(g_fps_eq_pack3, pack_val); break; + case 4: SET_SHARED_GLOBAL(g_fps_eq_pack4, pack_val); break; + default: break; + } +#if XMOS_FPS_EN + if (apply_eq != 0) { + fps_apply_eq_mode(); + } +#endif + } + } + else if (actual_cmd == 0x0A) { // SYNC_CMD_T0_TO_T1_SET_FPS_EQ_BAND_GAIN + unsigned band = (sync_data1 & 0xFF); + int16_t gain = (int16_t)((sync_data1 >> 8) & 0xFFFF); + debug_printf("tile1: SET_FPS_EQ_BAND band=%u gain=%d\n", band, (int)gain); +#if XMOS_FPS_EN + fps_apply_eq_band_gain(band, gain); +#endif + } + else if (actual_cmd == 0x08) { // SYNC_CMD_T0_TO_T1_SET_FPS_MODULE_ENABLE + unsigned drc_enable = (sync_data1 & 0xFF); + unsigned fps_sub_enable = ((sync_data1 >> 8) & 0xFF); + unsigned eq_enable = ((sync_data1 >> 16) & 0xFF); + /* 改动原因:sync 包无效字节时与上电默认一致:DRC/fps_eq 关,FPS 开 */ + if (drc_enable > 1) { drc_enable = 0; } + if (fps_sub_enable > 1) { fps_sub_enable = 1; } + if (eq_enable > 1) { eq_enable = 0; } + debug_printf("tile1: SET_FPS_MODULE_ENABLE drc=%u fps=%u eq=%u\n", + drc_enable, fps_sub_enable, eq_enable); + SET_SHARED_GLOBAL(g_fps_drc_enable, drc_enable); + SET_SHARED_GLOBAL(g_fps_sub_enable, fps_sub_enable); + SET_SHARED_GLOBAL(g_fps_eq_enable, eq_enable); +#if XMOS_FPS_EN + fps_apply_module_enable(); +#endif + } + else if (actual_cmd == 0x0C) { // SYNC_CMD_T0_TO_T1_SET_FPS_DRC_MODE + unsigned drc_mode = (sync_data1 & 0xFF); + /* 改动原因:mode仅0=low、1=high,无效时回默认0 */ + if (drc_mode > 1) { + drc_mode = 0; + } + debug_printf("tile1: SET_FPS_DRC_MODE mode=%u\n", drc_mode); + SET_SHARED_GLOBAL(g_fps_drc_mode, drc_mode); +#if XMOS_FPS_EN + fps_apply_drc_mode(); +#endif + } + else if (actual_cmd == 0x04) { // SYNC_CMD_T0_TO_T1_SET_INPUT_SOURCE + debug_printf("tile1: Received SET_INPUT_SOURCE command from tile0 via channel, input_source=%d\n", sync_data1); +#if EQ_EN + process_uart_set_input_source((uint8_t)sync_data1); +#endif + } + else if (actual_cmd == 0x05) { // SYNC_CMD_T0_TO_T1_SET_MUTE_SWITCH + debug_printf("tile1: Received SET_MUTE_SWITCH command from tile0 via channel, mute=%d\n", sync_data1); +#if EQ_EN + process_uart_set_mute_switch((uint8_t)sync_data1); +#endif + } + else if (actual_cmd == 0x07) { // SYNC_CMD_T0_TO_T1_SET_LISTEN_SWITCH + debug_printf("tile1: Received SET_LISTEN_SWITCH command from tile0 via channel, listen=%d\n", sync_data1); +#if EQ_EN + process_uart_set_listen_switch((uint8_t)sync_data1); +#endif + } + } + break; } } } diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c index e1d9b5f..e4444d4 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/br_wrapper.c @@ -100,59 +100,4 @@ void dsp_main (chanend_t c_data , chanend_t cc_br_eof) { #endif } -extern uint8_t opt_key_read(uint8_t key[], unsigned offset); extern unsigned dnr_init_flag; -void validate_algo(chanend_t c_validate) -{ -#if BR_ALGO - uint8_t uid[20] = {0}; - char hex_string[41] = {0}; - while (!dnr_init_flag) { - delay_milliseconds(1); - } - opt_key_read(uid, 2); - delay_milliseconds(10); - for (int i = 0; i < 20; i++) { - sprintf(hex_string + i * 2, "%02x", uid[i]); - } - hex_string[40] = '\0'; - flash_cmd_init(); - int res = br_validate(c_validate, hex_string); - flash_cmd_deinit(); - debug_printf("Validate status: %d\n", res); // check validate status -#endif -} - -extern void set_core_high_priority_on(void); -void br_dsp_proc_task(chanend_t c_validate, chanend_t cc_br_eof) -{ -#if BR_ALGO - set_core_high_priority_on(); - int channel_flag = 4; - int is_br_on = 1; - - int cnt = 0; - - br_init(c_validate); - int validate = br_get_validate_status(); - debug_printf("After Validate status: %d\n", validate); // check validate status - - - while (1) - { - int tmp; - int cur_pos; - chan_in_buf_word (cc_br_eof, &tmp, 1); - cur_pos = pos == 0 ? 1 : 0; - - if (channel_flag <= 2) { - is_br_on = 0; - } - else { - is_br_on = 1; - } - br_apply(dsp_br_input_buf[cur_pos], dsp_br_out_buf[cur_pos], is_br_on); - channel_flag = br_get_channel_flag(); - } -#endif -} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c index 127cb8e..fddb27e 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dfu_upgrade.c @@ -590,6 +590,17 @@ unsigned char handle_firmware_upgrade_erase(uint8_t data[], uint16_t len) return STATUS_SUCCESS; } +// 改动原因:HID 0xAE 设备重启;补全缺失的 handle_device_reboot,调用 eq.c 中已有的 device_reboot() 避免链接错误 +unsigned char handle_device_reboot(uint8_t data[], uint16_t len) +{ + (void)data; + (void)len; + debug_printf("Firmware upgrade DEVICE_REBOOT (0xAE)\n"); + device_reboot(); + while (1); + return STATUS_SUCCESS; +} + // 固件升级主处理函数 // 改动原因:处理所有HID固件升级命令,分发到相应的处理函数 // 参数: diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_fps.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_fps.a index 41563b44c12c371bd81b32118fdb77240b606aeb..fad91df73b4220273ce1c71845b2eb40b05e2e4d 100644 GIT binary patch literal 966636 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 z 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

I|1IVw&Fr7bj(ka08 zvPFRRlAZw`DBA^ikn9}b2H7LPgC!l{A+mRX50JqD9wr9`_+S|k;Nfy?fDe-s13W?| z1^7s54Dd*44)8H@W`IY@c>z97<_CDRTpr*P<>~;Bm74;L&*KJoqTCnY$?|Z3r^r(Q zo+irz+$gUGc)GkD;3koNEt6)qNWTe9{btUXIId+}zX{DPY3Vnyso(hK=6+cTb~DE{ zjhQ-q@(k%WyJcMCj2TTbbNcj}eiO_KG%y$gX3XrGDL_-v=FB24@Rn1Ws_;^cqXx(RBMz#@=lS{# zPkBHMhHN!8NscwmoH1ciGaIYLF?ewG7}nt{>+!X}d#(3+_FxRzjS;+Qb+!!}Pnhwty`=#(1CeCbZN?p&v%=H^yC#OxC&@!gEx^B$G87+Zw%$RY_Q)W(_nhMx{!}}L% zJv-+?vst#^@cIqZb^(c3cXYqu12#}U8?JZ@Sp@>fDMc_j_0`q!2B$>%SDh0>uMFlS zHrrX7?63q6kcJt)ssR4^Bh1)MUOWp|>6__Yx70wl>DU~xj%~MZ0WyaJf(5amC2`qx)#3nj4 z%r}%AtK_ldn1zF3xKqsD6mu7+egE9RXPbzEpRy-#e;54zV_4e+IWMGjT#K0tUoY&2i@tzU_ zI3PEGrn(B=09XzlJirBSKyc<(S5@UiPuCB|iWLj5?dhCc4{8(~xC(NCu`8=^_#8?) z=SJn?osC^O=b9W?1Y=4*88;Bau(=K8p=vC;hj2|{CX=UDnim-avzm*%y+P4hIy z@-Dj~tPW1d>S|ouH_%E^bD+ae;Eb%v-l{h|6S~Q8GR%TFCl^nd)tJ4RrgIjAS#6== zL`L~CGq6Zb%fKYeNv!-3L1tzx1IjRRp%n{&X&?$=ty{}uDP&`5*HiwQT3ypWXXT(< z2*!(!=|XKz)(15T4qk<&!1$F_YzlZksLk;hmxYwSp4R51WL6stCN^!6Q9l0zi)7~m zlbGi`{c3qW)$*#!;3cnxQa;IPYL~jObioT(L)EDPIeBbc@becghiaKRbvX$W)F?Q3 z-zK)60YgQ5oHk>uVR0-|0*c!)tE zgb*;0gd~t)gh;|e1(PaPt5^d?tJb#osM?mcR-Hbz#nuP4XwfoOr?z7|PHUZ5LG1`? zz2E=8ALs6Ua_%Kg`+YP0=I&p1&ib#l_IsUk_St8jb=P_i*M;3Kxt=uD;3brj)!)$w zuDqk-t2xK5khWLIVdUTi%x7c>qbT{NA{ zk`9?)%hzz)D!v!+)w6ZOO7CJ>*v$kzX{sh9l#&gZqY*r0j*745Jar1?Kbk#zNC~xW~MMm!twSlmWAD?a&`_*d$B0NlNKMt1$ExB2G7Yh>EQXbd|kkXPYJqM zdlQ(zi@%;m*cT696L7t^<{Cl9=V$~Eo}=Q{98c4zInSRdJo7Mk1pyNlnSnKUwAJEb zXsU}P2xsu7bboxXbMOxyO=n8Cr$Hx0GRyTVrD(rx2hKDF%LG`M3c6TF%$*M3z52!l zmvSX_8k1BhS^X2)B(*$8#W#4IBNWMhyxwu}0;VZ4gT&w!ai}nOW|{)R8N8{O!v?j( z^q+04D4nKL)a|lmmznCZDPnHHR0B|*FrN1j=JYSx$6}^B_hFyD*V)iZ zm2bjQpy=EZ12Rk)%T#s(9?|3?+0?}4reVGRy#pSgy)(ckbsA;P62FeukQ53&vkA%~ zQFYduSLggZj#_@6u?^0Qh|S5b=0ExP%2wIV6qrIl9TLWqpQnf1%$y3Q$cq7neu`cM z2BED7IxJ4g^g1wv#(Y2}@?r|lXbQ17n7kHFkFqhUp^0&|y2f0Bybh**%FJzB$m2vg3KL%eUSW==zv7dMVXsT#>vVCK_&;u`iX=YG3D=oV#B){h1_Mmnw@y zqu3k{O}=`CVBR4VaJoh=2awksH7UzC?-78z*^#y8E|cmRftk)BiN35%HFh-B*b#KJ z9f8tUFHoMou_N#tJDQ4VNpSq=`AAPKw)`H^I-h-YxjWsVv6JBdN(a8o}2dN5yIZj0S7vtUJvk-@IN3 z+tWn5vbuAnuCfZKs=Eycj&=0#fVViU7n<{}R|i2VPQ!flbn;3%p53&9o6}9r*B)NC^5x5eeDn4oY|kM5 zmAA%LzdwMw9^0_<%pESkX`HNSri1NM_E@^f#?@=0$u#LjF-X(bAG{jnTTh+|1M{Ba z@~yWBesQXCh5aRakn5IB(k8f>I2U#~9{KV;LVlPh3NGYfd)><}#U4jBC4{OTM|a^X z98S_5rn~JiMCZx33HjFRgn(j`TD5GR$vAZVqt;1{PFLobh{W9VoESKm=_>#iY^pBzJLhBVnP?}_8D4S<8PCABuEnh#d8Tr;b z23-NU%5COB)=LJzIMo<>c_bY}MrGRt!` zg2&BK@zq`41?8)Td~8pWbDT)P97kqhjhlYi098G1zB$fRn1b*6X=mXy8AdPPHso8c z8|*GT))+b&Cmln-maiY=9LIX!peuk2cw&BIy>Rf0od)?D?&Xp6+;cR7$Iwyn)m_eK z4^U5I-FrSfG*kh=kC84UvP_0y%XUPaxFM^t4#>030oFZ?<)>{X=k4&0mR&3WT z(>MlD^zIezl(uH(^H4BdH5qyP^tzA?13aGH$sP`-P}w_ZNjeRQlbbTUqQ9{RO>{UC3` z*4qbEK(9fYD`}C_B1`Br#%i>!5@dfqdH1pNDY!M3v(9|^{vqGIfQWMTg6=eLAb>eM z`Q{Y_urs~X1z6*%-$Cev#lB!NX$L-E3{c%Hs~2f<94!aLCm zvAfNN?wXlfIj57^BzXg|-a;e>ted@1J@FbMP*Hb2HJux#uM!-_#QZnkyoivq`h2{J zz+PCqagcYjXn`Dy0=dwSCwO4}>M_yX1#BzF2Z_UI0Zc* z`@2BD5MowNUPW?pq{{FzlOy6~G8NBYIup6pDwXByWTO(zldo2lKrNA@Ai0d_sc=P9 z=VG=a7gWpjMo*={*a-w)E^@gep(1TrHJ$etMcHN(4a;eR6kv5itH{S{FP8{z=|MI(WB_FC}_IR+;xyYvkFKuC>*Y(2yl3@mKXH~EnX{Km7>hMJ`$P}Plf+YrIBx<9BW8KWoV4!Ey+FPY zE0C|j3gjEE0{K>{Kwdct@WzN|oILOFCZf9fvWCm*TCS*$_^uYTJ9%L?rFfTPB$qn` z3*_sI0{QBK>z(A&a0>8Yg+HZtttgOfDUcVn0(rg^$kU`iz9}d$ZwTx{6BmyHT<@B&Fkte<;>9i$f{*STlJL<>(^Dctb>TT zVBI=Jigg>>0+JLQBS|%8OKnXp%}ovKWf9?H>9;mEtx~m#q*C3~(6qWy=|xlNt!%1o zl?4|j(^4HmrZ5H*kGOp=WvnXHXI?OnGq2 z_0E< znq86v=p!tP_|=mRuvGVt0PdHmayKJ@Ww#`1a_PhE{iK5`AF;btIQigmBc{K?xO*q5 ziOk(p7^`GS)Z~+7pb6mqf6O#~6Ts{tRhmE(!1~uQ()h*{(~%?zFs6}iCV-WuRO;P& zH0jvN+`S$R99Hkqr~9=W%S8dz&wv zkJ+4GNk9Cm@29(W09IU5qzLYT?n7r4(*5EvrTf_V^b>v2ef%s{t24R}o26%Z1FI-W z+Lr9rju~x=6oI{g<&M-zeCG+K%E!?6dIL`pDO3}^fk}1>J+C*C4%^BNt5!9vpR~Gp z-O6OsVmPi=~Yu1>$V%K1;yVKb5-wT*op*Ds|HyJU1j!3!Wul9V3Z8D&2jS zfMt$U>i$aO*(H^_SLvif8azwDlTVUtlg|>cJaNo4{#yhVDpI8hw0t~^9V3m;^s%Oq zBmqXC+bkiB#gA0#z7YsxZ6uYt9)U1cNs_2_n_n%DmB zqo%#A9P3WtsNqf!#zKX^Jj-DVx+eKu#nqFUbsuf5#QSwmGShl8Grc&CWshoqv*aR7 zLLk)xZGx*LoH?Z|+nRYmPi7WqFU;(i4bhp|4T(D5SdhQxG^e@&OE*mot<~^*v%ZZ> zhGDt*(_I0+YLu9(LSeaMGAvhx!g5hHj1?a6wZ8x^REFhBDtCF2=IT{geT*(Qk%hxt zCJW0=4`I3Ts8;L3SP&pTBLB;@a-lCQ7lp%el{74uPQ&t*Ls%|$hvm9dST2x;@hFKL zu*-x0Ww~-YMOdzlhUFKO*w{iT9-sK1tAt^>KpK`W?Za|mG>iuf@@0GFdSqC>8V<{s zzG1ll8kP&YVa%+dDHlS+@&#mAu6>3vZzZ2AXkqz*Ll_fE&~n)`EMIel<-%uJF87Az zT4xyVov0(z$~Dihe613e%ba2PG9@fup@ijfXIQSzhvf=q7BwocaAGz8Xk*kdnX>bv_+8B{`6_Iuok#-f4 zb`_C!6_Hy>Bhs!S(yk)Xt|HQ|BGRrR(yk)Xt|HQ|xTcE|rCmj&T}9+}w}`Z>h_tJS zw5y1;tBAC#h_tJSv@7mrLk`leBGRrR(yk)Xt|HQ|BGRrR(yk)Xt|HQ|BGRrR(yk)X zt|HQ|BGRrR(yk)Xt|HQ|BGRtZ3xkNXtBAC#h_tJSw5y1;tBAC#h_tJSw5y1;tBAC# zh_tJSw5y1;tBAC#h_tJSw5y1;tBAC#h_tJSw5y1;tBAC#h_tJSw5y1;tBAC#h_tJy zw5zDJE4-9JFGZzYMWtOurCmj(T}7o`MWtOurCmj(T}7o`MWtOurCmj(UGd9Wy?BUTR$lZ8{T9AF0fdMR4%YtiBvAIT8UIHwA=L! z&9%0}I%2Wvs=Teat*sOI*UZ0`+`4J4t>e_Oxp~|;rIKJnsClc}Cg88N*;7&J5(+wz zE!VUzu@xDN6RoYHwOO>F8sqpMg$leWsm;Zg5v&TSLQO;zXVq2E+M1iFl&bTFrg8AY zciFnuwd>ljvfi+{1@C5Bueb~=?Krlr=dr$_Ze4xD`us_Clh&P43u9J~y zP7c11%d`F$7Dj-kPAQn0!%#D@eOBr0j12tfh7K9x=OTfGFh6S;5joJv#V?818r5SS znGa)Mt+{Q8n}jlkeu$*Agvh}`1nKd2Q$mRS5i=7%Wdf84CciOY^+azR^h_G&!g86; z1S4Y~7@D%}N!p>))$pfCsBh~Lvkg{&UY@5nLJO#8mj&qMx7#W=Resdl(}Vm<>6q2h zOIAPXnV&;QRli+5%#V7n>PDu@uLTBSLaO#s?`5kUI%|{E>%Y0f4NLWLvi4H%dp*cc zm_dVXs`^o{C;d0Khxt*@{MK=*{;SIFS$nBxicXbZOAqs-UQg_A)JV5}{&6c4B8R`X zWa|<8`nsk}4E6NPm{O0l!5}@o9F%MLsr1J7P%pQKdJ}r6mv;<3{1nzuTmzjz?C-ys zVyLHQ+Dkn{>kMkrdg`aR)BTdRm;X2ChZyR!HF-`3oxeseriH}z90gFGzecZvlPQE_ z>7~jqhF@gkoGpUukSUAUUq7Qay@z@wJ=81hpV0BX0RPl5jW#srsna$-+;cA0v)Jl0_k|D zqg@;l3-IH&h#d>!p}m{pq3!K`k9NI38L{Le#LgQl7Iel#(5sAxGRxJmmpp<#SOZzF zL$Ng-YvQ5!;q&o-_I2dPLo=(|j=c5Vc&J$8;;P=j`;YwjyZaESgL0e4>_y)1#2Qh4 z+wLbicknnAd6xaP>-y|FNABpggJs7y#zQx*Kz-guz1~Ls-j0X%qplt8+wi|P>KYGS zvp61ldPS_M&vN8ZJK)2v>rqC{!Vh@tK>PM0iiJ3qL3cUQyuEET>MYy5vwhZwUGJ|& zoP##UL!A{JO_}8fn)ab4y~}6ZGpjrvy0)tS(0FL>jsfK*ohR&Ql=Tvoog)TRbwNwD zr=zmzgRWC^k9>Gm(UG0~&i&v(U+~dyS@U-t?fU%nGae{8Ew--{_1QxH9S>Ynx*mBB zI@0y|Yd`850$$q#M+atp_v5bf&&iI5LPxsJ|KhMN=nJ&+>BZZT$Mhq=?N`+KO!*rq z^P{7`?sxw9cqp2+ui}s6;-TqByN1L=b5?A_@r#I$9vLWZ@9bCps}DZx7Z3HXDlU-q z+;aW6FOU1m-SN=KSUePo9k`$4(9!hiD)dd;T|4^W$nuC|8!3B#e@7E}+rAwSwLC;R z*36!P{s!=yQLiDNDv^1&DSoUu9(qRR7Z3HT+IQsBLoWI2bAzFK@IVvwVm0wl#Wf?) zcBUUIZ9qsHfDJWDn}8kkMj5>@j^lPJJLveh>&rh6%QRc!p>0(II%iew`l##6mp)8h z2Y8(;Fn(`i9N)%x!bV<1J8o?61N)eS*zW_5?F|+2PzJ{HxD~LW6{t(CK%II^dx_PK zkVj)Ld&_7`WsvtfRKxn!)L`77ZH$L*I@)!9<&M0aKLd@P-xm3(>-uwVKX2#Aovh2= zHpH6gN4h3&&B7T48~px`86%oL?D}%&1MyH%!5)n1-mCW_ZNEdWtwA5uqE1!E9f8f? zJ|41I+fPBCduK144|`$zH>^P2-$onWMqALXXVI=s$7UNlOFCQ7UqcRw#(l6G_HjA- zx6dK5=3w@dox67IMqc9JK*$dc-3BE45jdyuN$B-H)Y14V(o+Yq2I(u&Uc|kXy->#w z|H?c&YCp{GKyMUZGxd<(;#At9bsXw#F)N{iy5I5l7xR zYs8Vy^#c#*>*e!~$GMS%^YXOVetEt=3c5eiH{(d1J06%Zuh&qHeZTVKk4(<|@kd?f zhk;)~-{5;Af9JZIeW8}{9up!!d-;}og*%fH_+i3sW=m*$@ z>RXh#0A(Wn<6X~1M?8+(68^{AB~7e&qC?-f%4y|uWbtL4Usn9N zmQEFEoo5T^;miP`4bkL(1L)zC$Q5EY;_xsjA-WKUPnM*dWc4{q(QJm%8EVldkY;5O zMuF~ghN8!kpRedVi(f>(E^E5QpG$s$(qCZlD=mFKS7Z;zKZF(>OdoCm-G>YG2seNp z9#!-%i++goM8$uSG&>t%59pBt@DE`x>4A#Q0nU7wT>j!T=tm_f-*IGqN6~UDzNctR z*F@$I6dfb|BSn{zenQdg|Ka+#0ymSdb#5nrp3bAModepG8v&iI7lEbCXu6X8Y^5)4h8ZB#Aey$+lh*C!xsa*b%Q|E} ziGK*&5KUX|1D*W}xk8+PnEA9MMGonGiq0kdtfFP#?pHL;DD!zmv(A|Z6kTNTOF(D8 ztoU=u*E*G?b)L4SAdKYQ_L*QZLP*rE*jA8t*LPnvXz@K8#r50`dHeANV7XK=X<{;>hahoF8 zKm1u@mRvdi;zf)TBLx$S@TuICyuyj|Yp<9X&YOs@Vk0?q&9!S+=WN7pdNr+En-iW? zI0>&Qb63{3Hq_^UQCeCtUvXPEuH|Jw_C1b#?vi;g3QL~hlUFvYV#W+Gs6)O9PiS5r z!@w~EfO>r`-VDvNpFR7aF}$a7ys6LdDi5(L*SC}Uuq$zw1)mOBdg6v|T0E9ZUXI0Mx#W$pcr5pH;L{K(V_>=DF&N$~&_#$-5vL`$zvv{l@d5bI_ z%O$Ve;<4Nc;KhiPF|b_n7z~f?S&Fy}u^N%#Iz-}25LX~FkVjmFxEzrohR8HS5lvt_ zmH;qM6PUIJu@-S9B0~(3G^*(ZwwGyZJdP^24!9n%LGxo4tyyy1n3lRGu-sLMs}UPD zGiK46CC80vscQoJZw){bB4rHhKk^t1kL|q__%g{=|JV-l)>=G{8+q$29>A_Ln?>_4|C_m9yA@R;5NrtLuFx%DYTh8QAgRLKi$ z8`E}p998Z$z%vl9)%=)6YnB`%rlqb4EO#4X2_k8R7^0zx8Q51$OI;J#SJwl48j&&v z_7!;yhQ~3w0r*DARsYxy@@}$t93%3!TRfIa-pv+|<=z7PSwzYhST1=ChBpiJ=Mis5 zyaSQpIz(dsy@GQ8y<#VLOm70~Ox~S_fg|fo-WMz$>rCEV7LRrQ67UxhDPv%r$zw1) z>b(m58^m8zfY8w&a~d2`ybO5wj*~YyfHyjTcXj}e^9O%^l>xlw0N%y`-e&@Mp9|oj z$zHi2W!uIE@Xie2!Uxv8^H6| zkJko&{dR-*g0GBw0(kdpf%gX=?_u!# zia=#bA`vG|VGJXW!TfTCi0PlSt?@93bS~q3d!PDUR>$fj}_bhn+`t1+k zJrAD0Uk-rhuk(xG`N#5L0PiL6{A2ktcq4r6cm=%477x$~=US+@I2@-9n~;SwYpDV9 z*w3495)Os_l{n%yB?Iv;P4htfEgxpzB*Fl}b3YLd$NMD!s8NFFd?JkY?t{EvWr)#o z-N4AR#6WSx0C^lB*BD|RZ=mRn%JRHYVW8lWPomBP#Yv_yP+9i)jyy-);>dHv?Up$Ab)*T4}AzYbhw;kSUfUaG=i@t?pP zQ-kBccUibUCTCm=HS&?bdo4VclQ$jM|FbPjd%4iUw6A&}zS6?fZ?`b>`;vpP_Gw}2 zf8WB?f5pK<9I`O=|6*b4hm3KdZmeIPg{dEP@DMTG!H46V|C^A792Qwvh#{g9xZEf} zUIScj;YQ##3vUGOwD2}y-j`GuDz*bZY9R8v6PWi86^4p?fCqZ$aC|SY87{W>*T5za zzwg7@nBOPDFfq!(hvQ=`oP|}DLJJEqOq^q3=3ixD_GhgRud*=vf2$97`tZ*z%>16W zFw5(5FxHX!CR#)Nvn)*g*$zhe7N-6+7N-8a4#xA0g{l8L2M-r-IQVeSTX&5*FXvB38D#Vmcwm;3M*3v2DB^hvOrB z_(Tg+zsSPWKi9&tzbs7oN()oI&BBy_#=#-c>EOfhTP>W0Rn_|~%$3)#TbTLp1GdNW z_dfYwefT8I-4fwMF~-4%<7YbfG;y}ZYCKO95lfzh)!exj=8Erp;FwpyNn$bZ4HjMw zyvxGPR(iH)yM@_bJAC*yV7tAKSaPO+!G{l9n5)f49E|I=R~Hhei@$0)+dE8*#d|ti zVXQb=V&1UVyYuQQ_OSZXNrq8#%&S#pC#5h^0P#%BhM9|bL6?=c8yi}&VB8UpVr!#p{mzZ1E>YK0$os$R~&lE=nM%`cD+6YOJ^u#aKr^Nz8QQ zlf+z&RsAQ68b>}^G&u4+vDuO5iLH)2U)eUUKA9#Gf4b6!B+A zUL^W)LBI<|VvxqFepAI6j(n;Z@5rZ#a~%0J5wkGw-}8NVoL3f!KH^GCPJF9_56ABW zPFw=}h({cGfAKvB4-}6(c#!ysg9nRe96VI)cW{e(m5B#A^;dN&LHm zM~gQde2RG6!KaG%9GoMLI(Uru*ukfXOfH0aVXWxy;4{SW4n9+4IruCQa&WE~<=}B* zjDyFEGaY=kINQM!M4p2uil~DpiD?d=EMgAM6SEzhFG?L;Aj%vZ7L^W;h!qZoI~E5Q ziZu?NB3c|=BsMyDs@US-Y2q3OPZu{h_+0T>2cIW)Irw~Wr-Nf+w}WSh`yE^?_BeQ^ zc-X-u;(HFBC4S`K+2TnD&k@gBnCIh5KKz;wzv;t&@!^jw%ri67T5IBy#y|%T62lxk zSe)SCq2g2rXNfZ%JVH!#@JJDH@Co7^2cIOwq_&35@Xk`#GHLy~`r5YINp-Dl@HJB3 zGHGRN>m-kY-ul`W_}^T$4&Oqz)i$qN*J6G2Eb8mlt=*VkEghX{Z|?Ac<6}B5gS!bm zhrvM-?GQLfWO)mR^BVdhp;r(3ZGcN~dTX~6B^-m({RMsnT|3uze_w{bhZvB`sXv@& z*bWICndh9q;llAjV6K4;w>%mLwB3@r&1ci$IZ1WA^i=Hq&J$cEbz?jA3lRIOX60!8 zltYq)2}jHr7mf#gKhQ%Ce{4;8(dTGM#Cl7w84|%^l~dKks7aq1#l_|~Wy1RBd&Amu zepoxs4{KNL&|}Ur0X^tQf=)OjL4O#MV5N-vY~_5!L-b%5R2Qe`Q1`Ioj>wUE4lEol z(!d{5VAfu*Z)~V*t8UFNtgc_zmiToFr1T6)4~S(C+FJZcJ&)RStd+D>Gi3hMmXS%n zB^XeiKZ(<%zM-Y9(fo?EbZ1gr4ELt8gClZ~Opnt4MWVOW?-Nj$qhfRlr3({sy~-vE zaC%WU#gclR7btSiC0{brdil%8G#C2uQhlW~6LttMEkP2eZb(n7hZC11UelE;btjE1 zXH!#aLp93{Zw^;ChBxKsRd1|qZmO52&~#Zr-MZ%L#!YojLX_i~lT+D*-F%|Fy>3Lt zp0#z$*mNgHzo)fE&Ym&ColRgjvUD>VpSap4A!<&aQLt6o7QE%?qU1T_{qzs~=XB>g zT^k_wdM8+By2U!rlKo<#^lc>_Xz^sh)sMgK@W9-^a9r#|MI;r<*znCCUT1_kSS?S_tL6}mr7e)jmngfn&@owGw*ls>y*f;n|E3|k5|@$ zN_2DO4L?w}RC`c_zcJ1ArU~6VE5mD)s{`MF-IU-|%2je)L&DjVD>dFA;eW~%cn%=x zx!tn;{AyieI%rpXb!C&j#a&PFaAD=B1lHHCSnS=vw3;zHjebLu5#6vh@j4cw=Y-8 z={bET&H=qcUFJJA_d*%Ku^ z5B2;uh%WS=sJc6>lr9*%%eB8s=|WF>(31}Ir2jm5v6tTSr1L!KJ5RdKlb-XW<2>m% zPrA*MUh|~WJn1t}y3CW)GU+f+`pc8<@}##s=`2tB%9F10q^CUTC=Y(E(29KNC@)_+ z%FCCI^75slynN{>FJC&!%a@Mw@};A^eCa4JUpmUmm$P$R9GQ=Fln19-lI9&dUpmUm zmlMv!FVurC9p&+d7fH#KgovigJ;BfUzQ4Od2%)=T#bjpKio9i+XfabueQJ{ZGvjr_DXHT4Bm+MAl1 zH`Tx>L&IMPE7dG;4*^pHc|36>r`t80^0q#9G9a zhzv1A(*AK{+8RU?n6?hF9V%i2=>+0i2idc?M+R6eSD)a794qv;1|g^ zSv;QmmPXxhBpiJ=MgzayaSPeV?@k#?rcPc7$W6d z^EQF!(M|xSH-U8~?@q(Ok##2T3l@)cChsnb$2xxr_=|{?F|f|$F&G~8UIqRQ;;$({ z=;-ghS4(?SOY}?Ho0<^cMR&k7y+C{UegN->0la4dcs~o^{XBs8TmbJE0lc&~HRXlV z@0~5}O-*^d@p~{!ds9>1Rs0^-(%#fKUrl>cOM6qZpG(u;)Y9J6(%#fC?UI2T@zdVa zbZ6i|??GvAYHoj|y{W1G;4@POR#DU5)DrzMOr*W3rM;=8y{RRxm}zfnX>V!?Yv9|d zv^O=oKhoaR{x^72!$;4`*FZs#H#Ljt_zscY32dS3|HLP;{nPkFuKyGHfj>U8=STMN ze&Tsk(}@z^PkQ7{%}wRhAO1-GtKQUnxdt}e@`Mu5c1!9upB@IZpNWEMgM8`#>( zgu`}Pq({U`WqD$vF9|oP&x1=hp<6MI$0zls=4F`}wf{D6YW})7JqNE2e}gx*ZdrQ< zVf*Sxj0H;5K1PC4YHRT))oi5on@5l>`BPhC8RSi^pjx?p(XNmF{@&E=0-T=LHk&9u z(M^FO_gwNNb36{&-qcL-2|G02)O-@BZny~1>i=JRQ}b8Jv!+kt>?P5SXn<#Js=q9Q zG2QtI+{iFz&lrt2wV*ni(fGvGHVIMl0B>sgoayFG&EY%aXkQmCr)cZeH?*4jp7z^A z`?uPcBw?a{aBP*_o0?algw_2$ys7!Kb(#t%X|^}DZn~Z=CA_Hx>3HL7yr~5#S=W>x zZ))-;>5Y={re<-SitDbHo{-EaSkA}nWC{BVOyrDCa&Kxn$Hdt5(3_f@&S`_so0?D4 z>w3G^0jHw6QOl07q*iD9ys61zl6q6qQlE1v<4sLVwR0)sO-&Cr-MDshuw}fdc{)K3 zwv0D5PswqxWxT0*QsZFDcvJHPo`WspP0f=S*Jaw1m%01|RM>b^Gb(}g^=_%^0_j%Q zn|CRpS6l7e%Vcb-q`i6>cAz&kSI8-!_V#52G=gBKXaO2buf3@iz=>xPZ)&!PDYQ2= z-K8nLsd+jKChB^Q`1tP!5eRCTAKEz zMt_WHZ)$08YINad{r!EtsfE+t)YNL)7#y&1j~-Og-qg?!*a&L}&wCfWq?te+d*>sd z=M60FP0jR@JbL{nw?1o8s{TuRQw#3DQ6m$4_MhKQ%S76nS}*hq&r9pvOnXy9f8g3~ z_X$wiYZyBr-7o(Lc98a_miDH`vsHyHxDWD+sTxFl@Feep#D1?~H$ZPJ_%(=}-|~JL zq_+oposiWa4n$0*H$9Z_R>pji>1~4^e-oMc@#n6R>2;le-#&)C29Z<51#|i)p}`fYUl_ZdXGxjOEGxK`Z?`QO?6n>n_AkNTH2dh+M8P1n_AkNnmCm9 zrk3`m29E_0A6Z)&O^N^!`1LeXh&YN{V{*(c8` zdIIVFiq0ebyrLtd4=B3G;+KHVep&JPyk~SON$Wg$o({i4>1-ii=YJpQ?BVKMevtfq zO6O4=`fzX%_970yl9UikX6QFa^Q1@k2yyr(Ns8BT7&%zwd4%*3MfV1s`J&S4Px_#u z2a$eB(I;5^9MW1pm$cTI06OhWE$vMWW*`GS-^x_42$RUq5W&%Cr zkcTA|FVOSN$v{{>kunPCA%{E$>NBuhEG4A9sj)8*xt78ZLo_ro1N(kFjxhoquETLA zVhQ3b&5K#IW~IHUp(AK(OK@CjIt54eUkzd{;z~q@7$RwP#RY-DbAf4V2y|fDI>dU! z2F;6Ev}UEfsi7m-S7~o*LR_zng5H7{Xp=YKc%ww>A8n1in=BsBee$+jJYILnyV>IL zx|{Zl+M62fkB_c?&uM(*_4D{xd(dZBFM~Hiucd*M_WTNtlPw(IE(DLqY(YXawEi%-f8%VZ|04}yL|F*`S5-V3o$_a(!q!0{Tw_>{K~?_)YRFc z<`ZdeY9|j&^hes8+C-7|rk3`mX6~n)X%5maa(KNMhToz&!@Ss$N>jynM?OuQ5(@zH!ol9u9JbRUJtE1y zskupgUTL}s-HQEJys3FvCPwYQ&6}FPE>6$=ZQj(nW$hV6H>YOOgHytrT2M-DE&imQ zgCpZjEhw!wWd78i0A*_rRXl(4wMUrn|7~w-b^%V$YnxS$Y69FSISIR2tS_14NXho5 zW^zf`q4B2XlQ?zzZ}O(*uaaj?vbCFjkV29_0_HUh1E@$ z70{bbP;;mYtQ69akUe}801Y&+r8(ft3bOia`?_T+SkQEZ)$GR zZdT@VwdOT!QfW$WYF@4htNVL+Q}bu*G}Y%#t(&fAO9^jkK|0>W#&}Z;QnLCX$eWtH zNqVDXys24Sr{am(M3ND5{Hz(X^=1=RqJ;Hebdq~h(-ldKO%J`Px#^rX_`Iq4G`+63 zo2rZVd+-ZL>NJbKkRsYgqSQ_5O-)OE&ZUeuH7)gdQ`3W;(wmy66XamacvJI~90yy* zo0=yz4z`RpHBaC<*fQSKJc)5#roE||%TEe#YDOinzS^6b(Q&J*oqHLfS6kn`(^Sd3 z9I2aApf@#>m)Ah!P0a|Bds7S0pl>woO)Z?V$2Z)##}{iL)v zwg0Q$)FM6grZ%-GlAj|(&A|3qrL!|K%pMf(3i-LWBZUi75xqJU5jmi8v1VJOImbRQ zS4MiyU>JoRI(9In@+Bi_d`*x;d5|7gj6;ZAt<5}!m$Wg^F?oZO`6X6)6Ec3)V(X1f zQa|Q_;Ca!q^_ZS@vx4V^jCv!qfO>XWfL?w@R=KJ2qu!n#I0`&;@YhCO%K1TS94xS8t#v41>_URMwG z-s_>>M?KW*jkiWUsUP2_^+az(5A{YR(W}4(+_uHB&_h$i6h!jbf5fYNdU?{t*F?cEd)ZEx>;wCnxJh$SB(cHUUApfetVUS&L# zS+0(~(of8@{K-G@jW zl-oRJFYlj0Cskw~T8H>hMV@Sb zM~!HVhvqfR?bzKU%e+1V{FMdln~p6f)z2*NeW;^xl&_7asxl6BqF>lg9hFTV zbe)=edBLn;H+tIiD(;vJG{eD%~Mr1x)ev*4i?&WvK zL!U2+haQa`xS!*T{@ysMvu_pZunBPkd8_xSa`!$I57i)&cLVwe^@m(EquxVe#ZsqD z@ng;L(5I0{M;q!>LlwHjl;e;iFxX&%<%!uyZ>e`?%}N zk00&2p7JZD4eZ_W)g3cOEEygTefY?Ook+63a5Qhx1h_&MZj z{aj0D0_f~d;~zo^qM^$zx{>tt_=nJp_=&xK@Doae6A&}?g*u1y3j9Nm^{J7hV0|)I zDmssJy`m$eS1EcdX`N3D^l&CZSb&&)gCs=@4#OuYx)TSJ&t0Ii*&u}7h$hcRN!Q>X z!al^|Qza?A9+>*PMt*_fe?(ee&`WS}9v)WwO3;1IQgjvhy!j*4TQofa4rhZ9nyJs5 z8$uiTQAKxH{2R#E`E0lNx07F}^mkkQ2QB@_KxcnO={yPA^!Wkmk5l|tsXtB8Z&-AH z+{A|GD}F9%4hX^m(&s6yDQ(adw? zwTf;by-m>_q_0yn|7YNyYeL3ELxDfpqR+8tRz!!4^9=?485Uiv=-xP7fQT*-mGduN z#5gfhFtMnhAUq|naN_*hD<+2XCKlusL~`ny(_R=bU)VJ7NXf=GK|potRCLY#}pKpydI#5srzF+`?$2hjw6P0cS6 znWqU%I}hYBiD<9%ZhBJ0FJ?-}GV7#{U_8{>6h4Fw1t{c&x=5zUbSH|aQe+?eL)_4JEq z6z!#Drp#|_0PoBIUTy$yNdS*u)|vW&lx18Jz~dKpe!c1dUTpxcE`Zk%z+3I(@k>Np zK1Fk1{L_Ivo^MzAc%#6(*~jB}{lLfL6ykXwk5dmnk5iBre0o*j9rW=y1@QA~!26X? zZ)E_l9=zZ9^j3lQZ$4flcyC%fKqu&1uH^CS$(SY0!jqVXmA!?O^}clS9O_j(n(iUSrx*25RstOP+^Zzq&%;OCZ{|WjA z3x5oHmxTwJ#(>BApKW0QJlVoSp)<#ams^Hs>14>jE|^#2Gv(bRZ7-@MH^fMqTLO!|`bj9wyGySdGUpF~^Z- ziBd-Fc^1yr^%iD*HUURW10Zh)PE2!-7dHd*+)&|oaVs#dwFch{ zyxBmc|2lA|g&zU-It=n30&~u)!tvrsrnm5Oz}qbR67U`i|10qKEc^yA=cOjU!@!9# zJzjhOe8`e#;>N&vqtPD*oMYirfr~7h3mmg>J}~E(CjI%ql@^{0%sHo#R{(cdxE|O9 z+Dp5IY2Vv?_%jyf`Ei#I|C0~@+``Q7fQ4D!8x9uYV+&J1(-=F-qW&lc3lX+3^@}V_ z{Y4Ijtyq})mpgc{*z91OKc;i!afH~a`C$VZBY9r;M{T}K`g&p7gs z*sn2%Xc(RaPSG@B?q4Jb#RXO*ui5&rZZPKP4sv0>Ed_?j}=)CK0|~o%<(AD$!+N~DSG#{A{3-xC@+ZCZuRbPt&JH-a zwat>bd){1uy@$`0SQ`tmg)i9$0V+*m|6Y&22XGQORsS142XHeDYIBlpe%%u~yZo$g z0V1aV_1-9jod)Q>575!s3RM_;WJT|XKGGf9v4aU#zrTJHUfVd%|;^6#w@e-&PjhV zPk@B%Kb*1bA^ae_busYm)x$tpLf=+Bvol|v9D1i7e%9Qx?{3=^@pI=|7_>hTHlU@> z#>B+PnH`Ddm%$^|-d05HKi6qZJ&J_g0c@|ifL1rGZCl^e&{~b5T;E2U!Orv`dBfUz zN~KwaX=HL&xcL=qxiK66RzRc#aS*V;Tz!Is?C)^QW$f6Zxaoq)fV+`4H{a*tAz{N{09 zazHDCHqqKFT3ZD&L z+Gf%=9Q?eT84NM4cLtd{f1cdJFM=QT5LOLpXg52LxMZ%It`WD@gW)KBYS z)isBLAU)1-IXh<-cxd2cq+2lgje*3_RAPR1(MC4Gr?<^k^2q?b-DS2O^KvHbQZG-I zPrVV4Gf>ZzD;ZXPw_D|=%8z<`bmCO`m0)GegjD%aZ*C9r+upk<3f;_X7Co*4t`kv15lr=$dy*gb#ueu?3-!3U)27&mju5&Or(=#}(Pue67HY-kJ61{9(aP7Wqh93R| zU+j|4_7b1r)7uQ@Sn#Q5uE{}qcY)cd^>}GWmfr+C!14OR{P+eVnO+<8_CZKJuIMMz zn-2eitPk~0Nuf8_(mOSUUb&^0lR~e?(i@XPui4T&Ers4@OYd|`?@5dY``v_X(Bqp1 zfAH(Q20e41v331=?(b2e5RaUz)&T#g%W%&$Vv zzV5w>*IciIX9D$1ApQ5+4c7Y~emB@o>;@Z%9bgwCZby6$aWHm*U5wc2>;}6LyTNL( zPpCh3_HZ{?t=!q8c7yfz?FQ?G-C(_ZyTKZ?zToaTy&G)bQ0z(D!QEgvJBRL+yOJsw zWVyS+zV?yX4VGu^2796OAa;B`BX@&!q}&bm$0MTe``8I~j<*x+4eUS?*a`M&y%TJ6 zzoO1(%6DUjRM*jW`kp^N9@;Q$U&S16H`tuzPhywW7qK(!(IW#zWoN(g+dlXZyTSTb zb?Dt-&*Xl2+`sRRhepQYp@`WHwuZa7_O{)%qo3RnrgnA3I zQ3rNWUVjm60+g8{Zc7F{r+anh5Sj1?!>|5a~J6BI>p~j zzRvSe(z*`&K${(1`^ne!d5!!6{6jc`Xm(T`zD*+Ra41$~3X?<8O6v&-V|CSULRdeGuOWa;k(oqdhUpKsPopC6$9IK`K{zNRYr z4W`w!z3Xc%Zd_*9*A~+HH6srr=`D^lBgX<87BaT4C6hnp>{*Oc)B$4_z10BctBGwJO@Py`t zJP!I5a~bOKdSb#q>Ta#`(17z1d97n$UlGR;XCg9?7ekzZSd7RJLu8s45lvwKac2zk zG=XVnA_gLKQk?LO<>x&h_vN-ni;cb&GL3@QP%{fy%4b!alU58ELyX? z-CEQ&fxECS2Dk{3bzU8IWqiD+^vQ65U+l$BUJl^{K zySg}K@bfq===7!Kt@d+19&g=#9&eww`Sf_}^z(R2zssjr3*J3G9&giMwRnI|(6>s- zOYhbiAkw?FZ1ecvxm)WauM5;}t!D40qjqa`SeU!Dwp*CHwH~!FcWZI}sKW7ryS41y zS=_C4$dYrnmc2WxKW+@1`(E6Sy0RyRj1CaD2WGmsyz4M-4uF zwGZ#IFn2TEVPTf{Z3heSjD@Mc-@?@YcL(G5FD*>{4C^LAegAH(s3oWVGzSlszpZ7r z-=33kb~jt=^T6FzE1dM%qRx?z6jwR&k)p$qheW3%4|%(_I7HlC^$kaUg11{s$xjqN zcjPCE15W-YiQhZ&lf)k#`N`rvM}D$6>c~fVyR}rGj1q(TD2i&s#AtDX#)>;yjJ7cC zV~i5$|GmX{OU^s`EC(Ns&jZF(!PBpE(h6Qfj!9ZtFf&2ZQonqYy<^6$J2%Imd+t4n)pPJ)Y)Jv%VfOYDX7r|Gs0$}Pv7 zT>fO16$EXAQfE$*ZBR;>WE+$cn(aq=8x##V={Bfnb*gPp(dxi$P|<4tHmGR#ZBWr_ zQ;&b(ZBUgub z3k%6B%AfjQ-TO4mdz+D%@e@yu`HiMNiw|?Av0-=USe+N z${_dlD!p!%%k<6^RqCm|O4KuJtJJg0vhzFS%g?X39_^rttw-ElPkEZ6o~aY{41GQl z7#eKx9)zqPUSZ4iI_5`wu}_aeqsQr!(W?Vtzgr&!J+68AgI})^dR&M02fyByBzl*j zTswUy^!8bqv5kza&|~{es01?x9_NV+ASHbj2xQ@f+tJ8tDb&FtWg7KvJ=VT`$KFl( zlhlim40a*{%Qf%9NdIqr2f=k=b_x4>Fd{>;bz$yfVPBbG);bs49dCsCIM%{k=hLtC zBsU8?lGyKw(A!)8CXdhEZ8)0jiEmFROZnqI{JMpC1^N#M`@hQUC*F4C{l&W)vz-}u zg5>cnWSh!KK7P{+IB{*t6a|jFk0^9-e=*I$Fz9a2E!gSWw05=qwTE}z z7pq!YtDBovRVOIL3c`3xs{5g3piHTTh9X;_%tz=EJe4mDJH!micDYj#C z4%%I;cVlywD{t|b*CyHC%)P}M>c(x&&FjIQVm70GeVy;VnpZeA-@2o!yQ{jdMyG}W z5kC2z;`4-l5$f1gFrcY0n)~YO16)00O6IX~zbdZY~o>FLFKs8`ZMy}3QqEA64)f*$IX_fW60hk8{#)T`;CUVRVs8hfbM z+(W&V9_qFAP;c`w^k(9|V9&QezkD7gYJjtoUXzry<=hvGKJ?pNqevBtX^+pwRN`)lW7 zKdU%$_$=mu{k(|cU`J_UWqYy z1m!O1)#uO(V2;V&O|ixfl*6%N|L<&{^54W!wgt89q_`^1O58Vt;o;PJr>A>FT^6l6UJ^_2Y;q`OK+>g74 z{PZa~ej8g*&tE(>0G?9CM))#a{^QYNK<}MncW(di%^|07Kl_BSJKupP&zUo^!x`!G zkY|zHi@tXQ)0QL7dHOy4zkqpc_y|-yREU0hdc`d)Cg1(74gyW(BO}{ zJ|7QVcU;Du@z86s9vxSIJbTW7nvc3BBgMAM=L|#*n9ntz{`MU71kyb6ao73uoOw0U zz6-3zX48Op=&?^fK4!9I+ET`Jv}KdNsPmfkv7JNN2Q`Su|0kR91=3zzM9#nCj_;p; z=N)(4A;i+yM_)bs;{25hu+8xhI<*_VC#Kb=Wcyt%eE~iZ~5j`=U(;fm5Z)?<%+5+ezUo1^DCRmH$A^`_QuCI6l{2) zZB$!lYi8@l^?$m&>hfQ-6t{e5-S~B1UOQs#jhAIyc180$mo{Je$2Ik9e&1Bv^t;Bo z#y_mSboD!{u3VM5>XwF44PURHUjK`_`nnHR?p!%><adTFpf@f2sar_1x{3lEO}wcgG<_%R4kdar0ISv+L%o8?cH?=HWpyrR6Id~o@ji=JL|&!YB4Rg0!B8oB7*vIAw` zEZbhTrfhE6nPt7p{%zq;7T&$EV`25e^A?`6@UIJgv*7UsUtF+t!HNavEjV?7Sn#`x ze{%7?7hiYrs*C4dJnrJ-E`IBx0~bAf(XNX&U9{|?b1%xdDD$E}%>UW^Z_MwU-!{K; z{`C1d^Lx*Kqx8AbZ8#T6r9(>JyYOEw{PBffx$ve7FTZffh38&)`h^27 ze0$zY^B$jf@4Or5T|TdJ-ud&+oOk@Zzg+O@1y5eE=Yr2&aMcBM7hHHj_=1x!=zT%g z+<%_?_}u&F-ZFRd+?u%;%ni>SHMh^)KhJr2&J%OKKIhgsSI=pjQ#NP%oHOSPo%7-B zf1mw}**}X>!utR=H%&YC>y z4~icwzO8s$@%rN0;){#VEk3*Wq~iX?@6Y(djDs_N zI^*FPyJy@oipJHE$?TT%SwZ-aUi()fl z;aI%=gZ4kS|EB%v_OG>nroFCxYWs2RFJFE4)vK=_fAycXer4;5t=U`mZMkyGxGlfB z>YA%2Ty^luE3eGC^2sY!Uoqf{uWg>U`OQtA*_6BKnT-t_GdJG7A-3VSZClz-Zu>#& z($=Hv?^r)={jV?IdU?*}Pqs9+9N+Tjx=Yq&uG_P=Vr|CSZ(MfCWdknze)F2z}LtM*a5s=K9k53H5{O->Q4A?wfVD)V0(t ztShJ+QTLaXzgqeIm0wu7b!GL+;+11p_FMU8?Q^vc)qbvaQ|+?a^J-74?OXe1&GR)6 z*W6ZfRZUGzNzJ&L!8Pwzzf%39>U*m{Q@yTwarLz7oa%nnZ>{*{iXW`lz2f>6Yga5@ zF@449D+aDOy!@5rdzU}BymR@c<<-mQET6nQv|KEIqw0mK?^oSZbyHPqRaMojs>xL+ zRAu1oJ9x?CmppLEj!Uk(r2dkNE-AX?^h=Jvr9bNi5&deV!y?^P>rB^R)TDo}YjHMHop18En(!-U%t$eofJC*lV-cq@xvaxb; zWpU-?%2AaAD*toIzb!eiz1@GsabN-l5>`fTM}B*XUV%2zpMB~#p4xU zuehV)`icz|^%Z3mGb$!moKi8U;={#nE`DY4GmF2o_$!NdExvZ~`o$|3FI*g3JbCe{ ziw7_Mxcsg1-<0n!f2@2@`4`G>!nuBF`6cBSmY-98cKONW$CZDysB6)yi=JEb_@Zwv z`qH9XaQ3$>s$H~jQSqYiqOpsz7xi8Ae%TvkuarGo_QSG0WnV12rL3du^0KSBl-n_7V;pGeK7A{^mXW`U^6L7T{y0F*6 zzbyFUf`3`Ce*x!&8ISP4dfw=xA38Xv?4uX!CXm*PVG+`Lp31qjc@L2TI{O9uLy-EI zmowxc_R$;onKt`Ha@E>K_AeD(ii6>ogYI*Z;&UFJ{Vhe;lRrw)obP8JRCEjJZz_5l z4t;dFH;~rlZl{hemuv8bzK^ud{~^*k&qqn?JRbwy=M?-y*pFz^9w5y`2(KX;{_CVQ z|2@!szK(wgM-YdPk)(Y17>;>71NYAM`G%r<<6!7Pq;=Y%pod?mbl9ZfrHalWJzvq1 zzedqD?ne<9U-$lAk(X8U|dPVOey;{+4kZw@)DAaBEDn-lhh#D2my`AuxF9W|L z8m{@=(>c6J@jES@+b#Yc(lts)wsF0pS^qw5ijI)psOagWH!He?^p%QUfJ5ekimt>V z`&31<56SP3W6J*Aq4Z_H?NoFQ4#PjE=v*9_59Jdy&HCnPdMJ)XnjV28%QN+%UN$%3 zBd`t^Afnm-t=|aYkx@RE;~)dS10j#?Fu{Cp!{>4n%=b1~hJhpByRprDE@vJL{BDCh z2E&^L`gFvxi1~;N*C7(0fylmOAdmP=L_D_2Kpyc~h?68o=@D~mCR#k=afloz2Bsw* zk9amBLky91;MkZj1ARcVVI56i+5*HdBFC43JYw4A6hsE{i1{r*AtFNzk!d*ACa|Ab z2JT!u&)1Is0k!SGmaIdFyKs(&n(yd@To<&sxv@mMZ-OD!JD z<+mow5Gi9|x#Tez9?RwFf2riEe=L{0W{byi$-B(rv0U=jT0EB90=y29G6t4Q9)sb{ z0=*TH_Ix!WLkyAhU_=vGzpDVKYr=IP+7W4|9f%Au#12Fh?*+DlX{l=h(|!t(_IHhD z#w=R1-*bJeGS4@Gi+!|5z@0w^}@wOWti3 zkL8m0d5gz#?*P6XkunCBOCE#a%>vDP{iTRsL}Z8|lJ13Q0_%4t0Ci2c4#bxbX{TS- z%$TN8ycgIGrlqb4OuHMA_Ix)YLk!W-#0+dN)9xnFfobnSq}|`Ec`=LDENKT!OI;J# zFJA$;50Nqk_6vCohDW_efFDJCm;!{3{=pvJb09+#Wx#@w^aMXIfVVh+R~^9H62QA5 zfY%wo`$7OO)8c`Y?dTK0>leTq5WqusdF=%$^W%ED=>x+H1@KM`;GG=68y&!_3gBHH zz-tZQZ3y6P3gBH4zj&bW4&pS$J5~qk@g8x@ zAj84E7rYgK{Dn9Z$m6x^_dXu4D}El&`8R!fwD)&?yl;Xxa4`Pqz%srCI?Km<2)t1i z&*+=uR72p%JyEo;L^#p=mRa#m^1el;9c94N@q&ahsFS^Wrjnm5mOJuMqE=%iALad8 zgJO^N?vqMB8b29jhf}KZgu7pDj9BW($B30q`qRW}M}C@Uapb3q z4UYVDakV9N=OzL?k6W0(yx@LYIZ*K1$`iZ<$BDav$6ENSz_}K7zr9qR?~Mtu zyOh=pVLn|>cJSeN#KQa~g%S%>{{jm$zXo8t{HuNP+kN;^3v(v(LkAy@ z?{)B4@s!3qWT0oBx8zw^A^3xZncsf^^O;tKA>v)&MgyV$A#j_8GcgId&%(z6f6u}r zfOAX(k)Gd5PO$Kqz=><<5HT5;{%KSgB8q@_TbT3Yhb+u*C$qFR`*SU@5fk46Yy$DO zefXa(%qzgF4n7?JorBL1f6y4+fO5|8d450B^Zc&lXA1Y*z_UcJzN$7#ewH{+W5vxC zLmhdpIMI=h6Q?-xapEjXo`tVdi!99coNHmWf0>1O{#9F;a@(H+uljHtT6r7!W`LuvoQ0|zy!n|-%-|tgz_REuCOpytd=|YaD1hO zv+!;6CJR%43vlB4k}b9Yk2MAb{q4Ys>r1xSWu<3*{t4Kw?=OAwcYJtwe=lR|# zgkfTbgNKXT9Goq_;NXzh?ckHdR~&q@_?m-9iElZ0w0P9Pr-<)6_*C&D2j_^NI(UrO z=it-Ca}GXTyy)Pu;#UqnL%izXGsW*5e3tlwgLB1yICz{mmpT%^;el@zyzdy~_Zjj-1AM^1kG=7ccOE|SR$qNfV153bSIzH}`5}aqkl=?8 z65tcw^>uUx-%wwT4|{7jG`CgPty{aQ3Ez$ITkRx5=PQt;N{LU|lVy|mA~$6w=KEWG z%AtN5gx?|4={?%OkJ~4e()qmvY&V_YOTc#L>;B1?KSGgDxs=&0=U3fSr9QuhH%I)$ zfLC+*<#+H0&PYjL{P^G)|5z=242<7?Xl-b7`bmF-x?yc=Q~fGOvI_m+FsiHTn>N<3 za(@g0e(Zfp_^8*f)ZDy&-G;UGjv^|AA7*e{;*AZw1h9wj0}RaHW6LUe$mHrVkN{sL zcgxcIjvBwt0F{Wz(|qQG^ejR{E7wFq+vozmw#V-^Amb?}WAD=-ufE1stjs+nq}0Dw zAx{sxQ!rT7m*E$1kh}bihT`G^Z3YF>aER@y8GWat6CL7-y&eme>2?PTt$M@mmd;hQ2xHh|0(ZEz^kgR^$uf1#6U=b3VKo0AP{oN zjG&hQj;L4zqJl{v(L_T6Nf=bnIMtyJpti- znpCTZ!+rn1hjZ6Hx%YA#`@ZkJ@2xK@XZ>scdp!FL_uPBd)`-2;3w>y$&(QWnRfe&$ zua(u-uV{8LEwC0y*z5Hb#g+7B1U*G^-(tm)iS)AM+1=p<26rCjrCx@l!ei@M!!A|! zb$iW}eMn3-9fl)mlHCnS)BGL4#vyKnWV&M#DSC;N>gozRAuH@5UV%eAS&o!#c14Qw zrg;TW?<<*_q~$W%Z#=IdSinU##m+Y-_`BXFcufS!-}{avCID81Nm9Ny2e1xI3W{hh zmWk2RfJbGSZg{0Soo_*MNgOV}GOw&komuM&I=#NRwH6Dov^3T>HJ{#8yHX$5<;BS< zEp2Nw1D7VnGrY2Abyk^r37&EuJAKpbOP}RD*vff~mGdYq=lm^aC(7CSa`vN~cMy7+ zstOiW!5kILQNbJ)%u&G{70gk=92Lw_sqaLXqmnr)nWK_9Dw(5_IVzc>k~u1?>^%ZP z=$Pxci=|_35P-}*00U7}73=>|{ePPNuftSS=`a;l`W@CPywteK=2 zb8?g8e_tE_*Ei6tY~_}&(#ufkA;qiXdMn0QEOBLd4eJXV$m4dhw)EOouy(eT6;G{= zD}$HLO*EI%@{-cB6mOkZlvS8;F8};n=L>@G3=_{iQdxY`Ms*Jj<=er`kv?FY&Y}k;ZRbCGR5f z?Jo1lG{E3(ZOJ2teGmekUGWO#EwW~8tdRKZ1UV3 zA&<7hFaut8hP>e!@^Uidjn0raCPUuX40(|Zc@r|^6=ukroFT6`LtbfyyvhuDGcx4G zGUUz4kat9eym=Y&=4Z&O*$Hnpt_$J|V;nO2TG8ixD&IQ4?i-q>-`*9+8lAyg=ZjFU z6LP}GxqIuJyh2M19lP|_#c)m*;qwX2{!+A#YQLyqhxQZO)LlB}3jr z8S=U_ER*dHhjYD&Au7W>_9?DN^w^fp-NGSss5S zkcu|}KUH+&;_lIsjZ3lMO-)nY48bc-!#hIoqG@BfV z;awzn(CYq z+Gp@NAXx7U}$-->i-SL@cGjF^r9u|dCqu3pbU zyatwa!RMyTtm|J;>#m(hA69znUY^~P)%=vrJ9`H?v6gz&@5)=TVJqK8M?{Hu!5N?Z zE%0x!{yO-N{lc|3R(Jo7ZTqZ1EQR0aFdD!hHQ-B=7U}71a=szf7wcIY_>Qt=)b*^> zKDI4y;~+Jtgm2HQbo|R_r?B?#>r`UT^Bg>Vh2eNY9++BT(KS zKixKU(#UwhXNY#tu%US4%J9T7$Q5Mz4dQx-!_$PJ2(Gx0*Sx`bg7JT2m#4PZ4(z(+TR(m( zmbYnhKFf)9p76!Cee!eS1y^F9)?hroAKe0eY@KSFjpz;+EFObM4$1p?`FVqJ>=Z$V z?%4K8Y{R7sk&knJsUB~PXQbz;<}ql)kZ;Yu_)q8;+ZQj0U7Y>pwoCG^Ip~@ba|d9) z$5tQJ#HbD3btC@%${E=`3VE(W8@dpsh1GfAIWbqadG!@o+3~{B z@q+U=-lX?QPH7k0jD2zGsc6dwXwwI18=_1+w+4N{aT=?O^jySf4ygZ0_`V*rJ%)B= z_sqhv%Q@1$91$(D$>TAXcYU{tUE6dm@~=vi`3&-Z=e&!**!IcY&`Z8#^pQ=7Hlm|Z z)E%*X+dk*_6gKVBv#IF-jB6#Li*Rn4s3+Z>+{fMUkLuadR3+vC+nA5M7xZjs;{L#% zL-Z1rorC<09P&BxRc`<5?x$e?uAjXA<_~5q*mva}@q&WbtbLirHlvJ|_jKONYR<>X znt#-GVfNp)Z>w0n=RG-t#%x`P{rT-r4_a{Zx97wQPP+N~Ey!qoxzFjrDAAs=&6c z=kqhZJ(_vuAz!QuWbF|?4j|3T^Gi;{}$WPyG(%Z!7nZ! z@=dJbxde0PPHY!qi^wtyN|6>XcyR$D)0`SFm@#Y{@bDeq88U9iwnNXyv9ah=v(4GD z?c1+@_LHF}e!c}|Rxerk+2yEz;9`aJc_^zH{OXbMg7-f=YRC-OccQO9{miTyiq$w# z$8hv}*Twsxy~W#y4LJmTErQ;U{_elMXXqr@lXA9hH0QAHmK!$IZG0fg{n_35-V1ua zuK6RjjDvIk_~&jPIO~DiF;`c`3yxS^iZSWdb?l0M%wMwp^IxNlS1v)FOTPBmZ-!1m z9f-VwwBwcx{`A*FH*6en>b;--a_Fnu$=h|wx*e|$tw6ixZr^9%K=k25wB^t*dxxHj zajiP+<(hRH$8MaAeU7%QyXwmuhu;6iABLPW&9v>D=SMwN z5A9QHx<0>Z_cM3AJi_@OpEdaQL%z6i=th+BALz@2=*zNM`FB(uX39fECY*1sUVKE3 zKCiZ1v0?3o?h;)`XY55&*Wsx1M&!MD{Fj@HVn1O$oxhv=?uP9fnt0vB^)+_x(L2r_ zy6y9ihg_rc##UeRyvcjrR&HbGZbUnWM<#AAjLqE4c8=b@@9x!~b&qiVZ1|V$m^Sp$ z&tDm`H|pvdUvzurtO0k-n`_##7mg8I*Sg_%FZ|Ky*oa$!Uym0Yh4yb;JY@T}p}TD0 zIVIM#N3pJR9nKG@;ym#I&KDoxyn*x5Z`a@x>EWBdh{u)MTCG%sIt#ZY$Go}wvoWOM z7Okt|#TVwyeDQ@BX1)<8Ph}at%KF%1aCnQ$k0;2(Tf}uJX9x6bd@SDqJ$nwe(6i^N zu1Ds=hMs*GxauDJp(twrk@@Vxt;25Xemv#2JM+8rVEZ~tHJ@n)K4)xxUeD8awDwJN z>*wc$!M0tz=goV`@cB81d6^W04t^2;An2I(a{%T+^Rmoc9`6mw-w-ixxVoqgysveU z9O`KEMj6ro9n23~kQQj(08`Ei*e(i0C;bDBf1R)|qWvoVL9T$hHgAHR%U7fzH$VsT zCKa+7>dM~&doVwgK^}$Xy{t|36zx}x&Ea$Y-wFS_wC(t8gYCwaZ>l)|7-91l=gwaV z+qGv7Y!{`0Z{oOdo=3hNhxz1>MkSC%wDH-PQU^PCKV$1?2@{OnLe3atGg^X+Zm||N z%a27cQ?0$>LcIBEZRXe{>>FU`*;j9Fp>4s#|bgp>4t!O=2wU!F){)!eMn$EJ|rN(3_b5wCkWQ?+V!L7u&xUcHW)% z2iX7}Tt~~yLl^0y8`wp_;QY-06#pQclleQesXwa?KFio_C(Exv`D~}Fi*0jt9RWM{ zT>OK~hq`gDgFTq9`a#&X-1D`m+m_p9Z061X%-H1Qe{O6ZU-@4cdk{7(lk;adYFZ z&EOwtQ%5*)oJH8bgKsnb2H3eMtlchY{?*q73N$k=?VXz=aE-b8=5u{YD^M1X9e z{g|;IqW$m2-b(v%V{fPZh_QLXc4ZEN?aIu7oj1gc+hqFhHv9>&^LeGSk`-|lu1ot0 z`v74V3VV{UCky*@VK)i;JYioT>Xg!HQ!1xTE2$_h zpK?t7SyM`ir%WrJRvKB>Qr~)d#729MloXX0A@+FTQv7J6A=1_wnKy6YF~-}mx|OFB zmW?4)m_huszY$7_L1_xAv2@B7YyE!#)mO~S|a(f0%4 zWBYyxd^4136t<5(iu193XF{KZJ`JT@3?=><^eHGM24(u5P$z8jodC@5gl(p;)j66##$GPEzZT>mHGf<{c*k<}D&PU$sz`umP#so-Lwo-dzi|V!D!HbS6vNVZr zeG=c*NqpZ);=3b>Z=mqO{2z%HvRjfmc2D9PnZ%cy#Fv-ESCGWFM-ty&NqkF^_-d2* z)+X_toy7O;B)(gc_-;+&+nmJrY!crKAz$?_<~p5kbT$lfH)+35sVMcfL01 zdj{t%Q~qAT`O>8Cr8plFGFI_;rI>WAc59&hKTbVpEt5V@b$jW12j@SNzPEbOOW#NR z!ppyp`kj{^QEz+ckmh-e{#Xb<8NxponEm@@2)`4;ABJ!i zFMfga#)k;Z_KX#n?HM1!2ZZn>f!UtvAsmi)a&joWSzy-JDlpsgb%B}wjS$`t!rv5_ z?YT9Ce;UHih47mKv%a@Hyo>sahy92sO6{w9ZMr!>?5lQoe5@$prSGS*NwhKwpA5zc z%(Y1N1)l5(NIwX8hQQN+dCzTRnBwa7iTmDRsv4NrSC>8?_)!N@9#^Y>Mc~tcopAgw z6`14UuRh-!|A|N^{}tfGA=exKyGUpLPXs1EANQ3B>5W%~@F4<|Un?-nyC{S&^YE^r z)!BRF{_5-#g4NmCEJlF&p_hMuwb^2mzQ2+YQbyqu?lT^LSM@w_Vt)-+uK^zsba1$O z8+ft6?*TUm+zZTmE+fNL95}ImhpXL&xHO)>unMEV9FG!#nSQ*$OkXH4(^m=1^s@zK z`ga9p`b{3*P2J|<-uPVtkHW9io)(yI>^~7y{B8wF;0-vS;RG$BXb2wW`iU4qZ{zA7;L^DAK4pY0-@ z{JpY+!u0-(39Qseb-0InS_&$LT z1m^Q@SAQ|^3j$XGzbi05CyeIK(lSaN4a{fT4l_bZLU6tlnAfw;5WZYs&bO;Q9FBO> zi!Ys}92AOxGAW3F!rx&hi!gJ$SN;@rx5b4hmJw!TL=(36Il(7>IfP#i;Ud{Q{0jFs zA|2ltsE<6{8~+p-yVS~HHENi%xy@Du9v-H~dU&`R@8J>3k4TcECVA3MxqVv_uVCBAF#V03gE!kz2qHEVBWwU(8h1dy8Sa37-`fGc_icmI6xY&l!D)(3 z&_29R%&>v%M}d|0O4F8)K5@0M3rgNQ8x_cXUQHWWqm`}g!R)p@7k{d>b@E1AkR zam(g7R*8NiUYE#W3EcYqb?xRW?b?uqm+E*oj$MkdFQT2Hm;^eMN8d;}Iywy^v)Cv! zNdxD=xopK*wWVH(E85ohVRUSOosQ;?q<+3vA4*x)7IJhnw}$hs?I@||tN0zEa6Bzo zExXevqZi(eN`!?#3Wp65aqzE9>3V};47Q{I>y8CTHz`2KUha)CQfzDqByrE`5I57R zf;wz!q7v(HwOHt?2?|3P9Jw#qf<*9-63#mWp25G8pr#-_QCHw{wFM4WU*JGd9330s zNr#Nl5mayhm>5qb?43p?G)Cjf+73kRSz6!PP|GL)Yz(I~BRHAEBdQNfVl(BV-jpxX zQ6JpgEz{8($i=Z|JMIADuS(>6-a>u4CNbD#?pV2#tlK^pM@Q-^AyJnh>a)a107I{_Hx3uW} z)WHlqNiwFAJb#tz;2ZRs-8W6g335BAqF8b(a3T?-5|ka<0i`A|jokqWmK>_GIXNknr= zM-h7#t>@SyI1K*T-N@KZNwc4(PXJ|RS0XSI@&r2z5ld3#3HLDAMSlBHdg3@qSytj8 zNJsH|s5{3qg}yRk+M3`@2tuQ$ZJF+g4kDw|IN1?22D>2XA&=DR>M|Qih~b(HHW%A6 z8{(?Wo`K5rWuJU~h1Z6;u)^cA+E7>Un9~*vb6$gCuH~qXjn(zK?0RBpkE>c=4z$N* zx1r6-YIX1~x3i*UI+Paf08Gr8W84SDk7&R!0S*JHThENoDks9eJLQzaR zjnJIbv4d8%Og^nMh-Wgnqa%pQqC=Vl2r+L08yRRL-cO;)ds?S&=^}R)=42QTaD+fB zTDz>MZRr_PO`MbR;_|9!@;E0Y#bwhfB9wnV&dE*QuPPFsV3S#V-bQtg7EAf1xDfX| zj*sGK<5Nt8$;o(pG{a{me8zysIQ&S~M_hUPASDytMDUo$m6xnuR#Iwtv?-~0)kt$~ zNXI)qLtaCMJpN{j^%g@ZY@hpnmDsiETw&8cME)oxlm-~YYmq#b6+9+`4GH44kT=}; zbe*nV>k7&nCF)IA9(jD8MIkR$dDAm2kGxFUcUXqyk>|eSN!PyLW>_A1Gjwm$_cxzE zBoVw+`-42rT}rz49hG5u8Ri- z{@mLW;$-DHp4>Xy7NF~OKDl-FKhIM+`1(yv7yFGkS^FH%T_A|V^~T`iHR&jnHyv9F zak#t~E;ICB1Rj4AO-aZ5S%$m;<1#C6R))N;40(@d$on!w-c0;(Fq3gvmm%+w40$^; z8S);^ zkoQG~yx926+IL}wyk|1x?XquX_0G$XcXfumUu4M3+b^^BEy|Gh-3)pEks)vVgv{F4 zkRk8340->RA#ck5nYC|4hP-<-*X)6@NF}AtdBz6mzSgcyX}-`^5=Vinmgf$KR!= z;(Zgm9$OxNtDcH?F+S*SwmklRJr!@tL1s01wvV5+Q}I3pFB^&E@gsdIUKVcdXCR$C z-omHi%@jP`dZgr?1)dvcG$AGLd*BU6I_sU3hIhN*!Ax1+{em|o4etrTlM6dX?R}E*OmANar}aXC%bod7meEWogPAFL>o? zcvA$gA`P!f@G8^r<_aFqgQ>>(c)>e34R49yasH<&uUYVBrs1s;yhGCP&KJBx)9|ho zyjU9E^@2Am4ev*SSDl7;kKoNt!+T8d=A_|0D|mC$@O~+Hho#}YEqI5g;k_?-N2K9> zDtJex;SI*g!W~CPrQwYfyra|b#tGiMG`xv|cT5^yncy9phBr&_j!VNkM)2mR;hiLS z?wM(_^Gl=P;n_{f<87tjosfpNUhrzt@GcX)1!;KS6ugCLcs~$4zE70uyzyhfJ1GtC zr-FBK8s5`_w>S;&Rq)0jo#*={X?X96@@fU|j=jx&DO_6q0p4f_#5T;^1sBO=y!%j| z^p68?)2Kv2yho!x4Bmi*TiuV78Dph>-}*StInXD;8z^|IuoIqx&k1>ysZDLm8>gO8 zf7aC5STtcOVhEJi&YE}lakVGZ%$Resv}b0-d=xJq^&)&q76TuX>58AnI$ zvWBInG%tzFWW<8yD-hdW|7?J6z1l+u5+@!Ume00*G8d5=yPK{+q`9un$s2SzYbI`r7kvC- zVe_oU%bR!Ud87FX_^-{07v$|3FUUv4sP~Rz#IMN3h+@_H$TRa1DXM$*mrpO&+cDR~ z3tmTrzpQHx+0gzJ%j;g9)u78oG&NOcB0F7iD(d|J^?!hNAbQhFYbI>CfKlaI_RtaB zV(UKsu!+&-)`X+^l~shxV)QxYWwbW+`rrPJ7spVJ#!b~M)p_Q_*2;0q?)mz8 z**$|6WcSQnFbDn1?im1kU=8vj`eJNdbt8RULBz`Jp4khKf6aU|M&v9SWFl7~Vk09U z4rtJIf|Jvunqr7_6)$+F>up5)%i5H`ae$8cr8-gP64VK0)Vqt$ix=FJjYwVD$cr+& z7NIYQZkC01bk}t?UBM_^*w0T{?#S#MwCRByl|2gkBUzr`+?vS4=vF4eRg5{cQXpCU<|c^Dd3j&)RwOM(JmE-ZN49 znVq*%lzwLC9TugZ*?D26^fUXZCihp(ZcE9yn6G@W?SmSrlzw(Sf~@12AJWev@Zc5i z_8IyAUIb5ndc_}QJ(&mwr4_=+cMe){DnTS`A$!4IfZN1PqVaPdA3uny-8{ z{udnMatPQ5_u)3^4?a2b!*kxA#zQ;5EWye@!r0mH^W{wnKa3Bg0}_D_97@Yb{!xan z%jCBP5M5@4D07~%SxzpWL6HocmO~lC%@9vyN-61v1@1_W^B&+d`9?yOrU*?vB%Ip*4RwTXVec!Ded{j zUP1eKW3z4fry4s(yUy4ghrz4y55fmrxo2rpk7q6$1&KhNJsEah9{xd!p{`%7*Y%5> z{OP8A-JXMu4Y$g#7WQmo>we8Kw(i$l!TFl8+0H!sfQ7p`Z!}9Y4^IYPV{E$e_-zz~ z`_9cDmha|CA#FQP*iJW3$j>iN)RjNO*revqG&al6Kg8HDRsNB}K3do(2)jnu3yjS^ zy7sVM7aUWM?Fg1^_G50hHuWXdwKE2nYyT0jbAM(y^XMOG%CCW)x765+$k}Q*owT1a zw%$jKBx5Cip|DRhb_8kpi;O*k_DRNOUHK;q|0%|9pntKk*V5LJXY4$$HGZ}szuwrx zVY|NM(6+}c$HdJm?z_C*@ee{fKW6fBU%0$_JZ)ZbTweCk<<4~BbO2NbhfNW{^;wXHfWv9M&Yo|bkLRQvAs;V;7uf3xd4p}VgH;sAKT-^`RwUbyXj*-dpZex%oq0Ye8e_7VP5+9qX;L?C!YH& z=d+g~O?AG}E+e+|ajdWj#QE&5)qdx*yD{+Tb7zp#lt-Vvo~5IPZhkafnaoj5v`dcx)<*9r4Zf=-4`vCf#V ztxE^XWWD4%VP1U46a-hMKL#zPA%sCSnU`EA43;?!APQv~g@Fd?qc|V?%ds!hUh|Lr zps!r`vQP(o6~f1Q>8lhz);k@z3d%GJ>!pw4d~;zR0_Ax;2BpNThW7{O8o5p`hA|6T z4V`VBF>8nS2lJBagn8#cS^r_y856d3>HWdH}JGz!OsK8o|PUA53U=rSmU_0~b_p-Z8Z7?kPq+{As!V}|*iFmD625!z&(^bwy1 zJ>B|Z*fKplek_mqoiJ}R^bF{7>!gqPOlXVs#jthh)}_akpQ9%q)v{7yK|od6wBrcpS~^iiB|F6{H5UC;}l6xQ1XJs&E^ndt+dPB_je z(hF+Iyca?*f_@!Jp^up3Oq&veGCe%bERXq}kbepEQt0K@NgpxC`7-N^Ve8VZOOG?l zV}2*h`wi$7(5tMIK4OmZmDU%-)}>pQ9%q)v{7yK|8vw3`GL6DuQA(A$KM z_!j6y;UoSL^j7POVasyD`;GOo9w)5hcIX|@E!IgN@tx3r6F%a*pp%7<_{Y$@tuKbH zE62L@{$;(a#|i7W2l^A}L)J+j@x9Oog^&0?=v3h&z90I4^~JDt~a z7~rQ+rcpQ#=%YB_T-eV+pNIYmN@4qmUx5A+N+FN!gqPH_-pEKDLGU zx6t1UAMu;e-&tSGVhi<#K9()p%xf~+!n&QX-nXD{L*Io`=p+6k^e<2f+d}-G&_6>d z^b!9F`VN#5gA&Vn>2qbn)WUlKw&g7Y_5X|U|2^n`L3_2ww1xPu&>rh!y~Nv~9|#}u z`_R8xU(8|)^@cuIw)68Igl%EnPBW+utyC-gmIw0sV{)NDS(1VhYDOf-SjDSTD!u zbLbb=856d3>0>nl;Kq}Fj!PWdFQE}Ah2ugWC8GbExxwRy<1zqwC^0DQ@VJbJ-yLf( zb>BGOIW7Z5UfLFtrtg)R*Bu-5v2TBda$E+9yv~MO3&(|d$#ufKoKGAV_LCBWI-8in z`NF(z?$JliP$+{gGmXM=p^xHxToT`!B))5t_#R2(`zVQzJ1yLnV+0ST4t&2ViEm>P z-!PPiZU@3K7%u8y0)4wB@r_90%L(}y7?H>Kug3*dDEfv1z8~_j9bq4+eSE{<>j~w> z^iVrOzTxl<*&F|?u-@HZj|%xlz&AeR+a10cAs?@u%R;`9@SPd*jY`7Hg>OxWH#!L~ z5590e^5MHMl(zuBjUnF{_&^R^9H)oxb2P43E?vY9)Kr7-}3M{^`yZ3 z#P*DbcT>LrcIPA>Veg1^&KExObHe^G*mXh>>{wv(kMl4-w+hVmuN0X4Ydws6Y=QOo z2u%KOJ&fzTz~sk0JVFh@H7X&!@nIewp+aQZ5_2;-7E_90fBPuZaUnVg5Cwf?^oduWvUWoswz%2g> zfm!~aJ&bDuFAjn9#)o?tN4ST3;~vD5$1$EGqQ+UwG09R9b%2*XN=@=`uBrg$xztFm znhhLr5a*YpfhP!jLI~Famx}b$L%0JtCepirYXrUmc(K5nfa?Ul3Ajbzdx2L7{5Wu@ zz`p=qC-6JKPB{J}c;OACH=Zjn=SOJ>pCmB%=cxj-yo&^8`eg#MygNhqS%JxaNnn=u z4}qD^V9!oi-ZTeV8G13Mev#beu0_)HG!G_hQQ1p7ntdTcr#~(`S%l;>4gF_ zzaQKd!SKCw+;<7g{BmI-eEX~}45iCOhWLr#N}F!>-@fWw9zS1w*TV&BGcdVE3e+RO zi78v47Y-Wjl5xNBHqyrm{E;Y+{Ts;}*+39HKZN%R;fTN-zv&@-VhFbh%<<_InDt*J zFw?IM;Y}g@J%L&OgCYDv2>++REdO1BS^q%Zv*$r-Uql+-~)kY2s|}}X8_L==|=)5u1|ZYHthv%bp& zW`AxKnCW+h@Rkt1KZG9+;SWN10vln4<}86(-(do?Jq-dgy*Y$iL%1V^*M{)jA^azS zX%66r=s<8kCotP{pulX;SY!<|5SRP7S?%Se zPf_DNT%->4@KiO$!^Nt^!%#;@8NQFqK7Ng5)W6ZWgb3Q zHG6o5YV+_+waUYXsB=7gs5;-nF?ETDXQ?YaT&=G4@N9Lxhv%s8dw8z;k%tdccY646 zb&rRSP!D?eNcEV9k5WJL@X_j756@FCd-xdjOAjBb-t_Qs>TM6tSAX&F@#=jKe@%Vp z;SFXMy z7l-*uKi}`KUAwGyMSI&ayr*B(QNOyep`)|Dvr(<;s6V~2sJ^wWwWwHvs03y;j8G{$ zFnn7p1FGYHL;EsrT=e!;?b>u%!0GVTc#y5Ki9tAiFDJ7tZ);f9(pcNrst1!+cTDJd)KJh zt}@T5M=)uF(X&2-Q`FM7thKG9xxtj^hCc=G^p>`z^(`iLgEv6ocAH{%Mh{l-*a_Xu zLfzJsg*sMeeaD$a!E|w6vn+w@pYtZ?GSWNaw{z(r9)#8|;_+FlJso~=Vz|9U4uV#s zA|U3wH;$6$t@04wtBDm7u<%Q|BJ5HYNn4UwLjfz6q$?y?Mj=%(0Rby~VBoMg0LM%( z5Fp0U?`z*V)`~OCvNPATwKsHlt?A3`J2putccOzq!&C7@572tf0LJBKRDL%L7{wp9 zoCSV|C+as?g@u9 zSwUhX^+Hw{PQ3tvUjKlz1B+{v==EasdKYeZne1$`s;f)%dK}!!G)^k|$Z>owq!3&L z<&n#M=t$g`%xHZ$=d`T|j^+f7OE4gd+|5b$ynnd#IsM6*j2#oK+{Bq2T(-O^z|l;0 zS@1|G$}F1Vc21v)<#Y(vx9M}ONt``wwSK!~A^yZnR$nl2urx`^UZ6-Z|I!!ZA63b? zVu~de-b&s}Ia_yD6sH+xD>r&k6)f1LXDb)Nfs3=uO(wm7TXl7*Uj8L;^0W~E&Kff8 zM3oaNiOZ~N6xy$e3#31xu)vGhaVc450;DWc>}D(*mb5@YvCD#`D=nA_SS2h~aS4up z*|Pg4(HBIKTMDj2Sh;w;^V$We3W)TD_Rrapd@=^rwhA$FZ!w#%*8)u)PpXm^>P zn@+vYeK+d#XRJ#O_OD*)3(IhUY38BVFI4KE4?_9-RGTO_$yobyMK8yNb+~W?V&+)5 z=3rihd+g?0pW1^QDAS%Lcy356mlez^duZ#sM0b6YGsT`b%I&qS+`G2nLLp8d9J}i3 za=Wrrxn9#QsE3o#t>aXpSFl2oyr!}L%<_D?Q)T`#?&WLc$JQQuyK&$8|H zwJGk+Tp7vlq>Dp`K^cz#-C8WO6^t_O$*kAGN!lN@t|Im5yQ2)P=h0HZBdLPZw8Fo+N#7XVh2Xf%yz6EkxHd3fl5Pa$qES53 za81z-^&#m(S+5}R^y;84iE~6Rs^+{XiTw+1`0<=4RB^PJ z)%PXXh2s(lcwRYIxld0>~7uKl0 zvSR5#`t`*ysxO04y=-JuUp>r%#8F&7$kBQANk6I=SB&EHU2A4ZZChtkV>=#(VVz99 z2pvw^T#F7%4C;+pnGWlvY!AMQ4(XUW@^ea^#2}C!f zzwM~3$Y2zBy8M@RzH~Z{zqEtzdKaAK?J2O(ZgEe%0`X=iMLL@sA_qmvqSGcb0Bs*1 zk|#$JC%DOGKN=Uh^iRZ=buH@0_A5@6(&<&D{|^T1E6rn!P$fbUr#YP6e*3>Sqs;U< z7t-IOyu4z1NpafIafgVvf-%uVLN$JTrymZbK6S6;T0%FV?BwbMvheZQx2RS7Rx zHsm-i*bF&dw|~chk=4y@E%>&wBZ50rJaBDn!Q~v^TSnUPyin)jf@zd+&SSy7!&)|IYWV^=7T=-`-WbcGa$3UAwxvp&4_$d)y#G2_9!} zYh!O^WvQWIp@IMYc-7DtX90?dd_Oh>F>XUp%fMfn;J;eof2a@sORf128wYK}f9-Jo z#~pzGVt@Xp9r$1W|Gg9NfBpZT&e*?J{{JiYKTXRX`a2T*XBriWOMw2Zl*xuf{_6z) zcLo2?`2*7-kw1~>(vKlwf=7w}5KZ(T`d^XYze35M&;kExD>l7==>PKs|C!2vL0$My z_5L3_@LCI^|ECH5Pb>Vz^6-D$(4;& z-#h$g{@4G1?*#l`|Nq~)um9cK`tP{^nZA0^Xo5$HzX{>rJ^6b&0FMpD-_im255D+2 zI`F^#|9dCk|N8&$nDt|A{{Q*@7fp_X{%nH(tb#vTAO6!8{7*Z;QV@k$3NU{88x#C@ zHV)c`|Hsy^_J&x0KEZ#5l0TsX{!6U*&pYtqHpIdcJWBk(fdz9R);}fqpELe)e#8@E z{bO3QakKA^;E>I}fg1w(8U`Eq?+mx|n|_#3LQ($=QAKL#YQEQ8CE3u`D?>JHv-Az# z8nh*FV^HAgO%N#AdstRtv}AKY;F>KEUtpvlIhwV7b>P~7EfBhKGeb^%G;>9u|7M6E zdRCDiaaM`{{HzL3SYq`@-Tdpm@=~MuLd~J8(Yt}#QIxy7vUgs6j(+GnN2qk{#c^%Z!k)aI4v_MjzK>SRU$1nfPMKc{4 zx+rBlLm$7W5(NsV?{-iz6IDcSjAv-$7e%s0!YL8{oC|mvkDqXgj#}ZT%Am7@ z8PYhx_dCr-PwmIsB^VAsMgGPmI1l=9Q3oU?pbRg~xF|uQ2n9mRcQO?D(W?}>!m+US z^IW}k1x2)B?xq4IM7ODJ-3n>CD@=}AWt|TI0Z%oujOJbHA*mqB0PSJnFNt1 z)XvXbtIMyjk>LxhrO^r|LyZ^|oKiGxYd3#>t=-2pA`lz`O3{F*+=OQo>94*Vjpr2s#cZ zEs(%;Kr7e`9eza==yMd053iRY5!VvQVQAqOT#O7=VQ_K2-*^#p&mjg|DC0Mt z&ab$ma$XAb6Cj!(L6HW8KEXsu0YBim&kr-CMhSeNBJUdU6YpyB_lBzST|&jt_8AN# zz-XcEM;JEzy%UZ3+)YLxsq&X^5=S$SGPFRZI;wt*AxjXxo5jS?8$6ILxG#v2)vXG__ zlomhH#T+Cp)Oiv`91yDL&pF`k#EFcPWHT0G9HJTiPgh}cFb{8Kn+ZtD{O6CsO0rEE zb(xEcgABqAM))EE7m8i@x!Y`_5f*cqrg391C=xF;{a8qW4iE&U^1x%AsR*Y{s zMU}5HMI4|JPNQXKh0->-j1f?IW6`Kb7vUaV1au3yU~=LV-(@$4A3fCw-MbjfmFTIe zY~FeoF?Q=(kGz%(prq z;fubdrxr-~I>OZj%Z+6mj~^8)O`!M+83IcdanM9vFshbuim0U?x!M3i2`@%ZU1Lb# z1UZ(`@4(ur2kvB?DAU7D1BAD0MOuP&Ze8D^ppL>)H$K0ceXvG?G zKmehHi=ZxR!R>)ZWRjtyUTZ;z+UM(`6>EP-owcAdkqd;Q5V=4J6wC0R+DH-TWC1#n zsD)+*fG8h|{`3XLss#R{v7@^UL8200>eJ{r5Fz^aWLPBJh*$yy8xfRZPL2d1)KM?< z-;u~1cjY3P^V`4*3-HV$FxwU>pwHRhZm?VgY_tFY7T=i=gbND7C&)qPP(XRc8uo9F zgHvQ=1{7KGrx}BYPekRPW=x?La@#V>(9yjQLEO}|VhA@bI7J3%K&hjlR$!R%01XHw zLX7`>iIh-&&ISfkm<6^kqXfQxv3Lw*XIuXsIAV0jfkRJQGr<0G6)MGI$a95r?2lnw z0E)rb?>#TBh^B-vRP0AZ{XtSf+?t*y6#LXyp&Vm+yK;5skD3w)uuKzy_8q|3k<4dzZ^gjOGiwfrdO| zC|Hi>{X;)&iN)ie`ytGIDVHpAo3CalDs8sXEM&zxa}7&7{5v&Udn-HC<(Qbfh>eZ4 zJxbX{v7-f0)}j=3jstazJ^DOOR1VG9Brb(Be%n||=-XWsvEL=dyC_5nAtn+&#z;Ft z5JUlK^arYMJT4|DJqcv|F+W_`hOFnm-jmBvF?{ zLlR9%v?S4%LIEh>mWl2;dQI$kZH#8!XrAO5Th|ed0 zYhOrJZs>;RW9$<*^yA$zHU`+6G{$}a_P!fqlYqVV z#@IAq?;nJ7fW7a>N=tyfFUHs!VDJ4gwguSxZH(;(_P!irhk?Bh0P8OF0^J=o`##2s zyQ6zPjn`*!$xd_^`j=!UxeNVEva{TU z{w3K3?n3{P>~eRZe@S+=yU@QR8|*IhFUf9o7y6fEce@MyOR@)ny|{l#_9UQGy|{l#HVxSO2jLuG zFYaHmv;^3T`V5(7z-r?jiIq$;x^N z{Y$c{1pcn8>ml?nS!(Jb^e@TUdI?{wVe@S+MhtR(yyWB(Q zUy@zzA@ncF273toOR`%D)DVR<=pZ)k1oqW})db)k9Akw@@ArTp1f{f6wCOvi;N;#~ ziZ-=>icrd7DuIlhQ-KOL`mmOwMc+AhOl&SGHcyB<=b9K2mw^gwAx76YQq0~hZ3j&0S3f7H@ ztVgf40*5RPMSZ~7Q42N+`GOrnesLI4g}OML#62V;LRE|R{Z>`5kF0uxta^-89YLy& z6jm+ZlX#9qRH&-p;%`-pFOeN5vEULZa%D{9Dk&mFdcoD-BhY{Cx75z-LaA61`>zWX z_1_p1xk-wU*ng800e{;-&c~g1ND(2@`|td2OYz=ssf+i7QUxR`-WMuTd^jfZkQ5;LE>6L_0q#y^RAa7$D19g3MN!ka658-yoCKQi9}}d} z{qeN@5F|q63NJ^2oERY2009Omhx3d7N$wnwbKwZ(z~7h<`u;1qoLmSpph7UA5EsB3 z{;vdw^T!%q3WWYUIaa}#+_FE&Z9FJ645%l5vOsRxCH|11+)fJ()S%Kc0J zL1F%yFrZWBw+;xp2y_O3#cA}14;-ElAV(d|1W2)jSq)22#jl?!A780{_rkN^p~au1V-1W-04 zaDg%TPu@753Pg9QQPt2AUFuZ)q9REZ90$@+HdQb$fGxO>Mi^7QMC1ia15kf;s)Ee) zz(i0nAsAN}8TcilIHE5C&D5n%5IHWm8Gv&2KsT2NKsPINsS1)}f~SNsF~Q~lJ;8f) z4%nrNe8H=P>QHsiU=^w)B?zrhrOq^1DewzOh>(5cdKYwE5KmMGc?8cCyeI81 z5tsAU0&D9hU0sR(^&47R{EYogZMwFqub*KtNW3oXR|I~!6;0jUAgaZb=4Ger6 zCjT8(FsEw5QzP8w^8_BNvm=D#CM`Iy`b$K9gs_LmB9>s~>hBTRLOuYjQjo>1^F$E$^UWaM&-c_UBm`MiZ_faGZSnn6u&y3^N@HbK3E6o3ki_VNIZXZ|@j(ti4M5JA;yyc% ztN~|B3BlZV;JP}$^-Hff!9QVicofzZ&RwJGtbP;*?I)S#wl7kuioqC?AVH7 z=VxMe-#V$z8aGclUrrKnZcP_)PW3r#m$9tDc~}&2o(^QfyFllnzbulksda8&Bjc=f z8pE!(VA%Q)HRrHnB~Bg3GM#Fzl%0Rh^mcBTRO0lw8pHN@i#gTpFgxM=cEG~<^dT|l zX?rp3LD`}S{HkrvB|{i?Ckw-rUs+Flx*K**4qZASe<#--4Yi}{fH8xh(J{*g=P5pl zU@1fXF};a}pwY3s1om$;C;VeMF7NLFLdqY;Sq7ZDAg&;R@sOGz%h7ZI9)^sgrCS7oX6u^6wnW4 z!&$yufd8Gt@J4XKN-YTbqw~(nLC~lJ&F}yKgJa7O zV!`*kM-(}A;t(P?A~`tHv+?1rW-cR3`9U2zcuqL_t0cR~BlId-OW4?#WYijT*IF+K=L(pFbWhl&mu_mYP;4D|#C$ zPYW1+plA^hds+;eUr0>}FTW|!ruw%-NE#(X{GRr&+vkjK_DWLyu~+REXq#Y4K)Wf$ z?Z*CI-e3iXf?Q>uAGpBoYpEONQktneW)w?7PNV-c&%Lj4(6@6LZ9)sH(M)VN*2-Ct zDLD||LkDBP?ReXn$TqfVn11=TS&>>(6$L_;6~2Qm7Oxq(TN%f(zTxP4l6}NXyZUe* zS3I}-c~V%3Uh9Nz4~22va5DX9i-p9Nn&*R0d22e$WVQ?sQ~?--eeRH9h|xY13&2SLpK7~J(0%ugAn7^6oUU++zr-!3^~2-D8W~F-6C+& zo^Tuyd%rUTpZ854g8>C8ulFG`j%!E}i1bnjg&(vx6MWcPE`fT`bR3ZvGnOKUx6XzR zz$>6jg^Qtk+h#(2q4S~U*B;1ZiNCD}hrWez@bm^1(N+(V2E+Vr(A`YvlK_8j;zPs(4X>3uknd_7$k1s!Pg~fl-NYcvpxA3|2YbiURT=}BTgvAYjn6MG z+N+jImrRfoPZDU?Skb-@6KAiDQ-o>6`nm3l(Er1Pk!#;G3$c1!a-hp>^QWiR?BC?_$( zpB#7b%zo7xC#I}?ntJUg+{skE>=um}^M?aI(QN~c#lAOgz8z=5BLvD4aw%HDPnLUZ6{}ylu^fg^#`}QLd-8zzo&TJg{#-(9dZyg*?xVY zA!d88xVhBbrchhG>=|RD?lu#%f}5I>X%KSVhM94zmn|~0^pgE!d%nbF**Bu+=k1yG zUF1PmMcR&|=OJ(F?|Fx+Jw(KYcgY2POX*033`Djt>uBAEUpf*rL)EH0@249`eyqF5 z{K9LgiV-gw2^dUutQ3VmD|qBC=NytwUZ_;ItSs{9cj+#MQd^8ityGk@J^Z*O|sx3K1c&W-9b;|ja%mBo4< z^n1stD(LkG4Fwe56*>%{>4WAGkY|75~t-`r(a_`U>JP3 zVB*^=Wk}}{?uA+JhD7uWsT)~+Ms9W|Ook*Qon0NLYHpa6!^zb@^F5Ab*|3Lu+N`3O zk*%-mqnOAI@8SL0SDD?gi*a;NvIRo2I$rk8e0H}q02=hM?!5%FJn~Q1ziX`$h;V$` zeLgI>@sPSK$@2ZIcenIqYByW$@XDgc6a&C9+lizVwQ!#PC zwSLlz8WFm7LfvfI;Urq)9{LQ;7RKtj`d)`OH)P5ce>Q3E4mLM3Ny@xcb@6&n??C^D z0*5U2n;zx(XUAAw#JAE<>j8!YUe=I15U?D~GF zy)JWQ@v*kG2@Av;#O~@AH?CN8A4H6-;x8P=cUQ`%f;z>)VXHn<0}67zXSw4UqjZ}C zm{n|E;@(ekoaDAs=DHl)X5L7wyx8ll=I3iSe;lWFKyK-G&Ff0FOhH^_;ErbuC0}1| z8~01garWfbK2_OuFkSur^{`oM72im0cMbKGQ zxXGs1u_BAn#j6buRJN$)bos^28FpdE+*nJQa#(9*Z%=@{b%}|nqP~5j4z@LpFY7G! zd173_p_LNm5A%Dmi!Jq^X3V7OG&YU2RK=dY|8Ph{unlaHq+qFm!6PQ(`Yz&WpXSrT z`r(fuotr5av#Bk$2`RlBZslVd>XCyIl3lDH=^x8af89G&-Cx%8IB%_bN8R%L=O^p> z!zBA?VJhv_3ZEa>)P0dooE^v{sRG`)2*Zq0`QXyN8>mccu?2H4Uar zriv9B=hg%USUy+3)9IeA@rhQO#+aCQ`6b%w_@<;mMcr1iynL|bht!Lf$b2U=W>XMl zznTWambodr{gbj-hHQHA&(3Wae;l(lMLEPlm)oS(XW6CX0K2a<%+Psizs9U^Ocr&jXc?)lcq@XzC#Xt;Z@YrCXGxa3 zZ5_YV$X8e8ORM9`jsc4{qx&O)YPY{_&#@WUqHDu~O?(?@psvoHyN5#bV918W%L!NhY-Rw|(k+ zPamvb&5aj7Eqh@fFg-s5^LwHvBK zwJG*%j5Qu4)v+XAh!j<7k4PwsNKNJGbyuYp+1!ID8-6r*X}ZVah=h(W&#G@4iCK=sP0BILx-O19cy?ZksD)*cVogA11{fJ+Pd`{nl z*yO>G&7}>{a;HhqinG4Zm(%m0pLxE>^^Ys@$9_EFPvH1t<2$b_xc5LvN}A6@(X^*7Q_>czr+$61 z{dKj+*Iz^9CP2uPjOld+JoyiO>}%adObosm)6#q>twFl_an1J~<7;Q`n-KpUo!qij zkoZJqO)r(z7mZ{;NifdMQ=N}^ROJ7VfR!-#o5(8LjHKh;5}iIdc^v_af(!^bG>i`B zDlAd9l)o9ZPA({O<;Zq{cOF-JTPlrmY-oD@>h>!al9@$17`*$#BD%I!%0Wi2by*Q%j#6t1nSh>O_gU_ZdEADu4AS)Y?Q}fSWC){ z!K?HAEVZqt@y)C&xAom#KAA4>{t<(zMss{tNS>MN$a45($C+dG&cS>bgLlxsESbqX za`lbK8Bx8%heU$%Pa;RHIV#60b~|XB{%Cpo8G{#h8I(s#v5MaP^xQ27xxXiJT)P@? z<6EDE#>=WnmC8A%Ic~}rEH_tHAhAw2{_MQM8-8+vGgBPbj2j$F!4R6w^HPTd|*!r+>9cIOzIM^M(+2_Q0uzUy#GGPj96gju!ud@0_}2 zxTI%FS(JByJeUgLjZE4leC8%>yKjy25U2kmF_U{QpB2t%+c+GNGbfX9oO7oYf87E> znJ*6E5RtM0e@z1k%nFDb3Hh-|8|R_Q)O9!@rw=W~5gO;>2dXc@pnX$?&x;}GRHUkV zE+mn?91_}ci%?2nD7ttiOe)+3cm)rO>VdSjTgY=J}CCf8o3{A8pv zzPIdmQd0I}W3brIx*aW_wioI^Zk)MrKL#5wa?x?1$?HH~xh*rjUa~*lgOK=sOgTO4XuL6wy?53An=1?9bV(W;izM94hz2cP3JbOy0yDCUow8L(XIhY4v z*E2bDLBWOj=DCFe&XTMcu+frFHL0Zg zryE~8+MRiR&=WGY4DRy1o%RTW^)FAJxH}|vV)IXzS@oLj>fu%pvP(S%J8JW4)%wQB zS^Uyr1wYfM%MoSpWbGG5Hl`EUQI}2-(YyS(R|7EtwYrESukwbs!dK4PG%q5*Xr&S{ zAzPq}1n)M}mf)pdwGz=j^dT{U!DLM)%8e!xNB0TyxWt4Ns$i z4SrYe2O%pjFF;^q7ZNY#k9Z5*A=&iJP|>Vqi2B>zh_*!_WP?-Ts^uP zQ8_yq+UGeRIWIjK^(v&wps_D$V(6?nR2g{m5E)+sDM*m7lBD)TqcRTz_(*B`fQ zt>UTu`9ZdQ9Xe~%Ez)16VuNAl0a+W>SWjB=@EVF5=fRK%E6)KO;h7iH#m%Wh^n-ay< z2A5vg{%~rtroF?ZI3+)qVSg}H-Fl8$e9#JLak{QBKO|#^)b#2PQ$KXmgF`by*Sp!rug2`Hr2;*qG3QuN`*TS+h-A zd}u(y#MkS+ihTBzXBFV@jx-)sr;ExcLWrZrO`UYj1Avs6aICO(;j!fg?Nl#2CD)<*X`Anm}ue~?)k-1A>v-WHA0fhz{ zKN}3UvHu*EqUAFlL|!*;d!je(HNU$cUbTz|A=i>FxAH9Lb)W>N&sK zlC7NWc?WLHz@*g;^9AWJtm?5_wHAYGC9OF873Jc{%BjuxghW0U;Akum9M0ZM=^l`I`&yy4Yw^w=dyyd;STK;*y6!30()3b|`BxJy zKf0uWUZHg+Rqhj4XHVSj2KF7 zi^`GUR1Bu%7VewXzAWA`a<$ZZH4L^3dnYwP68`imS$1draDxx+SQ`bAPd)z;u6TbZ zyhr|hE)pXTnxD8^Bk1mwaoP8~O)>c1(4|ty*#9c-6~rzs8b?9eL+~;W{OW%B;5>A~ z;{?v`xExGGa+kym9?m1jHTXn1^ZGdgH5XmOpJAW`{z-LQpxi4Syv_xRuLKL-zG^#o z*9;V99AOh^xX%)oLk4#HAZD365Zl&ikdd@6;TfG&zQ*43C!MIDZiaKl?PJ z{Bxb1`t9;X(^f7Ge*45Jq0=Cz)lhV~>f5ACn;t%(znPPnbRhTsqqmNC3{9?ln^)h| z_O{WhHwi*8*h4OVS)ql|yUC1D=9P@V&;G3~J&mvLH9Z`z9{5~(qFRC@)49C9H0E5s zspUBCxOypAJXq1xDxUJG0Ybhi9WTbm`p2(=sNXmy*RZi zL}gXmP5D#x%^VEwkkJUKw>vGf;BJYevvq8OOH_N8^Rn?TB^>k5K*%Do2`hY+ZMm~9 zOlE}7wfyu{t#P3DeEqcfx6e55-KBNxS?T!A7##Kqw%DKOeHdz~{W{@3LtH%DvPVA7 z;AWGH;%YSr$yNHSvU$m%_w;wCl{MB@y7;Q-q>J9;3BFM5?q4wwGX{H!53AIt%2efr zp&1jiE#F%QYJkU`t+$<*CI?1yhswk<2WZoupIVsm&V8Lt&D)fhBCl`gK*;#MjfI1> z*v@5>S@6Q^H_j)A?G!OTw(iuEW9M2DEa?~@yngVV!uWitLwM0WeQ1Az?g@9Y;LeK!I~+67^ngxa^sw)P&lfOn3>rGH3(tW1DYpp0PuErR_5eiQCz3v3@-sgqOFa6a!DVbT|7Lr;{uT_PR@&y|l zUh3?uc_5Ke@R3^ytDbi@)ZE?Sm9R?XvR#CnmMjGsf9g&8g{)4aql)p>$D8L%G#Fo& zcXSx=x0}3nf&XL-zWQCJkkz-X^odl#3=B>wnv!6sz28{3R5} zT-n0FSKv-=I`0aO3ozZg>hA1Ai;vyQ<`qdGS!u>`vMwo~s(ZFICC>@P7@G8nFO|pT z%CF{zS$LXLklm5d6*m|A&YqTct9oTE7<1fSTaT=o2(ZH zC5Xt5SHa+SVb{^Q>VeMgu5LNs%j^x}vQIh~Or`u-IQ`Kt*z$Wy%-On^3&YD&$9Mf; zR|PJ?;G*_M+Hh|dEBc47Rr%x~d^rT4fjsiXLF%VkCq5rt2B+a`A_RS1eHrJGck*9w zgf=R^B`{&jc>*K*tOz-^vj#Z2gwH49IntgN1K(I@k+r`AK0dMW$M#XgZv;sQeRhW`M+E-Si4P$wn;%AXi6&=B8V(%v>a_>wSSw--qOL(+XsEUEUV{eDG$8AJ-=x zLPXoy8dqy_B_gUPia+~iF$f`#6N*9DoTd3(_GDO1htFgiN%gEg#eE$V_|%D^=TjkM zFl~IO-w8@<%l+PCl>U{`5OQu&JJW}^>t|7#H+>Ctd3#vj3Gm3WjmG6+@W}aQsjLOz zt+FAT?VolUdM}H|;4{pgH!Z^F{us@twk=<0YdwWT~abJ3+x4ECZvW->KtBii6B z)=lP3M}~?bcUz@CWw{9)Dt(m^t91pOUNx5Hx6f#t*{?xgTp6AoYz`qZ0s~1capPOF zvL$N4a`~(y1L_M2!ad_6)l2LFT^3Cu)-acEtG?s;kfPXq0t@WVriVh(`PtX!gD>h|k>(P_^p{NY>L6 zsfpf%hOVK>pu;iX={+-sCi6SU6LB9jhn;uzTJrelv~kn=nN+v$U7i+;m=*3z%b#gp ziUS8;Wv9xY4X!B9=<}3~r$&~%^OPJJDPR^x|-Kra=K*vbFpd0Dt&OTvs}J(E(p2tiY_6>_l%)E=&=xg z-``XFwoxrlW+4W@pODyGUob&z-8>};PpPd#OB;OpA*AM)Xv?nlr=llz?l&>gW#x8e z4%qAj+d9~;C3G;@=f~BvNkl-TBBWkvDNm0sF<+BKNoZjc1Oq z6-@V!b6{?dlKa4{ur|6iqr#%JA+{m24}+81hG9JeM^)pMwVKM7ze+!O>Gn{P-Sh(< z6x*sOf87>)k9v6G?&%(h;0q&UVgKXmV`;(IE2e4UONwlB!g`st?%?o+qW$SPjJ&2)}LQO!7{rYL&izw%&T4^!%~(OOv(uD zN;?UkRlTUD`~!obw|d4lnozs1=L$JL&JeLp*5S;05SVnOQP8zs&~I?^o$Wv|t1<|=Ee9%dDJ zFZixAsH5lDKELx2`?2ZPoqqCfD2oSjSjX8Hidem`R1#{xR?5c~KfT;3HFVL`gJYm- zqS2lExHWkA)FW6;?s92%DVjUCb~4?tsDf)L(+gi4JAMAyumsqH{Q%?`O!+-()~I|ZPI&hP~!TR z8;mRBFe}{x89T%f!AfercDMaQv(>EYW=}fCF|W%Goj(Z=9GMbFb>)0|^17p|&4xK_ zRFwB@!j|3_oR+%F(lut|jV_M+m=v`L}}{2 z%?o;6byrlva`hQG_XZQRjb*tbE@h8-ZtO>?51F$ShNs(RTx~^QA`AL~>rFezllvssT%yJ#KB%!xS5l!7$qeEUHX+ zr%fuOMl7YNH*&3EuVgJ>Tq3oY-K{kL^K3b*S7v?R>sJovR$l50=lPWsx4PP`7mrnU z%el7xz8bA}hU+@k%S3K^WywvIJaJd6vl5P--R+N5Obn|u5P212o+KSxr)luh%QSA` zZTW4P6Wib&jS|*{W+Q55insLIln0tOExSMTw5Y$vU-4#M_q(;9etbBoq*ppwcXMA! z-8Q!&=!x_eMy6p)s)s>zGlN2FeP5I9v>>PePn8#7C3g~J16%{u_f!8~| z{(~8#R8(PO!@-8uTE4W*R2bSewi}tMeN6 zvz}9?^uwM?H}eL|)_2&_?c~y^AJyJaV5)pxBa2!0xN4l$(|9avUe9dygNkeok;x9# z(~AuUBg?WB988|RsFew4kEFwffxKA5j<7 zt(a>Ep$)qQ#hS88t6K^re)gqFPjyNkNv=Ar(p|YntfHd9+D9U^Rp0n9XQF(mexAL% z#De@uj3?5UVzau2BpKA(yboQWvtACm|=Uo()h*xti&C|gP8F22BKeJI7?dl7PZ~@3S`YVoz?j_>f z8Y$D#!8>p~_Yn>dWRYfuL&RHIVY!MOvAZw#7)LxUAX(O~c)3Qg8*$zf^#vk!cF@W+ zVMh;yKEw4Vtf19^X8_QnEn2d81sBE(;+!zS=%xjsz%+yiyDn1iz^DA6Ld*{}JRfN) zufzGb6+Ohu!Km@8iFz5a;|KA4xnKS8$OKuTd7W5l>?-=$zLqqj#s@2#S!`)bnNO z(zg!BaX5W?!`GR;#)^)n%y(Ha>WEQ6|F)4w`S+>&6l$0?L%d!Cc_Y!ub=%~xV)m-d z1M7cTsJ78HnIg>YX-px@8Y*^Kk9Z7b7*9$*p@zydZ@p35CFk zI*@IDu;lm}8sn_=Y)~rPO)m!Ar$xv?%HFzBY5`9KDin zvLB$$mOC51(xRYWHm}SnUmrr6n7KT&AY9y{AV)f1gD;s#ze5WVyzPt_uIde@UZDmJ zzG+BeoTNQxpBp%r{)_fQ_N=5E^jYHJP&OmHXXD_vzS+FSinmN= zt20r`Y}3#ISo)3qp4KE5L$bZytkAkSELUEiHry<8;r__mMc}^>jUP%@>zo~FvarID z^|HQ^y1XZ*YVyb&?&P}ll}DtMAgYol3+|jzdtlgXI3s_ElG9iSH8F|@{OfO39FUqs z8M4^X?8lqK9!wdw9jeqboNBUkhGnOK<*DA=ZD;4fhNCso2jtqiy5=?&?b2T(P1bq6f;pT?Be|sq>WUb1D4cSGzK~uG z#@>#Hy*FV6_mRC~CusA!Y-;WgFHG+o)aC4JQpe7zqLs7t&OnMZ9c*Pqvb|z+4#!Po zw%%d!bIsY5)wZyNw{tJ)cm2XL$C9@ zR(DE#-_4;72Fp64c~v9F>z}gospBz3b-d_q?!p1skg_f_Q$Bp4t$n)8{*r4_s7h?X zwZ3yre&tq$OX}N)u1e3xj$2Yw-%46GZigOpGb`_W@lLp}XQo+Ro|gN`K%DzAy?t;a z!%OroSQ}G08^=LbG#jZ@~L$KbEAoSdJ)e z>foxbhWt5Etvqr4_j(m)nxb0;=H9&zGNa4ko$}Wt)>CU8?lZePE*h?=TJk+9#|*M~ z{KeM1(mFG%PlwUKPEPR_8SIzV3l}pIZ0K$2X{)j*k@rR|wum{RJ8_s2v zXzdw3X*eK|cGZ8is^??hsYD3bG-X5m!*2Kmr&NL^k?}J?T5$x`3hoM%IxK*CwsCt@ zRt%NXe^z^SHu6MSK3dDn&N-QCX4kU@6x3NW#D+(h%ikn2E_!`VjK zA;i}$l((=oE-|P6R8}=Et;ytR_8b>&;=GVs(NU(ep*@amZ*-ET+Sds=H+D+C9J&vg zbgyVss>&QI3Ys-qSe;*W_W4Nlp^IEnH=Bj>@wC*^lyZUOFrYuDmES)b~KzF!ehgc8gSl>^YQZdAN@cH)0@Db zGlA&WJ3)BRadrz4B@}Vh!Lj9Ib5uQq~xI=WP+$EZL zn<9GgHKE5(w~2_F-X?)OL$@jstCnJ9346HLJy)|kK|6llP;ghDCL+atKe z<$hC$_dE%6cMykk0x1*1LKoNY4x;@1Od`Mh$vq-$``vv*7?cn-o{0a^kKW^ASXXG- zFlG&i3^7-tAwf<*p~#}rn>c2S(hMRLSa|of;}sJ2z9!xqqAlCN-z|zFEQF1SA>xQ6 zB85mJvWPsQgs37Khz??am?Bn)J>rZ^MrI?6kQK-V@JjqBauIoqBp|tn01?}3ym$8A zZF_I-{k509Z_2(C`||gh?mw}=XMfOvwgY<)>KrOKbo21OBVk8R9{YG)>g2&wnh|x8 z#eC}dkKD;yAR-p*2r70!P!Q?8_udIDgphX0^M0Ih_qptVTX?SO)zQ&1d~2&F;!P&>qiWMb@Mf@2b6s$#@qH^)AXosZoSR~hGi zvFjpqY1L)?73LM*RgLQ>ZVcVLe0zKRzI$m2#!0+nsVC=CZC-6nD}VpubMFr*FRpN; z>~(Eci*(PI;kc=Y`8fVP(FY(2lwPY`q=j9vVD`YK+5W4Gk^4F?j*r`Rhk))No&9PD z>kh3sdieP6P}Q)^aN23_Gsn*!j&M6iIbU#oSLA5qo(t6%jG|(rs-h&KH^N<%9^DYl zj+O>Z!Hr-bcoK{S?}AUkci=ZL4=h4@rxol1`@q5f^^LT!bD00S2IPQTZ~^3jyd=gY zjC#_x7)(`?HXp5*lz9d|?3fh`Lx)%h2MMK+h{&KMM1$lYC0PD+pcRk>v<7m8e4u@B z_g#fjp**M?!o;kMIS}(QW+KKR_EoHW+>1EJi%S<Z5dM0?+S_@VPBiS;?2v!Mk^=yo-J=Aq=roN|M>Apu57~J9NrhBF_cc!|^py89o(%{|hL3vX`ft`egs8awy06(MTJP~>ezWSbrBCD9yTAB~a&!49 zeXE&`@`w8cROY+*7WK(3R7YUW#L?4q9b@ucfqi=4 zwpOx9FU10En$~^gYe>Y?uUiN8h1XqeRavE%=B0nC`F(!KfX@qqS&?}^%xZ4PA%huI zsHnK@@488*YU9~ju7iJF}^25pJP^py+}9K$UT z{EQ0`CW2Ib8zk=#vk}?A_qd5hG>XIDaXNDS^$`Ro?Q@;}r!kaA5eMzlS#v}chIU3E z8Y#3n8_^sTnJ7f3GO&jcMFDjgAP!@}fz2SI)4GQ@mW$4OW8R(5Z8Dr1(K3;1%4{aQ z8Q9mNrgs{rNy%kBX2(uc_ND#v3S{?yd-tIw1oc6l2bGHa8ccBhVKX-Q8)Adl|&Y!Z3 z9*=&BM3t@8lKuA8B9v=7ud@qhHP=-ShE5ooJ*12i&dSwD4=js`ICg4|0jj2Nt?&+7 zu-$!1<};Z0uF|o@gi_qm?K|01DM9Ucz9t15AbL$)W>Z?vK>(w3R{?BTykBRkS@qYt z@4NI;CD$*Lv0>PYoJyHpn>;Who;SLo;$8De$rj@k3MWhL#iCmaRkjL_bzNfK!kcu4 zH&pZL*|x;;p?IB8d^ScO=qj-q_8jUS%#?XUKipk9QK{?(yi!t?bXWA8t!&>yzScF; zeGvN@=PJ-~)Nf(^ItX%DwfWj-IQ1q0qJZKjX+ZTBI^OcV#vaKwG+ru5)C~7khS>SF zZd!_FHMC~a!Rv;8ihumrIyOX#VhP!d5=QLNxWP6qK1c7PeN?tm^>$8Vd7CJ#G9~CJ zWr%OotRMQzb{RQ1HOC~QqF0m|T(NzJzviv15Ne{NwPp#A29I(_7=QE1(v`6aa|tVt zt1x}zS4_HkcvyHbi2meq`86HOMD=erf8|gLau3Xt7)A8sD;g&pnl4PeE!*p=Zk!5i z!QZTDQ}rAF#kgpwswx0iX|LBG*eK%HE_t8--NJskR7%j&Jz^p|p=>O-eyz7Gzf52D zGsRz|LhV=oO^~v)3*byB2G$tXToBvR(Q4k$x-I1(%IVl4bqqbeuxYft)ZHvU zfr;vJ?_1wrC4kfuhXWX!2KpIZraQXw=pj>2O^#BkHnOWpl8utl$~$)X4qqS|j3(AM z&iHex7%O?V(NyvVR}b9Wva`w$6n`>O$&2`ll|^gD^oSp>i&?f_8RHVP_9OoL=9D$Q zx^|+*pmc?D)$Bt;S6@d7N7ZetwIg5Q&HQ)vysR^)j-;q_a^dZa=w{k8_^s6>H0O|TJNnp12(e&=p0gk;MRo0vQTzZYUHPT)TLn~sY{@G zeOofxmA?uwQM4yXVi!gpEHPW|o2Q|QXP3yt)qgPNlkO6Gq<=7_1~$nbP|RaY1MQQ` z=zh#tPx<5v3Ci;GDLTh_9^h@jTZnL$eT_}J{1#s=s%n+OR>bCx`(iq@XC2g;Oxmof z@#0f#0(**n2CI&5;9QkHGGjdrhKOtfn3IRpc$#BedW);Ho3xtRp-wgsz>sG6FpFmX zbbVGut7LNzpjze@R~EIU8s3{IM{k`v$jWE_ApYz#V9Q7)Hztkv61}xA^XdF0^=?4l z=`X=ee22mqZx7Fmc7u!-ZPLUlj!!*n;EY|7)svbc7bvHR_^e1({RzGl(>$?5v84o2bg;I1fu0q?IeWN1yImg#DR-A{Tz7!3+<1zTjy(nw3}MA z4r#CKy$N!^!{|Hsa4CGFS+^-tAyn;+upNQOiFTwRissIL9$#=ja@`^2pC{-#G>eo2 z4QYr&rzWn3_*-lLxnV%OX#w&@cg4FP?JO0`A@$n6-$&YUvr0hnkoX@yD12b(k4wlm zix-8%6ycwS@v$W)SA;Jn8?ISV21}KpQX+2l~H+@%(Qnsxq zaIug5u`#(D1&;N0@uq4=uLwHF^oEut3KqJl=}qG;>VHtO-@8Sp2^9?mH3Tlnb62PuAqB)13Ug6k0%F)LG$qYck(AO5tQ(-AVAg;nXW68o?m zA^HJS_@!n@xGTMhaNn3e|KxSn?9-ob_!%PmCu3yg=)XivNb$24fDEsrwixw=!j#T! zZ>!Z;7fi(%MWD{0abgc<+bf~4%U|5w zE!5OJPVSe;zU|^n3(-zg9qYq*IQAXy%@TNG!3y38uI`~sFY^Hn`ijH68`@P|EYlpf zt@j1dd!dlkHP2y^(F)APhA6G|gQK%X{A#y|`Q4Vp-aezZvqK#_9~SW}ijFBC{}Snz zTv9(Jx)KQ8*OMTBfc-_LV#x%kElmn`tNmO;(pFBN!0F=~H zc3b$Ww2#K7B=?%a@0TbUPQo0cvn3bSkR>%{j_dE#Z5r2c5XD{dJkviJlZcroBF;cv~{W0E+A5eALaXsIELrtM3K~=G&9;?1pYZ7gtpDvfn zU$^r0wvM5Z${A`Sa71hiId0UI3m%^w0D^mhrfE|-PD$u-vzi{1GUW0_Bx(L#O?I;w zj$cyVQ}br5b%vKHvBpGe?2I-K`)45IPjK5I;^^Y3@$1}^W2sy&<~08}c66JyK%bA( z*o0rIXc;2lWfy}O@-j!UwY7kT-&7FEwzm`YQDvNoWvc5xlu)P^dtLzAv=$U+6^>IH z1Ad9phuUOkL~k^rPAHULkZzok9Kt?gB+7uYQ1@Qt(@U!jisl8NyT*rMcF>II6kg5n z5r!d-(VFG0ej<&}7QHQFHQa)i*y}WXK_!Nku6Z7H8BkpQhWgM|!3*Rb;7t>|PjmpU zzg=3`&L!}FjAF?y=HQNoL+s!9Eo;m*S6C)S6xj!_8ywy>mo-Cw@<^;#a)xtUx^Fpt zbmO23;eMxumh8knj<@$$GDr*jBP#t!cCYrM*=4?&Od9Vo(SOD7s`J1`v6t50#Les4 z#>wJ_a(?}FEAL8C#pTeRvMXLnt#VlCC40>3@fYNZaX-a_96CXuSMbRpNqH7G>Jru; zLDimoLWtE|oVYBuuXD&Da{4^~DPcEt^9qdgRzk-T_yC+uMQ50@d#+_W;AIKvlWj~z zfiLqD6&kir%JG$&?=t@$S5yOwHNes{2hKRc$Sy1?mN4iKM%a0)L8n3QR{}8 zV?4wIV&^FyKYM2(B<4&w%;5~sW*O=NaV@0$5a+=<$~*xsAX zYtNaOPX!b#aN>j>C(T@`NZH*}Dhpd}^!WGTeL8cJJ^ckS5WUl&q*GjbY6+OIbE$;Q zGLS6WNzk2pPDzn^D6eDa41}vvr=8~0vGMe;y%FOlRsgsM$U(6n?dOR4R5Ol7b_M%b zX2>3!LsSj2Yv}OW4@uPwX^3x^*7^m}jzd%gOcZ=#DIjY4;ma08`+bt{68eN7Am^Ee zD4$g4f1!dabq*m9a?ss_sL=vRDx$yDPLUA!G3fI_1TTg9LXi~E%4$QDnCFb}SRkOb z|22X(s-0FtoKrYB0Qo|pie$v8RTE7@oLa^e0$d-)Zws9EB3}`>^BjRIf$Q%Oya@8(PWU_lCG{AhEp6{PAeZ}U4AeDRfPZU}&@ z7Q7ni0pRc=QqKWCMj?DYP}jQ~>4AdhWynTrsMJH`hELCQkp@H{;YSqyVBrrAL9PCw zr$iXL5+bN%7(tbUF;p6YqRK;xFpjDUX~1BhE@TK9!&s^nWDBFI&d^2}PxXTWp#9KM z=rj}!f!Ck}=ot*F{)Eb5d~gC4wt+^;}82>Oj2GQV3K2Kk(dxCA2K~4-^0Yj;I z$PMy>w!tHM06GSpfkVfx!(i`o=p&R1RYIN6BqV@nF$OVCF}q^U#yp7m5z`(ch|!Dn ziH(cRik*%%h&vpY8OMVG;1?GK7x!PPzqI~x5qR0-O81rXS2eG-T}!!s^oGYxyIX5- zZ@qIq{>NRh`(X)liMNxSlVwt{PiW5^pU1yMy-7&($k6+!|Jm!?<1C5Xx4-unx|Fz8 zoUF-iP;PzJxw>y^=Em-dxt@Gy^eUW=I8ky?IzwT%>XIg;H@3pebeH9R8`m{> z$5+nsuHYf}`gKG8`>`x5d6hc3A{7CyzqvJ+lBZG^%qD{E>RItX;IBl%TZd< z8=^y^FGs(K&Wmn}rbi2+r9dsv0$c}ffl=ne;As%D0Iz}fU?~0t3^r%NW15SMX*pO8 z1M*E^8`ueU!?5#zqbh{u;c-opqhXYZi||PP8_T7npcIUJ(jgj#oTMF#iB3v919N!7 zz%w~%_eBgA{5PNf&1T_Fh!BPTH;<|CES5v|Le!!E_Cl;-K;IeifD!3HCM1priHpQHbc@$F?!;3MC4UPRCi;DA$`xd8k@y6Jt?ny0{hw?vT$h(n>>u)h^yOX(Pe)Rv)?}ryMfi>eve52m!~H~NLTWll?@qT&i*V3?z$ia z)nj%?NRcCF8mjRjA}`mq4M9mJo82!yc=-)YWBv zxmZa9JkYzQ)5RZ?(b6Ji7O86^C>?#DumiPYm? zkp{9iv>-;w%Jn`7$e_kPgsAKbWJ%%k1ZuAjAy0tr(APs7T#o@)H=YH)=JKjL46!~bRM5axw; zm@q|tlQ!@9AD@9REAxxk*h}8of1Np|C8l))J~Vw>`NN#$lt@l)I%B<1lG%|$E#KabN~cQ` z4vskbU;JRM_fhYeVlhto>{*pGOagmjNo$8GC;~v)N`Mk)P05L^)frdfQsDEV*#huz z`DX1#VqE7@DIP0P96lo~{f1V$?qh(>!nfX(VPZk{0@W^6_qx&t9{{SyoC*m4(5QXI zcH{4%rBCxrZj`hJfP#WJFXfL-;@safr0NAMNb032AMNF-zDc#TKWr!0w@-Fn8xFu} zR~i|W{T?r+tNF#su4HAw6yOtZ`7y?-Rb_UQ5iO(8uSKN|fF8u|ZJPU3B<3SNhI{)= z0EVryr2A#0Po}C$2ofYD0&mz?x29#Uk>N`_khArF5CKSUbjQFUQOQ+DFdGUG5|73E9_dml|G+rAP4WRDg6=YWiQe+^+3l6t(5reoda}{zD0*DhJb0Gd$ zH)5CeZ3mI#dGYnFh*=u+jEZ;w4*t8(nR6qTO?HkWUON}oFbrRClL*~1eEy5$LpErO8z_Z`sw_;t_#a|dwE zBtrO<|72X4N+ul-ghSmvsKBuvzmnj1xBn(V6ULW%Ryn?%wt!(+F)>a8@Nr83y~zr~ zRko=r0npWu12*56-_Od)bq#j#G8i`0J~)(J048)DFcb0qA-KJ?Ui?w%mrqus7i2bX zQ^$>Ry~!gY_hC}S7Ghq<{J@^Y?|526MF*-GfG}MNlD6Yl7SO09P~28j02(|qVQ!t> zX7_G>a|7BvZ2w-kX>D`oNk2NCa*%$07LF8^yDtBZ72MZb(>`NErBvrFSxN(tZ}t(G z#jhXdPL0QZUu8M>J^y%d)@W6&-=tCfhwt?gR?{%C>y%n}a*x3*ZOwjoVpeW_Gh8NJ zqflmk62NN_0r)?78}wsm^t>gtr@LSD56-?Jxiv%%fV5h-5#G$}PHd73m}!$ca|Dit zFc|a|j@3#l7X*CN3KSMVF&_Wof2z9t~b?@GMO>OBU7M`>BeV z{!M?@3xE_l?i0&CSYJ%6w4b=Zyj1d@s-pJ?dx_#hso65pqmZ8xOdmIZTM_WEQ^~hp zZ_{wd&B>)syBkek;k_N1C-PNY)=4e6@=xnN&Kk9#sl|ct*fuS7E1K1$kLS{A&{_J0 zyo+?VN!|>+AwFt3LF(Dt8bCPOV@YF;mn0hIV(bCbBq1 z0R9lEeK{U@I5#{yhAsHKuXF#i+MWkZ%(2U@-JM^iwWkhf6yDC}*V}K~AS2m2b(50A zfP;9XK|h&NkLJ!4hu-mt)jYaO0URQ}NrcYKCWq@(QCkWXAJD7>Q2|bvD~cvqn?+8C zM|blH9Yu)5+O}fN>DtrX!*H*B+BGGm)yl0w{ZYd2O#)17*<;oP*hezRsO${}FBedoJ_7 zdzVr)&%(~9N_*FK^sdpc^IKl%6qZQbI9gS?LE%*UUxV;u3|kUmHz-?Wc5(7dAK1xGpHjzY;#8 zt)h3h_EZ7Tl<0s6S;7;2MCeWukb}X%Ig#ta@=zltqP2mq;a8D*-r?5iMS@ zvIAMspy#ZE$aQ}*avxMZ_D_4G3XpQhS~3S||98+sI0Xd|@l=Vh0P^1I2J}_H4i|SD zNGnGY?yWhelyPlM>uByRkfpl-b)84b!h`sQ{W1rU4kJ4lP%Dn^sPcc z{!f$tx8e!&|HU!>x6u8U|Cc5m89)<2QWs(E%5_g+{(ywS$l{HQ=7M7OY*2bmnEX{K zxnBUS!WMvlmYcH!8h7!}QGq;V_McIiHdUQl#Pp#%g1M|^m_M)6eUshEm0?%!$!*Wk zm!(JzWwgz+{cB%T@GT7Y^*fmd1beV7WG40f@|J81yiz!tQ}vGxrTgcz4Gi8)s{NPRl3wHLox9K zO_tN2G-0+w+clG?r%tIoQr;tajf~M0b5PK%26n-5jd%U`Y2xJ7yN8ze^SU`Xo0)B; z6V51tM|F?SQdch8k)^{-o=hv)E*K|13X@YEgc*D`Lz^5L4l_2;XrRZF^Wkx#T5T!lG3{t{{S@^4ux5+*hFe@D8~M`xwKkh}59 z)sTim9?iE!Ph@h~Y5UZ6Fk2sO$%#+9@}_|JxaQ5pE(Z_dmHA zF;{`WOaE49ryE|vazL^)9TDuyfw_o0U&}-412%o@g_j-9e*YJ9uy@NEVID{f*dk1z z*MVDC3jY8M+ykJACjmfkrVCKh;Ri8bQ+7j1Bvep&9;&#r5767W2~yn_2^FTf0Y?i1 zfNEPm;LVOxa1iiWNLD_S2siQHBoKpNzlD)S5t1IIVHClh^an3DzaoE$OUk_ytN7Di z0L}*lSbd=FlV<7Z_jFVM(8YzDbI)nCEs?krR+_ZS6XbUQbd)!OS;D?RhY;m47CNxn zGIdk*mdrHt)$}m3hB?^&v@tU`35RE7zZ~aflcSlL5+f?q1w8V)1)no6w z1IOiF1~ae!uzTs&T$Wou=Tr@|=F~YiS!{P&G*JMUZDA5te__4cDxgmt7ENACLsgZ^ ztFC|p!3jz$%v+L}X0Zw*slMi$7EsV5{`avB=&pIpay=jb@iKK?uVma8P4U^NT~b>O z(7`kx$ZU{CdAEap%j3x{a6jtS*9$B{sfd1O9S?Fr3F$^d- zTfRkd;-DY^U%XW~Xmw4V2%ZRilp7M}<8|Z_`we<#Y=w-G#?dHYIb?VH-{AU`qJ??D z!R&?bI#l(-Lzp@whZZ8`O$pk-K4Hn5)G%QJHO4y$Q()ZsJ5u3w0utp7ggx2=`92Q^ z{BF8InpY!%qE+Xi;G*?FaLrzT{KN(NzIXtT`4a+FT7*Cst)rnOS!c+r(;v!0xkF!^ z{F3(cqLomRNi{-}4k2hPTmq-w+;{l#M91+ctz3Dt_}T?2`@XK|N0%%WjdTKT$P2)~ z3kP#6U2kFL;j#O$ba>XO;RSD7&Qtl9%}osfg}e~~Sb|HzHOq8jvh`Xd<75u=Um4io zzVwN!1&T12zAf~0?3dUNvztXem2kh)DluJv*`1zQaS#$9;PQKxec8y}y#dvyWYm-v~>Jmr6PR#C5gZ@CN`Y zNU1YBYzY1^aN>3ur0H{JuGIHQ{jL>&wWutGZ~C9qOL&J8JAW^I2Y1b`*`gTXubaPE zyBpY~zh3qB=7YK_E8p+9AK)Pq1uuno!-_Ql7_FHr9k|tu+XB$LjFsX0_W)~b^mqPG zJEgJSs!}%@l$nN;gT>HSENM0*t3j^WQ~*v*DT0xWTX&2XXy(gwcpDF`@6 zLZzdr3v0S84bzQa+wdjU0tLdxHBy$w<&%0+6^qJD0(bD!Pwz)3Va~C0Wrc$|cS9u~ zr1=ZtCq2Dit%Z4Q(n1=-^26`HV@F*w^LaD=ts{HjP}5_T8Z=wXWpwxW<+b1E!{#Kk z(c<9OfhMCr3V-3~>Z`_(Zs!G96yUSd6m3M{hVjT>q0+4*)A;evWzB_^cDj0wHXZA*t zy?{qo+@SFse<0$^MnJyI0l>L~fDyC<_;YvWE#pR2W$VHsX6xwZBWTm0Mn9!)AA@0294qN6KwbN&nwcnqZ>YCqz1MT1~&3MIXSp~yZ4|>PFoVykeoOhJRFYZ$fHQGTMkn0_< zSQ_U4q)eebN(UEV-o1rTsuH?)>Hzi&EHfmgopzD@Tdc!ao7}0+R3lw>UdL1N0*x>! zKeC59+}Cz^^$e@r$Z>B~80@CKG&K@)%_)QFq@S*%sk-JEtThMM9?APq7>Lc=@JKy+ z{JHp(vE3&`^{-F;X}CfS{Amq)?drNY>v|gPjlZD1YSUlX0kzBU0%SzgY|2mo0pdTy zq>iDydHTM&^kv7t5u=OKZ=V8C`nX@Mt&AUw*4wk}39tY6+byeF3$}1$`u#tIclMUR zjB!=Vxb?(xncCLVGxln-aZxt_C}mNCXIW{|PZk59Bgv?#=jj`Y@LkrmPxEr#7Uh|( zc(@(ry1@sF7^5SJBs`uqF9Lh-VFp2M`{|{8E!Mh+2T@sL!_Q#&3=4;UwQU)kQNLX@ z`2C(g02vFm1Iw6jU~>5vb|>t0IAQ_9XtZ!(7^9_##s`M>l?(Gg_Pd;AVX9g7&wsgu z7QUni01B=5BiHj^UPjVl9^4zkiU|jTkOI}~4#E@~JY9k073aN?8;xx?Bjq2XpLGnsD6)=cW{1)Apv68mu zTI74Lo?E6T<{mv({`+S{Eyudg9cJFe%8jx0)`@5BpZql0C}CM0Cu#|NQJOKHnc}Kw z8f(Cl)JClPS4&yg_@ka?I%VUko)Z;6bN}jj^R*AU^sT&MDxW1G_o-Np+mIzMz4S4G z*l<%B4U+fN!Q(j)>3o9tSoxh&zWno%kq&Pe#@vHbIb%NU)oa$M3&1;7DCmRfeQJ|# z_L5;Ki%{7a`D9fKEAhO&4~d`_@$s77?_QbWqJ;svt?loXD$k-Kj#{K!0#J>~WqL_& z&XcD+%dyK}eyTzI_Y4h>cN=#ZN2$Rk>p*7&7_P^WO3U4ASqF zC%m>ek~=9^o>(N^m3mP|qylD=QR>ss%4(PFdnHJ37=2Dvk~HKthrbVKBmKD7MS&U=6$0pG4k7afD&a?yh3%y zt3I94JT|Nc46{k1lh4|&y44JVbp1iDe_|obS0}%MB(B$jzW&fiIq$gE!8fd{l7Q8j zwR2H+`a^~b^LicgsUrhHO9?NCvY-IA?+?fq>HvGB6%j#XJu`&G1SSyPeijkPX%9an z-Iw(iDF@%X3iA#(N1B9bf#G{(jRfAj8AoPD{?R+aa)9TG++VQqo1XAKNJ9&;D7=34 z{BxLor{9H(K>&(B{tr4JFdU&gwy6iN5|-2k#fd-(`VXl>@B$!b2zrQQuCml>-TWKX%v?;CDeVk|6+tzS$qeJE4Hr%G%_O|Z133-!-S3Pw*) z%Mm^(^`hQl3{a&QL#`-oH_ILOs7sWl!@LdDC^M-TP&`@XhWu{UdkqwnN)5$Kj2og$Lt1amOUF8nw8D(czK!8R>cIv>_8K z7Oty@KMb6x5-2LyZ&g7pT1=R8^jWP|w`4Om8!=QwP8OyVhg;3hQ}!9Y{yM7r>S(?n z%UBLPPSk?2kk>uy4~?KZrR>EOMftq$0is5mv?DG9&FwjlqnayqZlPgu3j$iN7W0oF zL653Jl5L+`OEw+$?A!9L(z;)z7?V`jiv5k(XI)z;sFc^VQ2-Vs*s`LNGu)y5Dtj%Y zX5JRm1+q{F%Zp~E%1CQGf3Q(vV|Td z6*-x_VHg!&lPwTsKE;iqu89a9vqMZJeMFKBtGA7C-{QnZOJ+0~$1RUZ+K7WeZgl;K zzn0B5=%S(W-j&p?O*Ej7^p~p)q~#n^8{z4Q1=9Dj)ZF9@;-}HmWB5(aq)4C6XHs zJ3sAk&N=>ru}7h4wyKzVvfr1v0F%~%_QumkdNxk&Nq;;PWoa)$S(7qsRPFG)fFv?J zOftvpl3i}uoLjn-hQJ0472?f*vh<Z;)XGR07>xGLuM`9Qp- zm`2~O{xdqbff_N>X=Cu&Z*dZKT)d#X)$II$gkdrMncbg;LsT1Pa>lN@^8~RPCBe(; zG*pJ1rb#oY8T*AEwbmbY+=S(HEibPB=1}ohzfH_OdexX7YtF-M>3gnHk<)%tnAXVAL9`nC(}xhz z2!;Dth-ao`yR1CySeqtTQesdqt-Yv@5#UE}*XU9)zg4MCydOk&oWpE|2oo)5W6&CpY+pduOowl$q z6PT3Rk?Gg!2AYj%560=aa<%gD3XCuMHv=Tk_i{8U1DMN%znFXCavI@_a-&-?G1hSl zn?*ARbqC*Zy--8CyRok)HkjaCp5RLJ50wHGS5wx^`{nS>s0GXU8_b;yJpUpuF6(bq z(9o-T_obfIOEx1dlxgMuaH1h+W%JP%zge55Cdr#K`T$4&CH<$t0r{lqa6onB7dX?k zSTdr-iTb=v-TIt!TdsQ-YKTlz?j8&}d?RT0t`*Ie1Y9(!5z65-R}t#uOZhN9KO z&m|S4-%k#yoT&Obz1&nhQAOKId8}JEmuW_=HpHB-9hZ}HY-PiE^7muK1|<=5Y0Kur zErx%}!h-v%eFJmD<()X$jKQ0q!6aRr#KQsdyOO-SeefHeRLrov;Ju|;CLz-ImsgG4 zE40baS~N`mFe0vd+aY+#is~+3&8<)WI{RZq|5)g^>d(ntZ^coN#*l+ln01+|r{bpo zEUEgHN9PXfy~Ec%t#`%H{3S8W4d?7jJ8bhv$~LPR&(MOOsah1XyJb2~e6S?aH*t(D zbM;IpuBERuK6E*xxxV4#ySUF2BdO>{_|)a?VNYN2L_12p zQu}1eJ}-lhB(c^xtgQ-p_t+&F)TLuI0ca-z63w2|)a=2Q7c)nzAITq8(AlI=-m`RI zb-Yv#&Jce4i5%*;Snbp?G6rL@Y{A>7!4+SJ?vh-KUqg`S-GF_J&g7q+@)7MG=aC0F zRFOQCfauO=(HT-EB6Cc4)=>!;;NIjR{65n7bb{E7_zTo-8QL(0X(gIH2FT4SEl9nV z8#I6qp(R#ii5HT0Em$@L8655zDUl+4e1|cSQWMADQv+pp;;RJbDMv_pjJ30sbJl1d zoXUXfOgoW>e#1Mwm_z%raD8r`(7Bj8R5}kRZsW!GP2gCJU{Q@#H|KJBjonF<+i1(h zJrpv>pIyfsm~5O&qt=jaw|z7{DX?2{w*>=Y@EW^Dz7w*VCHf<|#;jX&#tV3~*vPQ= zRq0NNsJquWMU>d=U&nH*wltsX3ToS`dSbQ~lb8f!@+MaPe8AF_&c4+7)zRgx+mIqA zrSwmV5r?a@T0d{g`bD%w6qm9>r|gNifWz&1Fp*5+H{Y(v=Pomf+tny8f&)sYQJ~T} z^2929CiSt}jjiv+=4Dl@wAaGkRQoU8ZH3>)8OjQ>J*lOhiy}7;34OF#e_9}3WXFF)Jo?d8jpiN&cwe{rqG|6U7-IB*bcLo~oLqBR6|+PCRm)tpe@JFgi0*rptMV1|`(zq=uf5N7 zAGNM#-y1#AL(bO=)K$-#hzIYh+X%qxUvVXIB9&63diTpVql|D{fmgV|741E(n7Z7N z3Fl!p^EcZ$!xN~rploD~2B_F6nvO_y9^9tv)UMiW#VE_yOd7NN#jKJQu!kh=ratL@L9Xf>E_Rt+++9^0Glkj57GGzgaqYN zjQ8z4y_}yr>ua#4B2g3e+Tn_!O)MAr&DYnLHHL8p&Fo$ZK#lzBxwS4^YgXBA5${}X z>ImhZbhULIQJPkK7pa(A<pGZEa_KJQP+$=XIKSnkrvpa`ZJI_xoX1Cg+Y^jB9Z4*gf zeux{NVXii&k*BN20!BWLyP-vK(-z@6+h*LC*-}2gPZ&6}z~`6)>~~Yw%O(~?CQOZv z3~@xijr?wfcf7UBMb3;gt8}3jF}}4&r#Dt}sow==geLtA+x4;+Ca-DhtP`fi|}&%09uT)7E4?wN!eO3O(>95+5e(V;WP8L!UGlN(N|He?=X$drSXa+6x- zQqs}kH}lqDk*R0mq>pS2F={?;kSHPB_FS4Gn;`#@P1@FPR4o!Oi5-2>{fFDbSv|sd zry_f`d8$z<^$6*PB&w}c>$zNkB02js=HyFR6zkj37DbH9yKKhiy!{3K)ghz|(fnea z)jKq#1Z^Dlgz1N*VU#$E|5ENyb+vY;xSn({E5sBG`Vf&Fl(}*c^Ag=%Cv94#$$#m~ zi`-KLzap4e-?rh%tO#K?@r$yYwM0_m%;ZyQ4?ylTU*J_f>&;)ZTs~#H!nRD}V1*J! zdSSYIk4D$T@40pA45g$Qt5y#GqxwlcpfBUBwp_`1!~LYPTgGf6h|lEiW9sp5iH?fg z)BOahdnye`UBl1x$MCYHcj4WZK!sV$y&9*KvILhD2RZ8+4{_evm27kxvg>^P=?U)| zaa;Y|YM4QKY|HOT#o{}6adIch-QM=ecV%}s4x2Q06ljy~uN2*oQfu=^pPA9!mb<{* zbaH+`F-@~wrCjfWNBNG)+nocz_NH5DH#tU=Z~%Fsua$Q+>v7Fxp0$8MzM0b1%U|^} zut*}kyjWyl((Cj`ZHHY|CTfijac?z_qBBPyc3UY1V!!XnBi)t~*_$kz?{Gl(h{W_< z%>*Ou%h-%8785KZe#8Lfl4~<(km&en&3c&Xb@Yk3)8Lzx@{FdINcKUBng-@K4-=<` z1JxK}E_1nNYba|QGGsy(tT;SlsN*=<2qiLpr&+|?YSpclYsM6+opn8K`zT4#eNf5l zOwOy1(n~)^!-#2}pH~!Wb#9ZI)l`ss>ePFq@bXu?<5zQL`$)i#8SUPL8qKoVsa6ju z2Y-3iQtfQ6%dCP|4&h4kyTXPSRc{Q()`O&}M0i`^T6vh`)WQbBHt9tiMN|}}ITFV` zM2#7Cq?{KV>Wd!O)oE$axlRO=-bg{2h<0EHlqI}fx#f(W33n+QX+LHuJxwQhzL z9`0QkDs>bInU`-IS2AXVuYQZ;*8TffrzDentpyn7UlIu zsTGQPbP8Hr6SA0`bocZt`D$JN)dX|NJ*nrnn!~e3(-i3=@rp{1tv|P)vOxdZDS8y6 z$|)w7Dw_8-;5TBz@!%`2RBZMe)<5ekJN{L9NQXwrwp|q%MZBoP(Nn!ra@0|DEd(QKJ&&Mx>xLq=3#L~8_4g{lywl#hxaG@&74tvL9|PNX;GsNwsvNsKt@54*?`+?4 zt#@p@0-?$sXm{~GhySU(d+W@)e;1fl;QQheZfz@bv1Z;{TjKB8SNNyZwep^9l&|Q2 z?)R%wnqDb;{pm8p{`jK&YY9`T-uUmU-*bLlQvbg5KV)7l@_WuxRbHvm{O>>V_1!<^ z(1%rXf4lukuuke*2S3SJb**o+SN~pr{@5!|6}-^#%6kvKSmxNmeBC;)b9d!+vfq1l z;eWr?DN>+uuX~=q+|$J$XXwnG32IS}Gbd`OZx3guy?GkHD$Q>7wEDAA_Q|;?!C7DC z+lyD)vQqsK;^D+`_|0l=_FGS#;Fn-7{XO$EguMk|ZvLD&{y4udwuhs8*sdESQ zM~OvW#r%i%a~GZIuYQR;==v=6K?o{4RsE-O*_%(R52|K&s;fpa=)rH*x{*|ENqcho zbfhMiI%Rj-I11B&Kf;FX+ra#b#s5q$^u#aI&lV5Ns$S{f_Uj+lroh(16>k+SxwuH6 zV&U^MZycx7dA}*~b};st(v9={P^y1sDqnv4|Mz}{+w5Y%pkOE#|9W z$Et7FYP|33A4bO%C_TH@73bvDqxo~=Kl-8MH`m5YzxZ#P4z+5R9sl{P^LuXGsL?p- z+^seLHZ8L$?@zn`{r$$2H!hWYb#Bb9xc<-9-1l3)N1K!=-68JnYflwwn0v>m_fBOL zITK&5+qMGl7F>Vk#IKL!$qkMuS?y|reA`RSyt&~(ms2b2C++(xxO0fpE6;ly4{W+4 z-+i;6OX?Em6dBj}kKA!T=DD`7^o9~ybw_n*Q~uRsgDMutlX-PUfi1s(;j}Hi>RjJ< zmi(49t=ZL@ua|3bZ!yaL?nt}XVsXK^3Rj2Te6)7c(t}PO`FBU7yQ^I5v9e-D%qzzS z1}f)%7wA~vz^Q}zOBTBOpN=05_$Sc3!xzCbyL-2KpO&oM^~IIHYgK)VHXl2EWr-Y*2(iY??)TDOd_ut-@r{AzHH`e_7W^T)yxqns7U4P?Z zv96ysD6=GYB~789=!@(7Yd&zZ#?AHrwESyjfuveLCVX&X!Hq&r!MxALew^p4e{%C& zD82W_8v6ChtlXD^*LVKew(q;_YJ+3>ZXP(%{gd-&Qfm&sxntGFmecawU$SuQ z;O|=T4ejWLFVtyDdsgfJAu+zk7MuONec?$f4v)T{# z2K=O95c`QKy7Exy|7v{<{A=2u0zXIlv*2IRK0dCQn5ye8gnAdVfYE!KMG%0rEl0zOxN%|^!)sT%Ne%V zg7AobWlPM^IT!FP&e(=}LsvKuTTlBp;MdT841XXcwzl^1;grNoT{!`Ime$L`Z?64n z@H4ev7k(4%H)21rk*?bedUw__{;7`#0UiK54>AD|4e^~2>;m_0larm>9AEfUA**fqm`-#nUh+=$nH&sU~2P_8Y=4t1G0z zFQ@%1_7k&o<+jlE635g5ekGmL8GaS*cV|D5KLUW#8~P5t{d=Id*7~3z0@ZYdq400h z{z&*Z$+?U{g*Ljv1n6(;4b6bwR_n8%>p!4UHvGD}?jq#0(>Y6_*Vp=T_zm^(M^6A! zbYL|q+^#FEfqqCg_8j!~THg#kP3ON1Uw>+mUPDd?owFA@u0~uAK<}va!_b>({b(LO z{$rbIIF3LI?SF#`cjyY=L%*my@e};tw0{A9md?KnzqR&nu%FmT*CoC-#r~)B^TYo~ z`w8&dBA?H{atw)`b%ja@=*2gwCj5Zgx_2HW02on=TCs1q_;BzdJnB< zL+8J3qb!2nQ|n8i_tScCIp8i0tC7@8C#`{AS8wz==)JYR8Tvgs|7H01YX3Fl^wBwc zp%2pf0qA#X{V?<)T0aVZsJi|U9S0280j&L#*jHEh9(q^Z3EZP%J8Ay{{E<5UGW`3s z{}20#{dCFuOJpQ3Y`!RP;&3#Bdm(c13}e;oU`{`X@@yjxek2Z8xIX(;@;+8+ad zruL`6pQC+TI1}&Db>~B$qS~TG@TX~iIdTT*oF|~q(E4ijgRu{4Scjy0b<%T4TBjR$ z8U8cce+|B?{deF$rTqi!Cl1tg4@2Ls_2cljYX5uqFKGWK_%A6xNS7HB2kFXJ5ZJ4e zZoq$6`!W0yyG#3V@ZZ*cX?{r@tm~G8K1&a#5`6tFC#nWNTkAEEKSbx_*p7V&^UtLr zV7~SnA?ZGy)C~If{DVtd_$RdA8U7dA?+yPe?GNIY#G$(GQ0N!5J_i1I?c>mh{Zad~ zf`DH%EaI2MVY>2C=r^?f1pMpTUjzRy?LP9M(PHRLocm;OipZ~_J4w3RQnisY;o;hhX1(U z&OhuYj?y}hkFWnv=m4=6yGr}{*-yM*C&fXpul)r0b+lg&es%3vgI`noc!*9Mt$o}C z6US&D_o77o|6vktIe9Z)_xlNIofXqUw?C&I>67?dayfSt_D10CO)M7LGb5k9}kv^^R+(({sQgK zg8#7g@i3XVQ2R^aFVg-K@E2=;9en5ARQr43Kc@Yo@Rw=- z8~Dq$kLSm{xXW-+&yOp#j_1V0$F)y*CJ1RC7s!%7=2Q9esXW6^8lX6{_5N1=oIGx@ za*;=aPcl8l7SCHmS-=KKB7Q`@EY4SHWX;!*V+DNLxBcTMi^HNCfX@!^Hyy8u%TyOKd36!0)pC!G;12 z{2tpyHWX;!J!}`)P@wIh21I+=`JD{~;$F6WY`?LgKm)(ecHYgYQKUo=S2q-d_OpG! zc8(1N8u&xDU)WHffj?sVnGFRR_+z%8*ifK>53v2nh5`+IknIOHE_%`+e8P4X5*H+b z53!wLLxBc9%yya$1seEMwo_~<(7>Ouon%9S20p^}JsS$NBe<^|W#>C6Tp)svv3<*i z0uB5*+X*%lXy7l{zF|Xw20qUAH5&>v@Rw{~v7uzK;S!Y};68mv!K5J4inCOLZ4ny^ zG;jjjLPG;5vOR2Q;F4?$3=Le04HtYAY!8e((mX?B4pJEw9x_C5S+==`22NtjHZ*WK zwxFSb%d^cfG;jsB*@gzL$TrKtm4gd<2%!?&Og0o~;L2}?(7>(P`WqU!4O>4$1Gi=CYiQthY}#mtYe<$5|a@DjFLh6Y}W^Z%wHE@l5wwi|{9evIuuLjx~k z``6IG%h|3Q8h8cUKZXW=ob4Jk%s+YvA;k7KL@v<4Pq1AzH1JBcD~1MM#rBt>fnByg z4Gp}SEyvJ;5T0baY>42e*e)3w_-VF33=O=7?V_Q9pJBUTXy9krem6AmTAcsC86pd` zj_tgmf!DMBYG~jMZ08IOypin}Ljym@_OqdZH?jSsG@gGKLj%9WcG}RuTi8w++Lj>0%WNkN5xkY{dqV?nWBbm~z^|}E~Lj%9bc1&yfAq>J> zY)7@Ib_w`xwj+iH-p%%zp@H9F`_$0D@3I{>H1Ke8h9Vu z0Yd}7&-SsQf%mh0WN6?I*go{MEI!_HJ>R?k@s%xBU(FVW1Du2d6K_i$wrOlA(7<`v zrWzVJFWVGD1IMsUHZ*W7+aym@&wmgCY!f{Zjezs9;jalO(7^fG#v2;A0NXf20~cf) zYiQs?Y-0?KIY@CVj5b7YVYd4X4P1n6l%au(vW+w}a51(Kh6avj8*XUe;%vk6;QGr2 zqk~X_Z73TGG;jjjeTD{3WE)~=;F4^E4Gmn1ZIGdXOS26OYiJ)r8Mb@FB5UBXYy%7p zoWypIp@GY>-EC;#@@#h*8n^;me?tQYEAo$ih6t|2*4NO$mD%nzG;kHRK86Oa%GTS^ zz}47#85+1cTTkqN6ihXQ+t_-rp+E!IVC!yZ;F@gR3=Le1t*fDdYqNDRG;kfZ&Jm5< zhftTTQ$*BUkNFNm1J`HkXlURDY#j^@+>oukp@EaxZZ|Y=3jVm)&Ja`BPi1RsXy7!q zHiiaHXKQU};0(4_h6c`L%Q7@@Bes@oYW^|R5E`?!U_*fhZo<~w(7;XEnt56l=S}l` zc2#K=t1o6`=&^iZo54Jt4UcUoAMmngN(6+(cI;zTve}NXp`bJ1xon>q8u%f$PYn$` zkL|Fbf#I98h8!c zPD2Af!}hA7fuCjDp){UwwDbJ{2bdB zLwgQK`X;uQ3=#Z1+lz(&yQRZW8mGWv8 z8u)XzU`0cO@C921LjxaYD{pAvFWJf&8u%-=Btrv#%~saXz~8Wy(VBk#gK&baw2=t@ zmaUYbfxlxbX=vc@*%A#6e3C7}(7>nIN*LNHod2g;EN+P4Gi>pO20qJH%+SC;uoX2l z@Q-Xo3=RAfTVX>3|I8K_G(-r$uoW^i@Hw`Eh6etXt$?9{&$Hz>H1Kb1`3w#GJ6pih z)bk&N3v97QBKRU(jG=-5V9RT0;7e?I3=Mpl%`r4^4jUO7bCCXIF&6 z@D;Y3h6cXMcEixXf3y8(Xy9vX{~8+jAGYh^=f5m&7^jEv^sRoufYS-5Pq?6il{v2p z+eBj|;HqpB3=Le3ZM>m@tFw&@Yq2p@AE)4K*}yL$>=24V=t2#L&PgY=iTv`=8$L z5K`F&v7un9!D(y*4Go;mcCVpdCHq-yy$lW9imj)ifm^fnFf?!*w(f=o zZp+rq(7^53y0YQ;Q&SD$cD62TVGZ1#t+SzlJFs;!G;l|@J3K9mHxNEM)W-M+-r(YF z!r2opyo-Z0iG|5*?|T94ckmRpeTD{}%C^_gz|+|F7#esw+k1uvp27C6p@ARB%j18? z5FcRwLAKq72A;|GwxNM%vAtzz;Mr_%8X9;G+b%-`W4FHn4fBr?L&#=(9U>QK;JIwC z85;N@ww;Csp2zm8p@HYK?JzX(0=Dgj7KHFH+bf0$UdXo1(7=n>wi+6EG26?A27ZKX zi=ly+u)Snx;H5bKUo=D(=ux)Kh6a9&?FB;vFJpV&(7?;tHW?at1>19m27a7vqtbZ( zG1U-4Y#WrQHSiN`>kSROl5L%#fmgAuH8ilx_N<|SSF=51XsfZ`pJZEOh~TH#p7yjX z?qK-rU{@8q#lq=?vnO2e7V87%{cMP#@LMdU!4GT5!)MA}wmd5XZnp|CCEZ&`3gyr9 zU>^6ujrpg!mCod^>AqI0$P9Pe&xI45ithT2`AayJ^-ER#QeD5)&@Z+0OC9}EPro$K zFUjh~9sY6tDem@-`D5JGXYyB5p3_EWw9_x`^-D+n(n-Czl@}FBaJp%!hkog$U;5~T z%MTacuD3Qy>!bC{Sp70yXMOc^;i1kuUk9wEp>-{p0B3cOeK3X3it*?*P-$%O}AHU{*k%G?PKarB!XdmqXA8n?O zw%A8o;%SljN5hZ$BrfyOR`_TkA8n8*%BP@X>nVGtjb;K0aDsAFaQSHo`|6<)cmaw8;Ep79Q|P zT$w$i(S}YpLbtl!2S?ext5R=fVJU=_j z8L8-_Rrb-ULUTu)EHp6q13w?~mLmnt{OqIs>ZAScqy6clUG>ra(OP&~NgYc6`6TAy zLCOxs`e^xmv_d{waZBU&G2%o^)LLmDEy+i#>7&*0(dzqX_%E*hZ*+}(w5C2<3m*-? zftRz@!AI-lX_5KIEOhlr#Q%;iH+Zj)HrPiS>Z6UYHGNqbXNzi=O!U#F_-NC8v^hT7 zTpw*do-O6*7WyQv_R*g9(Vq9wUi8sk4Qt`~$Mo+Gi^gRI-&B$v{M|?U!$-UBqu~on z=JwRHWj?;vm?An;&_^rbqm}c~>iKA$eY9@)YK?689-qX4KH3l;ZJ3WX#zz|;(Y*P` zh$lrvJ^#?A`e?I!G&~*1fjs1+Es$DWuC-c9B~OBt)!1u#z(u&N2}#&Zeov^hQZba_D_dvf&~=T0CpAjfAMC=O0sDibXl%vaHF5 z%dvJybg+VtR*AKvBCiT-cBi@hYX2wl-z!;@y~d&#Qme~urcWT#VDvm55W20{yp z9%iyA8)@RBHD^ukrYzQE!>w794YxHkHUF6Y_AJVVu^NZey09ik+?_Sqa8K6cZtDI2 zT9EE!QSPUHtjS*A<)aN?O?GgQk9HqxveUy^dupC{{^LZ$ER1APHhjO2HkLKn@B|+X z%ZJF_G>x^$Y@vNLJcC8q@Pj_uY}RDM**@Al*5rsEW-ZdN*KTkTi*i3b;-f8PP41@0 zSd*Pz?xQ{KQ}+q2Mdu&0;IjCoI3u27?X1w&uqGRR)<;{%n(XujOXK#@@Fo^z!<$)? z4Zp;ioUNCAv~8@(hIg;Wd1P=@3Sa7 z^MQ}{k&kwOH96u#tjQ67YS#^_=|5tNN;~GW!7o^oqx;fF``Sl4!I~W0cX-<-#gjgX zr&*JuJL}WPk3QPZK6TH9web97`hR0lPS-`&n2$r0Yvzid8>&-u= zzhp$j-9TR#O8aau$!CM*S(7tU(MPK+H9Y@SWl@fL zomiC9)s;1Q+I445j-;oL)|)li={s4Io$d!sKL6d#qP)M~>!S^3O?G-HYqHbBS(6Qq zG&D8;nEuf$%7(}JXcJkJPc&0llMPQ}O*TB^|Fs~^WKlLe$48sXnjGCib3WP&tVJ63+6cbnBW`6)?&IyO$%bELO*Z_RkG6|7+3?$1)8{|t5VPPe{v@ckbBmT-qJAq#U$q|3g znjG;d)?~wHe6$}~lMVmkqn&3ByErocn1u^0%7*`7O*VYlNBfI4+3?>!+I7~90qf_# z8!XC(Z?Pu#G4Zdiq?U&@xsPLf@&Z0ueyqqND;MNMIbtl!BsDDkbWyx9!4gnX!*Wso zh&(JO6+54g`tbZ?`pdE?M~8Kvq*j47+38BG$qrWW(XfP6JR0_jdj7*&Ql^N`VBIPC zD>tl5m1I;#9u}Y)C`N}BS#J}0DLz^%R^*b2SQu4m={{NpYrRAxSgTalZRDe2IZ>VG z%|Awh^+V+bu`HLt9Z&htkfyDht)WTn4QM+UzQYEYvoh9HERpZ%AALVGG!xe zee&9|77}%DXDuizxA&>sfi;@yWaM|2D`Up!dn^$C?}*7Gmrb6#E3LD#`;1 zizQ0!9v=;h9?I#*8i!KD+J)imsrkqB4>Ckt8=wvL(T4bJ5X%S3Muz&-9rpiPkcR)i zNW4_v|7~!jkA{`?!XpWH8Vl*k&R~H&nTLh)HqH0W|8QljnD@5WC0H!)2ccncylX<6 z;Gr!v z-36>gJIL*$;fH+^vAmz$AeQ-)8kYN$jbPcoXd}9fB|dpeF%5EqSPoEXSQbz=g5?2a z-g2KjED@L{j-$s}>&RMh-o2_|7D6oEy})fX(<$o=bT2-azhdzIa9q6>rEwm|@T+aUcP=QPAfgu@!~j z>+pbesjimDfv@A$)ygwokY8?7i^S+SUmhG5u-Hnp)KKf9=mf-TL>6q(IW;4z#OMZU zMwY+P@mi5JcXYf~WHlijuN_&z2)~}@25LtZXVM9EB8#r*4b)M~mgpFM)>SKvz|--% zYF!SnF7?!!8t`?zo?4m03-U{SwTJ{5f1cnD)K`l!K+vUuS~mf{jyH%b{Gj6vBdbm5 zc*Dp#8akdFS-eBXlOwB==y*zaDHQ#QafebOtGwuhRJHg5e7%8GwVr~G;b)p!`T(Ae zr>PYLz`CTXFZ;vS@pSc-c`wK>8S3lp>h`P?G9urT*GZX?FX!ucW@Oa?9d8s_>OjXE zMHX?;@y6+p5FvHCK&j^Sq$^}TI%d(;U{)c2pG2~E{kmBBjRl)nKSjq+DHBi}mK z@n(_lQ|qkekuP!Uc=O1&({;Rs`bxaIJ?n%P>WjS5CR(a5;evI%rTQvsG@eCG@@mrY zEcNBhXuOsBo+VhvTSdMos&iW7+o`I3FQIkhi?=$VP2|hIdIN357d6|e?^8w_Xsf=3 zsO#cqJM|61XuO^J9$qwlJAY+Px9@e}c6!zukxpvweeo_lg7%Sb6zX_~$k!Nk2RlT* zpQ+;=BVP*D@s5NK&P2-{bQIsIL(vI$(6?4XC;qQ}%y=g{Z^b(kK7)dy>vtx6ST!t#}`O#fu~a@1*%w!kvUa zdPhrN3R&^K^o$knM;okoKf<4j!=*SCB>WXOS_;q}gNp?zCl`OXjFz0-Q-bj~$7spP z{Z%mjgcvP3xqk}2CK#XW3>QBBb8_+LylBbE4G6|x=b|Mix0v8W!DR*G4`tDklUpsy zIRA2T@kg#`$;quRI8`wI4izmqxy=RRPe{>{liOZ!=LoCwKPR_GL_oEiT>LpFT5@vl z5j;dN{^AlXIl1Em;}0m&l9T&jm}@FECpSARc>J*7rEZ~1g~|tWa#xGMvx4z=foRFe z#jpRPB`0^g;5P)nBN)GlkCYgmngi~Ux8su3adX^^ap+sY`2BUXjF(UOykU#NylF?R4Frk$+$zi%KN=Vi7CfFM_$k3}3I0;>b;0G0 z538cR)*hpM)q&9>VY%S91fLR|m*19#3mT{?xQpOPnpOMy{~Z$vZwo#pI8VWFb9w+Z z1a}uaRq(Tl%ju1v$NNRXuLa$Ynii?x#xyHZEZCR7(;hBJo+Ws#;CBRnC-}PH(sALf z>(Qj!9HgGMKobQo6TD6EA;G^2&R5v(Ky{0GH?_3{{+*-X*@9OJ-XZv)!MIc(F}N7> zF9!4DWlrt|Q(*p6@IQiY363ce9U&SlD7cv5k_Pkm`6^=w;3|S^3a&3WO>h&zS%Pnm zGES46+|E%!aZkbh1m7!osNnkrPY^sU!s;~5$(FC} zS+&m%z8n_NKJ%-B-xU0w;12|UBKWA_uRPZ6bA#WDgdYU|D)I&7d&6^TEV-S!|kg()z>27vf$YGaCh{zyn^6V!5st-5IikD+P><* z3X!l?@Ik>p2)-$}Oyrl#-pxmFSN`>Gq+qb4M8X2W>jm!<{G;I55|PcT0oD-QF(`!l z1uqr6P4IES{|YXbV0WN};NUUlM#( z@P83j=Rf~~p_F~l1XmPXU2vT+>+4TWZgN;q{m9A96x>{J8^Ij~cN5%4 z@ZBEk_IVc!76~H+j}<&w@B@N_f)@y0qS`CUs9#lZ z3&mdhNa!yTrV4&s@GF8p5&W}Yr;Od93gGbg(SfESp^xCvf)@yWTJR3R9}7Oq9ByCT zoonY_xsVfs-QPU%{o4!rjsL^G1U27CcArdchyy z*F@oh5&j|)3V3g$k%M?$!My}ODEJw{djVG#IzvPYvdHF!u{v$UPzWwBVlw|1LO3@HN3VE#~`w z-ipx?qsIjV7Zsc+I7x72!8HWeGa2{)R8wGXEV!lMc7i(z?jg9Z-~k2)G2;6S0X$0Z zc)?Qz&lEgY@It|lMmflHpOYJk3W}c;yjJig!CM6H5WGw9yAcjz-{<7+j|iF%3O*wE zOTpg>J}dZ~;EQ1nqCM`wUtz)H>wygjD~M+Z?jv}T;AMih3O=mZ8$TNOT_ohI5^i2! z2`dV2D!7;6(Sqj*UJLfxS2ve;MZ))j{}WuQs@=hK!Mz1f7QBo(+`j6-R*`U6@b7|) zRI@vfD!8BE*@8Dzi?**i@R3OPU2w7Lc7u%t4-vdj@XLaaR*#Hd@8iEjLh0M=2Ac~W zB6y+TErO2zQsAY!2^a+oZ{$&!TbqAI?X&N z(x*5&$2`>FOUzRYzQsJ>;KDT{z`Hmnx3wb{FC6{1Yb58lkm4GFy9cIr&jbhLI?8;E+RO=U|iiB2<~Wb5DCK! z0h}%PX~FLbJ|&nxGZ!h?UPZyJq8wBgzaddU@qED>1%D{`7s2`KMA}!|t06cm!h8`# z4+ljA%?}CQDELFcKMRhnD>@*!Lzr<9MhET>3m!ir_$9%I1z!|gw4U9827R|XLl#^RZ3tqQ#a?1;@D!7*527=QCHx=AU zakzc%QG1clMQ|^{{RIycJWTLt!4tue_PGPoMZ#>s^8_yzyiD*)!A}cb&m3)^JMe-? z*eZCZ;I{dBK+iUlshH!8qtkH!#KzA-#cj{P7F8 zm*7c)R|wuF_>kc9g7XI(+6~qa+*a^l!Lt6dBL1%66M};|LMWVUcc{AH7J}~-JWlW< zf;Zb7q>pWZei57}#qLlg!7T;fEBHadt1agJzsnMMJ#N7l1;?h^9jYieU2q4%gAC^5 zpP#x60hh+P2IJDXQ1GLILxP_ayjJiggL(WpxmyeYyhHFV!S4#*FZiI~BZ9w-GS0u8 z-0z}-;FD<1+N#pNAO9(Hw2f&_VD>!P$bJ6#SatLxN8?ii}_1 zZvQb7a2nn+7+1!m#^LVaH7B>S;2MJK2~HK0c)!iT+=I4|dqnV;g1-}d zR`5B&7X|-iF~9%6ZV5TLxq@SxL=QTg71af|6Fgk-BEc`2jN|VUQ(*p0aG|Dl2kHs# zCV0HyWrDXGtls~BZU`9R6~QH%*&V1axQpPCg69if8|516!t-`iP<%r0zs=l{CGuAY zwrFm5WPso~g4YRtU+`JMd0N=puV(XLy4@CNkl>kuR}0=D_+!EDj>|C>VhYox7Vh#x z`O5|S(^W4chI$JwozfK!O{)blnzjWGTHGcjt zSLtU6j%rOEWCdDlA6<^;Z*f-(vy%U#+RSE$I(zYKj>ppt8fN9+pwS-ZQStj|nP#tj zx{p>`2}9{^k5zm8SAo6EW`pOvc$V7WO^R)!Gxg7#REXKkujj>e{w=y)akzcDMV(n# z?rlSzW?qF#JS*{(ON%|$DY>+a*=%6D7tiK|c%I7xRz5kOd7MYZhtXf)Nc%L5u3HJi zsbX7Bh?L<}o!M-#ix3gOcMDkt^7RBE6maMDUb6y5{zTugjYcy19_b* zVOE{W>-@`XcBouC6`*W>iKiGR-D9oBI88l{QSlMfyPerSji9@%gpoAa+Q3M9z>1He zN38fLTJEu);``}!D}F!iw&J7dY&&E8yhtFO;{0mg4yBtsXoHxR(TFB?T!)!Ki%8O@nJf8A9*R1^f&P|W?42+@5 z?bU|7A7iM7$2vZif}O2|vDA~7YrUW`&$2kF{FJsmyG4sI?c*=7e~PbMCV8k*El1y+08@hUT;fhmQgLc4~Aufx8^f z>t8$^W>ul6vy|EF&^9lg&GC3D=6r1B7jr)KSf6GS=oc$Kfi4*FU_4Ev*gI59-j9h? z$YZ^MNmR~?PogRw>nWa0?XCD^>SD#G&}1tR2Y zT0!NXxAKcSc{`Z{DDD&hho_jgUoRY2GhD*y5N3V-DdBWw!JOg=UP89&P=d2KQUMJm zILkcNGcc8QTJfp$mKC2yr>yui`iWV!hwBe!pipOQIDF6~I<-93YNFGC+3a8sE5D?3 zzm;FonZUeUS615(d2xM~m2$Rv>|Os#IXhV}8#wMIWb;PiskC#!W4+DN&YvFZ8JJF` zx_GUrm+4gAV;!GCZLIhV>d4IP>Gm-L6TO5i-atIB`m)@rP{vuME2zyQ|1B%Otn-DH zU)DJRHjaUt;kY^mlAO|Av8l-QKgp@Uf;j_ODuMr2%W3gc>(ls_{ZJ&Ond#S@HnQ zu;LHU94r1HxmNr^dIpU4^#*3rHY;H!z2>o=!dZ0IiqE2RR(v)kc0UIq_r^HN)4(X|D6i}c46_m|JHtHI9a>1iWmdvMT4^OLqCHl8 z5q)UI7t=W_zL+k8jSf}rrCRnnRK@8WW+hh%Iz2r>@8d^ku9ffzEwtiG=nX5rgx;~@ zOX+tjzLau2)+2tD%JlX+q+WuLQbkYD36D`nE8#KfX2qA$16F()1+DmUT5rXd(+gl@ zM!pWmv5SIK)wvZGRFA4UF@1Cob%$0^eUG)eg3_$`<8-eTf1HL|@en<1#Y42zW6U_; z|DT}UR>Bjs&q#>pHOnqr@s;$q6<KUYy5kM#gt>Se`U>K}~<`NFW8=2;1= zX>l}x<4@8~EB++CWyPPO@2vP!bk<{iOg&A7`b@!Wz2WV?Bar zXp9wqh9+6@XDMXGpQR_k#ym)8LiTyNW^GiHcchWu9 zYIUcn$9jZoX`~fjOXIBgI$C4J*U<)#)e2bgw4M%H3G3;I$9e`fP>vPfK-a*=m9uJp z-8E8I&fA>Z!>r`noX*VVm2;Yo2PvDUDV}OLu2rFi^Nh!Ogd6D-E54DATJh)TmKA@F zV(!u%(gWB;bv)MUCQ4S!^RE-0r(RaV^VA<~jBr6Xu0~kX*&JrI#hT7GW^;t!cyT?z zTF!MVzm}5=#{SnGc!6r&t+wR-c!3&ttmB)hzZKt11FiUrG}ns1NDINnLAW~{R|jEj z=ND#u{HZ2uI~TkJ-QY`9@*cB8FHt#P$(H-0^$?X=EH*iO%T ztm8ZAs1@HqUs>^2iGQ1GlvgR>v97<9YFhD~R6hv8n38+L32H{_It#+AHe1(O;<4V~ zYxKGme~orq@z?2REB-qDZpGiAVBvvAhv^L};jy05UDVo&@1hP?{7sr}#owgaR{Sk` z*^0kKuX?Np@OF^CwG!T@GgiWGDmcjO;BG4BvEINt)WnLvLs?e*T^eG=-=&cr>j4Je zqbIC{_vk4rVGn(5#rM#s9_tS5rN6BBUb=3@_fgrwWR!hW2^`+#c>muioS^o3J!fo~ zRkeD~WM=c;u*QpLb3C5vJMUQe^_}-U)*XDGzPIA<(+@_R@BjPhhLy0N@(fWedl#k; zD8XZ`en4eC=KgXAKBSgb{6lJI#Xq9aR{SHH$m|VBzyE*IOUP0iY~Z|URcPS67p=e* zb8^pG`3;@_to(+Kb02TWVdH}Q>R^;S=y0-=6=r??Np@~$!JOieUP3n4iKi52ZlnUX zlHx4%n77CAk7|p-Wc$ zC^;jzu}C>e`Iy!C^*%aAb*+SBl;W|De@^|Z_~&#lvpHiAd+{u8B%Yc&o2>k%&K8mX z*$8j`b%kcmuU3U-&L3c79~K|UjH32obEjUImDt=#Wi~t1$BSokJf2!Ov7zU(mB2>-cfnZ^e((L1weT%U(Q7HQ3TAGK!r@Y3U>|oB0_*FCmMQ;`xuT z-K+{(P9Nsw-Ue{g&+y{pK1w)$~}aUr~K#v%x#Pc$R9gjWgBCZ{y6g^Mkq1S{2$lZ(0@FI`4svW8jBy zoO={c?VOuoRy}IxG(@-n^4b8FQ z-_U$3eu7q6@e{PhihoOQm~npop?9o=@8~Ntfxe^ft@!u!hZX;xu6V3>(Mc*ZMvqPZ zJV_Nj*6~x+&WQ8ze~LP>VD7`oUP2acA)eYhj~f;EzfyHpi~QYIeh24EE5C#D9oX1~ zx#2k8f5%ftr|ekWSN*f2Q;FH^P-`!q%?a^zhjX`;e}^;JV?Dytw7`m=rX^PV3~i6Z z)%kyh-eAFO@T8ZJr5fzy{1>Uf0^9#j|-M@zm9M&&u!WeBiO3fwOepil3!RR{RG_9It!h zUH^WdBo@pD+jt3Cs=;o~5RY}WZq7)Nzr@P#?rgI1yE|LJ#xZb2$GLs(ay<2LezPj{ za4s{O9V$LSH=WHd@zm3){dE)A&c~WW|4^9#;G(8m-tHKmYgGG|@`R8}`MsQ;%t5olD62wmXS!9Pw=)}Dkc|r(SQ(Bdpn*Ql zb758)eVmt=D=A;+?+wS*L4T+7=|p4vM0Yx0cnNwR{!SOd71Tz4r$4Ru1u8Vj+q!zW zK=B^y`WLB+6~9O|J=Qb)2eq0MoqyiMAJpDTxI}}k4P2rT%-A>zW?-HdFUA~CeVtWS zeqU#e$lqz@_jC3ItqT2|kD0TK)8w=l&sJwif9DS?zrS;Z+3Zlk$*ON^+WEt5PAQMI zdY4n)V01cIR|t&+w-wx1@F>Bv1TPi5*5)AXum$=+@NvQC1YZ{%H${&XKQY2`g3~PK z{omOV_`8~d9}@hu;5P*y6a1Utyi<)1;`l3P3e4$(y9ypAc(&k`g0~4iWU%^l>Q9D% zDRZV7J!H46;8ek#1rHNEN3a`Z{q59kQ9WhT7g8K^|FL<8dRf0DOev>)ezUsioBH=5+X9PEi z4v4(~n0%ZgDYcV==#zu(&vNv$zEH zu{eS5o*5ZGx|K+St%Q;^!s1di*5cAM+2S(vfW^E5nZ-%8z~XYW#7-zrE3AYH)iZaf>&a@>eFn6IH7I&px z7I&j}E$&YHE$%@FE$&H2Ebc{LMp&Kyz3ID%fP<+IowfK*I%jcTx@d7f`pe?G=(@#s zQ?A7WD0Vj5;i9iU_fny-pwxjBZ}A{1W$|DtZ}AYSYVmzk%i^Kbz~W()?y+v4hEr23 zVFb0ZcqFyAcocQ9_qo=Ke>9pSB8T5k1571VNAEccY&!o33o<(~so=qQuBkj{1 zI%FjT>6pdY^tHuv>7>OE(T^6-qw^Ner%M(upsUQ$_UU2z&q`QG&Kz|#dOsFXK8qJq zVT&K35*9C^G8QkTiWWag)#sS)(_>V}N?1n87B8nvi&s!{iyx;p7Kf;##ZOQ-i&s*g zImY;jR?*#7f=h!fUQHt`ev-yo{1i>L_-T5;;x!bs_!(MY3(wLLD`73Iuy`H07O$sg zEZ#sHE#62kTKpWnV(}&lzHSN6({77jpnVo^rjIRtkv_HfCHlhREp)=-m+7>{TZ8no zC2XVLEq;Y^EZ$DnEZ#vkEq;~4|EZZiYIjlrYZt#pMJ*1#PKlQA2ARvY^4b+t*^0kO zH7tIM>RJ3YrCPk3>~BE7LoLmCklrQxODOMACo_TeP!EguQeTVrQTRhFdc^P3eO7!w zjk5Ry8gDSWAJSAqAo_^xr{a%kt`$E(3oSlKk6Qc*g)BZqPg;DK)l{ zEIvXzEIvxREIvl>TKqZfxA+S>Xz_765@F?hNnb_;OyXDcoyA|%S&P4+a~7YVixz)N ze_8w;UAOpq$_=xAJxQ_IXgFL>QK9UxkJr-_Z}Ax_W${@mZ}AUQ)#4wimc>6&1CPCa z{7mUq!Y|a+;&ar>;$Nw~#pkJu#lKN6i+`v77GI!&n#1#Ok%n0bf6!=)FVRGcb7;E7 zf6{D=|Dt&oU!lboU!`S=!|n5TKv!A`*XU`B|Dp93U#Ax={+G5|{2%SK_y)aY@lDzT zjW~3$fZLTlXJ{s$NAdgJkCjr^Ey9T9OIm~IM%tu9BrQh&Q&WRpYxx^`5k92 z8Kr=e&*FkkVT%hnB`l6}%2-_3sW{hcpT8Pa-AX9x)UmjjlWcLklWB2rr@6%?oHiCG zI2|ocbh_DBwvtXCE1{Hgx5cHM!4{WsMp#_d8EbKpGuh&D&I1;gcd~<)P{CPfaYg4b ziz_)REw1dWvABw}(c-GkOBPpic35293BG9ww>f((uHk%SaZTq_i)%T@Ew1f+XK@|p z2aD@E=Pj-mbS_&$edn6R4V+sRH*{hjGLAw1ELWVxDNYHCQ=PIFr#Y1^4yHRbEg{2c zU~#6CVR0j;xy6m0wiY*WI$7M*>1lB@r@zTTYVHg&1^$%E2#Z@f<1Ef{rdr&}nPqWn zXP(7voJTBf>#Q)C&;NGLYD3_~n4Ps2w|AbmxP!CR;*QR17T@9Qwz!k?zQvuLgHguy zr;BqmDlm6-zP7lVbIRiG&d(P2a4uNf)A`HdUe3Q3_ja6l;bTZ$|N1!jBLV_y)&(pHtrA{!TTE?{ex`e7BQg@jXuCFc(lADM+p6xpQ90f17*$)!3@;#%4uIxV3i1 zmUH(sEAmRPe&^&=s^7Uy_l^w*Dla)Lg7A{lBM2`!BZBafGb0Euxlsh+B{z;Byp)Dv zR9;FlV^B4$+?13^7+y-GTgpp`bW3?Dk!~q3CDJYBr9`@=yp%|{l$R3eRti5p*YBJf z>6h|S(J$34<)uctrM%Qgx0II}>6Y?RBi&M7YNT7rOO13(d8yp3pw|+5m>TJq^3o#R zQeIl5Tgpp|bW3?@k!~q3Ez&LJrA4}>ytGKS(t>c)BK=ZcT4cJEmlo-k^3o&SQeJwb zTgpq1bW3^Zk!~rE*G==LR(a{^#K)hSYIf^)PLK3UdFhdEDK99J8@@hQYia} z*j=yfj~$=Sop6s6>;5^~DG|$OUTT_qb{n7Qxm%0mbDw>^$n!YS)mW3&5R=u&lGT8c z)i{z>_mfqxlT~MvRUea8&yrQwk~1+;$(fj+VhsmhI1}_%ybVJK;cFtlO-& zQ_9_YD6WXxZFu2AZiS1n1>X2HHapNGxv`k9`eO&rm@;bYut}5AfyS!k#;WDUs^!M2 z<;JSz#%MXEAzDsph?Y|trno1^#U=AZrX(l3S>xlXyFFqHRdWZvAG_I|^f4p%q@X*f zw^L+SvoB-63*=2nPr-zjcZ=?iU4(j>8Sd?eVn0Q8f_o{UZ~^!7$=H0m-Z>e2f4<(S z$!KQE*a>JeH8~}^uP00zf8Vgl=ya;O8n@Hhk2$VMFUDr>bd=Vq^E% z&#{%=8i!+Nx$8?78WS^l%J3wxP{XX_* zwFP(10p3YBQ7Kr($>;9nN^YgUV&mMb&*JjAMLvlu=r;c=wkWWGd$bqt!sTDa=5vqq za|*df6AQRRmKn1*TU zNaVT0w50I?Ir+Z9V}|ibqA=aV@l&TL&Y)0_+GX+~Gm|E|gOBD<3Z(JTI&oO2N6)fu z#mqn=b7Sz_g^39hhut@R+_dC@lShskt~S849J*Y)bYeI#eb}fGBXuO1+zFEdB};@u zLq-k8eoNzHJ~Z)(G6A@$w5m~{Tud4t`l0Pll*==5nA@s-pacu)6k0p5R7qVq#b_{t z`{K@R9VqFwnKIC5Gn3q-jUsKP42-ndh}*1}5Xu@9ui9;_F}rSYAfHsBxr1uDD;ftX z$E5Me73#67jJqs5P>`LnDg%99Rn1Lq5-86Zsi!JG*A^k%IGZaA2zu6v6xWz)kuUN z%RNcw)6h+x!5dHKQ!&)z$pp9C*gygk_mC+xXjwt`v3cmZfo)e6ku_S+tnmkmnmUjy_q$d*%NR8aj{Q%maZWZh(8fV`!Q35OI9qKu8@pc<9jZ zB&RoQOzyszKtkwJL(D^ZGItg1E`Ja`t?yjV7K`!)hr(qD!e@nNG?|Ef#hHDx06lv~aP05#_k|wnFp#Y!*5;qB?rWPiUdDX$hgr zsW`0C`MJzJn=ep7?GJc7VtzPtlk*4EzJS96<_9#?a<{h*1VVcsDHw(V9OBdSY+4nz z(gmbe=+Y>kDedbn5(dSFa)N;EF%4%peBA)Q2U6V-Z);BO`S*S{2&)vH@2*r)pcW& zuv7R6F0^-S6}M6cOdUVKxlR$~aUajj4bhD(CJk;;7?_pXc10WneOcw*Bi(V-;m!m)`Y5`{&uOX~4dV)N7x{Tj(fA(dB0sk&3YKux1&p8ILUX6p zMFZ-NGc75!{be<7+;ZklOLDV%Vw;V*BTS*9TLUT=dyBFA^kV8Yd%D^hZaS#5yl|ly z_f}87;(Nr`B)$WM_O&VJ7H#jSOCsNgLh&=|tF3Vt_qC~^T<#xd#f5L?>HMGvAymI@ zG4*k5#_-S+Ah4?Fp>S2Or#_Yi2I?yo1fS+`w-WVZyhQ(2h5f-0uW7lwF5zYkLd$&10EG$RnFm)WuTFbX{&rx^T4BRtz?AA|tJ9eu9@h<{G$9D68cIyG*&XF^OZ^Zng zw0kB$4~cIfZgNfZg>N73GwTB7%4hKHV&YK!pwG{Dk*DYkzHdx)dkk>YX!vci`{{kE zA|G_g>(M!WyX?jf<>!wKe#;!{@m_*Er-jmSoDKCJ{n)9@2|R&FI5RX*H0;E>Sp@^J zd3Z885^7Pem3)fmTjh`d<)h#v}ea1~C zxnF5_dqKV+CHGVFh&MQA8}hTae(RILzcx_p9-W4+ zeY2MolZiJsYI8^G2h^jX2e`gu^1Vg}y>~@nzynhz-+J7+FYzwQ=p<`kagi7DPgI6LK7;(?%6X!~8oboK7zc+i=+(I}nY7=<16&L|T%o`x^0 zx;&C@sey9kGWlj>?3KuglZm%J%TfbLflR)`OdRSKD-bA?l*zXkotMd=pd{K&iKOujRPMZ9nR|802hrZf4z7210b4uDL)ak&lC`LQ{ZZ(6#x z_1K)r_p4B=$8|0bY(+X|jNkIO11IvcboRtRA|qeZ<_;*85UwA7Aj!l%Yy2yL(#^w> zXlMD>6&C$EoBqGP&ICS+qG{vRA)B2*fB=DT6C@leN0Qwf%NZbC0utm9BuJ23K%#)4 zf*X`e0SyvpP>>*~s3@ptP*H-%D=I1|Dk^GxMMXskii!&6tLmD~cIDgen_o6l&;O~J zKDMWKcJ>M#5t(U$(r$ZVe)ZPK^rh(3eKE~TAG^u-`GHbwGW(}CjtO0YGHDE5Y25|Po z4RF$=|7K%zp)`OqArW&Qn+v4@bD=a~E|jLG;4FsMR8!38!WC_fE7~4cR64HG>4gFEz!CJzVi_%;-bKZ8GBz74-_PcrRuMqT;=nL719i zMj@_nFF{N-0})re8#5A7@ovmmL}ji+rh9<7KO=fVS@EoD;8i&-ITD7Vbh?+M* z?|IQ_q>tQGJDx=T&9Oao;h;JxHKW|mYKAhd_$0<;+6^>w3I0Ao0EX|;e%XH!WwcD#@I`<`~T~zrplR@jk*RVpl%XRrZab{gXKI-iK zxE{G&C%qTjUb!-Fxh}BeI^=m!Kkr;F(nj&F8U^>4bkSDdJMxP4$onjtk0aqtyTbZV3=*f;7NuZ85Sc<;qY|~ z{d(B<>}N4dSqYG(%|;ky6HJcAXdv4a7!KjE`&|GdIV{33kHga#=5sjYZh-0f{jXx$ zs{$s;s{j^qxEaGj4x6tASWRJaG)Bb?yRQM*taty75TjiTm)--g&-L#GDC6(~hDSI& zTm(?g;jXm+r}dm~W0F1h;mh7i7krDow+>*X@uQN8b@x+v{#1;g5@M24tXE$UB)eFj z_*IbHV%_l-Z<(=vEKE!AmzpSLWLj|#d^s1g1~yc`5z?fsS6I2$0V!u`t;clpy3#mw4Qs( zq!^O2o_i@wve$Djg-Pyu?xirvU(dZ1CI#!cm%^lQJ@-nZQx!qfO}~J_fnXoY~WrB zlk5%LOJS0`fqN-T@;7iVg-O8%?xip(+`zpQCPf>#m#T=TBorn`ha&7H3QaGyQ|^c_ z+rV8^l@xVk19wrFlyBfJ3X_Tr+(lsmn!89>b&=*SGJv~Ca~Fk4ismk=BBh^w6SK3u zE}vIBIwl4W*_5riV>55NC|oaU=51N?Du_=ao^5oy8o66Rzu!2jZH+OZAU_mL4+RAr zGz@m`AO7e%y$fdHR-AHi{T~J3#Wk*s?pZBwDdr7y^XSV6{;#~lnAh0Nqy1LPGw=LC zj9>j=?Xb@OPBc06uVV?oEL>9s=`*&~c8G+RjU@m(v0EswKBCBZSbp}S0LR*LV#5EK zh>t$+;$sQ=w8KXKPhJ-0g<4GO$OYrio?%`bwV!sl8*l$tVjd;Bd3*k!yy;fn)BjK2 zJS(sNGyhLwp_TZomA7vYj}5GoSysQR%U*FB)vwM^y{qF7MBo>gPkj~lLp>f^;@<<< zacM~LxTLRDID~n4VpO&4{SzPKMgzQwb)tnf8lAHzm+#T zSQuQspfWM~uhV~a!rK>*M33%PR+$JDW%J6WmtEiY{OK;0i6aW9ne~Fg@eNR&KfR*< z+RDT$)|M`-OuTcsFQGEA^y29ix$7zuSFV$+53=jmt;4)0mW{=2*J0kG`zjN!G-bg2 z%KC}X*J8nEumWe6PpeFfQ?tJc7ym^y9lGS%dXa?N zsyAL&U{u;T&FfdOSLV^)JQeeFZ=bh;p6>G|$Kv;%B8#cW)=P-(^m&uid-^S(x0ycV z^TyT7oqjZ)`W#18MRsuM+QX&F?;RZ4m$zb|?wwBiO83U8A*J)vz0;K5lj)7tSh@C1y%s(7j($4Rd$qbp$7Xpi zSMTa{TE*#!v>L3}WO=)(EA(4g-u7ycK1-{Cx=8?619b0zcP5tnWB}W+D}Y5F3t&HB zkJPMDvm#f2or;}Qv#YoMhOX#!=!#x*igLPoOH#RuYE~>Xl{!=u4JV6+nl7qYvB+ZF zZMCr5R5xsXhi=}uhF6%pS``DWyg{Xdx_P%dSe>8yVs%dU#ex!YLe+_{$m8ljne zvvbg#PG%lOODS52QN3BBhYl6Jsh`flo$aBl%clvwdQn^L-DyCbtA8cAwuYxPUy}_-lS5cr-`{TA_Xxo8q zp51E$TxRzge(5d_w)!;KXxp8*?WH*`vwN+t%Z6BW=~MbefA8Im^~?$0CZ&5OczA@((Qz+iY+xjWz5ze7)8zgc} zpMGsXk6gGA5ADAr#trj%|G_L06IpbpBzH$S#9!b7hEV(>#~mnsiDRlnD4(`%xSu(l zCxj}!2jkH1?Cqx~k;1~(F#k4`AYq&yGm}e~h!-Xp98D~QL@HEEbInJec z0>@NB8P7rok1`X&? z!G|#Rl=8+Wten$Uj)QZ1sB#GuyLVrT#k*U42*#clc%OMDC&&YBx|Ot$l3wDZl_rUE zimjX-l=Cv@?6q=Uw{nhA&H>IjY2{Q{IoSW0bdZzcF%Gq+ImK>kI#SMSoYURP8EEB< zp`153XS$U$&&pX!Id5{#W;ch%AMCP{_EXYZoOIYtB6Zx#IYl||aL#!vCpsov=>&{D zcs@x>GV#zDvU0Lx@RLZM_c>{dl{DQ-T59nkinfW-(*l#(*%m$yC4~3&nKMYw{o(roLtKJlymZ}oLN@RBFg!kb5;`%y4|wT zO4>{PGR`sM4-Q*NCn)JBPCCs=Mx3{DoLJ2H znRD_@Yc)&`FCfKm0Rh1+LaJRf7vKfKdf7B95oBFeeQ zIh(^g2xVab$E^6g6~|k1zIi}$TR+g^c~)Ft#l=><(~9X_rQyp#{EthyWt_8O^8n)( z)`8~pN^XJQn!|I5E9^2{axI=uyaw}G7GFf%!+a(E5=iJS*k#3KR!k2hp`24z?BE#l zczH(&7>9C_iN`Wev3QOZkEEPhia!ZT^Gj&s0y1jz#)~XoV#Rx{_>dK!u;L3Cd+PFj zoT}*-Pef_9t;ZZ67lKs<`^jj)20k!U@m%5!nde!27V$*p3oX8qcoXKu7T;&Z^tiwc z#^di~mEgyMP*22JQ)x$xJPWuic_qZ=53G9t(?VY5l?q3XYrN9Gu_HrdfkpHD_V zHfDtk zd<66E7SFfhg;u=Uig#G?zHl6bBVhq2t@wf!$H#>$=eOd4R-9+W1y;P&iZ@#EE)%=+ zf0<<*v*L3Ydq#1Kp?0_u@fdrqX5QT59f^-+o@McY#K$ooY4OQHGRCt}U>SwPCoo@a z@y*01GT&+OeZ(g*f8FB8h)-c&Zt)7@)7<(0f@Q?vwRq1A-k>qYp;6u4igT@avK241 z;?-7MV#Rx{_)r~d{y$+E6;>QwH(ZGh7<*=N<@^@UAwHXVuEq0-&tX2x;){siNF0y9 zm6oxQjJdqQ4vX(4KA(A+#g7nQ!2E>8PZPg|`FV>w@yKsuo`7+~pgUzIld+hM6f#_% zO+3hah{f}WFJV62;;V_@$$X>5cM@O5e6PiWuamKYjU$#(PW&$Br!9Vg_$ua3y>LYv zW9(VOJlW!Y;`cJowsEJr`brcjBMKA zS>{75o=5yS=F=^{ka#Kcr54{w`~~KFE&e+3mkh`G-!jU{c$qgiZSf1l4={J|6{JuL z8e{A^$UNENe&Vk&&$f6j@i&;~8Sc*iv&eXpjfK_*D~Z3wyx8J9h`+;pkHyP~zsvlv z#ZM4_pZO_^pAV98l#S?y;g%&}?D>#+lEqVqf5g1I#q)`O!hDv+7ZLxI`AUm#B>uTO z|L?Gjy<~jB8r zdwypgk8!AFe&T;J&$f6j@xPeoS$r1p;6H3Ew2YNxTx4Es@g2k~neVZ98F7VAmvK34 z@e{;rFh6DS^Ta*OgVBw{El9xF<7Fes;wi*qnRmDN5aP9%kFof4;cjCySBvNqUHyaDq=7C%nBA@h?KKSw-~IW!43EFNP|6Xwk=p3}sd|HoLyEGsUw z;$kb_X~p}k_=pvswBqwt9M{yX9JN0wBrx_{@jxriv*H3PUTVb~t$07io@Q>(S^PNh z7H-dBTy_2D92u?Lu4`s>9mby4Zr547Bk?xOvn)Q4cw6QpEk2oed*%gUj=w}o#-(hm z4jZtU_~p!ZT6`bzPRw7o_%Y&Ln3r3;f_N(P3l@)Sj@%byqcMumaomB7bmo4G=Mc|i zo@?=Z;sNHfEWU_%H|8rXzL9tj<~xFxv6qZqY?N922=U&`PgopUAn(gO4&zV*niKEG zyo1HFh!0?%<8pKSjU;0b8~N4-1;ht4Uu5ys#D_B9Xz`uIhcVx4@z;qDXMV)uJMCN-eUPgQp^TQTDL3|4HQx-o@d>ZrUR@ku6`F{cm&kQz_$Z*g9Q;5%G-reFu zh|gv|#^MW!&tbmQ;>E;oWL{$N;2tvOva#PX4ilfx{J6zW5nsUkoW-M)kl(^Q9^+60 zl8E2Nyradt6JHz^1X>272yHM1V~=}SPPX_w;!Ai(g%&R&ekb$I7T-mD8S{M>KSX>5 z^J7U^eyHG+WZcC@g|z{+M!t%99LAyi=ET=9?_lvP;`cJovG_>hYnkVVIJLikjCE`* z3K_^(6JO7Kqs4a;*Ua}?{B`1+m>;otIq?UWpSF1XC3OD3g^lJYLM`ivv1cpuEQ=2$ zzK!`vi%%xLoq2)93yD9>e6__l6Mxk3Ande^ePldl40zq*$A~|{yxigy#Ghn-!Qydk zknd*R7~@dGIuL)Fx!-X2{6B|`XW7WLHpnOb9P?QgUqrl=`AUm#B>n>P9Twk9{3YgP z7C#as<7GBZSjK7M2biC?xRZ?hAoB!_LoG`t{u=WXi)RymgZU7P=MjI?{1Q99Io&cA zlJORAu+-wk#NT0FV)56BzsvlH#mkAm&-}E-FAzV<+-Yl_|2J-n#)oVqV;pLkpZG`2 zvn`%W{1fJR7N14@Q|1dTzLNOo%!{iy9)CN?_=1f+RR%yA@voR4w)hF+Uo$^t@$N1FD3pn^CF9v5I@6wm&NxJ zKg&FL$TE(T@f#Z_Eq;#p@64fnxMlGed;VnJ+~OUH|HVAZ;sc5Q!+a!jp8qG4agmJz zYlA}KmCRRLd^2%X1LsJ5&#%P~6R*MixW!Kq_b@+a@#qd%zQ@Z(e1~w$k}$@vb20^V zw0L*owU`gI_!#1~nNPO(JmPhk7h1fCcs=CQ{>_%Li;M=m!9I&0BHobsF^iuhp2)ny z;&3VQCd}h74joO+i8o{30pqIk|12_Eu#sbJFp_vH=J^&cAl{n!B8#sk-iG-`i|-`f zmigW=55ntYv}fZ;*no24moh(X@e9N+XYO1UZdqfDJ)M{*Tij2)3-fG?=MqnK=l?v* zm_>$@l57>EM7)D!2GbqD~NYvej#WXahIdfgN?=*hwifu#CtLK zTRew&Z|1oc&nMoO`7DbsBHoYrN|&4CZzCB4*w|rhu$TBC=4BQ?LVPgu6Ba*Bd?@qt z7I!)#AI3ZZ<50trJL35F3}++7GO}rd5zL2JJdgM&=F=^{koeWims-4-_*mv87T-gB z9C2*_e#nkd zm~3q@kN6Dcg%&R&K9l)oi|-;noB2MAA0j@7`7w(JPm*yX8x@uTosrLF9*1$LWzC7t zXWqf$Lx?Y6KE~qHiQmF}p2e3EzpaKDe^6u@C1fn-4R%?4KXLbPJ!J9Y#FudXNsFH& zekXJ25^g{|#-3%&n|HzTLoMq_#tJsFtPKVdzl-@ui%%xLig|&>3yH5`zS`oOiQmh7 zXNXh#_mQ!djn_j4@?*r;F)z1x1@ZOFFIYS-1-WM47~@dGIuPH)96yL##d9zYdLCdS z*D~^HgDuQwS$q-kt;|czJWQ#jjm-*MD<{9;%QcV zs}--ZVy$m)UFV+CD<1RW8=iYd^M`QoQfbw4&}DdqvT9LSAig*OcwMk+>FqMSj8?UH z6wrkzzzb7VAMSa*7BfnsebCYmZ%Kf^d4$hE0nb#-vJC%|z65W0US<|zq}$*PPdv>+ zjC3;I+8P3ojceME<7!$_hf1E_sN%wMMTj6T$R;Pi7j7#nZsn_F; zmTbI{U*^Go?m`Woj4^E=T4>u@c$*DS2Y<$jmuy_!z|E$7@DVzh){#v3i!c%yB`ghxD&6~twV4h-pHhdI-3|R zAx1-@81+U&`5zTbY?H;PU}E=Mj0z_9fW@fXEr5?Wn-P*p3l+SD!zxCJ^pTx|cso!- zXV;ExsT%6x+nolgm09WaE9xYuDU22}D!LGtfFCLEeIc%u-nHFv^e?+==j%P&ooJnM zF)mssRL0>!d08DdYPlz_d+GRA(F<$#cm<2YW>qbP4i+DQy&8eNuKRvet9|fL1ncbx z>~IA3UIa#O6s}&S4|G`#S==5P|(0fkBihH&gU`6hp!2vq{w} z7!##)X4h;Nr0*rE?!`r5bt16%2&{etmJoq8VkSGjafHOC5mfV17N54uY%*R@Vrudj!@q0?UrT`b1zk%q|h_ z=^r6+pni$^eMkiB$_Oks0=p^#qmRN>AA_SKurbVJzh4s}F)sqUHUi7n>!{x+N3fmxAwWJLA$+z^2kFq6l?O%W33MPN7UZ|J_bHG;J$0=qo|D~!PIh`^RcV9S}w z`(kB;#JeM~)e+b|`lZ=5hXpr8ur@|u_eWs#X_M;x{$K=F5`jI$>{@XQ?1+%~NCdVs z0((3H+ogRU*XkC0CW5s$0((9J+ZTbo7=i7Nz+Pb%I%fqiCm9hEUyZ_`OmK?HUz0{b`uJ06SxKa0RlL||V=VC50meV@wj zB%X@EevH6QM_|81U=@<#J8`h!UnMl`Tm<$<1a>|G`#S==5P|(m?*yoRlmeb)S7%WX zSabvy6M@m^nyc@xW{8FQpL!uK1l{AFSe*!rK9^Q~hxH?{gb1urH5NmKG_Fya_i?S8 zq8r{_%_Vbn=}Vv0Dpk7X$k=3EvZA&V%rVdGxsrWi`C7~1YOE#N*HvTmtb9Q=HW}IK zYK)!_?ybgFB72J&cNrB-Pno`~mRN$Uq8i&CfjxrET)3b$F0?=TAoy~+nBgwOUO?7p zV2Ds&4gh^C!P5c)yoBttYK%VZS7VU9F~G~n9vq~5-=>vz7FoX#6t^Y4;7iRk|W%B0)b`Sr-qD@KPHZ z34OM*sio`Vm5)m;4fp|-PL`$u2U;3X53Q!J5;}Oc@@fmjV@>D;CA5%UQccr?W@sUw z9$>=D*~){KrV6<)%)2RPD{1BoE%C`1xi2RhMmubPcT#vcTiIAo`l`H09GLOGmoJ z(;a>R^&U&twB{1(toD|s{dcU=W{{n&)cYUDuR6N!Q~atU%3ojQ(@xJ;-fwB@pl7S; z_bpBN^g+|mLi;;oY4Xomn)X)*ucWxkNNf(k@|KZwuWJjtYIY z@?%Taheq(7rSZis_z5+=?BZT;ZUny}2zOBq6S(x4{G5 zUXo#&>(e}hpDAk#^kov^r7gW3$6DIKeBrl;TU{N8SqfhYD;9nS*yQR2<9C4Y)dAY= zF7>RHkE8KPwa*1KuodbLtOR_hQ=bU`DRox(m%<;erk4p7RzJQb6%<-7gNCkV|1#(j z_UUN69Q-bz0jf}68BRdb5k|N=$@m>%w(vW_O|DKhekY($K!=yku-4TbjNciasPd_N zd{u9cNazA@S0#|20`I%JBPxaZ2jQo}FRo58ekwTlazJ=VgW9g915QC2v=8~Fe0;^Q zqYJW3f)DzK63kxwFj)A0m?HdixZc&-X8UwlD*Oz%%hdyop8?xl&E-QT>~sOmk_z>! zVh369rmII9KMTGVegM96b)NC@mYl)k%+9dRX7hR1KmuxuT z>S9z1^{2w`4PUx?v+;YwdExhgi>}^f{63Ia8-uFyp)b&f!)e)vH-$RG)du4Cn00e? znelUAl<@n(HLgBl{C+S``2FD)SC<>VKdeI?E+3y(ZFCb(n}h-IjM%|IC=F?xc@=)c z>(P+Le1Jjlv8z{_?FRvUa6G(R0e`sKG5!@0PoL=yFN2{`9afw$7*br#bO>Y!e+bZr z%fri17%lvvP$2v(;b!4q2}O16@?jWk5DCLzkJv#jJTLrQI3oPv@UifRLxu3Kf8?HaSZr;e%+yf&ZMff8jL--?sKEWPdM!{&|kAec>kA|CtKN^BXBH?P-AQG;I zJ;EOY&kKJH91;Fl_*nR3p+flAz#qcDCJ6ELs8h9!gGR3A9vBDo3HR`l2N}Z8gIwW{ zhta|x4+X-%7H$@P@LE_a5+;Ba2@~KM;pf9X;pfAL!k-AA3V$M;6aIDZx9tbvI%rrg z+&+Lw(9G4`1Ct;__>-Z#@F&C7!k+@;g+B%8lkwqYD%@`QL51(K*(4IC!B#6l!8CYL z_|t(tE>8^_0YlvjAufda02=>p{MX?0ezg_ z-2wWuV1n>x!xZ7qhC<=r0L!afVYLe(0mj>T!Dq~lkjhWvts*OAdb#PtCm}#KI@>{f?J`J zNVpAruI38f23HDy5sVc6BA6rm#V}v^i=jyPx5EabvH!V%+u>=E5QI{(gCKk${6aV` z{6hFm_)Fj~;V%LDn0|P<1DcYi`=2Xt2c(OHJE5Da*}oG;3x6r(34bXp5dJb)Ec|6a zpW_cN%i%%PRK8n*&injkq{&z+KSX)lBb(OXxHG zv~a@R&_g7wg1%x0tKeGUuZGFOUkyRwuYqO4Ujy_R|L}4TJkp5EcPnrY925!n!kc0T z_riaLUt~V_PdnrW6hV!|@b2mDO0lkHe=Q^n|30`ZC=%|2ej;HV3>N-6m@52Ypf3iX zg$pQ#6~bQ+YlOcZb_#z31fLQK8{jRGpy7StYxq(48=*q@8=)3G$*Wp6K|NP<1vf!Q z;ol#GG?8#W3>66vzzE?#05=GKGtid?(82|5hI@s-1=b6H3+xeo@IiQ9Bs>U5MZ#A2 zMEG0bSK*hydEu8pgC<-d{=W^HxSA`t4g9trgomK3NO%ZF*$J>6#tDBr+${VZut@kj z@G_fSfrnv>@E?YKmXG8A5qL!;JOZCu2>_46SHgc3{uchus`veJ3wJ`ZrgjA$gVwHQ z|1szu_UZV09Qufa$6BmAe~QsF-hIU%3tpJ(6-k?;&m2_;bZ z@GQ&}{aY54(l`GCU{z zmw~=1!FvAt3VbXQUV*b>2M6F!;U9qd^iKAwr3@OontPxOe8N8n0pTA6`X&YI`R}W6 zjYxPE=8GM?2Db_SHP|5h*I~2pUx!lRzX2}`{|z{fI@JGImH)t(BH=&qm)OCZP$~R3 zp((vyT(um6Bv*3}9D;7be+zmG|1H3;S+L57x8XXG@HQ+KJ9r1~6#hH#pzsd^ef0t@ zT!F)IK=|*%8^V7V%3Ipy!+Y?ZNO%uaE8Zdhe;>TA<^tY_ON4&}Itc#=^cDV57$p3o zFgYj^K7i{*!UwQS_#eV5;eQB^2>%%D68E+S2H~W?S+2^`Ut-Q1`59d zCJFy6%n12dK33o?EENgA!rh?+(0kLYcNT{hE z5<94=UKV~W^_uW&sV{{er|63*XyN_GsY>D3R-X2z{h@@~Dycnh!2j#0cCO|f)KR^K zUsnwfeqD8)@Z;5V;m4~xgU!ZfRt3UutX2uXNl>j72~8Azt3`Ne zs-6*kQ}wR!o2d_l-%R}?{O0PM@SCf;mxlL_~Y{I^vtT)+u!RhE^2pE6WEh2Kt%6@Gg)LHO;}t-|l13WeW6JrMTk_`6hX z6A729{ow@kFH^4y|1$N3@Gn>22>){Rukbsn=*y|Cp&sa{TDjVt|2nC*BB7JYu1cWI zI;;M|@2n;Yzl)kC{4VMa;ioA23JqGghf~z{kk9i^s(MT$q^j3L31+i2^|tWS)VIR- zsh@=JQ!yRQhVDPVigPtrz^~f7+MWN>RVR^LC*PDf(`X@X}vhEByZI7U2(2 zLE#Tj_X~fZqOa?qg)1;nz0}z*9|oy|B4Lm^A$D+u`mgY>P#1+iSk>ra7cf}0bT!i< zDp~kLR4@8YkMJ^7^%Dt0RleB4m1?T+uT)EfKTNF<{xJ2B@N*S?mj^A}1G(z8phy_5 z-VzDJ)k)!BrG6CtRmzjXJLLZ(R4rF?0V7m9;g3`ug+EdS2Z)4GYN$vUrKSsiw7Nm~ zqt#u)zgpcZ{HxXD!XKmd2!Bjay(1FFs-q%dtfKGv2rt*DUxj~-s+}5k0mi8YuI3&X zr#cHiPx*x(%u~Ze!gw`GB#c)D!oODCEc|QLTH#MnTKE&xGs4eT`)of5`RYTFFj0MK zC%{B?PWacUzlDFDYM5sCz$Deo)!YM;tL~PM&;KW@t3|>THQq{4FhwmC{#13l z@TaOx!k?zL3V)hH*Q+QWx0qXay=viVrZZI= z;m=e(g+EK>RQY)P;~NOn1d%XXO{q#Cf3_+V{tarm@NZDtgg-|;D*QR>RpA$?Lm{8$ z9|Z;K8T==FRsDrOPYrRk`}}{NnkEwF ztJz`)^VLe>->mKt{>|z!;V)3Tg}*?(E&PS*2;ic7b9;8s=N z)!YNOs!qbcP5Fd>o4Qi?i_}P?vHy7oi_{#EuvpC(J6NoWgnzr*ApG0a)4~s`QsD>H z2f{B@$4S%u&lMMyZ_B`P7q?twd0Q&;o$cc^sX->JF@|4ubp_)AqDYAWBY zz*4n9BrH>l#SWIKjly599u)p^^@8wMr~|@Zp*|D-N>!fWKK^qHR;qtQ!d*&ba*Nr& zOEq^j)4SCr!oOSf5dJFFSNN;cwZdPmCTE)Vhk9VO3W|g^YMI!<8dW0vd(lCj9$UKjE)agN46NO%;Bz z3eFM<#cG8}Sg+Oyf4$l%{0-_U;crlH316%Cg|F3*!rvHF6(V7ysui$%V3VrnYVLte zs-y7lS82k(Ukw%h18RiuA5b?4Ke$=V6A7Euy&_?YS}*)9YLDQDK{UDU6^CF={HRx*hz&6#y)!YNylwbG{sjk9*NR1Nyb~R4;+ttmMkK=!bS|k#7 zC~YMGJgl|||6#RH_>ZVpg#U>8RQQjouY~`o`aA5?@wZdq+rQ1iE!?S^xti%?sygD2i^3>22RW1R~85G z!rwxlt)$PmP$PNqLKD>Cr6#lzIu6VfRtbG6thIFzE(2`? z{4B{9p*zBMp*z82LU)GULU)1Zgie8%gieKnmd4SX25(w`z6|bNq5bfo(CP50&>8TR z(3$Y9&{^=4&;d9b)^s#=g+IdpbvL*uba$xHBRu2)dO)nuJ)y49y`Z7c+0abr-q5;A zQ~A&b+E)S6eW8=kIp7nz9|VN%550sQ0R4m>2!n+l1j9qxl#k!4b9D$%`S{Is<9o^zMZ!#IA@nS0BlK*zROlO^ zi_mi*UFZVnCiIQa8+EvRd`tHLkuVpA3Ox@-2t6Oh3Vkz75PAVj5qcra6#5ppv8P== z+zJas!fmiv=tXd+(2LKzKg$}}cp$p*wp_jn6o>uz-?tn){!kzG>&`aT2p_jo6 zLNA8{La%@~gkA~n2z?hE4GM5Kd?NHJ_(JH_@Qu)G;0K}afipti3%?6p1pf%V7J{mm zJxcEbuh8qDw$R1UK1k;4x4zq>c0ds|Z7;X{z5eN$XC@d3tC#=t@AJSX%Xc*)X1{DKiUXaRs{;7y^Qg?EMC3m*#o9DFMD z^YE3>rSPrL`{1Xr4&vy00nUa2>KEZpp);dm4G0MRALu3Yo6t|_Lohg`P5JN^3=aXI;%ths(#eboCYqzrp~ae}kbypMw!X{|;k?{sSfm{U=Nj8sA~n+b$pQ zEmk7oZ&)DoKd@Nn3vj2<7vV0U|Al*nu7veMgL!G8p( zr&J$nkV1Xs6}o|{Ep&ovAaq03MCeAUmC%W*tT&^^s8pews!XAqsUAW%SAB(U zp#}-vQVkQjl^P{5lAXOa{I!(PPv`@V&v|oKF zbh`Rf=nVCh(3$Gnu%_cLOZ^lEr~~S(&|TG^LU&Uah3>9u^tA_V4;3qPPgPgwUaDc0 zHphRqYE}hkN4-^Rq5G)zLibgjgw9buq5G+T(EU{}p$DjbAT*8ZYz^HA(29YKG8PsyRXrQ}bQTSdwx)N4YIS8oY@t$JVR3F;%GL*?U(+MkPr ziRx>iuT$R(JxTp6^kns$&{Nc3LQhqdLQhkk9K5fq%E#A~YZ0hgW~h2XU#}8{o~c?0 zJxjF_dbYY$=o?fQq35V{)Zy~+CEac!;YQV4=$q64q35chLeEnpgr2X)3VpMhAoKz? zCC4rw7OI&d;TCnH(6_1uLf@tq3%y9)DfD7>m(aJXdxZ|F^*L7i0SeUvB4LTzCiETZ zQK9ctPYS(MJuCDw^@7mL)d8Vbs5gQFtW@s^eU~~a^xf(cp;xIdgkG(_5qgdKLFjwb z8KLi0!QTZaQvV3OR;hkfBNBuAlvn6=sN+o0R#5 zkg7V|uQG-Ifa)RiX4O~dEozX^52|582e+zG0+gt6LT^(Og?>m)6MDOvE%XjGSLlb; zEkZw{g0>FAqiUHA@U^8?LO-U~3jMg!LO-Fl2>qnmF7#9CF`;*>-Im7jzehc10lXfd zUK08lbx`PM)ti>4*P`C5ra!Hw%d6?rVU6FWf;;#l3{cgCi$cdibpNUWfI%IoC3HO0 z7rH()5jp{qgl+`wt8{5f7iWRecceP_^$wkfWa6z)pVSFy?%Jo9q&f-fo_%|={_>GJ zu}!jI?!2k8X6{ZhR-f znRC;Wx#Z|MKBtlXV6W3mpH6d}sMK_{8|Yqtc)ZbQXXpZ-lb}2JoOV&EnP@d9nnko{ z*VF*+VczTls$W_P%rLc?K4a<(f2cZXRC=F2z6rFRJZ0*P8>UR|?DM6q+wx9J-Su!> zO?}%lPE8%_cX~vnW$5e+o<{4AyyL+#(lYfdzmpY}mPNFoe#!5|Mx_PxJAS8|N+H&= zM&}_u-6`Ga74%UJup&NO`OH7+i@v#o{1d1T@U1MaqH6duLW;KXQ74;Bvt3q5(GGmn zKI5gsl$)*-9gRQkMJ>aYLTCL`x>K`8Mmp$MGM(nF@EvkDPnk4t!csU^F*b;5 z;m?2>|EqK!8tI~6Qv+E6y+6}w>Ge}H`~lti^bJ`~ zLtS#gQ&a!@RGqpVC*N?xgc&y!%%3-5?xcycrr<8psTzIyWXNJt(r|~pzxTAzb>_r2 zj!Ms1*XrHerl!8swdt8WEN4%gJCkIVP6{{;YxsPbIxFCek4X;zmZA>^uqIChoVrmN zDf&Rbxuju6DsQ-8#tpa~zUvPE`SjYZ*g+=tb4-1bkSV`_g!7R4=8 zhQ5(@Va7RhAx6+1Gfk=J&@MAgu_&m^GflZDsDMmUFbWzb znWp5%x~!YyiOMuZH`e7S@RzNq{0-eP%reF6B#fi7xOkmy1Q)OKjo{*Sp%GlXE7#OT6-Sa=CV+bAl-2#?&eqn)N+x<6A>e7f~S zr>V!pdg2u1bXTONr0di^PGg zX*tI!eX!%R4IYl6PQqB%yBd?Tncmo+_Kh*ld+xp|rRWN(IYm!XRL04symFHqFv%Nw zFr`nVQpuAo}Pq?uai zgF~=6@Ako}`b-t{nLgNdpJ{s&9p4vQ+&>#rQu;bxJr$!UEOkk?(~8#HaP6e}Oym5f zL~p7&s&Hscqso}WD%H>JHiuQJ-=}+1rAp*}UWt|aA_wcA&fWem#=1)%eDq4{hn3I8C<-Ts*?q9eI5FH~)|q;@ zS!d}ZW*yLHaqZ1CkB{l504LKFkRH&(>7Fsw&2Zb8Mbkj4?meFBn`P>oVcO`;GS$t{ zx&1@c#mR=Y513u+uXC}wKljJ#;?YCHxXu8_8-%}=(<3PH8 z(5y4`0kh81F>0xk(TPyPjTSa?{ko@D>%r|^#)MYQ%wm0Dvi34x)kRm+Nsx^N2CT!c`K?#J33~-+ z-$etllkp^C3$1-A`W3TI)nA!)+J-@daaO`LKP;rBm=1N!8AKY+KTEJnOuwN+9U5aE z7Vvn+8OTX9!#B;$K}{X=u#lGOw$Yp~phbNegJ%eMhQl*ai=j9?QcVkWuc15>nXb-9 zK{HXaD1U~2@(Qe)KU2SF)>-~MvYChOt~4{{=uX4T>_K;<9yW|- z4{o6@K%q;9&;jVvFAu?bW%%`%W}U7p%{oIT4JDqbd*j-hVRq{?9qDAy;hyHhQGoY# z3=M)bGs!fKF^4ABkmi`QOw%mCX`?rjMggXkuq1t%e&C(Ag%yfjSWb$7hZu zd_4vxZekf*M~@69iv=zWZ$d};dUt8ftDaaLypt^K--S*Pnr&XGR*Aa z!!v7>M1866y&C6=G@OBPKQvdI7>Sj`bLfk-#v`odC|alLUS^%9^UWF`d2#JEhZIgI zbaLaEL&}F|H(!r&2L(E2xZtTVKC8g<8+2OXxsYiao(~gr+m=BiAM>egG3HSZAF1i| zX7N}vPf+Xh*0D5Cr1F3$L!m3MZS;Uw`)aHu9$%f!I!g~TYn(G_or$vILDs7#vKWG51BENNkrxU$p zyqO%RW%|H)njCOje4NMoKW-e>4`+r>8B>(%#f~!)1Y`C<0w37!9tqo3NrBM!QyFV=rNuujx)ox9AxSs2LWAT0-PBRV&M4A z%;3u~Me)qw!y(j~Dr>qB&vvjdo*D2i#`8JchGqura4L;w1{6sXLxTcmc#O^C26hk5 zCHm!w*wr}o(g68tA`aQQ6P#unuEQV&1DY0wPQV_=JNpK+_Un7i8YfD##yJw#JT3UL zOjq)>;KM;g?dNF$Eh-|$Obd7~d^nM$ zQe#c?@Wg>e$(czwHTdvsg&Z6j-6vv2acUS(Yn&QxH|tcr)vVKWnOWn|#I-v$;CUr( z>rM?gs(Mo$=}_{gm@;C_)PN6bbav!Vrw2xKXuLRPe(>XTVj5}Y2eiz9G4lfo8Zi3H zDR}qenE=I=7}L`w+C(Q!#ZJz}7Me5TNmyq(Gd62HGd62HGd63S1#r!0#(sQU$6E54 zu^$K2aO?|nnu!jT5@Q~I{pLB6<2SPfI@C^YCUqZ*+-cayrkQw(gt3<5cYmyQ$1`y8a|3J!3>oQ{WGx;abt z^HZPLbTfPS@#N%2JX*}~LyMkrdec)(51J=GxRvQbe)@yTjFfa;FcWJ{Gol}#v(paD zi3L94!dXVwp5;u@Y5QUlbkV=HV{7=+{W^7DO!Lxjmc~68Rr>x7P91N|>?yP7PMN2# zPl@g5&%zV4J_&mw1QhAleD<7}?yh_(|j^e}o)(>O6y5j=8q*w4!OhY|* zfip%AU*I$-ePMxfAS!C^Tz%`UP757#cU)4F`SWJXn%j9&=Q-D1-z5o`)XWTDh93*p z+iKKFEdBLXr(+|pg&Iev_yd8`-fNvMQEH?cpy8oxLBgStjH9aBO>)EoRN+IGZWuh{Rj)Q5{5$I~$ue;8e>^-dc#R9`H1 z+Iwz9(#{Z%#;~FOdaG&>*yNSJK(-65INaGKc#FoH!W-$ws^#s|Th=>?f$I2lE&j<4 z+MGYQ5qa|t`e)p{YxT{CU{T4qDQ!-rhDxU&hrkL{Ed_D9>=ma`{p$R1oQ^*bftNGy z5y1T6mqzdZzS-P>jME0^@U z-Am9b#M{kyqlJFon;0!2MtOAC-iNm$ox0sQprdywd>vyU#Dr+iwp@s5Rp-?z9Lklq)5w)waHOQJXt7~#8k?xb^ zn*2j{r*}B>yuoDS(Z4u&7P}+I(l4P7E%dWGp9zh>*=K3`QJ~*ZW3QNn^6Oa#9O=&0 z^w1dmsk87>8%E+K1NvE>1Q=_j;y{3FUELbf73!(NZv-=4P0dmG14wg)p9l+G-Ol)l zP$>MyRX=9ckoIh{q~bid@vebwruK}S5b%W+-Ue* z_%UK`qRelFUlV>5Iu6bVjXxM?YkDE@FB{-58T~7CeW+m#Nj$p15xODN7P=AC7djCV zg>DSZE$yKWOV$^ka$403Se$Sl-D0=XDmbPZo?1=Mtfm)K(@QK(KaD1Tam#@<6*nbLDk;<~bY z+n=R>f6nQSFC5S*i5~I1(-mK_%1G0zpLg=~Pt9u8OvICq40E=TVNN#ibv7ayrIpV+ zlg&BBloy=gO>0iMVbYw*Q*KHPol;agpZM+tC#SJ}K9N{D@B=5WiIah+t{Iv5GFA57 zafzj`{p8HIqZOTBh%N2>Ld~0}IPS?y z2J=^2)+&9qW!%j(tM*iiCH5aG6 // 添加offsetof宏支持 #include // 添加数学函数支持 #include +#include #include "version.h" #if 0 // DEBUG_PRINT_ENABLE @@ -23,6 +24,15 @@ extern unsigned g_3d_fps; #if C1_DFS_EN extern unsigned g_tile1_lp_div; /* tile1_clk.xc: tile[1] low-power divider (动态降频) */ #endif +/* 改动原因:XMOS_FPS_EN 时 0xB5/0xB6/0xB7 归 FPS HID 协议;DNR 查询/上报改 0xC5,DFS HID 与 FPS 互斥 */ +#if XMOS_FPS_EN +#define C1_HID_GET_DNR_ENABLE_OPCODE 0xC5 +#else +#define C1_HID_GET_DNR_ENABLE_OPCODE 0xB5 +#endif +#if HID_DFU_EN +#include "dfu_upgrade.h" +#endif #if DEBUG_MEMORY_LOG_ENABLED unsigned g_log_switch = 1; #else @@ -30,17 +40,14 @@ unsigned g_log_switch = 0; #endif -// 常量定义 -#define EQ_DISABLED_MODE 10 // 禁用EQ的模式编号 - #include "xmath/filter.h" #include "eq.h" #include #include #include -#if 1// !UAC1 #include "eq_params_44100.h" +extern unsigned g_3d_fps; // 改动原因:进一步优化EQ参数存储策略,所有采样率共用44100Hz数组 // 参数在所有采样率下是相同的,只有系数需要根据采样率动态计算 // 切换采样率时,直接使用44100Hz数组的参数,重新计算系数即可 @@ -48,7 +55,7 @@ unsigned g_log_switch = 0; * @brief 获取指定采样率的EQ数组指针(统一使用44100Hz数组) * @param sample_rate 采样率 * @return EQ数组指针,始终返回44100Hz数组 - * + * * 改动原因:所有采样率共用44100Hz数组,参数相同,系数根据采样率动态计算 */ static inline eq_mode_data_t (*get_eq_array_ptr_common(uint32_t sample_rate))[NUM_EQ_MODES][NUM_EQ_CHANS] { @@ -59,7 +66,6 @@ static inline eq_mode_data_t (*get_eq_array_ptr_common(uint32_t sample_rate))[NU #include "eq_coefficient_calculator.h" #include "biquad_standalone.h" #include "eq_flash_storage.h" -#endif #include "user_func.h" // 改动原因:包含check_sum函数声明,用于uart_checksum宏定义 #include "dfu_upgrade.h" // 改动原因:包含固件升级函数声明,用于处理HID固件升级命令 #include "roleswitchflag.h" @@ -79,8 +85,190 @@ static struct { bool is_get_current_uac_mode_request; // GET_CURRENT_UAC_MODE请求标志 } uac_request = {0}; +extern unsigned g_sync_t0_to_t1_cmd; +extern unsigned g_sync_t0_to_t1_data; +/* 改动原因:上电 sync 0x03 经 data2 携带 FPS 三模块使能包(bit31=1) */ +extern unsigned g_sync_t0_to_t1_data2; +// 改动原因:从FPS算法侧引入game和level两个全局变量,用于HID与tile1之间同步当前FPS配置 +extern unsigned g_fps_game_select; +extern unsigned g_fps_level_select; +/* 改动原因:HID 0xB5/0xB6 读写 FPS 库三子模块使能,tile0 存 Flash 后经 sync 0x08 同步到 tile1 */ +extern unsigned g_fps_drc_enable; +extern unsigned g_fps_sub_enable; +extern unsigned g_fps_eq_enable; +/* 改动原因:HID 0xBD/0xBE 读写 DRC 压缩模式,tile0 存 Flash 后经 sync 0x0C 同步到 tile1 */ +extern unsigned g_fps_drc_mode; +#include "fps_eq_flash.h" +#include "fps_eq_sync.h" +#include "fps_tile_sync.h" +#include "user_uart.h" +/* 改动原因:与 eq_hid_protocol_ds1 一致,0xA7-0xAE 保留固件升级/重启;FPS game/level 置于 DRC(0xBD/0xBE) 之后 */ +#define HID_SET_FPS_XMOS_GAME_SELECT 0xBF +#define HID_GET_FPS_XMOS_GAME_SELECT 0xC0 +extern void save_value(unsigned char *path, unsigned char value); +extern unsigned char load_value(unsigned char *); #if EQ_EN +/* 改动原因:tile0侧缓存FPS fps_eq五模式Flash数据,HID读写与关机保存 */ +static fps_eq_flash_store_t s_fps_eq_store; +static unsigned char s_fps_eq_store_valid = 0; + +static void fps_eq_store_ensure_loaded(void) +{ + if (!s_fps_eq_store_valid) { + if (fps_eq_flash_load(&s_fps_eq_store) != 0) { + fps_eq_flash_set_defaults(&s_fps_eq_store); + fps_eq_flash_save(&s_fps_eq_store); + } + s_fps_eq_store_valid = 1; + } +} + +static void fps_eq_store_save(void) +{ + fps_eq_flash_save(&s_fps_eq_store); +} + +/* 改动原因:上电LOAD_CONFIGS调用,从Flash恢复fps_eq到tile0并排队 sync 0x09+0x0B 到 tile1 */ +void fps_eq_boot_publish_to_tile1(void) +{ + unsigned mode; + + fps_eq_store_ensure_loaded(); + mode = s_fps_eq_store.current_mode; + if (mode >= FPS_EQ_MODE_COUNT) { + mode = 0; + s_fps_eq_store.current_mode = 0; + } + fps_eq_publish_mode_and_gains(mode, s_fps_eq_store.gains[mode]); + /* 改动原因:0x03 已占用 sync 槽,fps_eq 须入队;pack 末包 apply 后写入算法库 */ + sync_t0_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_EQ_MODE, mode, 0); + fps_eq_queue_pack_words_to_tile1(1, 1); +} + +/* 改动原因:上电LOAD_CONFIGS调用,从Flash恢复fps_drc_mode并排队 sync 0x0C 到 tile1 */ +void fps_drc_boot_sync_to_tile1(void) +{ + unsigned mode; + + GET_SHARED_GLOBAL(mode, g_fps_drc_mode); + /* 改动原因:mode仅0=low、1=high,Flash未写入或无效时默认0 */ + if (mode > 1) { + mode = 0; + } + sync_t0_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_DRC_MODE, mode, 0); +} + +/* 改动原因:C1 无 UART,不经过 c_uart_sync/SYNC_CMD_LOAD_CONFIGS;上电在 tile0 直接读 Flash 恢复 FPS 并 sync 到 tile1 */ +void fps_boot_load_from_flash(void) +{ + unsigned fps_game_select = load_value("fps_game_select"); + unsigned l0, l1, l2; + unsigned fps_level_select; + unsigned packed_fps; + unsigned fps_drc_en, fps_sub_en, fps_eq_en; + unsigned fps_drc_mode; + unsigned packed_enable; + + if (fps_game_select > 2) { + fps_game_select = 0; + } + /* 改动原因:每种 game 单独存 level,无效或未存则默认档位 2 */ + l0 = load_value("fps_level_g0"); + l1 = load_value("fps_level_g1"); + l2 = load_value("fps_level_g2"); + if (l0 > 4) { l0 = 2; } + if (l1 > 4) { l1 = 2; } + if (l2 > 4) { l2 = 2; } + if (fps_game_select == 0) { + fps_level_select = l0; + } else if (fps_game_select == 1) { + fps_level_select = l1; + } else { + fps_level_select = l2; + } + + SET_SHARED_GLOBAL(g_fps_game_select, fps_game_select); + SET_SHARED_GLOBAL(g_fps_level_select, fps_level_select); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, (unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_XMOS_GAME_SELECT); + packed_fps = (fps_game_select & 0xFF) | ((fps_level_select & 0xFF) << 8); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, packed_fps); + + debug_printf("fps_boot: game %u level %u (from fps_level_g%u)\n", + fps_game_select, fps_level_select, fps_game_select); + + fps_drc_en = load_value("fps_drc_enable"); + fps_sub_en = load_value("fps_sub_enable"); + fps_eq_en = load_value("fps_eq_enable"); + /* 改动原因:Flash 未写入或无效(>1) 时:DRC/fps_eq 默认关,FPS 主处理默认开 */ + if (fps_drc_en > 1) { fps_drc_en = 0; } + if (fps_sub_en > 1) { fps_sub_en = 1; } + if (fps_eq_en > 1) { fps_eq_en = 0; } + SET_SHARED_GLOBAL(g_fps_drc_enable, fps_drc_en); + SET_SHARED_GLOBAL(g_fps_sub_enable, fps_sub_en); + SET_SHARED_GLOBAL(g_fps_eq_enable, fps_eq_en); + + fps_drc_mode = load_value("fps_drc_mode"); + if (fps_drc_mode > 1) { + fps_drc_mode = 0; + } + SET_SHARED_GLOBAL(g_fps_drc_mode, fps_drc_mode); + + /* 改动原因:bit31=1 表示 data2 含有效使能包,避免与 HID 0xBF 仅改 game 时 data2=0 混淆 */ + packed_enable = (fps_drc_en & 0xFF) + | ((fps_sub_en & 0xFF) << 8) + | ((fps_eq_en & 0xFF) << 16) + | (1u << 31); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data2, packed_enable); + + /* 改动原因:上电先发 sync 0x03(game/level+data2 使能),fps_eq/drc 经 pending 队列紧随其后 */ + fps_drc_boot_sync_to_tile1(); + fps_eq_boot_publish_to_tile1(); +} + +static void fps_eq_tile0_sync_mode(unsigned mode) +{ + /* 改动原因:tile0 发布 pack 后 sync 0x09+五包 0x0B 到 tile1,避免跨 tile SET_SHARED_GLOBAL 无效 */ + fps_eq_publish_mode_and_gains(mode, s_fps_eq_store.gains[mode]); + sync_t0_send_or_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_EQ_MODE, mode, 0); + fps_eq_queue_pack_words_to_tile1(1, 0); +} + +static void fps_eq_tile0_sync_band(unsigned band, int16_t gain) +{ + int16_t gains[FPS_EQ_BAND_COUNT]; + unsigned m; + unsigned packed; + + m = s_fps_eq_store.current_mode; + if (m >= FPS_EQ_MODE_COUNT) { + m = 0; + } + memcpy(gains, s_fps_eq_store.gains[m], sizeof(gains)); + gains[band] = gain; + s_fps_eq_store.gains[m][band] = gain; + fps_eq_publish_gains_to_shared(gains); + + packed = (band & 0xFF) | (((unsigned)(uint16_t)gain) << 8); + sync_t0_send_or_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_EQ_BAND_GAIN, packed, 0); + /* 改动原因:单段调节后同步含该段的 pack 字到 tile1,保持与 Flash 一致 */ + { + unsigned pack_idx = band / 2; + int32_t pack_val; + unsigned data1; + + switch (pack_idx) { + case 0: GET_SHARED_GLOBAL(pack_val, g_fps_eq_pack0); break; + case 1: GET_SHARED_GLOBAL(pack_val, g_fps_eq_pack1); break; + case 2: GET_SHARED_GLOBAL(pack_val, g_fps_eq_pack2); break; + case 3: GET_SHARED_GLOBAL(pack_val, g_fps_eq_pack3); break; + default: GET_SHARED_GLOBAL(pack_val, g_fps_eq_pack4); break; + } + data1 = pack_idx | (1u << 8); + sync_t0_send_or_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_EQ_PACK, data1, (unsigned)pack_val); + } +} + #if 0 void print_float(float value, int precision) { @@ -149,6 +337,15 @@ static struct { bool is_get_filter_mode_request; // 改动原因:添加获取滤波器模式请求标志,用于GET_FILTER_MODE (0xA3) bool is_get_game_mode_request; // 改动原因:添加获取游戏模式请求标志,用于GET_GAME_MODE (0xA5) bool is_get_firmware_version_request; // 改动原因:添加获取固件版本请求标志,用于GET_FIRMWARE_VERSION (0xA6) + bool is_get_fps_xmos_game_select_request; // 改动原因:GET_FPS_XMOS_GAME_SELECT (0xC0) 查询指定 game 的 level + uint8_t fps_game_query; // 改动原因:0xC0 请求中指定的 game(0/1/2) + bool is_get_fps_module_enable_request; // 改动原因:GET_FPS_MODULE_ENABLE (0xB6) 读取 DRC/FPS主处理/fps_eq 使能 + bool is_get_fps_drc_mode_request; // 改动原因:GET_FPS_DRC_MODE (0xBE) 读取 DRC 压缩模式 0=low 1=high + bool is_get_fps_eq_mode_request; // 改动原因:GET_FPS_EQ_MODE (0xB8) 读取fps_eq当前模式0-4 + bool is_get_fps_eq_band_gain_request; // 改动原因:GET_FPS_EQ_BAND_GAIN (0xBA) + uint8_t fps_eq_band_query; // 改动原因:0xBA请求中的频段0-9 + bool is_get_fps_eq_mode_name_request; // 改动原因:GET_FPS_EQ_MODE_NAME (0xBC) + uint8_t fps_eq_mode_name_query; // 改动原因:0xBC请求中的模式0-4 bool is_get_mute_switch_request; // 改动原因:添加获取静音开关请求标志,用于GET_MUTE_SWITCH (0xB2),值由MCU通过UART 0x5F返回 bool is_get_listen_switch_request; // 改动原因:添加获取监听开关请求标志,用于GET_LISTEN_SWITCH (0xB4),直接读 g_adc_loop bool is_get_dnr_enable_request; // 改动原因:添加获取AI通话降噪请求标志,用于GET_DNR_ENABLE (0xB5),直接读 g_dnr_enable @@ -487,13 +684,12 @@ static inline int32_t apply_gain(int32_t sample, int32_t gain_db) { * 改动原因:所有采样率共用44100Hz数组,参数相同,只需要设置sample_rate标记 * 系数会根据采样率动态计算,不需要复制参数 */ -#if 1// !UAC1 static int copy_params_from_44100(uint32_t sample_rate, uint8_t mode) { if (mode >= NUM_EQ_MODES) { debug_printf("Error: Invalid mode %d in copy_params_from_44100\n", mode); return -1; } - + // 改动原因:所有采样率共用44100Hz数组,只需要设置sample_rate标记 // 参数已经存储在44100Hz数组中,不需要复制 for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { @@ -501,7 +697,7 @@ static int copy_params_from_44100(uint32_t sample_rate, uint8_t mode) { // 重置total_bshift(将在计算系数时更新) sEQ_data_44100HZ[mode][ch].total_bshift = 0; } - + debug_printf("Set sample rate to %dHz for mode %d (using 44100Hz array)\n", sample_rate, mode); return 0; } @@ -675,7 +871,7 @@ void update_eq_post_gain(void) { } } } -#endif + unsigned int is_mode_changed(void) { if ((g_current_eq_mode != g_new_eq_mode) || (g_force_eq_mode_change == 1)) @@ -706,7 +902,6 @@ unsigned int is_eq_disabled(void) } void clear_eq_status(unsigned sample_freq, unsigned ch_no) { -#if 1// !UAC1 int n; debug_printf("clear_eq_status %d %d\n", sample_freq, ch_no); if(is_eq_disabled()) @@ -722,13 +917,12 @@ void clear_eq_status(unsigned sample_freq, unsigned ch_no) { (*eq_data)[g_current_eq_mode][ch_no].filter.state[0][n] = 0; (*eq_data)[g_current_eq_mode][ch_no].filter.state[1][n] = 0; } -#endif } // 复位EQ参数函数 uint8_t reset_eq_params(uint8_t mode) { debug_printf("Resetting EQ params for mode %d\n", mode); -#if 1 //!UAC1 + // 检查模式号有效性 if (mode != 0xFF && mode >= NUM_EQ_MODES) { debug_printf("Error: Invalid mode %d\n", mode); @@ -749,7 +943,6 @@ uint8_t reset_eq_params(uint8_t mode) { init_mode_info(); debug_printf("EQ params reset successful for mode %d\n", mode); -#endif return 0x00; // 成功 } @@ -890,7 +1083,6 @@ void debug_print_eq_mode(eq_mode_data_t *eq_data) { int32_t handler_eq_filter(unsigned sample_freq, uint32_t ch, int32_t new_sample) { int32_t temp_sample = new_sample; -#if 1// !UAC1 if(is_eq_disabled()) { @@ -918,7 +1110,7 @@ int32_t handler_eq_filter(unsigned sample_freq, uint32_t ch, int32_t new_sample) if (count % 100000 == 0) { debug_printf("post_gain: %d\n", post_gain); } - + temp_sample = temp_sample >> 1; //Q30 // 应用均衡器滤波 @@ -937,7 +1129,6 @@ int32_t handler_eq_filter(unsigned sample_freq, uint32_t ch, int32_t new_sample) } } -#endif return temp_sample; } @@ -1117,7 +1308,6 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { return false; } -#if 1// !UAC1 // Process read request (0x8E) - GET_EQ_PARAMS if (data[1] == 0x8E) { debug_printf("Received read request (GET_EQ_PARAMS)\n"); @@ -1433,7 +1623,7 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { led_request.is_get_led_count_request = true; return true; } -#endif + // 处理获取UAC模式信息命令 (0x9A) - GET_UAC_MODE_INFO // 改动原因:添加UAC模式信息查询命令,返回UAC模式总数和模式名称列表 if (data[1] == 0x9A) { @@ -1455,8 +1645,8 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { debug_printf("Error: Invalid UAC mode %d (must be 0-1, 0=UAC2.0, 1=UAC1.0)\n", uac_mode); return true; } - - debug_printf("HID 0x9B: Setting UAC mode to %s, forwarding to MCU via UART 0x51\n", + + debug_printf("HID 0x9B: Setting UAC mode to %s, forwarding to tile1 for UART 0x51\n", uac_mode == 0 ? "UAC2.0" : "UAC1.0"); // 改动原因:HID 0x9B命令通过UART 0x51命令透传给MCU @@ -1533,15 +1723,16 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { return true; } - // 处理获取AI通话降噪开关命令 (0xB5) - GET_DNR_ENABLE - // 改动原因:规格 mic 键长按切换 DNR 无指示灯,APP 通过 HID 0xB5 读取/接收主动上报 g_dnr_enable - if (data[1] == 0xB5) { - debug_printf("Received get DNR enable command (GET_DNR_ENABLE) via HID 0xB5\n"); + // 处理获取AI通话降噪开关命令 - GET_DNR_ENABLE + // 改动原因:XMOS_FPS_EN 时 0xB5 为 SET_FPS_MODULE_ENABLE,DNR 读改用 C1_HID_GET_DNR_ENABLE_OPCODE(0xC5) + if (data[1] == C1_HID_GET_DNR_ENABLE_OPCODE) { + debug_printf("Received get DNR enable command (GET_DNR_ENABLE) via HID 0x%02X\n", + C1_HID_GET_DNR_ENABLE_OPCODE); read_request.is_get_dnr_enable_request = true; return true; } -#if C1_DFS_EN +#if 0 // C1_DFS_EN // 处理设置tile1动态降频分频值命令 (0xB6) - SET_TILE1_DIV // 改动原因:动态降频,主机设置tile1低功耗分频值(600MHz/N);状态机下次降频或当前已降频时生效 if (data[1] == 0xB6) { @@ -1721,9 +1912,247 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { return true; } + // 处理设置FPS库三子模块使能 (0xB5) - SET_FPS_MODULE_ENABLE + // 改动原因:tile0 收 HID,写 Flash 并 sync 0x08 到 tile1 调用 fps_xmos_xc_set_module_enable + if (data[1] == 0xB5) { + uint8_t drc_enable = (data[2] != 0) ? 1 : 0; + uint8_t fps_sub_enable = (data[3] != 0) ? 1 : 0; + uint8_t eq_enable = (data[4] != 0) ? 1 : 0; + + debug_printf("HID 0xB5: FPS module enable drc=%u fps=%u eq=%u, sync to tile1\n", + drc_enable, fps_sub_enable, eq_enable); + + save_value("fps_drc_enable", drc_enable); + save_value("fps_sub_enable", fps_sub_enable); + save_value("fps_eq_enable", eq_enable); + + SET_SHARED_GLOBAL(g_fps_drc_enable, (unsigned)drc_enable); + SET_SHARED_GLOBAL(g_fps_sub_enable, (unsigned)fps_sub_enable); + SET_SHARED_GLOBAL(g_fps_eq_enable, (unsigned)eq_enable); + + unsigned packed = (drc_enable & 0xFF) + | ((fps_sub_enable & 0xFF) << 8) + | ((eq_enable & 0xFF) << 16); + /* 改动原因:与上电一致,经 channel sync 0x08 写 tile1 全局再 apply */ + sync_t0_send_or_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_MODULE_ENABLE, packed, 0); + return true; + } + + // 处理获取FPS库三子模块使能 (0xB6) - GET_FPS_MODULE_ENABLE + if (data[1] == 0xB6) { + debug_printf("Received GET_FPS_MODULE_ENABLE (0xB6)\n"); + read_request.is_get_fps_module_enable_request = true; + return true; + } + + // 处理设置DRC压缩模式 (0xBD) - SET_FPS_DRC_MODE + // 改动原因:tile0 收 HID,写 Flash 并 sync 0x0C 到 tile1 调用 fps_xmos_xc_drc_set_mode + if (data[1] == 0xBD) { + uint8_t drc_mode = data[2]; + if (drc_mode > 1) { + debug_printf("HID 0xBD: invalid drc_mode %u\n", drc_mode); + return false; + } + debug_printf("HID 0xBD: FPS DRC mode=%u, sync to tile1\n", drc_mode); + save_value("fps_drc_mode", drc_mode); + SET_SHARED_GLOBAL(g_fps_drc_mode, (unsigned)drc_mode); + sync_t0_send_or_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_DRC_MODE, (unsigned)drc_mode, 0); + return true; + } + + // 处理获取DRC压缩模式 (0xBE) - GET_FPS_DRC_MODE + if (data[1] == 0xBE) { + debug_printf("Received GET_FPS_DRC_MODE (0xBE)\n"); + read_request.is_get_fps_drc_mode_request = true; + return true; + } + + // 处理设置FPS XMOS游戏选择 (0xBF) - SET_FPS_XMOS_GAME_SELECT + // 改动原因:0xA7-0xAE 与 ds1 一致保留固件升级;game/level 命令放在 DRC(0xBD/0xBE) 之后 + if (data[1] == HID_SET_FPS_XMOS_GAME_SELECT) { + debug_printf("Received SET_FPS_XMOS_GAME_SELECT via HID 0x%02X\n", HID_SET_FPS_XMOS_GAME_SELECT); + uint8_t game_select = data[2]; + uint8_t level_select = data[3]; + if (level_select > 4) { + level_select = 2; + } + debug_printf("HID 0x%02X: game=%d level=%d, sync to tile1\n", + HID_SET_FPS_XMOS_GAME_SELECT, game_select, level_select); + if (game_select <= 2) { + save_value("fps_game_select", game_select); + if (game_select == 0) { + save_value("fps_level_g0", level_select); + } else if (game_select == 1) { + save_value("fps_level_g1", level_select); + } else { + save_value("fps_level_g2", level_select); + } + unsigned packed_fps = (game_select & 0xFF) | ((level_select & 0xFF) << 8); + SET_SHARED_GLOBAL(g_fps_game_select, game_select); + SET_SHARED_GLOBAL(g_fps_level_select, level_select); + sync_t0_send_or_enqueue_to_tile1((unsigned)SYNC_CMD_T0_TO_T1_SET_FPS_XMOS_GAME_SELECT, packed_fps, 0); + } else { + debug_printf("Error: Invalid FPS game %d (must be 0-2)\n", game_select); + return false; + } + return true; + } + + // 处理获取FPS XMOS游戏选择 (0xC0) - GET_FPS_XMOS_GAME_SELECT + if (data[1] == HID_GET_FPS_XMOS_GAME_SELECT) { + uint8_t game_to_query = (len >= 1) ? data[2] : 0; + if (game_to_query > 2) { + game_to_query = 0; + } + debug_printf("Received GET_FPS_XMOS_GAME_SELECT (0x%02X), query game=%d\n", + HID_GET_FPS_XMOS_GAME_SELECT, game_to_query); + read_request.is_get_fps_xmos_game_select_request = true; + read_request.fps_game_query = game_to_query; + return true; + } + + // 处理设置fps_eq模式 (0xB7) - SET_FPS_EQ_MODE,模式0-4,默认0,关机保存Flash + if (data[1] == 0xB7) { + uint8_t mode = data[2]; + if (mode >= FPS_EQ_MODE_COUNT) { + debug_printf("HID 0xB7: invalid mode %u\n", mode); + return false; + } + fps_eq_store_ensure_loaded(); + s_fps_eq_store.current_mode = mode; + fps_eq_store_save(); + fps_eq_tile0_sync_mode(mode); + debug_printf("HID 0xB7: fps_eq mode=%u, synced to tile1\n", mode); + return true; + } + + // 处理获取fps_eq当前模式 (0xB8) - GET_FPS_EQ_MODE + if (data[1] == 0xB8) { + read_request.is_get_fps_eq_mode_request = true; + return true; + } + + // 处理设置fps_eq单段增益 (0xB9) - SET_FPS_EQ_BAND_GAIN,单位0.01dB,-600~600 + if (data[1] == 0xB9) { + uint8_t band = data[2]; + int16_t gain = (int16_t)((uint16_t)data[3] | ((uint16_t)data[4] << 8)); + if (band >= FPS_EQ_BAND_COUNT) { + debug_printf("HID 0xB9: invalid band %u\n", band); + return false; + } + gain = fps_eq_clamp_gain(gain); + fps_eq_store_ensure_loaded(); + fps_eq_tile0_sync_band(band, gain); + fps_eq_store_save(); + debug_printf("HID 0xB9: mode=%u band=%u gain=%d, saved & synced\n", + s_fps_eq_store.current_mode, band, (int)gain); + return true; + } + + // 处理获取fps_eq单段增益 (0xBA) - GET_FPS_EQ_BAND_GAIN,读当前选中模式 + if (data[1] == 0xBA) { + uint8_t band = data[2]; + if (band >= FPS_EQ_BAND_COUNT) { + band = 0; + } + read_request.is_get_fps_eq_band_gain_request = true; + read_request.fps_eq_band_query = band; + return true; + } + + // 处理设置fps_eq模式名 (0xBB) - SET_FPS_EQ_MODE_NAME,模式0-4,写Flash断电保存 + if (data[1] == 0xBB) { + uint8_t mode = data[2]; + char mode_name[FPS_EQ_NAME_LEN]; + if (mode >= FPS_EQ_MODE_COUNT) { + debug_printf("HID 0xBB: invalid mode %u\n", mode); + return false; + } + fps_eq_store_ensure_loaded(); + memcpy(mode_name, &data[3], FPS_EQ_NAME_LEN); + mode_name[FPS_EQ_NAME_LEN - 1] = '\0'; + fps_eq_name_set(&s_fps_eq_store, mode, mode_name); + fps_eq_store_save(); + debug_printf("HID 0xBB: set fps_eq mode %u name='%s'\n", mode, mode_name); + return true; + } + + // 处理获取fps_eq模式名 (0xBC) - GET_FPS_EQ_MODE_NAME + if (data[1] == 0xBC) { + uint8_t mode = data[2]; + if (mode >= FPS_EQ_MODE_COUNT) { + mode = 0; + } + read_request.is_get_fps_eq_mode_name_request = true; + read_request.fps_eq_mode_name_query = mode; + return true; + } + + // 处理设置输入源模式命令 (0xB0) - SET_INPUT_SOURCE + // 改动原因:HID 0xB0 在 tile0 收到,通过 sync 0x04 让 tile1 发 UART 0x5D 透传 MCU + if (data[1] == 0xB0) { + debug_printf("Received set input source command (SET_INPUT_SOURCE) via HID 0xB0\n"); + uint8_t input_source = data[2]; + if (input_source > 2) { + debug_printf("Error: Invalid input source %d (must be 0-2, 0=USB, 1=OPT, 2=COAX)\n", input_source); + return true; + } + debug_printf("HID 0xB0: Setting input source to %s, forwarding to tile1 for UART 0x5D\n", + input_source == 0 ? "USB" : (input_source == 1 ? "OPT" : "COAX")); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, 0x04); // SYNC_CMD_T0_TO_T1_SET_INPUT_SOURCE + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, input_source); + return true; + } + + // 处理设置静音开关命令 (0xB1) - SET_MUTE_SWITCH + // 改动原因:HID 0xB1 在 tile0 收到,通过 sync 0x05 让 tile1 发 UART 0x5E 透传 MCU + if (data[1] == 0xB1) { + debug_printf("Received set mute switch command (SET_MUTE_SWITCH) via HID 0xB1\n"); + uint8_t mute = data[2]; + if (mute > 1) { + debug_printf("Error: Invalid mute value %d (must be 0 or 1, 0=关 1=开)\n", mute); + return true; + } + debug_printf("HID 0xB1: Setting mute switch to %s, forwarding to tile1 for UART 0x5E\n", mute ? "开" : "关"); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, 0x05); // SYNC_CMD_T0_TO_T1_SET_MUTE_SWITCH + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, mute); + return true; + } + + // 处理获取静音开关命令 (0xB2) - GET_MUTE_SWITCH + // 改动原因:tile0 设置 sync 0x06 让 tile1 向 MCU 发 0x5F 请求,MCU 返回后 tile1 经 sync 0x0E 回传静音值 + if (data[1] == 0xB2) { + debug_printf("Received get mute switch command (GET_MUTE_SWITCH) via HID 0xB2\n"); + read_request.is_get_mute_switch_request = true; + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, 0x06); // SYNC_CMD_T0_TO_T1_SEND_GET_MUTE_REQUEST + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, 0); + return true; + } + + // 处理设置监听开关命令 (0xB3) - SET_LISTEN_SWITCH + // 改动原因:HID 0xB3 在 tile0 收到,通过 sync 0x07 让 tile1 发 UART 0x60 透传 MCU + if (data[1] == 0xB3) { + uint8_t listen = data[2]; + if (listen > 1) { + debug_printf("Error: Invalid listen switch %d (must be 0 or 1, 0=关 1=开)\n", listen); + return true; + } + debug_printf("Received set listen switch command (SET_LISTEN_SWITCH) via HID 0xB3, forwarding to tile1 for UART 0x60\n"); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, 0x07); // SYNC_CMD_T0_TO_T1_SET_LISTEN_SWITCH + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, listen); + return true; + } + + // 处理获取监听开关命令 (0xB4) - GET_LISTEN_SWITCH + // 改动原因:直接读 tile0 的 g_adc_loop 返回,不经过串口(g_adc_loop 由 tile1 经 sync 0x0D 同步到 tile0) + if (data[1] == 0xB4) { + debug_printf("Received get listen switch command (GET_LISTEN_SWITCH) via HID 0xB4\n"); + read_request.is_get_listen_switch_request = true; + return true; + } + if (data[1] == 0x8d) { -#if 1// !UAC1 debug_printf("Received set EQ filter parameters command (SET_EQ_PARAMS)\n"); // Get mode value (跳过report_id字节) @@ -1837,7 +2266,7 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { } else { debug_printf("Parameter unchanged for mode %d, band %d\n", mode, band_index); } -#endif + return true; } #if 0 @@ -2015,7 +2444,7 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { /** * @brief 处理串口EQ模式设置 (0x30) - * @param mode EQ模式值 (0-9) + * @param mode EQ模式值 (0-14) * @return 处理结果 */ uint8_t process_uart_set_eq_mode(uint8_t mode) @@ -2526,9 +2955,13 @@ void get_mode_name(uint8_t mode, char* name) { // 初始化模式信息函数 void init_mode_info(void) { // 初始化默认模式名称 + // 改动原因:扩展至15模式(13预设+2用户),更新游戏音效预设名称 const char* default_names[NUM_EQ_MODES] = { - "JAZZ", "POP", "ROCK", "CLASIC", "R&B", - "3A Game", "FPS", "user 1", "user 2", "user3" + "JAZZ", "POP", "ROCK", "CLASIC", + "暗区突围", "3A Game", "战地6", + "APEX", "和平精英", "逃离塔科夫", + "穿越火线", "守望先锋", "永劫无间", + "user 1", "user 2" }; // 初始化默认增益(0dB) @@ -3124,6 +3557,146 @@ unsigned char process_read_params(uint8_t response[]) { return true; } + // 处理获取FPS库三子模块使能 (0xB6) - GET_FPS_MODULE_ENABLE + // 改动原因:0xB5 已更新 g_fps_* 共享全局;若仍 load_value 读 Flash,LFS 快速 mount/write/read 可能返回旧值,断电后才一致。与 0x9E/0xB2 一致,读运行时全局。 + if (read_request.is_get_fps_module_enable_request == true) { + unsigned drc_enable; + unsigned fps_sub_enable; + unsigned eq_enable; + GET_SHARED_GLOBAL(drc_enable, g_fps_drc_enable); + GET_SHARED_GLOBAL(fps_sub_enable, g_fps_sub_enable); + GET_SHARED_GLOBAL(eq_enable, g_fps_eq_enable); + if (drc_enable > 1) { drc_enable = 0; } /* 改动原因:无效值默认 DRC 关 */ + if (fps_sub_enable > 1) { fps_sub_enable = 1; } /* 改动原因:无效值默认 FPS 主处理开 */ + if (eq_enable > 1) { eq_enable = 0; } /* 改动原因:无效值默认 fps_eq 关 */ + + debug_printf("Building 0xB6 response: drc=%u fps=%u eq=%u (from globals)\n", + drc_enable, fps_sub_enable, eq_enable); + response[0] = 0x77; + response[1] = 0xB6; + response[2] = (uint8_t)drc_enable; + response[3] = (uint8_t)fps_sub_enable; + response[4] = (uint8_t)eq_enable; + for (int i = 5; i < 63; i++) { + response[i] = 0x00; + } + read_request.is_get_fps_module_enable_request = false; + return true; + } + + // 处理获取DRC压缩模式 (0xBE) - GET_FPS_DRC_MODE + // 改动原因:0xBD 已更新 g_fps_drc_mode 共享全局;读运行时全局与 0xB6 一致 + if (read_request.is_get_fps_drc_mode_request == true) { + unsigned drc_mode; + GET_SHARED_GLOBAL(drc_mode, g_fps_drc_mode); + if (drc_mode > 1) { + drc_mode = 0; /* 改动原因:无效值默认 low(0) */ + } + debug_printf("Building 0xBE response: drc_mode=%u (from globals)\n", drc_mode); + response[0] = 0x77; + response[1] = 0xBE; + response[2] = (uint8_t)drc_mode; + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + read_request.is_get_fps_drc_mode_request = false; + return true; + } + + // 处理获取FPS XMOS游戏选择 (0xC0) - GET_FPS_XMOS_GAME_SELECT(位于 DRC 0xBE 之后) + if (read_request.is_get_fps_xmos_game_select_request == true) { + uint8_t req_game = read_request.fps_game_query; + if (req_game > 2) { + req_game = 0; + } + unsigned level_for_game; + if (req_game == 0) { + level_for_game = load_value("fps_level_g0"); + } else if (req_game == 1) { + level_for_game = load_value("fps_level_g1"); + } else { + level_for_game = load_value("fps_level_g2"); + } + if (level_for_game > 4) { + level_for_game = 2; + } + debug_printf("Building 0x%02X response: game=%d level=%u\n", + HID_GET_FPS_XMOS_GAME_SELECT, req_game, level_for_game); + response[0] = 0x77; + response[1] = HID_GET_FPS_XMOS_GAME_SELECT; + response[2] = req_game; + response[3] = (uint8_t)level_for_game; + for (int i = 4; i < 63; i++) { + response[i] = 0x00; + } + read_request.is_get_fps_xmos_game_select_request = false; + return true; + } + + // 处理获取fps_eq当前模式 (0xB8) + if (read_request.is_get_fps_eq_mode_request == true) { + unsigned mode; + fps_eq_store_ensure_loaded(); + mode = s_fps_eq_store.current_mode; + if (mode >= FPS_EQ_MODE_COUNT) { + mode = 0; + } + response[0] = 0x77; + response[1] = 0xB8; + response[2] = (uint8_t)mode; + for (int i = 3; i < 63; i++) { + response[i] = 0x00; + } + read_request.is_get_fps_eq_mode_request = false; + return true; + } + + // 处理获取fps_eq单段增益 (0xBA),当前模式 + if (read_request.is_get_fps_eq_band_gain_request == true) { + uint8_t band = read_request.fps_eq_band_query; + int16_t gain; + unsigned mode; + fps_eq_store_ensure_loaded(); + mode = s_fps_eq_store.current_mode; + if (mode >= FPS_EQ_MODE_COUNT) { + mode = 0; + } + if (band >= FPS_EQ_BAND_COUNT) { + band = 0; + } + gain = s_fps_eq_store.gains[mode][band]; + response[0] = 0x77; + response[1] = 0xBA; + response[2] = band; + response[3] = (uint8_t)(gain & 0xFF); + response[4] = (uint8_t)((gain >> 8) & 0xFF); + for (int i = 5; i < 63; i++) { + response[i] = 0x00; + } + read_request.is_get_fps_eq_band_gain_request = false; + return true; + } + + // 处理获取fps_eq模式名 (0xBC),指定模式0-4 + if (read_request.is_get_fps_eq_mode_name_request == true) { + uint8_t mode = read_request.fps_eq_mode_name_query; + char mode_name[FPS_EQ_NAME_LEN]; + fps_eq_store_ensure_loaded(); + if (mode >= FPS_EQ_MODE_COUNT) { + mode = 0; + } + fps_eq_name_get(&s_fps_eq_store, mode, mode_name); + response[0] = 0x77; + response[1] = 0xBC; + response[2] = mode; + memcpy(&response[3], mode_name, FPS_EQ_NAME_LEN); + for (int i = 3 + FPS_EQ_NAME_LEN; i < 63; i++) { + response[i] = 0x00; + } + read_request.is_get_fps_eq_mode_name_request = false; + return true; + } + // 处理获取固件版本请求 (0xA6) - GET_FIRMWARE_VERSION // 改动原因:添加获取固件版本响应,返回BCD格式的版本号(主版本、次版本、修订版本),参考user_uart.xc中的FW_VERSION实现 if (read_request.is_get_firmware_version_request == true) { @@ -3214,7 +3787,7 @@ unsigned char process_read_params(uint8_t response[]) { #endif if (read_request.is_read_request == true) { -#if 1 // 改动原因:fosi_c1 使用 -DUAC1=1 编译,原 #if !UAC1 导致 0x8E 读EQ参数在 HID GET_REPORT 时永不组包,eq_designer 收到全零响应 + debug_printf("Read request information:\n"); debug_printf(" Mode: %d\n", read_request.mode); debug_printf(" EQ index: %d\n", read_request.eq_index); @@ -3266,7 +3839,6 @@ unsigned char process_read_params(uint8_t response[]) { debug_printf("Parameter read processing completed\n"); return true; -#endif } #endif #if 1 @@ -3731,7 +4303,296 @@ void process_uart_set_uac_mode(uint8_t uac_mode) } /** - * @brief 处理串口设置输入源模式命令 (0x5D) + * @brief 处理串口获取当前UAC模式命令 (0x52) + * @note 改动原因:直接调用HID的process_read_params (0x9C),完全复用代码 + */ +uint8_t process_uart_get_current_uac_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 15) return 0; + + // 调用HID获取UAC模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9C, NULL, 0, hid_data, sizeof(hid_data)); + + if (len >= 9) { + uint8_t uac_mode = hid_data[0]; + + // 构建UART响应(命令码应为0x52,不是0x42) + response[0] = 0x55; // 帧头1 + response[1] = 0xAA; // 帧头2 + response[2] = 0x00; + response[3] = GET_CURRENT_UAC_MODE; + response[4] = 0x09; // 数据长度 (9字节) + response[5] = uac_mode; // UAC模式值 + memcpy(&response[6], &hid_data[1], 8); // 模式名称 (8字节) + + uint8_t checksum_pos = 14; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_CURRENT_UAC_MODE (0x52): mode=%d (from HID 0x9C)\n", uac_mode); + return 15; + } + return 0; +} + +/** + * @brief 处理串口设置EQ使能命令 (0x43) + * @note 改动原因:直接调用HID的process_send_params (0x9D),完全复用代码 + */ +uint8_t process_uart_set_eq_enable(uint8_t enable) +{ + debug_printf("UART SET_EQ_ENABLE: enable=%d (calling HID 0x9D)\n", enable); + return call_hid_send_params(0x9D, &enable, 1) ? 0 : 1; +} + +/** + * @brief 构建EQ使能设置响应 (0x43响应) + * @note 改动原因:直接调用HID读取当前状态,完全复用代码 + */ +uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t *response, uint8_t response_size) +{ + if (response_size < 8) return 0; + + // 调用HID获取EQ使能状态 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9E, NULL, 0, hid_data, sizeof(hid_data)); + uint8_t current_enable = (len > 0) ? hid_data[0] : enable; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = SET_EQ_ENABLE; + response[4] = 0x02; + response[5] = result; + response[6] = current_enable; + + uint8_t checksum_pos = 7; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART SET_EQ_ENABLE response: status=0x%02X, enable=%d (from HID 0x9E)\n", result, current_enable); + return 8; +} + +/** + * @brief 处理串口获取EQ使能命令 (0x44) + * @note 改动原因:直接调用HID的process_read_params (0x9E),完全复用代码 + */ +uint8_t process_uart_get_eq_enable(uint8_t *response, uint8_t response_size) +{ + debug_printf("UART GET_EQ_ENABLE: start processing, response_size=%d\n", response_size); + + if (response_size < 7) { + debug_printf("UART GET_EQ_ENABLE: error - response buffer too small (%d < 7)\n", response_size); + return 0; + } + + // 调用HID获取EQ使能 + debug_printf("UART GET_EQ_ENABLE: calling call_hid_read_params(0x9E)\n"); + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9E, NULL, 0, hid_data, sizeof(hid_data)); + debug_printf("UART GET_EQ_ENABLE: call_hid_read_params returned len=%d\n", len); + + if (len > 0) { + uint8_t eq_enable = hid_data[0]; + debug_printf("UART GET_EQ_ENABLE: read eq_enable=%d from HID\n", eq_enable); + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_EQ_ENABLE; + response[4] = 0x01; + response[5] = eq_enable; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_EQ_ENABLE: response built, length=7, data: "); + for (int i = 0; i < 7; i++) { + debug_printf("%02X ", response[i]); + } + debug_printf("\n"); + debug_printf("UART GET_EQ_ENABLE: enable=%d (from HID 0x9E)\n", eq_enable); + return 7; + } else { + debug_printf("UART GET_EQ_ENABLE: error - call_hid_read_params returned len=0, cannot get EQ enable status\n"); + } + return 0; +} + +/** + * @brief 处理串口获取采样格式命令 (0x45) + * @note 改动原因:直接调用HID的process_read_params (0x9F),完全复用代码 + */ +uint8_t process_uart_get_sample_format(uint8_t *response, uint8_t response_size) +{ + if (response_size < 11) return 0; + + // 调用HID获取采样格式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0x9F, NULL, 0, hid_data, sizeof(hid_data)); + + if (len >= 5) { + // HID返回:[rate_0, rate_1, rate_2, rate_3, dsd_mode, ...] + uint32_t sample_rate = hid_data[0] | (hid_data[1] << 8) | (hid_data[2] << 16) | (hid_data[3] << 24); + uint8_t dsd_mode = hid_data[4]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_SAMPLE_FORMAT; + response[4] = 0x05; + response[5] = hid_data[0]; + response[6] = hid_data[1]; + response[7] = hid_data[2]; + response[8] = hid_data[3]; + response[9] = dsd_mode; + + uint8_t checksum_pos = 10; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_SAMPLE_FORMAT: sample_rate=%d, dsd_mode=%d (from HID 0x9F)\n", sample_rate, dsd_mode); + return 11; + } + return 0; +} + +/** + * @brief 处理串口设置增益模式命令 (0x46) + * @note 改动原因:直接调用HID的process_send_params (0xA0),完全复用代码 + */ +uint8_t process_uart_set_gain_mode(uint8_t gain_mode) +{ + debug_printf("UART SET_GAIN_MODE: gain_mode=%d (calling HID 0xA0)\n", gain_mode); + return call_hid_send_params(0xA0, &gain_mode, 1) ? 0 : 1; +} + +/** + * @brief 处理串口获取增益模式命令 (0x47) + * @note 改动原因:直接调用HID的process_read_params (0xA1),完全复用代码 + */ +uint8_t process_uart_get_gain_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 7) return 0; + + // 调用HID获取增益模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0xA1, NULL, 0, hid_data, sizeof(hid_data)); + + if (len > 0) { + uint8_t gain_mode = hid_data[0]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_GAIN_MODE; + response[4] = 0x01; + response[5] = gain_mode; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_GAIN_MODE: gain_mode=%d (from HID 0xA1)\n", gain_mode); + return 7; + } + return 0; +} + +/** + * @brief 处理串口设置滤波器模式命令 (0x48) + * @note 改动原因:直接调用HID的process_send_params (0xA2),完全复用代码 + */ +uint8_t process_uart_set_filter_mode(uint8_t filter_mode) +{ + debug_printf("UART SET_FILTER_MODE: filter_mode=%d (calling HID 0xA2)\n", filter_mode); + return call_hid_send_params(0xA2, &filter_mode, 1) ? 0 : 1; +} + +/** + * @brief 处理串口获取滤波器模式命令 (0x49) + * @note 改动原因:直接调用HID的process_read_params (0xA3),完全复用代码 + */ +uint8_t process_uart_get_filter_mode(uint8_t *response, uint8_t response_size) +{ + if (response_size < 7) return 0; + + // 调用HID获取滤波器模式 + uint8_t hid_data[61]; + uint8_t len = call_hid_read_params(0xA3, NULL, 0, hid_data, sizeof(hid_data)); + + if (len > 0) { + uint8_t filter_mode = hid_data[0]; + + // 构建UART响应 + response[0] = 0x55; + response[1] = 0xAA; + response[2] = 0x00; + response[3] = GET_FILTER_MODE; + response[4] = 0x01; + response[5] = filter_mode; + + uint8_t checksum_pos = 6; + response[checksum_pos] = uart_checksum(response, checksum_pos); + + debug_printf("UART GET_FILTER_MODE: filter_mode=%d (from HID 0xA3)\n", filter_mode); + return 7; + } + return 0; +} + +/** + * @brief 处理串口设置游戏模式命令 (0x5A) + * @param game_mode 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1) + * @note 改动原因:UART 0x5A命令将游戏模式设置请求透传给MCU处理,MCU负责执行模式设置和参数保存 + */ +void process_uart_set_game_mode(uint8_t game_mode) +{ + debug_printf("UART SET_GAME_MODE (0x5A): game_mode=%d, forwarding to MCU\n", game_mode); + + // 参数验证 + if (game_mode > 2) { + debug_printf("Error: Invalid game_mode %d (must be 0-2)\n", game_mode); + return; + } + + // 改动原因:构建UART 0x5A数据包并透传给MCU + // UART数据包格式:0x55 0xAA 0x00 0x5A [长度] [游戏模式值] [校验和] + uint8_t uart_packet[7]; + uart_packet[0] = 0x55; // 帧头1 + uart_packet[1] = 0xAA; // 帧头2 + uart_packet[2] = 0x00; // 版本 + uart_packet[3] = 0x5A; // 命令码 (SET_GAME_MODE) + uart_packet[4] = 0x01; // 数据长度 + uart_packet[5] = game_mode; // 游戏模式值 + + // 计算校验和(帧头到数据末尾所有字节的累加和取低8位) + uint8_t checksum = 0; + for (int i = 0; i < 6; i++) { + checksum += uart_packet[i]; + } + uart_packet[6] = checksum; // 校验和 + + // 改动原因:通过xmos_printf将UART数据包透传给MCU + // 声明xmos_printf函数(在user_uart.xc中定义) + extern int xmos_printf(unsigned char *data, unsigned char len); + + // 发送UART数据包给MCU + int result = xmos_printf(uart_packet, 7); + if (result == 7) { + debug_printf("UART 0x5A packet forwarded to MCU successfully: game_mode=%d (0=无音效, 1=FPS, 2=虚拟7.1)\n", + game_mode); + } else { + debug_printf("Error: Failed to forward UART 0x5A packet to MCU (result=%d)\n", result); + } + + // 改动原因:MCU接收到0x5A命令后会处理游戏模式设置和参数保存,XMOS设备无需执行额外操作 +} + +/** + * @brief 处理串口设置输入源模式命令 (0x5D),在 tile1 被 app_control_slave 调用 * @param input_source 输入源模式值 (0=USB, 1=OPT, 2=COAX) * @note 改动原因:HID 0xB0收到后构建UART 0x5D包透传给MCU,由MCU执行输入源(USB/OPT/COAX)切换 */ @@ -3830,296 +4691,6 @@ void process_uart_set_listen_switch(uint8_t listen) debug_printf("Error: Failed to forward UART 0x60 (result=%d)\n", result); } - -/** - * @brief 处理串口获取当前UAC模式命令 (0x52) - * @note 改动原因:直接调用HID的process_read_params (0x9C),完全复用代码 - */ -uint8_t process_uart_get_current_uac_mode(uint8_t *response, uint8_t response_size) -{ - if (response_size < 15) return 0; - - // 调用HID获取UAC模式 - uint8_t hid_data[61]; - uint8_t len = call_hid_read_params(0x9C, NULL, 0, hid_data, sizeof(hid_data)); - - if (len >= 9) { - uint8_t uac_mode = hid_data[0]; - - // 构建UART响应(命令码应为0x52,不是0x42) - response[0] = 0x55; // 帧头1 - response[1] = 0xAA; // 帧头2 - response[2] = 0x00; - response[3] = GET_CURRENT_UAC_MODE; - response[4] = 0x09; // 数据长度 (9字节) - response[5] = uac_mode; // UAC模式值 - memcpy(&response[6], &hid_data[1], 8); // 模式名称 (8字节) - - uint8_t checksum_pos = 14; - response[checksum_pos] = uart_checksum(response, checksum_pos); - - debug_printf("UART GET_CURRENT_UAC_MODE (0x52): mode=%d (from HID 0x9C)\n", uac_mode); - return 15; - } - return 0; -} - -/** - * @brief 处理串口设置EQ使能命令 (0x43) - * @note 改动原因:直接调用HID的process_send_params (0x9D),完全复用代码 - */ -uint8_t process_uart_set_eq_enable(uint8_t enable) -{ - debug_printf("UART SET_EQ_ENABLE: enable=%d (calling HID 0x9D)\n", enable); - return call_hid_send_params(0x9D, &enable, 1) ? 0 : 1; -} - -/** - * @brief 构建EQ使能设置响应 (0x43响应) - * @note 改动原因:直接调用HID读取当前状态,完全复用代码 - */ -uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t *response, uint8_t response_size) -{ - if (response_size < 8) return 0; - - // 调用HID获取EQ使能状态 - uint8_t hid_data[61]; - uint8_t len = call_hid_read_params(0x9E, NULL, 0, hid_data, sizeof(hid_data)); - uint8_t current_enable = (len > 0) ? hid_data[0] : enable; - - // 构建UART响应 - response[0] = 0x55; - response[1] = 0xAA; - response[2] = 0x00; - response[3] = SET_EQ_ENABLE; - response[4] = 0x02; - response[5] = result; - response[6] = current_enable; - - uint8_t checksum_pos = 7; - response[checksum_pos] = uart_checksum(response, checksum_pos); - - debug_printf("UART SET_EQ_ENABLE response: status=0x%02X, enable=%d (from HID 0x9E)\n", result, current_enable); - return 8; -} - -/** - * @brief 处理串口获取EQ使能命令 (0x44) - * @note 改动原因:直接调用HID的process_read_params (0x9E),完全复用代码 - */ -uint8_t process_uart_get_eq_enable(uint8_t *response, uint8_t response_size) -{ - debug_printf("UART GET_EQ_ENABLE: start processing, response_size=%d\n", response_size); - - if (response_size < 7) { - debug_printf("UART GET_EQ_ENABLE: error - response buffer too small (%d < 7)\n", response_size); - return 0; - } - - // 调用HID获取EQ使能 - debug_printf("UART GET_EQ_ENABLE: calling call_hid_read_params(0x9E)\n"); - uint8_t hid_data[61]; - uint8_t len = call_hid_read_params(0x9E, NULL, 0, hid_data, sizeof(hid_data)); - debug_printf("UART GET_EQ_ENABLE: call_hid_read_params returned len=%d\n", len); - - if (len > 0) { - uint8_t eq_enable = hid_data[0]; - debug_printf("UART GET_EQ_ENABLE: read eq_enable=%d from HID\n", eq_enable); - - // 构建UART响应 - response[0] = 0x55; - response[1] = 0xAA; - response[2] = 0x00; - response[3] = GET_EQ_ENABLE; - response[4] = 0x01; - response[5] = eq_enable; - - uint8_t checksum_pos = 6; - response[checksum_pos] = uart_checksum(response, checksum_pos); - - debug_printf("UART GET_EQ_ENABLE: response built, length=7, data: "); - for (int i = 0; i < 7; i++) { - debug_printf("%02X ", response[i]); - } - debug_printf("\n"); - debug_printf("UART GET_EQ_ENABLE: enable=%d (from HID 0x9E)\n", eq_enable); - return 7; - } else { - debug_printf("UART GET_EQ_ENABLE: error - call_hid_read_params returned len=0, cannot get EQ enable status\n"); - } - return 0; -} - -/** - * @brief 处理串口获取采样格式命令 (0x45) - * @note 改动原因:直接调用HID的process_read_params (0x9F),完全复用代码 - */ -uint8_t process_uart_get_sample_format(uint8_t *response, uint8_t response_size) -{ - if (response_size < 11) return 0; - - // 调用HID获取采样格式 - uint8_t hid_data[61]; - uint8_t len = call_hid_read_params(0x9F, NULL, 0, hid_data, sizeof(hid_data)); - - if (len >= 5) { - // HID返回:[rate_0, rate_1, rate_2, rate_3, dsd_mode, ...] - uint32_t sample_rate = hid_data[0] | (hid_data[1] << 8) | (hid_data[2] << 16) | (hid_data[3] << 24); - uint8_t dsd_mode = hid_data[4]; - - // 构建UART响应 - response[0] = 0x55; - response[1] = 0xAA; - response[2] = 0x00; - response[3] = GET_SAMPLE_FORMAT; - response[4] = 0x05; - response[5] = hid_data[0]; - response[6] = hid_data[1]; - response[7] = hid_data[2]; - response[8] = hid_data[3]; - response[9] = dsd_mode; - - uint8_t checksum_pos = 10; - response[checksum_pos] = uart_checksum(response, checksum_pos); - - debug_printf("UART GET_SAMPLE_FORMAT: sample_rate=%d, dsd_mode=%d (from HID 0x9F)\n", sample_rate, dsd_mode); - return 11; - } - return 0; -} - -/** - * @brief 处理串口设置增益模式命令 (0x46) - * @note 改动原因:直接调用HID的process_send_params (0xA0),完全复用代码 - */ -uint8_t process_uart_set_gain_mode(uint8_t gain_mode) -{ - debug_printf("UART SET_GAIN_MODE: gain_mode=%d (calling HID 0xA0)\n", gain_mode); - return call_hid_send_params(0xA0, &gain_mode, 1) ? 0 : 1; -} - -/** - * @brief 处理串口获取增益模式命令 (0x47) - * @note 改动原因:直接调用HID的process_read_params (0xA1),完全复用代码 - */ -uint8_t process_uart_get_gain_mode(uint8_t *response, uint8_t response_size) -{ - if (response_size < 7) return 0; - - // 调用HID获取增益模式 - uint8_t hid_data[61]; - uint8_t len = call_hid_read_params(0xA1, NULL, 0, hid_data, sizeof(hid_data)); - - if (len > 0) { - uint8_t gain_mode = hid_data[0]; - - // 构建UART响应 - response[0] = 0x55; - response[1] = 0xAA; - response[2] = 0x00; - response[3] = GET_GAIN_MODE; - response[4] = 0x01; - response[5] = gain_mode; - - uint8_t checksum_pos = 6; - response[checksum_pos] = uart_checksum(response, checksum_pos); - - debug_printf("UART GET_GAIN_MODE: gain_mode=%d (from HID 0xA1)\n", gain_mode); - return 7; - } - return 0; -} - -/** - * @brief 处理串口设置滤波器模式命令 (0x48) - * @note 改动原因:直接调用HID的process_send_params (0xA2),完全复用代码 - */ -uint8_t process_uart_set_filter_mode(uint8_t filter_mode) -{ - debug_printf("UART SET_FILTER_MODE: filter_mode=%d (calling HID 0xA2)\n", filter_mode); - return call_hid_send_params(0xA2, &filter_mode, 1) ? 0 : 1; -} - -/** - * @brief 处理串口获取滤波器模式命令 (0x49) - * @note 改动原因:直接调用HID的process_read_params (0xA3),完全复用代码 - */ -uint8_t process_uart_get_filter_mode(uint8_t *response, uint8_t response_size) -{ - if (response_size < 7) return 0; - - // 调用HID获取滤波器模式 - uint8_t hid_data[61]; - uint8_t len = call_hid_read_params(0xA3, NULL, 0, hid_data, sizeof(hid_data)); - - if (len > 0) { - uint8_t filter_mode = hid_data[0]; - - // 构建UART响应 - response[0] = 0x55; - response[1] = 0xAA; - response[2] = 0x00; - response[3] = GET_FILTER_MODE; - response[4] = 0x01; - response[5] = filter_mode; - - uint8_t checksum_pos = 6; - response[checksum_pos] = uart_checksum(response, checksum_pos); - - debug_printf("UART GET_FILTER_MODE: filter_mode=%d (from HID 0xA3)\n", filter_mode); - return 7; - } - return 0; -} - -/** - * @brief 处理串口设置游戏模式命令 (0x5A) - * @param game_mode 游戏模式值 (0=无音效, 1=FPS, 2=虚拟7.1) - * @note 改动原因:UART 0x5A命令将游戏模式设置请求透传给MCU处理,MCU负责执行模式设置和参数保存 - */ -void process_uart_set_game_mode(uint8_t game_mode) -{ - debug_printf("UART SET_GAME_MODE (0x5A): game_mode=%d, forwarding to MCU\n", game_mode); - - // 参数验证 - if (game_mode > 2) { - debug_printf("Error: Invalid game_mode %d (must be 0-2)\n", game_mode); - return; - } - - // 改动原因:构建UART 0x5A数据包并透传给MCU - // UART数据包格式:0x55 0xAA 0x00 0x5A [长度] [游戏模式值] [校验和] - uint8_t uart_packet[7]; - uart_packet[0] = 0x55; // 帧头1 - uart_packet[1] = 0xAA; // 帧头2 - uart_packet[2] = 0x00; // 版本 - uart_packet[3] = 0x5A; // 命令码 (SET_GAME_MODE) - uart_packet[4] = 0x01; // 数据长度 - uart_packet[5] = game_mode; // 游戏模式值 - - // 计算校验和(帧头到数据末尾所有字节的累加和取低8位) - uint8_t checksum = 0; - for (int i = 0; i < 6; i++) { - checksum += uart_packet[i]; - } - uart_packet[6] = checksum; // 校验和 - - // 改动原因:通过xmos_printf将UART数据包透传给MCU - // 声明xmos_printf函数(在user_uart.xc中定义) - extern int xmos_printf(unsigned char *data, unsigned char len); - - // 发送UART数据包给MCU - int result = xmos_printf(uart_packet, 7); - if (result == 7) { - debug_printf("UART 0x5A packet forwarded to MCU successfully: game_mode=%d (0=无音效, 1=FPS, 2=虚拟7.1)\n", - game_mode); - } else { - debug_printf("Error: Failed to forward UART 0x5A packet to MCU (result=%d)\n", result); - } - - // 改动原因:MCU接收到0x5A命令后会处理游戏模式设置和参数保存,XMOS设备无需执行额外操作 -} - /** * @brief 处理串口获取游戏模式命令 (0x4B) * @note 改动原因:直接调用HID的process_read_params (0xA5),完全复用代码 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h index b9cf4a5..3370a89 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq.h @@ -7,15 +7,15 @@ #include #include -#define NUM_EQ_MODES 10 +#define NUM_EQ_MODES 15 #define NUM_EQ_CHANS 2 #define MAX_EQ_BANDS 8 -#define EQ_DISABLED_MODE 10 // 禁用EQ的模式编号 -#define EQ_PRESET_MODE_MIN 0 // 预设模式最小编号 -#define EQ_PRESET_MODE_MAX 6 // 预设模式最大编号(preset1-preset6) -#define EQ_USER_MODE_MIN 7 // 用户模式最小编号 -#define EQ_USER_MODE_MAX 9 // 用户模式最大编号(user 1-4) -#define EQ_MODE_MAX (NUM_EQ_MODES) // 模式最大编号(user 1-4) +#define EQ_DISABLED_MODE 15 // 禁用EQ的模式编号(改动原因:模式扩展至15后,禁用模式编号同步改为15) +#define EQ_PRESET_MODE_MIN 0 // 预设模式最小编号 +#define EQ_PRESET_MODE_MAX 12 // 预设模式最大编号(0-12共13个预设,含音乐与游戏曲线) +#define EQ_USER_MODE_MIN 13 // 用户模式最小编号(改动原因:仅保留2个用户自定义模式) +#define EQ_USER_MODE_MAX 14 // 用户模式最大编号(user 1-2) +#define EQ_MODE_MAX (NUM_EQ_MODES) // 有效模式上界(0-14为可用模式,15为禁用) // Filter type definition @@ -130,10 +130,6 @@ uint8_t process_uart_get_led_status(uint8_t led_index, uint8_t * unsafe response uint8_t process_uart_get_led_count(uint8_t * unsafe response, uint8_t response_size); uint8_t process_uart_get_uac_mode_info(uint8_t * unsafe response, uint8_t response_size); void process_uart_set_uac_mode(uint8_t uac_mode); -void process_uart_set_input_source(uint8_t input_source); // 设置输入源(0=USB,1=OPT,2=COAX),HID 0xB0透传MCU -void process_uart_set_mute_switch(uint8_t mute); // 设置静音开关(0=关,1=开),HID 0xB1透传MCU -void process_uart_set_listen_switch(uint8_t listen); // 设置监听开关(0=关,1=开),HID 0xB3透传MCU -void process_uart_send_get_mute_request(void); // 向MCU发送0x5F获取静音请求 uint8_t process_uart_get_current_uac_mode(uint8_t * unsafe response, uint8_t response_size); uint8_t process_uart_set_eq_enable(uint8_t enable); uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t * unsafe response, uint8_t response_size); @@ -146,6 +142,11 @@ uint8_t process_uart_get_filter_mode(uint8_t * unsafe response, uint8_t response void process_uart_set_game_mode(uint8_t game_mode); uint8_t process_uart_get_game_mode(uint8_t * unsafe response, uint8_t response_size); uint8_t process_uart_get_firmware_version(uint8_t * unsafe response, uint8_t response_size); +/* 改动原因:添加 0xB0-0xB4 相关 UART 处理与静音值回传(XC 侧声明),HID 在 tile0、UART 在 tile1 时由 tile1 调用 */ +void process_uart_set_input_source(uint8_t input_source); +void process_uart_set_mute_switch(uint8_t mute); +void process_uart_send_get_mute_request(void); +void process_uart_set_listen_switch(uint8_t listen); #else // 独立的增益和名称设置/获取函数 @@ -171,10 +172,6 @@ uint8_t process_uart_get_led_status(uint8_t led_index, uint8_t *response, uint8_ uint8_t process_uart_get_led_count(uint8_t *response, uint8_t response_size); uint8_t process_uart_get_uac_mode_info(uint8_t *response, uint8_t response_size); void process_uart_set_uac_mode(uint8_t uac_mode); -void process_uart_set_input_source(uint8_t input_source); // 设置输入源(0=USB,1=OPT,2=COAX),HID 0xB0透传MCU -void process_uart_set_mute_switch(uint8_t mute); // 设置静音开关(0=关,1=开),HID 0xB1透传MCU -void process_uart_set_listen_switch(uint8_t listen); // 设置监听开关(0=关,1=开),HID 0xB3透传MCU -void process_uart_send_get_mute_request(void); // 向MCU发送0x5F获取静音请求 uint8_t process_uart_get_current_uac_mode(uint8_t *response, uint8_t response_size); uint8_t process_uart_set_eq_enable(uint8_t enable); uint8_t process_uart_get_eq_enable_response(uint8_t result, uint8_t enable, uint8_t *response, uint8_t response_size); @@ -187,7 +184,11 @@ uint8_t process_uart_get_filter_mode(uint8_t *response, uint8_t response_size); void process_uart_set_game_mode(uint8_t game_mode); uint8_t process_uart_get_game_mode(uint8_t *response, uint8_t response_size); uint8_t process_uart_get_firmware_version(uint8_t *response, uint8_t response_size); - +/* 改动原因:添加 0xB0-0xB4 相关 UART 处理与静音值回传(C 侧声明) */ +void process_uart_set_input_source(uint8_t input_source); +void process_uart_set_mute_switch(uint8_t mute); +void process_uart_send_get_mute_request(void); +void process_uart_set_listen_switch(uint8_t listen); #endif void init_mode_info(void); diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py index a11178f..ca72aed 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_designer_new.py @@ -53,10 +53,23 @@ from filter_utils import (BiquadFilterCalculator, make_biquad_bypass, make_biqua # 常量定义 MAX_EQ_BANDS = 8 # 最大EQ滤波器数量 (0-7) -NUM_EQ_MODES = 10 # EQ模式数量 -EQ_DISABLED_MODE = 10 # 禁用EQ的模式编号 +NUM_EQ_MODES = 15 # EQ模式数量(改动原因:13预设+2用户,共15模式) +EQ_DISABLED_MODE = 15 # 禁用EQ的模式编号(改动原因:与NUM_EQ_MODES对齐) +# 预设模式0-12,用户模式13-14 +EQ_PRESET_MODE_MAX = 12 +EQ_USER_MODE_MIN = 13 +EQ_USER_MODE_MAX = 14 -# HID 固件升级命令码(使用命令名代替裸命令码) +# 模式下拉列表显示名称(改动原因:与固件default_names及新增游戏曲线一致) +MODE_COMBO_ITEMS = [ + "JAZZ(0)", "POP(1)", "ROCK(2)", "CLASIC(3)", + "暗区突围(4)", "3A Game(5)", "战地6(6)", + "APEX(7)", "和平精英(8)", "逃离塔科夫(9)", + "穿越火线(10)", "守望先锋(11)", "永劫无望(12)", + "用户模式1(13)", "用户模式2(14)", "禁用EQ" +] + +# HID 固件升级命令码(与 eq_hid_protocol_ds1 一致,0xA7-0xAE) FIRMWARE_UPGRADE_START = 0xA7 # 开始固件升级 FIRMWARE_UPGRADE_DATA = 0xA8 # 传输固件数据块 FIRMWARE_UPGRADE_END = 0xA9 # 结束固件升级 @@ -65,6 +78,20 @@ FIRMWARE_UPGRADE_ABORT = 0xAB # 中止固件升级 FIRMWARE_UPGRADE_ERASE = 0xAC # 擦除现有升级镜像 DEVICE_REBOOT = 0xAE # 设备重启(通用命令) +# FPS XMOS 命令(改动原因:0xA7/0xA8 保留固件升级;game/level 放在 DRC 0xBD/0xBE 之后为 0xBF/0xC0) +SET_FPS_XMOS_GAME_SELECT = 0xBF +GET_FPS_XMOS_GAME_SELECT = 0xC0 +SET_FPS_MODULE_ENABLE = 0xB5 +GET_FPS_MODULE_ENABLE = 0xB6 +SET_FPS_EQ_MODE = 0xB7 +GET_FPS_EQ_MODE = 0xB8 +SET_FPS_EQ_BAND_GAIN = 0xB9 +GET_FPS_EQ_BAND_GAIN = 0xBA +SET_FPS_EQ_MODE_NAME = 0xBB +GET_FPS_EQ_MODE_NAME = 0xBC +SET_FPS_DRC_MODE = 0xBD +GET_FPS_DRC_MODE = 0xBE + class BandFilter(QGroupBox): """单个滤波器带控件""" def __init__(self, band_id, parent=None): @@ -536,7 +563,7 @@ class EQDesigner(QMainWindow): mode_layout = QFormLayout(mode_group) self.mode_label = QLabel("音效模式:") self.mode_combo = QComboBox() - self.mode_combo.addItems(["预设模式1", "预设模式2", "预设模式3", "预设模式4", "预设模式5", "预设模式6", "用户模式1", "用户模式2", "用户模式3", "bypass", "禁用EQ"]) + self.mode_combo.addItems(MODE_COMBO_ITEMS) self.mode_combo.currentIndexChanged.connect(self.on_mode_changed) mode_layout.addRow(self.mode_label, self.mode_combo) @@ -912,6 +939,129 @@ class EQDesigner(QMainWindow): listen_switch_layout.addRow(listen_switch_btn_layout) left_content_layout.addWidget(listen_switch_group) + # FPS XMOS 算法控制(HID 0xBF/0xC0 游戏档位,0xB5/0xB6 三子模块使能) + fps_xmos_group = QGroupBox("FPS算法控制") + self.ui_groups['fps_xmos'] = fps_xmos_group + fps_xmos_layout = QFormLayout(fps_xmos_group) + + fps_game_layout = QHBoxLayout() + self.fps_xmos_game_combo = QComboBox() + self.fps_xmos_game_combo.addItem("CS2 (0)", 0) + self.fps_xmos_game_combo.addItem("PUBG (1)", 1) + self.fps_xmos_game_combo.addItem("DELTA (2)", 2) + fps_game_layout.addWidget(QLabel("游戏类型:")) + fps_game_layout.addWidget(self.fps_xmos_game_combo) + fps_xmos_layout.addRow(fps_game_layout) + + fps_level_layout = QHBoxLayout() + # 改动原因:与固件默认增益档位一致,默认 level=2 + self.fps_xmos_level_spin = QSpinBox() + self.fps_xmos_level_spin.setRange(0, 4) + self.fps_xmos_level_spin.setValue(2) + fps_level_layout.addWidget(QLabel("增益档位(0-4):")) + fps_level_layout.addWidget(self.fps_xmos_level_spin) + fps_xmos_layout.addRow(fps_level_layout) + + fps_game_btn_layout = QHBoxLayout() + self.set_fps_xmos_game_btn = QPushButton("设置游戏/档位 (0xBF)") + self.set_fps_xmos_game_btn.clicked.connect(self.on_set_fps_xmos_game_select) + self.get_fps_xmos_game_btn = QPushButton("查询档位 (0xC0)") + self.get_fps_xmos_game_btn.clicked.connect(self.on_get_fps_xmos_game_select) + fps_game_btn_layout.addWidget(self.set_fps_xmos_game_btn) + fps_game_btn_layout.addWidget(self.get_fps_xmos_game_btn) + fps_xmos_layout.addRow(fps_game_btn_layout) + + self.fps_xmos_game_status_label = QLabel("游戏档位: 未查询") + fps_xmos_layout.addRow("状态:", self.fps_xmos_game_status_label) + + # 改动原因:与固件默认一致——FPS 主处理开,DRC/fps_eq 关 + self.fps_drc_enable_combo = QComboBox() + self.fps_drc_enable_combo.addItems(["关 (0)", "开 (1)"]) + self.fps_drc_enable_combo.setCurrentIndex(0) + fps_xmos_layout.addRow("DRC:", self.fps_drc_enable_combo) + + self.fps_sub_enable_combo = QComboBox() + self.fps_sub_enable_combo.addItems(["关 (0)", "开 (1)"]) + self.fps_sub_enable_combo.setCurrentIndex(1) + fps_xmos_layout.addRow("FPS主处理:", self.fps_sub_enable_combo) + + self.fps_eq_enable_combo = QComboBox() + self.fps_eq_enable_combo.addItems(["关 (0)", "开 (1)"]) + self.fps_eq_enable_combo.setCurrentIndex(0) + fps_xmos_layout.addRow("fps_eq:", self.fps_eq_enable_combo) + + fps_module_btn_layout = QHBoxLayout() + self.set_fps_module_enable_btn = QPushButton("设置使能 (0xB5)") + self.set_fps_module_enable_btn.clicked.connect(self.on_set_fps_module_enable) + self.get_fps_module_enable_btn = QPushButton("读取使能 (0xB6)") + self.get_fps_module_enable_btn.clicked.connect(self.on_get_fps_module_enable) + fps_module_btn_layout.addWidget(self.set_fps_module_enable_btn) + fps_module_btn_layout.addWidget(self.get_fps_module_enable_btn) + fps_xmos_layout.addRow(fps_module_btn_layout) + + # 改动原因:DRC压缩模式与DRC使能独立,HID 0xBD/0xBE,默认0=low柔和压缩 + self.fps_drc_mode_combo = QComboBox() + self.fps_drc_mode_combo.addItem("low 柔和压缩 (0)", 0) + self.fps_drc_mode_combo.addItem("high 强力压缩 (1)", 1) + self.fps_drc_mode_combo.setCurrentIndex(0) + fps_xmos_layout.addRow("DRC压缩模式:", self.fps_drc_mode_combo) + fps_drc_mode_btn_layout = QHBoxLayout() + self.set_fps_drc_mode_btn = QPushButton("设置DRC模式 (0xBD)") + self.set_fps_drc_mode_btn.clicked.connect(self.on_set_fps_drc_mode) + self.get_fps_drc_mode_btn = QPushButton("读取DRC模式 (0xBE)") + self.get_fps_drc_mode_btn.clicked.connect(self.on_get_fps_drc_mode) + fps_drc_mode_btn_layout.addWidget(self.set_fps_drc_mode_btn) + fps_drc_mode_btn_layout.addWidget(self.get_fps_drc_mode_btn) + fps_xmos_layout.addRow(fps_drc_mode_btn_layout) + + self.fps_eq_mode_spin = QSpinBox() + self.fps_eq_mode_spin.setRange(0, 4) + self.fps_eq_mode_spin.setValue(0) + fps_xmos_layout.addRow("fps_eq模式(0-4):", self.fps_eq_mode_spin) + fps_eq_mode_btn = QHBoxLayout() + self.set_fps_eq_mode_btn = QPushButton("设置模式 (0xB7)") + self.set_fps_eq_mode_btn.clicked.connect(self.on_set_fps_eq_mode) + self.get_fps_eq_mode_btn = QPushButton("读取模式 (0xB8)") + self.get_fps_eq_mode_btn.clicked.connect(self.on_get_fps_eq_mode) + fps_eq_mode_btn.addWidget(self.set_fps_eq_mode_btn) + fps_eq_mode_btn.addWidget(self.get_fps_eq_mode_btn) + fps_xmos_layout.addRow(fps_eq_mode_btn) + + fps_name_layout = QHBoxLayout() + self.fps_eq_mode_name_edit = QLineEdit() + self.fps_eq_mode_name_edit.setPlaceholderText("模式名称(最多15字符)") + fps_name_layout.addWidget(self.fps_eq_mode_name_edit) + self.set_fps_eq_mode_name_btn = QPushButton("设置名称 (0xBB)") + self.set_fps_eq_mode_name_btn.clicked.connect(self.on_set_fps_eq_mode_name) + self.get_fps_eq_mode_name_btn = QPushButton("读取名称 (0xBC)") + self.get_fps_eq_mode_name_btn.clicked.connect(self.on_get_fps_eq_mode_name) + fps_name_layout.addWidget(self.set_fps_eq_mode_name_btn) + fps_name_layout.addWidget(self.get_fps_eq_mode_name_btn) + fps_xmos_layout.addRow("fps_eq模式名:", fps_name_layout) + + fps_band_layout = QHBoxLayout() + self.fps_eq_band_spin = QSpinBox() + self.fps_eq_band_spin.setRange(0, 9) + self.fps_eq_gain_spin = QSpinBox() + self.fps_eq_gain_spin.setRange(-600, 600) + self.fps_eq_gain_spin.setValue(1) + fps_band_layout.addWidget(QLabel("频段:")) + fps_band_layout.addWidget(self.fps_eq_band_spin) + fps_band_layout.addWidget(QLabel("增益(0.01dB):")) + fps_band_layout.addWidget(self.fps_eq_gain_spin) + fps_xmos_layout.addRow(fps_band_layout) + + fps_band_btn = QHBoxLayout() + self.set_fps_eq_band_btn = QPushButton("设置频段 (0xB9)") + self.set_fps_eq_band_btn.clicked.connect(self.on_set_fps_eq_band_gain) + self.get_fps_eq_band_btn = QPushButton("读取频段 (0xBA)") + self.get_fps_eq_band_btn.clicked.connect(self.on_get_fps_eq_band_gain) + fps_band_btn.addWidget(self.set_fps_eq_band_btn) + fps_band_btn.addWidget(self.get_fps_eq_band_btn) + fps_xmos_layout.addRow(fps_band_btn) + + left_content_layout.addWidget(fps_xmos_group) + # 添加EQ使能控制组 eq_enable_group = QGroupBox("EQ使能控制") self.ui_groups['eq_enable'] = eq_enable_group # 保存引用 @@ -1097,6 +1247,7 @@ class EQDesigner(QMainWindow): 'input_source': '输入源控制', 'mute_switch': '静音开关', 'listen_switch': '监听开关', + 'fps_xmos': 'FPS算法控制', 'eq_enable': 'EQ使能控制', 'firmware': '固件升级', 'dfs': '动态降频' @@ -1131,6 +1282,7 @@ class EQDesigner(QMainWindow): 'input_source': '输入源控制', 'mute_switch': '静音开关', 'listen_switch': '监听开关', + 'fps_xmos': 'FPS算法控制', 'eq_enable': 'EQ使能控制', 'firmware': '固件升级' } @@ -1804,7 +1956,11 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ fs = 48000 log_message(LOG_LEVEL_DEBUG, f" 图像显示采样率: {fs} Hz", self.log_level) - mode = self.current_mode + # 改动原因:读取参数时以UI当前选择模式为准,避免self.current_mode被异步查询结果覆盖后读取到错误模式。 + requested_mode = self.mode_combo.currentIndex() + if requested_mode == NUM_EQ_MODES: + requested_mode = EQ_DISABLED_MODE + mode = requested_mode # 读取所有MAX_EQ_BANDS个EQ参数 for eq_index in range(MAX_EQ_BANDS): @@ -1839,9 +1995,15 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ log_message(LOG_LEVEL_ERROR, f"错误: 无效的响应同步头: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) continue - # 模式值 - mode = reply[3] - log_message(LOG_LEVEL_DEBUG, f" 模式值: {mode}", self.log_level) + # 模式值(设备回包) + resp_mode = reply[3] + log_message(LOG_LEVEL_DEBUG, f" 模式值: {resp_mode}", self.log_level) + if resp_mode != requested_mode: + log_message( + LOG_LEVEL_WARN, + f" 警告: 请求模式={requested_mode}, 回包模式={resp_mode},后续仍按请求模式继续读取", + self.log_level + ) # EQ索引 eq_idx = reply[4] @@ -1882,7 +2044,9 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ log_message(LOG_LEVEL_DEBUG, f" 带宽: {bw:.2f} Hz", self.log_level) # 增益 (4字节) - 位置18-21 - gain = struct.unpack('= 0: + self.fps_xmos_game_combo.setCurrentIndex(idx) + if resp_level <= 4: + self.fps_xmos_level_spin.setValue(resp_level) + QMessageBox.information(self, "FPS 游戏档位", + f"game={resp_game}, level={resp_level}") + else: + log_message(LOG_LEVEL_ERROR, "未收到有效的 0xC0 响应", self.log_level) + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"查询 FPS 游戏档位时出错: {str(e)}", self.log_level) + + def on_set_fps_module_enable(self): + """设置 FPS 库 DRC / FPS主处理 / fps_eq 使能(HID 0xB5)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + drc = self.fps_drc_enable_combo.currentIndex() + fps_sub = self.fps_sub_enable_combo.currentIndex() + eq_en = self.fps_eq_enable_combo.currentIndex() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = SET_FPS_MODULE_ENABLE + data[2] = drc + data[3] = fps_sub + data[4] = eq_en + log_message(LOG_LEVEL_INFO, + f"设置 FPS 模块使能: DRC={drc}, FPS={fps_sub}, EQ={eq_en} (HID 0xB5)...", + self.log_level) + h.write([0x01] + list(data)) + + log_message(LOG_LEVEL_DEBUG, "发送的数据:", self.log_level) + log_message(LOG_LEVEL_DEBUG, " ".join(f"0x{byte:02x}" for byte in ([0x01] + list[int](data))), self.log_level) + QMessageBox.information(self, "已发送", + f"DRC={drc}, FPS主处理={fps_sub}, fps_eq={eq_en}\n(0=关, 1=开)") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置 FPS 模块使能时出错: {str(e)}", self.log_level) + + def on_get_fps_module_enable(self): + """读取 FPS 库三模块使能(HID 0xB6)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = GET_FPS_MODULE_ENABLE + log_message(LOG_LEVEL_INFO, "读取 FPS 模块使能 (HID 0xB6)...", self.log_level) + h.write([0x01] + list(data)) + time.sleep(0.05) + reply = h.get_input_report(0x01, 64) + if (reply and len(reply) == 64 and reply[0] == 0x01 + and reply[1] == 0x77 and reply[2] == GET_FPS_MODULE_ENABLE): + drc = reply[3] + fps_sub = reply[4] + eq_en = reply[5] + self.fps_drc_enable_combo.setCurrentIndex(1 if drc else 0) + self.fps_sub_enable_combo.setCurrentIndex(1 if fps_sub else 0) + self.fps_eq_enable_combo.setCurrentIndex(1 if eq_en else 0) + log_message(LOG_LEVEL_DEBUG, "读取到的响应数据:", self.log_level) + log_message(LOG_LEVEL_DEBUG, " ".join(f"0x{byte:02x}" for byte in reply), self.log_level) + log_message(LOG_LEVEL_INFO, + f"FPS 模块使能: DRC={drc}, FPS={fps_sub}, EQ={eq_en}", + self.log_level) + QMessageBox.information(self, "FPS 模块使能", + f"DRC={drc}\nFPS主处理={fps_sub}\nfps_eq={eq_en}\n(0=关, 1=开)") + else: + log_message(LOG_LEVEL_ERROR, "未收到有效的 0xB6 响应", self.log_level) + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取 FPS 模块使能时出错: {str(e)}", self.log_level) + + def on_set_fps_drc_mode(self): + """设置 DRC 压缩模式(HID 0xBD):0=low柔和,1=high强力""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + mode = self.fps_drc_mode_combo.currentData() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = SET_FPS_DRC_MODE + data[2] = mode + mode_name = self.fps_drc_mode_combo.currentText() + log_message(LOG_LEVEL_INFO, + f"设置 DRC 压缩模式: {mode_name} (HID 0xBD)...", + self.log_level) + h.write([0x01] + list(data)) + QMessageBox.information(self, "已发送", f"DRC模式={mode}\n(0=low, 1=high)") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置 DRC 压缩模式时出错: {str(e)}", self.log_level) + + def on_get_fps_drc_mode(self): + """读取 DRC 压缩模式(HID 0xBE)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = GET_FPS_DRC_MODE + log_message(LOG_LEVEL_INFO, "读取 DRC 压缩模式 (HID 0xBE)...", self.log_level) + h.write([0x01] + list(data)) + time.sleep(0.05) + reply = h.get_input_report(0x01, 64) + if (reply and len(reply) == 64 and reply[0] == 0x01 + and reply[1] == 0x77 and reply[2] == GET_FPS_DRC_MODE): + mode = reply[3] + idx = self.fps_drc_mode_combo.findData(mode) + if idx >= 0: + self.fps_drc_mode_combo.setCurrentIndex(idx) + log_message(LOG_LEVEL_INFO, f"DRC 压缩模式: {mode} (0=low, 1=high)", self.log_level) + QMessageBox.information(self, "DRC 压缩模式", f"mode={mode}\n(0=low, 1=high)") + else: + log_message(LOG_LEVEL_ERROR, "未收到有效的 0xBE 响应", self.log_level) + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取 DRC 压缩模式时出错: {str(e)}", self.log_level) + + def on_set_fps_eq_mode(self): + """设置 fps_eq 预设模式 0-4(HID 0xB7)""" + if self.device_combo.currentData() is None: + return + mode = self.fps_eq_mode_spin.value() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + data = bytearray(63) + data[0] = 0x77 + data[1] = SET_FPS_EQ_MODE + data[2] = mode + h.write([0x01] + list(data)) + h.close() + QMessageBox.information(self, "已发送", f"fps_eq 模式已设为 {mode}") + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置 fps_eq 模式失败: {e}", self.log_level) + + def on_get_fps_eq_mode(self): + """读取 fps_eq 当前模式(HID 0xB8)""" + if self.device_combo.currentData() is None: + return + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = GET_FPS_EQ_MODE + h.write([0x01] + list(data)) + time.sleep(0.05) + reply = h.get_input_report(0x01, 64) + if (reply and len(reply) >= 4 and reply[0] == 0x01 + and reply[1] == 0x77 and reply[2] == GET_FPS_EQ_MODE): + mode = reply[3] + self.fps_eq_mode_spin.setValue(mode) + QMessageBox.information(self, "fps_eq 模式", f"当前模式: {mode}") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取 fps_eq 模式失败: {e}", self.log_level) + + def on_set_fps_eq_mode_name(self): + """设置 fps_eq 模式名称(HID 0xBB)""" + if self.device_combo.currentData() is None: + return + mode = self.fps_eq_mode_spin.value() + mode_name = self.fps_eq_mode_name_edit.text().strip() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + data = bytearray(63) + data[0] = 0x77 + data[1] = SET_FPS_EQ_MODE_NAME + data[2] = mode + encoded = mode_name.encode('utf-8', errors='ignore')[:15] + data[3:3 + len(encoded)] = encoded + data[3 + len(encoded)] = 0x00 + h.write([0x01] + list(data)) + h.close() + QMessageBox.information(self, "已发送", f"模式{mode} 名称已设置为: {mode_name}") + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置 fps_eq 模式名失败: {e}", self.log_level) + + def on_get_fps_eq_mode_name(self): + """读取 fps_eq 模式名称(HID 0xBC)""" + if self.device_combo.currentData() is None: + return + mode = self.fps_eq_mode_spin.value() + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = GET_FPS_EQ_MODE_NAME + data[2] = mode + h.write([0x01] + list(data)) + time.sleep(0.05) + reply = h.get_input_report(0x01, 64) + log_message(LOG_LEVEL_DEBUG, f"0xBC响应原始数据: {' '.join(f'0x{byte:02x}' for byte in reply[:16])}", self.log_level) + if (reply and len(reply) >= 20 and reply[0] == 0x01 + and reply[1] == 0x77 and reply[2] == GET_FPS_EQ_MODE_NAME): + resp_mode = reply[3] + raw_name = bytes(reply[4:20]).split(b'\x00', 1)[0] + log_message(LOG_LEVEL_DEBUG, f"raw_name: {raw_name}", self.log_level) + mode_name = raw_name.decode('utf-8', errors='ignore') + self.fps_eq_mode_spin.setValue(resp_mode if resp_mode <= 4 else 0) + self.fps_eq_mode_name_edit.setText(mode_name) + QMessageBox.information(self, "fps_eq 模式名", f"模式{resp_mode} 名称: {mode_name}") + h.close() + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"读取 fps_eq 模式名失败: {e}", self.log_level) + + def on_set_fps_eq_band_gain(self): + """设置当前模式单段增益(HID 0xB9)""" + if self.device_combo.currentData() is None: + return + band = self.fps_eq_band_spin.value() + gain = self.fps_eq_gain_spin.value() + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + data = bytearray(63) + data[0] = 0x77 + data[1] = SET_FPS_EQ_BAND_GAIN + data[2] = band + data[3] = gain & 0xFF + data[4] = (gain >> 8) & 0xFF + h.write([0x01] + list(data)) + h.close() + QMessageBox.information(self, "已发送", f"band={band}, gain={gain} (0.01dB)") + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"设置 fps_eq 频段失败: {e}", self.log_level) + + def on_get_fps_eq_band_gain(self): + """读取当前模式单段增益(HID 0xBA)""" + if self.device_combo.currentData() is None: + return + band = self.fps_eq_band_spin.value() + try: + import time + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + data = bytearray(63) + data[0] = 0x77 + data[1] = GET_FPS_EQ_BAND_GAIN + data[2] = band + h.write([0x01] + list(data)) + time.sleep(0.05) + reply = h.get_input_report(0x01, 64) + # 改动原因:64字节含ReportID[0]=0x01,协议载荷从[1]起:77 BA band gain_lo gain_hi + if (reply and len(reply) >= 6 and reply[0] == 0x01 + and reply[1] == 0x77 and reply[2] == GET_FPS_EQ_BAND_GAIN): + resp_band = reply[3] + gain = struct.unpack(' 0) { DPRINTF(" Saved %d dirty single parameters\n", saved_count); } + lfs_deinit(); return 0; } /** @@ -877,14 +897,23 @@ int eq_save_dirty_gain(void) { return 0; } + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // audiohw.xc直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_save_dirty_gain\n"); + return -1; + } + DPRINTF(" Saving dirty gain\n"); // 使用新的独立保存函数 if (eq_save_gain() == 0) { gain_dirty = 0; // 只清除增益脏标志 DPRINTF(" Successfully saved gain\n"); + lfs_deinit(); return 0; } else { DPRINTF(" Error: Failed to save gain\n"); + lfs_deinit(); return -1; } } @@ -904,6 +933,13 @@ int eq_save_dirty_names(void) { return 0; } + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // audiohw.xc直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_save_dirty_names\n"); + return -1; + } + DPRINTF(" Saving dirty mode names\n"); // 使用新的独立保存函数,逐个保存每个用户模式的name int saved_count = 0; @@ -923,12 +959,15 @@ int eq_save_dirty_names(void) { if (saved_count > 0) { DPRINTF(" Successfully saved %d mode name(s), skipped %d\n", saved_count, skipped_count); + lfs_deinit(); return 0; } else if (skipped_count > 0) { DPRINTF(" All mode names skipped (same as default or empty), %d skipped\n", skipped_count); + lfs_deinit(); return 0; // 跳过是正常的,不算错误 } else { DPRINTF(" Error: Failed to save mode names\n"); + lfs_deinit(); return -1; } } @@ -1081,6 +1120,13 @@ int eq_save_name(uint8_t mode) { int eq_save_gain_and_names(void) { int ret = 0; + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // 此函数为公共API,调用了eq_save_gain和eq_save_name(均直接操作Flash),必须提供会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_save_gain_and_names\n"); + return -1; + } + // 保存gain if (eq_save_gain() != 0) { ret = -1; @@ -1095,6 +1141,7 @@ int eq_save_gain_and_names(void) { // result == 1 表示跳过,这是正常的 } + lfs_deinit(); return ret; } @@ -1260,6 +1307,13 @@ int eq_load_name(uint8_t mode) { int eq_load_gain_and_names(void) { int ret = 0; + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // dsp_core0.xc在eq_flash_init()完成(释放锁)后直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_load_gain_and_names\n"); + return -1; + } + // 加载gain if (eq_load_gain() != 0) { ret = -1; // 文件不存在是正常的,使用默认值 @@ -1273,6 +1327,7 @@ int eq_load_gain_and_names(void) { } DPRINTF("Successfully loaded gain and mode names\n"); + lfs_deinit(); return ret; } @@ -1300,7 +1355,14 @@ int eq_load_all_params_and_calculate_coefficients(uint32_t sample_rate, uint8_t DPRINTF(" Error: Failed to get EQ array for sample rate %u\n", sample_rate); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // dsp_core0.xc在eq_flash_init()完成后直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_load_all_params_and_calculate_coefficients\n"); + return -1; + } + int loaded_count = 0; // 简化加载逻辑:只从44100Hz channel 0加载参数,然后应用到所有采样率和通道 @@ -1313,7 +1375,8 @@ int eq_load_all_params_and_calculate_coefficients(uint32_t sample_rate, uint8_t //DPRINTF(" Loaded %d single parameters and calculated coefficients for mode %d\n", // loaded_count, mode); - + + lfs_deinit(); return 0; } @@ -1367,7 +1430,14 @@ int eq_flash_save_mode(uint8_t mode) { DPRINTF(" Error: Failed to get EQ array for current sample rate %lu\n", (unsigned long)g_eq_sample_rate); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // 此前该函数直接调用lfs_write_config而无会话保护,多core同时访问会导致数据损坏。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_flash_save_mode\n"); + return -1; + } + // 保存左右两个声道的数据 for (int ch = 0; ch < NUM_EQ_CHANS; ch++) { // 构建文件路径 @@ -1421,7 +1491,8 @@ int eq_flash_save_mode(uint8_t mode) { #endif DPRINTF(" Successfully saved EQ parameters for mode %d, channel %d\n", mode, ch); } - + + lfs_deinit(); return 0; } @@ -1604,7 +1675,14 @@ int delete_flash_eq_params(uint8_t mode) { DPRINTF(" Error: Flash storage not initialized\n"); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // eq.c的reset_eq_params()直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in delete_flash_eq_params\n"); + return -1; + } + int deleted_count = 0; if (mode == 0xFF) { @@ -1646,6 +1724,7 @@ int delete_flash_eq_params(uint8_t mode) { } DPRINTF(" Deleted %d parameter files\n", deleted_count); + lfs_deinit(); return 0; } @@ -1656,7 +1735,7 @@ int delete_flash_eq_params(uint8_t mode) { * * 改动原因:修改为按模式删除,只删除指定模式的增益和名称,而不是删除所有文件 * - 如果mode == 0xFF,删除所有用户模式的增益和名称文件 - * - 如果mode是用户模式(6-8),只删除该模式的名称文件,并将该模式的增益恢复为默认值(0) + * - 如果mode是用户模式(13-14),只删除该模式的名称文件,并将该模式的增益恢复为默认值(0) * - 如果mode是预设模式(0-5),不需要删除(预设模式的增益和名称不存储在Flash中) */ int delete_flash_gain_and_names(uint8_t mode) { @@ -1666,7 +1745,14 @@ int delete_flash_gain_and_names(uint8_t mode) { DPRINTF(" Error: Flash storage not initialized\n"); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // eq.c的reset_eq_params()直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in delete_flash_gain_and_names\n"); + return -1; + } + // 处理删除所有模式的情况 if (mode == 0xFF) { DPRINTF(" Deleting all user mode gains and names\n"); @@ -1693,23 +1779,26 @@ int delete_flash_gain_and_names(uint8_t mode) { } } } - + + lfs_deinit(); return 0; } // 检查模式有效性 if (mode >= NUM_EQ_MODES) { DPRINTF(" Error: Invalid mode %d\n", mode); + lfs_deinit(); return -1; } // 预设模式(0-5)的增益和名称不存储在Flash中,不需要删除 if (mode < EQ_USER_MODE_MIN) { DPRINTF(" Mode %d is a preset mode, no Flash data to delete\n", mode); + lfs_deinit(); return 0; } - // 只处理用户模式(6-8) + // 只处理用户模式(13-14) if (mode >= EQ_USER_MODE_MIN && mode <= EQ_USER_MODE_MAX) { // 删除该模式的名称文件 char file_path[FILE_PATH_MAX_LENGTH]; @@ -1763,12 +1852,14 @@ int delete_flash_gain_and_names(uint8_t mode) { } else { DPRINTF(" Gains file does not exist: %s\n", file_path); } - + + lfs_deinit(); return 0; } // 其他模式(如模式9)不需要处理 DPRINTF(" Mode %d does not require Flash data deletion\n", mode); + lfs_deinit(); return 0; } @@ -1864,7 +1955,14 @@ int eq_flash_save_eq_enable(uint8_t enable) DPRINTF(" Error: Invalid EQ enable value %d (valid range: 0-1)\n", enable); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // 此前该函数直接调用lfs_write_config而无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_flash_save_eq_enable\n"); + return -1; + } + // 构建独立文件路径 // 改动原因:使用独立的文件名存储eq_enable,与模式存储完全分离 char file_path[FILE_PATH_MAX_LENGTH]; @@ -1891,6 +1989,7 @@ int eq_flash_save_eq_enable(uint8_t enable) // 写入文件 lfs_write_config(file_path, file_data, sizeof(file_data)); DPRINTF(" Successfully saved EQ enable %d to Flash (independent file: %s)\n", enable, file_path); + lfs_deinit(); return 0; } @@ -1911,11 +2010,19 @@ int eq_flash_save_current_mode(uint8_t mode) } // 验证模式值范围 - if (mode > 9) { - DPRINTF(" Error: Invalid mode %d (valid range: 0-9)\n", mode); + // 改动原因:EQ模式数量扩展到15,允许保存模式范围0-14。 + if (mode >= NUM_EQ_MODES) { + DPRINTF(" Error: Invalid mode %d (valid range: 0-%d)\n", mode, NUM_EQ_MODES - 1); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥, + // 防止多core并发访问导致数据损坏。此前该函数直接调用lfs_write_config而无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_flash_save_current_mode\n"); + return -1; + } + // 构建独立文件路径 // 改动原因:使用独立的文件名存储模式,与eq_enable存储完全分离 char file_path[FILE_PATH_MAX_LENGTH]; @@ -1942,6 +2049,7 @@ int eq_flash_save_current_mode(uint8_t mode) // 写入文件 lfs_write_config(file_path, file_data, sizeof(file_data)); DPRINTF(" Successfully saved EQ mode %d to Flash (independent file: %s)\n", mode, file_path); + lfs_deinit(); return 0; } @@ -1961,10 +2069,17 @@ int eq_flash_load_current_mode(void) DPRINTF(" Error: Flash storage not initialized\n"); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // dsp_core0.xc在eq_flash_init()完成后直接调用此函数,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_flash_load_current_mode\n"); + return -1; + } + // 加载模式(从独立文件) char mode_file_path[FILE_PATH_MAX_LENGTH]; - snprintf(mode_file_path, sizeof(mode_file_path), "%s", g_eq_flash_mode_file); + snprintf(mode_file_path, sizeof(mode_file_path), "%s/%s", g_eq_flash_base_dir, g_eq_flash_mode_file); if (lfs_file_exists(mode_file_path)) { eq_file_header_t header; @@ -1976,7 +2091,8 @@ int eq_flash_load_current_mode(void) mode = file_header_data[sizeof(header)]; // 验证模式值范围 - if (mode > 9) { + // 改动原因:EQ模式数量扩展到15,加载时按NUM_EQ_MODES校验范围(0-14)。 + if (mode >= NUM_EQ_MODES) { DPRINTF(" Error: Invalid mode value %d in file\n", mode); mode = 0; // 使用默认值 } else { @@ -2001,7 +2117,7 @@ int eq_flash_load_current_mode(void) // 加载使能状态(从独立文件) char enable_file_path[FILE_PATH_MAX_LENGTH]; - snprintf(enable_file_path, sizeof(enable_file_path), "%s", g_eq_flash_enable_file); + snprintf(enable_file_path, sizeof(enable_file_path), "%s/%s", g_eq_flash_base_dir, g_eq_flash_enable_file); if (lfs_file_exists(enable_file_path)) { eq_file_header_t header; @@ -2041,6 +2157,7 @@ int eq_flash_load_current_mode(void) g_eq_enable = eq_enable; DPRINTF(" Successfully loaded mode %d and EQ enable %d from Flash (independent files)\n", mode, eq_enable); + lfs_deinit(); return mode; } @@ -2059,7 +2176,14 @@ int eq_flash_load_eq_enable(void) DPRINTF(" Error: Flash storage not initialized\n"); return -1; } - + + // 改动原因:所有Flash I/O必须在lfs_init()/lfs_deinit()会话内执行,确保QSPI Flash访问互斥。 + // 此函数为公共API,直接进行Flash读操作,此前无会话保护。 + if (lfs_init() != 0) { + DPRINTF(" Error: Failed to open flash session in eq_flash_load_eq_enable\n"); + return -1; + } + // 加载使能状态(从独立文件) char enable_file_path[FILE_PATH_MAX_LENGTH]; snprintf(enable_file_path, sizeof(enable_file_path), "%s", g_eq_flash_enable_file); @@ -2102,6 +2226,7 @@ int eq_flash_load_eq_enable(void) g_eq_enable = eq_enable; DPRINTF(" Successfully loaded EQ enable %d from Flash (independent file)\n", eq_enable); + lfs_deinit(); return eq_enable; } diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h index 1d7838e..59e20f3 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_flash_storage.h @@ -10,7 +10,7 @@ #define EQ_FLASH_MAGIC_PARAMS 0x45515041 // "EQPA" - EQ参数文件魔数 #define EQ_FLASH_VERSION 0x00020000 // 版本2.0.0 - 优化存储格式 #define EQ_FLASH_MAX_SAMPLE_RATES 6 // 支持的采样率数量 -#define EQ_FLASH_MAX_MODES 10 // 最大模式数量 +#define EQ_FLASH_MAX_MODES 15 // 最大模式数量(改动原因:EQ模式扩展至15) #define EQ_FLASH_MAX_CHANNELS 2 // 最大通道数量 // 支持的采样率列表 @@ -46,9 +46,9 @@ typedef struct { uint32_t crc32; // CRC32校验 } __attribute__((packed)) eq_gain_header_t; -// 模式增益数据(只存储用户模式6-8) +// 模式增益数据(只存储用户模式13-14) typedef struct { - int32_t mode_gains[3]; // 用户模式增益数组:mode 6, 7, 8,每个4字节 + int32_t mode_gains[2]; // 用户模式增益数组:mode 13, 14,每个4字节(改动原因:用户模式由3个减为2个) } __attribute__((packed)) eq_gain_data_t; // 单个模式名称存储结构 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md index 43cf461..544cb09 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_hid_protocol.md @@ -16,7 +16,7 @@ | 0x8F | GET_DEVICE_INFO | 获取设备信息 | 主机→设备 | 读取设备PID、VID、产品字符串等信息 | | 0x90 | RESET_EQ_PARAMS | 复位EQ参数 | 主机→设备 | 删除Flash中的EQ参数并恢复头文件预设参数 | | 0x91 | GET_EQ_MODE_COUNT | 获取EQ模式总数 | 主机→设备 | 返回预定义加用户模式的总数(不包含禁用模式) | -| 0x92 | SET_AND_SAVE_EQ_MODE | 设置并保存EQ模式 | 主机→设备 | 设置当前EQ模式(0-9)并保存到Flash,开机时自动恢复 | +| 0x92 | SET_AND_SAVE_EQ_MODE | 设置并保存EQ模式 | 主机→设备 | 设置当前EQ模式(0-14)并保存到Flash,开机时自动恢复 | | 0x93 | SET_VOLUME | 设置音量级别 | 主机→设备 | 设置设备音量级别(0-255) | | 0x94 | GET_VOLUME | 获取音量级别 | 主机→设备 | 读取设备当前音量级别(0-255) | | 0x95 | GET_LED_INFO | 获取LED信息 | 主机→设备 | 读取LED索引和LED名称 | @@ -37,13 +37,30 @@ | 0xA4 | SET_GAME_MODE | 设置游戏模式 | 主机→设备 | 设置游戏模式(0=无音效,1=FPS,2=虚拟7.1) | | 0xA5 | GET_GAME_MODE | 获取游戏模式 | 主机→设备 | 读取当前游戏模式(0-2) | | 0xA6 | GET_FIRMWARE_VERSION | 获取固件版本 | 主机→设备 | 读取设备固件版本号(BCD格式:主版本.次版本.修订版本) | -| 0xB0 | SET_INPUT_SOURCE | 设置输入源模式 | 主机→设备 | 设置输入源模式(0=USB, 1=OPT, 2=COAX),通过UART 0x5D透传给MCU | -| 0xB1 | SET_MUTE_SWITCH | 设置静音开关 | 主机→设备 | 设置静音开关(0=关,1=开),通过UART 0x5E透传给MCU | -| 0xB2 | GET_MUTE_SWITCH | 获取静音开关状态 | 主机→设备 | 读取静音开关状态(0=关,1=开),设备通过串口向MCU请求后返回 | -| 0xB3 | SET_LISTEN_SWITCH | 设置监听开关 | 主机→设备 | 设置监听开关(0=关,1=开),通过UART 0x60透传给MCU | -| 0xB4 | GET_LISTEN_SWITCH | 获取监听开关状态 | 主机→设备 | 读取监听开关状态(0=关,1=开),直接返回 g_adc_loop 的值,不经过串口 | -| 0xB6 | SET_TILE1_DIV | 设置tile1动态降频分频值 | 主机→设备 | 设置tile1低功耗分频值N(core clock=600MHz/N),仅FPS镜像(C1_DFS_EN)生效,tile1空闲时降频 | -| 0xB7 | GET_TILE1_DIV | 获取tile1动态降频分频值 | 主机→设备 | 读取当前tile1低功耗分频值N(动态降频),仅FPS镜像(C1_DFS_EN)生效 | +| 0xA7 | FIRMWARE_UPGRADE_START | 开始固件升级 | 主机→设备 | 初始化升级流程,设置固件大小(与 eq_hid_protocol_ds1 一致) | +| 0xA8 | FIRMWARE_UPGRADE_DATA | 传输固件数据块 | 主机→设备 | 固定57字节数据块 | +| 0xA9 | FIRMWARE_UPGRADE_END | 结束固件升级 | 主机→设备 | 验证镜像 | +| 0xAA | FIRMWARE_UPGRADE_STATUS | 获取升级状态 | 主机→设备 | 进度与状态 | +| 0xAB | FIRMWARE_UPGRADE_ABORT | 中止固件升级 | 主机→设备 | 中止并清理 | +| 0xAC | FIRMWARE_UPGRADE_ERASE | 擦除升级镜像 | 主机→设备 | 擦除 Flash 升级区 | +| 0xAE | DEVICE_REBOOT | 设备重启 | 主机→设备 | 通用重启命令 | +| 0xB0 | SET_INPUT_SOURCE | 设置输入源模式 | 主机→设备 | 设置输入源模式(0=USB, 1=OPT, 2=COAX),tile0 经 sync 0x04 到 tile1 发 UART 0x5D 透传 MCU | +| 0xB1 | SET_MUTE_SWITCH | 设置静音开关 | 主机→设备 | 设置静音开关(0=关,1=开),tile0 经 sync 0x05 到 tile1 发 UART 0x5E 透传 MCU | +| 0xB2 | GET_MUTE_SWITCH | 获取静音开关状态 | 主机→设备 | 读取静音开关状态(0=关,1=开),tile0 经 sync 0x06 让 tile1 向 MCU 发 0x5F,MCU 返回后 tile1 经 sync 0x0E 回传静音值 | +| 0xB3 | SET_LISTEN_SWITCH | 设置监听开关 | 主机→设备 | 设置监听开关(0=关,1=开),tile0 经 sync 0x07 到 tile1 发 UART 0x60 透传 MCU | +| 0xB4 | GET_LISTEN_SWITCH | 获取监听开关状态 | 主机→设备 | 读取监听开关状态(0=关,1=开),直接返回 tile0 的 g_adc_loop 值(由 tile1 经 sync 0x0D 同步),不经过串口 | +| 0xB5 | SET_FPS_MODULE_ENABLE | 设置FPS库子模块使能 | 主机→设备 | 设置DRC/FPS主处理/fps_eq使能(0=旁路,1=开启);tile0存Flash后经sync 0x08同步tile1 | +| 0xB6 | GET_FPS_MODULE_ENABLE | 获取FPS库子模块使能 | 主机→设备 | 从Flash读取三模块使能状态(0/1) | +| 0xB7 | SET_FPS_EQ_MODE | 设置fps_eq预设模式 | 主机→设备 | 模式0-4(共5套),默认0;tile0写Flash后sync 0x09到tile1加载该模式10段增益 | +| 0xB8 | GET_FPS_EQ_MODE | 获取fps_eq当前模式 | 主机→设备 | 返回当前模式0-4 | +| 0xB9 | SET_FPS_EQ_BAND_GAIN | 设置当前模式单段增益 | 主机→设备 | band(0-9)+gain int16 LE(0.01dB,-600~600);tile0存Flash,sync 0x0A到tile1调用eq_set_band_gain | +| 0xBA | GET_FPS_EQ_BAND_GAIN | 获取当前模式单段增益 | 主机→设备 | 请求band(0-9),返回gain int16 LE | +| 0xBB | SET_FPS_EQ_MODE_NAME | 设置fps_eq模式名称 | 主机→设备 | 设置模式0-4的名称(16字节,含\0截断);tile0写Flash断电保存 | +| 0xBC | GET_FPS_EQ_MODE_NAME | 获取fps_eq模式名称 | 主机→设备 | 请求模式0-4,返回该模式16字节名称 | +| 0xBD | SET_FPS_DRC_MODE | 设置DRC压缩模式 | 主机→设备 | mode 0=low柔和压缩、1=high强力压缩,默认0;tile0存Flash后经sync 0x0C同步tile1 | +| 0xBE | GET_FPS_DRC_MODE | 获取DRC压缩模式 | 主机→设备 | 返回当前DRC压缩模式(0/1) | +| 0xBF | SET_FPS_XMOS_GAME_SELECT | 设置FPS XMOS游戏与增益 | 主机→设备 | 设置game(0-2)及该game绑定的level(0-4);每种game单独存level(fps_level_g0/g1/g2),默认level为2 | +| 0xC0 | GET_FPS_XMOS_GAME_SELECT | 获取指定game的level | 主机→设备 | 请求字节2指定game(0-2),返回该game及其在Flash中保存的level(0-4) | ### 1.3 数据包格式 - **Report ID**: 0x01 (HID报告ID) @@ -62,7 +79,7 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x8A | 命令码 -2 | 1 | uint8 | 模式值 (0-5: 预设模式, 6-8: 用户模式, 9: bypass) +2 | 1 | uint8 | 模式值 (0-12: 预设模式, 13-14: 用户模式, 15: 禁用EQ) 3-62 | 60 | 0x00 | 保留字节 ``` @@ -76,13 +93,13 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x8B | 命令码 -2 | 1 | uint8 | 模式值 (0-9: 有效模式值, 0xFF: 获取当前模式信息) +2 | 1 | uint8 | 模式值 (0-14: 有效模式值, 0xFF: 获取当前模式信息) 3-62 | 60 | 0x00 | 保留字节 ``` **设备端处理**: - 如果mode值为0xFF,返回当前模式值、整体增益和模式名称 -- 如果mode值为有效模式值(0-9),返回指定模式值、整体增益和模式名称 +- 如果mode值为有效模式值(0-14),返回指定模式值、整体增益和模式名称 @@ -101,7 +118,7 @@ **使用说明**: - 发送mode=0xFF时,返回当前激活的EQ模式信息 -- 发送mode=0-9时,返回指定模式的增益和名称信息(不切换当前模式) +- 发送mode=0-14时,返回指定模式的增益和名称信息(不切换当前模式) ### 2.3 0x8C - SET_MODE_GAIN_AND_NAME (设置模式整体增益和名称) **功能**: 设置EQ模式整体增益和名称 @@ -112,7 +129,7 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x8C | 命令码 -2 | 1 | uint8 | 模式值 (0-9) +2 | 1 | uint8 | 模式值 (0-14) 3-6 | 4 | int32 | 增益值 (范围0到-50dB,有符号整数) 7-22 | 16 | char | 模式名称 (UTF-8编码,16字节) 23-62 | 40 | 0x00 | 保留字节 @@ -132,7 +149,7 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x8D | 命令码 -2 | 1 | uint8 | 模式值 (0-9) +2 | 1 | uint8 | 模式值 (0-14) 3 | 1 | uint8 | 滤波器Band索引 (0-7) 4 | 1 | uint8 | 滤波器类型 5-8 | 4 | float | 中心频率 (Hz) @@ -166,7 +183,7 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x8E | 命令码 -2 | 1 | uint8 | 模式值 (0-9) +2 | 1 | uint8 | 模式值 (0-14) 3 | 1 | uint8 | EQ索引 (0-7) 4-62 | 59 | 0x00 | 保留字节 ``` @@ -178,7 +195,7 @@ 0 | 1 | 0x01 | Report ID 1 | 1 | 0x77 | 同步头1 2 | 1 | 0x8E | 同步头2 -3 | 1 | uint8 | 模式值 (0-9) +3 | 1 | uint8 | 模式值 (0-14) 4 | 1 | uint8 | 滤波器Band索引 (0-7) 5 | 1 | uint8 | 滤波器类型 6-9 | 4 | float | 中心频率 (Hz) @@ -224,7 +241,7 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x90 | 命令码 -2 | 1 | uint8 | 模式号 (0-9, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 ) +2 | 1 | uint8 | 模式号 (0-14, 0xFF表示恢复所有包括EQ参数,总体增益,模式名称 ) 3-62 | 60 | 0x00 | 保留字节 ``` @@ -258,8 +275,8 @@ 0 | 1 | 0x01 | Report ID 1 | 1 | 0x77 | 同步头1 2 | 1 | 0x91 | 同步头2 -3 | 1 | uint8 | 模式总数 (当前为9,包含0-8共9个模式,不包含禁用模式) -4 | 1 | uint8 | 预定义模式数量 (当前为6,包含0-5共6个预设模式) +3 | 1 | uint8 | 模式总数 (当前为15,包含0-14共15个模式,不包含禁用模式15) +4 | 1 | uint8 | 预定义模式数量 (当前为13,包含0-12共13个预设模式) 5-62 | 58 | 0x00 | 保留字节 ``` @@ -272,7 +289,7 @@ ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0x92 | 命令码 -2 | 1 | uint8 | 模式值 (0-9: 0-5预设模式, 6-8用户模式, 9: bypass) +2 | 1 | uint8 | 模式值 (0-14: 0-12预设模式, 13-14用户模式, 15=禁用EQ) 3-62 | 60 | 0x00 | 保留字节 ``` @@ -665,7 +682,7 @@ 1 | 1 | 0x77 | 同步头1 2 | 1 | 0x9E | 同步头2 3 | 1 | uint8 | EQ使能开关状态 (0=OFF禁用, 1=ON启用) -4 | 1 | uint8 | 保存的模式值 (0-9,如果之前有保存,0xFF表示未保存) +4 | 1 | uint8 | 保存的模式值 (0-14,如果之前有保存,0xFF表示未保存) 5-62 | 58 | 0x00 | 保留字节 ``` @@ -863,9 +880,221 @@ - 3个字节分别表示:主版本号、次版本号、修订版本号 - 例如:0x01 0x00 0x0C 表示版本 1.0.12 -### 2.30 0xB0 - SET_INPUT_SOURCE (设置输入源模式) -**功能**: 设置输入源模式(USB/OPT/COAX),通过UART 0x5D命令透传给MCU处理 -**方向**: 主机→设备(XMOS)→MCU +### 2.30 0xB5 - SET_FPS_MODULE_ENABLE (设置FPS库 DRC / FPS主处理 / fps_eq 使能) +**功能**: 设置 FPS 算法库三个子模块的运行时开关,对应 `fps_xmos_xc_set_module_enable(drc_enable, fps_enable, eq_enable)`。0=旁路,非0=开启。 +**方向**: 主机→设备(tile0)→tile1 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB5 | 命令码 +2 | 1 | uint8 | drc_enable (0/1) +3 | 1 | uint8 | fps_enable,FPS主处理子模块 (0/1) +4 | 1 | uint8 | eq_enable,fps_eq子模块 (0/1) +5-62 | 58 | 0x00 | 保留字节 +``` + +**Flash 存储**: +- `fps_drc_enable` / `fps_sub_enable` / `fps_eq_enable`:各 0 或 1,未存或无效(>1) 时默认 DRC=0、FPS主处理=1、fps_eq=0。 + +**设备端处理**: +- tile0:写 Flash 与共享全局 `g_fps_drc_enable`、`g_fps_sub_enable`、`g_fps_eq_enable`。 +- 打包 `packed = drc | (fps_sub<<8) | (eq<<16)`,`g_sync_t0_to_t1_cmd=0x08`,`g_sync_t0_to_t1_data=packed`。 +- tile1:解包后调用 `fps_apply_module_enable()` → `fps_xmos_xc_set_module_enable()`。 + +**上电恢复**: `SYNC_CMD_LOAD_CONFIGS` 中从 Flash 读取三键并触发 sync 0x08。 + +### 2.31 0xB6 - GET_FPS_MODULE_ENABLE (获取FPS库子模块使能) +**功能**: 读取 DRC / FPS主处理 / fps_eq 当前使能状态(来自 tile0 运行时全局 `g_fps_*`,与 0xB5 写入一致,避免紧接读 Flash 滞后)。 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xB6 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xB6 | 同步头2 +3 | 1 | uint8 | drc_enable (0/1) +4 | 1 | uint8 | fps_enable (0/1) +5 | 1 | uint8 | eq_enable (0/1) +6-62 | 57 | 0x00 | 保留字节 +``` + +### 2.32 0xBD - SET_FPS_DRC_MODE (设置 DRC 压缩模式) +**功能**: 设置 FPS 算法库 DRC 压缩强度,对应 `fps_xmos_xc_drc_set_mode(mode)`。0=low(柔和压缩),1=high(强力压缩)。 +**方向**: 主机→设备(tile0)→tile1 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xBD | 命令码 +2 | 1 | uint8 | drc_mode (0=low, 1=high) +3-62 | 60 | 0x00 | 保留字节 +``` + +**Flash 键**: `fps_drc_mode`,未存或无效(>1) 时默认 **0**(low)。 + + +### 2.33 0xBE - GET_FPS_DRC_MODE (获取 DRC 压缩模式) +**功能**: 读取当前 DRC 压缩模式(来自 tile0 运行时全局 `g_fps_drc_mode`,与 0xBD 写入一致)。 +**方向**: 主机→设备 + +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xBE | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xBE | 同步头2 +3 | 1 | uint8 | drc_mode (0=low, 1=high) +4-62 | 59 | 0x00 | 保留字节 +``` + +### 2.34 0xBF - SET_FPS_XMOS_GAME_SELECT (设置FPS XMOS游戏类型与增益等级) +**功能**: 设置当前FPS游戏类型(game)及**该game绑定的**增益等级(level),用于 `fps_xmos_game_select(game, level)`。game 与 level 绑定:三种 game(0/1/2) 各有各自保存的 level(0/1/2/3/4),选择某 game 时使用该 game 对应的 level;默认 level 为 2。 +**方向**: 主机→设备(XMOS tile0)→tile1 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xBF | 命令码 +2 | 1 | uint8 | 游戏类型 game (0/1/2) +3 | 1 | uint8 | 该 game 的增益等级 level (0/1/2/3/4),默认 2 +4-62 | 59 | 0x00 | 保留字节 +``` + +**参数说明**: +- **game(字节2):** 游戏类型,0/1/2;对应 `fps_xmos_game_select` 的第一个参数。 +- **level(字节3):** 当前选中的 game 的增益等级,0/1/2/3/4;对应 `fps_xmos_game_select` 的第二个参数。若主机未发或无效(>4),设备按默认 2 处理。 +- **绑定关系:** 设置 (game, level) 后,仅该 game 的 level 被更新;切换 game 时(含上电恢复)会查该 game 对应的已保存 level。 + +**Flash 存储(按 game 分别存 level)**: +- `fps_game_select`:当前选中的 game (0/1/2)。 +- `fps_level_g0` / `fps_level_g1` / `fps_level_g2`:分别表示 game 0、1、2 的 level (0/1/2/3/4),默认 2。 +- 0xBF 设置 (game, level) 时:写入 `fps_game_select=game`,并将 level 写入对应键(game 0→fps_level_g0,game 1→fps_level_g1,game 2→fps_level_g2)。 +- 上电恢复:在 `fps_boot_load_from_flash` 中读 `fps_game_select`,再根据 game 查对应 level(读 fps_level_g0/g1/g2),得到当前 (game, level) 后同步到 tile1。 + +**设备端处理**: +- tile0 解析 data[2]=game、data[3]=level;level 无效(>4) 时按 2。 +- 保存:`save_value("fps_game_select", game)`,并按 game 写 `save_value("fps_level_g0"/"fps_level_g1"/"fps_level_g2", level)`。 +- 打包 `packed_fps = (game<<0) | (level<<8)`,设置 g_sync_t0_to_t1_cmd=0x03、g_sync_t0_to_t1_data=packed_fps,更新 g_fps_game_select、g_fps_level_select。 +- tile1 解包后设置 g_fps_game_select、g_fps_level_select,fps1_dsp_proc_task 调用 fps_xmos_game_select(game, level)。 + +**同步机制**: +- HID 0xBF 在 tile0 接收 → 按 game 写入对应 level 键 → 设置 sync 0x03 + packed_fps → tile1 解包并设置 g_fps_game_select、g_fps_level_select → fps1_dsp_proc_task 调用 fps_xmos_game_select(game, level)。 + +**返回值**: +无直接返回值。当前 game 及该 game 的 level 可用 GET_FPS_XMOS_GAME_SELECT (0xC0) 读取。 + +### 2.35 0xC0 - GET_FPS_XMOS_GAME_SELECT (获取指定 game 的 level) +**功能**: 按主机指定的 game(0/1/2) 查询该 game 绑定的 level(0/1/2/3/4),返回**指定 game** 及其在 Flash 中保存的 level(非当前选中的 game)。 +**方向**: 主机→设备 +**请求数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0xC0 | 命令码 +2 | 1 | uint8 | 要查询的 game (0/1/2),不传或无效时设备按 0 处理 +3-62 | 60 | 0x00 | 保留字节 +``` + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0xC0 | 同步头2 +3 | 1 | uint8 | 请求的 game (0/1/2) +4 | 1 | uint8 | 该 game 绑定的 level (0/1/2/3/4),来自 Flash fps_level_g0/g1/g2 +5-62 | 58 | 0x00 | 保留字节 +``` + +**说明**: +- 请求字节2:指定要查询的 game;未传或 >2 时设备按 game=0 查询。 + +### 2.36 0xB7 - SET_FPS_EQ_MODE (设置 fps_eq 预设模式) +**功能**: 选择 5 套 fps_eq 增益预设之一(模式 **0–4**,默认 **0**)。切换后 tile1 对该模式全部 10 段调用 `fps_xmos_xc_eq_set_all_gains`。 +**数据包**: `[0x77][0xB7][mode]`,mode 无效(>4) 拒绝。 + +**Flash**: 文件 `fps_eq_store`,含 `current_mode` 与 `gains[5][10]`,每段默认 **1** (0.01dB)。 + +**同步**: tile0 写 Flash → 发布共享 pack 字 → `g_sync_t0_to_t1_cmd=0x09`。 + +### 2.35 0xB8 - GET_FPS_EQ_MODE +**响应**: `[0x77][0xB8][mode]`,mode 为当前选中模式 0–4。 + +### 2.36 0xB9 - SET_FPS_EQ_BAND_GAIN (设置当前模式单段增益) +**功能**: 调节**当前模式**下某一频段增益,tile1 调用 `fps_xmos_xc_eq_set_band_gain(band, gain)`。 +**数据包**: +``` +0: 0x77 1: 0xB9 2: band(0-9) 3-4: gain int16 LE (0.01dB, -600~600) +``` +tile0 更新 Flash 中 `gains[current_mode][band]`,sync **0x0A**。 + +### 2.37 0xBA - GET_FPS_EQ_BAND_GAIN +**请求**: `[0x77][0xBA][band]` +**响应(含 Report ID 的 64 字节 HID 报告)**: +``` +字节 | 内容 +-----|------ +0 | 0x01 Report ID +1 | 0x77 +2 | 0xBA +3 | band (0-9) +4-5 | gain int16 小端 (0.01dB, -600~600) +``` +主机解析增益应使用 **字节 4–5**,勿与字节 3(band)拼接。 + +### 2.38 0xBB - SET_FPS_EQ_MODE_NAME (设置 fps_eq 模式名称) +**功能**: 设置 fps_eq 预设模式名称(模式 0~4,对应 5 套增益)。 +**请求格式**: +``` +0:0x77 1:0xBB 2:mode(0-4) 3..18:name[16] +``` +**说明**: +- 名称最大 15 个可见字符,第 16 字节用于 `\0` 结尾(设备侧强制截断)。 +- 名称写入 tile0 Flash (`fps_eq_store`),支持断电保存。 + +### 2.39 0xBC - GET_FPS_EQ_MODE_NAME (读取 fps_eq 模式名称) +**请求**: `[0x77][0xBC][mode]` +**响应(含 Report ID 的 64 字节 HID 报告)**: +``` +字节 | 内容 +-----|------ +0 | 0x01 Report ID +1 | 0x77 +2 | 0xBC +3 | mode(0-4) +4..19| name[16](\0 结尾,不足补0) +``` + +### 2.40 0xB0 - SET_INPUT_SOURCE (设置输入源模式) +**功能**: 设置输入源模式(0=USB, 1=OPT, 2=COAX) +**方向**: 主机→设备 **数据包格式**: ``` 字节位置 | 长度 | 内容 | 描述 @@ -875,161 +1104,61 @@ 2 | 1 | uint8 | 输入源模式值 (0=USB, 1=OPT, 2=COAX) 3-62 | 60 | 0x00 | 保留字节 ``` +**设备端处理(c3_fps 双 tile)**: +- tile0(HID)收到 0xB0 后设置 g_sync_t0_to_t1_cmd=0x04、g_sync_t0_to_t1_data=输入源 +- tile1 的 app_control_slave 收到 sync 后调用 process_uart_set_input_source,构建 UART 0x5D 包透传 MCU -**设备端处理**: -- XMOS设备接收到HID 0xB0命令后,将其转换为UART 0x5D命令格式 -- 通过UART接口将完整的0x5D数据包透传给MCU -- MCU负责处理输入源切换(USB/OPT/COAX) -- 本命令不返回HID响应 - -**透传机制**: -- HID 0xB0命令 → XMOS设备转换为UART 0x5D命令 → 透传给MCU -- UART 0x5D数据包格式:0x55 0xAA 0x00 0x5D [长度] [输入源模式值] [校验和] -- MCU根据输入源模式值执行相应的输入切换操作 - -### 2.31 0xB1 - SET_MUTE_SWITCH (设置静音开关) -**功能**: 设置静音开关(0=关,1=开),通过UART 0x5E命令透传给MCU处理 -**方向**: 主机→设备(XMOS)→MCU +### 2.33 0xB1 - SET_MUTE_SWITCH (设置静音开关) +**功能**: 设置静音开关(0=关,1=开) +**方向**: 主机→设备 **数据包格式**: ``` 字节位置 | 长度 | 内容 | 描述 ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0xB1 | 命令码 -2 | 1 | uint8 | 静音开关值 (0=关,1=开) +2 | 1 | uint8 | 静音开关值 (0=关, 1=开) 3-62 | 60 | 0x00 | 保留字节 ``` +**设备端处理(c3_fps 双 tile)**: +- tile0 收到 0xB1 后设置 sync 0x05 及数据,tile1 调用 process_uart_set_mute_switch,发 UART 0x5E 透传 MCU -**设备端处理**: -- XMOS设备接收到HID 0xB1命令后,将其转换为UART 0x5E命令格式并透传给MCU -- MCU负责处理静音开关状态 -- 本命令不返回HID响应 +### 2.34 0xB2 - GET_MUTE_SWITCH (获取静音开关状态) +**功能**: 读取静音开关状态(0=关,1=开),设备向 MCU 请求后返回 +**方向**: 主机→设备 +**请求**: 同步头 0x77 + 0xB2 + 保留字节 +**响应**: 0x01 0x77 0xB2 + 1 字节静音值 (0=关, 1=开) +**设备端处理(c3_fps 双 tile)**: +- tile0 收到 0xB2 后置 is_get_mute_switch_request,并设置 sync 0x06,tile1 调用 process_uart_send_get_mute_request 向 MCU 发 UART 0x5F +- MCU 返回 0x5F+1 字节后,tile1 的 user_uart 调用 sync_to_tile0(0x0E, mute_value, 0);tile0 的 audiohw 收到 0x0E 后设置 g_mute_switch +- 主机执行 HID 读时,process_read_params 直接读 g_mute_switch 返回。建议发送 0xB2 后延时约 50ms 再执行 HID 读 -### 2.32 0xB2 - GET_MUTE_SWITCH (获取静音开关状态) -**功能**: 读取静音开关状态(0=关,1=开);设备通过串口向MCU发送0x5F请求,MCU返回状态后设备再通过HID响应返回给主机 -**方向**: 主机→设备→MCU→设备→主机 -**请求数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x77 | 同步头1 -1 | 1 | 0xB2 | 命令码 -2-62 | 61 | 0x00 | 保留字节 -``` +**状态变化上报**: 当静音开关状态发生变化(如 MCU 通过 0x5F 返回、tile1 经 sync 0x0E 回传)时,设备会主动通过 HID 上报,数据格式与上述响应一致(0x77 0xB2 + 1 字节静音值),与音量变化上报(0x94)方式相同。 -**设备端处理**: -- 主机发送0xB2后,XMOS向MCU发送UART 0x5F(GET请求) -- MCU返回UART 0x5F响应(含静音开关值) -- 主机随后通过HID读报告获取响应 - -**响应数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x01 | Report ID -1 | 1 | 0x77 | 同步头1 -2 | 1 | 0xB2 | 同步头2 -3 | 1 | uint8 | 静音开关状态 (0=关,1=开) -4-62 | 59 | 0x00 | 保留字节 -``` - -**说明**: 主机发送0xB2后建议稍作延时(如50ms)再执行HID读,以确保MCU已返回数据。 - -**状态变化上报**: 当静音开关状态发生变化(如 MCU 通过 0x5F 返回新值)时,设备会主动通过 HID 上报,数据格式与上述响应一致(0x77 0xB2 + 1 字节静音值),与音量变化上报(0x94)方式相同,主机可通过 HID 读或中断 IN 获取。 - -### 2.33 0xB3 - SET_LISTEN_SWITCH (设置监听开关) -**功能**: 设置监听开关(0=关,1=开),通过UART 0x60命令透传给MCU处理 -**方向**: 主机→设备(XMOS)→MCU +### 2.35 0xB3 - SET_LISTEN_SWITCH (设置监听开关) +**功能**: 设置监听开关(0=关,1=开) +**方向**: 主机→设备 **数据包格式**: ``` 字节位置 | 长度 | 内容 | 描述 ---------|------|------|------ 0 | 1 | 0x77 | 同步头1 1 | 1 | 0xB3 | 命令码 -2 | 1 | uint8 | 监听开关值 (0=关,1=开) +2 | 1 | uint8 | 监听开关值 (0=关, 1=开) 3-62 | 60 | 0x00 | 保留字节 ``` +**设备端处理(c3_fps 双 tile)**: +- tile0 收到 0xB3 后设置 sync 0x07 及数据,tile1 调用 process_uart_set_listen_switch,发 UART 0x60 透传 MCU(对应 g_adc_loop 语义) -**设备端处理**: -- XMOS设备接收到HID 0xB3命令后,将其转换为UART 0x60命令格式并透传给MCU -- MCU负责处理监听开关(对应 g_adc_loop 语义) -- 本命令不返回HID响应 - -### 2.34 0xB4 - GET_LISTEN_SWITCH (获取监听开关状态) -**功能**: 读取监听开关状态(0=关,1=开),设备直接返回 g_adc_loop 的值,不经过串口 +### 2.36 0xB4 - GET_LISTEN_SWITCH (获取监听开关状态) +**功能**: 读取监听开关状态(0=关,1=开),直接返回 g_adc_loop 的值,不经过串口 **方向**: 主机→设备 -**请求数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x77 | 同步头1 -1 | 1 | 0xB4 | 命令码 -2-62 | 61 | 0x00 | 保留字节 -``` +**请求**: 同步头 0x77 + 0xB4 + 保留字节 +**响应**: 0x01 0x77 0xB4 + 1 字节监听开关状态 (0=关, 1=开) +**设备端处理(c3_fps 双 tile)**: +- tile0 收到 0xB4 后置 is_get_listen_switch_request;HID 读时 process_read_params 直接读取 tile0 的 g_adc_loop(由 tile1 经 sync 0x0D 同步)填入响应字节 3 -**响应数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x01 | Report ID -1 | 1 | 0x77 | 同步头1 -2 | 1 | 0xB4 | 同步头2 -3 | 1 | uint8 | 监听开关状态 (0=关,1=开),即 g_adc_loop 的值 -4-62 | 59 | 0x00 | 保留字节 -``` - -**设备端处理**: -- 设备直接读取 g_adc_loop,填入响应字节 3,无需向 MCU 请求 - -**状态变化上报**: 当监听开关状态(g_adc_loop)发生变化时,设备会主动通过 HID 上报,数据格式与上述响应一致(0x77 0xB4 + 1 字节监听状态),与音量变化上报(0x94)方式相同,主机可通过 HID 读或中断 IN 获取。 - -### 2.35 0xB6 - SET_TILE1_DIV (设置tile1动态降频分频值) -**功能**: 设置 tile[1] 动态降频(动态降频)的低功耗分频值 N。tile[1] core clock = 600 MHz / N。 -**方向**: 主机→设备 -**数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x77 | 同步头1 -1 | 1 | 0xB6 | 命令码 -2 | 1 | uint8 | 分频值 N (1-255,0视为1;N=1为全速600MHz,N=40约15MHz) -3-62 | 60 | 0x00 | 保留字节 -``` - -**设备端处理**: -- 仅在 FPS 镜像(编译宏 `C1_DFS_EN=1`,默认等于 `XMOS_FPS_EN`)生效;其它镜像(如 factory)忽略此命令。 -- 写入全局 `g_tile1_lp_div`。tile[1] 电源状态机下次进入 CLOCKED_DOWN(FPS 关闭或音频流停止、grace 超时后)时按此分频值降频;若当前已处于 CLOCKED_DOWN,则下次状态机 tick 立即按新值重写分频寄存器。 -- 全速运行(FPS 开启且音频流活跃)时不影响 tile[1] 实时时钟,仅更新待用分频值。 - -**返回值**: -无直接返回值。如需确认,请使用 GET_TILE1_DIV (0xB7) 读取当前分频值。 - -### 2.36 0xB7 - GET_TILE1_DIV (获取tile1动态降频分频值) -**功能**: 读取 tile[1] 动态降频当前的低功耗分频值 N。 -**方向**: 主机→设备 -**请求数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x77 | 同步头1 -1 | 1 | 0xB7 | 命令码 -2-62 | 61 | 0x00 | 保留字节 -``` - -**响应数据包格式**: -``` -字节位置 | 长度 | 内容 | 描述 ----------|------|------|------ -0 | 1 | 0x01 | Report ID -1 | 1 | 0x77 | 同步头1 -2 | 1 | 0xB7 | 同步头2 -3 | 1 | uint8 | 当前分频值 N (1-255) -4-62 | 59 | 0x00 | 保留字节 -``` - -**设备端处理**: -- 仅在 FPS 镜像(`C1_DFS_EN=1`)生效,返回 `g_tile1_lp_div`。 -- 注意:返回的 N 为"待用/当前低功耗分频值",并非实时核心频率读数;tile[1] 是否实际处于降频状态取决于 FPS 开关与音频流状态(FPS 关闭或音频停止后才会真正降频)。 +**状态变化上报**: 当监听开关状态(g_adc_loop)发生变化时,设备会主动通过 HID 上报,数据格式与上述响应一致(0x77 0xB4 + 1 字节监听状态),与音量变化上报(0x94)方式相同。 ## 5. 关键特性 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h index 0e0e90b..489ec47 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/eq_params_44100.h @@ -1,5 +1,6 @@ // EQ参数头文件 - 44100Hz // 自动生成,请勿手动修改 +// 改动原因:修复块错位与格式问题,按模式顺序重排 #include "eq.h" @@ -672,7 +673,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 63.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 2.00f, + .gain = -4.00f, }, { .index = 1, @@ -680,7 +681,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 125.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 4.00f, + .gain = -3.00f, }, { .index = 2, @@ -688,7 +689,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 250.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 4.00f, + .gain = -2.00f, }, { .index = 3, @@ -696,7 +697,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 500.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 1.00f, + .gain = 2.00f, }, { .index = 4, @@ -704,7 +705,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 1000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -1.00f, + .gain = 3.00f, }, { .index = 5, @@ -712,7 +713,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 4000.00f, .q = 0.7100f, .bw = 1.00f, - .gain = 2.00f, + .gain = 1.00f, }, { .index = 6, @@ -720,7 +721,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 8000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 2.00f, + .gain = -3.00f, }, { .index = 7, @@ -728,18 +729,18 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 16000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 2.00f, + .gain = -2.00f, }, }, .filter = { .biquad_count = MAX_EQ_BANDS, .state = {{0}}, .coef = { - {0x40193bef, 0x40706fc7, 0x40de3b22, 0x405a90d5, 0x3f54ecd5, 0x449012f8, 0x464040bd, 0x459182a8}, - {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, - {0x3f23da02, 0x3e0f182b, 0x3c29ddbf, 0x39d8f962, 0x3460d7e0, 0x18317347, 0x097705ac, 0x0f6b8432}, - {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, - {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + {0x3fc73213, 0x3fb113fc, 0x3f9e3547, 0x40c02ea5, 0x42487f62, 0x4226744a, 0x3761b4a8, 0x3ae09727}, + {-0x7ecad859, -0x7dde6daa, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1cd17be8, 0x32e4d9ca}, + {0x3f04f506, 0x3e32760b, 0x3caad74a, 0x39735b92, 0x32a5d521, 0x1a9b11f4, 0x0d997ea7, 0x134ef560}, + {0x7ecad859, 0x7dde6daa, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1cd17be8, -0x32e4d9ca}, + {-0x3ecc2719, -0x3de38a07, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x04fb334f, -0x0e2f8c87}, }, } }, @@ -754,7 +755,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 63.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 2.00f, + .gain = -4.00f, }, { .index = 1, @@ -762,7 +763,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 125.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 4.00f, + .gain = -3.00f, }, { .index = 2, @@ -770,7 +771,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 250.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 4.00f, + .gain = -2.00f, }, { .index = 3, @@ -778,7 +779,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 500.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 1.00f, + .gain = 2.00f, }, { .index = 4, @@ -786,7 +787,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 1000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -1.00f, + .gain = 3.00f, }, { .index = 5, @@ -794,7 +795,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 4000.00f, .q = 0.7100f, .bw = 1.00f, - .gain = 2.00f, + .gain = 1.00f, }, { .index = 6, @@ -802,7 +803,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 8000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 2.00f, + .gain = -3.00f, }, { .index = 7, @@ -810,18 +811,18 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 16000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 2.00f, + .gain = -2.00f, }, }, .filter = { .biquad_count = MAX_EQ_BANDS, .state = {{0}}, .coef = { - {0x40193bef, 0x40706fc7, 0x40de3b22, 0x405a90d5, 0x3f54ecd5, 0x449012f8, 0x464040bd, 0x459182a8}, - {-0x7f3bc607, -0x7e7a6540, -0x7cf3cb7a, -0x79e431a7, -0x7289a001, -0x4e189e14, -0x214d8c10, 0x37527133}, - {0x3f23da02, 0x3e0f182b, 0x3c29ddbf, 0x39d8f962, 0x3460d7e0, 0x18317347, 0x097705ac, 0x0f6b8432}, - {0x7f3bc607, 0x7e7a6540, 0x7cf3cb7a, 0x79e431a7, 0x7289a001, 0x4e189e14, 0x214d8c10, -0x37527133}, - {-0x3f3d15f2, -0x3e7f87f2, -0x3d0818e1, -0x3a338a38, -0x33b5c4b5, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + {0x3fc73213, 0x3fb113fc, 0x3f9e3547, 0x40c02ea5, 0x42487f62, 0x4226744a, 0x3761b4a8, 0x3ae09727}, + {-0x7ecad859, -0x7dde6daa, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1cd17be8, 0x32e4d9ca}, + {0x3f04f506, 0x3e32760b, 0x3caad74a, 0x39735b92, 0x32a5d521, 0x1a9b11f4, 0x0d997ea7, 0x134ef560}, + {0x7ecad859, 0x7dde6daa, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1cd17be8, -0x32e4d9ca}, + {-0x3ecc2719, -0x3de38a07, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x04fb334f, -0x0e2f8c87}, }, } }, @@ -1000,7 +1001,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 63.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -3.00f, }, { .index = 1, @@ -1008,7 +1009,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 125.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -3.00f, }, { .index = 2, @@ -1016,7 +1017,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 250.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -1.00f, + .gain = -2.00f, }, { .index = 3, @@ -1024,7 +1025,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 500.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -3.00f, + .gain = 2.00f, }, { .index = 4, @@ -1032,7 +1033,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 1000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -3.00f, + .gain = 2.00f, }, { .index = 5, @@ -1040,7 +1041,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 4000.00f, .q = 0.7100f, .bw = 1.00f, - .gain = 3.00f, + .gain = -2.00f, }, { .index = 6, @@ -1048,7 +1049,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 8000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -3.00f, }, { .index = 7, @@ -1056,18 +1057,18 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 16000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -4.00f, }, }, .filter = { .biquad_count = MAX_EQ_BANDS, .state = {{0}}, .coef = { - {0x40283469, 0x404f4dce, 0x3fd1c50d, 0x3ed36b73, 0x3dcba2d2, 0x47450e12, 0x49f5a1ad, 0x48df384d}, - {-0x7f3bc607, -0x7e7a6540, -0x7c998928, -0x77a7b914, -0x6fc2592c, -0x4e189e14, -0x214d8c10, 0x37527133}, - {0x3f14e189, 0x3e303a23, 0x3cdc02d8, 0x39223189, 0x331b932b, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, - {0x7f3bc607, 0x7e7a6540, 0x7c998928, 0x77a7b914, 0x6fc2592c, 0x4e189e14, 0x214d8c10, -0x37527133}, - {-0x3f3d15f2, -0x3e7f87f2, -0x3cadc7e6, -0x37f59cfd, -0x30e735fd, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, + {0x3fd7e4c8, 0x3fb113fc, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3bbda8fe, 0x3761b4a8, 0x357cce9e}, + {-0x7eec0a91, -0x7dde6daa, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x48e620a5, -0x1cd17be8, 0x2e3c2813}, + {0x3f1574e0, 0x3e32760b, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1ad79f31, 0x0d997ea7, 0x118a77ac}, + {0x7eec0a91, 0x7dde6daa, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x48e620a5, 0x1cd17be8, -0x2e3c2813}, + {-0x3eed59a9, -0x3de38a07, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1695482f, -0x04fb334f, -0x0707464b}, }, } }, @@ -1082,7 +1083,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 63.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -3.00f, }, { .index = 1, @@ -1090,8 +1091,254 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 125.00f, .q = 0.7500f, .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fb113fc, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3bbda8fe, 0x3761b4a8, 0x357cce9e}, + {-0x7eec0a91, -0x7dde6daa, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x48e620a5, -0x1cd17be8, 0x2e3c2813}, + {0x3f1574e0, 0x3e32760b, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1ad79f31, 0x0d997ea7, 0x118a77ac}, + {0x7eec0a91, 0x7dde6daa, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x48e620a5, 0x1cd17be8, -0x2e3c2813}, + {-0x3eed59a9, -0x3de38a07, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1695482f, -0x04fb334f, -0x0707464b}, + }, + } + }, + [7][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, .gain = 3.00f, }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fc73213, 0x3fb113fc, 0x3f9e3547, 0x405a90d5, 0x42487f62, 0x3deb7030, 0x3a4e238c, 0x357cce9e}, + {-0x7ecad859, -0x7dde6daa, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1e56eff0, 0x2e3c2813}, + {0x3f04f506, 0x3e32760b, 0x3caad74a, 0x39d8f962, 0x32a5d521, 0x1bd23cf6, 0x0e5147e9, 0x118a77ac}, + {0x7ecad859, 0x7dde6daa, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1e56eff0, -0x2e3c2813}, + {-0x3ecc2719, -0x3de38a07, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x089f6b75, -0x0707464b}, + }, + } + }, + [7][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fc73213, 0x3fb113fc, 0x3f9e3547, 0x405a90d5, 0x42487f62, 0x3deb7030, 0x3a4e238c, 0x357cce9e}, + {-0x7ecad859, -0x7dde6daa, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1e56eff0, 0x2e3c2813}, + {0x3f04f506, 0x3e32760b, 0x3caad74a, 0x39d8f962, 0x32a5d521, 0x1bd23cf6, 0x0e5147e9, 0x118a77ac}, + {0x7ecad859, 0x7dde6daa, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1e56eff0, -0x2e3c2813}, + {-0x3ecc2719, -0x3de38a07, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x089f6b75, -0x0707464b}, + }, + } + }, + [8][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, { .index = 2, .type = FILTER_TYPE_PEAKING, @@ -1106,7 +1353,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 500.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -3.00f, + .gain = 2.00f, }, { .index = 4, @@ -1114,7 +1361,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 1000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -3.00f, + .gain = 3.00f, }, { .index = 5, @@ -1122,7 +1369,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 4000.00f, .q = 0.7100f, .bw = 1.00f, - .gain = 3.00f, + .gain = 0.00f, }, { .index = 6, @@ -1130,7 +1377,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 8000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -2.00f, }, { .index = 7, @@ -1138,377 +1385,787 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { .fc = 16000.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 3.00f, + .gain = -2.00f, }, }, .filter = { .biquad_count = MAX_EQ_BANDS, .state = {{0}}, .coef = { - {0x40283469, 0x404f4dce, 0x3fd1c50d, 0x3ed36b73, 0x3dcba2d2, 0x47450e12, 0x49f5a1ad, 0x48df384d}, - {-0x7f3bc607, -0x7e7a6540, -0x7c998928, -0x77a7b914, -0x6fc2592c, -0x4e189e14, -0x214d8c10, 0x37527133}, - {0x3f14e189, 0x3e303a23, 0x3cdc02d8, 0x39223189, 0x331b932b, 0x157c782d, 0x05c1a4bd, 0x0c1dce8d}, - {0x7f3bc607, 0x7e7a6540, 0x7c998928, 0x77a7b914, 0x6fc2592c, 0x4e189e14, 0x214d8c10, -0x37527133}, - {-0x3f3d15f2, -0x3e7f87f2, -0x3cadc7e6, -0x37f59cfd, -0x30e735fd, -0x1cc1863f, -0x0fb7466a, -0x14fd06da}, - }, - } - }, - [7][0] = { - .sample_rate = 44100, - .total_bshift = 0, - .post_gain_db = 0, // 0 dB - .bands = { - { - .index = 0, - .type = FILTER_TYPE_BYPASS, - .fc = 85.00f, - .q = 0.7500f, - .bw = 1.00f, - .gain = -4.00f, - }, - { - .index = 1, - .type = FILTER_TYPE_BYPASS, - .fc = 80.00f, - .q = 0.7500f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 2, - .type = FILTER_TYPE_BYPASS, - .fc = 2000.00f, - .q = 0.5000f, - .bw = 1.00f, - .gain = 1.50f, - }, - { - .index = 3, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 4, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 5, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 6, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 7, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - }, - .filter = { - .biquad_count = MAX_EQ_BANDS, - .state = {{0}}, - .coef = { - {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - }, - } - }, - [7][1] = { - .sample_rate = 44100, - .total_bshift = 0, - .post_gain_db = 0, // 0 dB - .bands = { - { - .index = 0, - .type = FILTER_TYPE_BYPASS, - .fc = 85.00f, - .q = 0.7500f, - .bw = 1.00f, - .gain = -4.00f, - }, - { - .index = 1, - .type = FILTER_TYPE_BYPASS, - .fc = 80.00f, - .q = 0.7500f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 2, - .type = FILTER_TYPE_BYPASS, - .fc = 2000.00f, - .q = 0.5000f, - .bw = 1.00f, - .gain = 1.50f, - }, - { - .index = 3, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 4, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 5, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 6, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 7, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - }, - .filter = { - .biquad_count = MAX_EQ_BANDS, - .state = {{0}}, - .coef = { - {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - }, - } - }, - [8][0] = { - .sample_rate = 44100, - .total_bshift = 0, - .post_gain_db = 0, // 0 dB - .bands = { - { - .index = 0, - .type = FILTER_TYPE_BYPASS, - .fc = 130.00f, - .q = 0.7500f, - .bw = 1.00f, - .gain = -4.00f, - }, - { - .index = 1, - .type = FILTER_TYPE_BYPASS, - .fc = 80.00f, - .q = 0.7500f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 2, - .type = FILTER_TYPE_BYPASS, - .fc = 2000.00f, - .q = 0.5000f, - .bw = 1.00f, - .gain = 1.50f, - }, - { - .index = 3, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 4, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 5, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 6, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - { - .index = 7, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, - .bw = 1.00f, - .gain = 0.00f, - }, - }, - .filter = { - .biquad_count = MAX_EQ_BANDS, - .state = {{0}}, - .coef = { - {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x3ff41df7, 0x3fe893cf, 0x3fd1c50d, 0x40c02ea5, 0x42487f62, 0x3fffffff, 0x3a4e238c, 0x3ae09727}, + {-0x7f242665, -0x7e4c1b74, -0x7c998928, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x32e4d9ca}, + {0x3f31581a, 0x3e68a876, 0x3cdc02d8, 0x39735b92, 0x32a5d521, 0x1cc1863f, 0x0e5147e9, 0x134ef560}, + {0x7f242665, 0x7e4c1b74, 0x7c998928, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x32e4d9ca}, + {-0x3f257611, -0x3e513c45, -0x3cadc7e6, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0e2f8c87}, }, } }, [8][1] = { .sample_rate = 44100, .total_bshift = 0, - .post_gain_db = 0, // 0 dB + .post_gain_db = -4, // -4 dB .bands = { { .index = 0, - .type = FILTER_TYPE_BYPASS, - .fc = 130.00f, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, .q = 0.7500f, .bw = 1.00f, - .gain = -4.00f, + .gain = -1.00f, }, { .index = 1, - .type = FILTER_TYPE_BYPASS, - .fc = 80.00f, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, .q = 0.7500f, .bw = 1.00f, - .gain = 0.00f, + .gain = -1.00f, }, { .index = 2, - .type = FILTER_TYPE_BYPASS, - .fc = 2000.00f, - .q = 0.5000f, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, .bw = 1.00f, - .gain = 1.50f, + .gain = -1.00f, }, { .index = 3, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, .bw = 1.00f, - .gain = 0.00f, + .gain = 2.00f, }, { .index = 4, - .type = FILTER_TYPE_BYPASS, + .type = FILTER_TYPE_PEAKING, .fc = 1000.00f, - .q = 0.7100f, + .q = 0.7500f, .bw = 1.00f, - .gain = 0.00f, + .gain = 3.00f, }, { .index = 5, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, .q = 0.7100f, .bw = 1.00f, .gain = 0.00f, }, { .index = 6, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, .bw = 1.00f, - .gain = 0.00f, + .gain = -2.00f, }, { .index = 7, - .type = FILTER_TYPE_BYPASS, - .fc = 1000.00f, - .q = 0.7100f, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, .bw = 1.00f, - .gain = 0.00f, + .gain = -2.00f, }, }, .filter = { .biquad_count = MAX_EQ_BANDS, .state = {{0}}, .coef = { - {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, - {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x3ff41df7, 0x3fe893cf, 0x3fd1c50d, 0x40c02ea5, 0x42487f62, 0x3fffffff, 0x3a4e238c, 0x3ae09727}, + {-0x7f242665, -0x7e4c1b74, -0x7c998928, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x32e4d9ca}, + {0x3f31581a, 0x3e68a876, 0x3cdc02d8, 0x39735b92, 0x32a5d521, 0x1cc1863f, 0x0e5147e9, 0x134ef560}, + {0x7f242665, 0x7e4c1b74, 0x7c998928, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x32e4d9ca}, + {-0x3f257611, -0x3e513c45, -0x3cadc7e6, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0e2f8c87}, }, } }, [9][0] = { .sample_rate = 44100, .total_bshift = 0, - .post_gain_db = 0, // 0 dB + .post_gain_db = -4, // -4 dB .bands = { { .index = 0, - .type = FILTER_TYPE_BYPASS, - .fc = 130.00f, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -5.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, .q = 0.7500f, .bw = 1.00f, .gain = -4.00f, }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fb48029, 0x3f905467, 0x3f64bdba, 0x40c02ea5, 0x42487f62, 0x3deb7030, 0x346e8b15, 0x38354b6d}, + {-0x7ea5add7, -0x7d9db5dd, -0x7bc4aba6, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1b488775, 0x30963485}, + {0x3ef27c0b, 0x3e127b31, 0x3c740a12, 0x39735b92, 0x32a5d521, 0x1bd23cf6, 0x0ce00e5f, 0x126ee045}, + {0x7ea5add7, 0x7d9db5dd, 0x7bc4aba6, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1b488775, -0x30963485}, + {-0x3ea6fc35, -0x3da2cf99, -0x3bd8c7cd, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x014e9974, -0x0aa42bb2}, + }, + } + }, + [9][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -5.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 3.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fb48029, 0x3f905467, 0x3f64bdba, 0x40c02ea5, 0x42487f62, 0x3deb7030, 0x346e8b15, 0x38354b6d}, + {-0x7ea5add7, -0x7d9db5dd, -0x7bc4aba6, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1b488775, 0x30963485}, + {0x3ef27c0b, 0x3e127b31, 0x3c740a12, 0x39735b92, 0x32a5d521, 0x1bd23cf6, 0x0ce00e5f, 0x126ee045}, + {0x7ea5add7, 0x7d9db5dd, 0x7bc4aba6, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1b488775, -0x30963485}, + {-0x3ea6fc35, -0x3da2cf99, -0x3bd8c7cd, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x014e9974, -0x0aa42bb2}, + }, + } + }, + [10][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fe6cdff, 0x3fce6059, 0x3fd1c50d, 0x405a90d5, 0x416edac4, 0x3fffffff, 0x3d2f1092, 0x3ae09727}, + {-0x7f09af46, -0x7e185409, -0x7c998928, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1fd66711, 0x32e4d9ca}, + {0x3f2430ad, 0x3e4f1267, 0x3cdc02d8, 0x39d8f962, 0x337f79bf, 0x1cc1863f, 0x0f063dc7, 0x134ef560}, + {0x7f09af46, 0x7e185409, 0x7c998928, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1fd66711, -0x32e4d9ca}, + {-0x3f0afeac, -0x3e1d72c0, -0x3cadc7e6, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x0c354e59, -0x0e2f8c87}, + }, + } + }, + [10][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fe6cdff, 0x3fce6059, 0x3fd1c50d, 0x405a90d5, 0x416edac4, 0x3fffffff, 0x3d2f1092, 0x3ae09727}, + {-0x7f09af46, -0x7e185409, -0x7c998928, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1fd66711, 0x32e4d9ca}, + {0x3f2430ad, 0x3e4f1267, 0x3cdc02d8, 0x39d8f962, 0x337f79bf, 0x1cc1863f, 0x0f063dc7, 0x134ef560}, + {0x7f09af46, 0x7e185409, 0x7c998928, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1fd66711, -0x32e4d9ca}, + {-0x3f0afeac, -0x3e1d72c0, -0x3cadc7e6, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x0c354e59, -0x0e2f8c87}, + }, + } + }, + [11][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3deb7030, 0x3761b4a8, 0x357cce9e}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1cd17be8, 0x2e3c2813}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1bd23cf6, 0x0d997ea7, 0x118a77ac}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1cd17be8, -0x2e3c2813}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x04fb334f, -0x0707464b}, + }, + } + }, + [11][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = -1.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -4.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fd7e4c8, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x416edac4, 0x3deb7030, 0x3761b4a8, 0x357cce9e}, + {-0x7eec0a91, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4b8ec1f7, -0x1cd17be8, 0x2e3c2813}, + {0x3f1574e0, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x337f79bf, 0x1bd23cf6, 0x0d997ea7, 0x118a77ac}, + {0x7eec0a91, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4b8ec1f7, 0x1cd17be8, -0x2e3c2813}, + {-0x3eed59a9, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x19bdad27, -0x04fb334f, -0x0707464b}, + }, + } + }, + [12][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fe6cdff, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x40ace148, 0x3fffffff, 0x3a4e238c, 0x38354b6d}, + {-0x7f09af46, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x30963485}, + {0x3f2430ad, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x3441733b, 0x1cc1863f, 0x0e5147e9, 0x126ee045}, + {0x7f09af46, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x30963485}, + {-0x3f0afeac, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0aa42bb2}, + }, + } + }, + [12][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = -4, // -4 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_PEAKING, + .fc = 63.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_PEAKING, + .fc = 125.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_PEAKING, + .fc = 250.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_PEAKING, + .fc = 500.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 2.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_PEAKING, + .fc = 1000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = 1.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_PEAKING, + .fc = 4000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_PEAKING, + .fc = 8000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -2.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_PEAKING, + .fc = 16000.00f, + .q = 0.7500f, + .bw = 1.00f, + .gain = -3.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x3fe6cdff, 0x3fce6059, 0x3f9e3547, 0x40c02ea5, 0x40ace148, 0x3fffffff, 0x3a4e238c, 0x38354b6d}, + {-0x7f09af46, -0x7e185409, -0x7c34de30, -0x79e431a7, -0x73bf050c, -0x4e189e14, -0x1e56eff0, 0x30963485}, + {0x3f2430ad, 0x3e4f1267, 0x3caad74a, 0x39735b92, 0x3441733b, 0x1cc1863f, 0x0e5147e9, 0x126ee045}, + {0x7f09af46, 0x7e185409, 0x7c34de30, 0x79e431a7, 0x73bf050c, 0x4e189e14, 0x1e56eff0, -0x30963485}, + {-0x3f0afeac, -0x3e1d72c0, -0x3c490c92, -0x3a338a38, -0x34ee5483, -0x1cc1863f, -0x089f6b75, -0x0aa42bb2}, + }, + } + }, + [13][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, { .index = 1, .type = FILTER_TYPE_BYPASS, - .fc = 80.00f, - .q = 0.7500f, + .fc = 1000.00f, + .q = 0.7100f, .bw = 1.00f, .gain = 0.00f, }, { .index = 2, .type = FILTER_TYPE_BYPASS, - .fc = 2000.00f, - .q = 0.5000f, + .fc = 1000.00f, + .q = 0.7100f, .bw = 1.00f, - .gain = 1.50f, + .gain = 0.00f, }, { .index = 3, @@ -1563,7 +2220,7 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { }, } }, - [9][1] = { + [13][1] = { .sample_rate = 44100, .total_bshift = 0, .post_gain_db = 0, // 0 dB @@ -1571,26 +2228,190 @@ eq_mode_data_t sEQ_data_44100HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = { { .index = 0, .type = FILTER_TYPE_BYPASS, - .fc = 130.00f, - .q = 0.7500f, + .fc = 1000.00f, + .q = 0.7100f, .bw = 1.00f, - .gain = -4.00f, + .gain = 0.00f, }, { .index = 1, .type = FILTER_TYPE_BYPASS, - .fc = 80.00f, - .q = 0.7500f, + .fc = 1000.00f, + .q = 0.7100f, .bw = 1.00f, .gain = 0.00f, }, { .index = 2, .type = FILTER_TYPE_BYPASS, - .fc = 2000.00f, - .q = 0.5000f, + .fc = 1000.00f, + .q = 0.7100f, .bw = 1.00f, - .gain = 1.50f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [14][0] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 3, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 4, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 5, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 6, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 7, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + }, + .filter = { + .biquad_count = MAX_EQ_BANDS, + .state = {{0}}, + .coef = { + {0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000, 0x40000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, + }, + } + }, + [14][1] = { + .sample_rate = 44100, + .total_bshift = 0, + .post_gain_db = 0, // 0 dB + .bands = { + { + .index = 0, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 1, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, + }, + { + .index = 2, + .type = FILTER_TYPE_BYPASS, + .fc = 1000.00f, + .q = 0.7100f, + .bw = 1.00f, + .gain = 0.00f, }, { .index = 3, diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_api.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_api.h new file mode 100644 index 0000000..13f83ec --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_api.h @@ -0,0 +1,47 @@ +#ifndef __FPS_API_H__ +#define __FPS_API_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 初始化 FPS 处理链及默认运行状态。 */ +void fps_xmos_xc_init(void); + +/* 选择游戏配置和档位。game: 0~2(0=cs2,1=pubg,2=delta),level: 0~4。 */ +void fps_xmos_xc_game_select(int game, int level); + +/* DRC 模式切换。mode: 0=low(柔和压缩),1=high(强力压缩)。 */ +void fps_xmos_xc_drc_set_mode(int mode); + +/* + * 设置运行时三个子模块的开关。 + * drc_enable: 0 表示旁路,非 0 表示开启 DRC + * fps_enable: 0 表示旁路 FPS 主处理,非 0 表示开启 + * eq_enable: 0 表示在 FPS 阶段旁路 EQ,非 0 表示开启 + */ +void fps_xmos_xc_set_module_enable(int drc_enable, int fps_enable, int eq_enable); + +/* 初始化运行,调节过程中不运行。 */ +/* 设置 10 段 EQ 的全部增益,单位为 0.01 dB,范围 -600 ~ 600。 */ +void fps_xmos_xc_eq_set_all_gains(int16_t *gains); + +/* 初始化不运行,调节过程中运行。 */ +/* 设置单个 EQ 频段增益,单位为 0.01 dB,范围 -600 ~ 600。 */ +void fps_xmos_xc_eq_set_band_gain(int band, int16_t gain); + +/* + * 处理一个双声道块。 + * input/output 数据格式为解交织的平面双声道: + * input[0..511] : 左声道 + * input[512..1023] : 右声道 + */ +void fps_xmos_xc_process(int16_t *input, int16_t *output); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.c new file mode 100644 index 0000000..d619f5a --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.c @@ -0,0 +1,173 @@ +/* 改动原因:FPS fps_eq 五模式增益在tile0侧LittleFS持久化 */ +#include +#include +#include "fps_eq_flash.h" +#include "lfs_io.h" +#include "debug_print.h" + +#define FPS_EQ_FLASH_PATH "fps_eq_store" +#define FPS_EQ_FLASH_VERSION 0x01u + +static void fps_eq_default_name(uint8_t mode, char out_name[FPS_EQ_NAME_LEN]) +{ + /* 改动原因:按协议约定提供小写默认模式名 fps_eq_0 ~ fps_eq_4 */ + snprintf(out_name, FPS_EQ_NAME_LEN, "fps_eq_%u", (unsigned)mode); +} + +/* 改动原因:仅判断“是否历史已存名称”,不做ASCII限制,兼容中文/多语言UTF-8 */ +static int fps_eq_name_has_saved_value(const char name[FPS_EQ_NAME_LEN]) +{ + int i; + int all_zero = 1; + int all_ff = 1; + int has_terminator = 0; + unsigned char first = (unsigned char)name[0]; + + for (i = 0; i < FPS_EQ_NAME_LEN; i++) { + unsigned char c = (unsigned char)name[i]; + if (c != 0x00) { + all_zero = 0; + } + if (c != 0xFF) { + all_ff = 0; + } + if (c == '\0') { + has_terminator = 1; + break; + } + } + + /* 旧数据或未初始化:全0或全0xFF,视为“未存名称” */ + if (all_zero || all_ff) { + return 0; + } + /* 改动原因:旧布局中常见 0x01 0x00...(增益=1)会误判为“有名称”,首字节为控制字节时视为未存 */ + if (first < 0x20) { + return 0; + } + /* 有数据但无\0终止,视为旧布局残留,回退默认名 */ + if (!has_terminator) { + return 0; + } + return 1; +} + +void fps_eq_flash_set_defaults(fps_eq_flash_store_t *store) +{ + int m, b; + + memset(store, 0, sizeof(*store)); + store->magic = FPS_EQ_FLASH_MAGIC; + store->version = FPS_EQ_FLASH_VERSION; + store->current_mode = 0; + for (m = 0; m < FPS_EQ_MODE_COUNT; m++) { + fps_eq_default_name((uint8_t)m, store->mode_names[m]); + for (b = 0; b < FPS_EQ_BAND_COUNT; b++) { + store->gains[m][b] = FPS_EQ_GAIN_DEFAULT; + } + } +} + +int16_t fps_eq_clamp_gain(int16_t gain) +{ + if (gain < FPS_EQ_GAIN_MIN) { + return FPS_EQ_GAIN_MIN; + } + if (gain > FPS_EQ_GAIN_MAX) { + return FPS_EQ_GAIN_MAX; + } + return gain; +} + +int fps_eq_flash_load(fps_eq_flash_store_t *out) +{ + fps_eq_flash_store_t tmp; + int m; + int need_repair = 0; + + fps_eq_flash_set_defaults(out); + + if (lfs_init() != 0) { + return -1; + } + + lfs_read_config((unsigned char *)FPS_EQ_FLASH_PATH, + (unsigned char *)&tmp, + sizeof(tmp)); + lfs_deinit(); + + if (tmp.magic != FPS_EQ_FLASH_MAGIC) { + debug_printf("fps_eq_flash: invalid magic, use defaults\n"); + return -1; + } + if (tmp.version != FPS_EQ_FLASH_VERSION) { + debug_printf("fps_eq_flash: version mismatch, reset defaults\n"); + return -1; + } + + if (tmp.current_mode >= FPS_EQ_MODE_COUNT) { + tmp.current_mode = 0; + need_repair = 1; + } + for (m = 0; m < FPS_EQ_MODE_COUNT; m++) { + tmp.mode_names[m][FPS_EQ_NAME_LEN - 1] = '\0'; + if (!fps_eq_name_has_saved_value(tmp.mode_names[m])) { + fps_eq_default_name((uint8_t)m, tmp.mode_names[m]); + need_repair = 1; + } + } + + *out = tmp; + /* 改动原因:检测到历史脏数据时自动修复并回写,后续读取稳定显示 */ + if (need_repair) { + (void)fps_eq_flash_save(out); + } + return 0; +} + +int fps_eq_flash_save(const fps_eq_flash_store_t *store) +{ + fps_eq_flash_store_t to_write = *store; + int m; + + to_write.magic = FPS_EQ_FLASH_MAGIC; + to_write.version = FPS_EQ_FLASH_VERSION; + if (to_write.current_mode >= FPS_EQ_MODE_COUNT) { + to_write.current_mode = 0; + } + for (m = 0; m < FPS_EQ_MODE_COUNT; m++) { + to_write.mode_names[m][FPS_EQ_NAME_LEN - 1] = '\0'; + if (to_write.mode_names[m][0] == '\0') { + fps_eq_default_name((uint8_t)m, to_write.mode_names[m]); + } + } + + if (lfs_init() != 0) { + return -1; + } + + lfs_write_config((unsigned char *)FPS_EQ_FLASH_PATH, + (unsigned char *)&to_write, + sizeof(to_write)); + lfs_deinit(); + return 0; +} + +void fps_eq_name_get(const fps_eq_flash_store_t *store, uint8_t mode, char out_name[FPS_EQ_NAME_LEN]) +{ + if (mode >= FPS_EQ_MODE_COUNT) { + mode = 0; + } + memcpy(out_name, store->mode_names[mode], FPS_EQ_NAME_LEN); + out_name[FPS_EQ_NAME_LEN - 1] = '\0'; +} + +void fps_eq_name_set(fps_eq_flash_store_t *store, uint8_t mode, const char *name) +{ + if (mode >= FPS_EQ_MODE_COUNT || name == NULL) { + return; + } + memset(store->mode_names[mode], 0, FPS_EQ_NAME_LEN); + strncpy(store->mode_names[mode], name, FPS_EQ_NAME_LEN - 1); + store->mode_names[mode][FPS_EQ_NAME_LEN - 1] = '\0'; +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.h new file mode 100644 index 0000000..9745d25 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_flash.h @@ -0,0 +1,32 @@ +#ifndef FPS_EQ_FLASH_H +#define FPS_EQ_FLASH_H + +#include + +/* 改动原因:FPS库fps_eq五套预设(模式0-4),每套10段增益,单位0.01dB,存于tile0 Flash */ +#define FPS_EQ_MODE_COUNT 5 +#define FPS_EQ_BAND_COUNT 10 +#define FPS_EQ_NAME_LEN 16 +#define FPS_EQ_GAIN_DEFAULT 1 +#define FPS_EQ_GAIN_MIN (-600) +#define FPS_EQ_GAIN_MAX 600 +#define FPS_EQ_FLASH_MAGIC 0x46505345u /* "FPSE" */ + +typedef struct { + uint32_t magic; + uint8_t version; + uint8_t current_mode; + uint8_t reserved[2]; + char mode_names[FPS_EQ_MODE_COUNT][FPS_EQ_NAME_LEN]; + int16_t gains[FPS_EQ_MODE_COUNT][FPS_EQ_BAND_COUNT]; +} fps_eq_flash_store_t; + +void fps_eq_flash_set_defaults(fps_eq_flash_store_t *store); +int fps_eq_flash_load(fps_eq_flash_store_t *out_data); +int fps_eq_flash_save(const fps_eq_flash_store_t *store); + +int16_t fps_eq_clamp_gain(int16_t gain); +void fps_eq_name_get(const fps_eq_flash_store_t *store, uint8_t mode, char out_name[FPS_EQ_NAME_LEN]); +void fps_eq_name_set(fps_eq_flash_store_t *store, uint8_t mode, const char *name); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_sync.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_sync.h new file mode 100644 index 0000000..75e4d5b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_eq_sync.h @@ -0,0 +1,22 @@ +#ifndef FPS_EQ_SYNC_H +#define FPS_EQ_SYNC_H + +#include +#include "fps_eq_flash.h" + +/* 改动原因:int16增益经5个int32共享字在tile0/tile1间传递(dp仅支持32位SHARED_GLOBAL) */ +extern unsigned g_fps_eq_mode; +extern int32_t g_fps_eq_pack0; +extern int32_t g_fps_eq_pack1; +extern int32_t g_fps_eq_pack2; +extern int32_t g_fps_eq_pack3; +extern int32_t g_fps_eq_pack4; + +void fps_eq_unpack_gains(int16_t out_gains[FPS_EQ_BAND_COUNT]); +void fps_eq_publish_gains_to_shared(const int16_t gains[FPS_EQ_BAND_COUNT]); +void fps_eq_publish_mode_and_gains(unsigned mode, const int16_t gains[FPS_EQ_BAND_COUNT]); + +void fps_apply_eq_mode(void); +void fps_apply_eq_band_gain(unsigned band, int16_t gain); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.c new file mode 100644 index 0000000..eb03acb --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.c @@ -0,0 +1,93 @@ +// Copyright 2024 XMOS LIMITED. +// 改动原因:tile0→tile1 FPS 同步命令排队,解决单槽 g_sync_t0_to_t1_cmd 被覆盖及跨 tile 全局无效问题 +#include +#include "xc_ptr.h" +#include "debug_print.h" +#include "fps_tile_sync.h" +#include "fps_eq_sync.h" +#include "user_uart.h" + +#define SYNC_T0_PENDING_MAX 12 + +extern unsigned g_sync_t0_to_t1_cmd; +extern unsigned g_sync_t0_to_t1_data; +extern unsigned g_sync_t0_to_t1_data2; + +static struct { + unsigned cmd; + unsigned data; + unsigned data2; +} s_sync_t0_pending[SYNC_T0_PENDING_MAX]; + +static unsigned s_sync_t0_pending_count = 0; + +void sync_t0_enqueue_to_tile1(unsigned cmd, unsigned data, unsigned data2) +{ + if (s_sync_t0_pending_count >= SYNC_T0_PENDING_MAX) { + debug_printf("sync_t0: pending full, drop cmd 0x%02X\n", cmd); + return; + } + s_sync_t0_pending[s_sync_t0_pending_count].cmd = cmd; + s_sync_t0_pending[s_sync_t0_pending_count].data = data; + s_sync_t0_pending[s_sync_t0_pending_count].data2 = data2; + s_sync_t0_pending_count++; +} + +void sync_t0_send_or_enqueue_to_tile1(unsigned cmd, unsigned data, unsigned data2) +{ + unsigned cur = 0; + + GET_SHARED_GLOBAL(cur, g_sync_t0_to_t1_cmd); + if (cur == 0) { + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, cmd); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, data); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data2, data2); + } else { + sync_t0_enqueue_to_tile1(cmd, data, data2); + } +} + +void sync_t0_promote_pending_to_tile1(void) +{ + unsigned cur = 0; + unsigned i; + + GET_SHARED_GLOBAL(cur, g_sync_t0_to_t1_cmd); + if (cur != 0 || s_sync_t0_pending_count == 0) { + return; + } + + SET_SHARED_GLOBAL(g_sync_t0_to_t1_cmd, s_sync_t0_pending[0].cmd); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data, s_sync_t0_pending[0].data); + SET_SHARED_GLOBAL(g_sync_t0_to_t1_data2, s_sync_t0_pending[0].data2); + + for (i = 1; i < s_sync_t0_pending_count; i++) { + s_sync_t0_pending[i - 1] = s_sync_t0_pending[i]; + } + s_sync_t0_pending_count--; +} + +void fps_eq_queue_pack_words_to_tile1(unsigned apply_on_last, unsigned enqueue_only) +{ + int32_t packs[5]; + unsigned i; + + GET_SHARED_GLOBAL(packs[0], g_fps_eq_pack0); + GET_SHARED_GLOBAL(packs[1], g_fps_eq_pack1); + GET_SHARED_GLOBAL(packs[2], g_fps_eq_pack2); + GET_SHARED_GLOBAL(packs[3], g_fps_eq_pack3); + GET_SHARED_GLOBAL(packs[4], g_fps_eq_pack4); + + for (i = 0; i < 5; i++) { + unsigned data1 = i; + unsigned apply_flag = (apply_on_last != 0 && i == 4) ? 1u : 0u; + + data1 |= (apply_flag << 8); + + if (enqueue_only) { + sync_t0_enqueue_to_tile1(SYNC_CMD_T0_TO_T1_SET_FPS_EQ_PACK, data1, (unsigned)packs[i]); + } else { + sync_t0_send_or_enqueue_to_tile1(SYNC_CMD_T0_TO_T1_SET_FPS_EQ_PACK, data1, (unsigned)packs[i]); + } + } +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.h new file mode 100644 index 0000000..1f9fb14 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_tile_sync.h @@ -0,0 +1,16 @@ +#ifndef FPS_TILE_SYNC_H +#define FPS_TILE_SYNC_H + +/* 改动原因:tile0/tile1 内存不共享,FPS 配置须经 channel 排队同步到 tile1 */ + +void sync_t0_enqueue_to_tile1(unsigned cmd, unsigned data, unsigned data2); +void sync_t0_send_or_enqueue_to_tile1(unsigned cmd, unsigned data, unsigned data2); +void sync_t0_promote_pending_to_tile1(void); + +/* 改动原因:将 tile0 上已发布的 g_fps_eq_pack0..4 经 sync 0x0B 传到 tile1;末包 apply=1 时调用 fps_apply_eq_mode */ +void fps_eq_queue_pack_words_to_tile1(unsigned apply_on_last, unsigned enqueue_only); + +/* 改动原因:C1 无 UART/MCU 串口,上电在 tile0 直接从 Flash 恢复 FPS 并排队 sync 到 tile1(原 c3_fps 由 uart_handler 经 c_uart_sync 触发) */ +void fps_boot_load_from_flash(void); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c index 93928ed..0f9d0c4 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c @@ -10,33 +10,119 @@ #include "xc_ptr.h" #include "xua_conf.h" - -extern void fps_xmos_init(); -extern void fps_xmos_process(int16_t * input, int16_t* output, int channel); +/* 改动原因:FPS库V1.5改为单核xc接口,使用fps_api.h中的fps_xmos_xc_*声明 */ +#include "fps_api.h" +#include "fps_eq_sync.h" #define FPS_SLOT_NUM 3 #define FPS_FRAME_SIZE 512 -#define FPS_NUM_OUT 2 -short __attribute__((aligned (4))) dsp_fps_input_buf[FPS_SLOT_NUM][2][FPS_FRAME_SIZE]; -short __attribute__((aligned (4))) dsp_fps_out_buf[FPS_SLOT_NUM][2][FPS_FRAME_SIZE]; +/* 改动原因:新库process接口为平面双声道,左0..511、右512..1023,每槽1024个sample */ +#define FPS_PLANAR_SAMPLES (FPS_FRAME_SIZE * 2) -unsigned fps1_buf_ready = 0; -unsigned fps2_buf_ready = 0; -unsigned fps_write_pos = 0; -unsigned fps_process_pos = 0; +short __attribute__((aligned (4))) dsp_fps_input_buf[FPS_SLOT_NUM][FPS_PLANAR_SAMPLES]; +short __attribute__((aligned (4))) dsp_fps_out_buf[FPS_SLOT_NUM][FPS_PLANAR_SAMPLES]; +unsigned fps_buf_ready = 0; +unsigned fps_write_pos = 0; +unsigned fps_process_pos = 0; +/* 改动原因:tile0/tile1 内存不共享;game/level/使能/fps_eq 须经 channel sync 写入 tile1 副本 */ +unsigned g_fps_game_select = 1; +unsigned g_fps_level_select = 2; +/* 改动原因:FPS 默认开、DRC/fps_eq 默认关;与 audiohw 中 g_fps_enable(模式选择) 区分命名 */ +unsigned g_fps_drc_enable = 0; +unsigned g_fps_sub_enable = 1; +unsigned g_fps_eq_enable = 0; +/* 改动原因:DRC压缩模式默认0=low柔和压缩,HID 0xBD/断电保存fps_drc_mode后经sync同步到tile1 */ +unsigned g_fps_drc_mode = 0; + +/* 改动原因:fps_eq当前模式(0-4)与10段增益,经5个pack字在tile0/tile1共享 */ +unsigned g_fps_eq_mode = 0; +int32_t g_fps_eq_pack0 = 0; +int32_t g_fps_eq_pack1 = 0; +int32_t g_fps_eq_pack2 = 0; +int32_t g_fps_eq_pack3 = 0; +int32_t g_fps_eq_pack4 = 0; + +static int32_t fps_eq_make_pack(int16_t lo, int16_t hi) +{ + return ((int32_t)(uint16_t)lo) | (((int32_t)(uint16_t)hi) << 16); +} + +static int16_t fps_eq_pack_lo(int32_t w) +{ + return (int16_t)(w & 0xFFFF); +} + +static int16_t fps_eq_pack_hi(int32_t w) +{ + return (int16_t)((w >> 16) & 0xFFFF); +} + +void fps_eq_unpack_gains(int16_t out_gains[FPS_EQ_BAND_COUNT]) +{ + int32_t p0, p1, p2, p3, p4; + + GET_SHARED_GLOBAL(p0, g_fps_eq_pack0); + GET_SHARED_GLOBAL(p1, g_fps_eq_pack1); + GET_SHARED_GLOBAL(p2, g_fps_eq_pack2); + GET_SHARED_GLOBAL(p3, g_fps_eq_pack3); + GET_SHARED_GLOBAL(p4, g_fps_eq_pack4); + + out_gains[0] = fps_eq_pack_lo(p0); + out_gains[1] = fps_eq_pack_hi(p0); + out_gains[2] = fps_eq_pack_lo(p1); + out_gains[3] = fps_eq_pack_hi(p1); + out_gains[4] = fps_eq_pack_lo(p2); + out_gains[5] = fps_eq_pack_hi(p2); + out_gains[6] = fps_eq_pack_lo(p3); + out_gains[7] = fps_eq_pack_hi(p3); + out_gains[8] = fps_eq_pack_lo(p4); + out_gains[9] = fps_eq_pack_hi(p4); +} + +void fps_eq_publish_gains_to_shared(const int16_t gains[FPS_EQ_BAND_COUNT]) +{ + SET_SHARED_GLOBAL(g_fps_eq_pack0, fps_eq_make_pack(gains[0], gains[1])); + SET_SHARED_GLOBAL(g_fps_eq_pack1, fps_eq_make_pack(gains[2], gains[3])); + SET_SHARED_GLOBAL(g_fps_eq_pack2, fps_eq_make_pack(gains[4], gains[5])); + SET_SHARED_GLOBAL(g_fps_eq_pack3, fps_eq_make_pack(gains[6], gains[7])); + SET_SHARED_GLOBAL(g_fps_eq_pack4, fps_eq_make_pack(gains[8], gains[9])); +} + +void fps_eq_publish_mode_and_gains(unsigned mode, const int16_t gains[FPS_EQ_BAND_COUNT]) +{ + SET_SHARED_GLOBAL(g_fps_eq_mode, mode); + fps_eq_publish_gains_to_shared(gains); +} + +void fps_apply_eq_mode(void) +{ + int16_t gains[FPS_EQ_BAND_COUNT]; + + fps_eq_unpack_gains(gains); + /* 改动原因:切换模式时用eq_set_all_gains一次性加载当前模式10段增益 */ + fps_xmos_xc_eq_set_all_gains(gains); +} + +void fps_apply_eq_band_gain(unsigned band, int16_t gain) +{ + if (band >= FPS_EQ_BAND_COUNT) { + return; + } + /* 改动原因:运行中单段调节使用fps_xmos_xc_eq_set_band_gain */ + fps_xmos_xc_eq_set_band_gain((int)band, gain); +} void fps_main (chanend_t c_data ) { int input[2]; int output[2]; int count = 0; - unsigned write_pos = 0; - unsigned process_pos = 0; + unsigned write_pos = 0; unsigned read_pos = 0; - + while (1) { chan_in_buf_word (c_data , input, 2) ; @@ -44,19 +130,12 @@ void fps_main (chanend_t c_data ) { if (count == 0) read_pos = (write_pos + 1 + FPS_SLOT_NUM) % FPS_SLOT_NUM; - // 修改原因: 写入当前buffer,读取前一个已处理完的buffer,实现1帧延时 - // 写入位置:write_pos(当前正在填充的buffer) - for (int i = 0; i <2; i++) - { - dsp_fps_input_buf[write_pos][i][count] = (short)(input[i] >> 16); - } + /* 改动原因:按fps_xmos_xc_process要求的平面格式写入,左声道在前512,右声道在后512 */ + dsp_fps_input_buf[write_pos][count] = (short)(input[0] >> 16); + dsp_fps_input_buf[write_pos][FPS_FRAME_SIZE + count] = (short)(input[1] >> 16); - // 读取位置:read_pos(前一个已经DSP处理完成的buffer) - // 这样可以实现最小延时(1帧),避免原来的3帧延时问题 - for (int i = 0; i < 2; i++) - { - output[i] = (int)(dsp_fps_out_buf[read_pos][i][count]) << 16; - } + output[0] = (int)(dsp_fps_out_buf[read_pos][count]) << 16; + output[1] = (int)(dsp_fps_out_buf[read_pos][FPS_FRAME_SIZE + count]) << 16; if (count != (FPS_FRAME_SIZE - 1)) { @@ -64,84 +143,118 @@ void fps_main (chanend_t c_data ) { } else { - // 一帧完成,进行缓冲区切换 count = 0; // 修改原因: 实现1帧延时的三缓冲机制 // 步骤1: 将当前完成的写入buffer交给DSP处理任务 SET_SHARED_GLOBAL(fps_process_pos, write_pos); - - // 步骤2: 切换到下一个buffer进行写入(三缓冲循环:0→1→2→0) + write_pos = (write_pos + 1) % FPS_SLOT_NUM; SET_SHARED_GLOBAL(fps_write_pos, write_pos); - - SET_SHARED_GLOBAL(fps1_buf_ready, 1); - SET_SHARED_GLOBAL(fps2_buf_ready, 1); + + /* 改动原因:单核处理整帧立体声,仅需一个ready标志 */ + SET_SHARED_GLOBAL(fps_buf_ready, 1); } } } -unsigned long get_reference_time(); +/* 改动原因:按全局变量同步DRC压缩模式到算法库fps_xmos_xc_drc_set_mode */ +void fps_apply_drc_mode(void) +{ + unsigned drc_mode; + + GET_SHARED_GLOBAL(drc_mode, g_fps_drc_mode); + /* 改动原因:mode仅允许0=low、1=high,无效值回默认0 */ + if (drc_mode > 1) { + drc_mode = 0; + } + fps_xmos_xc_drc_set_mode((int)drc_mode); +} + +/* 改动原因:按全局变量同步DRC/FPS主处理/fps_eq三模块开关到算法库 */ +void fps_apply_module_enable(void) +{ + unsigned drc_enable; + unsigned fps_sub_enable; + unsigned eq_enable; + + GET_SHARED_GLOBAL(drc_enable, g_fps_drc_enable); + GET_SHARED_GLOBAL(fps_sub_enable, g_fps_sub_enable); + GET_SHARED_GLOBAL(eq_enable, g_fps_eq_enable); + + fps_xmos_xc_set_module_enable( + (drc_enable != 0) ? 1 : 0, + (fps_sub_enable != 0) ? 1 : 0, + (eq_enable != 0) ? 1 : 0); +} + +/* 改动原因:HID/tile0同步时在audiohw.xc中调用,供tile1在收到 sync 0x03(来自 HID 0xBF)时更新FPS算法参数 */ +void fps_apply_game_level_select(void) +{ + unsigned game_select; + unsigned level_select; + + GET_SHARED_GLOBAL(game_select, g_fps_game_select); + GET_SHARED_GLOBAL(level_select, g_fps_level_select); + if (game_select > 2) { + game_select = 0; + } + /* 改动原因:无效 level 默认档位 2,与 fps_level_g0/g1/g2 及 g_fps_level_select 一致 */ + if (level_select > 4) { + level_select = 2; + } + fps_xmos_xc_game_select((int)game_select, (int)level_select); +} + +/* 改动原因:集中FPS库初始化顺序——init→fps_eq全段增益→game/level→三模块使能 */ +static void fps_xmos_modules_init(void) +{ + unsigned game_select; + unsigned level_select; + int16_t gains[FPS_EQ_BAND_COUNT]; + + fps_xmos_xc_init(); + + /* 改动原因:从tile0已同步的共享pack字解出当前模式10段增益后初始化fps_eq */ + fps_eq_unpack_gains(gains); + fps_xmos_xc_eq_set_all_gains(gains); + + GET_SHARED_GLOBAL(game_select, g_fps_game_select); + GET_SHARED_GLOBAL(level_select, g_fps_level_select); + if (game_select > 2) { + game_select = 0; + } + /* 改动原因:上电/初始化时无效 level 默认档位 2 */ + if (level_select > 4) { + level_select = 2; + } + fps_xmos_xc_game_select((int)game_select, (int)level_select); + + /* 改动原因:上电/HID设置后须在module_enable前应用DRC压缩模式 */ + fps_apply_drc_mode(); + fps_apply_module_enable(); +} + void fps1_dsp_proc_task() { - fps_xmos_init(); -#if 1 + fps_xmos_modules_init(); + while (1) { - unsigned ready1; - // 修改原因: 使用声道0独立的ready标志,与声道1完全独立,避免竞态 - GET_SHARED_GLOBAL(ready1, fps1_buf_ready); - while (ready1) - { - // 修改原因: 关键修复 - 直接读取fps_main设置好的process_pos,避免自己计算导致的竞态 - unsigned cur_pos; - GET_SHARED_GLOBAL(cur_pos, fps_process_pos); - -#if 0 - for (int i = 0; i < FPS_FRAME_SIZE; i++) - { - dsp_fps_out_buf[cur_pos][0][i] = dsp_fps_input_buf[cur_pos][0][i]; - } -#else - // 处理声道0数据 - fps_xmos_process(&dsp_fps_input_buf[cur_pos][0], &dsp_fps_out_buf[cur_pos][0], 0); -#endif + unsigned ready; - ready1 = 0; - SET_SHARED_GLOBAL(fps1_buf_ready, 0); - } - } -#endif -} - -void fps2_dsp_proc_task() -{ -#if 1 - while (1) - { - unsigned ready2; - GET_SHARED_GLOBAL(ready2, fps2_buf_ready); - while (ready2) + GET_SHARED_GLOBAL(ready, fps_buf_ready); + while (ready) { unsigned cur_pos; + GET_SHARED_GLOBAL(cur_pos, fps_process_pos); - - // 处理声道1数据 - unsigned long start_time = get_reference_time(); -#if 0 - for (int i = 0; i < FPS_FRAME_SIZE; i++) - { - dsp_fps_out_buf[cur_pos][1][i] = dsp_fps_input_buf[cur_pos][1][i]; - } -#else - fps_xmos_process(&dsp_fps_input_buf[cur_pos][1], &dsp_fps_out_buf[cur_pos][1], 1); -#endif - unsigned long end_time = get_reference_time(); - // printf("fps2_dsp_proc_task time: %d ms\n", end_time - start_time); - // 修改原因: 只清除自己的ready标志,不影响声道0 - ready2 = 0; - SET_SHARED_GLOBAL(fps2_buf_ready, 0); + + /* 改动原因:单核一次处理左右声道平面块,不再分声道两次调用 */ + fps_xmos_xc_process(dsp_fps_input_buf[cur_pos], dsp_fps_out_buf[cur_pos]); + + ready = 0; + SET_SHARED_GLOBAL(fps_buf_ready, 0); } } -#endif } \ No newline at end of file diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc index 61b9854..fe94159 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc @@ -14,6 +14,8 @@ #include #include #include +/* 改动原因:FPS 移植自 c3_fps,main.xc 中 fps_main/fps1_dsp_proc_task 启动日志需要 debug_printf */ +#include "debug_print.h" #ifdef XSCOPE #include #endif @@ -422,7 +424,6 @@ void usb_audio_io(chanend ?c_aud_in, #if XMOS_FPS_EN extern void fps_main(chanend c_data); extern void fps1_dsp_proc_task(); -extern void fps2_dsp_proc_task(); #endif /* Main for USB Audio Applications */ @@ -521,17 +522,16 @@ int main() #if XMOS_FPS_EN on tile[1]: { + debug_printf("start fps_main\n"); set_core_high_priority_on(); fps_main(c_data_transport); } on tile[1]: { + /* 改动原因:FPS库改为单核xc_process,仅需一个DSP任务处理整帧立体声 */ + debug_printf("start fps1_dsp_proc_task\n"); set_core_high_priority_on(); fps1_dsp_proc_task(); } - on tile[1]: { - set_core_high_priority_on(); - fps2_dsp_proc_task(); - } #else #if UAC1 on tile[1]: { diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h index 501a992..a107a04 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h @@ -16,7 +16,7 @@ interface c1_led_ctrl_if { void switch_handler(void); void flag_handler(); /* 改动原因:固件升级 START 在 AudioHwRemote2 处理,需传入 c_dfu;其余升级命令在 process_send_params 直接处理 */ -void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_erase, streaming chanend c_dfu); +void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, streaming chanend c_dfu, chanend c_app_sync); void i2s_driver(chanend c); extern unsafe chanend uc_i2s; extern unsafe chanend uc_br_data; @@ -24,61 +24,47 @@ extern unsafe chanend uc_eq_data; extern void UserBufferManagementSetChan(chanend c); extern void dsp_main (chanend c_data , chanend cc_br_eof); extern void br_dsp_proc_task(chanend c_validate, chanend cc_br_eof); -extern void validate_algo(chanend c_validate); -void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl); +void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl, chanend c_sync); extern void dnr_dsp_proc_task(void); extern void dsp_core0(void); extern void eq_dsp_main(chanend c_data); extern unsafe streaming chanend uc_audiohw; extern unsafe streaming chanend uc_dfu; extern void fps1_dsp_proc_task(void); -extern void fps2_dsp_proc_task(void); +/* 改动原因:FPS库单核处理,fps2_dsp_proc_task已合并到fps1 */ +extern void fps_apply_game_level_select(void); +extern void fps_apply_module_enable(void); +extern void fps_apply_drc_mode(void); +extern void fps_apply_eq_mode(void); +extern void fps_apply_eq_band_gain(unsigned band, int16_t gain); +extern void fps_eq_boot_publish_to_tile1(void); +extern void fps_drc_boot_sync_to_tile1(void); +extern void fps_boot_load_from_flash(void); +extern unsigned g_fps_drc_enable; +extern unsigned g_fps_sub_enable; +extern unsigned g_fps_eq_enable; +extern unsigned g_fps_drc_mode; -#define USER_MAIN_DECLARATIONS chan c_data_transport, cc_br_eof, c_validate; \ - streaming chan c_audiohw; streaming chan c_dfu; interface c1_led_ctrl_if i_c1_led_ctrl; \ +#define USER_MAIN_DECLARATIONS streaming chan c_audiohw; streaming chan c_dfu; interface c1_led_ctrl_if i_c1_led_ctrl; \ chan c_usb_to_io; chan c_io_to_usb; chan c_io_to_dspL; chan c_dspL_to_io; chan c_io_to_dspR; chan c_dspR_to_io; \ - chan c_erase; + chan c_app_sync, c_data_transport; -#if !UAC1 #define USER_MAIN_CORES on tile[0]: {\ unsafe { \ uc_audiohw = (chanend) c_audiohw;\ uc_dfu = (chanend) c_dfu;\ - } \ - flag_handler(); \ - }\ - on tile[0]: {\ - AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_erase, c_dfu);\ - }\ - on tile[AUDIO_IO_TILE]: par {\ - dsp_core0();\ - } \ -\ - on tile[1]: app_control_slave(i_c1_led_ctrl); \ -\ - -#else -#define USER_MAIN_CORES on tile[0]: {\ - dnr_dsp_proc_task();\ - }\ - on tile[0]: {\ - unsafe { \ - uc_audiohw = (chanend) c_audiohw;\ + /* 改动原因:FPS/BR 音频经 c_data_transport 与 tile1 fps_main 交换;未赋值 uc_br_data 会导致 UserBufferManagement buffer_exchange ECALL */\ uc_br_data = (chanend) c_data_transport;\ - uc_dfu = (chanend) c_dfu;\ } \ - validate_algo(c_validate); \ }\ on tile[0]: {\ - AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_erase, c_dfu);\ + AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_dfu, c_app_sync);\ }\ - on tile[1]: { br_dsp_proc_task(c_validate, cc_br_eof); } \ - on tile[1]: app_control_slave(i_c1_led_ctrl); \ + on tile[1]: app_control_slave(i_c1_led_ctrl, c_app_sync); \ \ -#endif #else #define USER_MAIN_DECLARATIONS_A diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h index 899977f..5fe5a6d 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.h @@ -1,11 +1,11 @@ #ifndef _UART_H_ #define _UART_H_ -#include -#include -#include -#include #include +#include +#include +#include +#include typedef enum { AUDIO_PCM_44100 = 0, @@ -263,4 +263,42 @@ typedef struct { unsigned char pendingReboot; } UserCmdConfig; +// Tile1到Tile0同步命令枚举 +// 改动原因:定义同步命令类型,用于tile1通过channel向tile0发送需要同步的操作 +typedef enum { + SYNC_CMD_NONE = 0x00, + SYNC_CMD_LOAD_CONFIGS = 0x01, // 加载配置(从Flash读取) + SYNC_CMD_SAVE_CONFIGS = 0x02, // 保存配置(写入Flash) + SYNC_CMD_SAVE_PRODUCT_INFO = 0x03, // 保存产品信息 + SYNC_CMD_SAVE_POWERUP_INFO = 0x04, // 保存上电配置 + SYNC_CMD_SAVE_USERCONFIG = 0x05, // 保存用户配置 + SYNC_CMD_GET_PID_VID = 0x06, // 获取并设置PID/VID + SYNC_CMD_SET_DAC_VOLUME = 0x07, // 设置DAC音量 + SYNC_CMD_SET_ADC_VOLUME = 0x08, // 设置ADC音量 + SYNC_CMD_SET_3D_FPS = 0x09, // 设置3D FPS(0x33命令) + SYNC_CMD_SET_ROLE_SWITCH = 0x0A, // 设置RoleSwitchFlag(oleSwitchFlag) + SYNC_CMD_STORE_MEMORY = 0x0B, // 存储内存数据(store_memory) + SYNC_CMD_SET_LED_MODE = 0x0C, // 设置LED模式(0x34命令) + SYNC_CMD_SET_ADC_LOOP = 0x0D, // 设置ADC Loop(0x31命令) + SYNC_CMD_MUTE_VALUE_FROM_MCU = 0x0E, // tile1收到MCU 0x5F响应后,将静音值传回tile0 +} SyncCmdType; + +// Tile0到Tile1同步命令枚举 +// 改动原因:定义反向同步命令类型,用于tile0通过channel向tile1发送需要同步的操作 +typedef enum { + SYNC_CMD_T0_TO_T1_NONE = 0x00, + SYNC_CMD_T0_TO_T1_SET_GAME_MODE = 0x01, // 设置游戏模式(HID 0xA4 -> UART 0x5A) + SYNC_CMD_T0_TO_T1_SET_UAC_MODE = 0x02, // 设置UAC模式(HID 0x9B -> UART 0x51) + SYNC_CMD_T0_TO_T1_SET_FPS_XMOS_GAME_SELECT = 0x03, // 设置FPS XMOS游戏选择(HID 0xBF -> fps_xmos_game_select) + SYNC_CMD_T0_TO_T1_SET_INPUT_SOURCE = 0x04, // 设置输入源(HID 0xB0 -> UART 0x5D) + SYNC_CMD_T0_TO_T1_SET_FPS_MODULE_ENABLE = 0x08, // 设置FPS库DRC/FPS/fps_eq使能(HID 0xB5 -> fps_xmos_xc_set_module_enable) + SYNC_CMD_T0_TO_T1_SET_FPS_EQ_MODE = 0x09, // 切换fps_eq模式并加载10段增益(HID 0xB7) + SYNC_CMD_T0_TO_T1_SET_FPS_EQ_BAND_GAIN = 0x0A, // 设置fps_eq单段增益(HID 0xB9) + SYNC_CMD_T0_TO_T1_SET_FPS_EQ_PACK = 0x0B, // 同步fps_eq pack字到tile1(上电/HID 0xB7) + SYNC_CMD_T0_TO_T1_SET_FPS_DRC_MODE = 0x0C, // 设置DRC压缩模式(HID 0xBD -> fps_xmos_xc_drc_set_mode) + SYNC_CMD_T0_TO_T1_SET_MUTE_SWITCH = 0x05, // 设置静音开关(HID 0xB1 -> UART 0x5E) + SYNC_CMD_T0_TO_T1_SEND_GET_MUTE_REQUEST = 0x06, // 向MCU发0x5F获取静音(HID 0xB2) + SYNC_CMD_T0_TO_T1_SET_LISTEN_SWITCH = 0x07, // 设置监听开关(HID 0xB3 -> UART 0x60) +} SyncCmdT0ToT1Type; + #endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc index c21a91f..1eb4f41 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_uart.xc @@ -34,6 +34,7 @@ extern "C" { #define RCV_CMD_TIMEOUT (500000000) //5s #define SEND_CMD_TIMEOUT (20000000) //200ms #define VOLUME_TIMEOUT (5500000) //55ms delay +#define BEAT_DELAY (500000) //10ms delay #define START_COUNTS (4) @@ -67,6 +68,22 @@ unsigned char g_save_configs = 0; unsigned g_usb_state = 1; unsigned int g_xu316_id; +/* 改动原因:0x07/0x08/0x09/0x0C/0x0D/0x0E 仅在值变化时同步到 tile0,用 pending 存 UART 下发的值,last_sync 存上次已同步的值,初值 -1 */ +unsigned g_pending_dac_vol = (unsigned)(-1); +unsigned g_pending_adc_vol = (unsigned)(-1); +unsigned g_pending_3d_fps = (unsigned)(-1); +unsigned g_pending_led_mode = (unsigned)(-1); +unsigned g_pending_adc_loop = (unsigned)(-1); +unsigned g_pending_mute_switch = (unsigned)(-1); +unsigned g_pending_mcu_mute = (unsigned)(-1); +unsigned g_last_sync_dac_vol = (unsigned)(-1); +unsigned g_last_sync_adc_vol = (unsigned)(-1); +unsigned g_last_sync_3d_fps = (unsigned)(-1); +unsigned g_last_sync_led_mode = (unsigned)(-1); +unsigned g_last_sync_adc_loop = (unsigned)(-1); +unsigned g_last_sync_mute_switch = (unsigned)(-1); +unsigned g_last_sync_mcu_mute = (unsigned)(-1); + extern audio_sampling g_playback_format; extern audio_type g_audio_type; extern unsigned g_led_mode; @@ -76,15 +93,18 @@ extern unsigned int read_key(void); extern unsigned g_dac_vol; extern unsigned g_adc_vol; extern unsigned g_adc_loop; -extern unsigned g_mute_switch; // 改动原因:与g_adc_loop一致,UART收到0x5F响应时直接设置,供HID变化上报 extern unsigned g_3d_fps; extern unsigned g_dac_mode; extern unsigned g_new_dac_mode; +extern unsigned g_sync_t0_to_t1_cmd; +extern unsigned g_sync_t0_to_t1_data; #if EQ_EN extern unsigned int g_current_eq_mode; // EQ当前模式 extern unsigned int g_old_eq_mode; // EQ当前模式 extern int process_eq_params_from_uart(uint8_t eq_mode, uint8_t eq_index, uint32_t sample_rate, float coefficients[5]); // EQ命令处理函数现在在eq.c中实现 +extern void process_uart_set_game_mode(uint8_t game_mode); // 改动原因:声明UART设置游戏模式函数,用于tile0到tile1同步 +extern void process_uart_set_uac_mode(uint8_t uac_mode); // 改动原因:声明UART设置UAC模式函数,用于tile0到tile1同步 #endif extern void read_uid_did(uint8_t uid[]); @@ -92,6 +112,41 @@ void device_reboot(void); uint8_t send_data[MAX_BUFFER_LEN] = {0}; +// 改动原因:用于存储需要同步的数据缓冲区(用于Flash操作等需要传递数据指针的情况) +static uint8_t sync_buffer[128]; +// 改动原因:全局同步channel,用于process_command中需要同步的操作(使用unsafe chanend因为需要在函数间传递) +static unsafe chanend g_c_uart_sync; + +// 改动原因:实现tile1到tile0的同步函数,用于将需要在tile0执行的操作通过channel发送 +static void sync_to_tile0(unsigned cmd, unsigned data1, unsigned data2) +{ + unsigned result; + unsafe { + g_c_uart_sync <: cmd; + g_c_uart_sync <: data1; + g_c_uart_sync <: data2; + g_c_uart_sync :> result; + } +} + +// 改动原因:实现tile1到tile0的数据传输函数,用于传输数据块(因为tile0和tile1内存不共享) +static void sync_data_to_tile0(unsigned cmd, uint8_t *data, unsigned len, unsigned extra_data) +{ + unsigned result; + unsigned i; + unsafe { + g_c_uart_sync <: cmd; + g_c_uart_sync <: len; // 先发送数据长度 + g_c_uart_sync <: extra_data; // 发送额外数据 + // 逐字节传输数据(因为tile0和tile1内存不共享,不能传递指针) + for(i = 0; i < len; i++) + { + g_c_uart_sync <: data[i]; + } + g_c_uart_sync :> result; + } +} + UserCmdConfig cmdConfig={0}; extern unsigned g_in_fw_upgrade; @@ -203,7 +258,7 @@ uint8_t send_user_cmd(uint8_t *request, uint8_t func_code, unsigned char version case START_FINISH: unsigned mode_code = 0; - unsigned mode = GetRoleSwitchFlag(); + unsigned mode =BT_IN_FLAG; switch (mode) { case UAC1_IN_FLAG: @@ -224,6 +279,7 @@ uint8_t send_user_cmd(uint8_t *request, uint8_t func_code, unsigned char version default: break; } + mode_code = 0x800100; request[4] = FINISH_CMD_DATA_LEN; request[5] = 0; @@ -256,10 +312,10 @@ uint8_t send_user_cmd(uint8_t *request, uint8_t func_code, unsigned char version } debug_printf("boot to user_mode %08x\n", mode_code); - SetRoleSwitchFlag(mode_code); - delay_milliseconds(1); - device_reboot(); - while(1); + //sync_to_tile0(0x0A, mode_code, 0); // SYNC_CMD_SET_ROLE_SWITCH + //delay_milliseconds(20); + //device_reboot(); + //while(1); } break; @@ -309,7 +365,6 @@ void update_button(unsigned char b) debug_printf("update_button %02x\n", 1<= 1) { - unsigned mute_val = (data[CMD_DATA_POS] > 1) ? 0 : (unsigned)data[CMD_DATA_POS]; - SET_SHARED_GLOBAL(g_mute_switch, mute_val); - debug_printf("set mcu mute state (0x61) %d\n", mute_val); - send_len = send_user_cmd(send_data, SET_MCU_MUTE_STATE, 0, 0); - xmos_printf(send_data, send_len); - } - break; #if UAC1 case SET_3D_FPS: - SET_SHARED_GLOBAL(g_3d_fps, data[CMD_DATA_POS]); + // 改动原因:仅记录待同步值,在 859 区域定时检测到值变化时才同步到 tile0 + SET_SHARED_GLOBAL(g_pending_3d_fps, (unsigned)data[CMD_DATA_POS]); debug_printf("set 3d fps %d\n", data[CMD_DATA_POS]); send_len = send_user_cmd(send_data, SET_3D_FPS, 1, 0); xmos_printf(send_data, send_len); break; #endif case SET_LED_MODE: - SET_SHARED_GLOBAL(g_led_mode, data[CMD_DATA_POS]); + // 改动原因:仅记录待同步值,在 859 区域定时检测到值变化时才同步到 tile0 + SET_SHARED_GLOBAL(g_pending_led_mode, (unsigned)data[CMD_DATA_POS]); debug_printf("set led mode %d\n", data[CMD_DATA_POS]); send_len = send_user_cmd(send_data, SET_LED_MODE, 1, 0); xmos_printf(send_data, send_len); break; + // 改动原因:0x5D/0x5E/0x60 仅由 XMOS 主动发给 MCU(tile1 收到 tile0 sync 后发),MCU 不会主动发这些;0x5F 响应由 MCU 发回 + case GET_MUTE_SWITCH: + // 改动原因:MCU 对 0x5F 请求的响应(1 字节静音值),与监听开关(g_adc_loop)一致,先缓存为pending,再在定时块按变化同步到tile0 + if (length >= 1) { + unsigned mute_val = (data[CMD_DATA_POS] > 1) ? 0 : (unsigned)data[CMD_DATA_POS]; + SET_SHARED_GLOBAL(g_pending_mute_switch, mute_val); + } + break; + // 改动原因:0x61 MCU设置静音状态给XU316,与0x31 SET_ADC_LOOP一致:先缓存为pending,定时块按变化同步到tile0(sync 0x0E) + case SET_MCU_MUTE_STATE: + if (length >= 1) { + unsigned mute_val = (data[CMD_DATA_POS] > 1) ? 0 : (unsigned)data[CMD_DATA_POS]; + SET_SHARED_GLOBAL(g_pending_mute_switch, mute_val); + debug_printf("set mcu mute state (0x61) %d\n", mute_val); + send_len = send_user_cmd(send_data, SET_MCU_MUTE_STATE, 0, 0); + xmos_printf(send_data, send_len); + } + break; + case SET_INPUT_SOURCE: + case SET_MUTE_SWITCH: + case SET_LISTEN_SWITCH: + // 改动原因:0x5D/0x5E/0x60 仅由 XMOS 发给 MCU,若 MCU 发来则忽略 + break; case FW_VERSION: send_len = send_user_cmd(send_data, FW_VERSION, 0, 3); xmos_printf(send_data, send_len); @@ -527,382 +613,12 @@ void process_command(uint8_t *data) send_len = send_user_cmd(send_data, FLASH_ID, 0, 20); xmos_printf(send_data, send_len); break; -#if EQ_EN - // EQ命令处理 - 调用eq.c中的函数 - case SET_EQ_MODE: - { - uint8_t mode = data[CMD_DATA_POS]; - uint8_t result = process_uart_set_eq_mode(mode); - uint8_t send_len = 0; - - // 发送确认响应 - send_len = send_user_cmd(send_data, SET_EQ_MODE, 0, 0); - xmos_printf(send_data, send_len); - } - break; - - case GET_EQ_MODE: - { - uint8_t response[64]; - // 检查是否有模式参数(数据长度>0表示有参数) - if (length > 0) { - uint8_t query_mode = data[CMD_DATA_POS]; - debug_printf("GET_EQ_MODE with mode parameter: %d\n", query_mode); - // 如果mode不是0xFF,临时设置request模式用于查询 - if (query_mode != 0xFF) { - SET_SHARED_GLOBAL(g_request_eq_mode, query_mode); - } - } - uint8_t len = process_uart_get_eq_mode(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_MODE_GAIN_AND_NAME: - { - uint8_t result = process_uart_set_mode_gain_and_name(data); - uint8_t send_len = 0; - - // 发送确认响应 - send_len = send_user_cmd(send_data, SET_MODE_GAIN_AND_NAME, 0, 0); - xmos_printf(send_data, send_len); - } - break; - - case SET_EQ_PARAMS: - { - uint8_t result = process_uart_set_eq_params(data); - uint8_t send_len = 0; - - // 发送确认响应 - send_len = send_user_cmd(send_data, SET_EQ_PARAMS, 0, 0); - xmos_printf(send_data, send_len); - } - break; - - case GET_EQ_PARAMS: - { - uint8_t response[64]; - uint8_t len = process_uart_get_eq_params(data, response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case RESET_EQ_PARAMS: - { - uint8_t result = process_uart_reset_eq_params(data); - uint8_t send_len = 0; - - // 发送响应 - send_data[CMD_DATA_POS] = result; - send_len = send_user_cmd(send_data, RESET_EQ_PARAMS, 0, 1); - xmos_printf(send_data, send_len); - } - break; - - case GET_DEVICE_INFO: - { - uint8_t response[64]; - uint8_t len = process_uart_get_device_info(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case GET_EQ_MODE_COUNT: - { - uint8_t response[64]; - uint8_t len = process_uart_get_eq_mode_count(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_AND_SAVE_EQ_MODE: - { - uint8_t result = process_uart_set_and_save_eq_mode(data); - uint8_t send_len = 0; - - // 发送响应 - send_data[CMD_DATA_POS] = result; - send_len = send_user_cmd(send_data, SET_AND_SAVE_EQ_MODE, 0, 1); - xmos_printf(send_data, send_len); - } - break; - - case SET_VOLUME: - // 改动原因:使用g_dac_vol,参考SET_DAC_VOLUME的实现方式,直接设置全局变量 - SET_SHARED_GLOBAL(g_dac_vol, data[CMD_DATA_POS]); - send_len = send_user_cmd(send_data, SET_VOLUME, 1, 0); - SET_SHARED_GLOBAL(g_dac_vol, data[CMD_DATA_POS]); - debug_printf("set volume %d\n", data[CMD_DATA_POS]); - xmos_printf(send_data, send_len); - break; - - case GET_VOLUME: - // 改动原因:直接读取g_dac_vol的值并返回,参考SET_DAC_VOLUME的实现方式 - { - uint8_t response[64]; - unsigned dac_vol; - GET_SHARED_GLOBAL(dac_vol, g_dac_vol); - // 构建响应数据包:0x55 0xAA 0x00 0x4A 0x01 [volume] [checksum] - response[0] = 0x55; // 帧头1 - response[1] = 0xAA; // 帧头2 - response[2] = 0x00; // 版本 - response[3] = GET_VOLUME; // 命令码 - response[4] = 0x01; // 数据长度 - response[5] = (uint8_t)dac_vol; // 音量级别 - // 计算校验和 - uint8_t checksum_pos = 6; - // 改动原因:使用check_sum函数计算校验和,与send_user_cmd函数保持一致 - unsafe { - response[checksum_pos] = check_sum(response, checksum_pos); - } - uint8_t len = checksum_pos + 1; - debug_printf("get volume %d\n", dac_vol); - xmos_printf(response, len); - } - break; - - case GET_LED_INFO: - { - uint8_t led_index = data[CMD_DATA_POS]; - uint8_t response[64]; - uint8_t len = process_uart_get_led_info(led_index, response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_LED_SWITCH: - // 改动原因:参考SET_LED_MODE,直接设置g_led_mode的值,0=关,1=开 - { - uint8_t led_index = data[CMD_DATA_POS]; - uint8_t led_switch = data[CMD_DATA_POS + 1]; - SET_SHARED_GLOBAL(g_led_mode, led_switch); - debug_printf("set led switch (g_led_mode) %d\n", led_switch); - uint8_t send_len = 0; - - // 发送响应 - send_data[CMD_DATA_POS] = 0; // 状态码:成功 - send_len = send_user_cmd(send_data, SET_LED_SWITCH, 0, 1); - xmos_printf(send_data, send_len); - } - break; - - case GET_LED_SWITCH: - // 改动原因:参考SET_LED_MODE,直接读取g_led_mode的值,0=关,1=开 - { - uint8_t led_index = data[CMD_DATA_POS]; - uint8_t response[64]; - unsigned led_mode; - GET_SHARED_GLOBAL(led_mode, g_led_mode); - - // 构建响应数据包:0x55 0xAA 0x00 0x4D 0x02 [led_index] [led_mode] [checksum] - response[0] = 0x55; // 帧头1 - response[1] = 0xAA; // 帧头2 - response[2] = 0x00; // 版本 - response[3] = GET_LED_SWITCH; // 命令码 - response[4] = 0x02; // 数据长度 - response[5] = led_index; // LED索引 - response[6] = (uint8_t)led_mode; // LED开关状态 - // 计算校验和 - uint8_t checksum_pos = 7; - unsafe { - response[checksum_pos] = check_sum(response, checksum_pos); - } - uint8_t len = checksum_pos + 1; - debug_printf("get led switch (g_led_mode) %d\n", led_mode); - xmos_printf(response, len); - } - break; - - case GET_LED_STATUS: - { - uint8_t led_index = data[CMD_DATA_POS]; - uint8_t response[64]; - uint8_t len = process_uart_get_led_status(led_index, response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case GET_LED_COUNT: - { - uint8_t response[64]; - uint8_t len = process_uart_get_led_count(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case GET_UAC_MODE_INFO: - { - uint8_t response[64]; - uint8_t len = process_uart_get_uac_mode_info(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_UAC_MODE: - { - uint8_t uac_mode = data[CMD_DATA_POS]; - // process_uart_set_uac_mode(uac_mode); - // 设备重启,无响应 - } - break; - - case GET_CURRENT_UAC_MODE: - { - uint8_t response[64]; - uint8_t len = process_uart_get_current_uac_mode(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_EQ_ENABLE: - { - uint8_t enable = data[CMD_DATA_POS]; - uint8_t result = process_uart_set_eq_enable(enable); - uint8_t response[64]; - uint8_t len = process_uart_get_eq_enable_response(result, enable, response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case GET_EQ_ENABLE: - { - debug_printf("user_uart.xc: GET_EQ_ENABLE command received, start processing\n"); - uint8_t response[64]; - uint8_t len = process_uart_get_eq_enable(response, sizeof(response)); - debug_printf("user_uart.xc: GET_EQ_ENABLE process_uart_get_eq_enable returned len=%d\n", len); - if (len > 0) { - debug_printf("user_uart.xc: GET_EQ_ENABLE sending response, length=%d, data: ", len); - for (int i = 0; i < len && i < 16; i++) { - debug_printf("%02X ", response[i]); - } - debug_printf("\n"); - xmos_printf(response, len); - debug_printf("user_uart.xc: GET_EQ_ENABLE response sent\n"); - } else { - debug_printf("user_uart.xc: GET_EQ_ENABLE error - process_uart_get_eq_enable returned len=0\n"); - } - } - break; - - case GET_SAMPLE_FORMAT: - { - uint8_t response[64]; - uint8_t len = process_uart_get_sample_format(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_GAIN_MODE: - { - uint8_t gain_mode = data[CMD_DATA_POS]; - uint8_t result = process_uart_set_gain_mode(gain_mode); - // 无需发送响应,根据协议描述 - } - break; - - case GET_GAIN_MODE: - { - uint8_t response[64]; - uint8_t len = process_uart_get_gain_mode(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_FILTER_MODE: - { - uint8_t filter_mode = data[CMD_DATA_POS]; - uint8_t result = process_uart_set_filter_mode(filter_mode); - // 无需发送响应,根据协议描述 - } - break; - - case GET_FILTER_MODE: - { - uint8_t response[64]; - uint8_t len = process_uart_get_filter_mode(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case SET_GAME_MODE: - { - uint8_t game_mode = data[CMD_DATA_POS]; - // 改动原因:UART 0x5A命令透传给MCU处理,MCU负责执行模式设置和参数保存 - // process_uart_set_game_mode(game_mode); - // 无需发送响应,根据协议描述 - } - break; - - case GET_GAME_MODE: - { - uint8_t response[64]; - uint8_t len = process_uart_get_game_mode(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - - case GET_FIRMWARE_VERSION: - { - uint8_t response[64]; - uint8_t len = process_uart_get_firmware_version(response, sizeof(response)); - if (len > 0) { - xmos_printf(response, len); - } - } - break; - // 改动原因:添加0x5D SET_INPUT_SOURCE,由HID 0xB0触发后XMOS主动发给MCU;若MCU发来0x5D则忽略 - case SET_INPUT_SOURCE: - break; - // 改动原因:添加0x5E SET_MUTE_SWITCH,由HID 0xB1触发后XMOS发给MCU;若MCU发来0x5E则忽略 - case SET_MUTE_SWITCH: - break; - // 改动原因:0x5F GET_MUTE_SWITCH 响应由MCU发来,含1字节静音值;与g_adc_loop一致直接设置g_mute_switch,0xB2读与变化上报均用g_mute_switch - case GET_MUTE_SWITCH: - if (length >= 1) { - unsigned mute_val = (data[CMD_DATA_POS] > 1) ? 0 : (unsigned)data[CMD_DATA_POS]; - SET_SHARED_GLOBAL(g_mute_switch, mute_val); - } - break; - // 改动原因:添加0x60 SET_LISTEN_SWITCH,由HID 0xB3触发后XMOS发给MCU;若MCU发来0x60则忽略 - case SET_LISTEN_SWITCH: - break; -#endif } } cmdConfig.cmdCount = 0; } - void xmos_uart_receive(void) { static unsigned cmd_start_time = 0; @@ -1137,115 +853,113 @@ void heatTick(unsigned long boot_time) } -extern unsigned GetDFUFlag(); -extern uint8_t key_validate(uint8_t offset); -extern void flash_opt_unlock(void); -/* 改动原因:固件升级 START 已移至 AudioHwRemote2,不再在此接收 c_dfu */ -void uart_handler(streaming chanend c_tx, streaming chanend c_rx) +void uart_handler(streaming chanend c_tx, streaming chanend c_rx,chanend c_sync) { unsigned long boot_time = get_reference_time(); - long int flag = 0; - long int dfu_flag = 0x11042011; - uint8_t uart_rx_byte; - g_xu316_id = read_key(); + unsigned long heat_tick_time = get_reference_time() + BEAT_DELAY * 10; + // 改动原因:保存同步channel到全局变量,供process_command使用(使用unsafe转换) + unsafe { + g_c_uart_sync = (chanend)c_sync; + } + cmdConfig.pendingReboot = 0; cmdConfig.cmdPending = CMD_NONE; unsigned long se_time = 0; timer se_tmr; se_tmr :> se_time; se_time += 2000000; -#if UAC1 - delay_milliseconds(100); -#endif -#if XUA_DFU_EN - flag = GetDFUFlag(); -#endif + // delay_milliseconds(100); - if (key_validate(1) == 1) - { - SetKeyFlag(0x20241224); - } - - - flash_opt_unlock(); - -#if BOOT_MODE - - load_configs(); - -#if (XUA_DFU_EN == 1) - get_pid_vid(); - if (flag == dfu_flag) - SET_SHARED_GLOBAL(g_usb_state, 1); - -#if (FACT_MODE == 1) - SET_SHARED_GLOBAL(g_usb_state, 1); - return; -#endif - -#endif - -#else cmdConfig.startApp = 3; - #if (NUM_USB_CHAN_OUT != 0) || (NUM_USB_CHAN_IN != 0) - load_configs(); - get_pid_vid(); - SET_SHARED_GLOBAL(g_usb_state, 1); -#endif - - + // 改动原因:load_configs和get_pid_vid需要在tile0执行(Flash访问和PID/VID设置),通过同步channel发送 + // 注意:此时g_c_uart_sync已经设置,可以直接使用 + sync_to_tile0(0x01, 0, 0); // SYNC_CMD_LOAD_CONFIGS + sync_to_tile0(0x06, 0, 0); // SYNC_CMD_GET_PID_VID #endif boot_time = get_reference_time(); + static unsigned char heat_tick_first_executed = 0; // 改动原因:跟踪heatTick是否已执行过第一次 while(1) { select { case c_rx :> uart_rx_byte: -#if HID_DFU_EN - if (!g_in_fw_upgrade) -#endif - { X_RXbuff[X_Rxfp] = uart_rx_byte; X_Rxfp = (X_Rxfp + 1) % MAX_RX_LEN; //debug_printf("in[%02x] %d %d len %d\n", uart_rx_byte, X_Rxfp, X_Rxrp, MAX_RX_LEN - ((X_Rxfp - X_Rxrp + MAX_RX_LEN) % MAX_RX_LEN)); xmos_uart_receive(); - } break; case se_tmr when timerafter(se_time) :> void : se_time += 400000; - /* 改动原因:若有固件升级开始/结束通知,先组包 0x62 发给 MCU,再清零标志 */ -#if HID_DFU_EN - { - unsigned notify = get_firmware_upgrade_mcu_notify(); - if (notify != 0) - { - unsigned char response[8]; - response[0] = 0x55; - response[1] = 0xAA; - response[2] = 0x01; - response[3] = (unsigned char)FIRMWARE_UPGRADE_NOTIFY; - response[4] = 0x01; - response[5] = (unsigned char)notify; - unsafe { - response[6] = check_sum((unsigned char *)response, 6); - } - xmos_printf(response, 7); - clear_firmware_upgrade_mcu_notify(); - } - } -#endif - #if XUA_DFU_EN - if (flag != dfu_flag) - #endif + + { xmos_printf_pross(c_tx); - heatTick(boot_time); + // 改动原因:第一次执行要在boot_time后200ms,后续一直执行 + unsigned long tick_now = get_reference_time(); + if (heat_tick_first_executed == 0) { + // 第一次执行:检查是否已经过了boot_time + 200ms + if (timeafter(tick_now, boot_time + 20000000)) { // 200ms = 20000000 时间单位(参考SEND_CMD_TIMEOUT) + heatTick(boot_time); + heat_tick_first_executed = 1; + } + } else { + // 后续执行:一直执行 + heatTick(boot_time); + } } + /* 改动原因:0x07/0x08/0x09/0x0C/0x0D/0x0E 仅当 pending 与 last_sync 不同时才同步到 tile0 */ + { + unsigned pending_val, last_val; + GET_SHARED_GLOBAL(pending_val, g_pending_dac_vol); + GET_SHARED_GLOBAL(last_val, g_last_sync_dac_vol); + if (pending_val != last_val) { + sync_to_tile0(0x07, pending_val, 0); /* SYNC_CMD_SET_DAC_VOLUME */ + SET_SHARED_GLOBAL(g_last_sync_dac_vol, pending_val); + } + GET_SHARED_GLOBAL(pending_val, g_pending_adc_vol); + GET_SHARED_GLOBAL(last_val, g_last_sync_adc_vol); + if (pending_val != last_val) { + sync_to_tile0(0x08, pending_val, 0); /* SYNC_CMD_SET_ADC_VOLUME */ + SET_SHARED_GLOBAL(g_last_sync_adc_vol, pending_val); + } +#if UAC1 + GET_SHARED_GLOBAL(pending_val, g_pending_3d_fps); + GET_SHARED_GLOBAL(last_val, g_last_sync_3d_fps); + if (pending_val != last_val) { + sync_to_tile0(0x09, pending_val, 0); /* SYNC_CMD_SET_3D_FPS */ + SET_SHARED_GLOBAL(g_last_sync_3d_fps, pending_val); + } +#endif + GET_SHARED_GLOBAL(pending_val, g_pending_led_mode); + GET_SHARED_GLOBAL(last_val, g_last_sync_led_mode); + if (pending_val != last_val) { + sync_to_tile0(0x0C, pending_val, 0); /* SYNC_CMD_SET_LED_MODE */ + SET_SHARED_GLOBAL(g_last_sync_led_mode, pending_val); + } + GET_SHARED_GLOBAL(pending_val, g_pending_adc_loop); + GET_SHARED_GLOBAL(last_val, g_last_sync_adc_loop); + if (pending_val != last_val) { + sync_to_tile0(0x0D, pending_val, 0); /* SYNC_CMD_SET_ADC_LOOP */ + SET_SHARED_GLOBAL(g_last_sync_adc_loop, pending_val); + } + GET_SHARED_GLOBAL(pending_val, g_pending_mute_switch); + GET_SHARED_GLOBAL(last_val, g_last_sync_mute_switch); + if (pending_val != last_val) { + sync_to_tile0(0x0E, pending_val, 0); /* SYNC_CMD_MUTE_VALUE_FROM_MCU */ + SET_SHARED_GLOBAL(g_last_sync_mute_switch, pending_val); + } + GET_SHARED_GLOBAL(pending_val, g_pending_mcu_mute); + GET_SHARED_GLOBAL(last_val, g_last_sync_mcu_mute); + if (pending_val != last_val) { + sync_to_tile0(0x0F, pending_val, 0); /* SYNC_CMD_SET_MCU_MUTE_STATE */ + SET_SHARED_GLOBAL(g_last_sync_mcu_mute, pending_val); + } + } if (cmdConfig.pendingReboot == 1) {