support game mode
This commit is contained in:
@@ -71,7 +71,6 @@ unsigned g_filter_mode = 0; // 0-7: 对应8种滤波器模式
|
|||||||
unsigned g_request_gain_mode = -1; // -1表示无请求,0=低阻,1=高阻
|
unsigned g_request_gain_mode = -1; // -1表示无请求,0=低阻,1=高阻
|
||||||
// 改动原因:支持8种滤波器模式(0-7),与g_filter_map[8]数组定义一致
|
// 改动原因:支持8种滤波器模式(0-7),与g_filter_map[8]数组定义一致
|
||||||
unsigned g_request_filter_mode = -1; // -1表示无请求,0-7=滤波器模式
|
unsigned g_request_filter_mode = -1; // -1表示无请求,0-7=滤波器模式
|
||||||
unsigned g_game_mode = 2; // 0: 无音效, 1: FPS, 2: 虚拟7.1
|
|
||||||
unsigned g_request_game_mode = -1;
|
unsigned g_request_game_mode = -1;
|
||||||
#if EQ_EN
|
#if EQ_EN
|
||||||
extern unsigned g_request_eq_mode, g_new_eq_mode;
|
extern unsigned g_request_eq_mode, g_new_eq_mode;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#define DEBUG_PRINT_ENABLE 1
|
#define DEBUG_PRINT_ENABLE 0
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <xs1.h>
|
#include <xs1.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -20,7 +20,11 @@
|
|||||||
#include "xua_hid_report.h"
|
#include "xua_hid_report.h"
|
||||||
#include "xc_ptr.h"
|
#include "xc_ptr.h"
|
||||||
#include "dnr_dsp_buf.h"
|
#include "dnr_dsp_buf.h"
|
||||||
|
#include "roleswitchflag.h"
|
||||||
#include "debug_print.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;
|
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
|
#define MUTE_OFF 0
|
||||||
unsigned g_mute_on_off_t1 = MUTE_ON;
|
unsigned g_mute_on_off_t1 = MUTE_ON;
|
||||||
|
|
||||||
|
unsigned g_game_mode = 0;
|
||||||
|
|
||||||
// On UserBufferManagement Tile (1)
|
// On UserBufferManagement Tile (1)
|
||||||
static unsigned frame_index = 0;
|
static unsigned frame_index = 0;
|
||||||
//static unsigned dnr_frame_idx = 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) {
|
if (CMD_SET(CMD_EXPAND_GAIN) == command_code) {
|
||||||
int32_t idBGain;
|
int32_t idBGain;
|
||||||
memcpy(&idBGain, &pRcvBuf[1], 4);
|
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)) {
|
if((0 <= idBGain) && (idBGain <= 20)) {
|
||||||
Ex3dExpandGain = idBGain;
|
Ex3dExpandGain = idBGain;
|
||||||
EX3DAudio_SetExpandGain(Ex3dExpandGain);
|
EX3DAudio_SetExpandGain(Ex3dExpandGain);
|
||||||
@@ -570,7 +576,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
|
|||||||
pSendBuf[idx] = 0xFFFFFFFF;
|
pSendBuf[idx] = 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
} else { // Get
|
} 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);
|
memcpy(&pSendBuf[idx], &Ex3dExpandGain, 4);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -579,7 +585,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
|
|||||||
if (CMD_SET(CMD_REDUCE_GAIN) == command_code) {
|
if (CMD_SET(CMD_REDUCE_GAIN) == command_code) {
|
||||||
int32_t idBGain;
|
int32_t idBGain;
|
||||||
memcpy(&idBGain, &pRcvBuf[1], 4);
|
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)) {
|
if((-20 <= idBGain) && (idBGain <= 0)) {
|
||||||
Ex3dReduceGain = idBGain;
|
Ex3dReduceGain = idBGain;
|
||||||
EX3DAudio_SetReduceGain(Ex3dReduceGain);
|
EX3DAudio_SetReduceGain(Ex3dReduceGain);
|
||||||
@@ -587,7 +593,7 @@ void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData)
|
|||||||
pSendBuf[idx] = 0xFFFFFFFF;
|
pSendBuf[idx] = 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
} else { // Get
|
} 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);
|
memcpy(&pSendBuf[idx], &Ex3dReduceGain, 4);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -684,6 +690,10 @@ void hid_update(unsigned char hid_data) {
|
|||||||
#if defined (PHATEN_GSV2)
|
#if defined (PHATEN_GSV2)
|
||||||
#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次
|
||||||
|
#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
|
#endif
|
||||||
|
|
||||||
// add LED flashing when muted
|
// 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_ON_71_OFF 0b11111101
|
||||||
#define LED_DNR_OFF_71_ON 0b11111110
|
#define LED_DNR_OFF_71_ON 0b11111110
|
||||||
#define LED_DNR_OFF_71_OFF 0b11111111
|
#define LED_DNR_OFF_71_OFF 0b11111111
|
||||||
#define LED_DNR_PIN 1 //0b11111101
|
// 改动原因:将LED引脚宏定义改为更明确的名称,LED_3D_PIN改为BLUE_LED_PIN,LED_DNR_PIN改为GREEN_LED_PIN
|
||||||
#define LED_3D_PIN 0 //0b11111110
|
#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
|
||||||
|
|
||||||
|
// 改动原因:定义模式切换标志值,用于在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
|
//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)
|
||||||
@@ -713,6 +729,12 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
static uint8_t is_stable = 1;
|
static uint8_t is_stable = 1;
|
||||||
static uint8_t press_hold_cnt = 0;
|
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;
|
int ret = 0;
|
||||||
hwtimer_t timer = hwtimer_alloc();
|
hwtimer_t timer = hwtimer_alloc();
|
||||||
// init mic level
|
// 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;
|
SendData[0] = 1;
|
||||||
for (unsigned char i=1; i<(HID_MAX_DATA_BYTES / 4); i++) SendData[i] = 0;
|
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);
|
SET_SHARED_GLOBAL(g_mic_level_t1, mic_level);
|
||||||
port_enable(p_keys);
|
port_enable(p_keys);
|
||||||
port_enable(p_leds);
|
port_enable(p_leds);
|
||||||
port_enable(p_leds2);
|
port_enable(p_leds2);
|
||||||
port_out(p_leds, LED_OFF);
|
// 改动原因:初始状态显示白灯(3D关闭状态),所有LED都亮
|
||||||
port_out(p_leds2, LED_DNR_OFF_71_OFF); // all off
|
// 白灯 = 红色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);
|
uint32_t last_status = port_in(p_keys);
|
||||||
hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
|
hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
|
||||||
while (1) {
|
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:
|
event_mic_vol:
|
||||||
{
|
{
|
||||||
tmp = chan_in_byte(cc_mic_level);
|
tmp = chan_in_byte(cc_mic_level);
|
||||||
switch (tmp) {
|
debug_printf("event_mic_vol received: 0x%02X\n", tmp);
|
||||||
case KEY_MIC_VOL_UP:
|
// 改动原因:检查是否是模式传输命令(0xFE),如果是则接收模式值
|
||||||
ret = i2c_codec_mic_vol_up();
|
if (tmp == 0xFE) {
|
||||||
break;
|
// 这是模式传输命令
|
||||||
|
game_mode_t1 = chan_in_byte(cc_mic_level);
|
||||||
case KEY_MIC_VOL_DN:
|
is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0;
|
||||||
ret = i2c_codec_mic_vol_down();
|
debug_printf("hid_button_task received game_mode: %d (NO_EFFECT=%d) in event_mic_vol\n", game_mode_t1, is_no_effect_mode);
|
||||||
break;
|
|
||||||
|
|
||||||
case MUTED_MIC:
|
// 如果是无音效模式,强制禁用3D算法
|
||||||
SET_SHARED_GLOBAL(g_mute_on_off_t1, MUTE_ON);
|
if (is_no_effect_mode) {
|
||||||
break;
|
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:
|
case KEY_MIC_VOL_DN:
|
||||||
SET_SHARED_GLOBAL(g_mute_on_off_t1, MUTE_OFF);
|
ret = i2c_codec_mic_vol_down();
|
||||||
break;
|
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:
|
case UNMUTED_MIC:
|
||||||
break;
|
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;
|
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);
|
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",
|
||||||
|
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
|
||||||
@@ -794,49 +859,116 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
} else {
|
} else {
|
||||||
is_stable = 1;
|
is_stable = 1;
|
||||||
if (press_hold_cnt > 0) {
|
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
|
is_3d_on = A3D_OFF; // turn off
|
||||||
//ver2
|
// 改动原因:3D关闭时显示白灯(所有LED都亮)
|
||||||
leds2_val |= (1<<LED_3D_PIN); // Blue LED off
|
// 白灯 = 红色LED (bit 0) + 绿色LED (bit 1) + 蓝色LED (bit 0) 都开启
|
||||||
leds1_val |= 1; // Red LED off
|
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);
|
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 {
|
} else {
|
||||||
if (is_3d_on == A3D_OFF) {
|
if (is_3d_on == A3D_OFF) {
|
||||||
is_3d_on = A3D_ON;
|
is_3d_on = A3D_ON;
|
||||||
#if defined (STEREO_2K)
|
#if defined (STEREO_2K)
|
||||||
leds1_val &= (~1); // Red LED on
|
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
|
||||||
leds2_val |= (1<<LED_3D_PIN); // Blue LED off
|
|
||||||
#else
|
|
||||||
leds2_val &= (~(1<<LED_3D_PIN)); // Blue LED on
|
|
||||||
leds1_val |= 1; // Red LED off
|
leds1_val |= 1; // Red LED off
|
||||||
|
// 改动原因:使用更明确的BLUE_LED_PIN宏定义
|
||||||
|
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
|
||||||
#endif
|
#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);
|
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 {
|
} else {
|
||||||
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) {
|
||||||
if(is_dnr_on == DNR_ON) {
|
// 改动原因:长按检测到时,根据不同宏定义直接执行LED闪烁3次循环
|
||||||
is_dnr_on = DNR_OFF;
|
// 保存当前LED状态
|
||||||
//ver2
|
saved_leds2_val = leds2_val;
|
||||||
leds2_val |= (1<<LED_DNR_PIN);
|
saved_leds1_val = leds1_val;
|
||||||
debug_printf("dnr off\n");
|
debug_printf("Long press detected, start LED blink\n");
|
||||||
} else {
|
|
||||||
is_dnr_on = DNR_ON;
|
// 直接在这里循环闪烁3次
|
||||||
//ver2
|
for (int i = 0; i < BLINK_COUNT; i++) {
|
||||||
leds2_val &= (~(1<<LED_DNR_PIN));
|
// LED亮
|
||||||
debug_printf("dnr on\n");
|
#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_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);
|
hwtimer_free(timer);
|
||||||
}
|
}
|
||||||
#define KEY_POLLING_INTERVAL 10000000L // 100ms polling interval
|
#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;
|
port_t p_ctrl_keys = XS1_PORT_8C;
|
||||||
|
|
||||||
@@ -864,6 +997,98 @@ void button_task(chanend_t c_hidSendData)
|
|||||||
unsigned hidData0;
|
unsigned hidData0;
|
||||||
#endif
|
#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_enable(p_ctrl_keys);
|
||||||
port_ctrl_keys = port_in(p_ctrl_keys);
|
port_ctrl_keys = port_in(p_ctrl_keys);
|
||||||
if ((port_ctrl_keys & KEY_MUTE) == 0) {
|
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 hidData0 = chan_in_word(c_hidSendData);
|
||||||
unsigned *reportData = hidSendData;
|
unsigned *reportData = hidSendData;
|
||||||
reportData[0] = hidData0;
|
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++) {
|
for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) {
|
||||||
reportData[i] = chan_in_word(c_hidSendData);
|
reportData[i] = chan_in_word(c_hidSendData);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_3
|
#define FLASH_CLKBLK XS1_CLKBLK_1
|
||||||
#ifndef FS_BASE_ADDR
|
#ifndef FS_BASE_ADDR
|
||||||
#define FS_BASE_ADDR 0x180000
|
#define FS_BASE_ADDR 0x180000
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ extern port p_sda;
|
|||||||
|
|
||||||
extern int dsp_worker_tile(chanend c_dsp_to_ex3d, int worker_id);
|
extern int dsp_worker_tile(chanend c_dsp_to_ex3d, int worker_id);
|
||||||
//extern int dsp_worker_tile_1(chanend c_dsp_to_ex3d, int worker_id);
|
//extern int dsp_worker_tile_1(chanend c_dsp_to_ex3d, int worker_id);
|
||||||
extern void button_task(chanend c_hidSendData);
|
extern void button_task(chanend c_hidSendData, chanend cc_mic_level);
|
||||||
extern void ex3d_task();
|
extern void ex3d_task();
|
||||||
extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSendData);
|
extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSendData);
|
||||||
extern void AudioHwRemote(chanend c);
|
extern void AudioHwRemote(chanend c);
|
||||||
@@ -127,7 +127,7 @@ extern void key_receiver(chanend c_key);
|
|||||||
}\
|
}\
|
||||||
AudioHwRemote(c);\
|
AudioHwRemote(c);\
|
||||||
} \
|
} \
|
||||||
button_task(c_hidSendData);\
|
button_task(c_hidSendData, cc_mic_level);\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
on tile[0]: {\
|
on tile[0]: {\
|
||||||
|
|||||||
Reference in New Issue
Block a user