287 lines
7.5 KiB
C
287 lines
7.5 KiB
C
|
#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,、2、3、4)代替了8750、8760、8770等真实的频率
|
|||
|
转换规则:真实 = 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
|
|||
|
|