?? basal_fmradio.c
字號:
/*
*******************************************************************************
* ACTOS AP
* FM tunner basal module implementation
*
* (c) Copyright Actions Co,Ld.
*
*******************************************************************************
*/
#include "actos.h"
#include "fmradio.h"
//#include "chip_cfg.h"
//#include "../inc/typeext.h"
//#include "../inc/mmcmd.h"
//---公共變量區
//extern WORD FMStationTab[20];
//WORD G_FMStationTab[20];
//fm_play_status_t G_FMPlaystatus;
//-----basal module ----
#pragma memory=dataseg(RCODE)
//電臺頻率對照表(注:頻率范圍87M-108M 以K為精度要三位數,但由于最高位都是1,所以就可不記錄,只記中低位就可以了).
WORD m_FMStationTab[20];
fm_play_status_t m_FMPlaystatus; //當前電臺信息
FMStatus_Tab_t d_FMStatus; //從FM硬件讀取的當前頻率和聲道信息
char disable_hosc;
#pragma memory=default
//extern WORD SearchFreq;
//extern WORD SetFreq;
#pragma codeseg(MOD_BS_FMRADIO)
BOOL fmSendCommand(BYTE cmd, int param)
{
int i;
uchar k;
uint Tempfreq;
// if( (0x7f34 < m_FMPlaystatus.freq) && ( m_FMPlaystatus.freq < 0x80c4) ) disable_hosc = 1;
// else disable_hosc = 0;
//
switch (cmd)
{
case MC_OPEN:
BankSwitch(address_24_of(FM_Init) >> 16);
return FM_Init(m_FMPlaystatus.mode, (BYTE) param);
case MC_PLAY:
BankSwitch(address_24_of(FM_SetFreq) >> 16);
Tempfreq = (m_FMPlaystatus.freq<<6) + 0x0010;
FM_SetFreq(Tempfreq);
break;
case MC_STEP:
if (m_FMPlaystatus.station_count == 0)
return FALSE;
k = 0;
switch (param)
{
case UP: //找到下一電臺頻率
if (m_FMPlaystatus.station == m_FMPlaystatus.station_count)
m_FMPlaystatus.station = 0;
m_FMPlaystatus.station++;
for (i = 0; i < 20; i++)
{
if (m_FMStationTab[i] != 0)
{
k++;
if (k == m_FMPlaystatus.station)
break;
}
}
if (i >= 20) // 如沒有找到電臺,重新設置電臺數
{
m_FMPlaystatus.station_count = k - 1;
m_FMPlaystatus.station = 1;
}
break;
case DOWN: //找到上一電臺頻率
if (m_FMPlaystatus.station == 1)
m_FMPlaystatus.station = m_FMPlaystatus.station_count + 1;
m_FMPlaystatus.station--;
for (i = 0; i < 20; i++)
{
if (m_FMStationTab[i] != 0)
{
k++;
if (k == m_FMPlaystatus.station)
break;
}
}
if (i >= 20) // 如沒有找到電臺,重新設置電臺數
{
m_FMPlaystatus.station = m_FMPlaystatus.station_count = k + 1;
}
break;
default:
break;
}
m_FMPlaystatus.freq = m_FMStationTab[i];
BankSwitch(address_24_of(FM_SetFreq) >> 16);
Tempfreq = (m_FMPlaystatus.freq<<6) + 0x0010;
FM_SetFreq(Tempfreq);
return TRUE;
case MC_STEPGRID:
switch (param)
{
case UP:
if(((m_FMPlaystatus.freq+1)>210)&&(m_FMPlaystatus.mode==0))
m_FMPlaystatus.freq=0;
else if(((m_FMPlaystatus.freq+1)>140)&&(m_FMPlaystatus.mode==1))
m_FMPlaystatus.freq=0;
else
{
m_FMPlaystatus.freq += 1;
}
break;
case DOWN:
if((m_FMPlaystatus.freq == 0)&&(m_FMPlaystatus.mode==0))m_FMPlaystatus.freq=210;
else if((m_FMPlaystatus.freq==0)&&(m_FMPlaystatus.mode==1))m_FMPlaystatus.freq=140;
// if(((m_FMPlaystatus.freq-1)<0)&&
else
{
m_FMPlaystatus.freq-=1;
}
break;
default:
break;
}
BankSwitch(address_24_of(FM_SetFreq) >> 16);
Tempfreq = (m_FMPlaystatus.freq<<6) + 0x0010;
//SetFreq = m_FMPlaystatus.freq;
FM_SetFreq(Tempfreq);
return TRUE;
case MC_SEARCH:
FM_MUTE(SetMUTE);
BankSwitch(address_24_of(FM_Search) >> 16);
Tempfreq = (m_FMPlaystatus.freq<<6) + 0x0010;
//SearchFreq = m_FMPlaystatus.freq ;
return FM_Search(Tempfreq,param);
case MC_SAVESTATION:
if (m_FMPlaystatus.station != 0) //當前電臺在電臺表中有保存的情況
{
k = 0;
for (i = 0; i < 20; i++)
{
if (m_FMStationTab[i] != 0)
k++;
if (k == m_FMPlaystatus.station)
{
m_FMStationTab[i] = m_FMPlaystatus.freq;
break;
}
}
}
else if (m_FMPlaystatus.station_count > 19)
return FALSE;
else //新的電臺頻率保存到電臺表
{
m_FMPlaystatus.station_count++;
for (i = 0; i < 20; i++)
{
if (m_FMStationTab[i] == 0)
{
m_FMStationTab[i] = m_FMPlaystatus.freq;
m_FMPlaystatus.station = i + 1;
break;
}
}
}
return TRUE;
case MC_SETMODE:
m_FMPlaystatus.mode = (Station_bank_t) param;
break;
case MC_SETVOLUME:
BankSwitch(address_24_of(FM_VolumeSet) >> 16);
FM_VolumeSet((BYTE) param);
m_FMPlaystatus.volume = (BYTE) param;
break;
case MC_BACKUP:
memcpy((void *) (*(WORD *) param), m_FMStationTab, 40);
memcpy((void *) (*(WORD *) (param + 2)), &m_FMPlaystatus, sizeof(fm_play_status_t));
break;
case MC_RESTORE:
memcpy(m_FMStationTab, (void *) (*(WORD *) param), 40);
memcpy(&m_FMPlaystatus, (void *) (*(WORD *) (param + 2)), sizeof(fm_play_status_t));
break;
case MC_GETSTATUS:
BankSwitch(address_24_of(FM_GetStatus) >> 16);
FM_GetStatus(&d_FMStatus);
m_FMPlaystatus.freq=d_FMStatus.FM_CurrentFreq; //rda chenggangdeng
m_FMPlaystatus.stereo_status = d_FMStatus.FM_Stereo_Status;
k=0;
//當前電臺頻率值和電臺表中某一頻率差距小于150KHZ,此電臺和此電臺表對應
for(i=0;i<20;i++)
{
m_FMPlaystatus.station=0;
if(m_FMStationTab[i]!=0)
{
k++;
if(abs(m_FMPlaystatus.freq-m_FMStationTab[i])<1)
{
m_FMPlaystatus.station=k;
break;
}
}
}
memcpy((fm_play_status_t *) param, &m_FMPlaystatus, sizeof(fm_play_status_t));
break;
case MC_GETTABLE:
memcpy((WORD *) param, &m_FMStationTab[0], 20);
break;
case MC_DELONE:
if (m_FMPlaystatus.station == 0)
return FALSE;
//m_FMStationTab[m_FMPlaystatus.station-1]=0;
for (k = m_FMPlaystatus.station; k < m_FMPlaystatus.station_count + 1; k++)
{
m_FMStationTab[k - 1] = m_FMStationTab[k];
}
m_FMStationTab[m_FMPlaystatus.station_count - 1] = 0;
m_FMPlaystatus.station_count--;
m_FMPlaystatus.station = 0;
return TRUE;
case MC_DELALL:
for (i = 0; i < 20; i++)
{
m_FMStationTab[i] = 0;
}
m_FMPlaystatus.station = 0;
m_FMPlaystatus.station_count = 0;
break;
case MC_MUTE: //靜音
BankSwitch(address_24_of(FM_MUTE) >> 16);
while (!(k = FM_MUTE(param)))
{
output8(0x4e, input8(0x4e) | 0x8);
FM_GetStatus(&d_FMStatus);
}
break;
case MC_CLOSE:
BankSwitch(address_24_of(FM_Standby) >> 16);
FM_Exit(); //防止退出FM菜單,POP聲
FM_Standby();
// FM_Exit();
break;
case MC_GETFREQ:
*(uint *) param = m_FMPlaystatus.freq;
break;
case MC_SETFREQ:
m_FMPlaystatus.freq = param;
break;
default:
break;
}
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -