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

📄 remote.c

📁 遥控处理程序 #define REMOTE_H
💻 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 + -