key buttons
This commit is contained in:
@@ -326,9 +326,9 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
unsigned flag_music_mode = 0;
|
// active_mode: 0=off, 1=music (LED_MUSIC, no algorithm),
|
||||||
unsigned flag_ai71_onoff = 0;
|
// 2=game (LED_GAME_MODE, IR_GAME), 3=AI7.1 (LED_AI7_1, IR_7_1_GAME)
|
||||||
unsigned flag_game_mode = 0;
|
unsigned active_mode = 0;
|
||||||
unsigned flag_footsteps_enhancement = 0;
|
unsigned flag_footsteps_enhancement = 0;
|
||||||
unsigned flag_aidenoise_onoff = 0;
|
unsigned flag_aidenoise_onoff = 0;
|
||||||
|
|
||||||
@@ -355,8 +355,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
led_control_t led_ctx;
|
led_control_t led_ctx;
|
||||||
|
|
||||||
|
|
||||||
// Windows模式:从 "game_mode" 加载(模式值 0-3)
|
// saved_mode / active_mode: 0=off, 1=music, 2=game (IR_GAME), 3=AI7.1 (IR_7_1_GAME)
|
||||||
// UAC1模式:从 "uac1_mode" 加载(等效模式值 0-2)
|
|
||||||
unsigned /* char */ saved_mode;
|
unsigned /* char */ saved_mode;
|
||||||
unsigned char saved_uac1_mode = 0;
|
unsigned char saved_uac1_mode = 0;
|
||||||
unsigned char path[] = "game_mode";
|
unsigned char path[] = "game_mode";
|
||||||
@@ -370,17 +369,22 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
#if defined(UAC1_MODE)
|
#if defined(UAC1_MODE)
|
||||||
delay_milliseconds(300);
|
delay_milliseconds(300);
|
||||||
if (saved_mode == 255) {
|
if (saved_mode == 255) {
|
||||||
saved_mode = 0;
|
#if defined(F5_MUSIC_UAC1)
|
||||||
|
saved_mode = 1; // f5: default music mode
|
||||||
|
#else
|
||||||
|
saved_mode = 0; // f6/f7: default off
|
||||||
|
#endif
|
||||||
save_value(path, saved_mode);
|
save_value(path, saved_mode);
|
||||||
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
|
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (saved_mode == 255) {
|
if (saved_mode == 255) {
|
||||||
// 如果文件不存在,根据编译模式设置默认值
|
#if defined(F1_MUSIC_UAC2)
|
||||||
#if defined(MODE_F1_MUSIC_UAC2)
|
saved_mode = 1; // f1: default music mode
|
||||||
|
#elif defined(F3_F4_FPS_UAC2)
|
||||||
|
saved_mode = 3; // f3/f4: default AI7.1 (IR_7_1_GAME)
|
||||||
|
#else
|
||||||
saved_mode = 0;
|
saved_mode = 0;
|
||||||
#elif defined(MODE_F3_F4_FPS_UAC2)
|
|
||||||
saved_mode = 2;
|
|
||||||
#endif
|
#endif
|
||||||
save_value(path, saved_mode);
|
save_value(path, saved_mode);
|
||||||
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
|
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
|
||||||
@@ -392,14 +396,14 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
#if UAC1_MODE == 1
|
#if UAC1_MODE == 1
|
||||||
if (host_os == OS_WIN) {
|
if (host_os == OS_WIN) {
|
||||||
printf("Detected Windows OS (OS_WIN) saved_mode: %d\n", saved_mode);
|
printf("Detected Windows OS (OS_WIN) saved_mode: %d\n", saved_mode);
|
||||||
unsigned flag = (saved_mode == 0) ? MODE_F1_MUSIC_UAC2 : MODE_F3_F4_FPS_UAC2;
|
unsigned flag = (saved_mode <= 1) ? MODE_F1_MUSIC_UAC2 : MODE_F3_F4_FPS_UAC2;
|
||||||
SetRoleSwitchFlag(flag);
|
SetRoleSwitchFlag(flag);
|
||||||
device_reboot();
|
device_reboot();
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (saved_mode != 0) {
|
if (saved_mode >= 2) {
|
||||||
SetRoleSwitchFlag(MODE_F6_F7_FPS_UAC1);
|
SetRoleSwitchFlag(MODE_F6_F7_FPS_UAC1);
|
||||||
device_reboot();
|
device_reboot();
|
||||||
while (1);
|
while (1);
|
||||||
@@ -410,8 +414,12 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
g_windows_detect_done = 1;
|
g_windows_detect_done = 1;
|
||||||
|
|
||||||
|
|
||||||
SET_SHARED_GLOBAL(g_game_mode, saved_mode);
|
active_mode = (saved_mode <= 3) ? saved_mode : 0;
|
||||||
debug_printf("Set new g_game_mode to %d\n", saved_mode);
|
{
|
||||||
|
unsigned hid_mode_init = (active_mode >= 2) ? (active_mode - 1) : 0;
|
||||||
|
SET_SHARED_GLOBAL(g_game_mode, hid_mode_init);
|
||||||
|
debug_printf("active_mode=%d hid_mode=%d\n", active_mode, hid_mode_init);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -477,6 +485,16 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
// 点亮D系列当前位置
|
// 点亮D系列当前位置
|
||||||
led_on(&led_ctx, led_d_physical_map[i]);
|
led_on(&led_ctx, led_d_physical_map[i]);
|
||||||
}
|
}
|
||||||
|
// Initialize mode button LEDs: at most one may be lit at a time
|
||||||
|
led_off(&led_ctx, LED_MUSIC);
|
||||||
|
led_off(&led_ctx, LED_GAME_MODE);
|
||||||
|
led_off(&led_ctx, LED_AI7_1);
|
||||||
|
switch (active_mode) {
|
||||||
|
case 1: led_on(&led_ctx, LED_MUSIC); break;
|
||||||
|
case 2: led_on(&led_ctx, LED_GAME_MODE); break;
|
||||||
|
case 3: led_on(&led_ctx, LED_AI7_1); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
led_update_all(&led_ctx);
|
led_update_all(&led_ctx);
|
||||||
|
|
||||||
|
|
||||||
@@ -487,11 +505,12 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
debug_printf("button task start\n");
|
debug_printf("button task start\n");
|
||||||
|
|
||||||
|
|
||||||
//chan_out_byte(cc_mic_level, 0xFC); // 音频模式传输命令
|
{
|
||||||
//chan_out_byte(cc_mic_level, saved_mode); // 音频模式值(0=无音效,1=STEREO_2K,2=SPATIAL_GAME,3=SPATIAL_MOVIE)
|
unsigned hid_mode_startup = (active_mode >= 2) ? (active_mode - 1) : 0;
|
||||||
cc_mic_level <: 0xFC;
|
cc_mic_level <: 0xFC;
|
||||||
cc_mic_level <: saved_mode;
|
cc_mic_level <: hid_mode_startup;
|
||||||
debug_printf("Sent audio_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode);
|
debug_printf("Sent hid_mode %d (active_mode=%d) to hid_button_task\n", hid_mode_startup, active_mode);
|
||||||
|
}
|
||||||
|
|
||||||
// port_enable(p_ctrl_keys);
|
// port_enable(p_ctrl_keys);
|
||||||
port_ctrl_keys = 0;//port_in(p_ctrl_keys);
|
port_ctrl_keys = 0;//port_in(p_ctrl_keys);
|
||||||
@@ -660,64 +679,104 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol)
|
|||||||
button_footsteps_enhancement = ((mic_encoder1 & 0b0010) != 0); // 4F1
|
button_footsteps_enhancement = ((mic_encoder1 & 0b0010) != 0); // 4F1
|
||||||
button_aidenoise_onoff = ((mic_encoder2 & 0b1000) != 0); // 4E3
|
button_aidenoise_onoff = ((mic_encoder2 & 0b1000) != 0); // 4E3
|
||||||
|
|
||||||
if(button_music_mode == 0)
|
// --- Mode button handling ---
|
||||||
{
|
// active_mode: 0=off, 1=music, 2=game (IR_GAME), 3=AI7.1 (IR_7_1_GAME)
|
||||||
if(push_button_music_mode_state_old == 1)
|
//
|
||||||
{
|
// Boot chain: power-on → F5 → OS detect → route to F1/F3/F4/F5/F6/F7
|
||||||
flag_music_mode ^= 1;
|
//
|
||||||
mode_change = 1;
|
// Music-only firmware (F1, F5): USE_EX3D not set
|
||||||
|
// Music btn: toggle LED locally (no reboot)
|
||||||
|
// Game/AI7.1 btn: save mode + reboot (F5 will route to FPS firmware)
|
||||||
|
//
|
||||||
|
// FPS firmware (F3/F4, F6/F7): USE_EX3D set
|
||||||
|
// Music btn: save mode=1 + reboot (F5 will route to music firmware)
|
||||||
|
// Game/AI7.1 btn: switch IR algorithm locally (no reboot)
|
||||||
|
|
||||||
|
unsigned mode_btn_change = 0;
|
||||||
|
unsigned need_reboot = 0;
|
||||||
|
|
||||||
|
if (button_music_mode == 0) {
|
||||||
|
if (push_button_music_mode_state_old == 1) {
|
||||||
|
#if USE_EX3D == 1
|
||||||
|
// FPS firmware: switching to music needs different USB config
|
||||||
|
active_mode = 1;
|
||||||
|
need_reboot = 1;
|
||||||
|
#else
|
||||||
|
// Music-only firmware: toggle music LED locally
|
||||||
|
active_mode = (active_mode == 1) ? 0 : 1;
|
||||||
|
mode_btn_change = 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
push_button_music_mode_state_old = button_music_mode;
|
push_button_music_mode_state_old = button_music_mode;
|
||||||
if(mode_change)
|
|
||||||
if(flag_music_mode)
|
|
||||||
{
|
|
||||||
led_on(&led_ctx, LED_MUSIC);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
led_off(&led_ctx, LED_MUSIC);
|
|
||||||
}
|
|
||||||
|
|
||||||
mode_change = 0;
|
if (button_ai71_onoff == 0) {
|
||||||
if(button_ai71_onoff == 0)
|
if (push_button_ai71_onoff_state_old == 1) {
|
||||||
{
|
#if USE_EX3D == 1
|
||||||
if(push_button_ai71_onoff_state_old == 1)
|
// FPS firmware: switch algorithm locally (toggle off or activate)
|
||||||
{
|
active_mode = (active_mode == 3) ? 0 : 3;
|
||||||
flag_ai71_onoff ^= 1;
|
mode_btn_change = 1;
|
||||||
mode_change = 1;
|
#else
|
||||||
|
// Music-only firmware: AI7.1 needs FPS firmware
|
||||||
|
active_mode = 3;
|
||||||
|
need_reboot = 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
push_button_ai71_onoff_state_old = button_ai71_onoff;
|
push_button_ai71_onoff_state_old = button_ai71_onoff;
|
||||||
if(mode_change)
|
|
||||||
if(flag_ai71_onoff)
|
|
||||||
{
|
|
||||||
led_on(&led_ctx, LED_AI7_1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
led_off(&led_ctx, LED_AI7_1);
|
|
||||||
}
|
|
||||||
|
|
||||||
mode_change = 0;
|
if (button_game_mode == 0) {
|
||||||
if(button_game_mode == 0)
|
if (push_button_game_mode_state_old == 1) {
|
||||||
{
|
#if USE_EX3D == 1
|
||||||
if(push_button_game_mode_state_old == 1)
|
// FPS firmware: switch algorithm locally (toggle off or activate)
|
||||||
{
|
active_mode = (active_mode == 2) ? 0 : 2;
|
||||||
flag_game_mode ^= 1;
|
mode_btn_change = 1;
|
||||||
mode_change = 1;
|
#else
|
||||||
|
// Music-only firmware: game needs FPS firmware
|
||||||
|
active_mode = 2;
|
||||||
|
need_reboot = 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
push_button_game_mode_state_old = button_game_mode;
|
push_button_game_mode_state_old = button_game_mode;
|
||||||
if(mode_change)
|
|
||||||
if(flag_game_mode)
|
if (mode_btn_change || need_reboot) {
|
||||||
|
// Always persist mode to flash so boot chain restores it
|
||||||
{
|
{
|
||||||
led_on(&led_ctx, LED_GAME_MODE);
|
unsigned char save_path[] = "game_mode";
|
||||||
|
save_value(save_path, (unsigned char)active_mode);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
if (need_reboot) {
|
||||||
|
// Reboot: F5 will re-detect OS and route to correct firmware
|
||||||
|
debug_printf("Mode %d requires firmware switch, rebooting\n", active_mode);
|
||||||
|
delay_milliseconds(20);
|
||||||
|
device_reboot();
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local update path (no reboot): update LEDs and DSP algorithm
|
||||||
|
led_off(&led_ctx, LED_MUSIC);
|
||||||
led_off(&led_ctx, LED_GAME_MODE);
|
led_off(&led_ctx, LED_GAME_MODE);
|
||||||
|
led_off(&led_ctx, LED_AI7_1);
|
||||||
|
switch (active_mode) {
|
||||||
|
case 1: led_on(&led_ctx, LED_MUSIC); break;
|
||||||
|
case 2: led_on(&led_ctx, LED_GAME_MODE); break;
|
||||||
|
case 3: led_on(&led_ctx, LED_AI7_1); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
led_update_all(&led_ctx);
|
||||||
|
|
||||||
|
#if USE_EX3D == 1
|
||||||
|
{
|
||||||
|
// hid_mode: 0=IR_OFF, 1=IR_GAME, 2=IR_7_1_GAME
|
||||||
|
unsigned hid_mode = (active_mode >= 2) ? (active_mode - 1) : 0;
|
||||||
|
SET_SHARED_GLOBAL(g_game_mode, hid_mode);
|
||||||
|
cc_mic_level <: 0xFC;
|
||||||
|
cc_mic_level <: hid_mode;
|
||||||
|
debug_printf("Mode changed: active=%d hid=%d\n", active_mode, hid_mode);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
mode_change = 0;
|
mode_change = 0;
|
||||||
|
|||||||
@@ -868,41 +868,34 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
debug_printf("hid_button_task received audio_mode: %d\n", current_mode_local);
|
debug_printf("hid_button_task received audio_mode: %d\n", current_mode_local);
|
||||||
|
|
||||||
if (current_mode_local == 0) {
|
if (current_mode_local == 0) {
|
||||||
// 无音效模式:灯灭,算法关闭
|
// 关闭算法
|
||||||
audio_ex3d_onoff(0);
|
audio_ex3d_set_onoff(0);
|
||||||
#if IR_SWITCHING_MODE
|
#if IR_SWITCHING_MODE
|
||||||
is_3d_on = IR_OFF;
|
is_3d_on = IR_OFF;
|
||||||
#else
|
#else
|
||||||
is_3d_on = A3D_OFF;
|
is_3d_on = A3D_OFF;
|
||||||
#endif
|
#endif
|
||||||
debug_printf("Mode 0 (NO_EFFECT): algorithm OFF\n");
|
debug_printf("Mode 0: algorithm OFF\n");
|
||||||
} else if (current_mode_local == 1) {
|
} else if (current_mode_local == 1) {
|
||||||
// STEREO_2K模式:红灯,算法开启
|
// 游戏模式 (IR_GAME, stereo): SF index 0
|
||||||
audio_ex3d_onoff(1);
|
|
||||||
#if IR_SWITCHING_MODE
|
#if IR_SWITCHING_MODE
|
||||||
|
audio_ex3d_set_sf(0); // SF 0 = STEREO GAME
|
||||||
is_3d_on = IR_GAME;
|
is_3d_on = IR_GAME;
|
||||||
#else
|
#else
|
||||||
is_3d_on = A3D_ON;
|
is_3d_on = A3D_ON;
|
||||||
#endif
|
#endif
|
||||||
debug_printf("Mode 1 (STEREO_2K): algorithm ON\n");
|
audio_ex3d_set_onoff(1);
|
||||||
|
debug_printf("Mode 1: GAME (IR_GAME) ON, sf=0\n");
|
||||||
} else if (current_mode_local == 2) {
|
} else if (current_mode_local == 2) {
|
||||||
// SPATIAL_GAME模式:蓝灯,算法开启
|
// AI7.1模式 (IR_7_1_GAME, 7.1): SF index 1
|
||||||
audio_ex3d_onoff(1);
|
|
||||||
#if IR_SWITCHING_MODE
|
#if IR_SWITCHING_MODE
|
||||||
|
audio_ex3d_set_sf(1); // SF 1 = SPATIAL GAME (7.1)
|
||||||
is_3d_on = IR_7_1_GAME;
|
is_3d_on = IR_7_1_GAME;
|
||||||
#else
|
#else
|
||||||
is_3d_on = A3D_ON;
|
is_3d_on = A3D_ON;
|
||||||
#endif
|
#endif
|
||||||
debug_printf("Mode 2 (SPATIAL_GAME): algorithm ON\n");
|
audio_ex3d_set_onoff(1);
|
||||||
} else if (current_mode_local == 3) {
|
debug_printf("Mode 2: AI7.1 (IR_7_1_GAME) ON, sf=1\n");
|
||||||
// SPATIAL_MOVIE模式:蓝灯闪烁,算法开启
|
|
||||||
audio_ex3d_onoff(1);
|
|
||||||
#if IR_SWITCHING_MODE
|
|
||||||
is_3d_on = IR_7_1_MOVIE;
|
|
||||||
#else
|
|
||||||
is_3d_on = A3D_ON;
|
|
||||||
#endif
|
|
||||||
debug_printf("Mode 3 (SPATIAL_MOVIE): algorithm ON\n");
|
|
||||||
}
|
}
|
||||||
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
|
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
|
||||||
} else {
|
} else {
|
||||||
@@ -971,22 +964,29 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
|
|||||||
GET_SHARED_GLOBAL(host_app_sf, g_3d_on_off_t1);
|
GET_SHARED_GLOBAL(host_app_sf, g_3d_on_off_t1);
|
||||||
if (host_app_sf != is_3d_on) {
|
if (host_app_sf != is_3d_on) {
|
||||||
is_3d_on = host_app_sf;
|
is_3d_on = host_app_sf;
|
||||||
audio_ex3d_onoff(is_3d_on != IR_OFF);
|
|
||||||
|
|
||||||
if (is_3d_on == IR_OFF) current_mode_local = 0;
|
// Select SF and set on/off together
|
||||||
else if (is_3d_on == IR_GAME) current_mode_local = 1;
|
if (is_3d_on == IR_OFF) {
|
||||||
else if (is_3d_on == IR_7_1_GAME) current_mode_local = 2;
|
audio_ex3d_set_onoff(0);
|
||||||
else if (is_3d_on == IR_7_1_MOVIE) current_mode_local = 3;
|
current_mode_local = 0;
|
||||||
|
printf("3d off\n");
|
||||||
switch (is_3d_on) {
|
} else if (is_3d_on == IR_GAME) {
|
||||||
case IR_GAME: printf("Stereo Game on\n"); break;
|
audio_ex3d_set_sf(0);
|
||||||
case IR_MUSIC: printf("Stereo Music on\n"); break;
|
audio_ex3d_set_onoff(1);
|
||||||
case IR_MOVIE: printf("Stereo Movie on\n"); break;
|
current_mode_local = 1;
|
||||||
case IR_7_1_GAME: printf("3d Game on\n"); break;
|
printf("Stereo Game on (sf=0)\n");
|
||||||
case IR_7_1_MUSIC:printf("3d Music on\n"); break;
|
} else if (is_3d_on == IR_7_1_GAME) {
|
||||||
case IR_7_1_MOVIE:printf("3d Movie on\n"); break;
|
audio_ex3d_set_sf(1);
|
||||||
case IR_OFF: printf("3d off\n"); break;
|
audio_ex3d_set_onoff(1);
|
||||||
default: break;
|
current_mode_local = 2;
|
||||||
|
printf("3d Game on (sf=1)\n");
|
||||||
|
} else if (is_3d_on == IR_7_1_MOVIE) {
|
||||||
|
audio_ex3d_set_sf(2);
|
||||||
|
audio_ex3d_set_onoff(1);
|
||||||
|
current_mode_local = 3;
|
||||||
|
printf("3d Movie on (sf=2)\n");
|
||||||
|
} else {
|
||||||
|
audio_ex3d_set_onoff(is_3d_on != IR_OFF);
|
||||||
}
|
}
|
||||||
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
|
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user