프로그래밍

FND_KAY.APP(미완)

Dilrong 2015. 4. 15. 17:04
//헤더파일 
#include <termios.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/signal.h> 
#include <sys/types.h> 
#include <string.h> 
#include <asm/ioctls.h> 

//key_define 
#define KEY_NUM1    1 
#define KEY_NUM2    2 
#define KEY_NUM3    3 
#define KEY_NUM4    4 
#define KEY_NUM5    5 
#define KEY_NUM6    6 
#define KEY_NUM7    7 
#define KEY_NUM8    8 
#define KEY_NUM9    9 
#define KEY_NUM10   10 
#define KEY_NUM11   11 
#define KEY_NUM12   12 
#define KEY_NUM13   13 
#define KEY_NUM14   14 
#define KEY_NUM15   15 
#define KEY_NUM16   16 

//debug를 위한 printf 
#define dbg(x...)       printf(x)  

//fnd_define 
#define fnd_dev "/dev/fnd" 
#define MAXFND  8 

//key_file ... 
static char keyDev[] = "/dev/key"; 
static int  keyFd = (-1); 

//key_get 
unsigned char key_get(int tmo)
{    
    unsigned char b; 

    if (tmo) {  
        if (tmo < 0) 
            tmo = ~tmo * 1000; 
        else 
            tmo *= 1000000; 
        while (tmo > 0) {
            usleep(10000); 
            ioctl(keyFd, FIONREAD, &b); 
            if (b) return(b); 
            tmo -= 10000; 
        } 
        return(-1); /* timeout */ 
    } 
    else { 
        read(keyFd, &b, sizeof(b)); 
        return(b); 
    } 
} 

//FND에 나타낼 16진수 값으로 변환 
unsigned char asc_to_fnd(int n){ 
        unsigned char c; 
                switch (n) { 
                        case  0: c = 0x3f; break;
                        case  1: c = 0x06; break;
                        case  2: c = 0x5b; break;
                        case  3: c = 0x4f; break;
                        case  4: c = 0x66; break;
                        case  5: c = 0x6d; break;
                        case  6: c = 0x7d; break;
                        case  7: c = 0x07; break;
                        case  8: c = 0x7f; break;
                        case  9: c = 0x67; break;
                        case 10: c = 0x00; break;
                        case 11: c = 0x77; break;
                        case 12: c = 0x7c; break;
                        case 13: c = 0x39; break;
                        case 14: c = 0x5e; break;
                        case 15: c = 0x79; break;
                        case 16: c = 0x71; break;
                        default: c = 0x00; break;
                } 
        return c; 
} 



int main() 
{ 
    //변수 선언 
    unsigned char c; 

    int n, i, count,ccount,temp, dev; 
    int dec = 1; 
    int hex = 0; 
    //FND 버퍼 
    unsigned char buf[MAXFND+1]; 

    //파일 확인 
        dev = open( fnd_dev, O_RDWR); 
        if (dev < 0) {
                fprintf(stderr, "cannot open FND (%d)", dev); 
                exit(2); 
        } 
        memset(buf, 0, sizeof(buf)); 

        if((keyFd = open( keyDev, O_RDONLY )) < 0){          
        perror("open faile /dev/key"); 
        exit(-1); 
    } 
     
    memset(buf,0,sizeof(buf)); 
    count = 7; 
    while (1){ 
        c = key_get(10); 
        switch (c) { 
        case KEY_NUM1:  dbg("KEY_NUM1\n"); 
            if (dec == 1)
                temp = 1; 
            else if (hex == 1)
                temp = 11; 
             
            usleep(500000); 

            break; 

        case KEY_NUM2:  dbg("KEY_NUM2\n"); 
            if (dec == 1)
                temp = 2; 
            else if (hex == 1)
                temp = 12; 
            usleep(500000); 
     
            break; 

        case KEY_NUM3:  dbg("KEY_NUM3\n"); 
            if (dec == 1)
                temp = 3; 
            else if (hex == 1)
                temp = 13; 
            usleep(500000); 
         
            break; 

             
        case KEY_NUM4:  dbg("KEY_NUM4\n"); 
            if (count <= 7 count >= 0){ 
                temp = 10; 
                buf[7] = asc_to_fnd(temp); 
                for(i=6; i>=0; i--) 
                        buf[i+1]=buf[i]; 
                usleep(500000); 
            } 
            write(dev, buf, MAXFND); 
            continue; 
             

        case KEY_NUM5:  dbg("KEY_NUM5\n"); 
            if (dec == 1)
                temp = 4; 
            else if (hex == 1)
                temp = 14; 
            usleep(500000); 
         
            break; 

        case KEY_NUM6:  dbg("KEY_NUM6\n"); 
            if (dec == 1)
                temp = 5; 
            else if (hex == 1)
                temp = 15; 
            usleep(500000); 

         
            break; 

        case KEY_NUM7:  dbg("KEY_NUM7\n"); 
            if (dec == 1)
                temp = 6; 
            else if (hex == 1)
                temp = 16; 
            usleep(500000); 
         
            break; 
        case KEY_NUM8:  dbg("KEY_NUM8\n"); //Hex 
            dbg("Hex\n"); 
            hex = 1; 
            dec = 0; 
            continue; 
        case KEY_NUM9:  dbg("KEY_NUM9\n"); 
            if (dec == 1)
                temp = 7; 
            else if (hex == 1)
                temp = 10; 
            usleep(500000); 
         
            break; 

        case KEY_NUM10:  dbg("KEY_NUM10\n"); 
            if (dec == 1)
                temp = 8; 
            else if (hex == 1)
                temp = 10; 
            usleep(500000); 
         
            break; 
        case KEY_NUM11:  dbg("KEY_NUM11\n"); 
            if (dec == 1)
                temp = 9; 
            else if (hex == 1)
                temp = 10; 
            usleep(500000); 
         
            break; 
        case KEY_NUM12:  dbg("KEY_NUM12\n");  
            dbg("Dec\n"); 
            dec = 1; 
            hex = 0; 
            continue; 
        //초기화 
        case KEY_NUM13: 
            dbg("KEY_NUM13\n"); 
            for (i = 0; i < MAXFND; i++) {
                buf[i] = asc_to_fnd(10); 
            } 
            count=7; 
            write(dev, buf, MAXFND); 
         
            continue; 
             
        case KEY_NUM14:  dbg("KEY_NUM14\n"); 
            if (dec == 1)
                temp = 1; 
            else if (hex == 1)
                temp = 10; 
            usleep(500000); 
         
            break; 

        case KEY_NUM15:  dbg("KEY_NUM15\n"); 

            break;  
        case KEY_NUM16:  dbg("KEY_NUM16\n"); break; 
        default: /* timeout */ break;
        } 
         
        for(i=0;i<=7;i++){ 
            buf[i]=buf[i+1]; 
        } 
                 
        buf[7] = asc_to_fnd(temp); 
        write(dev, buf, MAXFND); 
     
        if(count<0) 
            count = 7; 

         
    }     
     
    return 0; 
     
} 

/* EOF */
반응형

'프로그래밍' 카테고리의 다른 글

커널 로드  (0) 2015.05.12
부트스트랩  (0) 2015.05.12
KEY(device driver)  (0) 2015.04.15
FND(device driver)  (0) 2015.04.15
mysh.c  (0) 2015.04.13