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

📄 panel.c~

📁 cam ui application for linux
💻 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 + -