⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 5807收音机模块用于炬力平台
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *******************************************************************************
 *                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 + -