📄 main.c
字号:
/*
*******************************************************************************
* ACTOS AP
* main ap of sdk 3.0
*
* (c) Copyright, Actions Co,Ld.
* All Right Reserved
*
*******************************************************************************
*/
#include "ap_radio.h"
//#include "mem.h"
#include "actos.h"
#define OpenFMPower1() output8(0xc0,(input8(0xc0)|0x01)) //enable output a0
#define OpenFMPower2() output8(0xc1,(input8(0xc1)&0xfe)) //disable a0 input
#define OpenFMPower3() output8(0xc2,input8(0xc2)&0xfe)
#define CloseFMPower1() output8(0xc2,((input8(0xc2)|0x01))) //disable output a0
#define CloseFMPower2() output8(0xc2,((input8(0xc2)|0x01)))
extern fm_play_status_t m_FMPlaystatus;
int TimeCount;
FMRADIO_param_t radio_param;
slider_t slider;
region_t clrregion;
function_menu_t menu; //菜单结构体
comval_t F_comval;
//电台频率对照表(注:频率范围87M-108M(US)或76M-90M(Japan),以K为精度要三位数,但由于最高位都是1,所以就可不记录,只记中低位就可以了).
WORD FMStationTab[40];
fm_play_status_t FMStatus; //当前电台信息,8 bytes
fm_play_status_t FMStatusUS; //US电台信息暂存,8 bytes
fm_play_status_t FMStatusJP; //Japan电台信息暂存,8bytes
char fmdataflag[3]; //第一次进FM标志,3 bytes
char Freqtab[10];
//WORD SearchFreq;
//WORD SetFreq;
const int pic_inactive[] =
{ RA_SAVE, MICIN, DELL, DELALL, AUTOSEL, RA_US, RA_JP, EXIT }; //MICIN: for FM record by ccm
const int pic_active[] =
{ RA_SAVEA, MICINA, DELLA, DELALLA, AUTOSELA, RA_USA, RA_JPA, EXITA };//MICINA:for FM record by ccm
const int string[] =
{ FMENU1, FMENU15, FMENU2, FMENU3, FMENU16, FMENU4, FMENU5, FMENU6 }; //FMENU15:电台录音 by ccm
//函数定义
int SearchHandle(BYTE Direct); //自动搜索处理,Direct=10,NEXT,=20,LAST
int AutoSearchHandle(BYTE Direct);
int FMdeal(int test); //FM应用的处理
void ShowFreqInFM(void); //FM主界面显示
bool Search_Show(FM_direct_t Direct); //自动搜台时的显示
bool volmuteflag = 1; //静音标志
void volume_callback(int Vol) //音量设置的CALLBACK函数
{
//实时改变音量的值
FMStatus.vol_display = Vol;
FMStatus.volume = Vol * 31 / g_comval.VolumeMax;
fmSendCommand(MC_SETVOLUME, FMStatus.volume);
if (FMStatus.volume == 0)
fmSendCommand(MC_MUTE, SetMUTE);
else
fmSendCommand(MC_MUTE, releaseMUTE);
}
#if 0
//对第一进FM进行降噪
void volume_init()
{
uchar i,j;
for(i=0;i<FMStatus.volume;i++)
{
fmSendCommand(MC_SETVOLUME, i);
output8(WATCHDOG, input8(WATCHDOG) | 0x8);
for(j=0;j<100;j++);
}
}
#endif
#define OpenFM()
int main(int param)
{
int result;
//Open VCCOUT for FM Module. by ccm
int i, j;
char buffer_f3;
OpenFMPower1();
OpenFMPower2();
OpenFMPower3();
if (param == 0xfe)
{
fmSendCommand(MC_MUTE, SetMUTE);
fmSendCommand(MC_CLOSE, 0);
CloseFMPower2();
CloseFMPower1();
return 0;
}
TimeCount = 0;
///////////////////////////////
// buffer_f3=input8(0xf3); //由于外部rtc时间需要用到c0和c1口需要将其使能关闭
// output8(0xf3,0x00);
//////////////////////////////
for (i = 0; i < 599; i++)
{
j = 50;
for (; j > 0; j--)
{
;
}
}
//if(!DRV_Install("I2C_SLA.DRV",0)) while(1) {;}
//clear message queue for make sure delay 0.5s
while (ap_get_message() != 0)
{
;
}
ap_sleep(1);
res_fp = ResOpen("ui30.res"); //打开资源
ASSERT(res_fp != NULL); //问题报错,DEBUG时有效
//-------安装ud驱动------------
DRV_ActiveUD(0x00, MODE_SLOW);
result = VMRead(&F_comval, VM_SYSTEM, sizeof(F_comval)); //读系统变量
ASSERT(result);
//check if valid
if (F_comval.magic != MAGIC_COMVAL) //第一次读,初始化
{
DUMP_STRING("F_comval init-ed!");
//COMVAL_INIT(F_comval);
GetDefaultComval(&F_comval);
}
ap_message_init(&F_comval); //系统消息(如RTC COUNTER)初始化
result = VMRead(FMStationTab, VM_AP_RADIO, 80 + sizeof(fm_play_status_t) * 3 + 3); //长度重新计算
ASSERT(result);
// BatValue=GetBattery();
{
BYTE KeyTone_bak;
KeyTone_bak = F_comval.KeyTone;
if (F_comval.KeyTone)
{
F_comval.KeyTone = 0;
//sKY_Beep(F_comval.KeyTone);
}
result = FMdeal(param);
F_comval.KeyTone = KeyTone_bak;
}
//保存变量
fmSendCommand(MC_BACKUP, (int) &radio_param);
if (result == RESULT_RECORD) //截获FM中所有Rec热键录音。
result = RESULT_FMREC_START;
if ((result != RESULT_FMREC_NOSTART) && (result != RESULT_FMREC_START)) //非电台录音退出!for FM record by ccm
{
fmSendCommand(MC_CLOSE, 0);
//Close VCCOUT. by ccm
// CloseFMPower();
CloseFMPower2();
CloseFMPower1();
}
///////////////////////////////
//由于外部rtc时间需要用到c0和c1口,需要将其使能恢复
// output8(0xf3,buffer_f3);
//////////////////////////////
VMWrite(FMStationTab, VM_AP_RADIO);
ResClose(res_fp); //资源关闭
return result;
}
int FMdeal(int test)
{
int result = 0, key;
char FMBand[3], buf[4] =
{ "FM" };
//标志:need_draw,重画 BandSwitch,频段切换 FirstWait,刚进AP
bool need_draw = TRUE, BandSwitch = TRUE, FirstWait = TRUE;
long i;
int k, h;
static char active = 0; //进入菜单的选中号
if (test == 0xff)
need_draw = FALSE;
//result=0;
if (memcmp(fmdataflag, buf, 2) != 0)
{
for (k = 0; k < 40; k++)
{
FMStationTab[k] = 0;
}
memcpy(fmdataflag, buf, 3); //FM BUFFER标志赋初值
//US和JP暂存区赋初值
FMStatusUS.freq=5; //if USBand Freq(x) = (x-87)*10;for example: f(101.2)=(101.2-87)*10=142
FMStatusUS.mode = 0;
FMStatusUS.volume = 24;
FMStatusUS.vol_display = (FMStatusUS.volume * g_comval.VolumeMax) / 31;
FMStatusUS.station = 0;
FMStatusUS.station_count = 0;
FMStatusUS.stereo_status = 1;
FMStatusJP.freq=1;
FMStatusJP.mode = 1;
FMStatusJP.volume = 24;
FMStatusJP.vol_display = (FMStatusJP.volume * g_comval.VolumeMax) / 31;
FMStatusJP.station = 0;
FMStatusJP.station_count = 0;
FMStatusJP.stereo_status = 1;
memcpy(&FMStatus, &FMStatusUS, sizeof(FMStatus));
output8(0x99, input8(0x99) & 0xC0 | 0x18);
}
//clear the message pool 清除“初始化...”过程中按下的键!
while (ap_get_message() != AP_KEY_NULL)
{
;
}
while (1)
{
if (BandSwitch) //初始化
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -