📄 remote.c
字号:
/*\\file: audio.c
Date. 2005.12.10 Ipman Robbin
Desp. ir decode.
Last update: 2006.08.10
Common: use icp decode ir
*/
#include "system.h"
#include <stdio.h>
volatile BYTE irDataBuff[4];
volatile BYTE irKeyEvent=0; //按键状态
volatile UINT16 icrCurrent=0; //当前icr值
volatile UINT16 icrPrevious=0; //上次icr值
volatile UINT16 icrSpace=0; //icr值间隔
static BYTE irByteIndex=0; //当前处理遥控器的字节INDEX
static BYTE irBitIndex=0; //遥控码位INDEX
static BYTE irIsFinish=TRUE; //标志解码成功
BYTE irIndex;
BYTE irCode=IR_KEY_UNKNOW;
BYTE lastIrCode = IR_KEY_UNKNOW;
UINT16 irKeyRptTimes=0;
#if defined(ALI5672)||defined(ALI5673S)
unsigned char selectSongFlag[2] = {0}; // 用于存储选择歌曲的信息,[0]-- 10+按键值,
volatile unsigned int switchSongNum = 0; // 曲目号
char switchSongDisp[3] = {0}; // 用于做选曲时闪的效果
#endif
//#ifdef IR_VERSION_C
#if defined(_DVD_363_)
#include "ir_dvd_363.h"
#elif defined(_DVD_313_)
#include "ir_dvd_313.h"
#elif defined(_DVD_316_)
#include "ir_dvd_313.h"
#elif defined(_DVD_330_)
#include "ir_dvd_330.h"
#elif defined(_DVD_353_)
#include "ir_dvd_353.h"
#elif defined(_DVD_392_) || defined(_DVD_317_)
#include "ir_dvd_392.h"
#elif defined(_DVD_393_)
#include "ir_dvd_393.h"
#elif defined(_DVD_396_)
#include "ir_dvd_396.h"
#elif defined(_DVD_888_)
#include "ir_dvd_888.h"
#elif defined(_DVD_381_)
#include "ir_dvd_381.h"
#elif defined(_VCD_313_)
#include "ir_vcd_313.h"
#elif defined(_VCD_392_)
#include "ir_vcd_392.h"
#elif defined(_VCD_316_)
#include "ir_vcd_313.h"
#elif defined(_VCD_363_)
#include "ir_vcd_363.h"
#elif defined(_VCD_353_)
#include "ir_vcd_353.h"
#elif defined(_VCD_393_)
#include "ir_vcd_393.h"
#elif defined(_VCD_888_)
#include "ir_vcd_888.h"
#elif defined(_VCD_330_)
#include "ir_vcd_330.h"
#elif defined(_VCD_563_)
#include "ir_vcd_563.h"
#endif
//#endif
static void ir_get_bit(char bit)
{
if(irByteIndex<4)//防止指针跑飞
{
irDataBuff[irByteIndex]<<=1;
if(bit==1)
{
irDataBuff[irByteIndex] |= 1;
}else{
irDataBuff[irByteIndex] &= 0xFE;
}
irBitIndex++;
if(irBitIndex%8==0)
{
irByteIndex++;
}
if(irBitIndex==32)//累计到32个,则发送遥控器接收完成标志
{
irBitIndex=0;
irByteIndex=0;
if(irDataBuff[0]==REMOTE_ADDR)//厂家码校验
{
{ irCode=irDataBuff[2];
irKeyEvent = _IR_KEY_DOWN;
}
}
}
}
}
BYTE ir_get_index(BYTE value)
{
BYTE index=0;
while(index<(sizeof(irCodeTable)/2) && (value!=pgm_read_byte(irCodeTable+index*2)))
{
index++;
}
if(index==(sizeof(irCodeTable)/2))
return KEY_NAME_NULL;
else
return index;
}
void ir_key_up(void)
{
BYTE dvdCmd;//dvd状态下需要发送的命令
if(irKeyRptTimes<_IR_DEPRESS_TIME) //短按遥控释放事件
{
if(irIndex<KEY_FUNC_COUNT) //如果是面板上有的按键
{
keyParam |= KEY_FROM_IR;
if(currentPower==_POWER_DISC)
{
if(irCode==IR_KEY_RPT)
lastKeyCode=KEY_NAME_RPT;
if(irCode==IR_KEY_RDM)
lastKeyCode=KEY_NAME_RDM;
#ifndef _SPHE_8100_
#if defined(_VCD_393_) || defined(_VCD_353_)
if(irCode==IR_KEY_PLAY)
lastKeyCode=KEY_NAME_NULL;
#else
if((irCode==IR_KEY_PLAY) || (irCode==IR_KEY_ENTER))
lastKeyCode=KEY_NAME_NULL;
#endif
#else
if(irCode==IR_KEY_INT)
lastKeyCode=KEY_NAME_INT;
if((irCode==IR_KEY_PLAY))
lastKeyCode=KEY_NAME_NULL;
#endif
}
if((irIndex==KEY_NAME_POW))
{
if(currentPower==_POWER_OFF)
key_depress(irIndex);
}else{
#ifdef _NO_PRESET_KEY_
#ifdef USE_TURBINE //使用涡轮
key_up(irIndex);
#else
if((irCode!=IR_KEY_VOL_UP) && (irCode!=IR_KEY_VOL_DOWN))
{
key_up(irIndex);
}
#endif
#else
if((currentPower==_POWER_DISC) && (irIndex<=KEY_NAME_6))
{
}
else
{
#ifdef USE_TURBINE //使用涡轮
// unsigned char tmpdata[2];
// sprintf(tmpdata,"%d",irIndex);
// disp_string(dispBuff,tmpdata,1,2);
key_up(irIndex);
#else
if((irCode!=IR_KEY_VOL_UP) && (irCode!=IR_KEY_VOL_DOWN))
{
key_up(irIndex);
}
#endif
}
#endif
}
keyParam &= ~KEY_FROM_IR;
}
if(irIndex!=KEY_NAME_NULL)
{
dvdCmd = pgm_read_byte(irCodeTable+irIndex*2+1);
#if defined(VCD_563)
#else
if(dvdCmd!=_CMD_NULL)
#endif
{
#if defined(VCD_563)
#else
if(irCode!=IR_KEY_10)
gotoFlagTimeout=0;
#if 1
else
TenPlusTimeout=10;
#endif
#endif
#ifdef _SPHE_8100_
if((dvdCmd==_CMD_INT) && (currentDiscType&DISC_MP3))
{
return;
}
if(((dvdCmd==_CMD_RDM)||(dvdCmd==_CMD_INT)) && (currentMode==_MODE_PAUSE))
return;
#endif
#if defined(ALI5673S)||defined(ALI5672)
if (irCode==IR_KEY_STOP)
lastKeyCode=KEY_NAME_STOP;
if(currentPower == _POWER_DISC)
{
if ((currentMode !=_MODE_PAUSE))
{
if (irCode==IR_KEY_10)
{
if ((currentMode!=_MODE_PROG)&&(currentMode!=_MODE_STOP))
{
if (gotoFlagTimeout==0)
{
selectSongFlag[0] = 1;
gotoFlagTimeout = FLAG_GOTO_TIMEOUT +5;
}
switch(selectSongFlag[0]) {
case 0: // 一位,
switchSongDisp[0] = ' '; // 显示用
switchSongDisp[1] = ' ';
switchSongDisp[2] = '-';
selectSongFlag[0] = 1;
selectSongFlag[1] = 1;
switchSongNum = 0;
break;
case 1: // 两位,
switchSongDisp[0] = ' '; // 显示用
switchSongDisp[1] = '-';
switchSongDisp[2] = '-';
selectSongFlag[0] = 2;
selectSongFlag[1] = 2;
switchSongNum = 0;
break;
case 2: // 三位
switchSongDisp[0] = '-'; // 显示用
switchSongDisp[1] = '-';
switchSongDisp[2] = '-';
selectSongFlag[0] = 0;
selectSongFlag[1] = 3;
switchSongNum= 0;
break;
default:
break;
}
disp_string(dispBuff,switchSongDisp,1,3);
}
}
else if ((irIndex<=5)||((irIndex>=30)&&(irIndex<=34))) // 0~9数字键值调整
{
if (gotoFlagTimeout) // 按键时间还未超时
{
char tmpChar = (char)(dvdCmd-0x10);
if (selectSongFlag[1]&&(tmpChar<=9)&&(tmpChar>=0))
{
if (tmpChar==6) // BUG处理
disp_char(dispBuff,1,switchSongDisp[0]);
selectSongFlag[1]--; // 减一
gotoFlagTimeout = FLAG_GOTO_TIMEOUT;
switch(selectSongFlag[1]) {
case 2:
switchSongDisp[0] = ASCII_NUM+tmpChar;
disp_char(dispBuff,1,switchSongDisp[0]);
switchSongNum += ((unsigned int)tmpChar)*100;
break;
case 1:
switchSongDisp[1] = ASCII_NUM+tmpChar;
disp_char(dispBuff,2,switchSongDisp[1]);
switchSongNum += ((unsigned int)tmpChar)*10;
break;
case 0:
switchSongDisp[2] = ASCII_NUM+tmpChar;
disp_char(dispBuff,3,switchSongDisp[2]);
display();
delay_ms(200);
switchSongNum += (unsigned int)tmpChar;
dvd_send_cmd(0x0A,switchSongNum>>8);
dvd_send_cmd(0x0B,switchSongNum);
selectSongFlag[0] = 0;
selectSongFlag[1] = 0;
switchSongNum = 0;
gotoFlagTimeout = 0;
break;
default:
break;
}
}
}
else // 直接发送按键曲目
{
if (dvdCmd != 0x10)
{
selectSongFlag[0] = 0;
selectSongFlag[1] = 0;
dvd_send_cmd(0x0A,0x00);
dvd_send_cmd(0x0B,(dvdCmd-0x10));
}
}
}else{
if (dvdCmd != _CMD_NULL)
dvd_send_cmd(_CMD_HEAD_KEY,dvdCmd);
if(dvdCmd==_CMD_STOP)
aliStartDisplayInfor(OFF);
}
}else{
if (dvdCmd == _CMD_PLAY)
dvd_send_cmd(_CMD_HEAD_KEY,dvdCmd);
}
}
#else
if(!((currentMode==_MODE_PAUSE) && (dvdCmd<=_CMD_KEY_10)))
dvd_send_cmd(_CMD_HEAD_KEY,dvdCmd);
#endif
}
}
}else{ //长按遥控释放事件
if(currentPower==_POWER_DISC)
{
if(bDVDSpeedMode==DVD_SEEK_MANUAL)
{
if((irIndex==KEY_NAME_FWD) || (irIndex==KEY_NAME_REV))
key_up(irIndex);
}
}
}
lastIrCode = irCode;
irCode=IR_KEY_UNKNOW;
irIndex = KEY_NAME_NULL;//
}
void ir_key_repeat(void)
{
irKeyRptTimes++;
if (irKeyRptTimes==_IR_DEPRESS_TIME)
{
irKeyRptTimes++;
if(irIndex<KEY_FUNC_COUNT)
{
if((irCode!=IR_KEY_VOL_DOWN) && (irCode!=IR_KEY_VOL_UP))
{
keyParam |= KEY_FROM_IR;
key_depress(irIndex);
keyParam &= ~KEY_FROM_IR;
}
}
}
if((irKeyRptTimes%_IR_RPT_SPEED)==0)
{
ir_key_down();
}
}
void ir_key_down(void)
{
//遥控按键中,VOL+-需要在按下后即判断
if(irCode==IR_KEY_VOL_UP)
{
knobParam = KNOB_INT|KNOB_CLOCK;
if(currentMode!=_MODE_PE)
selIndex=SEL_VOL;
}
if(irCode==IR_KEY_VOL_DOWN)
{
knobParam = KNOB_INT|KNOB_RCLOCK;
if(currentMode!=_MODE_PE)
selIndex=SEL_VOL;
}
//keyParam |= KEY_FROM_IR;
}
//ir消息线程,判断当前ir状态
void ir_thread(void)
{
switch(irKeyEvent)
{
case _IR_KEY_UP:
// disp_char(dispBuff,1,ASCII_NUM+(irCode>>4));
// disp_char(dispBuff,2,ASCII_NUM+(irCode&0x0F));
if((irDataBuff[2]+irDataBuff[3])==0xFF)
ir_key_up();
irKeyRptTimes=0;
break;
case _IR_KEY_REPEAT:
ir_key_repeat();//重复按键
//irKeyEvent=0;
break;
case _IR_KEY_DOWN:
irIndex = ir_get_index(irCode);
// unsigned char tmpdata[2];
// sprintf(tmpdata,"%d",irIndex);
// disp_string(dispBuff,tmpdata,1,2);
ir_key_down();
if((currentPower==_POWER_RADIO) && bRadioSeeking) //收音模式下
{
radio_stop_scan();//radioParam &= ~(RA_SEEKING|RA_PREVIEW|RA_IN_AMS);//按键按下,任何搜索停止
keyParam |= KEY_SEEK_STOP;
}
irKeyRptTimes=0;
break;
}
irKeyEvent=0;
}
/*
ICP中断,电平宽度捕捉,遥控解码
*/
SIGNAL(SIG_INPUT_CAPTURE1)//ICP1
{
if(!(keyParam&KEY_IN_PRESS))//注意:在键盘有按键未释放,遥控不允许工作
{
icrCurrent = ICR1; //读取本次宽度
icrSpace = icrCurrent - icrPrevious; //获得与上次下降沿的距离
icrPrevious = icrCurrent; //保存当前icr值,以备下次比较用
if (irIsFinish) //1----判断解码结束标记,重新开始
{
irIsFinish=FALSE; //新的解码开始,清除该标记
irByteIndex=0; //保存遥控码数据指针字节和位复位
irBitIndex=0;
icrPrevious = TCNT1_VAL;
reset_timer_ir();
}//2-----解码未结束,继续解码
else if (icrSpace<(ICR_SPACE_2ND+ICR_SHIFT) && icrSpace>(ICR_SPACE_2ND-ICR_SHIFT)) //3-----重发, 11.25ms
{
irBitIndex=0;
icrPrevious = TCNT1_VAL;
reset_timer_ir();
//irKeyEvent = _IR_KEY_REPEAT;
} //4-----非重发
else if(icrSpace<(ICR_SPACE_1ST+ICR_SHIFT) && icrSpace>(ICR_SPACE_1ST-ICR_SHIFT))//5-----开始的13.5ms延时
{
irBitIndex=0;
irCode=IR_KEY_UNKNOW; //先将遥控码清除
}//6----非开始的码头,应该为数据位或干扰
else if(icrSpace<(ICR_SPACE_BIT0+ICR_SHIFT) && icrSpace>(ICR_SPACE_BIT0-ICR_SHIFT))//收到0
{
ir_get_bit(0);
}
else if(icrSpace<(ICR_SPACE_BIT1+ICR_SHIFT) && icrSpace>(ICR_SPACE_BIT1-ICR_SHIFT))//收到1
{
ir_get_bit(1);
}
else if(icrSpace<(ICR_RUMP_MIN-ICR_SHIFT))//收到非0非1即为干扰,退出
{
irBitIndex=0; //重新置位
irByteIndex=0;
}else{
//if(icrSpace<60000)
irKeyEvent = _IR_KEY_REPEAT;//剩下的可能就是REPEAT了
}
}
}
/*
定时器溢出,当无按键时产生此事件
*/
SIGNAL(SIG_OVERFLOW1)
{
TCNT1 = TCNT1_VAL;
if(irCode!=IR_KEY_UNKNOW) //如果之前有按键
{
irKeyEvent = _IR_KEY_UP; //按键释放
}
irIsFinish=TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -