/* * emulateur de terminal */ #include #include #include #include #include #include #include "../serial/serial.h" #include "terminal.h" extern int verbosity; /* ---------------------------------------------------------------- */ static void bordure(WINDOW * w, char *texte, int type) { if (type) box(w, 0, 0); else wborder(w, '|', '|', '-', '-', '+', '+', '+', '+'); wstandout(w); mvwaddstr(w, 0, 3, texte); wstandend(w); wrefresh(w); } /* ---------------------------------------------------------------- */ static int interactive(WINDOW *glass, int fd_local, int fd_remote) { int flag_exit = 0; long tstart, tcur; char ligne[100]; /* --- variables for select */ struct timeval tv; fd_set rfds; int retval; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %d %d )\n", __func__, glass, fd_local, fd_remote); #endif tstart = time(NULL); wclear(glass); wrefresh(glass); do { tcur = time(NULL); FD_ZERO(&rfds); FD_SET(fd_local, &rfds); /* stdin */ FD_SET(fd_remote, &rfds); /* teletype */ tv.tv_sec = tv.tv_sec = 0; /* no timeout */ retval = select(2, &rfds, NULL, NULL, &tv); wrefresh(glass); usleep(155*1000); } while (! flag_exit); sleep(1); return -1; } /* ---------------------------------------------------------------- */ int run_the_terminal(int fd_serial, char *title, WINDOW *win) { WINDOW *terminal, *ecran; int wid_term, hei_term, lin_term, col_term; int foo; char ligne[100]; unsigned char byte; int fd_stdin; lin_term = col_term = 4; /* position */ wid_term = 40; hei_term = 25; fd_stdin = fileno(stdin); /* for select or pool */ terminal = newwin(hei_term, wid_term, lin_term, col_term); if ( NULL==terminal ) return -1; bordure(terminal, title, 1); ecran = subwin(terminal, hei_term-2, wid_term-2, lin_term+1, col_term+1); if ( NULL==ecran ) return -2; scrollok(ecran, 1); if (verbosity) { foo = mvwaddstr(ecran, 2, 14, "SCREEN READY\n"); #if DEBUG_LEVEL > 1 fprintf(stderr, "in '%s', mvwaddstr -> %d\n", __func__, foo); #endif wrefresh(ecran); sleep(2); } foo = interactive(ecran, fd_stdin, fd_serial); sleep(1); delwin(terminal); touchwin(stdscr); wrefresh(stdscr); return 0; } /* ---------------------------------------------------------------- */ int essai_terminal(int fd, char *txt, int k) { int lig, col; int foo, retv; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %d '%s' %d )\n", __func__, fd, txt, k ); #endif /*** initialisation de curses */ initscr(); nonl(); cbreak(); noecho(); for (lig=0; lig