mode switch
This commit is contained in:
@@ -8,8 +8,8 @@
|
|||||||
#define CLKBLK_SPDIF_TX XS1_CLKBLK_1
|
#define CLKBLK_SPDIF_TX XS1_CLKBLK_1
|
||||||
#define CLKBLK_SPDIF_RX XS1_CLKBLK_1
|
#define CLKBLK_SPDIF_RX XS1_CLKBLK_1
|
||||||
#define CLKBLK_MCLK XS1_CLKBLK_2
|
#define CLKBLK_MCLK XS1_CLKBLK_2
|
||||||
#define CLKBLK_FLASHLIB XS1_CLKBLK_1 /* Clock block for use by flash lib */
|
#define CLKBLK_FLASHLIB XS1_CLKBLK_3 /* Clock block for use by flash lib */
|
||||||
#define CLKBLK_ADAT_RX XS1_CLKBLK_REF /* Use REF for ADAT_RX on x200/AI series */
|
#define CLKBLK_ADAT_RX XS1_CLKBLK_REF /* Use REF for ADAT_RX on x200/AI series */
|
||||||
#define CLKBLK_I2S_BIT XS1_CLKBLK_3
|
#define CLKBLK_I2S_BIT XS1_CLKBLK_1
|
||||||
|
|
||||||
#endif /* _UAC_HWRESOURCES_H_ */
|
#endif /* _UAC_HWRESOURCES_H_ */
|
||||||
|
|||||||
@@ -54,36 +54,65 @@ set(SW_USB_AUDIO_FLAGS ${EXTRA_BUILD_FLAGS} -O3
|
|||||||
-DDEBUG_PRINT_ENABLE=0)
|
-DDEBUG_PRINT_ENABLE=0)
|
||||||
|
|
||||||
|
|
||||||
LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr)
|
LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr)
|
||||||
set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
|
||||||
|
set(APP_COMPILER_FLAGS_ex3d_UAC1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
-DI2S_CHANS_ADC=2
|
-DI2S_CHANS_ADC=2
|
||||||
#-DAUDIO_CLASS=1
|
-DAUDIO_CLASS=1
|
||||||
-DMIN_FREQ=48000
|
-DMIN_FREQ=48000
|
||||||
-DMAX_FREQ=48000
|
-DMAX_FREQ=48000
|
||||||
-DUSE_EX3D
|
-DUSE_EX3D
|
||||||
-DMIXER=0
|
-DMIXER=0
|
||||||
-DAIZIP_DNR=0 #-ldnr_50ms
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
-llib_ex3d_stereo_2k
|
-llib_ex3d_stereo_2k
|
||||||
-DNUM_USB_CHAN_OUT=2
|
-DNUM_USB_CHAN_OUT=2
|
||||||
-DNUM_USB_CHAN_IN=2
|
-DNUM_USB_CHAN_OUT_FS=2
|
||||||
|
-DNUM_USB_CHAN_IN=0
|
||||||
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
|
||||||
-DNUM_EX3D_CHAN_OUT=2
|
-DNUM_EX3D_CHAN_OUT=2
|
||||||
-DINPUT_VOLUME_CONTROL=0
|
-DINPUT_VOLUME_CONTROL=0
|
||||||
|
-DUAC1_MODE=1
|
||||||
|
-DEQ_EN=1
|
||||||
-DOUTPUT_VOLUME_CONTROL=0
|
-DOUTPUT_VOLUME_CONTROL=0
|
||||||
-DSTEREO_2K
|
-DSTEREO_2K
|
||||||
-DHID_CONTROLS=1)
|
-DHID_CONTROLS=1)
|
||||||
|
|
||||||
set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
|
||||||
|
set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
|
-DI2S_CHANS_ADC=0
|
||||||
|
#-DAUDIO_CLASS=1
|
||||||
|
-DMIN_FREQ=48000
|
||||||
|
-DMAX_FREQ=48000
|
||||||
|
-DUSE_EX3D
|
||||||
|
-DMIXER=0
|
||||||
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
|
-llib_ex3d_stereo_2k
|
||||||
|
-DNUM_USB_CHAN_OUT=2
|
||||||
|
-DNUM_USB_CHAN_IN=0
|
||||||
|
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
|
||||||
|
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
|
||||||
|
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
|
||||||
|
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
||||||
|
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
|
||||||
|
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
|
||||||
|
-DNUM_EX3D_CHAN_OUT=2
|
||||||
|
-DINPUT_VOLUME_CONTROL=0
|
||||||
|
-DEQ_EN=1
|
||||||
|
-DOUTPUT_VOLUME_CONTROL=0
|
||||||
|
-DSTEREO_2K
|
||||||
|
-DHID_CONTROLS=1)
|
||||||
|
|
||||||
|
set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
-DI2S_CHANS_ADC=2
|
-DI2S_CHANS_ADC=2
|
||||||
-DAUDIO_CLASS=1
|
-DAUDIO_CLASS=1
|
||||||
-DMIN_FREQ=48000
|
-DMIN_FREQ=48000
|
||||||
-DMAX_FREQ=48000
|
-DMAX_FREQ=48000
|
||||||
-DUSE_EX3D
|
-DUSE_EX3D
|
||||||
-DMIXER=0
|
-DMIXER=0
|
||||||
-DAIZIP_DNR=0 #-ldnr_50ms
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
-llib_ex3d_stereo_8k
|
-llib_ex3d_stereo_8k
|
||||||
@@ -94,19 +123,19 @@ set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
|||||||
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16
|
||||||
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
|
-DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16
|
||||||
-DNUM_EX3D_CHAN_OUT=2
|
-DNUM_EX3D_CHAN_OUT=2
|
||||||
-DINPUT_VOLUME_CONTROL=0
|
-DINPUT_VOLUME_CONTROL=0
|
||||||
-DOUTPUT_VOLUME_CONTROL=0
|
-DOUTPUT_VOLUME_CONTROL=0
|
||||||
-DSTEREO_8K
|
-DSTEREO_8K
|
||||||
-DHID_CONTROLS=1)
|
-DHID_CONTROLS=1)
|
||||||
|
|
||||||
set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
-DI2S_CHANS_ADC=2
|
-DI2S_CHANS_ADC=2
|
||||||
-DMIN_FREQ=48000
|
-DMIN_FREQ=48000
|
||||||
-DMAX_FREQ=48000
|
-DMAX_FREQ=48000
|
||||||
-DUSE_EX3D
|
-DUSE_EX3D
|
||||||
-DMIXER=0
|
-DMIXER=0
|
||||||
-DAIZIP_DNR=0 #-ldnr_50ms
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
-llib_ex3d_game
|
-llib_ex3d_game
|
||||||
-DNUM_USB_CHAN_OUT=8
|
-DNUM_USB_CHAN_OUT=8
|
||||||
@@ -114,14 +143,15 @@ set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
|||||||
-DNUM_EX3D_CHAN_OUT=2
|
-DNUM_EX3D_CHAN_OUT=2
|
||||||
-DMIN_VOLUME=0xE000
|
-DMIN_VOLUME=0xE000
|
||||||
-DSPATIAL_GAME
|
-DSPATIAL_GAME
|
||||||
|
-DEQ_EN=1
|
||||||
-DHID_CONTROLS=1)
|
-DHID_CONTROLS=1)
|
||||||
|
|
||||||
set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
-DI2S_CHANS_ADC=2
|
-DI2S_CHANS_ADC=2
|
||||||
-DMIN_FREQ=48000
|
-DMIN_FREQ=48000
|
||||||
-DMAX_FREQ=48000
|
-DMAX_FREQ=48000
|
||||||
-DUSE_EX3D
|
-DUSE_EX3D
|
||||||
-DMIXER=0
|
-DMIXER=0
|
||||||
-DAIZIP_DNR=0 #-ldnr_50ms
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
-llib_ex3d_music
|
-llib_ex3d_music
|
||||||
-DNUM_USB_CHAN_OUT=8
|
-DNUM_USB_CHAN_OUT=8
|
||||||
@@ -130,28 +160,29 @@ set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
|||||||
-DMIN_VOLUME=0xE000
|
-DMIN_VOLUME=0xE000
|
||||||
-DSPATIAL_MUSIC
|
-DSPATIAL_MUSIC
|
||||||
-DHID_CONTROLS=1)
|
-DHID_CONTROLS=1)
|
||||||
|
|
||||||
set(APP_COMPILER_FLAGS_ex3d_71_movie ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
set(APP_COMPILER_FLAGS_ex3d_71_movie ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
-DI2S_CHANS_ADC=2
|
-DI2S_CHANS_ADC=2
|
||||||
-DMIN_FREQ=48000
|
-DMIN_FREQ=48000
|
||||||
-DMAX_FREQ=48000
|
-DMAX_FREQ=48000
|
||||||
-DUSE_EX3D
|
-DUSE_EX3D
|
||||||
-DMIXER=0
|
-DMIXER=0
|
||||||
-DAIZIP_DNR=0 #-ldnr_50ms
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
-llib_ex3d_movie
|
-llib_ex3d_movie
|
||||||
-DNUM_USB_CHAN_OUT=8
|
-DNUM_USB_CHAN_OUT=8
|
||||||
-DNUM_USB_CHAN_IN=2
|
-DNUM_USB_CHAN_IN=2
|
||||||
-DNUM_EX3D_CHAN_OUT=2
|
-DNUM_EX3D_CHAN_OUT=2
|
||||||
-DMIN_VOLUME=0xE000
|
-DMIN_VOLUME=0xE000
|
||||||
|
-DEQ_EN=1
|
||||||
-DSPATIAL_MOVIE
|
-DSPATIAL_MOVIE
|
||||||
-DHID_CONTROLS=1)
|
-DHID_CONTROLS=1)
|
||||||
|
|
||||||
set(APP_COMPILER_FLAGS_ex3d_71_drama ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
set(APP_COMPILER_FLAGS_ex3d_71_drama ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||||
-DI2S_CHANS_ADC=2
|
-DI2S_CHANS_ADC=2
|
||||||
-DMIN_FREQ=48000
|
-DMIN_FREQ=48000
|
||||||
-DMAX_FREQ=48000
|
-DMAX_FREQ=48000
|
||||||
-DUSE_EX3D
|
-DUSE_EX3D
|
||||||
-DMIXER=0
|
-DMIXER=0
|
||||||
-DAIZIP_DNR=0 #-ldnr_50ms
|
-DAIZIP_DNR=0 #-ldnr_50ms
|
||||||
-llib_ex3d_drama
|
-llib_ex3d_drama
|
||||||
-DNUM_USB_CHAN_OUT=8
|
-DNUM_USB_CHAN_OUT=8
|
||||||
|
|||||||
@@ -25,6 +25,12 @@
|
|||||||
// 改动原因:添加user_func.h头文件,用于调用save_value和load_value函数保存/加载模式到/从flash
|
// 改动原因:添加user_func.h头文件,用于调用save_value和load_value函数保存/加载模式到/从flash
|
||||||
extern void save_value(unsigned char *path, unsigned char value);
|
extern void save_value(unsigned char *path, unsigned char value);
|
||||||
extern unsigned char load_value(unsigned char *path);
|
extern unsigned char load_value(unsigned char *path);
|
||||||
|
// 改动原因:添加g_host_os外部声明,用于检测主机操作系统类型(Windows或非Windows)
|
||||||
|
extern unsigned g_host_os; // 1 -> Windows, 2 -> Others
|
||||||
|
extern void device_reboot(void);
|
||||||
|
unsigned g_windows_detect_done = 0;
|
||||||
|
unsigned g_ex3d_key_verified = 0;
|
||||||
|
enum { OS_WIN = 1, OS_OTHERS = 2 };
|
||||||
|
|
||||||
|
|
||||||
chanend_t uc_ex3d_to_ubm, uc_eq_data;
|
chanend_t uc_ex3d_to_ubm, uc_eq_data;
|
||||||
@@ -70,11 +76,11 @@ void SetEqDataChan (chanend_t c) {
|
|||||||
void key_receiver(chanend_t c)
|
void key_receiver(chanend_t c)
|
||||||
{
|
{
|
||||||
debug_printf("===> key_receiver\n");
|
debug_printf("===> key_receiver\n");
|
||||||
|
// tile0
|
||||||
// tile0
|
|
||||||
// load the license key
|
// load the license key
|
||||||
// This function must be called before audio_ex3d_activate_key.
|
// This function must be called before audio_ex3d_activate_key.
|
||||||
audio_ex3d_load_key(c);
|
audio_ex3d_load_key(c);
|
||||||
|
SET_SHARED_GLOBAL(g_ex3d_key_verified, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void key_sender(chanend_t c)
|
void key_sender(chanend_t c)
|
||||||
@@ -691,8 +697,6 @@ void hid_update(unsigned char hid_data) {
|
|||||||
#define KEY_POLLING_INTERVAL 10000000L // 100ms polling interval
|
#define KEY_POLLING_INTERVAL 10000000L // 100ms polling interval
|
||||||
#define HOLD_THRESHOLD 20 // time = HOLD_THRESHOLD * KEY_POLLING_INTERVAL = 2000ms
|
#define HOLD_THRESHOLD 20 // time = HOLD_THRESHOLD * KEY_POLLING_INTERVAL = 2000ms
|
||||||
// 改动原因:添加LED闪烁相关宏定义,用于长按时直接循环闪烁3次
|
// 改动原因:添加LED闪烁相关宏定义,用于长按时直接循环闪烁3次
|
||||||
#define BLINK_ON_INTERVAL 2 // LED闪烁亮持续时间:2 * 100ms = 200ms
|
|
||||||
#define BLINK_OFF_INTERVAL 2 // LED闪烁灭持续时间:2 * 100ms = 200ms
|
|
||||||
#define BLINK_COUNT 3 // LED闪烁次数:3次
|
#define BLINK_COUNT 3 // LED闪烁次数:3次
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -708,10 +712,11 @@ void hid_update(unsigned char hid_data) {
|
|||||||
#define GREEN_LED_PIN 1 // DNR LED (绿色LED) - bit 1 of leds2_val, 0b11111101
|
#define GREEN_LED_PIN 1 // DNR LED (绿色LED) - bit 1 of leds2_val, 0b11111101
|
||||||
#define BLUE_LED_PIN 0 // 3D LED (蓝色LED) - bit 0 of leds2_val, 0b11111110
|
#define BLUE_LED_PIN 0 // 3D LED (蓝色LED) - bit 0 of leds2_val, 0b11111110
|
||||||
|
|
||||||
// 改动原因:定义模式切换标志值,用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K之间循环切换
|
// 改动原因:定义模式切换标志值,用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K、UAC1之间循环切换
|
||||||
#define MODE_STEREO_2K USB_IN_FLAG // STEREO_2K模式标志
|
#define MODE_STEREO_2K UAC1_IN_FLAG //4 STEREO_2K模式标志
|
||||||
#define MODE_SPATIAL_GAME COAX_IN_FLAG // SPATIAL_GAME模式标志
|
#define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志
|
||||||
#define MODE_SPATIAL_MOVIE OPT_IN_FLAG // SPATIAL_MOVIE模式标志
|
#define MODE_SPATIAL_MOVIE OPT_IN_FLAG // 3 SPATIAL_MOVIE模式标志
|
||||||
|
#define MODE_UAC1 USB_IN_FLAG // 2 UAC1模式标志
|
||||||
|
|
||||||
//Tile 1
|
//Tile 1
|
||||||
void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData)
|
void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData)
|
||||||
@@ -732,9 +737,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
// 改动原因:添加LED闪烁相关变量,用于保存原始LED状态
|
// 改动原因:添加LED闪烁相关变量,用于保存原始LED状态
|
||||||
static uint8_t saved_leds2_val = 0; // 保存原始leds2_val状态
|
static uint8_t saved_leds2_val = 0; // 保存原始leds2_val状态
|
||||||
static uint8_t saved_leds1_val = 0; // 保存原始leds1_val状态
|
static uint8_t saved_leds1_val = 0; // 保存原始leds1_val状态
|
||||||
// 改动原因:添加模式变量,用于存储从button_task接收的模式值,判断是否在无音效模式
|
// 改动原因:添加模式变量,用于存储从button_task接收的模式值,判断是否在无音效模式或UAC1模式
|
||||||
static unsigned game_mode_t1 = 0; // tile1上的模式值,用于判断是否在无音效模式
|
static unsigned game_mode_t1 = 0; // tile1上的模式值,用于判断是否在无音效模式或UAC1模式
|
||||||
static unsigned is_no_effect_mode = 0; // 是否为无音效模式标志(模式3)
|
static unsigned is_no_effect_mode = 0; // 是否为无音效模式标志(模式3)
|
||||||
|
static unsigned is_uac1_mode = 0; // 是否为UAC1模式标志(模式4)
|
||||||
|
static unsigned actual_mode_for_led = 0; // UAC1模式下的实际模式值(0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE),用于LED闪烁
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
hwtimer_t timer = hwtimer_alloc();
|
hwtimer_t timer = hwtimer_alloc();
|
||||||
// init mic level
|
// init mic level
|
||||||
@@ -749,6 +756,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
// 初始化时先设置默认值,模式值将在event_mic_vol中接收
|
// 初始化时先设置默认值,模式值将在event_mic_vol中接收
|
||||||
// 这样可以避免阻塞按键轮询
|
// 这样可以避免阻塞按键轮询
|
||||||
is_no_effect_mode = 0;
|
is_no_effect_mode = 0;
|
||||||
|
is_uac1_mode = 0;
|
||||||
game_mode_t1 = 0;
|
game_mode_t1 = 0;
|
||||||
debug_printf("hid_button_task init: waiting for mode value from button_task\n");
|
debug_printf("hid_button_task init: waiting for mode value from button_task\n");
|
||||||
|
|
||||||
@@ -781,8 +789,10 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
if (tmp == 0xFE) {
|
if (tmp == 0xFE) {
|
||||||
// 这是模式传输命令
|
// 这是模式传输命令
|
||||||
game_mode_t1 = chan_in_byte(cc_mic_level);
|
game_mode_t1 = chan_in_byte(cc_mic_level);
|
||||||
is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0;
|
is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0; // 模式3为无音效模式
|
||||||
debug_printf("hid_button_task received game_mode: %d (NO_EFFECT=%d) in event_mic_vol\n", game_mode_t1, is_no_effect_mode);
|
is_uac1_mode = (game_mode_t1 == 4) ? 1 : 0; // 模式4为UAC1模式
|
||||||
|
debug_printf("hid_button_task received game_mode: %d (NO_EFFECT=%d, UAC1=%d) in event_mic_vol\n",
|
||||||
|
game_mode_t1, is_no_effect_mode, is_uac1_mode);
|
||||||
|
|
||||||
// 如果是无音效模式,强制禁用3D算法
|
// 如果是无音效模式,强制禁用3D算法
|
||||||
if (is_no_effect_mode) {
|
if (is_no_effect_mode) {
|
||||||
@@ -795,6 +805,41 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
port_out(p_leds, leds1_val);
|
port_out(p_leds, leds1_val);
|
||||||
debug_printf("NO_EFFECT mode: 3D algorithm disabled, WHITE LED (all on)\n");
|
debug_printf("NO_EFFECT mode: 3D algorithm disabled, WHITE LED (all on)\n");
|
||||||
}
|
}
|
||||||
|
// 改动原因:UAC1模式下的等效模式值将在下一个event_mic_vol中通过0xFD命令接收
|
||||||
|
// 模式接收完成后继续,不处理按键
|
||||||
|
} else if (tmp == 0xFD) {
|
||||||
|
// 改动原因:这是UAC1模式下的等效模式值传输命令(0xFD命令 + 等效模式值0-2)
|
||||||
|
if (is_uac1_mode) {
|
||||||
|
actual_mode_for_led = chan_in_byte(cc_mic_level);
|
||||||
|
debug_printf("hid_button_task received actual_mode_for_led: %d (0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE)\n", actual_mode_for_led);
|
||||||
|
|
||||||
|
// 改动原因:如果3D算法是开启状态,根据等效模式值更新LED显示
|
||||||
|
if (is_3d_on == A3D_ON) {
|
||||||
|
if (actual_mode_for_led == 0) {
|
||||||
|
// STEREO_2K等效模式:绿色LED
|
||||||
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
} else if (actual_mode_for_led == 1) {
|
||||||
|
// SPATIAL_GAME等效模式:蓝色LED
|
||||||
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
} else if (actual_mode_for_led == 2) {
|
||||||
|
// SPATIAL_MOVIE等效模式:红色LED
|
||||||
|
leds1_val &= (~1); // Red LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
}
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
debug_printf("UAC1 mode: LED updated to match equivalent mode %d\n", actual_mode_for_led);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 非UAC1模式下不应该收到0xFD命令,忽略
|
||||||
|
debug_printf("WARNING: received 0xFD command but not in UAC1 mode, ignoring\n");
|
||||||
|
chan_in_byte(cc_mic_level); // 读取并丢弃下一个字节
|
||||||
|
}
|
||||||
// 模式接收完成后继续,不处理按键
|
// 模式接收完成后继续,不处理按键
|
||||||
} else {
|
} else {
|
||||||
// 正常的mic level命令处理
|
// 正常的mic level命令处理
|
||||||
@@ -849,8 +894,8 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
|
hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
|
||||||
//uint32_t key_in = port_in_when_pinsneq(p_keys, PORT_UNBUFFERED, last_status);
|
//uint32_t key_in = port_in_when_pinsneq(p_keys, PORT_UNBUFFERED, last_status);
|
||||||
uint32_t key_in = port_in(p_keys);
|
uint32_t key_in = port_in(p_keys);
|
||||||
debug_printf("event_polling: key_in=0x%08X, last_status=0x%08X, is_stable=%d, press_hold_cnt=%d\n",
|
// debug_printf("event_polling: key_in=0x%08X, last_status=0x%08X, is_stable=%d, press_hold_cnt=%d\n",
|
||||||
key_in, last_status, is_stable, press_hold_cnt);
|
// key_in, last_status, is_stable, press_hold_cnt);
|
||||||
if (key_in != last_status) {
|
if (key_in != last_status) {
|
||||||
if ((key_in == 0) && (is_stable)) {
|
if ((key_in == 0) && (is_stable)) {
|
||||||
//pressed
|
//pressed
|
||||||
@@ -883,25 +928,55 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
} else {
|
} else {
|
||||||
if (is_3d_on == A3D_OFF) {
|
if (is_3d_on == A3D_OFF) {
|
||||||
is_3d_on = A3D_ON;
|
is_3d_on = A3D_ON;
|
||||||
|
// 改动原因:UAC1模式下,根据actual_mode_for_led显示对应的LED颜色
|
||||||
|
if (is_uac1_mode) {
|
||||||
|
// UAC1模式:根据等效模式值显示LED
|
||||||
|
if (actual_mode_for_led == 0) {
|
||||||
|
// STEREO_2K等效模式:绿色LED
|
||||||
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
debug_printf("UAC1 mode: 3D ON, STEREO_2K equivalent (GREEN LED)\n");
|
||||||
|
} else if (actual_mode_for_led == 1) {
|
||||||
|
// SPATIAL_GAME等效模式:蓝色LED
|
||||||
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
debug_printf("UAC1 mode: 3D ON, SPATIAL_GAME equivalent (BLUE LED)\n");
|
||||||
|
} else if (actual_mode_for_led == 2) {
|
||||||
|
// SPATIAL_MOVIE等效模式:红色LED
|
||||||
|
leds1_val &= (~1); // Red LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
debug_printf("UAC1 mode: 3D ON, SPATIAL_MOVIE equivalent (RED LED)\n");
|
||||||
|
} else {
|
||||||
|
// 默认:白色LED
|
||||||
|
leds2_val = 0xFC;
|
||||||
|
leds1_val = 0x0;
|
||||||
|
debug_printf("UAC1 mode: 3D ON, unknown equivalent mode, WHITE LED\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 非UAC1模式:根据编译模式显示LED
|
||||||
#if defined (STEREO_2K)
|
#if defined (STEREO_2K)
|
||||||
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
leds1_val |= 1; // Red LED off
|
leds1_val |= 1; // Red LED off
|
||||||
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
||||||
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
#endif
|
#endif
|
||||||
#if defined (SPATIAL_GAME)
|
#if defined (SPATIAL_GAME)
|
||||||
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
||||||
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
leds1_val |= 1; // Red LED off
|
leds1_val |= 1; // Red LED off
|
||||||
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
debug_printf("SPATIAL_GAME mode: setting BLUE LED on, leds2_val before=0x%02X\n", leds2_val | (1<<BLUE_LED_PIN));
|
debug_printf("SPATIAL_GAME mode: setting BLUE LED on, leds2_val before=0x%02X\n", leds2_val | (1<<BLUE_LED_PIN));
|
||||||
#endif
|
#endif
|
||||||
#if defined (SPATIAL_MOVIE)
|
#if defined (SPATIAL_MOVIE)
|
||||||
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
||||||
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
leds1_val &= (~1); // Red LED on
|
leds1_val &= (~1); // Red LED on
|
||||||
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
audio_ex3d_onoff(1);
|
audio_ex3d_onoff(1);
|
||||||
debug_printf("3d on: leds2_val=0x%02X, leds1_val=0x%02X\n", leds2_val, leds1_val);
|
debug_printf("3d on: leds2_val=0x%02X, leds1_val=0x%02X\n", leds2_val, leds1_val);
|
||||||
@@ -917,58 +992,150 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
if ((is_stable == 0) && (press_hold_cnt > 0)) {
|
if ((is_stable == 0) && (press_hold_cnt > 0)) {
|
||||||
press_hold_cnt--;
|
press_hold_cnt--;
|
||||||
if (press_hold_cnt == 0) {
|
if (press_hold_cnt == 0) {
|
||||||
// 改动原因:长按检测到时,根据不同宏定义直接执行LED闪烁3次循环
|
// 改动原因:长按检测到时,在UAC1模式下切换等效模式并保存,其他模式切换固件模式
|
||||||
// 保存当前LED状态
|
// 保存当前LED状态
|
||||||
saved_leds2_val = leds2_val;
|
saved_leds2_val = leds2_val;
|
||||||
saved_leds1_val = leds1_val;
|
saved_leds1_val = leds1_val;
|
||||||
debug_printf("Long press detected, start LED blink\n");
|
debug_printf("Long press detected\n");
|
||||||
|
|
||||||
// 直接在这里循环闪烁3次
|
// 改动原因:在UAC1模式下,长按键切换等效模式(0→1→2→0),不重启设备
|
||||||
for (int i = 0; i < BLINK_COUNT; i++) {
|
#if UAC1_MODE == 1
|
||||||
// LED亮
|
{
|
||||||
#if defined (STEREO_2K)
|
// UAC1模式:循环切换等效模式 0→1→2→0
|
||||||
// STEREO_2K模式:绿色LED闪烁3次
|
// 0=STEREO_2K等效, 1=SPATIAL_GAME等效, 2=SPATIAL_MOVIE等效
|
||||||
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
unsigned old_actual_mode = actual_mode_for_led; // 保存旧值用于日志
|
||||||
leds1_val |= 1; // Red LED off
|
unsigned new_actual_mode = (actual_mode_for_led + 1) % 3; // 循环切换 0→1→2→0
|
||||||
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
actual_mode_for_led = new_actual_mode;
|
||||||
#elif defined (SPATIAL_GAME)
|
|
||||||
// SPATIAL_GAME模式:蓝色LED闪烁3次
|
|
||||||
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
|
||||||
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
|
||||||
leds1_val |= 1; // Red LED off
|
|
||||||
#elif defined (SPATIAL_MOVIE)
|
|
||||||
// SPATIAL_MOVIE模式:红色LED闪烁3次
|
|
||||||
leds1_val &= (~1); // Red LED on
|
|
||||||
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
|
||||||
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
|
||||||
#else
|
|
||||||
// 默认:蓝色LED闪烁3次
|
|
||||||
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
|
||||||
leds1_val |= 1; // Red LED off
|
|
||||||
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
|
||||||
#endif
|
|
||||||
port_out(p_leds2, leds2_val);
|
|
||||||
port_out(p_leds, leds1_val);
|
|
||||||
|
|
||||||
delay_milliseconds(200);
|
debug_printf("UAC1 mode: switching equivalent mode from %d to %d (0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE)\n",
|
||||||
// LED灭
|
old_actual_mode, new_actual_mode);
|
||||||
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
|
||||||
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
|
||||||
leds1_val |= 1; // Red LED off
|
|
||||||
port_out(p_leds2, leds2_val);
|
|
||||||
port_out(p_leds, leds1_val);
|
|
||||||
|
|
||||||
delay_milliseconds(200);
|
// 改动原因:保存新的等效模式值到flash的 "uac1_mode" 文件
|
||||||
|
unsigned char path_uac1[] = "uac1_mode";
|
||||||
|
save_value(path_uac1, (unsigned char)new_actual_mode);
|
||||||
|
printf("Saved uac1_mode %d to flash\n", new_actual_mode);
|
||||||
|
|
||||||
|
// 根据新的等效模式值闪烁对应的LED颜色
|
||||||
|
for (int i = 0; i < BLINK_COUNT; i++) {
|
||||||
|
// LED亮 - 根据新的等效模式值选择颜色
|
||||||
|
if (new_actual_mode == 0) {
|
||||||
|
// STEREO_2K等效模式:绿色LED闪烁
|
||||||
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
} else if (new_actual_mode == 1) {
|
||||||
|
// SPATIAL_GAME等效模式:蓝色LED闪烁
|
||||||
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
} else if (new_actual_mode == 2) {
|
||||||
|
// SPATIAL_MOVIE等效模式:红色LED闪烁
|
||||||
|
leds1_val &= (~1); // Red LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
} else {
|
||||||
|
// 默认:白色LED(所有LED都亮)
|
||||||
|
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on)
|
||||||
|
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on)
|
||||||
|
}
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
|
||||||
|
delay_milliseconds(200);
|
||||||
|
// LED灭
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
|
||||||
|
delay_milliseconds(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 改动原因:UAC1模式下,根据新的等效模式值更新LED显示(如果3D开启)
|
||||||
|
// 如果3D算法是开启状态,根据新的等效模式值显示对应的LED颜色
|
||||||
|
if (is_3d_on == A3D_ON) {
|
||||||
|
if (new_actual_mode == 0) {
|
||||||
|
// STEREO_2K等效模式:绿色LED
|
||||||
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
} else if (new_actual_mode == 1) {
|
||||||
|
// SPATIAL_GAME等效模式:蓝色LED
|
||||||
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
} else if (new_actual_mode == 2) {
|
||||||
|
// SPATIAL_MOVIE等效模式:红色LED
|
||||||
|
leds1_val &= (~1); // Red LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
}
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
debug_printf("UAC1 mode: LED updated to match equivalent mode %d\n", new_actual_mode);
|
||||||
|
} else {
|
||||||
|
// 3D关闭状态,恢复白灯
|
||||||
|
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on)
|
||||||
|
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on)
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
debug_printf("UAC1 mode: equivalent mode switched to %d, saved to flash, no firmware restart\n", new_actual_mode);
|
||||||
|
// UAC1模式下不发送0xffffffff,不切换固件模式
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
// 恢复原始LED状态
|
{
|
||||||
leds2_val = saved_leds2_val;
|
// 非UAC1模式:正常切换模式(原有逻辑)
|
||||||
leds1_val = saved_leds1_val;
|
// 直接在这里循环闪烁3次
|
||||||
port_out(p_leds2, leds2_val);
|
for (int i = 0; i < BLINK_COUNT; i++) {
|
||||||
port_out(p_leds, leds1_val);
|
// LED亮
|
||||||
debug_printf("LED blink completed\n");
|
#if defined (STEREO_2K)
|
||||||
unsigned endData[1] = {0xffffffff};
|
// STEREO_2K模式:绿色LED闪烁3次
|
||||||
chan_out_word(c_hidSendData, endData[0]);
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
#elif defined (SPATIAL_GAME)
|
||||||
|
// SPATIAL_GAME模式:蓝色LED闪烁3次
|
||||||
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
#elif defined (SPATIAL_MOVIE)
|
||||||
|
// SPATIAL_MOVIE模式:红色LED闪烁3次
|
||||||
|
leds1_val &= (~1); // Red LED on
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
#else
|
||||||
|
// 默认:蓝色LED闪烁3次
|
||||||
|
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
#endif
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
|
||||||
|
delay_milliseconds(100);
|
||||||
|
// LED灭
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
|
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
|
||||||
|
leds1_val |= 1; // Red LED off
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
|
||||||
|
delay_milliseconds(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 恢复原始LED状态
|
||||||
|
leds2_val = saved_leds2_val;
|
||||||
|
leds1_val = saved_leds1_val;
|
||||||
|
port_out(p_leds2, leds2_val);
|
||||||
|
port_out(p_leds, leds1_val);
|
||||||
|
debug_printf("LED blink completed, mode switch will happen\n");
|
||||||
|
unsigned endData[1] = {0xffffffff};
|
||||||
|
chan_out_word(c_hidSendData, endData[0]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -993,101 +1160,135 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level)
|
|||||||
int debounce_cnt = 0;
|
int debounce_cnt = 0;
|
||||||
static unsigned isMute = 0;
|
static unsigned isMute = 0;
|
||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
|
|
||||||
#if (HID_CONTROLS == 1)
|
#if (HID_CONTROLS == 1)
|
||||||
unsigned hidData0;
|
unsigned hidData0;
|
||||||
#endif
|
#endif
|
||||||
|
unsigned ex3d_key_verified;
|
||||||
// 改动原因:在button_task初始化时,从flash加载保存的模式,检测当前模式是否匹配,如不匹配则切换
|
|
||||||
delay_milliseconds(300);
|
delay_milliseconds(300);
|
||||||
|
#if 0
|
||||||
|
GET_SHARED_GLOBAL(ex3d_key_verified, g_ex3d_key_verified);
|
||||||
|
|
||||||
|
while (ex3d_key_verified == 0) {
|
||||||
|
delay_milliseconds(1);
|
||||||
|
GET_SHARED_GLOBAL(ex3d_key_verified, g_ex3d_key_verified);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
printf("button task start\n");
|
||||||
|
|
||||||
|
// 改动原因:区分Windows模式和UAC1模式,分别从不同的flash文件加载
|
||||||
|
// Windows模式:从 "game_mode" 加载(模式值 0-3)
|
||||||
|
// UAC1模式:从 "uac1_mode" 加载(等效模式值 0-2)
|
||||||
|
unsigned char saved_mode;
|
||||||
|
unsigned char saved_uac1_mode = 0;
|
||||||
unsigned char path[] = "game_mode";
|
unsigned char path[] = "game_mode";
|
||||||
unsigned char saved_mode = load_value(path);
|
|
||||||
|
|
||||||
// 检测当前编译时的模式(通过编译宏)
|
unsigned host_os;
|
||||||
unsigned char current_compiled_mode;
|
GET_SHARED_GLOBAL(host_os, g_host_os);
|
||||||
#if defined(STEREO_2K)
|
|
||||||
current_compiled_mode = 0; // STEREO_2K
|
#if defined(UAC1_MODE)
|
||||||
debug_printf("Current compiled mode: STEREO_2K (0)\n");
|
// 改动原因:UAC1模式下,从 "uac1_mode" 加载等效模式值(0-2),并设置为模式4
|
||||||
#elif defined(SPATIAL_GAME)
|
unsigned char path_uac1[] = "uac1_mode";
|
||||||
current_compiled_mode = 1; // SPATIAL_GAME
|
saved_uac1_mode = load_value(path_uac1);
|
||||||
debug_printf("Current compiled mode: SPATIAL_GAME (1)\n");
|
if (saved_uac1_mode == 255) {
|
||||||
#elif defined(SPATIAL_MOVIE)
|
saved_uac1_mode = 0; // 默认STEREO_2K等效模式
|
||||||
current_compiled_mode = 2; // SPATIAL_MOVIE
|
save_value(path_uac1, saved_uac1_mode);
|
||||||
debug_printf("Current compiled mode: SPATIAL_MOVIE (2)\n");
|
}
|
||||||
|
saved_mode = 4; // UAC1模式固定为4
|
||||||
|
debug_printf("UAC1 mode: loaded uac1_mode=%d from flash\n", saved_uac1_mode);
|
||||||
#else
|
#else
|
||||||
current_compiled_mode = 255; // 未知模式
|
// 改动原因:Windows模式下,从 "game_mode" 加载模式值(0-3)
|
||||||
debug_printf("Current compiled mode: UNKNOWN\n");
|
saved_mode = load_value(path);
|
||||||
|
if (saved_mode == 255) {
|
||||||
|
// 如果文件不存在,根据编译模式设置默认值
|
||||||
|
#if defined(STEREO_2K)
|
||||||
|
saved_mode = 0;
|
||||||
|
#elif defined(SPATIAL_GAME)
|
||||||
|
saved_mode = 1;
|
||||||
|
#elif defined(SPATIAL_MOVIE)
|
||||||
|
saved_mode = 2;
|
||||||
|
#else
|
||||||
|
saved_mode = 0;
|
||||||
|
#endif
|
||||||
|
save_value(path, saved_mode);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 如果加载的模式值无效(255表示文件不存在或读取失败),使用当前编译模式
|
if (host_os == OS_OTHERS) {
|
||||||
if (saved_mode == 255) {
|
// 改动原因:检测到非Windows系统,切换到UAC1模式
|
||||||
saved_mode = current_compiled_mode;
|
debug_printf("Detected non-Windows OS (OS_OTHERS), switching to UAC1 mode\n");
|
||||||
// 保存当前编译模式到flash
|
SetRoleSwitchFlag(MODE_UAC1);
|
||||||
SET_SHARED_GLOBAL(g_game_mode, saved_mode);
|
debug_printf("Set role switch flag: 0x%04X (UAC1), device will restart\n", MODE_UAC1);
|
||||||
save_value(path, saved_mode);
|
// 设备会重启,退出函数
|
||||||
debug_printf("No saved mode found, using current compiled mode %d\n", saved_mode);
|
return;
|
||||||
} else {
|
|
||||||
debug_printf("Loaded saved mode from flash: %d\n", saved_mode);
|
|
||||||
// 更新g_game_mode为保存的模式
|
|
||||||
SET_SHARED_GLOBAL(g_game_mode, saved_mode);
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
// 改动原因:模式3是无音效模式,使用STEREO_2K固件但算法始终无效
|
printf("Detected Windows OS (OS_WIN)\n");
|
||||||
// 检查保存的模式是否为无音效模式(模式3),如果是且当前不是STEREO_2K,需要切换到STEREO_2K
|
#if UAC1_MODE == 1
|
||||||
if (saved_mode == 3) {
|
// 改动原因:Windows模式下,检查当前编译模式是否与保存的模式匹配
|
||||||
// 无音效模式需要使用STEREO_2K固件
|
unsigned need_reboot = 0;
|
||||||
if (current_compiled_mode != 0) {
|
#if defined(STEREO_2K)
|
||||||
debug_printf("Saved mode is NO_EFFECT(3), need STEREO_2K firmware, switching...\n");
|
if ((saved_mode != 255) && (saved_mode != 0) && (saved_mode != 3)) {
|
||||||
SetRoleSwitchFlag(MODE_STEREO_2K);
|
need_reboot = 1;
|
||||||
debug_printf("Set role switch flag: 0x%04X, device will restart\n", MODE_STEREO_2K);
|
|
||||||
// 设备会重启,退出函数
|
|
||||||
} else {
|
|
||||||
// 已经在STEREO_2K模式,继续运行(会在hid_button_task中禁用算法)
|
|
||||||
debug_printf("Saved mode is NO_EFFECT(3), already in STEREO_2K firmware\n");
|
|
||||||
}
|
}
|
||||||
} else if (current_compiled_mode != saved_mode && current_compiled_mode != 255) {
|
#endif
|
||||||
// 其他模式不匹配的情况
|
|
||||||
debug_printf("Mode mismatch! Compiled: %d, Saved: %d, switching to saved mode\n",
|
#if defined(SPATIAL_GAME)
|
||||||
current_compiled_mode, saved_mode);
|
if ((saved_mode != 255) && (saved_mode != 1)) {
|
||||||
|
need_reboot = 1;
|
||||||
// 确定要切换到的模式标志
|
|
||||||
unsigned mode_flag;
|
|
||||||
if (saved_mode == 0) {
|
|
||||||
mode_flag = MODE_STEREO_2K;
|
|
||||||
debug_printf("Switching to STEREO_2K\n");
|
|
||||||
} else if (saved_mode == 1) {
|
|
||||||
mode_flag = MODE_SPATIAL_GAME;
|
|
||||||
debug_printf("Switching to SPATIAL_GAME\n");
|
|
||||||
} else if (saved_mode == 2) {
|
|
||||||
mode_flag = MODE_SPATIAL_MOVIE;
|
|
||||||
debug_printf("Switching to SPATIAL_MOVIE\n");
|
|
||||||
} else {
|
|
||||||
// 无效模式,不切换
|
|
||||||
debug_printf("Invalid saved mode %d, keeping current mode\n", saved_mode);
|
|
||||||
mode_flag = 0;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (mode_flag != 0) {
|
|
||||||
// 设置角色切换标志,触发模式切换
|
#if defined(SPATIAL_MOVIE)
|
||||||
SetRoleSwitchFlag(mode_flag);
|
if ((saved_mode != 255) && (saved_mode != 2)) {
|
||||||
debug_printf("Set role switch flag: 0x%04X, device will restart\n", mode_flag);
|
need_reboot = 1;
|
||||||
// 注意:设置标志后设备会重启,所以这里会退出当前函数
|
|
||||||
}
|
}
|
||||||
} else {
|
#endif
|
||||||
debug_printf("Mode match! Current: %d, Saved: %d, no switch needed\n",
|
|
||||||
current_compiled_mode, saved_mode);
|
if (need_reboot) {
|
||||||
|
switch (saved_mode) {
|
||||||
|
case 0:
|
||||||
|
SetRoleSwitchFlag(MODE_STEREO_2K);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
SetRoleSwitchFlag(MODE_SPATIAL_GAME);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SetRoleSwitchFlag(MODE_SPATIAL_MOVIE);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
SetRoleSwitchFlag(MODE_STEREO_2K);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SetRoleSwitchFlag(MODE_STEREO_2K);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("Switch to saved mode: %d, device will restart.\n", saved_mode);
|
||||||
|
delay_milliseconds(5);
|
||||||
|
device_reboot();
|
||||||
|
while (1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_windows_detect_done = 1;
|
||||||
|
|
||||||
// 改动原因:通过cc_mic_level channel将模式值发送到hid_button_task(运行在tile1)
|
// 改动原因:更新全局变量g_game_mode为保存的模式值
|
||||||
// 使用特殊命令值来传输模式值,避免干扰HID数据流
|
SET_SHARED_GLOBAL(g_game_mode, saved_mode);
|
||||||
// 使用一个特殊命令:0xFE表示模式传输,然后是模式值
|
|
||||||
// 但cc_mic_level是byte channel,所以需要分字节发送
|
// 改动原因:通过cc_mic_level channel发送模式值到hid_button_task
|
||||||
// 或者我们可以使用一个特殊的mic level命令值
|
// 发送格式:0xFE(命令) + mode_value(模式值)
|
||||||
// 让我查看mic level命令的定义...
|
|
||||||
// 实际上,我们可以使用一个保留的命令值,比如0xFE
|
|
||||||
// 但由于这是byte channel,我们发送:0xFE(命令)+ saved_mode(值)
|
|
||||||
chan_out_byte(cc_mic_level, 0xFE); // 模式传输命令
|
chan_out_byte(cc_mic_level, 0xFE); // 模式传输命令
|
||||||
chan_out_byte(cc_mic_level, saved_mode); // 模式值
|
chan_out_byte(cc_mic_level, saved_mode); // 模式值(Windows: 0-3, UAC1: 4)
|
||||||
debug_printf("Sent game_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode);
|
debug_printf("Sent game_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode);
|
||||||
|
|
||||||
|
#if defined(UAC1_MODE)
|
||||||
|
// 改动原因:UAC1模式下,还需要发送等效模式值(0-2)给hid_button_task用于LED显示
|
||||||
|
chan_out_byte(cc_mic_level, 0xFD); // UAC1等效模式传输命令
|
||||||
|
chan_out_byte(cc_mic_level, saved_uac1_mode); // UAC1等效模式值(0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE)
|
||||||
|
debug_printf("Sent uac1_mode %d to hid_button_task via cc_mic_level channel\n", saved_uac1_mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
port_enable(p_ctrl_keys);
|
port_enable(p_ctrl_keys);
|
||||||
port_ctrl_keys = port_in(p_ctrl_keys);
|
port_ctrl_keys = port_in(p_ctrl_keys);
|
||||||
@@ -1117,40 +1318,47 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level)
|
|||||||
if (hidData0 == 0xffffffff) {
|
if (hidData0 == 0xffffffff) {
|
||||||
printf("receive end data\n");
|
printf("receive end data\n");
|
||||||
// 改动原因:收到0xffffffff后,循环切换模式并保存到flash,然后设置切换标志
|
// 改动原因:收到0xffffffff后,循环切换模式并保存到flash,然后设置切换标志
|
||||||
|
// 注意:UAC1模式下不会收到此命令(hid_button_task不发送)
|
||||||
// 读取当前g_game_mode值
|
// 读取当前g_game_mode值
|
||||||
unsigned current_mode;
|
unsigned current_mode;
|
||||||
GET_SHARED_GLOBAL(current_mode, g_game_mode);
|
GET_SHARED_GLOBAL(current_mode, g_game_mode);
|
||||||
|
|
||||||
// 改动原因:添加无音效模式(模式3)到循环切换中
|
// 改动原因:Windows模式下只循环切换0→1→2→3→0(不包括UAC1模式4)
|
||||||
// 循环切换模式:0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(SPATIAL_MOVIE) -> 3(无音效) -> 0
|
// 循环切换模式:0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(SPATIAL_MOVIE) -> 3(无音效) -> 0
|
||||||
unsigned new_mode;
|
unsigned new_mode;
|
||||||
unsigned mode_flag;
|
unsigned mode_flag;
|
||||||
|
#if UAC1_MODE != 1
|
||||||
if (current_mode == 0) {
|
if (current_mode == 0) {
|
||||||
// 当前是STEREO_2K,切换到SPATIAL_GAME
|
// 当前是STEREO_2K,切换到SPATIAL_GAME
|
||||||
new_mode = 1;
|
new_mode = 1;
|
||||||
mode_flag = MODE_SPATIAL_GAME;
|
mode_flag = MODE_SPATIAL_GAME;
|
||||||
printf("Switching from STEREO_2K to SPATIAL_GAME\n");
|
printf("Switching from STEREO_2K (0) to SPATIAL_GAME (1)\n");
|
||||||
} else if (current_mode == 1) {
|
} else if (current_mode == 1) {
|
||||||
// 当前是SPATIAL_GAME,切换到SPATIAL_MOVIE
|
// 当前是SPATIAL_GAME,切换到SPATIAL_MOVIE
|
||||||
new_mode = 2;
|
new_mode = 2;
|
||||||
mode_flag = MODE_SPATIAL_MOVIE;
|
mode_flag = MODE_SPATIAL_MOVIE;
|
||||||
printf("Switching from SPATIAL_GAME to SPATIAL_MOVIE\n");
|
printf("Switching from SPATIAL_GAME (1) to SPATIAL_MOVIE (2)\n");
|
||||||
} else if (current_mode == 2) {
|
} else if (current_mode == 2) {
|
||||||
// 当前是SPATIAL_MOVIE,切换到无音效模式
|
// 当前是SPATIAL_MOVIE,切换到无音效模式
|
||||||
new_mode = 3;
|
new_mode = 3;
|
||||||
mode_flag = MODE_STEREO_2K; // 无音效模式使用STEREO_2K固件
|
mode_flag = MODE_STEREO_2K; // 无音效模式使用STEREO_2K固件
|
||||||
printf("Switching from SPATIAL_MOVIE to NO_EFFECT (3)\n");
|
printf("Switching from SPATIAL_MOVIE (2) to NO_EFFECT (3)\n");
|
||||||
} else {
|
} else if (current_mode == 3) {
|
||||||
// 当前是无音效模式(3)或其他,切换到STEREO_2K
|
// 当前是无音效模式,切换回STEREO_2K(完成循环)
|
||||||
new_mode = 0;
|
new_mode = 0;
|
||||||
mode_flag = MODE_STEREO_2K;
|
mode_flag = MODE_STEREO_2K;
|
||||||
printf("Switching to STEREO_2K\n");
|
printf("Switching from NO_EFFECT (3) to STEREO_2K (0)\n");
|
||||||
|
} else {
|
||||||
|
// 其他模式值(如4=UAC1),不应该在这里处理,但为了安全,重置为0
|
||||||
|
new_mode = 0;
|
||||||
|
mode_flag = MODE_STEREO_2K;
|
||||||
|
printf("Unknown mode %d, resetting to STEREO_2K (0)\n", current_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新g_game_mode
|
// 更新g_game_mode
|
||||||
SET_SHARED_GLOBAL(g_game_mode, new_mode);
|
SET_SHARED_GLOBAL(g_game_mode, new_mode);
|
||||||
|
|
||||||
// 保存新的模式值到flash
|
// 改动原因:保存新的模式值到flash的 "game_mode" 文件(Windows模式专用)
|
||||||
unsigned char path[] = "game_mode";
|
unsigned char path[] = "game_mode";
|
||||||
save_value(path, (unsigned char)new_mode);
|
save_value(path, (unsigned char)new_mode);
|
||||||
printf("Saved game_mode %d to flash\n", new_mode);
|
printf("Saved game_mode %d to flash\n", new_mode);
|
||||||
@@ -1158,7 +1366,10 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level)
|
|||||||
// 设置角色切换标志,触发模式切换
|
// 设置角色切换标志,触发模式切换
|
||||||
SetRoleSwitchFlag(mode_flag);
|
SetRoleSwitchFlag(mode_flag);
|
||||||
printf("Set role switch flag: 0x%04X\n", mode_flag);
|
printf("Set role switch flag: 0x%04X\n", mode_flag);
|
||||||
|
delay_milliseconds(5);
|
||||||
|
device_reboot();
|
||||||
|
while (1);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) {
|
for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ extern unsigned int g_saved_eq_mode; // 改动原因:添加保存模式外部
|
|||||||
extern void debug_print_eq_params(unsigned sample_freq);
|
extern void debug_print_eq_params(unsigned sample_freq);
|
||||||
extern uint32_t get_reference_time(void);
|
extern uint32_t get_reference_time(void);
|
||||||
extern void update_eq_post_gain(void);
|
extern void update_eq_post_gain(void);
|
||||||
|
extern unsigned g_windows_detect_done;
|
||||||
|
|
||||||
#pragma unsafe arrays
|
#pragma unsafe arrays
|
||||||
void dsp_core0(void)
|
void dsp_core0(void)
|
||||||
@@ -53,6 +54,12 @@ void dsp_core0(void)
|
|||||||
// EQ Flash存储初始化标志
|
// EQ Flash存储初始化标志
|
||||||
|
|
||||||
delay_milliseconds(100);
|
delay_milliseconds(100);
|
||||||
|
unsigned windows_detect_done;
|
||||||
|
GET_SHARED_GLOBAL(windows_detect_done, g_windows_detect_done);
|
||||||
|
while (windows_detect_done == 0) {
|
||||||
|
asm("nop");
|
||||||
|
GET_SHARED_GLOBAL(windows_detect_done, g_windows_detect_done);
|
||||||
|
}
|
||||||
|
|
||||||
#if EQ_EN
|
#if EQ_EN
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ lfs_file_t file;
|
|||||||
swlock_t lfs_lock = SWLOCK_INITIAL_VALUE;
|
swlock_t lfs_lock = SWLOCK_INITIAL_VALUE;
|
||||||
|
|
||||||
static rtos_qspi_flash_t qspi_flash_ctx_s;
|
static rtos_qspi_flash_t qspi_flash_ctx_s;
|
||||||
#define FLASH_CLKBLK XS1_CLKBLK_1
|
#define FLASH_CLKBLK XS1_CLKBLK_3
|
||||||
#ifndef FS_BASE_ADDR
|
#ifndef FS_BASE_ADDR
|
||||||
#define FS_BASE_ADDR 0x180000
|
#define FS_BASE_ADDR 0x180000
|
||||||
#endif
|
#endif
|
||||||
@@ -102,7 +102,7 @@ void lfs_deinit(void) {
|
|||||||
swlock_release(&lfs_lock);
|
swlock_release(&lfs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma stackfunction 10480
|
#pragma stackfunction 5480
|
||||||
void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned size)
|
void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned size)
|
||||||
{
|
{
|
||||||
swlock_acquire(&lfs_lock);
|
swlock_acquire(&lfs_lock);
|
||||||
@@ -130,7 +130,7 @@ void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned si
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma stackfunction 10480
|
#pragma stackfunction 5480
|
||||||
void lfs_write_config(unsigned char * config, unsigned char * buffer, unsigned size)
|
void lfs_write_config(unsigned char * config, unsigned char * buffer, unsigned size)
|
||||||
{
|
{
|
||||||
swlock_acquire(&lfs_lock);
|
swlock_acquire(&lfs_lock);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ set(APP_DEPENDENT_MODULES "lib_xua(5.0.0)"
|
|||||||
"lib_i2s(5.1.0)"
|
"lib_i2s(5.1.0)"
|
||||||
"lib_audio_dsp(1.4.0)"
|
"lib_audio_dsp(1.4.0)"
|
||||||
"lib_agc"
|
"lib_agc"
|
||||||
|
"lib_roleswitch"
|
||||||
)
|
)
|
||||||
|
|
||||||
include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib_ex3d/lib_ex3d/api")
|
include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib_ex3d/lib_ex3d/api")
|
||||||
|
|||||||
Reference in New Issue
Block a user