Esempio n. 1
0
/**
 * 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;
}
Esempio n. 2
0
/**
 * 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;
}
Esempio n. 3
0
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;
			}
		}
	}
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
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);
}
Esempio n. 7
0
File: term.c Progetto: malaise/c
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");
      }
    }
 
  }

}