📄 panel.c~
字号:
#include <stdio.h>
//#include <fcntl.h>
#include <time.h>
//#include <sys/ioctl.h>
//#include "../../include/linux/ql_per/ql_gpio_user.h"
//#include <linux/ql_per/ql_gpio_user.h>
#include "memorycam.h"
#include "panel.h"
#include "state.h"
#include "utl.h"
// === Global variables ===
//int fdGPIO, fdHIU; // HIU & GPIO
//struct gpio_config_info_user GPIOInfo; // Configuration information of GPIO
//unsigned long ulGPIOMask, ulGPIOIn;
//char aDisplayRam[2][8] = {{' ', 'Q', 'p', 'i', 'x', 'e', 'l', ' '},
// {'M', 'e', 'm', '.', ' ', 'C', 'a', 'm'}};
char aDisplayRam[2][8] = {{'W', 'e', 'i', 'k', 'e', 'n', 'g', ' '},
{'M', 'e', 'm', '.', ' ', 'C', 'a', 'm'}};
//int iColFlag;
char cStrBuf[2][81];
int iStrLen[2] = {0, 0};
int iStrDispIdx[2] = {0, 0};
int iKeyNow, iKeyPrev;
int iTimeDisplayMode = TIME_DISPLAY_TIME_NORMAL;
int _WriteData (int iType, unsigned short bData);
void _Delay (int count);
int _itoa (int iVal, char *aBuf);
int _itoal (int iVal, char *aBuf);
int _ClearDisplayRam(int LineNo);
int _RollingDisplay (void);
// === Functions ===
int PANEL_UpdateLine (int LineNo)
{
int i;
int iLineToUpdate;
if (LineNo == LCM_LINE_BOTH)
iLineToUpdate = LCM_LINE_1;
else
iLineToUpdate = LineNo;
do
{
if ((iLineToUpdate == LCM_LINE_1))
_WriteData (LCM_INSTRUCTION, LCM_INS_DDRAM_LINE1_ADDR);
else if (iLineToUpdate == LCM_LINE_2)
_WriteData (LCM_INSTRUCTION, LCM_INS_DDRAM_LINE2_ADDR);
else
return -1;
for (i = 0; i < 8; i ++)
_WriteData (LCM_DISPDATA, aDisplayRam[iLineToUpdate][i]);
if (LineNo == LCM_LINE_BOTH)
{
if (iLineToUpdate == LCM_LINE_1)
iLineToUpdate = LCM_LINE_2;
else
LineNo = LCM_LINE_2;
}
} while (LineNo == LCM_LINE_BOTH);
return 0;
}
int PANEL_Initial (void)
{
// Step 1: Open HIU & GPIO
/*
if (PANEL_OpenHIU_GPIO () == -1)
{
return -1;
}
*/
if (UTL_OpenHIU () == -1)
return -1;
if (UTL_OpenGPIO () == -1)
return -1;
/*if (UTL_OpenI2C () == -1)
return -1;*/
// Step 2: Configure GPIO 4 & 3 as output for LCM RS & R/W pin, and set to HI
/*
GPIOInfo.bit_mask = (LCM_RS | LCM_RW);
GPIOInfo.dir = GPIO_OUT;
ioctl (fdGPIO, GPIO_IOCTL_CONFIG, &GPIOInfo);
ulGPIOMask = (LCM_RS | LCM_RW);
ioctl (fdGPIO, GPIO_IOCTL_SET, &ulGPIOMask);
*/
UTL_GPIOCtrl ((LCM_RS | LCM_RW), GPIO_OUT);
UTL_GPIOOut ((LCM_RS | LCM_RW), GPIO_HI);
// Step 3: Configure GPIO 7 & 6 & 5 as iutput for key scan
/*
GPIOInfo.bit_mask = (PANEL_KEY1 | PANEL_KEY2 | PANEL_KEY3 | SD_CD | SD_WP);
GPIOInfo.dir = GPIO_IN;
ioctl(fdGPIO, GPIO_IOCTL_CONFIG, &GPIOInfo);
*/
UTL_GPIOCtrl ((PANEL_KEY1 | PANEL_KEY2 | PANEL_KEY3 | SD_CD | SD_WP), GPIO_IN);
_WriteData (LCM_INSTRUCTION, LCM_INS_FUNCTION_SET);
usleep (1);
_WriteData (LCM_INSTRUCTION, LCM_INS_FUNCTION_SET);
_WriteData (LCM_INSTRUCTION, LCM_INS_FUNCTION_SET);
_WriteData (LCM_INSTRUCTION, LCM_INS_DISPLAY_OFF);
_WriteData (LCM_INSTRUCTION, LCM_INS_CLEARDISP);
usleep (1);
_WriteData (LCM_INSTRUCTION, LCM_INS_ENTRY_MODE);
PANEL_UpdateLine (LCM_LINE_BOTH);
_WriteData (LCM_INSTRUCTION, LCM_INS_DISPLAY_ON_NO_CURSER);
return 0;
}
int PANEL_ShowTime (void)
{
char aTimeBuf[2];
int iHour, iMin, iSec;
time_t tTime;
if (iStrLen[LCM_LINE_2])
return -1;
_ClearDisplayRam (LCM_LINE_2);
if (iStateNow == STATE_REC && !iErrCode)
{
tTime = *tTimetoMemCam;
iHour = tTime/3600;
iMin = (tTime/60)%60;
iSec = tTime%60;
_itoa (iHour, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
_itoa (iMin, aTimeBuf);
aDisplayRam[LCM_LINE_2][3] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][4] = aTimeBuf[1];
_itoa (iSec, aTimeBuf);
aDisplayRam[LCM_LINE_2][6] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][7] = aTimeBuf[1];
aDisplayRam[LCM_LINE_2][2] = ':';
aDisplayRam[LCM_LINE_2][5] = ':';
}
else
{
if (iTimeDisplayMode == TIME_DISPLAY_TIME_NORMAL)
{
_itoa (tmTimeNow.tm_hour, aTimeBuf);
aDisplayRam[LCM_LINE_2][3] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][4] = aTimeBuf[1];
_itoa (tmTimeNow.tm_min, aTimeBuf);
aDisplayRam[LCM_LINE_2][6] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][7] = aTimeBuf[1];
// if (iColFlag)
if (tmTimeNow.tm_sec % 2)
aDisplayRam[LCM_LINE_2][5] = ':';
}
else if (iTimeDisplayMode == TIME_DISPLAY_TIME_DATE)
{
_itoa (tmTimeNow.tm_year % 100, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
aDisplayRam[LCM_LINE_2][2] = '/';
_itoa (tmTimeNow.tm_mon + 1, aTimeBuf);
aDisplayRam[LCM_LINE_2][3] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][4] = aTimeBuf[1];
aDisplayRam[LCM_LINE_2][5] = '/';
_itoa (tmTimeNow.tm_mday, aTimeBuf);
aDisplayRam[LCM_LINE_2][6] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][7] = aTimeBuf[1];
}
else if (iTimeDisplayMode == TIME_DISPLAY_TIME_HMS)
{
_itoa (tmTimeNow.tm_hour, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
aDisplayRam[LCM_LINE_2][2] = ':';
_itoa (tmTimeNow.tm_min, aTimeBuf);
aDisplayRam[LCM_LINE_2][3] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][4] = aTimeBuf[1];
aDisplayRam[LCM_LINE_2][5] = ':';
_itoa (tmTimeNow.tm_sec, aTimeBuf);
aDisplayRam[LCM_LINE_2][6] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][7] = aTimeBuf[1];
}
}
PANEL_UpdateLine (LCM_LINE_2);
return 0;
}
//////////////////rober////////////////////////////
/*int PANEL_Timeset ()
{
char aTimeBuf[2];
int iHour, iMin, iSec,iYear,iMonth,iDay;
time_t tTime;
if (iStrLen[LCM_LINE_2])
return -1;
_ClearDisplayRam (LCM_LINE_2);
if (iTimeDisplayMode == TIME_DISPLAY_TIME_HOUR)
{
_itoa (tmTimeNow.tm_hour, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
//aDisplayRam[LCM_LINE_2][2] = ':';
}
else if(iTimeDisplayMode == TIME_DISPLAY_TIME_MIN){
_itoa (tmTimeNow.tm_min, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
//aDisplayRam[LCM_LINE_2][5] = ':';
}
else if(iTimeDisplayMode == TIME_DISPLAY_TIME_SEC)
{
_itoa (tmTimeNow.tm_sec, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
}
else if (iTimeDisplayMode == TIME_DISPLAY_TIME_YEAR)
{
_itoa (tmTimeNow.tm_year % 100, aTimeBuf);
printf("tmTimeNow.tm_year %d\n",tmTimeNow.tm_year);//rober test
printf("aTimeBuf YEAR %s\n",aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
//aDisplayRam[LCM_LINE_2][2] = '/';
}
else if (iTimeDisplayMode == TIME_DISPLAY_TIME_MONTH)
{
_itoa (tmTimeNow.tm_mon + 1, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
//aDisplayRam[LCM_LINE_2][5] = '/';
}
else if (iTimeDisplayMode == TIME_DISPLAY_TIME_DAY)
{
_itoa (tmTimeNow.tm_mday, aTimeBuf);
aDisplayRam[LCM_LINE_2][0] = aTimeBuf[0];
aDisplayRam[LCM_LINE_2][1] = aTimeBuf[1];
}
PANEL_UpdateLine (LCM_LINE_2);
return 0;
}*/
//////////////////////////////////////////////////
int _WriteData (int iType, unsigned short bData)
{
/*
if (iType == LCM_INSTRUCTION)
{
ulGPIOMask = LCM_RS | LCM_RW;
}
else if (iType == LCM_DISPDATA)
{
ulGPIOMask = LCM_RW;
}
else
{
return -1;
}
ioctl (fdGPIO, GPIO_IOCTL_CLEAR, &ulGPIOMask);
*/
if (iType == LCM_INSTRUCTION)
UTL_GPIOOut ((LCM_RS | LCM_RW), GPIO_LO);
else if (iType == LCM_DISPDATA)
UTL_GPIOOut (LCM_RW, GPIO_LO);
else
return -1;
// write (fdHIU, &bData, 1);
// ioctl (fdGPIO, GPIO_IOCTL_SET, &ulGPIOMask);
// ####### 7654321(8) ######
if (bData & 0x01)
{
bData &= 0xfe;
bData |= 0x100;
}
UTL_WriteHIU (bData);
UTL_GPIOOut ((LCM_RS | LCM_RW), GPIO_HI);
_Delay (30000);
return 0;
}
void _Delay (int count)
{
while (count)
count --;
}
int _itoa (int iVal, char *aBuf)
{
if (iVal > 99 || iVal < 0)
return -1;
aBuf[0] = iVal / 10 + 48;
aBuf[1] = iVal % 10 + 48;
return 0;
}
int _itoal (int iVal, char *aBuf)
{
int temp;
if (iVal > 99 || iVal < 0){
temp=iVal % 10 ;
aBuf[0] = iVal / 100 + 48;
aBuf[1] = ((iVal-temp)/10) % 10 + 48;
aBuf[2] = temp % 10 + 48;
}
else{
aBuf[0] = iVal / 10 + 48;
aBuf[1] = iVal % 10 + 48;
}
return 0;
}
int _ClearDisplayRam(int LineNo)
{
int i;
if (LineNo == LCM_LINE_BOTH)
{
for (i = 0; i < 8; i ++)
aDisplayRam[0][i] = ' ';
LineNo = LCM_LINE_2;
}
for (i = 0; i < 8; i ++)
aDisplayRam[LineNo][i] = ' ';
return 0;
}
/*
int PANEL_OpenHIU_GPIO (void)
{
if ((fdHIU = open (QL202B_HIU, O_RDWR)) < 0)
{
printf ("\nErr: HIU initial error");
PANEL_CloseHIU_GPIO ();
return -1;
}
if ((fdGPIO = open (QL202B_GPIO, O_RDWR)) < 0)
{
printf ("\nErr: GPIO initial error");
PANEL_CloseHIU_GPIO ();
return -1;
}
return 0;
}
int PANEL_CloseHIU_GPIO (void)
{
close (fdHIU);
close (fdGPIO);
return 0;
}
*/
int PANEL_Trigger (void)
{
_RollingDisplay ();
PANEL_ShowTime ();
}
int PANEL_Output (int LineNo, char *cStr)
{
int i;
if (LineNo == LCM_LINE_BOTH)
return -1;
if ((iStrLen[LineNo] = strlen (cStr)) > 80)
{
iStrLen[LineNo] = 0;
return -1;
}
strcpy (cStrBuf[LineNo], cStr);
iStrDispIdx[LineNo]=0;
_ClearDisplayRam(LineNo);
if (iStrLen[LineNo] > 8)
{
for (i = 0; i < 7; i ++)
{
if (cStrBuf[LineNo][i] == '\0')
break;
aDisplayRam[LineNo][i+1] = cStrBuf[LineNo][i];
}
}
else
{
for (i = 0; i < 8; i ++)
{
if (cStrBuf[LineNo][i] == '\0')
break;
aDisplayRam[LineNo][i] = cStrBuf[LineNo][i];
}
}
PANEL_UpdateLine (LineNo);
return 0;
}
int _RollingDisplay (void)
{
int i, iLineNo;
for (iLineNo = 0; iLineNo < 2; iLineNo ++)
{
if (iStrLen[iLineNo] > 8)
{
_ClearDisplayRam(iLineNo);
for (i = 0; i < 8; i ++)
{
if ((iStrDispIdx[iLineNo] + i) < 0)
continue;
if (cStrBuf[iLineNo][iStrDispIdx[iLineNo] + i] == '\0')
break;
aDisplayRam[iLineNo][i] = cStrBuf[iLineNo][iStrDispIdx[iLineNo] + i];
}
iStrDispIdx[iLineNo] ++;
if (iStrDispIdx[iLineNo] == iStrLen[iLineNo])
{
iStrDispIdx[iLineNo] = -8;
}
PANEL_UpdateLine (iLineNo);
}
}
}
int PANEL_KeyScan (void)
{
unsigned long ulGPIOIn;
// ioctl(fdGPIO, GPIO_IOCTL_IN, &ulGPIOIn);
ulGPIOIn = UTL_GPIOIn ();
if ((~ulGPIOIn) & PANEL_KEY1)
{
usleep (1);
// ioctl(fdGPIO, GPIO_IOCTL_IN, &ulGPIOIn);
ulGPIOIn = UTL_GPIOIn ();
if ((~ulGPIOIn) & PANEL_KEY1)
iKeyNow = KEY_KEY1;
else
iKeyNow = KEY_NO_KEY;
}
else if ((~ulGPIOIn) & PANEL_KEY2)
{
usleep (1);
// ioctl(fdGPIO, GPIO_IOCTL_IN, &ulGPIOIn);
ulGPIOIn = UTL_GPIOIn ();
if ((~ulGPIOIn) & PANEL_KEY2)
iKeyNow = KEY_KEY2;
else
iKeyNow = KEY_NO_KEY;
}
else if ((~ulGPIOIn) & PANEL_KEY3)
{
usleep (1);
// ioctl(fdGPIO, GPIO_IOCTL_IN, &ulGPIOIn);
ulGPIOIn = UTL_GPIOIn ();
if ((~ulGPIOIn) & PANEL_KEY3)
iKeyNow = KEY_KEY3;
else
iKeyNow = KEY_NO_KEY;
}
else
iKeyNow = KEY_NO_KEY;
if (iKeyNow == iKeyPrev)
iKeyNow = KEY_NO_KEY;
else
iKeyPrev = iKeyNow;
return iKeyNow;
}
int PANEL_ClearDisplay (int LineNo)
{
_ClearDisplayRam (LineNo);
PANEL_UpdateLine (LineNo);
iStrLen[LCM_LINE_1] = 0;
iStrLen[LCM_LINE_2] = 0;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -