2011년 8월 22일 월요일

robot] 리눅스 엔커시스로 UI짰던... 초 간단 모터 제어 PG

뭐 모터 제어 프로그램 이었다. 임베디드 타이눅스 박스에 넣기 전에 시리얼 통신이 잘 되는지 확인하려는 테스트 프로그램.


/* Motor Control Ver.0.1 */
#include
#include
#include
#include
#include

#include
struct termios tio; // 터미널 구조체
WINDOW *my_newwin(int h, int w, int y, int x) {
 WINDOW *win;
 win = newwin(h, w, y, x);
 box(win, '|', '-');
 wrefresh(win);
 return win;
}
int my_delwin(WINDOW *win) {
 wborder(win, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
 wrefresh(win);
 delwin(win);
}
int background() {
 attron(A_BOLD);

 mvaddstr(0,0, "+--------++--------++--------++--------++--------+ Pantilt Camera");
 mvaddstr(1,0, "|        ||        ||        ||        ||        | User Interface");
 mvaddstr(2,0, "|        ||        ||        ||        ||        |");
 mvaddstr(3,0, "|        ||        ||        ||        ||        |");
 mvaddstr(4,0, "+--------++--------++--------++--------++--------+");
 mvaddstr(5,0, "+--------++--------++--------++--------++--------+");
 mvaddstr(6,0, "|        ||        ||        ||        ||        |");
 mvaddstr(7,0, "|        ||        ||        ||        ||        |");
 mvaddstr(8,0, "|        ||        ||        ||        ||        |");
 mvaddstr(9,0, "+--------++--------++--------++--------++--------+");
 mvaddstr(10,0,"+--------++--------++--------++--------++--------+");
 mvaddstr(11,0,"|        ||        ||        ||        ||        | Press 'b' ");
 mvaddstr(12,0,"|        ||        ||        ||        ||        |to see Backward");
 mvaddstr(13,0,"|        ||        ||        ||        ||        |");
 mvaddstr(14,0,"+--------++--------++--------++--------++--------+");
 mvaddstr(15,0,"+--------++--------++--------++--------++--------+");
 mvaddstr(16,0,"|        ||        ||        ||        ||        |");
 mvaddstr(17,0,"|        ||        ||        ||        ||        |");
 mvaddstr(18,0,"|        ||        ||        ||        ||        |");
 mvaddstr(19,0,"+--------++--------++--------++--------++--------+");
 mvaddstr(20,0,"+--------++--------++--------++--------++--------+");
 mvaddstr(21,0,"|        ||        ||        ||        ||        |");
 mvaddstr(22,0,"|        ||        ||        ||        ||        |");
 mvaddstr(23,0,"|        ||        ||        ||        ||        |");
 mvaddstr(24,0,"+--------++--------++--------++--------++--------+Press 'q' to exit");
 attroff(A_BOLD);
 refresh();
}
int serial_control(int screen_x, int screen_y) {

 int fd, result; //fd 파일 디스크립터, result : 파일 RW 결과값
 long baud = B19200; //통신속도
 unsigned char buf; // 데이터 받을 buf -> unsigned를 안붙이면 값이 이상하게 나온다.
 char sBuffer[7]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 보낼 데이터 (현재 뚜리가 사용하고 있는 키트의 정의된 프로토콜 형식

 if((fd = open("/dev/ttyS0", O_RDWR|O_NDELAY|O_NOCTTY)) < 0) { // READ, WRITE로 Serial0 포트 열기
  exit(1);
 }
 ////////////////// 보낼 옵션 설정
 tio.c_cflag = baud|CS8|CREAD|CLOCAL; // baud 통신 속도, CS8 (8bit, No Parity, 1 Stop Bit)설정
 // CREAD 문자 수신가능하게 함, CLOCAL, Local Connection 모뎀제어 안함..
 //처음엔 CRTSCTS를 같이 c_cflag에 줬었다. 그래서 정상적으로 작동이 안되서 상당히 얘를 먹었다.
 // CRCTSCTS는 하드웨어 흐름제어, 직렬 케이블의 모든 선이 연결되어 있을 때 사용 -> 보통 모든선을 다 안쓰므로. ^^
 tio.c_cflag &= ~HUPCL;
 tio.c_lflag = 0;  // Local Mode 설정
 tio.c_iflag = IGNPAR; // Parity 오류가 있는 문자 무시
 tio.c_oflag = 0; // 출력처리 설정 0이면 아무것도 안함
 ///////////////// 옵션 설정 끝 (물론 추가적인 옵션도 많이 있으나 찾아보기 바란다.)
 tcflush(fd, TCIFLUSH); // 설정을 초기화
 tcsetattr(fd, TCSANOW, &tio); // tio 터미널 구조체의 속정으로 설정을 적용시킨다.

 fcntl(fd, F_SETFL, FNDELAY); // 열려있는 파일 제어를 위해 사용

 switch(screen_x) {
  case 0  : move(22,60); printw(" 0  ");
   switch(screen_y) {
    case 0  : move(22,66); printw(" 0  "); sBuffer[6]='a'; break;
    case 5 : move(22,66); printw(" 5  "); sBuffer[6]='b'; break;
     case 10 : move(22,66); printw(" 10  "); sBuffer[6]='c'; break;
    case 15 : move(22,66); printw(" 15  "); sBuffer[6]='d'; break;
    case 20 : move(22,66); printw(" 20  "); sBuffer[6]='e'; break;
   
   }
   break;
  case 10 : move(22,60); printw(" 10  ");
   switch(screen_y) {
    case 0  : move(22,66); printw(" 0  "); sBuffer[6]='f'; break;
    case 5 : move(22,66); printw(" 5  "); sBuffer[6]='g'; break;
     case 10 : move(22,66); printw(" 10  "); sBuffer[6]='h'; break;
    case 15 : move(22,66); printw(" 15  "); sBuffer[6]='i'; break;
    case 20 : move(22,66); printw(" 20  "); sBuffer[6]='j'; break;
  
   }
   break;

   case 20 : move(22,60); printw(" 20  ");
   switch(screen_y) {
    case 0  : move(22,66); printw(" 0  "); sBuffer[6]='k'; break;
    case 5 : move(22,66); printw(" 5  "); sBuffer[6]='l'; break;
     case 10 : move(22,66); printw(" 10  "); sBuffer[6]='m'; break;
    case 15 : move(22,66); printw(" 15  "); sBuffer[6]='n'; break;
    case 20 : move(22,66); printw(" 20  "); sBuffer[6]='o'; break;
 
   }
   break;

  case 30 : move(22,60); printw(" 30  ");
   switch(screen_y) {
    case 0  : move(22,66); printw(" 0  "); sBuffer[6]='p'; break;
    case 5 : move(22,66); printw(" 5  "); sBuffer[6]='q'; break;
     case 10 : move(22,66); printw(" 10  "); sBuffer[6]='r'; break;
    case 15 : move(22,66); printw(" 15  "); sBuffer[6]='s'; break;
    case 20 : move(22,66); printw(" 20  "); sBuffer[6]='t'; break;

   }
   break;

  case 40 : move(22,60); printw(" 40  ");
   switch(screen_y) {
    case 0  : move(22,66); printw(" 0  "); sBuffer[6]='u'; break;
    case 5 : move(22,66); printw(" 5  "); sBuffer[6]='v'; break;
     case 10 : move(22,66); printw(" 10  "); sBuffer[6]='w'; break;
    case 15 : move(22,66); printw(" 15  "); sBuffer[6]='x'; break;
    case 20 : move(22,66); printw(" 20  "); sBuffer[6]='y'; break;
   }
   break;

 }

 result = write(fd, sBuffer, 7); // 실제적으로 시리얼로 데이터를 보낸다. sBuffer값의 7개만 시리얼0으로 보낸다.
 if(result < 0) { // 에러냐?
  printf("write error\n");
  close(fd);
  exit(1);
 }
 close(fd); // 끝내기 닫고
}
int sub3_function() {
 int fd, result; //fd 파일 디스크립터, result : 파일 RW 결과값
 long baud = B19200; //통신속도
 unsigned char buf; // 데이터 받을 buf -> unsigned를 안붙이면 값이 이상하게 나온다.
 char sBuffer[7]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 보낼 데이터 (현재 뚜리가 사용하고 있는 키트의 정의된 프로토콜 형식

 if((fd = open("/dev/ttyS0", O_RDWR|O_NDELAY|O_NOCTTY)) < 0) { // READ, WRITE로 Serial0 포트 열기
  exit(1);
 }
 ////////////////// 보낼 옵션 설정
 tio.c_cflag = baud|CS8|CREAD|CLOCAL; // baud 통신 속도, CS8 (8bit, No Parity, 1 Stop Bit)설정
 // CREAD 문자 수신가능하게 함, CLOCAL, Local Connection 모뎀제어 안함..
 //처음엔 CRTSCTS를 같이 c_cflag에 줬었다. 그래서 정상적으로 작동이 안되서 상당히 얘를 먹었다.
 // CRCTSCTS는 하드웨어 흐름제어, 직렬 케이블의 모든 선이 연결되어 있을 때 사용 -> 보통 모든선을 다 안쓰므로. ^^
 tio.c_cflag &= ~HUPCL;
 tio.c_lflag = 0;  // Local Mode 설정
 tio.c_iflag = IGNPAR; // Parity 오류가 있는 문자 무시
 tio.c_oflag = 0; // 출력처리 설정 0이면 아무것도 안함
 ///////////////// 옵션 설정 끝 (물론 추가적인 옵션도 많이 있으나 찾아보기 바란다.)
 tcflush(fd, TCIFLUSH); // 설정을 초기화
 tcsetattr(fd, TCSANOW, &tio); // tio 터미널 구조체의 속정으로 설정을 적용시킨다.

 fcntl(fd, F_SETFL, FNDELAY); // 열려있는 파일 제어를 위해 사용
        sBuffer[6]='z';
 result = write(fd, sBuffer, 7); // 실제적으로 시리얼로 데이터를 보낸다. sBuffer값의 7개만 시리얼0으로 보낸다.
 if(result < 0) { // 에러냐?
  printf("write error\n");
  close(fd);
  exit(1);
 }
 close(fd); // 끝내기 닫고
}

int main(int argc, char *argv[]) {
 WINDOW *my_win;
 int startx, starty, width, height;
 int ch;
 unsigned int startx_char;
 initscr();
 noecho();
  cbreak();
 keypad(stdscr, TRUE);
 height = 5; width = 10;
 //starty = (LINES - height) / 2;
 //startx = (COLS - width) / 2;
 starty =  0;
 startx =  0;

 background();
 //printw("\nPress 'q' to exit");
        refresh();
 my_win = my_newwin(height, width, starty, startx);
 mvwprintw(my_win, 2, 2, "Camera");
// mvwprintw(my_win, 2, 2, "Camera");
//  wrefresh(my_win);
 while ((ch = getch()) != 'q') {
 switch (ch) {
   case KEY_LEFT: if(startx-10 < 0) startx=0; else startx-=10;  break;
   case KEY_RIGHT: if(startx+10 > 41) ; else startx+=10;  break;
   case KEY_UP:  if(starty-5 < 0) starty=0; else starty-=5; break;
   case KEY_DOWN:  if(starty+5 > 24) ; else starty+=5; break;
   case KEY_HOME: move(23,60); printw(" %d : %d ", startx, starty); serial_control(startx, starty); break;
   case 'b' : sub3_function(); break;
  }
 
  my_delwin(my_win);
      background();
  my_win = my_newwin(height, width, starty, startx);
//  mvwin(my_win, starty, startx);
//  scrollok(my_win, TRUE);
  mvwprintw(my_win, 2, 2, "Camera");
//    wprintw(my_win, " ");
 wrefresh(my_win);
//  wscrl(my_win, -1);
 }
 my_delwin(my_win);
 endwin();
}

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...