]> sigrok.org Git - libsigrok.git/commitdiff
gwinstek-gpd: Add support to old (hardware) revision units.
authorTimo Kokkonen <redacted>
Tue, 14 Jul 2020 04:32:17 +0000 (21:32 -0700)
committerGerhard Sittig <redacted>
Sat, 1 Aug 2020 05:19:49 +0000 (07:19 +0200)
Manufacturer revised hardware design without changing model numbers at some point.
Old units have firmware that behaves differently. Responses are terminated with \r
instead of \n. And STATUS? command response format is different.

src/hardware/gwinstek-gpd/api.c
src/hardware/gwinstek-gpd/protocol.c

index c59ec00f30de9740ca1bdfc67c91ca25565f3fe2..5de7e467c04f8e5232ec1bc312ba3306901e0808 100644 (file)
@@ -82,7 +82,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
        GSList *l;
        struct sr_serial_dev_inst *serial;
        struct sr_dev_inst *sdi;
-       char reply[50];
+       char reply[100];
        unsigned int i;
        struct dev_context *devc;
        char channel[10];
@@ -179,8 +179,16 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options)
        if (sscanf(reply, "%1u%1u%1u%1u%1u%1u%1u%1u", &cc_cv_ch1,
                        &cc_cv_ch2, &track1, &track2, &beep,
                        &devc->output_enabled, &baud1, &baud2) != 8) {
-               sr_err("Invalid reply to STATUS: '%s'.", reply);
-               goto error;
+               /* old firmware (< 2.00?) responds with different format */
+               if (sscanf(reply, "%1u %1u %1u %1u %1u X %1u X", &cc_cv_ch1,
+                          &cc_cv_ch2, &track1, &track2, &beep,
+                          &devc->output_enabled) != 6) {
+                       sr_err("Invalid reply to STATUS: '%s'.", reply);
+                       goto error;
+               }
+               /* ignore remaining two lines of status message */
+               gpd_receive_reply(serial, reply, sizeof(reply));
+               gpd_receive_reply(serial, reply, sizeof(reply));
        }
 
        for (i = 0; i < model->num_channels; ++i) {
index 6038c637ee9e751df3888723ae82d41111384478..19a664e5f2e7d96807d26c4bdb43015ab7870a9c 100644 (file)
@@ -51,7 +51,7 @@ SR_PRIV int gpd_receive_reply(struct sr_serial_dev_inst *serial, char *buf,
 {
        int l_recv = 0, bufpos = 0, retc, l_startpos = 0, lines = 1;
        gint64 start, remaining;
-       const int timeout_ms = 100;
+       const int timeout_ms = 250;
 
        if (!serial || !buf || (buflen <= 0))
                return SR_ERR_ARG;
@@ -69,7 +69,7 @@ SR_PRIV int gpd_receive_reply(struct sr_serial_dev_inst *serial, char *buf,
                if (bufpos == 0 && buf[bufpos] == '\n')
                        continue;
 
-               if (buf[bufpos] == '\n') {
+               if (buf[bufpos] == '\n' || buf[bufpos] == '\r') {
                        buf[bufpos] = '\0';
                        sr_dbg("Received line '%s'.", &buf[l_startpos]);
                        buf[bufpos] = '\n';