KT24-1110_65E-HA-651B/apps/soundbox/task_manager/fm/fm_rw.c

287 lines
7.5 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
#include "system/includes.h"
#include "syscfg_id.h"
#include "fm/fm.h"
#include "fm/fm_manage.h"
#include "fm/fm_rw.h"
#if TCFG_APP_FM_EN
/*************************************************************
fm模式vm api
sdk大部分是使用了虚拟频点,(1,234)875087608770
= REAL_FREQ()
= VIRTUAL_FREQ()
**************************************************************/
#define FM_USE_MALLOC_VM 1//使用静态变量优化vm访问
#if FM_USE_MALLOC_VM
FM_INFO *__this_fm_info = NULL;
#endif
/*----------------------------------------------------------------------------*/
/*@brief 获取一个byte中有几个位被置一
@param byte byte
@return
@note u8 get_total_mem_channel(void)
*/
/*----------------------------------------------------------------------------*/
static u8 __my_get_one_count(u8 byte)
{
u8 count = 0 ;
while (byte) {
count++ ;
byte &= (byte - 1) ;
}
return count ;
}
/*----------------------------------------------------------------------------*/
/**@brief 获取全部记录的频道
@param
@return
@note u8 get_total_mem_channel(void)
*/
/*----------------------------------------------------------------------------*/
u16 get_total_mem_channel(void)
{
FM_INFO fm_info = {0};
fm_read_info(&fm_info);
return fm_info.total_chanel;
}
/*----------------------------------------------------------------------------*/
/**@brief 根据频点偏移量获取频道
@param
@return
@note u8 get_channel_via_fre(u8 fre)
*/
/*----------------------------------------------------------------------------*/
u16 get_channel_via_fre(u16 fre)
{
FM_INFO fm_info = {0};
u16 i, k;
u16 total = 0;
fre = VIRTUAL_FREQ(fre);//fre - 874;
fm_read_info(&fm_info);
for (i = 0; i < (MEM_FM_LEN); i++) {
for (k = 0; k < 8; k++) {
if (fm_info.dat[i] & (BIT(k))) {
total++;
if (fre == (i * 8 + k)) {
return total; //return fre index
}
}
}
}
return 0x00;//fm_mode_var->wFreChannel; //find none
}
/*----------------------------------------------------------------------------*/
/**@brief 通过频道获取频点
@param channel
@return
@note u8 get_fre_via_channle(u8 channel)
*/
/*----------------------------------------------------------------------------*/
u16 get_fre_via_channel(u16 channel)
{
FM_INFO fm_info = {0};
u16 i, k;
u16 total = 0;
fm_read_info(&fm_info);
for (i = 0; i < (MEM_FM_LEN); i++) {
for (k = 0; k < 8; k++) {
if (fm_info.dat[i] & (BIT(k))) {
total++;
if (total == channel) {
return i * 8 + k; //fre = MIN_FRE + return val
}
}
}
}
return 0; //find none
}
/*----------------------------------------------------------------------------*/
/**@brief 从vm清除所有频点信息
@param
@return
@note void clear_all_fm_point(void)
*/
/*----------------------------------------------------------------------------*/
void clear_all_fm_point(void)
{
FM_INFO fm_info = {0};
fm_info.mask = FM_VM_MASK;
fm_info.curFreq = 1;
fm_info.curChanel = 0;
fm_info.total_chanel = 0;
fm_save_info(&fm_info);
}
/*----------------------------------------------------------------------------*/
/**@brief 根据频点偏移量保存到相应的频点位变量到vm
@param fre
@return
@note void save_fm_point(u8 fre)
*/
/*----------------------------------------------------------------------------*/
void save_fm_point(u16 fre)//1-206
{
FM_INFO fm_info = {0};
u16 i, k;
u16 total = 0;
fm_read_info(&fm_info);
fre = VIRTUAL_FREQ(fre);//fre - 874;
/* fre = fre - 874; */
i = fre / 8;
k = fre % 8;
fm_info.dat[i] |= BIT(k);
fm_info.curFreq = fre;
for (i = 0; i < (MEM_FM_LEN); i++) {
total += __my_get_one_count(fm_info.dat[i]);
}
total = total > MAX_CHANNEL ? MAX_CHANNEL : total;
fm_info.total_chanel = total;
fm_save_info(&fm_info);
}
/*----------------------------------------------------------------------------*/
/**@brief 删除频道
@param
@return
@note void delete_fm_point(u8 fre)
*/
/*----------------------------------------------------------------------------*/
void delete_fm_point(u16 fre)
{
u16 i, k;
FM_INFO fm_info = {0};
fm_read_info(&fm_info);
i = fre / 8;
k = fre % 8;
if (fm_info.dat[i] & BIT(k)) {
fm_info.dat[i] &= (~BIT(k));
fm_info.total_chanel--;
fm_save_info(&fm_info);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 最近一次操作记录
@param
@return
@note u8 ch_save(void)
*/
/*----------------------------------------------------------------------------*/
void fm_last_ch_save(u16 channel)
{
FM_INFO fm_info = {0};
fm_read_info(&fm_info);
fm_info.curFreq = 0;
fm_info.curChanel = channel;
fm_save_info(&fm_info);
}
/*----------------------------------------------------------------------------*/
/**@brief 最近一次操作记录
@param
@return
@note u8 ch_save(void)
*/
/*----------------------------------------------------------------------------*/
void fm_last_freq_save(u16 freq)
{
FM_INFO fm_info = {0};
fm_read_info(&fm_info);
fm_info.curChanel = 0;
freq = VIRTUAL_FREQ(freq);//fre - 874;
fm_info.curFreq = freq;// - 874;
fm_save_info(&fm_info);
}
/*----------------------------------------------------------------------------*/
/**@brief 保存信息到fm_buf
@param
@return
@note void fm_save_info()
*/
/*----------------------------------------------------------------------------*/
void fm_save_info(FM_INFO *info)
{
#if FM_USE_MALLOC_VM
if (__this_fm_info) {
memcpy(__this_fm_info, info, sizeof(FM_INFO));
}
#endif
syscfg_write(VM_FM_INFO, info, sizeof(FM_INFO));
}
/*----------------------------------------------------------------------------*/
/**@brief 从vm读取信息
@param
@return
@note void fm_read_info()
*/
/*----------------------------------------------------------------------------*/
void fm_read_info(FM_INFO *info)
{
#if FM_USE_MALLOC_VM
if (__this_fm_info) {
memcpy(info, __this_fm_info, sizeof(FM_INFO));
return;
}
#endif
if (sizeof(FM_INFO) != syscfg_read(VM_FM_INFO, info, sizeof(FM_INFO))) {
r_printf("fm_info is null xx\n");
memset(info, 0x00, sizeof(FM_INFO));
}
#if FM_USE_MALLOC_VM
if (!__this_fm_info) {
__this_fm_info = zalloc(sizeof(FM_INFO));
memcpy(__this_fm_info, info, sizeof(FM_INFO));
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 检查vm信息
@param
@return
@note void fm_read_info()
*/
/*----------------------------------------------------------------------------*/
void fm_vm_check(void)
{
FM_INFO fm_info = {0};
fm_read_info(&fm_info);
if (fm_info.mask != FM_VM_MASK) {
fm_info.mask = FM_VM_MASK;
fm_info.curFreq = 1;
fm_info.curChanel = 0;
fm_info.total_chanel = 0;
fm_save_info(&fm_info);
}
}
#endif