Files
99_7018_lmx/apps/earphone/pc/pc.c

346 lines
8.4 KiB
C
Raw Normal View History

2025-10-29 13:10:02 +08:00
#include "system/includes.h"
#include "music/music_player.h"
#include "music/breakpoint.h"
#include "app_action.h"
#include "key_event_deal.h"
#include "audio_config.h"
#include "bt_background.h"
#include "default_event_handler.h"
#include "usb/device/usb_stack.h"
#include "usb/device/hid.h"
#include "tone_player.h"
#include "user_cfg.h"
#include "app_task.h"
#include "earphone.h"
#include "app_power_manage.h"
#include "app_charge.h"
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
#include "asm/chargestore.h"
#endif
#define LOG_TAG_CONST PC
#define LOG_TAG "[PC]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_PC_ENABLE
struct app_pc_var {
u8 inited;
u8 idle;
};
static struct app_pc_var g_pc;
#if(TCFG_TYPE_C_ENABLE)
static u8 pc_key_table[][KEY_EVENT_MAX] = {
// SHORT LONG HOLD
// UP DOUBLE TRIPLE
{
KEY_MUSIC_PP, KEY_CALL_ANSWER, KEY_NULL,
KEY_CALL_ANSWER_UP, KEY_NULL, KEY_NULL
},
{
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP,
KEY_NULL, KEY_NULL, KEY_NULL
},
{
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN,
KEY_NULL, KEY_NULL, KEY_NULL
},
};
#else
static u8 pc_key_table[][KEY_EVENT_MAX] = {
// SHORT LONG HOLD
// UP DOUBLE TRIPLE
{
KEY_MUSIC_PP, KEY_POWEROFF, KEY_POWEROFF_HOLD,
KEY_NULL, KEY_MODE_SWITCH, KEY_NULL
},
{
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP,
KEY_NULL, KEY_NULL, KEY_NULL
},
{
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN,
KEY_NULL, KEY_NULL, KEY_NULL
},
};
#endif
static u8 pc_idle_query()
{
return !g_pc.idle;
}
REGISTER_LP_TARGET(pc_lp_target) = {
.name = "pc",
.is_idle = pc_idle_query,
};
//*----------------------------------------------------------------------------*/
/**@brief pc 在线检测 切换模式判断使用
@param
@return 1 linein设备在线 0 线
@note
*/
/*----------------------------------------------------------------------------*/
int pc_app_check(void)
{
log_info("pc_app_check");
#if TCFG_ONLY_PC_ENABLE
return true; //不需要检测
#endif
u32 r = usb_otg_online(0);
if ((r == SLAVE_MODE) ||
(r == SLAVE_MODE_WAIT_CONFIRMATION)) {
return true;
}
log_info("pc check offline");
return false;
}
static void app_pc_exit();
static void app_pc_init(enum app_state state)
{
log_info("app_pc_init");
g_pc.idle = 1;
#if TCFG_PC_ENABLE
clk_set("sys", 96000000); //提高系统时钟,优化usb出盘符速度
if (pc_app_check() == false) {
if (state == APP_STA_RESUME) {
log_info("APP_PC_RESUME err");
/* APP_STA_RESUME时若设备不在线,不可在该位置切模式,
app切换还没完成,PC模式 */
app_pc_exit();
} else {
app_task_switch_next();
}
} else {
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_stop();
#endif
usb_start();
}
#endif
}
static void app_pc_exit()
{
log_info("app_pc_exit");
if (pc_app_check() == false) {
usb_stop();
} else {
usb_pause();
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_cdc_background_run();
#endif
}
g_pc.idle = 0;
}
static int app_pc_key_event_handler(struct sys_event *event)
{
struct key_event *key = &event->u.key;
int key_event = pc_key_table[key->value][key->event];
switch (key_event) {
#if TCFG_USB_SLAVE_HID_ENABLE
case KEY_MUSIC_PP:
log_info("KEY_MUSIC_PP");
hid_key_handler(0, USB_AUDIO_PP);
break;
case KEY_MUSIC_NEXT:
log_info("KEY_MUSIC_NEXT");
#if(TCFG_TYPE_C_ENABLE)
hid_key_handler(0, USB_AUDIO_PP);
os_time_dly(2);
hid_key_handler(0, USB_AUDIO_PP);
#else
hid_key_handler(0, USB_AUDIO_NEXTFILE);
#endif
break;
case KEY_MUSIC_PREV:
log_info("KEY_MUSIC_PREV");
#if(TCFG_TYPE_C_ENABLE)
hid_key_handler(0, USB_AUDIO_PP);
os_time_dly(2);
hid_key_handler(0, USB_AUDIO_PP);
os_time_dly(2);
hid_key_handler(0, USB_AUDIO_PP);
#else
hid_key_handler(0, USB_AUDIO_PREFILE);
#endif
break;
case KEY_VOL_UP:
log_info("KEY_MUSIC_UP");
hid_key_handler(0, USB_AUDIO_VOLUP);
break;
case KEY_VOL_DOWN:
log_info("KEY_MUSIC_DOWN");
hid_key_handler(0, USB_AUDIO_VOLDOWN);
break;
#if(TCFG_TYPE_C_ENABLE)
case KEY_CALL_ANSWER:
puts("KEY_CALL_ANSWER\n");
hid_key_handler_send_one_packet(0, USB_AUDIO_PP);
break;
case KEY_CALL_ANSWER_UP:
puts("KEY_CALL_ANSWER_UP\n");
hid_key_handler_send_one_packet(0, 0);
break;
#endif
#endif//end TCFG_USB_SLAVE_HID_ENABLE
case KEY_MODE_SWITCH:
log_info("KEY_MODE_SWITCH");
app_task_switch_next();
break;
case KEY_POWEROFF:
case KEY_POWEROFF_HOLD:
app_earphone_key_event_handler(event);
break;
default:
break;
}
return false;
}
/*
*
*/
static int event_handler(struct application *app, struct sys_event *event)
{
/*if (SYS_EVENT_REMAP(event)) {
g_printf("****SYS_EVENT_REMAP**** \n");
return 0;
}*/
switch (event->type) {
case SYS_KEY_EVENT:
/*
*
*/
return app_pc_key_event_handler(event);
case SYS_BT_EVENT:
/*
*
*/
break;
case SYS_DEVICE_EVENT:
/*
*
*/
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
if (event->u.dev.event == DEVICE_EVENT_OUT) {
app_task_switch_next();
return true;
}
} else if ((u32)event->arg == DEVICE_EVENT_FROM_POWER) {
app_power_event_handler(&event->u.dev);
return true;
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) {
#if TCFG_CHARGE_ENABLE
app_charge_event_handler(&event->u.dev);
#endif
return true;
}
break;
default:
return false;
}
#if(!TCFG_ONLY_PC_ENABLE)
default_event_handler(event);
#endif
return false;
}
static int state_machine(struct application *app, enum app_state state,
struct intent *it)
{
switch (state) {
case APP_STA_CREATE:
log_info("APP_STA_CREATE");
STATUS *p_tone = get_tone_config();
tone_play(TONE_PC_MODE, 1);
break;
case APP_STA_START:
log_info("APP_STA_START");
if (!it) {
break;
}
switch (it->action) {
case ACTION_PC_MAIN:
log_info("ACTION_PC_MAIN");
///按键使能
sys_key_event_enable();
//关闭自动关机
sys_auto_shut_down_disable();
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
power_wakeup_index_enable(2, 0);
chargestore_api_stop();
#endif
app_pc_init(state);
break;
}
break;
case APP_STA_PAUSE:
log_info("APP_STA_PAUSE");
app_pc_exit();
break;
case APP_STA_RESUME:
log_info("APP_STA_RESUME");
app_pc_init(state);
break;
case APP_STA_STOP:
log_info("APP_STA_STOP");
app_pc_exit();
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
chargestore_api_restart();
power_wakeup_index_enable(2, 1);
#endif
break;
case APP_STA_DESTROY:
log_info("APP_STA_DESTROY");
break;
}
return 0;
}
static const struct application_operation app_pc_ops = {
.state_machine = state_machine,
.event_handler = event_handler,
};
/*
* pc模式
*/
REGISTER_APPLICATION(app_pc) = {
.name = "pc",
.action = ACTION_PC_MAIN,
.ops = &app_pc_ops,
.state = APP_STA_DESTROY,
};
#endif