📄 4010ui.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 + -