📄 autosearchhandle.c
字号:
/*
*******************************************************************************
* ACTOS AP
* main ap of sdk 3.0
*
* (c) Copyright, Actions Co,Ld.
* All Right Reserved
*
*******************************************************************************
*/
#pragma codeseg(CODE_2)
#include "ap_radio.h"
#include "actos.h"
extern slider_t slider;
extern comval_t F_comval;
extern WORD FMStationTab[40]; // 前20个是US, 后20个是JP.
extern fm_play_status_t FMStatus;
extern FMRADIO_param_t radio_param;
extern char Freqtab[10];
WORD FMAutoTab[20]; // 全自动收台,预存台.
BYTE AutoTabNum; // 预存台数.
extern int TryPlayingHandle(void);
/*
********************************************************************************
* Description : 显示电台号.
*
* Arguments :
*
* Returns :
*
* Notes :
*
********************************************************************************
*/
void ShowStationCount(int count)
{
char buf[4];
char FMTab[7];
SetTextPos(46, 0); //SetTextPos(128/2-6*3,0);
if (count > 0) //显示电台号
{
strcpy(FMTab, "[");
strcat(FMTab, "CH");
*itoa_2(count, buf);
strcat(FMTab, buf);
strcat(FMTab, "]");
PutS(FMTab, -1);
}
UpdateScreen(NULL);
}
/*
********************************************************************************
* Description : 清除电台号
*
* Arguments :
*
* Returns :
*
* Notes :
*
********************************************************************************
*/
void CleanStationCount(void)
{
char FMTab[] = " ";
SetTextPos(46, 0); //SetTextPos(128/2-6*3,0);
PutS(FMTab, -1);
UpdateScreen(NULL);
}
/*
********************************************************************************
* Description : 显示全自动搜台界面
*
* Arguments :
*
* Returns :
*
* Notes :
*
********************************************************************************
*/
void ShowFreqInFM2(void)
{
char buf[4] =
{ "FM" };
long i;
int k, h;
char FMTab[5];
ClearScreen(NULL);
ResShowPic(RA_FM, 16, 0); //fm 标志显示
if (FMStatus.stereo_status == 0)
{
ResShowPic(RA_STERE, 98, 0); //显示立体声 ResShowPic(RA_STERE,128-30,0);
}
//k=GetBattery();
//ui_show_batt(GetBattery()); //电池电量显示
ui_show_batt(GetBattery(), F_comval.BatteryType); //电池电量显示
strcpy(Freqtab, "<");
strcat(Freqtab, "FM");
//频率换算及转换成ASCII码
k = FMStatus.freq;
if(FMStatus.mode==0)
i=k/10 + 87;
else
i=k/10 + 76;
h=k%10;
if (i < 100)
*itoa_2(i, buf);
else
*itoa_3(i, buf);
strcat(Freqtab, buf);
strcat(Freqtab, ".");
*itoa_1(h, buf);
//buf[1] = 0;
//buf[2] = 0;
strcat(Freqtab, buf);
strcat(Freqtab, ">");
SetTextPos(40, 8); //SetTextPos((128-6*8)/2,8);
PutS(Freqtab, -1); //显示电台频率
if (FMStatus.mode == 0)
{
k = (FMStatus.freq )*100/200;
ResShowPic(DWNARROW, 6 + k, 16); //显示箭头ResShowPic(DWNARROW,11-5+k,16);
ResShowPic(FQBAR, 0, 24); //显示US频率条
}
else
{
k = (FMStatus.freq )*100/200;
ResShowPic(DWNARROW, 24 + k, 16); //显示箭头 ResShowPic(DWNARROW,30-6+k,16);
ResShowPic(FQBAR2, 0, 24); //显示JP频率条
}
UpdateScreen(NULL); //刷新
}
/*
********************************************************************************
* Description : 搜索下一个在电台表中没有的新电台.
*
* Arguments : Direct,Next或Last搜索.
*
* Returns : TRUE:搜到下一个新电台,FALSE:没有搜到.
*
* Notes :
*
********************************************************************************
*/
bool Search_Show2(FM_direct_t Direct)
{
bool Search_Flag;
int i;
WORD temp;
FMStatus.stereo_status = 1;
FMStatus.station = 0;
fmSendCommand(MC_MUTE, SetMUTE);
fmSendCommand(MC_SETVOLUME, FMStatus.volume);
fmSendCommand(MC_RESTORE, (int) &radio_param);
Search_Flag = fmSendCommand(MC_SEARCH, Direct);
if (Search_Flag) //搜台成功后,MUTE释放
{
fmSendCommand(MC_GETFREQ, (int) &temp);
for (i = 0; i < AutoTabNum; i++) // 检查是否在电台表中
{
if (FMAutoTab[i] == temp)
{
Search_Flag = FALSE;
break;
}
}
if (Search_Flag)
{
if (FMStatus.volume)
fmSendCommand(MC_MUTE, releaseMUTE);
fmSendCommand(MC_GETSTATUS, (int) &FMStatus);
}
}
ShowFreqInFM2();
for (i = 0; i < 0x3999; i++)
{
}
return Search_Flag;
}
/*
********************************************************************************
* Description : 设置门限值,重新开始搜索.
*
* Arguments : 门限值
*
* Returns : TRUE:继续搜索,FALSE:中断搜索,正常结束.
*
* Notes :
*
********************************************************************************
*/
bool RestartSearch(byte level)
{
if (level <= 2)
return FALSE;
//fmSendCommand(MC_SETVOLUME,0);
//fmSendCommand(MC_CLOSE,0);
//fmSendCommand(MC_OPEN,level);
fmSendCommand(MC_MUTE, SetMUTE);
fmSendCommand(MC_SETVOLUME, FMStatus.volume);
fmSendCommand(MC_RESTORE, (int) &radio_param);
return TRUE;
}
/*
********************************************************************************
* Description : 全自动搜索
*
* Arguments : Direct,Next或Last搜索.
*
* Returns : 如果有可识别的热键消息, 返回结果消息
如果没有可识别的热键消息, 返回0
*
* Notes :
*
********************************************************************************
*/
int AutoSearchHandle(BYTE Direct)
{
int key;
bool need_draw = TRUE;
//BYTE Searchflag=1;
BYTE Search_Level = SearchLevel;
bool loop = TRUE;
BYTE Search_Loop = 2; //搜台的次数
BYTE temp;
AutoTabNum = 0; // 全自动搜索,从极值开始.
fmSendCommand(MC_BACKUP, (int) &radio_param);
if (FMStatus.mode == 0)
{
if (Direct == 10) // US频段
{
FMStatus.freq = 0x00;
}
else
{
FMStatus.freq = 210;
}
}
else
{ // JP频段
if (Direct == 10)
{
FMStatus.freq = 0;
}
else
{
FMStatus.freq = 140;
}
}
temp = FMStatus.station_count;
while (loop)
{
if (Direct != 0)
{
if (Direct == 10) //NEXT搜索处理
{
if(((FMStatus.freq+1)>210)&&(FMStatus.mode==0))
{
FMStatus.freq=0;
Search_Level--; // 以不同门限搜索.
Search_Loop--;
if (Search_Loop == 0)
{
loop = FALSE;
}
else
{
loop = RestartSearch(Search_Level);
}
}
else if(((FMStatus.freq+1)>140)&&(FMStatus.mode==1))
{
FMStatus.freq=0;
Search_Level--;
Search_Loop--;
if (Search_Loop == 0)
{
loop = FALSE;
}
else
{
loop = RestartSearch(Search_Level);
}
}
else
FMStatus.freq+=1;
if (loop && Search_Show2(UP))
{
ShowStationCount(AutoTabNum + 1);
key = TryPlayingHandle();
CleanStationCount();
need_draw = TRUE;
if (key == RESULT_RADIO) // 处理Play,mode键.
{
key = RESULT_IGNORE;
loop = FALSE;
}
else
{
if (key != RESULT_IGNORE && key != 0) // 处理热键.
{
loop = FALSE;
}
}
}
}
else if (Direct == 20) //LAST搜索处理
{
if(((FMStatus.freq-1)<0)&&(FMStatus.mode==0))
{
FMStatus.freq=0;
Search_Loop--;
if (Search_Loop == 0)
{
loop = FALSE;
}
else
{
loop = RestartSearch(Search_Level);
}
}
else if(((FMStatus.freq-1)<0)&&(FMStatus.mode==1))
{
FMStatus.freq=0;
Search_Level--;
Search_Loop--;
if (Search_Loop == 0)
{
loop = FALSE;
}
else
{
loop = RestartSearch(Search_Level);
}
}
else
{
FMStatus.freq-=1;
}
if (loop && Search_Show2(DOWN))
{
ShowStationCount(AutoTabNum + 1);
key = TryPlayingHandle();
CleanStationCount();
need_draw = TRUE;
if (key == RESULT_RADIO) // 处理Play,mode键.
{
key = RESULT_IGNORE;
loop = FALSE;
}
else
{
if (key != RESULT_IGNORE && key != 0) // 处理热键.
{
loop = FALSE;
}
}
}
}
else if (Direct == 50)
{
Direct = 0;
loop = 0;
key = 0;
}
}
if (loop && need_draw) //显示
{
ShowFreqInFM2();
need_draw = FALSE;
}
if (AutoTabNum >= 20) // 已搜到20个电台,正常退出.
loop = FALSE;
if (loop)
{
key = ap_get_message();
switch (key)
{
bool Search_Flag = FALSE;
case AP_MSG_STANDBY:
//do nothing
break;
case AP_KEY_PLAY | AP_KEY_UP:
case AP_KEY_MODE | AP_KEY_UP: // 保存电台, 返回播放界面.
loop = FALSE;
key = RESULT_IGNORE;
break;
default: //热键处理
key = ap_handle_hotkey(key);
if (key == RESULT_REDRAW)
need_draw = TRUE;
else if (key != 0)
{
loop = FALSE;
}
} // end switch(key)
} // end if(loop)
} // end while(loop)
if (AutoTabNum > 0)
{
memcpy(radio_param.param1, FMAutoTab, AutoTabNum * 2);
//if(FMStatus.station_count < AutoTabNum)
if (temp < AutoTabNum) // 覆盖所有电台
{
FMStatus.station_count = AutoTabNum;
}
else
{
if (key == 0)
{
FMStatus.station_count = AutoTabNum;
}
if (key == RESULT_IGNORE) // 覆盖部分电台
{
if (temp != 0)
FMStatus.station_count = temp;
}
}
FMStatus.freq = FMAutoTab[0];
FMStatus.station = 0;
fmSendCommand(MC_RESTORE, (int) &radio_param);
}
if (key == RESULT_IGNORE)
{
key = 0;
}
//fmSendCommand(MC_MUTE,releaseMUTE);
//fmSendCommand(MC_SETVOLUME,FMStatus.volume);
if (FMStatus.station_count > 0x00) // 没有搜到电台退出的情况.
{
fmSendCommand(MC_STEP, UP);
for (temp = 0; temp < 0xff; temp++) // 延迟
{
}
fmSendCommand(MC_BACKUP, (int) &radio_param);
}
return key;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -