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

📄 4010ui.c

📁 威望公司MP3 + USB MCU 的参考软件
💻 C
字号:
/****************************************************************
*                      Viaon Technology (Suzhou) Co.,Ltd
*
*    Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
*                    All rights reserved.
*
*
* Filename:      	4010UI.c
*
* Programmer:    	Greg
*
* Created: 	 	1/2/2008
*
* Description: 		public functions 
*              
*        
* Change History (most recent first):	2008.1.2
****************************************************************/
#include "utiltypedef.h"
#include "4010UI.h"
#include "timer.h"
#include "halfm.h"
#include "hallcm.h"
#include "hali2c.h"
#include "halmp3dec.h"
#include "display.h"
#include "halvol.h"
#include "halir.h"
#include "halinfo.h"
#include "halfm.h"

static WORD data JumpSong = 0;
BYTE data JumpType = JUMP_IDLE;
extern BOOL data IsJumpFlag;
extern volatile BYTE data SongLocateTick;
extern BYTE data bDEVFlag;
extern BYTE DEVAttach[2];
//global value for IR
extern STREAM *fd_mp3;

BYTE data irjumptype = IRJUMP_TYPE_IDLE;
static WORD data irjump = 0;
//static BYTE data jump1 = 0;
//static BYTE data jump2 = 0;

//The MSB bit will be used to indicate the type of key.(1: control, 0:digital code)
//Assume the MSB bit will not be used by IR CODE.
#define IRKEY_TYPE_CTRL	0X80
#if (IR_KEY_NUMBER == IR_KEY_NUM20)
#define IRKEY_NUM		((IR_KEY_NUMBER-2)*2)	//PICKSONG, CHSET key is not included.
#else
#define IRKEY_NUM		(IR_KEY_NUMBER*2)
#endif
static BYTE KeyMap[IRKEY_NUM] = {
//IR Control 6 Keys
	IR_CODE_PLAYPAUSE, 			KEY_STATUS_PLAYPAUSE|IRKEY_TYPE_CTRL, //IR_CODE, KEYSTATUS
	IR_CODE_FM_INCREASE, 		KEY_STATUS_FM|IRKEY_TYPE_CTRL,
	IR_CODE_VOLDOWN, 			KEY_STATUS_VOLDOWN|IRKEY_TYPE_CTRL,
	IR_CODE_VOLUP, 			 	KEY_STATUS_VOLUP|IRKEY_TYPE_CTRL,	
	IR_CODE_RSEEK, 				KEY_STATUS_RSEEK|IRKEY_TYPE_CTRL,
	IR_CODE_FSEEK, 				KEY_STATUS_FSEEK|IRKEY_TYPE_CTRL,

//IR Control 7 Keys
#if (IR_KEY_NUMBER >= IR_KEY_NUM7)
	IR_CODE_FM_DECREASE, 		KEY_STATUS_FM_DECREASE|IRKEY_TYPE_CTRL,
#endif

//IR Control 8 Keys
#if (IR_KEY_NUMBER >= IR_KEY_NUM8)
	IR_CODE_EQ, 					KEY_STATUS_EQ|IRKEY_TYPE_CTRL,
#endif

//IR Control 20 Keys
#if (IR_KEY_NUMBER >= IR_KEY_NUM20)
	IR_CODE_0,  0,	
	IR_CODE_1,  1,
	IR_CODE_2,  2,
	IR_CODE_3,  3,
	IR_CODE_4,  4,
	IR_CODE_5,  5,
	IR_CODE_6,  6,
	IR_CODE_7,  7,
	IR_CODE_8,  8,
	IR_CODE_9,  9,
	//0xff, 	    IR_CODE_JUMP100_21, 100
	//0xff, 	    IR_CODE_JUMP200_21, 200	
	//0xff, 0xff,//{IR_CODE_PICKSONG, } //Assume the 0xff will not be used.
	//0xff, 0xff,//{IR_CODE_CHSET, }
#endif	
};


WORD halIRGetJump(void)
{
//	WORD wTmp;

	//if( irflag == IR_KEY20){
	//	wTmp = irjump;

	//}//else{ //IR_KEY21
		//wTmp = (irjump+jump1*100+jump2*200);
	//}

	return irjump;
}

void halIRClrJump(void)
{
	irjump = 0;
//	jump1 = 0; jump2 = 0;
	irjumptype = IRJUMP_TYPE_IDLE;
	
	return;
}

void halIRPickSong(void)
{
	WORD wTmp = halIRGetJump();

	if((wTmp != 0)&&(wTmp<=Mp3SReq.swTotalCnt)){
		keystatus = KEY_STATUS_JUMP;
		//UartOutText("-I-: KEY_STATUS_JUMP=");UartOutValue(irjump, 4);
		Mp3SReq.swJump = wTmp;
	}else{
		DispSetStatus(DISP_ERROR_STATUS);
	}	
	
	//halIRClrJump();			

	return;
}

void halIRChSet(void)
{
	BYTE bTmp;

	bTmp = halFMFreq2Idx(halIRGetJump());
	if(bTmp != FM_CHIDX_INVALID){
		halFMSet(bTmp);//halFMFreq2Idx(irjump)
		halWRInfo1();	//Record the new FM Frequency
		//keystatus = KEY_STATUS_FM;
		DispSetStatus(DISP_FMCH_STATUS);	
		UartOutText("-I-:irjumptype:\t");UartOutValue(irjumptype, 2);
		UartOutText("-I-:bTmp:\t");UartOutValue(bTmp, 2);

		
	}else{
		DispSetStatus(DISP_ERROR_STATUS);
	}
	
	//halIRClrJump();			

	return;
}

void _halIRDigHd(BYTE bT1)
{
	BYTE i;
	
	/*Search the key map*/
	for(i=0; i<IRKEY_NUM; i+=2){
		if(KeyMap[i] == bT1){//Got it.
			if(KeyMap[i+1]&IRKEY_TYPE_CTRL){
				//keystatus = bT1;
				keystatus = KeyMap[i+1]&(~IRKEY_TYPE_CTRL); //Clear the type bit
				if((keystatus == KEY_STATUS_FSEEK)||(keystatus == KEY_STATUS_RSEEK)){
					IsJumpFlag = TRUE;
					SongLocateTick = 0;
				}
				UartOutText("-I-:keystatus \t");UartOutValue(keystatus, 2);
			}else{//Digital		
				if(irjumptype != IRJUMP_TYPE_IDLE)	{
					irjump = irjump*10 + KeyMap[i+1];
				}
				UartOutText("-I-irjump----\t");UartOutValue(irjump, 2);
			}
		}
	}

	return;
}

void halIRHandle(void)
{	
	BYTE data bT1;
	WORD wUCode;
	DWORD irdata;
	
	if(halIRGet(&irdata) == TRUE){
	//if(halIRGet(&irdata) != IR_NULL){//if need to response repeat IR

		//IR key validation checking
		//bT0 = ((BYTE *)(&irdata))[0];//Key code
		bT1 = ((BYTE *)(&irdata))[1];
		wUCode = ((WORD *)(&irdata))[1];
		UartOutText("-I-: irdata 0x");UartOutValue(irdata, 2);
		//Checking the Key Code here. BYTE3 == ~BYTE4, and checking the max key code
		//UartOutText("-I-: bT0=");UartOutValue(bT0, 2);
		//UartOutText("-I-: IR bT1=");UartOutValue(bT1, 2);
		//UartOutText("-I-: wUCode=");UartOutValue(wUCode, 4);

		//Checking the User Code here
		//if((IR_CODE_USER_CODE != wUCode) || (bT0 != ~bT1))
		//if((IR_CODE_USER_CODE != wUCode))		return;
		if((IR_CODE_USER_CODE != wUCode))
		{
			return;
		}	
		UartOutText("-I-: IR bT1=");UartOutValue(bT1, 2);
		
		//IR key handler	
#if (IR_KEY_NUMBER == IR_KEY_NUM20)		
			switch(bT1){
			case IR_CODE_PICKSONG:
				//Clear irjump, waitting digital input
				//Record IR key type, the MSB will be used.
				halIRClrJump();			
				irjumptype = IRJUMP_TYPE_PICKSONG;
				DispSetStatus(DISP_CTRLDIG_STATUS);
				UartOutText("-I-irjump\t");UartOutValue(irjump, 2);
				break;
				
			case IR_CODE_CHSET:
				//Clear irjump, waitting digital input
				//Record IR key type, the MSB will be used.
				halIRClrJump();			
				irjumptype = IRJUMP_TYPE_CHSET;
				DispSetStatus(DISP_CTRLDIG_STATUS);
				break;

			default:
				_halIRDigHd(bT1);
				break;
			}
#else
			_halIRDigHd(bT1);
#endif
		//Show JUMP
	#if ((IR_KEY_NUMBER == IR_KEY_NUM20)	)
		if(halIRGetJump() > DIGITAL_SHOW_MAX_VALUE){
			DispSetStatus(DISP_ERROR_STATUS);
			halIRClrJump();
		}
	
		if(halIRGetJump() > 0){
			DispSetStatus(DISP_CTRLDIG_STATUS);
		}	
	#endif	
	}

	return;
}

void _halKeyEQ()
{
#ifdef ENABLE_EQ_KEY
	halEQUp();//halEQSet();//g_byEqValue = halSetEQ(g_byEqValue+1);
	DispSetStatus(DISP_EQ_STATUS);
#endif
	return;
}

void _halKeyFMUp()
{
#if 0
	hal9255FMRead();
#else
	halFMUp();

	halWRInfo1();
//	hal9255FMRead();
	
	DispSetStatus(DISP_FMCH_STATUS);
#endif
	return;
}

void _halKeyFMDown()
{
	halFMDown();

	halWRInfo1();
	
	DispSetStatus(DISP_FMCH_STATUS);

	return;
}

void _halKeyVolUp()
{
	halVolUp();
	DispSetStatus(DISP_VOLUMN_STATUS);

	return;
}

void _halKeyVolDown()
{
	halVolDown();
	DispSetStatus(DISP_VOLUMN_STATUS);
	
	return;
}

static BYTE SeekMap[] = {
	SEARCH_MP3_NEXT,
	SEARCH_MP3_PREV,
	SEARCH_MP3_JUMP,
};

void _halKeySeek()
{
	//DRIVE *drv = DriveGet();
	//UartOutText("-I-_halKeySeek \r\n");
	//UartOutText("keystatus\t");UartOutValue(keystatus,2);
	//UartOutText("SongLocateTick\t");UartOutValue(SongLocateTick,2);


	if(mp3status == MP3STATUS_PAUSE)
		mp3status = MP3STATUS_PLAY;
	
	if(keystatus == KEY_STATUS_FSEEK){
		JumpSong++;
		JumpType = JUMP_FORWARD;
		//UartOutText("JumpSong\t");UartOutValue(JumpSong,2);
		return;
	}
	
	if(keystatus == KEY_STATUS_RSEEK){
		JumpSong++;
		JumpType = JUMP_BACKWARD;
		//UartOutText("JumpSong\t");UartOutValue(JumpSong,2);
		return;
	}	
	
	Mp3SReq.bySType = SeekMap[keystatus - KEY_STATUS_FSEEK];

	//MUTE_HW();
	//UartOutText("----MUTE_HW----\r\n");
	//DISABLE_INTERRUPTS;
	//SysTicks = 0;
	//while(SysTicks < 5);
	//ENABLE_INTERRUPTS;
 	//DelayMs(200);
	if(mp3status == MP3STATUS_PLAY)//If the current status is playing, the volume smooth procedure should be done.
		halVolSmthSet(halVolGet(), SMOOTH_CAUSE_VOLDOWN, VOL_SMTH_BEGIN-1);//Volume down
	else{
		DriveFlush(TRUE);
		FileSearch(&Mp3SearchInfo, &Mp3SReq);	
		mp3status = MP3STATUS_WAKEUP;
		DispSetStatus(DISP_SONGIDX_STATUS);
	}	

	return;
}

void _halKeyPlay()
{
	DRIVE *drv = DriveGet();
	switch(mp3status)
	{
		case MP3STATUS_IDLE:
			//MUTE_HW();
			//DelayMs(400);
			//UartOutText("----MUTE_HW----\r\n");
			//UartOutText("--P1--");UartOutValue(P1,2);
//			MP3_MUTE_ENABLE();	//modify by Ivor yan
//			DelayMs(10);

			DriveFlush(TRUE);
			FileSearch(&Mp3SearchInfo, &Mp3SReq);	
		case MP3STATUS_WAKEUP:	
			//DISABLE_INTERRUPTS;
			//SysTicks = 0;
			//while(SysTicks < 10);
			//ENABLE_INTERRUPTS;
			//DelayMs(1000);
			//DISMUTE_HW();
			//UartOutText("----DISMUTE_HW----\r\n");
			
			fd_mp3 = FileOpenMp3(drv, &Mp3SearchInfo);
			if(fd_mp3 != NULL){
				halWRInfo1();
				DispReset();
				halMp3Play();//fd_mp3);
				mp3status = MP3STATUS_PLAY;
				DispSetStatus(DISP_SONGIDX_STATUS);
			}

			break;
		case MP3STATUS_PAUSE:
			MP3_PAUSE_DISABLE();
			mp3status = MP3STATUS_PLAY;
			DispSetStatus(DISP_NORMAL_STATUS);
			break;
		case MP3STATUS_PLAY:

			if(DriveFlush(FALSE) != TRUE){//Cannot Pause at current time
				return; //This key event will not be killed. And should be tried again, or just ignore.
			}

			MP3_PAUSE_ENABLE();
			mp3status = MP3STATUS_PAUSE;
			DispSetStatus(DISP_NORMAL_STATUS);//Including pause status
			break;
	}

	keystatus = KEY_STATUS_NOKEY;
	return;	
}

