#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