📄 display.c
字号:
/****************************************************************
* Viaon Technology (Suzhou) Co.,Ltd
*
* Copyright 2007, Viaon Technology (Suzhou) Co.,Ltd,Suzhou,China
* All rights reserved.
*
*
* Filename: display.c
*
* Programmer: Greg
*
* Created: 1/2/2008
*
* Description: public functions
*
*
* Change History (most recent first): 2008.1.2
****************************************************************/
/*
1. Display content:
Song Index/Total counter, Long File Name,
Volumn, FM Channel, EQ Setting, PlayMode, U-Disk/SD, Play/Pause
2 Display Status(FSM)
Normal_Status:
Switch_Song_Status
Set_Volumn_Status
Set_FMCH_Status
Set_EQ_Status
Switch_USBSD_Status
Set_PlayPause_Status
Pick Songs/FMCH
开机画面
*/
#include "utiltypedef.h"
#include "reg51.h"
#include "va4010reg.h"
#include "config.h"
#include "common.h"
#include "4010UI.h"
#include "halfm.h"
#include "hallcm.h"
#include "display.h"
#include "hali2c.h"
#include "halmp3dec.h"
#include "timer.h"
#include "halvol.h"
#include "halinfo.h"
#include "libfat.h"
#if ((DIGITAL_SHOW == DIGITAL_SHOW_LCM) )
extern BYTE code nAsciiDotCode[ASCIIDOT_BUF_SIZE];
extern BYTE nAsciiDot[ASCIIDOT_BUF_SIZE];//65*5
#ifdef ENABLE_PLAYMODE_KEY
extern BYTE data bPMode;
#endif
/////////////////////////////////////////////
SBYTE data sbPos;//96-8;
static BYTE volatile data bgDispStatus;
static BYTE data bgDispStatusChg;
extern STREAM *fd_mp3;
static BYTE DispStr[16];
//static BYTE data bDigital[5];
static BYTE bDigital[5];
static BYTE data bDigIdx;
#define DISP_DEVID_MAXLEN 2
BYTE MemDev[2][DISP_DEVID_MAXLEN] = {
{'<', '>'},
{'?', '"'}
};
static void _DispHex2Dec(WORD wVal)
{
BYTE data bRed;//, byStartX, byStartY;
WORD data wDiv;
WORD data wVa;
wDiv = wVal; //~DIGITAL_SHOW_MASK
bDigIdx = 0;
memclr(bDigital, sizeof(bDigital));
wVa = 1000;
do{
bRed = wDiv/wVa;
wDiv = wDiv%wVa;
wVa /= 10;
if((bDigIdx == 0) && (bRed == 0) && (wVa > 0)){
continue;
}
bDigital[bDigIdx] = bRed;
bDigIdx++;
}while(wVa > 0);
return;
}
//This function will convert the decimal value into string. 123 -> "123"
static BYTE *_DispDec2ASCII(BYTE *buf, WORD wVal)
{
BYTE i;
BYTE *bPtr = buf;
_DispHex2Dec(wVal);
for(i=0; i<bDigIdx; i++){
bPtr[i] = bDigital[i] + '0';
}
return (bPtr+bDigIdx);
}
static BYTE _DispFMDec2ASCII()
{
BYTE *bPtr = DispStr;
BYTE bTmp;
BYTE bCnt;
bPtr = _DispDec2ASCII(bPtr, halFMGetFreq());
bTmp = *(bPtr-1);
*(bPtr-1) = '.';
*bPtr = bTmp;bPtr++;
bCnt = bPtr -DispStr; //The number CHAR
return bCnt;
}
//extern BYTE EQString[EQ_VALUE_MAX+1][6];
void DispInit(void) //This function should be done before any display operation
{
//Init global variable
bgDispStatus = DISP_IDLE_STATUS;
bgDispGap = 0;
bgDispStatusChg = FALSE;
#if 0
//Reset LCM
LCM_RST_OUT();
LCM_RST = 1;
DelayMs(200);
LCM_RST = 0;
DelayMs(200);
DelayMs(200);
LCM_RST = 1;
DelayMs(200);
#endif
//Init AsciiDot ICON buffer
#ifdef DISP_WE2PROM_ENABLE
WriteE2PRom(nAsciiDotCode, (sizeof(nAsciiDotCode)>>E2PROM_PAGE_SIZEEXP), ASCIIDOT_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP);
#endif
//ReadE2PRom(nAsciiDot, ASCIIDOT_BUF_SIZE, ASCIIDOT_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP);
Read_N_Bytes(nAsciiDot, ASCIIDOT_BUF_SIZE, ASCIIDOT_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP);
//memcopy(nAsciiDot, nAsciiDotCode, sizeof(nAsciiDotCode));
//Init LCM
halLCMInit();
#if 0
//DispText(0, 0, " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`", 65);
halLCMClear(0, 3);
halLCMWriteData(0, 0, " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`", 32);
while(1){
UartOutText("Hello \r\n");
DelayMs(200);
};
#endif
//Show start screen
#ifdef ENABLE_START_SCREEN
memcopy(DBUF, MyCarDot, MYCAR_SIZE);
while(1){
static BYTE bCol = 128;
SysTicks = 0;
while(SysTicks < 2);
halLCMIcon(bCol, DBUF);
bCol -= 6 ;
if(bCol == 0){
break;
}
}
#else
//halLCMWriteBig(0,"LOADING...",10);
halLCMWriteData(30, 1, "LOADING...", 18);
SysTicks = 0;
while(SysTicks < 20);
#endif
return;
}
void DispSetStatus(BYTE bStatus)
{
//if((bStatus == bgDispStatus) && (bStatus==DISP_NODEV_STATUS)){
// return;
//}
bgDispStatus = bStatus;
bgDispStatusChg = TRUE;
//if(bgDispStatus != DISP_NORMAL_STATUS){
bgDispGap = 0;
//}
return;
}
static void _halDispGapChk()
{
BYTE bGap = DISP_VOLUMN_GAP;
if(bgDispStatus == DISP_NORMAL_STATUS){
bGap = 8;
}
if(bgDispGap > bGap){
if(irjumptype == IRJUMP_TYPE_PICKSONG){
halIRPickSong();
}else if(irjumptype == IRJUMP_TYPE_CHSET){
halIRChSet();
}else{
DispSetStatus(DISP_NORMAL_STATUS);
}
halIRClrJump();
bgDispGap = 0;
}
return;
}
static void _halDispNoDev()
{
BYTE bCnt;
halLCMWriteData(24, 0,"NO DEVICE", 9);
//DispValue(32, 2, halFMGetFreq(), DISP_VALUE_FM);
bCnt = _DispFMDec2ASCII();
//halLCMWriteData(32, 2, DispStr, bCnt);
//halLCMWriteData(32+(bCnt<<3), 2, "MH", 3);
halLCMWriteData(32, 2,"*[", 2);
halLCMWriteData(52, 2, DispStr, bCnt);
return;
}
static void _halDispNormal()
{
BYTE * bpName;
BYTE *bPtr = DispStr;
BYTE bCnt;
DRIVE *drv = DriveGet();
if(FSMState != FSMSTATE_INIT){
_halDispNoDev();
return;
}
if(mp3status==MP3STATUS_PAUSE){
halLCMWriteBig(16, "PAUSE", 5);
return;
}
//Display LFN
if(sbPos <= 0) {
bpName = drv->Name + (-sbPos);
if(((drv->LFNCnt) + sbPos)<=0)
sbPos = 16;
halLCMWriteData(0, 2, bpName, 16);
}else{
bpName = drv->Name;
halLCMWriteData((sbPos<<3), 2, bpName, 16);
}
sbPos --; //Go ahead
halMp3Req(fd_mp3);
//Display current mp3 time
bPtr = _DispDec2ASCII(bPtr, bgMP3TM);
*bPtr = ':'; bPtr++;
bPtr = _DispDec2ASCII(bPtr, bgMP3TS);
bCnt = bPtr - DispStr;
halLCMWriteData(88, 0, DispStr, bCnt);
halMp3Req(fd_mp3);
//Display device id
halLCMWriteData(0, 0, MemDev[drv->DevID], DISP_DEVID_MAXLEN);
//halMp3Req(fd_mp3);
#ifdef ENABLE_PLAYMODE_KEY
//Display repeat set
if(bPMode == MP3_PMODE_REPEAT1)
halLCMWriteData(52, 0, "R1", 2);
else
halLCMWriteData(52, 0, "RA", 2);
#endif
//Display fm ch
bCnt = _DispFMDec2ASCII();
#if 0
halLCMWriteData(32, 0, DispStr, bCnt);
halLCMWriteData(32+(bCnt<<3), 0,"M", 1);
#else
//'*', ':'
halLCMWriteData(24, 0,"*[", 2);
halLCMWriteData(24+16, 0, DispStr, bCnt);
#endif
halMp3Req(fd_mp3);
bgDispGap = 0;
return;
}
void DispReset(void)
{
sbPos = 16;
bgMP3TMS = 0;
bgMP3TS = 0;
//bgMP3T10S = 0;
bgMP3TM = 0;
return;
}
BYTE DispFMSCase(void)
{
// BYTE *bPtr = DispStr;
// BYTE bCnt;
BYTE data bRet=FALSE;
_halDispGapChk();
// 1. Clear LCM, and display the STATUS, Large Font
if(bgDispStatusChg == TRUE){
bgDispStatusChg = FALSE;
bRet=TRUE;
}
return bRet; //TRUE: Display, FALSE: No Display
}
static void _halDispIdx(void)
{
BYTE *bPtr;
BYTE bCnt;
BYTE bColum;
bPtr = _DispDec2ASCII(DispStr, Mp3SReq.swIdx);
*bPtr = '/';bPtr++;
bPtr = _DispDec2ASCII(bPtr, Mp3SReq.swTotalCnt);
bCnt = bPtr -DispStr; //The number CHAR
//Maybe we should set the display column according the cnt;
bColum = (128-(bCnt<<4))>>1;
halLCMWriteBig(bColum, DispStr, bCnt);
return;
}
static void _halDispVol()
{
BYTE *bPtr = DispStr;
BYTE bCnt;
halLCMWriteBig(8, "VOL ", 4);
bPtr = _DispDec2ASCII(bPtr, halVolGet());
bCnt = bPtr -DispStr; //The number CHAR
//Maybe we should set the display column according the cnt;
halLCMWriteBig(64, DispStr, bCnt);
return;
}
static void _halDispFM()
{
BYTE *bPtr = DispStr;
BYTE bCnt;
bCnt = _DispFMDec2ASCII();
//Maybe we should set the display column according the cnt;
halLCMWriteBig(16, DispStr, bCnt);
halLCMWriteBig(16+(bCnt<<4), "MH", 3);
return;
}
static void _halDispJump()
{
//DispValue(32, 0, halIRGetJump(), DISP_VALUE_NORBIG);
BYTE *bPtr = DispStr;
BYTE bCnt;
bPtr = _DispDec2ASCII(bPtr, halIRGetJump());
bCnt = bPtr - DispStr;
halLCMWriteBig(16, DispStr, bCnt);
return;
}
static void _halDispSimp()
{
BYTE *bPtr;
if(bgDispStatus == DISP_EQ_STATUS)
bPtr = EQString[halEQGet()];
else
bPtr = "ERROR";
halLCMWriteBig(16, bPtr, 5); //EQ, PAUSE, ERROR
return;
}
static void _halDispCtrlDig()
{
BYTE *bPtr = DispStr;
BYTE bCnt;
WORD wTmp = halIRGetJump();
if(irjumptype == IRJUMP_TYPE_PICKSONG){
halLCMWriteBig(0, "IDX", 3);
}else{
halLCMWriteBig(0, "FM", 2);
}
if(wTmp > 0){
bPtr = _DispDec2ASCII(bPtr, wTmp);
bCnt = bPtr - DispStr;
halLCMWriteBig(56, DispStr, bCnt);
}
return;
}
//The functions in this table should not have parameters and return value for 8051 Platform.
static void (*DispHdMap[DISP_MAX_STATUS])(void) = {
_halDispNormal, //Including NODEV, PAUSE, PLAY
_halDispIdx,
_halDispVol,
_halDispFM,
_halDispSimp, //EQ
_halDispJump,
_halDispSimp, //ERROR
_halDispCtrlDig,
};
void DispFSM()
{
BYTE data bRet;
bRet = DispFMSCase();
if(!bRet) //No display needed.
return;
halLCMClear(0, 3);
halMp3Req(fd_mp3);
DispHdMap[bgDispStatus]();
return;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -