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

📄 autosearchhandle.c

📁 5807收音机模块用于炬力平台
💻 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 + -