KT24-1110_65E-HA-651B/apps/soundbox/task_manager/pc/pc.c
2024-11-10 18:44:17 +08:00

424 lines
9.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*************************************************************
此文件函数主要是pc模式按键处理和事件处理
void app_pc_task()
pc模式主函数
static int pc_sys_event_handler(struct sys_event *event)
pc模式系统事件所有处理入口
static void pc_task_close()
pc模式退出
**************************************************************/
#include "system/app_core.h"
#include "system/includes.h"
#include "server/server_core.h"
#include "media/includes.h"
#include "app_config.h"
#include "app_task.h"
#include "tone_player.h"
#include "asm/charge.h"
#include "asm/usb.h"
#include "app_charge.h"
#include "app_main.h"
#include "app_online_cfg.h"
#include "app_power_manage.h"
#include "ui_manage.h"
#include "app_chargestore.h"
#include "key_event_deal.h"
#include "os/os_api.h"
#include "usb/usb_config.h"
#include "usb/device/usb_stack.h"
#include "usb/device/hid.h"
#include "usb/device/msd.h"
#include "uac_stream.h"
#include "pc/pc.h"
#include "user_cfg.h"
#include "device/sdmmc.h"
#include "pc/usb_msd.h"
#include "ui/ui_api.h"
#include "clock_cfg.h"
#include "dev_multiplex_api.h"
#include "usb/otg.h"
#include "bt_tws.h"
#include "clock_cfg.h"
#include "user_api/app_status_api.h"
#if TCFG_APP_PC_EN
#define LOG_TAG_CONST APP_PC
#define LOG_TAG "[APP_PC]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
struct pc_opr {
u8 volume;
u8 onoff : 1;
};
static struct pc_opr pc_hdl = {0};
#define __this (&pc_hdl)
static u8 pc_idle_flag = 1;
static void pc_start()
{
if (__this->onoff) {
log_info("PC is start ");
return ;
}
__this->onoff = 1;
log_info("App Start - PC");
app_status_handler(APP_STATUS_PC);
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_stop();
#endif
#if TCFG_PC_ENABLE
usb_start();
#endif
}
static void pc_stop()
{
if (!__this->onoff) {
log_info("PC is stop ");
return ;
}
__this->onoff = 0;
log_info("App Stop - PC");
#if TCFG_PC_ENABLE
usb_stop();
#endif
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_cdc_background_run();
#endif
}
static void pc_hold()
{
if (!__this->onoff) {
log_info("PC is hold");
return ;
}
__this->onoff = 0;
log_info("App Hold- PC");
#if TCFG_PC_ENABLE
usb_pause();
#endif
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_cdc_background_run();
#endif
}
//*----------------------------------------------------------------------------*/
/**@brief pc 按键消息入口
@param 无
@return 1、消息已经处理不需要发送到common 0、消息发送到common处理
@note
*/
/*----------------------------------------------------------------------------*/
static int pc_key_event_opr(struct sys_event *event)
{
int ret = true;
int err = 0;
int key_event = event->u.key.event;
int key_value = event->u.key.value;
log_debug("key value:%d, event:%d \n", key_value, key_event);
switch (key_event) {
#if TCFG_USB_SLAVE_HID_ENABLE
case KEY_MUSIC_PP:
log_info("KEY_MUSIC_PP\n");
hid_key_handler(0, USB_AUDIO_PP);
break;
case KEY_MUSIC_PREV:
log_info("KEY_MUSIC_PREV\n");
hid_key_handler(0, USB_AUDIO_PREFILE);
break;
case KEY_MUSIC_NEXT:
log_info("KEY_MUSIC_NEXT\n");
hid_key_handler(0, USB_AUDIO_NEXTFILE);
break;
case KEY_VOL_UP:
log_info("pc KEY_VOL_UP\n");
hid_key_handler(0, USB_AUDIO_VOLUP);
printf(">>>pc vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
break;
case KEY_VOL_DOWN:
log_info("pc KEY_VOL_DOWN\n");
hid_key_handler(0, USB_AUDIO_VOLDOWN);
printf(">>>pc vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
break;
#endif
default:
ret = false;
break;
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief pc 入口
@param 无
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void pc_task_start(void)
{
vddiom_set_dynamic(TCFG_VDDIO_DEV_ACCESS_LEVEL);
#if TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
pc_dm_multiplex_init();
#endif
__this->volume = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
pc_start();
#if TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
usb_otg_resume(0);
#endif
}
//*----------------------------------------------------------------------------*/
/**@brief pc 关闭
@param 无
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void pc_app_uninit(void)
{
if (pc_app_check() == false) {
pc_stop();
} else {
#if TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
usb_otg_suspend(0, 0);
#endif
pc_hold();
}
/* tone_play_stop(); */
tone_play_stop_by_path(tone_table[IDEX_TONE_PC]);//停止播放提示音
#if TCFG_USB_DM_MULTIPLEX_WITH_SD_DAT0
pc_dm_multiplex_exit();
#endif
#if (TCFG_DEV_MANAGER_ENABLE)
dev_manager_list_check_mount();
#endif/*TCFG_DEV_MANAGER_ENABLE*/
UI_HIDE_CURR_WINDOW();
}
#if ((defined TCFG_PC_BACKMODE_ENABLE) && (TCFG_PC_BACKMODE_ENABLE))
bool pc_backmode_check(struct sys_event *event)
{
switch (event->type) {
case SYS_DEVICE_EVENT:
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
const char *usb_msg = (const char *)event->u.dev.value;
if (usb_msg[0] == 's') {
if (event->u.dev.event == DEVICE_EVENT_IN) {
pc_task_start();
} else if (event->u.dev.event == DEVICE_EVENT_OUT) {
pc_app_uninit();
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_cdc_background_run();
#endif
}
return true;
}
}
break;
}
return false;
}
#endif//TCFG_PC_BACKMODE_ENABLE
//*----------------------------------------------------------------------------*/
/**@brief pc模式 退出
@param 无
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void pc_task_close()
{
pc_app_uninit();
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, __this->volume, 1);
#if (TCFG_DEC2TWS_ENABLE)
bt_tws_sync_volume();
#endif
pc_idle_flag = 1;
vddiom_set_dynamic(TCFG_LOWPOWER_VDDIOM_LEVEL);
}
//*----------------------------------------------------------------------------*/
/**@brief pc 模式活跃状态 所有消息入口
@param 无
@return 1、当前消息已经处理不需要发送comomon 0、当前消息不是linein处理的发送到common统一处理
@note
*/
/*----------------------------------------------------------------------------*/
static int pc_sys_event_handler(struct sys_event *event)
{
switch (event->type) {
case SYS_KEY_EVENT:
return pc_key_event_opr(event);
case SYS_DEVICE_EVENT:
#if TCFG_PC_ENABLE
if (pc_device_event_handler(event) == 2) {
/* pc_stop(); */
app_task_switch_next();
}
#endif
return false;
default:
return false;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief pc 在线检测 切换模式判断使用
@param 无
@return 1 linein设备在线 0 设备不在线
@note
*/
/*----------------------------------------------------------------------------*/
int pc_app_check(void)
{
#if ((defined TCFG_PC_BACKMODE_ENABLE) && (TCFG_PC_BACKMODE_ENABLE))
return false;
#endif//TCFG_PC_BACKMODE_ENABLE
u32 r = usb_otg_online(0);
log_info("pc_app_check %d", r);
if ((r == SLAVE_MODE) ||
(r == SLAVE_MODE_WAIT_CONFIRMATION)) {
return true;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief PC 模式提示音播放结束处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void pc_tone_play_end_callback(void *priv, int flag)
{
u32 index = (u32)priv;
if (APP_PC_TASK != app_get_curr_task()) {
log_error("tone callback task out \n");
return;
}
switch (index) {
case IDEX_TONE_PC:
///提示音播放结束, 启动播放器播放
pc_task_start();
break;
default:
break;
}
}
void pc_app_init()
{
/* 按键消息使能 */
pc_idle_flag = 0;
sys_key_event_enable();
clock_idle(PC_IDLE_CLOCK);
UI_SHOW_WINDOW(ID_WINDOW_PC);
UI_SHOW_MENU(MENU_PC, 1000, 0, NULL);
ui_update_status(STATUS_PC_MODE);
__this->volume = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);//记录下当前音量
}
//*----------------------------------------------------------------------------*/
/**@brief pc 主任务
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
void app_pc_task()
{
int res;
int msg[32];
pc_app_init();
tone_play_with_callback_by_name(tone_table[IDEX_TONE_PC], 1, pc_tone_play_end_callback, (void *)IDEX_TONE_PC);
while (1) {
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
case APP_MSG_SYS_EVENT:
if (pc_sys_event_handler((struct sys_event *)(msg + 1)) == false) {
app_default_event_deal((struct sys_event *)(&msg[1]));
}
break;
default:
break;
}
if (app_task_exitting()) {
pc_task_close();
return;
}
}
}
static u8 pc_idle_query(void)
{
return pc_idle_flag;
}
REGISTER_LP_TARGET(pc_lp_target) = {
.name = "pc",
.is_idle = pc_idle_query,
};
#else
int pc_app_check(void)
{
return false;
}
void app_pc_task()
{
}
#endif