//헤더파일 #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 |