]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/gwinstek-gpd/api.c
libsigrok.h: Add MQ for electric charge.
[libsigrok.git] / src / hardware / gwinstek-gpd / api.c
index 06e3d60d69c23e85860abe89bfac56d2595e9fec..aff3a7a2faf4d2885c05db94b513d64448a4ecf5 100644 (file)
@@ -60,6 +60,16 @@ static const struct gpd_model models[] = {
                        { { 0, 30, 0.001 }, { 0, 3, 0.001 } },
                },
        },
+       { GPD_3303S, "GPD-3303S",
+               CHANMODE_INDEPENDENT,
+               2,
+               {
+                       /* Channel 1 */
+                       { { 0, 32, 0.001 }, { 0, 3.2, 0.001 } },
+                       /* Channel 2 */
+                       { { 0, 32, 0.001 }, { 0, 3.2, 0.001 } },
+               },
+       },
 };
 
 static GSList *scan(struct sr_dev_driver *di, GSList *options)
@@ -72,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];
@@ -107,7 +117,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.");
@@ -170,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) {
@@ -220,14 +237,9 @@ error:
 static int config_get(uint32_t key, GVariant **data,
        const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
 {
-       int ret, channel;
+       int channel;
        const struct dev_context *devc;
        const struct sr_channel *ch;
-       const struct sr_key_info *ki;
-
-       ki = sr_key_info_get(SR_KEY_CONFIG, key);
-
-       sr_info("%s(%d, %s)", __func__, key, (ki != NULL) ? ki->name : NULL);
 
        if (!sdi)
                return SR_ERR_ARG;
@@ -236,6 +248,9 @@ static int config_get(uint32_t key, GVariant **data,
 
        if (!cg) {
                switch (key) {
+               case SR_CONF_LIMIT_SAMPLES:
+               case SR_CONF_LIMIT_MSEC:
+                       return sr_sw_limits_config_get(&devc->limits, key, data);
                case SR_CONF_CHANNEL_CONFIG:
                        *data = g_variant_new_string(
                                channel_modes[devc->channel_mode]);
@@ -249,9 +264,6 @@ static int config_get(uint32_t key, GVariant **data,
        } else {
                ch = cg->channels->data;
                channel = ch->index;
-               sr_info("%s(%d, %s, %d)", __func__, key,
-                       (ki != NULL) ? ki->name : NULL, channel);
-               ret = SR_OK;
                switch (key) {
                case SR_CONF_VOLTAGE:
                        *data = g_variant_new_double(
@@ -274,7 +286,7 @@ static int config_get(uint32_t key, GVariant **data,
                }
        }
 
-       return ret;
+       return SR_OK;
 }
 
 static int config_set(uint32_t key, GVariant *data,
@@ -287,7 +299,6 @@ static int config_set(uint32_t key, GVariant *data,
        struct dev_context *devc;
 
        devc = sdi->priv;
-       sr_info("%s(%d)", __func__, key);
 
        ret = SR_OK;
 
@@ -378,7 +389,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        struct dev_context *devc;
        struct sr_serial_dev_inst *serial;
 
-       sr_info("%s()", __func__);
        devc = sdi->priv;
 
        sr_sw_limits_acquisition_start(&devc->limits);
@@ -393,7 +403,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        return SR_OK;
 }
 
-SR_PRIV const struct sr_dev_driver gwinstek_gpd_driver_info = {
+static struct sr_dev_driver gwinstek_gpd_driver_info = {
        .name = "gwinstek-gpd",
        .longname = "GW Instek GPD",
        .api_version = 1,