/* 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();
}
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.