static void _halKeyDevChg(void)
{

	DRIVE *drv = DriveGet();

	DriveFlush(TRUE);
	if(drv->DevID ==  SD_DISK){ //Current device is sd card
		FSMState = FSMSTATE_USB;
	}else{	//Current device is usb
		FSMState = FSMSTATE_SD;
	}
			
	//keystatus = KEY_STATUS_NOKEY;
	bDEVFlag = DEVAttach[drv->DevID]; 
	UartOutText("-I-: _halKeyDevChg() \r\n");
	
	return;
}

void halKeyStop(void)
{
	//Mp3Ctrl = 0x00; //disable mp3 dec
	MP3_DEC_DISABLE();
	
	DriveFlush(TRUE);
	mp3status = MP3STATUS_WAKEUP;

	//keystatus = KEY_STATUS_NOKEY;

	UartOutText("-I-: halKeyStop() \r\n");

	return;
}

//The functions in this table should not have parameters and return value for 8051 Platform.
static void (*KeyHandleMap[KEY_STATUS_MAX])(void) = {
	NULL,				//Handler for KEY_STATUS_PLAYMODE
	_halKeyDevChg,
	_halKeyFMDown,
	_halKeyVolUp,
	_halKeyVolDown,
	_halKeyEQ,
	_halKeySeek,
	_halKeySeek,
	_halKeySeek,	
	_halKeyPlay,
	//_halKeyDevChg,
	halKeyStop,
};

void halKeyHandle(BYTE bStat)
{

	// If keystatus is KEY_STATUS_NOKEY, just return
	if(keystatus == KEY_STATUS_NOKEY){
#if 1		
		if(IsJumpFlag == TRUE){
			//UartOutText("-I-jump is true\r\n");
			if(SongLocateTick >= 6){
				UartOutText("-I-jump over\t");UartOutValue(JumpSong,2);
				if(JumpType == JUMP_FORWARD){
					if((Mp3SReq.swIdx + JumpSong) > Mp3SReq.swTotalCnt)
						Mp3SReq.swJump = Mp3SReq.swIdx + JumpSong - Mp3SReq.swTotalCnt;
					else
						Mp3SReq.swJump = Mp3SReq.swIdx + JumpSong;
				}else if(JumpType == JUMP_BACKWARD){
					if(Mp3SReq.swIdx == JumpSong)
						Mp3SReq.swJump = Mp3SReq.swTotalCnt;
					else
						Mp3SReq.swJump = Mp3SReq.swIdx - JumpSong;
				}
					
				keystatus = KEY_STATUS_JUMP;
				JumpType = JUMP_IDLE;
				SongLocateTick = 0;
				JumpSong = 0;
				IsJumpFlag = FALSE;

				//MP3_MUTE_ENABLE();	//modify by Ivor yan

				//MUTE_HW();
				//UartOutText("----MUTE_HW----\r\n");
				//SysTicks = 0;
				//while(SysTicks < 10);
			}
			
			//IsJumpFlag = FALSE;
		}
#endif	
		return;
	}
	
	if(bStat != FSMSTATE_INIT){
		if(keystatus >= KEY_STATUS_WITHDEV){
			keystatus = KEY_STATUS_NOKEY; //Cannot handle these keys without device
			return;
		}	
	}
	
	KeyHandleMap[keystatus](); 
	
	//if(1)//NOTE: In some cases the keystatus should no be cleared.
	//if(keystatus != KEY_STATUS_PLAYPAUSE)
		keystatus = KEY_STATUS_NOKEY;

	//halWRInfo1();
	
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -