@@ -1,4 +1,4 @@
# define DEBUG_PRINT_ENABLE 1
# define DEBUG_PRINT_ENABLE 0
# include <platform.h>
# include <xs1.h>
# include <stdlib.h>
@@ -20,7 +20,11 @@
# include "xua_hid_report.h"
# include "xc_ptr.h"
# include "dnr_dsp_buf.h"
# include "roleswitchflag.h"
# include "debug_print.h"
// 改动原因: 添加user_func.h头文件, 用于调用save_value和load_value函数保存/加载模式到/从flash
extern void save_value ( unsigned char * path , unsigned char value ) ;
extern unsigned char load_value ( unsigned char * path ) ;
chanend_t uc_ex3d_to_ubm , uc_eq_data ;
@@ -45,6 +49,8 @@ unsigned g_dnr_on_off_t1 = DNR_OFF; // Default DNR off
# define MUTE_OFF 0
unsigned g_mute_on_off_t1 = MUTE_ON ;
unsigned g_game_mode = 0 ;
// On UserBufferManagement Tile (1)
static unsigned frame_index = 0 ;
//static unsigned dnr_frame_idx = 0;
@@ -562,7 +568,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
if ( CMD_SET ( CMD_EXPAND_GAIN ) = = command_code ) {
int32_t idBGain ;
memcpy ( & idBGain , & pRcvBuf [ 1 ] , 4 ) ;
printf ( " Set CMD_EXPAND_GAIN : %d \r \n " , idBGain ) ;
debug_ printf( " Set CMD_EXPAND_GAIN : %d \r \n " , idBGain ) ;
if ( ( 0 < = idBGain ) & & ( idBGain < = 20 ) ) {
Ex3dExpandGain = idBGain ;
EX3DAudio_SetExpandGain ( Ex3dExpandGain ) ;
@@ -570,7 +576,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
pSendBuf [ idx ] = 0xFFFFFFFF ;
}
} else { // Get
printf ( " Get CMD_EXPAND_GAIN : %d \r \n " , Ex3dExpandGain ) ;
debug_ printf( " Get CMD_EXPAND_GAIN : %d \r \n " , Ex3dExpandGain ) ;
memcpy ( & pSendBuf [ idx ] , & Ex3dExpandGain , 4 ) ;
}
break ;
@@ -579,7 +585,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
if ( CMD_SET ( CMD_REDUCE_GAIN ) = = command_code ) {
int32_t idBGain ;
memcpy ( & idBGain , & pRcvBuf [ 1 ] , 4 ) ;
printf ( " Set CMD_REDUCE_GAIN : %d \r \n " , idBGain ) ;
debug_ printf( " Set CMD_REDUCE_GAIN : %d \r \n " , idBGain ) ;
if ( ( - 20 < = idBGain ) & & ( idBGain < = 0 ) ) {
Ex3dReduceGain = idBGain ;
EX3DAudio_SetReduceGain ( Ex3dReduceGain ) ;
@@ -587,7 +593,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
pSendBuf [ idx ] = 0xFFFFFFFF ;
}
} else { // Get
printf ( " Get CMD_REDUCE_GAIN : %d \r \n " , Ex3dReduceGain ) ;
debug_ printf( " Get CMD_REDUCE_GAIN : %d \r \n " , Ex3dReduceGain ) ;
memcpy ( & pSendBuf [ idx ] , & Ex3dReduceGain , 4 ) ;
}
break ;
@@ -684,6 +690,10 @@ void hid_update(unsigned char hid_data) {
# if defined (PHATEN_GSV2)
# define KEY_POLLING_INTERVAL 10000000L // 100ms polling interval
# define HOLD_THRESHOLD 20 // time = HOLD_THRESHOLD * KEY_POLLING_INTERVAL = 2000ms
// 改动原因: 添加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次
# endif
// add LED flashing when muted
@@ -694,8 +704,14 @@ void hid_update(unsigned char hid_data) {
# define LED_DNR_ON_71_OFF 0b11111101
# define LED_DNR_OFF_71_ON 0b11111110
# define LED_DNR_OFF_71_OFF 0b11111111
# define LED_DNR_PIN 1 //0b11111101
# define LED_3 D_PIN 0 //0b1111111 0
// 改动原因: 将LED引脚宏定义改为更明确的名称, LED_3D_PIN改为BLUE_LED_PIN, LED_DNR_PIN改为GREEN_LED_PIN
# define GREEN_LE D_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
// 改动原因: 定义模式切换标志值, 用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K之间循环切换
# define MODE_STEREO_2K USB_IN_FLAG // STEREO_2K模式标志
# define MODE_SPATIAL_GAME COAX_IN_FLAG // SPATIAL_GAME模式标志
# define MODE_SPATIAL_MOVIE OPT_IN_FLAG // SPATIAL_MOVIE模式标志
//Tile 1
void hid_button_task ( chanend_t cc_mic_level , chanend_t c_hidRcvData , chanend_t c_hidSendData )
@@ -713,6 +729,12 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
uint8_t tmp = 0 ;
static uint8_t is_stable = 1 ;
static uint8_t press_hold_cnt = 0 ;
// 改动原因: 添加LED闪烁相关变量, 用于保存原始LED状态
static uint8_t saved_leds2_val = 0 ; // 保存原始leds2_val状态
static uint8_t saved_leds1_val = 0 ; // 保存原始leds1_val状态
// 改动原因: 添加模式变量, 用于存储从button_task接收的模式值, 判断是否在无音效模式
static unsigned game_mode_t1 = 0 ; // tile1上的模式值, 用于判断是否在无音效模式
static unsigned is_no_effect_mode = 0 ; // 是否为无音效模式标志( 模式3)
int ret = 0 ;
hwtimer_t timer = hwtimer_alloc ( ) ;
// init mic level
@@ -723,13 +745,25 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
SendData [ 0 ] = 1 ;
for ( unsigned char i = 1 ; i < ( HID_MAX_DATA_BYTES / 4 ) ; i + + ) SendData [ i ] = 0 ;
// 改动原因: 从button_task接收模式值( 通过cc_mic_level channel传输)
// 初始化时先设置默认值, 模式值将在event_mic_vol中接收
// 这样可以避免阻塞按键轮询
is_no_effect_mode = 0 ;
game_mode_t1 = 0 ;
debug_printf ( " hid_button_task init: waiting for mode value from button_task \n " ) ;
SET_SHARED_GLOBAL ( g_mic_level_t1 , mic_level ) ;
port_enable ( p_keys ) ;
port_enable ( p_leds ) ;
port_enable ( p_leds2 ) ;
port_out ( p_leds , LED_OFF ) ;
port_out ( p_leds2 , LED_DNR_OFF_71_OFF ) ; // all off
// 改动原因: 初始状态显示白灯( 3D关闭状态) , 所有LED都亮
// 白灯 = 红色LED (bit 0) + 绿色LED (bit 1) + 蓝色LED (bit 0) 都开启
// LED是低电平有效, 所以0=on, 1=off
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_leds , leds1_val ) ;
port_out ( p_leds2 , leds2_val ) ;
debug_printf ( " LED init: WHITE LED (all on), leds2_val=0x%02X, leds1_val=0x%02X \n " , leds2_val , leds1_val ) ;
uint32_t last_status = port_in ( p_keys ) ;
hwtimer_set_trigger_time ( timer , hwtimer_get_time ( timer ) + KEY_POLLING_INTERVAL ) ;
while ( 1 ) {
@@ -742,25 +776,54 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
event_mic_vol :
{
tmp = chan_in_byte ( cc_mic_level ) ;
switch ( tmp ) {
case KEY_MIC_VOL_UP :
ret = i2c_codec_mic_vol_up ( ) ;
break ;
case KEY_MIC_VOL_DN :
ret = i2c_codec_mic_vol_down ( ) ;
break ;
debug_printf ( " event_mic_vol received: 0x%02X \n " , tmp ) ;
// 改动原因: 检查是否是模式传输命令( 0xFE) , 如果是则接收模式值
if ( tmp = = 0xFE ) {
// 这是模式传输命令
game_mode_t1 = chan_in_byte ( cc_mic_level ) ;
is_no_effect_mode = ( game_mode_t1 = = 3 ) ? 1 : 0 ;
debug_printf ( " hid_button_task received game_mode: %d (NO_EFFECT=%d) in event_mic_vol \n " , game_mode_t1 , is_no_effect_mode ) ;
case MUTED_MIC :
SET_SHARED_GLOBAL ( g_mute_on_off_t1 , MUTE_ON ) ;
break ;
// 如果是无音效模式, 强制禁用3D算法
if ( is_no_effect_mode ) {
audio_ex3d_onoff ( 0 ) ;
is_3d_on = A3D_OFF ;
// 无音效模式下一直显示白灯( 所有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 ) ;
debug_printf ( " NO_EFFECT mode: 3D algorithm disabled, WHITE LED (all on) \n " ) ;
}
// 模式接收完成后继续,不处理按键
} else {
// 正常的mic level命令处理
debug_printf ( " Processing mic level command: 0x%02X \n " , tmp ) ;
switch ( tmp ) {
case KEY_MIC_VOL_UP :
ret = i2c_codec_mic_vol_up ( ) ;
debug_printf ( " KEY_MIC_VOL_UP \n " ) ;
break ;
case UNMUTED_MIC :
SET_SHARED_GLOBAL ( g_mute_on_off_t1 , MUTE_OFF ) ;
break ;
case KEY_MIC_VOL_DN :
ret = i2c_codec_mic_vol_down ( ) ;
debug_printf ( " KEY_MIC_VOL_DN \n " ) ;
break ;
case MUTED_MIC :
SET_SHARED_GLOBAL ( g_mute_on_off_t1 , MUTE_ON ) ;
debug_printf ( " MUTED_MIC \n " ) ;
break ;
default :
break ;
case UNMUTED_MIC :
SET_SHARED_GLOBAL ( g_mute_on_off_t1 , MUTE_OFF ) ;
debug_printf ( " UNMUTED_MIC \n " ) ;
break ;
default :
debug_printf ( " Unknown mic level command: 0x%02X \n " , tmp ) ;
break ;
}
}
}
continue ;
@@ -786,6 +849,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 ) ;
//uint32_t key_in = port_in_when_pinsneq(p_keys, PORT_UNBUFFERED, last_status);
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 " ,
key_in , last_status , is_stable , press_hold_cnt ) ;
if ( key_in ! = last_status ) {
if ( ( key_in = = 0 ) & & ( is_stable ) ) {
//pressed
@@ -794,49 +859,116 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else {
is_stable = 1 ;
if ( press_hold_cnt > 0 ) {
if ( is_3d_on = = A3D_ON ) {
// 改动原因: 在无音效模式下, 禁止切换3D功能, LED保持白灯
if ( is_no_effect_mode ) {
debug_printf ( " NO_EFFECT mode: 3D toggle disabled, keeping WHITE LED \n " ) ;
// 在无音效模式下, 按键操作被忽略, 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 ) ;
} else if ( is_3d_on = = A3D_ON ) {
is_3d_on = A3D_OFF ; // turn off
//ver2
leds2_val | = ( 1 < < LED_3D_PIN ) ; // Blue LED off
leds1 _val | = 1 ; // Red LED off
// 改动原因: 3D关闭时显示白灯( 所有LED都亮)
// 白灯 = 红色LED (bit 0) + 绿色LED (bit 1) + 蓝色LED (bit 0) 都开启
leds2 _val = 0xFC ; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色 LED on)
leds1_val = 0x0 ; // 0b00000000: bit 0=0(红色LED on)
audio_ex3d_onoff ( 0 ) ;
debug_printf ( " 3d off\n " ) ;
debug_printf ( " 3d off: WHITE LED (all on), leds2_val=0x%02X, leds1_val=0x%02X \n " , leds2_val , leds1_val ) ;
SET_SHARED_GLOBAL ( g_3d_on_off_t1 , is_3d_on ) ;
port_out ( p_leds2 , leds2_val ) ;
port_out ( p_leds , leds1_val ) ;
debug_printf ( " LEDs updated after 3d off: port_out(p_leds2, 0x%02X), port_out(p_leds, 0x%02X) \n " , leds2_val , leds1_val ) ;
} else {
if ( is_3d_on = = A3D_OFF ) {
is_3d_on = A3D_ON ;
# if defined (STEREO_2K)
leds1 _val & = ( ~ 1 ) ; // Red LED on
leds2_val | = ( 1 < < LED_3D_PIN ) ; // Blue LED off
# else
leds2_val & = ( ~ ( 1 < < LED_3D_PIN ) ) ; // Blue LED on
leds2 _val & = ( ~ ( 1 < < GREEN_LED_PIN ) ) ; // Green LED on
leds1_val | = 1 ; // Red LED off
// 改动原因: 使用更明确的BLUE_LED_PIN宏定义
leds2_val | = ( 1 < < BLUE_LED_PIN ) ; // Blue LED off
# endif
# if defined (SPATIAL_GAME)
// 改动原因: 使用更明确的BLUE_LED_PIN宏定义
leds2_val | = ( 1 < < GREEN_LED_PIN ) ; // Green LED off
leds1_val | = 1 ; // Red LED off
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 ) ) ;
# endif
# if defined (SPATIAL_MOVIE)
// 改动原因: 使用更明确的BLUE_LED_PIN宏定义
leds2_val | = ( 1 < < GREEN_LED_PIN ) ; // Green LED off
leds1_val & = ( ~ 1 ) ; // Red LED on
leds2_val | = ( 1 < < BLUE_LED_PIN ) ; // Blue LED off
# endif
audio_ex3d_onoff ( 1 ) ;
debug_printf ( " 3d on\n " ) ;
debug_printf ( " 3d on: leds2_val=0x%02X, leds1_val=0x%02X \n " , leds2_val , leds1_val ) ;
SET_SHARED_GLOBAL ( g_3d_on_off_t1 , is_3d_on ) ;
port_out ( p_leds2 , leds2_val ) ;
port_out ( p_leds , leds1_val ) ;
debug_printf ( " LEDs updated after 3d on: port_out(p_leds2, 0x%02X), port_out(p_leds, 0x%02X) \n " , leds2_val , leds1_val ) ;
}
}
SET_SHARED_GLOBAL ( g_3d_on_off_t1 , is_3d_on ) ;
port_out ( p_leds2 , leds2_val ) ;
port_out ( p_leds , leds1_val ) ;
}
}
} else {
if ( ( is_stable = = 0 ) & & ( press_hold_cnt > 0 ) ) {
press_hold_cnt - - ;
if ( press_hold_cnt = = 0 ) {
if ( is_dnr_on = = DNR_ON ) {
is_dnr_on = DNR_OFF ;
//ver2
leds2 _val | = ( 1 < < LED_DNR_PIN ) ;
debug_printf ( " dnr off \n " ) ;
} else {
is_dnr_on = DNR_ON ;
//ver2
leds2_val & = ( ~ ( 1 < < LED_DNR_PIN ) ) ;
debug_printf ( " dnr on \n " ) ;
// 改动原因: 长按检测到时, 根据不同宏定义直接执行LED闪烁3次循环
// 保存当前LED状态
saved_leds2_val = leds2_val ;
saved_ leds1 _val = leds1_val ;
debug_printf ( " Long press detected, start LED blink \n " ) ;
// 直接在这里循环闪烁3次
for ( int i = 0 ; i < BLINK_COUNT ; i + + ) {
// LED亮
# if defined (STEREO_2K)
// STEREO_2K模式: 绿色LED闪烁3次
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 ( 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 ) ;
}
SET_SHARED_GLOBAL ( g_dnr_on_off_t1 , is_dnr_on ) ;
// 恢复原始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 \n " ) ;
unsigned endData [ 1 ] = { 0xffffffff } ;
chan_out_word ( c_hidSendData , endData [ 0 ] ) ;
}
}
}
@@ -850,7 +982,8 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
hwtimer_free ( timer ) ;
}
# define KEY_POLLING_INTERVAL 10000000L // 100ms polling interval
void button_task ( chanend_t c_hidSendData )
// 改动原因: 添加cc_mic_level参数, 用于通过channel传输模式值到hid_button_task
void button_task ( chanend_t c_hidSendData , chanend_t cc_mic_level )
{
port_t p_ctrl_keys = XS1_PORT_8C ;
@@ -864,6 +997,98 @@ void button_task(chanend_t c_hidSendData)
unsigned hidData0 ;
# endif
// 改动原因: 在button_task初始化时, 从flash加载保存的模式, 检测当前模式是否匹配, 如不匹配则切换
delay_milliseconds ( 300 ) ;
unsigned char path [ ] = " game_mode " ;
unsigned char saved_mode = load_value ( path ) ;
// 检测当前编译时的模式(通过编译宏)
unsigned char current_compiled_mode ;
# if defined(STEREO_2K)
current_compiled_mode = 0 ; // STEREO_2K
debug_printf ( " Current compiled mode: STEREO_2K (0) \n " ) ;
# elif defined(SPATIAL_GAME)
current_compiled_mode = 1 ; // SPATIAL_GAME
debug_printf ( " Current compiled mode: SPATIAL_GAME (1) \n " ) ;
# elif defined(SPATIAL_MOVIE)
current_compiled_mode = 2 ; // SPATIAL_MOVIE
debug_printf ( " Current compiled mode: SPATIAL_MOVIE (2) \n " ) ;
# else
current_compiled_mode = 255 ; // 未知模式
debug_printf ( " Current compiled mode: UNKNOWN \n " ) ;
# endif
// 如果加载的模式值无效( 255表示文件不存在或读取失败) , 使用当前编译模式
if ( saved_mode = = 255 ) {
saved_mode = current_compiled_mode ;
// 保存当前编译模式到flash
SET_SHARED_GLOBAL ( g_game_mode , saved_mode ) ;
save_value ( path , saved_mode ) ;
debug_printf ( " No saved mode found, using current compiled mode %d \n " , saved_mode ) ;
} else {
debug_printf ( " Loaded saved mode from flash: %d \n " , saved_mode ) ;
// 更新g_game_mode为保存的模式
SET_SHARED_GLOBAL ( g_game_mode , saved_mode ) ;
}
// 改动原因: 模式3是无音效模式, 使用STEREO_2K固件但算法始终无效
// 检查保存的模式是否为无音效模式( 模式3) , 如果是且当前不是STEREO_2K, 需要切换到STEREO_2K
if ( saved_mode = = 3 ) {
// 无音效模式需要使用STEREO_2K固件
if ( current_compiled_mode ! = 0 ) {
debug_printf ( " Saved mode is NO_EFFECT(3), need STEREO_2K firmware, switching... \n " ) ;
SetRoleSwitchFlag ( MODE_STEREO_2K ) ;
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 ) {
// 其他模式不匹配的情况
debug_printf ( " Mode mismatch! Compiled: %d, Saved: %d, switching to saved mode \n " ,
current_compiled_mode , saved_mode ) ;
// 确定要切换到的模式标志
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 ;
}
if ( mode_flag ! = 0 ) {
// 设置角色切换标志,触发模式切换
SetRoleSwitchFlag ( mode_flag ) ;
debug_printf ( " Set role switch flag: 0x%04X, device will restart \n " , mode_flag ) ;
// 注意:设置标志后设备会重启,所以这里会退出当前函数
}
} else {
debug_printf ( " Mode match! Current: %d, Saved: %d, no switch needed \n " ,
current_compiled_mode , saved_mode ) ;
}
// 改动原因: 通过cc_mic_level channel将模式值发送到hid_button_task( 运行在tile1)
// 使用特殊命令值来传输模式值, 避免干扰HID数据流
// 使用一个特殊命令: 0xFE表示模式传输, 然后是模式值
// 但cc_mic_level是byte channel, 所以需要分字节发送
// 或者我们可以使用一个特殊的mic level命令值
// 让我查看mic level命令的定义...
// 实际上, 我们可以使用一个保留的命令值, 比如0xFE
// 但由于这是byte channel, 我们发送: 0xFE( 命令) + saved_mode( 值)
chan_out_byte ( cc_mic_level , 0xFE ) ; // 模式传输命令
chan_out_byte ( cc_mic_level , saved_mode ) ; // 模式值
debug_printf ( " Sent game_mode %d to hid_button_task via cc_mic_level channel \n " , saved_mode ) ;
port_enable ( p_ctrl_keys ) ;
port_ctrl_keys = port_in ( p_ctrl_keys ) ;
if ( ( port_ctrl_keys & KEY_MUTE ) = = 0 ) {
@@ -889,6 +1114,53 @@ void button_task(chanend_t c_hidSendData)
unsigned hidData0 = chan_in_word ( c_hidSendData ) ;
unsigned * reportData = hidSendData ;
reportData [ 0 ] = hidData0 ;
if ( hidData0 = = 0xffffffff ) {
printf ( " receive end data \n " ) ;
// 改动原因: 收到0xffffffff后, 循环切换模式并保存到flash, 然后设置切换标志
// 读取当前g_game_mode值
unsigned current_mode ;
GET_SHARED_GLOBAL ( current_mode , g_game_mode ) ;
// 改动原因: 添加无音效模式( 模式3) 到循环切换中
// 循环切换模式: 0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(SPATIAL_MOVIE) -> 3(无音效) -> 0
unsigned new_mode ;
unsigned mode_flag ;
if ( current_mode = = 0 ) {
// 当前是STEREO_2K, 切换到SPATIAL_GAME
new_mode = 1 ;
mode_flag = MODE_SPATIAL_GAME ;
printf ( " Switching from STEREO_2K to SPATIAL_GAME \n " ) ;
} else if ( current_mode = = 1 ) {
// 当前是SPATIAL_GAME, 切换到SPATIAL_MOVIE
new_mode = 2 ;
mode_flag = MODE_SPATIAL_MOVIE ;
printf ( " Switching from SPATIAL_GAME to SPATIAL_MOVIE \n " ) ;
} else if ( current_mode = = 2 ) {
// 当前是SPATIAL_MOVIE, 切换到无音效模式
new_mode = 3 ;
mode_flag = MODE_STEREO_2K ; // 无音效模式使用STEREO_2K固件
printf ( " Switching from SPATIAL_MOVIE to NO_EFFECT (3) \n " ) ;
} else {
// 当前是无音效模式(3)或其他, 切换到STEREO_2K
new_mode = 0 ;
mode_flag = MODE_STEREO_2K ;
printf ( " Switching to STEREO_2K \n " ) ;
}
// 更新g_game_mode
SET_SHARED_GLOBAL ( g_game_mode , new_mode ) ;
// 保存新的模式值到flash
unsigned char path [ ] = " game_mode " ;
save_value ( path , ( unsigned char ) new_mode ) ;
printf ( " Saved game_mode %d to flash \n " , new_mode ) ;
// 设置角色切换标志,触发模式切换
SetRoleSwitchFlag ( mode_flag ) ;
printf ( " Set role switch flag: 0x%04X \n " , mode_flag ) ;
break ;
}
for ( int i = 1 ; i < ( HID_MAX_DATA_BYTES / 4 ) ; i + + ) {
reportData [ i ] = chan_in_word ( c_hidSendData ) ;
}