]> sigrok.org Git - libsigrok.git/blobdiff - hardware/common/serial.c
Factor out serial_readline() to serial.c.
[libsigrok.git] / hardware / common / serial.c
index 51934ed859114dcaf16f673521eee4a0c07c8f73..4a92a6684eba4edac865ab4c6ccd6658e1989877 100644 (file)
@@ -218,6 +218,12 @@ SR_PRIV int serial_set_params(int fd, int baudrate, int bits, int parity,
        case 9600:
                dcb.BaudRate = CBR_9600;
                break;
+       case 4800:
+               dcb.BaudRate = CBR_4800;
+               break;
+       case 2400:
+               dcb.BaudRate = CBR_2400;
+               break;
        default:
                /* TODO: Error handling. */
                break;
@@ -238,6 +244,12 @@ SR_PRIV int serial_set_params(int fd, int baudrate, int bits, int parity,
                return SR_ERR;
 
        switch (baudrate) {
+       case 2400:
+               baud = B2400;
+               break;
+       case 4800:
+               baud = B4800;
+               break;
        case 9600:
                baud = B9600;
                break;
@@ -316,6 +328,10 @@ SR_PRIV int serial_set_params(int fd, int baudrate, int bits, int parity,
                return SR_ERR;
        }
 
+       /* Some default parameters */
+       term.c_iflag &= ~(ICRNL);
+       term.c_lflag &= ~(ICANON | ECHO);
+
        if (tcsetattr(fd, TCSADRAIN, &term) < 0)
                return SR_ERR;
 #endif
@@ -367,3 +383,37 @@ SR_PRIV int serial_set_paramstr(int fd, const char *paramstr)
                return SR_ERR_ARG;
 }
 
+SR_PRIV int serial_readline(int fd, char **buf, int *buflen,
+                           uint64_t timeout_ms)
+{
+       uint64_t start;
+       int maxlen, len;
+
+       timeout_ms *= 1000;
+       start = g_get_monotonic_time();
+
+       maxlen = *buflen;
+       *buflen = len = 0;
+       while(1) {
+               len = maxlen - *buflen - 1;
+               if (len < 1)
+                       break;
+               len = serial_read(fd, *buf + *buflen, 1);
+               if (len > 0) {
+                       *buflen += len;
+                       *(*buf + *buflen) = '\0';
+                       if (*buflen > 0 && *(*buf + *buflen - 1) == '\r') {
+                               /* Strip LF and terminate. */
+                               *(*buf + --*buflen) = '\0';
+                               break;
+                       }
+               }
+               if (g_get_monotonic_time() - start > timeout_ms)
+                       /* Timeout */
+                       break;
+               g_usleep(2000);
+       }
+       sr_dbg("Received %d: '%s'.", *buflen, *buf);
+
+       return SR_OK;
+}