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

📄 basal_fmradio.c

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