]> sigrok.org Git - libsigrok.git/blobdiff - src/serial.c
serial: Eliminate serial_read(), serial_write() and SERIAL_NONBLOCK.
[libsigrok.git] / src / serial.c
index 4943bb106e54b1f3d87e432ecd6f48549fbc3025..4fe9b88fc0805e43b7716a4cdd1ace37501620a4 100644 (file)
@@ -34,7 +34,7 @@
  *
  * @param serial Previously initialized serial port structure.
  * @param[in] flags Flags to use when opening the serial port. Possible flags
- *              include SERIAL_RDWR, SERIAL_RDONLY, SERIAL_NONBLOCK.
+ *              include SERIAL_RDWR, SERIAL_RDONLY.
  *
  * If the serial structure contains a serialcomm string, it will be
  * passed to serial_set_paramstr() after the port is opened.
@@ -62,8 +62,6 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags)
        else if (flags & SERIAL_RDONLY)
                sp_flags = SP_MODE_READ;
 
-       serial->nonblocking = (flags & SERIAL_NONBLOCK) ? 1 : 0;
-
        ret = sp_open(serial->data, sp_flags);
 
        switch (ret) {
@@ -209,7 +207,7 @@ static int _serial_write(struct sr_serial_dev_inst *serial,
 }
 
 /**
- * Write a number of bytes to the specified serial port.
+ * Write a number of bytes to the specified serial port, blocking until finished.
  *
  * @param serial Previously initialized serial port structure.
  * @param[in] buf Buffer containing the bytes to write.
@@ -219,16 +217,6 @@ static int _serial_write(struct sr_serial_dev_inst *serial,
  * @retval SR_ERR Other error.
  * @retval other The number of bytes written.
  */
-SR_PRIV int serial_write(struct sr_serial_dev_inst *serial,
-               const void *buf, size_t count)
-{
-       return _serial_write(serial, buf, count, serial->nonblocking);
-}
-
-/**
- * Write a number of bytes to the specified serial port, blocking until finished.
- * @copydetails serial_write()
- */
 SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial,
                const void *buf, size_t count)
 {
@@ -237,7 +225,14 @@ SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial,
 
 /**
  * Write a number of bytes to the specified serial port, return immediately.
- * @copydetails serial_write()
+ *
+ * @param serial Previously initialized serial port structure.
+ * @param[in] buf Buffer containing the bytes to write.
+ * @param[in] count Number of bytes to write.
+ *
+ * @retval SR_ERR_ARG Invalid argument.
+ * @retval SR_ERR Other error.
+ * @retval other The number of bytes written.
 */
 SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial,
                const void *buf, size_t count)
@@ -284,7 +279,7 @@ static int _serial_read(struct sr_serial_dev_inst *serial, void *buf,
 }
 
 /**
- * Read a number of bytes from the specified serial port.
+ * Read a number of bytes from the specified serial port, block until finished.
  *
  * @param serial Previously initialized serial port structure.
  * @param buf Buffer where to store the bytes that are read.
@@ -294,16 +289,6 @@ static int _serial_read(struct sr_serial_dev_inst *serial, void *buf,
  * @retval SR_ERR     Other error.
  * @retval other      The number of bytes read.
  */
-SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf,
-               size_t count)
-{
-       return _serial_read(serial, buf, count, serial->nonblocking);
-}
-
-/**
- * Read a number of bytes from the specified serial port, block until finished.
- * @copydetails serial_read()
- */
 SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf,
                size_t count)
 {
@@ -313,7 +298,14 @@ SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf,
 /**
  * Try to read up to @a count bytes from the specified serial port, return
  * immediately with what's available.
- * @copydetails serial_read()
+ *
+ * @param serial Previously initialized serial port structure.
+ * @param buf Buffer where to store the bytes that are read.
+ * @param[in] count The number of bytes to read.
+ *
+ * @retval SR_ERR_ARG Invalid argument.
+ * @retval SR_ERR     Other error.
+ * @retval other      The number of bytes read.
  */
 SR_PRIV int serial_read_nonblocking(struct sr_serial_dev_inst *serial, void *buf,
                size_t count)
@@ -530,7 +522,7 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
 SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf,
                int *buflen, gint64 timeout_ms)
 {
-       gint64 start;
+       gint64 start, remaining;
        int maxlen, len;
 
        if (!serial) {
@@ -543,8 +535,8 @@ SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf,
                return -1;
        }
 
-       timeout_ms *= 1000;
        start = g_get_monotonic_time();
+       remaining = timeout_ms;
 
        maxlen = *buflen;
        *buflen = len = 0;
@@ -552,7 +544,7 @@ SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf,
                len = maxlen - *buflen - 1;
                if (len < 1)
                        break;
-               len = serial_read(serial, *buf + *buflen, 1);
+               len = sp_blocking_read(serial->data, *buf + *buflen, 1, remaining);
                if (len > 0) {
                        *buflen += len;
                        *(*buf + *buflen) = '\0';
@@ -563,7 +555,9 @@ SR_PRIV int serial_readline(struct sr_serial_dev_inst *serial, char **buf,
                                break;
                        }
                }
-               if (g_get_monotonic_time() - start > timeout_ms)
+               /* Reduce timeout by time elapsed. */
+               remaining = timeout_ms - ((g_get_monotonic_time() - start) / 1000);
+               if (remaining <= 0)
                        /* Timeout */
                        break;
                if (len < 1)