Quite some drivers flush the serial port after opening it. And quite
some don't although they should. Factor this out, so serial_open() will
always flush the port. The removal in the drivers was done with this
small coccinelle script:
@@
struct sr_serial_dev_inst *serial;
@@
serial_open(serial, ...)
... when != serial
- serial_flush(serial);
and then the results and the unmatched findings of serial_flush() were
audited.
Signed-off-by: Wolfram Sang <[email protected]>
---
As discussed with Gerhard, this is the libsigrok counterpart of a
similar patch for libserialport.
Note there is one change in behaviour. The drivers usually don't check
the retval of serial_flush(). The core now does. I think the better
coding style outweighs the chance of a regression here. I am open for
comments, of course.
src/hardware/agilent-dmm/api.c | 1 -
src/hardware/appa-55ii/api.c | 2 --
src/hardware/arachnid-labs-re-load-pro/api.c | 2 --
src/hardware/atten-pps3xxx/api.c | 2 --
src/hardware/center-3xx/api.c | 2 --
src/hardware/conrad-digi-35-cpu/api.c | 1 -
src/hardware/gmc-mh-1x-2x/api.c | 7 ++-----
src/hardware/gwinstek-gpd/api.c | 1 -
src/hardware/kern-scale/api.c | 1 -
src/hardware/korad-kaxxxxp/api.c | 2 --
src/hardware/manson-hcs-3xxx/api.c | 2 --
src/hardware/mastech-ms6514/api.c | 2 --
src/hardware/mic-985xx/api.c | 2 --
src/hardware/motech-lps-30x/api.c | 1 -
src/hardware/norma-dmm/api.c | 2 --
src/hardware/serial-dmm/api.c | 1 -
src/hardware/serial-lcr/api.c | 1 -
src/hardware/teleinfo/api.c | 2 --
src/hardware/uni-t-ut32x/api.c | 1 -
src/modbus/modbus_serial_rtu.c | 3 ---
src/scpi/scpi_serial.c | 3 ---
src/serial.c | 4 ++++
22 files changed, 6 insertions(+), 39 deletions(-)
diff --git a/src/hardware/agilent-dmm/api.c b/src/hardware/agilent-dmm/api.c
index f7d30547..8500c435 100644
--- a/src/hardware/agilent-dmm/api.c
+++ b/src/hardware/agilent-dmm/api.c
@@ -131,7 +131,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList
*options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
if (serial_write_blocking(serial, "*IDN?\r\n", 7,
SERIAL_WRITE_TIMEOUT_MS) < 7) {
sr_err("Unable to send identification string.");
return NULL;
diff --git a/src/hardware/appa-55ii/api.c b/src/hardware/appa-55ii/api.c
index 81eafdce..50bc3733 100644
--- a/src/hardware/appa-55ii/api.c
+++ b/src/hardware/appa-55ii/api.c
@@ -79,8 +79,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
sr_info("Probing serial port %s.", conn);
- serial_flush(serial);
-
/* Let's get a bit of data and see if we can find a packet. */
if (serial_stream_detect(serial, buf, &len, 25,
appa_55ii_packet_valid, 500) != SR_OK)
diff --git a/src/hardware/arachnid-labs-re-load-pro/api.c
b/src/hardware/arachnid-labs-re-load-pro/api.c
index d6f95723..fb6f8272 100644
--- a/src/hardware/arachnid-labs-re-load-pro/api.c
+++ b/src/hardware/arachnid-labs-re-load-pro/api.c
@@ -99,8 +99,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
/*
* First stop potentially running monitoring and wait for 50ms before
* next command can be sent.
diff --git a/src/hardware/atten-pps3xxx/api.c b/src/hardware/atten-pps3xxx/api.c
index b82b9fb3..dc6e5201 100644
--- a/src/hardware/atten-pps3xxx/api.c
+++ b/src/hardware/atten-pps3xxx/api.c
@@ -113,8 +113,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList
*options, int modelid)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
/* This is how the vendor software scans for hardware. */
memset(packet, 0, PACKET_SIZE);
packet[0] = 0xaa;
diff --git a/src/hardware/center-3xx/api.c b/src/hardware/center-3xx/api.c
index 4591ae96..76d234ff 100644
--- a/src/hardware/center-3xx/api.c
+++ b/src/hardware/center-3xx/api.c
@@ -67,8 +67,6 @@ static GSList *center_scan(const char *conn, const char
*serialcomm, int idx)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
sr_info("Found device on port %s.", conn);
sdi = g_malloc0(sizeof(struct sr_dev_inst));
diff --git a/src/hardware/conrad-digi-35-cpu/api.c
b/src/hardware/conrad-digi-35-cpu/api.c
index 1524df0a..84e1779c 100644
--- a/src/hardware/conrad-digi-35-cpu/api.c
+++ b/src/hardware/conrad-digi-35-cpu/api.c
@@ -75,7 +75,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
serial_close(serial);
sr_spew("Conrad DIGI 35 CPU assumed at %s.", conn);
diff --git a/src/hardware/gmc-mh-1x-2x/api.c b/src/hardware/gmc-mh-1x-2x/api.c
index f2cbd7b2..5f029a9e 100644
--- a/src/hardware/gmc-mh-1x-2x/api.c
+++ b/src/hardware/gmc-mh-1x-2x/api.c
@@ -102,6 +102,7 @@ static enum model scan_model_sm(struct sr_serial_dev_inst
*serial)
* Try to find message consisting of device code and several
* (at least 4) data bytes.
*/
+ serial_flush(serial);
for (bytecnt = 0; bytecnt < 100; bytecnt++) {
byte = read_byte(serial, timeout_us);
if ((byte == -1) || (timeout_us < g_get_monotonic_time()))
@@ -175,8 +176,6 @@ static GSList *scan_1x_2x_rs232(struct sr_dev_driver *di,
GSList *options)
return NULL;
}
- serial_flush(serial);
-
model = scan_model_sm(serial);
/*
@@ -187,10 +186,8 @@ static GSList *scan_1x_2x_rs232(struct sr_dev_driver *di,
GSList *options)
serialcomm = SERIALCOMM_1X_RS232;
g_free(serial->serialcomm);
serial->serialcomm = g_strdup(serialcomm);
- if (serial_set_paramstr(serial, serialcomm) == SR_OK) {
- serial_flush(serial);
+ if (serial_set_paramstr(serial, serialcomm) == SR_OK)
model = scan_model_sm(serial);
- }
}
if (model != METRAHIT_NONE) {
diff --git a/src/hardware/gwinstek-gpd/api.c b/src/hardware/gwinstek-gpd/api.c
index 3234240f..74064606 100644
--- a/src/hardware/gwinstek-gpd/api.c
+++ b/src/hardware/gwinstek-gpd/api.c
@@ -107,7 +107,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList
*options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
gpd_send_cmd(serial, "*IDN?\n");
if (gpd_receive_reply(serial, reply, sizeof(reply)) != SR_OK) {
sr_err("Device did not reply.");
diff --git a/src/hardware/kern-scale/api.c b/src/hardware/kern-scale/api.c
index 70e85a07..fae1dfe1 100644
--- a/src/hardware/kern-scale/api.c
+++ b/src/hardware/kern-scale/api.c
@@ -79,7 +79,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
sr_info("Probing serial port %s.", conn);
devices = NULL;
- serial_flush(serial);
sr_spew("Set O1 mode (continuous values, stable and unstable ones).");
if (serial_write_blocking(serial, "O1\r\n", 4, 0) < 0)
diff --git a/src/hardware/korad-kaxxxxp/api.c b/src/hardware/korad-kaxxxxp/api.c
index 21ab6844..861a6144 100644
--- a/src/hardware/korad-kaxxxxp/api.c
+++ b/src/hardware/korad-kaxxxxp/api.c
@@ -124,8 +124,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList
*options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
/* Get the device model. */
len = 0;
for (i = 0; models[i].id; i++) {
diff --git a/src/hardware/manson-hcs-3xxx/api.c
b/src/hardware/manson-hcs-3xxx/api.c
index 84c6be8b..9d3c9238 100644
--- a/src/hardware/manson-hcs-3xxx/api.c
+++ b/src/hardware/manson-hcs-3xxx/api.c
@@ -118,8 +118,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList
*options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
sr_info("Probing serial port %s.", conn);
/* Get the device model. */
diff --git a/src/hardware/mastech-ms6514/api.c
b/src/hardware/mastech-ms6514/api.c
index 7173cb3c..6e22dd6c 100644
--- a/src/hardware/mastech-ms6514/api.c
+++ b/src/hardware/mastech-ms6514/api.c
@@ -81,8 +81,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
sr_info("Probing serial port %s.", conn);
- serial_flush(serial);
-
/* Let's get a bit of data and see if we can find a packet. */
if (serial_stream_detect(serial, buf, &len, (2 *
MASTECH_MS6514_FRAME_SIZE),
mastech_ms6514_packet_valid, 500) != SR_OK)
diff --git a/src/hardware/mic-985xx/api.c b/src/hardware/mic-985xx/api.c
index 9e33f0ad..14f0c4a8 100644
--- a/src/hardware/mic-985xx/api.c
+++ b/src/hardware/mic-985xx/api.c
@@ -67,8 +67,6 @@ static GSList *mic_scan(const char *conn, const char
*serialcomm, int idx)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
/* TODO: Query device type. */
// ret = mic_cmd_get_device_info(serial);
diff --git a/src/hardware/motech-lps-30x/api.c
b/src/hardware/motech-lps-30x/api.c
index 46407cc5..e4a1fb6b 100644
--- a/src/hardware/motech-lps-30x/api.c
+++ b/src/hardware/motech-lps-30x/api.c
@@ -378,7 +378,6 @@ static GSList *do_scan(lps_modelid modelid, struct
sr_dev_driver *drv, GSList *o
goto exit_err;
/* Query and verify model string. */
- serial_flush(serial);
if (lps_cmd_reply(buf, serial, "MODEL") != SR_OK)
return NULL;
diff --git a/src/hardware/norma-dmm/api.c b/src/hardware/norma-dmm/api.c
index d155bc36..84ca43ca 100644
--- a/src/hardware/norma-dmm/api.c
+++ b/src/hardware/norma-dmm/api.c
@@ -99,8 +99,6 @@ static GSList *scan(struct sr_dev_driver *drv, GSList
*options)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return NULL;
- serial_flush(serial);
-
buf = g_malloc(BUF_MAX);
snprintf(req, sizeof(req), "%s\r\n",
diff --git a/src/hardware/serial-dmm/api.c b/src/hardware/serial-dmm/api.c
index 6b3b2c33..f458c557 100644
--- a/src/hardware/serial-dmm/api.c
+++ b/src/hardware/serial-dmm/api.c
@@ -85,7 +85,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
sr_info("Probing serial port %s.", conn);
devices = NULL;
- serial_flush(serial);
/* Request a packet if the DMM requires this. */
if (dmm->packet_request) {
diff --git a/src/hardware/serial-lcr/api.c b/src/hardware/serial-lcr/api.c
index dd8f8308..3f4a5110 100644
--- a/src/hardware/serial-lcr/api.c
+++ b/src/hardware/serial-lcr/api.c
@@ -105,7 +105,6 @@ static int scan_lcr_port(const struct lcr_info *lcr,
* send data periodically. So we check if the packets match the
* probed device's expected format.
*/
- serial_flush(serial);
if (lcr->packet_request) {
ret = lcr->packet_request(serial);
if (ret < 0) {
diff --git a/src/hardware/teleinfo/api.c b/src/hardware/teleinfo/api.c
index 3de4456b..92bc27a9 100644
--- a/src/hardware/teleinfo/api.c
+++ b/src/hardware/teleinfo/api.c
@@ -75,8 +75,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
sr_info("Probing serial port %s.", conn);
- serial_flush(serial);
-
/* Let's get a bit of data and see if we can find a packet. */
if (serial_stream_detect(serial, buf, &len, len,
teleinfo_packet_valid, 3000) != SR_OK)
diff --git a/src/hardware/uni-t-ut32x/api.c b/src/hardware/uni-t-ut32x/api.c
index 21e5be7d..505d6907 100644
--- a/src/hardware/uni-t-ut32x/api.c
+++ b/src/hardware/uni-t-ut32x/api.c
@@ -90,7 +90,6 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
devices = NULL;
serial = sr_serial_dev_inst_new(conn, serialcomm);
rc = serial_open(serial, SERIAL_RDWR);
- serial_flush(serial);
/* Cannot query/identify the device. Successful open shall suffice. */
serial_close(serial);
if (rc != SR_OK) {
diff --git a/src/modbus/modbus_serial_rtu.c b/src/modbus/modbus_serial_rtu.c
index f7fee0ab..e5436f3a 100644
--- a/src/modbus/modbus_serial_rtu.c
+++ b/src/modbus/modbus_serial_rtu.c
@@ -57,9 +57,6 @@ static int modbus_serial_rtu_open(void *priv)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return SR_ERR;
- if (serial_flush(serial) != SR_OK)
- return SR_ERR;
-
return SR_OK;
}
diff --git a/src/scpi/scpi_serial.c b/src/scpi/scpi_serial.c
index 90c01424..6158f089 100644
--- a/src/scpi/scpi_serial.c
+++ b/src/scpi/scpi_serial.c
@@ -114,9 +114,6 @@ static int scpi_serial_open(struct sr_scpi_dev_inst *scpi)
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
return SR_ERR;
- if (serial_flush(serial) != SR_OK)
- return SR_ERR;
-
sscpi->got_newline = FALSE;
return SR_OK;
diff --git a/src/serial.c b/src/serial.c
index 1c0870d9..f86db6de 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -122,6 +122,10 @@ SR_PRIV int serial_open(struct sr_serial_dev_inst *serial,
int flags)
if (ret != SR_OK)
return ret;
+ ret = serial_flush(serial);
+ if (ret != SR_OK)
+ return ret;
+
if (serial->serialcomm)
return serial_set_paramstr(serial, serial->serialcomm);
else
--
2.20.1
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel