]> sigrok.org Git - libsigrok.git/blobdiff - src/serial.c
ols: more robust device reset in acquisition stop
[libsigrok.git] / src / serial.c
index fe39effc604f10119dcc822d4b0281557697115a..34d7cbea3f9b40b965d588b8c4a6003a8d54cc24 100644 (file)
@@ -128,7 +128,18 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial, int flags)
                        return ret;
        }
 
-       return serial_flush(serial);
+       /*
+        * Flush potentially dangling RX data. Availability of the
+        * flush primitive depends on the transport/cable, absense
+        * is non-fatal.
+        */
+       ret = serial_flush(serial);
+       if (ret == SR_ERR_NA)
+               ret = SR_OK;
+       if (ret != SR_OK)
+               return ret;
+
+       return SR_OK;
 }
 
 /**
@@ -550,6 +561,37 @@ SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial,
        return ret;
 }
 
+/**
+ * Manipulate handshake state for the specified serial port.
+ *
+ * @param serial Previously initialized serial port structure.
+ * @param[in] rts Status of RTS line (0 or 1; or -1 to ignore).
+ * @param[in] dtr Status of DTR line (0 or 1; or -1 to ignore).
+ *
+ * @retval SR_OK Success.
+ * @retval SR_ERR Failure.
+ *
+ * @private
+ */
+SR_PRIV int serial_set_handshake(struct sr_serial_dev_inst *serial,
+       int rts, int dtr)
+{
+       int ret;
+
+       if (!serial) {
+               sr_dbg("Invalid serial port.");
+               return SR_ERR;
+       }
+
+       sr_spew("Modifying serial parameters on port %s.", serial->port);
+
+       if (!serial->lib_funcs || !serial->lib_funcs->set_handshake)
+               return SR_ERR_NA;
+       ret = serial->lib_funcs->set_handshake(serial, rts, dtr);
+
+       return ret;
+}
+
 /**
  * Set serial parameters for the specified serial port from parameter string.
  *
@@ -667,13 +709,14 @@ SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial,
        sr_spew("Got params: rate %d, frame %d/%d/%d, flow %d, rts %d, dtr %d.",
                speed, databits, parity, stopbits, flow, rts, dtr);
 
-       if (speed) {
-               return serial_set_params(serial, speed, databits, parity,
-                                        stopbits, flow, rts, dtr);
-       } else {
+       if (!speed) {
                sr_dbg("Could not infer speed from parameter string.");
                return SR_ERR_ARG;
        }
+
+       return serial_set_params(serial, speed,
+                       databits, parity, stopbits,
+                       flow, rts, dtr);
 }
 
 /**