/** * read strings from terminal (ending with '\n') with timeout * @return NULL if nothing was read or pointer to static buffer */ static char *read_string(){ static char buf[BUFLEN]; size_t r = 0, l; int LL = BUFLEN - 1; char *ptr = NULL; static char *optr = NULL; if(optr && *optr){ ptr = optr; optr = strchr(optr, '\n'); if(optr) ++optr; return ptr; } ptr = buf; double d0 = dtime(); do{ if((l = read_tty(ptr, LL))){ r += l; LL -= l; ptr += l; if(ptr[-1] == '\n') break; d0 = dtime(); } }while(dtime() - d0 < WAIT_TMOUT && LL); if(r){ buf[r] = 0; optr = strchr(buf, '\n'); if(optr) ++optr; return buf; } return NULL; }
/** * connect telescope device * @param dev (i) - device name to connect * @return 1 if all OK */ int connect_telescope(char *dev){ if(!dev) return 0; DBG("Connection to device %s...", dev); putlog("Try to connect to device %s...", dev); char tmpbuf[4096]; fflush(stdout); #ifndef COM_SPEED #define COM_SPEED B9600 #endif tty_init(dev, COM_SPEED); read_tty(tmpbuf, 4096); // clear rbuf write_cmd(":U2#"); write_cmd(":U2#"); if(!write_cmd(":GR#")) return 0; putlog("connected", dev); DBG("connected"); return 1; }
void wait_for_answer(){ char buff[128], *bufptr = buff; size_t L; while(1){ L = read_tty(bufptr, 127); if(L){ bufptr += L; if(bufptr - buff > 127){ fprintf(stderr, "Error: input buffer overflow!\n"); bufptr = buff; } if(bufptr[-1] == '*'){ // end of input command *bufptr = 0; parse_ctrlr_ans(buff); return; } } } }
size_t read_ctrl_command(char *buf, size_t L){ // read data from controller to buffer buf int i, j; char *ptr = buf; size_t R; memset(buf, 0, L); for(j = 0; j < L; j++, ptr++){ R = 0; for(i = 0; i < 10 && !R; i++){ R = read_tty(ptr, 1); } if(!R){j--; break;} // nothing to read if(*ptr == '*') // read only one command break; if(*ptr < ' '){ // omit spaces & non-characters j--; ptr--; } } return (size_t) j + 1; }
int do_window() { WMsg msg; static int scroll_off; w_recv(ifd, &msg, sizeof(WMsg)); switch( msg.type ) { case UM_KEY: if(!(msg.arg4 & KBS_BRK)) { if((msg.arg4 & KBS_LSH || msg.arg4 & KBS_RSH)) { if(msg.arg3 & KB_PGDN) { scroll_off += R*C; draw_scr(add_mod(cur_top, scroll_off), 0, 0, C-1, R-1); refresh_scr(0, 0, C-1, R-1); } else if(msg.arg3 & KB_PGUP) { scroll_off -= R*C; draw_scr(add_mod(cur_top, scroll_off), 0, 0, C-1, R-1); refresh_scr(0, 0, C-1, R-1); } } if(msg.arg2 != 0) { if(scroll_off) { scroll_off = 0; draw_scr(cur_top, 0, 0, C-1, R-1); refresh_scr(0, 0, C-1, R-1); } read_tty(msg.arg2); } } break; case UM_EXIT: if(destroy_window(hwnd)) return 1; break; default: break; } return 0; }
void wx::mbwxsave (char *taskname) //************************************************************************* // this task reads wx-data from serial line, saves it in intervals // of 5min and puts current + recent (-1h) wx-data into global // variable. //************************************************************************* { char name[20]; strcpy(name, "wx:mbwxsave"); time_t nextsavet = ad_time(); int fd; char rawdata[80]; long total_num = 0; // total number of measurements long comerr = 0; // total number of communication errors char lastcmd_s[50]; int orgok; lastcmd("init"); // configure tty device fd = configure_tty(m.wxtty); if (fd < 0) return; trace(replog, name, "WX logging started"); // initialize wx-structure memset(&m.wx, 0, sizeof(m.wx)); m.wx.data_valid = 0; // wait for data while (! runterfahren) { rawdata[0]=0; do { wdelay(50); while (! read_tty(fd, rawdata+strlen(rawdata), 79-strlen(rawdata))) { wdelay(50); // if no data received for >1min, old data is no longer valid if (m.wx.data_valid && ad_time()-m.wx.t > 600) { m.wx.data_valid = 0; lastcmd("no data"); trace(report, name, "no data received"); } } if (m.wxstnname[0] == '_') //simple hack to get debug output trace(report, "wx", "rawdata: \"%s\"", rawdata); //correct string starts with !!... if (strlen(rawdata) > 2 && rawdata[0] != '!') { char *a = strstr(rawdata, "!!"); if (a) memmove(rawdata, a, strlen(a)+1); else { rawdata[0]=0; comerr++; } } } // wait until line is complete (or buffer full) while(strlen(rawdata) < 70 && ! strstr(rawdata, "\n") && ! strstr(rawdata, "\r")); rm_crlf(rawdata); //calculate data, and if correct test if data should be saved orgok = orgdata(&m.wx, rawdata); if (orgok) comerr++; else total_num++; sprintf(lastcmd_s, "data %ld/%ld", total_num, comerr); lastcmd(lastcmd_s); if (orgok && nextsavet <= m.wx.t) { if (nextsavet < ad_time()) nextsavet = ad_time(); // if time is changed nextsavet += 300; //next time to save data is in 5min savedata(rawdata, &m.wx); } } close_tty(fd); }
int main (int argc, char *argv[]) { int kfd, tfd; int nfd; fd_set fixed_mask, select_mask; int cr; char c; int i; int echo; int mapda; int ctsrts; if (argc < 2) { fprintf (stderr, "Usage %s <tty_spec> [ echo ] [ crlf ] [ noctsrts ]\n", argv[0]); init_tty("", 0, 0, 0); exit (1); } echo = 0; mapda = 0; ctsrts = 1; for (i = 2; i < argc; i++) { if (strcmp(argv[i], "echo") == 0) { echo = 1; } else if (strcmp(argv[i], "crlf") == 0) { mapda = 1; } else if (strcmp(argv[i], "noctsrts") == 0) { ctsrts = 0; } else { fprintf (stderr, "Usage %s <tty_spec> [ echo ] [ crlf ] [ noctsrts ]\n", argv[0]); init_tty("", 0, 0, 0); exit (1); } } init_tty(argv[1], ctsrts, echo, mapda); tfd = get_tty_fd(); printf ("Ready. Exit with Ctrl X.\n"); kfd = fileno(stdin); init_kbd(kfd); nfd = tfd; if (nfd < kfd) nfd = kfd; FD_ZERO (&fixed_mask); FD_SET (tfd, &fixed_mask); FD_SET (kfd, &fixed_mask); for (;;) { memcpy (&select_mask, &fixed_mask, sizeof(fd_set)); cr = select (nfd+1, &select_mask, (fd_set*)NULL, (fd_set*)NULL, (struct timeval*)NULL); if (cr == -1) { if (errno != EINTR) { perror ("select"); } } else if (cr == 0) { fprintf (stderr, "select returned 0\n"); } else { if (FD_ISSET(kfd, &select_mask) ) { #ifdef DEBUG fprintf (stderr, "kbd event selected\n"); #endif errno = 0; cr = read (kfd, &c, 1); if (cr != 1) { perror ("read kbd"); } #ifdef DEBUG fprintf (stderr, "kbd char read: %c 0x%x\n", c, (int)c); #endif if (c == 0x18) { /* Exit */ restore_kbd (kfd); restore_tty (); (void) putchar ((int)'\n'); exit (0); } send_tty (c); #ifdef DEBUG fprintf (stderr, "sent to tty.\n"); #endif } else if (FD_ISSET(tfd, &select_mask) ) { #ifdef DEBUG fprintf (stderr, "tty event selected\n"); #endif read_tty (&c); #ifdef DEBUG fprintf (stderr, "tty char read: %c %x\n", c, (int)c); #endif (void) putchar ((int)c); #ifdef DEBUG fprintf (stderr, "sent to display.\n"); #endif (void) fflush (stdout); } else { fprintf (stderr, "select returned but fd not set\n"); } } } }