KT25-0812_82A-UART/apps/soundbox/task_manager/fm/fm_api.c
2025-08-12 18:09:23 +08:00

652 lines
15 KiB
C
Raw 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.

#include "system/includes.h"
#include "media/includes.h"
#include "app_config.h"
#include "app_task.h"
#include "tone_player.h"
#include "app_main.h"
#include "ui_manage.h"
#include "vm.h"
#include "key_event_deal.h"
#include "asm/pwm_led.h"
#include "user_cfg.h"
#include "fm/fm.h"
#include "fm/fm_manage.h"
#include "fm/fm_rw.h"
#include "ui/ui_api.h"
#include "clock_cfg.h"
#include "includes.h"
#include "fm/fm_api.h"
#include "bt/bt_tws.h"
#include "ui/ui_style.h"
#include "audio_dec/audio_dec_fm.h"
#define LOG_TAG_CONST APP_FM
#define LOG_TAG "[APP_FM]"
#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_APP_FM_EN
#define TCFG_FM_SC_REVERB_ENABLE 1//搜索过程关闭混响
/*************************************************************
此文件函数主要是fm模式 实现函数
任务内初始化:
fm_api_init 主要申请空间、读取vm信息操作
释放资源:
fm_api_release
注意在逻辑操作上sdk大部分是使用了虚拟频点,即(1,、2、3、4)代替了8750、8760、8770等真实的频率
转换规则:真实 = REAL_FREQ(虚拟)
虚拟 = VIRTUAL_FREQ(真实)
**************************************************************/
struct fm_opr {
void *dev;
u8 volume: 7;
u8 fm_dev_mute : 1;
u8 scan_flag;//搜索标志位,客户增加了自己了搜索标志位也要对应增加
u16 fm_freq_cur; // 这是虚拟频率,从1计算 real_freq = fm_freq_cur + 874
u16 fm_freq_channel_cur;//当前的台号,从1计算
u16 fm_total_channel;//总共台数
s16 scan_fre;//搜索过程的虚拟频率,因为--会少于0使用带符号
};
#define SCANE_ALL (0x01)
#define SEMI_SCANE_DOWN (0x02)//半自动搜索标志位
#define SEMI_SCANE_UP (0x03)
static struct fm_opr *fm_hdl = NULL;
#define __this (fm_hdl)
extern void fm_dec_pause_out(u8 pause);
/*----------------------------------------------------------------------------*/
/**@brief fm 的 mute 操作
@param 1: mute 0:解mute
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void fm_app_mute(u8 mute)
{
if (!__this) {
return;
}
if (mute) {
if (!__this->fm_dev_mute) {
fm_manage_mute(1);
__this->fm_dev_mute = 1;
}
} else {
if (__this->fm_dev_mute) {
fm_manage_mute(0);
__this->fm_dev_mute = 0;
}
}
fm_dec_pause_out(mute);
}
/*----------------------------------------------------------------------------*/
/**@brief fm 获取vm 保存信息
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void fm_read_info_init(void)
{
FM_INFO fm_info = {0};
fm_vm_check();//校验mask,不符合mask进行清0
fm_read_info(&fm_info);//获取vm信息
__this->fm_freq_cur = fm_info.curFreq;//上一次的保存的频率(虚拟频率)
printf("__this->fm_freq_cur = 0x%x\n", __this->fm_freq_cur);
__this->fm_freq_channel_cur = fm_info.curChanel;//上一次保存的频道
printf("__this->fm_freq_channel_cur = 0x%x\n", __this->fm_freq_channel_cur);
__this->fm_total_channel = fm_info.total_chanel;//总台数
printf("__this->fm_total_channel = 0x%x\n", __this->fm_total_channel);
if (__this->fm_freq_cur == 0 && __this->fm_freq_channel_cur && __this->fm_total_channel) {
__this->fm_freq_cur = get_fre_via_channel(__this->fm_freq_channel_cur);//上次记录操作是频道,则获取频道对应的频率
fm_manage_set_fre(REAL_FREQ(__this->fm_freq_cur));
} else {
fm_manage_set_fre(REAL_FREQ(__this->fm_freq_cur));//上次记录操作的是频率
}
}
/*----------------------------------------------------------------------------*/
/**@brief fm ui 更新
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void __fm_ui_reflash_main()//刷新主页
{
UI_REFLASH_WINDOW(true);
UI_MSG_POST("fm_fre", NULL);
}
static void __fm_ui_show_station()//显示台号
{
UI_SHOW_MENU(MENU_FM_STATION, 1000, __this->fm_total_channel, NULL);
/* ui_menu_reflash(true); */
UI_MSG_POST("fm_fre", NULL);
}
static void __fm_ui_cur_station()//显示当前台号
{
UI_SHOW_MENU(MENU_FM_STATION, 1000, __this->fm_freq_channel_cur, NULL);
/* ui_menu_reflash(true); */
UI_MSG_POST("fm_fre", NULL);
}
/*----------------------------------------------------------------------------*/
/**@brief fm 搜台完毕开混响
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void __fm_reverb_resume()
{
#if ((TCFG_MIC_EFFECT_ENABLE) &&(TCFG_FM_SC_REVERB_ENABLE))
mic_effect_pause(0);
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief fm 搜台前关混响
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void __fm_reverb_pause()
{
#if ((TCFG_MIC_EFFECT_ENABLE) &&(TCFG_FM_SC_REVERB_ENABLE))
mic_effect_pause(1);
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief fm 下一个台
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void __set_fm_station()
{
fm_app_mute(1);
__this->fm_freq_cur = get_fre_via_channel(__this->fm_freq_channel_cur);
fm_manage_set_fre(REAL_FREQ(__this->fm_freq_cur));
fm_last_ch_save(__this->fm_freq_channel_cur);
fm_app_mute(0);
}
static void __set_fm_frq()
{
fm_app_mute(1);
fm_manage_set_fre(REAL_FREQ(__this->fm_freq_cur));
fm_last_freq_save(REAL_FREQ(__this->fm_freq_cur));
fm_app_mute(0);
}
static void __fm_scan_all(void)
{
if ((!__this) || (__this->scan_flag != SCANE_ALL)) {
return;
}
if (__this->scan_fre > VIRTUAL_FREQ(REAL_FREQ_MAX)) {
__this->scan_fre = VIRTUAL_FREQ(REAL_FREQ_MIN);
fm_app_mute(1);
fm_manage_set_fre(REAL_FREQ(__this->fm_freq_cur));
__this->scan_flag = 0;
fm_app_mute(0);
__fm_ui_reflash_main();
__fm_reverb_resume();
return;
}
fm_app_mute(1);
if (fm_manage_set_fre(REAL_FREQ(__this->scan_fre))) {
__this->fm_freq_cur = __this->scan_fre;
__this->fm_total_channel++;
__this->fm_freq_channel_cur = __this->fm_total_channel;//++;
save_fm_point(REAL_FREQ(__this->scan_fre));
sys_timeout_add(NULL, __fm_scan_all, 1500); //播放一秒
__fm_ui_show_station();
fm_app_mute(0);
} else {
__this->fm_freq_cur = __this->scan_fre;
sys_timeout_add(NULL, __fm_scan_all, 20);
__fm_ui_reflash_main();
}
__this->scan_fre++;
}
static void __fm_semi_scan(void)//半自动收台
{
if ((!__this) || (__this->scan_flag != SEMI_SCANE_UP && __this->scan_flag != SEMI_SCANE_DOWN)) {
return;
}
if (__this->scan_flag == SEMI_SCANE_DOWN) {
__this->scan_fre++;
} else {
__this->scan_fre--;
}
if (__this->scan_fre > VIRTUAL_FREQ(REAL_FREQ_MAX)) {
__this->scan_fre = VIRTUAL_FREQ(REAL_FREQ_MIN);
#if TCFG_FM_INSIDE_ENABLE
save_scan_freq_org(REAL_FREQ(__this->scan_fre) * 10);
#endif
}
if (__this->scan_fre < VIRTUAL_FREQ(REAL_FREQ_MIN)) {
__this->scan_fre = VIRTUAL_FREQ(REAL_FREQ_MAX);
#if TCFG_FM_INSIDE_ENABLE
save_scan_freq_org(REAL_FREQ(__this->scan_fre) * 10);
#endif
}
if (__this->scan_fre == __this->fm_freq_cur) {
fm_app_mute(1);
fm_manage_set_fre(REAL_FREQ(__this->fm_freq_cur));
fm_app_mute(0);
__this->scan_flag = 0;
__fm_ui_reflash_main();
__fm_reverb_resume();
return;
}
fm_app_mute(1);
if (fm_manage_set_fre(REAL_FREQ(__this->scan_fre))) {
__this->fm_freq_cur = __this->scan_fre;
save_fm_point(REAL_FREQ(__this->scan_fre));//保存当前频点
__this->fm_freq_channel_cur = get_channel_via_fre(REAL_FREQ(__this->scan_fre));//获取当前台号
__this->fm_total_channel = get_total_mem_channel();//获取新的总台数
fm_app_mute(0);
__fm_ui_show_station();
__fm_reverb_resume();
__this->scan_flag = 0;
return;
} else {
__fm_ui_reflash_main();
__this->fm_freq_cur = __this->scan_fre;
sys_timeout_add(NULL, __fm_semi_scan, 20);
}
}
void fm_delete_freq()
{
if (!__this || __this->scan_flag) {
return;
}
delete_fm_point(__this->fm_freq_cur);
}
void fm_scan_up()//半自动收台
{
log_info("KEY_FM_SCAN_UP\n");
if (!__this || __this->scan_flag) {
return;
}
__this->scan_fre = __this->fm_freq_cur;
__this->scan_flag = SEMI_SCANE_UP;
__fm_reverb_pause();
fm_app_mute(1);
#if TCFG_FM_INSIDE_ENABLE
fm_inside_trim(REAL_FREQ(__this->scan_fre) * 10);
#endif
sys_timeout_add(NULL, __fm_semi_scan, 20);
}
void fm_scan_down()//半自动收台
{
log_info("KEY_FM_SCAN_DOWN\n");
if (!__this || __this->scan_flag) {
return;
}
__this->scan_fre = __this->fm_freq_cur;
__this->scan_flag = SEMI_SCANE_DOWN;
__fm_reverb_pause();
fm_app_mute(1);
#if TCFG_FM_INSIDE_ENABLE
fm_inside_trim(REAL_FREQ(__this->scan_fre) * 10);
#endif
sys_timeout_add(NULL, __fm_semi_scan, 20);
}
void fm_scan_stop(void)
{
if (__this && __this->scan_flag) {
__this->scan_flag = 0;
os_time_dly(1);
__set_fm_station();
__fm_reverb_resume();
}
}
void fm_scan_all()
{
log_info("KEY_FM_SCAN_ALL\n");
if (!__this) {
return;
}
if (__this->scan_flag) {
fm_scan_stop();
return;
}
clear_all_fm_point();
__this->fm_freq_cur = 1;;
__this->fm_total_channel = 0;
__this->fm_freq_channel_cur = 0;
__this->scan_fre = VIRTUAL_FREQ(REAL_FREQ_MIN);
__this->scan_flag = SCANE_ALL;
__fm_reverb_pause();
fm_app_mute(1);
#if TCFG_FM_INSIDE_ENABLE
fm_inside_trim(REAL_FREQ(__this->scan_fre) * 10);
#endif
sys_timeout_add(NULL, __fm_scan_all, 20);
}
void fm_volume_pp(void)
{
log_info("KEY_MUSIC_PP\n");
if (!__this || __this->scan_flag) {
return ;
}
if (__this->fm_dev_mute == 0) {
fm_app_mute(1);
} else {
fm_app_mute(0);
}
}
void fm_prev_freq()
{
log_info("KEY_FM_PREV_FREQ\n");
if (!__this || __this->scan_flag) {
return;
}
if (__this->fm_freq_cur <= VIRTUAL_FREQ(REAL_FREQ_MIN)) {
__this->fm_freq_cur = VIRTUAL_FREQ(REAL_FREQ_MAX);
} else {
__this->fm_freq_cur -= 1;
}
__set_fm_frq();
__fm_ui_reflash_main();
}
void fm_next_freq()
{
log_info("KEY_FM_NEXT_FREQ\n");
if (!__this || __this->scan_flag) {
return;
}
if (__this->fm_freq_cur >= VIRTUAL_FREQ(REAL_FREQ_MAX)) {
__this->fm_freq_cur = VIRTUAL_FREQ(REAL_FREQ_MIN);
} else {
__this->fm_freq_cur += 1;
}
__set_fm_frq();
__fm_ui_reflash_main();
}
void fm_volume_up()
{
u8 vol = 0;
log_info("KEY_VOL_UP\n");
if (!__this || __this->scan_flag) {
return;
}
app_audio_volume_up(1);
log_info("fm vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
#if (TCFG_DEC2TWS_ENABLE)
bt_tws_sync_volume();
#endif
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
}
void fm_volume_down()
{
u8 vol = 0;
log_info("KEY_VOL_DOWN\n");
if (!__this || __this->scan_flag) {
return;
}
app_audio_volume_down(1);
log_info("fm vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
#if (TCFG_DEC2TWS_ENABLE)
bt_tws_sync_volume();
#endif
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
}
void fm_prev_station()
{
log_info("KEY_FM_PREV_STATION\n");
if (!__this || __this->scan_flag || (!__this->fm_total_channel)) {
return;
}
if (__this->fm_freq_channel_cur <= 1) {
__this->fm_freq_channel_cur = __this->fm_total_channel;
} else {
__this->fm_freq_channel_cur -= 1;
}
__set_fm_station();
__fm_ui_cur_station();
}
void fm_next_station()
{
log_info("KEY_FM_NEXT_STATION\n");
if (!__this || __this->scan_flag || (!__this->fm_total_channel)) {
return;
}
if (__this->fm_freq_channel_cur >= __this->fm_total_channel) {
__this->fm_freq_channel_cur = 1;
} else {
__this->fm_freq_channel_cur += 1;
}
__set_fm_station();
__fm_ui_cur_station();
}
/*----------------------------------------------------------------------------*/
/**@brief fm 入口初始化
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
void fm_api_init()
{
fm_hdl = (struct fm_opr *)malloc(sizeof(struct fm_opr));
memset(fm_hdl, 0x00, sizeof(struct fm_opr));
if (fm_hdl == NULL) {
puts("fm_state_machine fm_hdl malloc err !\n");
}
__this->fm_dev_mute = 0;
fm_app_mute(1);
fm_read_info_init();
os_time_dly(1);
fm_app_mute(0);
UI_SHOW_WINDOW(ID_WINDOW_FM);
}
/*----------------------------------------------------------------------------*/
/**@brief fm 任务资源释放
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
void fm_api_release()
{
int err = 0;
if (!__this) {
return;
}
if (__this->scan_flag) {
__this->scan_flag = 0;
__fm_reverb_resume();
}
if (__this != NULL) {
free(__this);
__this = NULL;
}
UI_HIDE_CURR_WINDOW();
}
u8 fm_get_scan_flag(void)
{
return __this->scan_flag;
}
u8 fm_get_fm_dev_mute(void)
{
return __this->fm_dev_mute;
}
u8 fm_get_cur_channel(void)
{
if (!__this) {
return 0;
}
return (u8)__this->fm_freq_channel_cur;
}
u16 fm_get_cur_fre(void)
{
if (!__this) {
return 0;
}
if (__this->fm_freq_cur > 1080) {
__this->fm_freq_cur /= 10;
}
return (__this->fm_freq_cur % 874) + 874;
}
u8 fm_get_mode(void)
{
u32 freq_min = REAL_FREQ_MIN / VIRTUAL_FREQ_STEP;
if (freq_min < 875) {
return 1;
} else {
return 0;
}
}
void fm_sel_station(u8 channel)
{
if (!__this) {
return;
}
if (channel > __this->fm_total_channel) {
printf("channel sel err!\n");
return;
}
__this->fm_freq_channel_cur = channel;
__set_fm_station();
}
u8 fm_set_fre(u16 fre)
{
if (!__this) {
return -1;
}
if ((fre < REAL_FREQ_MIN) || (fre > REAL_FREQ_MAX)) {
return -1;
}
__this->fm_freq_cur = VIRTUAL_FREQ(fre);
__set_fm_frq();
return 0;
}
u8 get_fm_scan_status(void)
{
return __this->scan_flag;
}
#endif