]> sigrok.org Git - libsigrok.git/blobdiff - hardware/hantek-dso/api.c
Deprecate SR_DI_VDIVS.
[libsigrok.git] / hardware / hantek-dso / api.c
index 5a7aabccaca542b7f9e432f761e810eb81310cd5..f797b709f95d4bb2c975512ac5f8b388651b20b6 100644 (file)
@@ -202,18 +202,22 @@ static struct sr_dev_inst *dso_dev_new(int index, const struct dso_profile *prof
 static int configure_probes(const struct sr_dev_inst *sdi)
 {
        struct dev_context *devc;
-       const struct sr_probe *probe;
+       struct sr_probe *probe;
        const GSList *l;
+       int p;
 
        devc = sdi->priv;
 
+       g_slist_free(devc->enabled_probes);
        devc->ch1_enabled = devc->ch2_enabled = FALSE;
-       for (l = sdi->probes; l; l = l->next) {
-               probe = (struct sr_probe *)l->data;
-               if (probe->index == 0)
+       for (l = sdi->probes, p = 0; l; l = l->next, p++) {
+               probe = l->data;
+               if (p == 0)
                        devc->ch1_enabled = probe->enabled;
-               else if (probe->index == 1)
+               else
                        devc->ch2_enabled = probe->enabled;
+               if (probe->enabled)
+                       devc->enabled_probes = g_slist_append(devc->enabled_probes, probe);
        }
 
        return SR_OK;
@@ -242,6 +246,7 @@ static int clear_instances(void)
                dso_close(sdi);
                sr_usb_dev_inst_free(devc->usb);
                g_free(devc->triggersource);
+               g_slist_free(devc->enabled_probes);
 
                sr_dev_inst_free(sdi);
        }
@@ -417,20 +422,16 @@ static int hw_cleanup(void)
        return SR_OK;
 }
 
-static int hw_info_get(int info_id, const void **data,
-                      const struct sr_dev_inst *sdi)
+static int config_get(int id, const void **data, const struct sr_dev_inst *sdi)
 {
        uint64_t tmp;
 
        (void)sdi;
 
-       switch (info_id) {
+       switch (id) {
        case SR_DI_HWCAPS:
                *data = hwcaps;
                break;
-       case SR_DI_BUFFERSIZES:
-               *data = buffersizes;
-               break;
        case SR_DI_TIMEBASES:
                *data = timebases;
                break;
@@ -440,14 +441,8 @@ static int hw_info_get(int info_id, const void **data,
        case SR_DI_FILTERS:
                *data = filter_targets;
                break;
-       case SR_DI_VDIVS:
-               *data = vdivs;
-               break;
-       case SR_DI_COUPLING:
-               *data = coupling;
-               break;
        /* TODO remove this */
-       case SR_DI_CUR_SAMPLERATE:
+       case SR_CONF_SAMPLERATE:
                *data = &tmp;
                break;
        default:
@@ -457,8 +452,7 @@ static int hw_info_get(int info_id, const void **data,
        return SR_OK;
 }
 
-static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
-                            const void *value)
+static int config_set(int id, const void *value, const struct sr_dev_inst *sdi)
 {
        struct dev_context *devc;
        struct sr_rational tmp_rat;
@@ -472,7 +466,7 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
 
        ret = SR_OK;
        devc = sdi->priv;
-       switch (hwcap) {
+       switch (id) {
        case SR_CONF_LIMIT_FRAMES:
                devc->limit_frames = *(const uint64_t *)value;
                break;
@@ -577,18 +571,43 @@ static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
        return ret;
 }
 
-static void send_chunk(struct dev_context *devc, unsigned char *buf,
+static int config_list(int key, const void **data, const struct sr_dev_inst *sdi)
+{
+
+       (void)sdi;
+
+       switch (key) {
+       case SR_CONF_BUFFERSIZE:
+               *data = buffersizes;
+               break;
+       case SR_CONF_COUPLING:
+               *data = coupling;
+               break;
+       case SR_CONF_VDIV:
+               *data = vdivs;
+               break;
+       default:
+               return SR_ERR_ARG;
+       }
+
+       return SR_OK;
+}
+
+static void send_chunk(struct sr_dev_inst *sdi, unsigned char *buf,
                int num_samples)
 {
        struct sr_datafeed_packet packet;
        struct sr_datafeed_analog analog;
+       struct dev_context *devc;
        float ch1, ch2, range;
        int num_probes, data_offset, i;
 
+       devc = sdi->priv;
        num_probes = (devc->ch1_enabled && devc->ch2_enabled) ? 2 : 1;
        packet.type = SR_DF_ANALOG;
        packet.payload = &analog;
        /* TODO: support for 5xxx series 9-bit samples */
+       analog.probes = devc->enabled_probes;
        analog.num_samples = num_samples;
        analog.mq = SR_MQ_VOLTAGE;
        analog.unit = SR_UNIT_VOLT;
@@ -635,10 +654,12 @@ static void send_chunk(struct dev_context *devc, unsigned char *buf,
 static void receive_transfer(struct libusb_transfer *transfer)
 {
        struct sr_datafeed_packet packet;
+       struct sr_dev_inst *sdi;
        struct dev_context *devc;
        int num_samples, pre;
 
-       devc = transfer->user_data;
+       sdi = transfer->user_data;
+       devc = sdi->priv;
        sr_dbg("receive_transfer(): status %d received %d bytes.",
               transfer->status, transfer->actual_length);
 
@@ -685,12 +706,12 @@ static void receive_transfer(struct libusb_transfer *transfer)
                        /* Avoid the corner case where the chunk ended at
                         * exactly the trigger point. */
                        if (num_samples > pre)
-                               send_chunk(devc, transfer->buffer + pre * 2,
+                               send_chunk(sdi, transfer->buffer + pre * 2,
                                                num_samples - pre);
                }
        } else {
                /* Already past the trigger point, just send it all out. */
-               send_chunk(devc, transfer->buffer,
+               send_chunk(sdi, transfer->buffer,
                                num_samples);
        }
 
@@ -706,7 +727,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
                 * pre-trigger samples out now, in one big chunk. */
                sr_dbg("End of frame, sending %d pre-trigger buffered samples.",
                       devc->samp_buffered);
-               send_chunk(devc, devc->framebuf, devc->samp_buffered);
+               send_chunk(sdi, devc->framebuf, devc->samp_buffered);
 
                /* Mark the end of this frame. */
                packet.type = SR_DF_FRAME_END;
@@ -808,7 +829,7 @@ static int handle_event(int fd, int revents, void *cb_data)
                devc->samp_buffered = devc->samp_received = 0;
 
                /* Tell the scope to send us the first frame. */
-               if (dso_get_channeldata(devc, receive_transfer) != SR_OK)
+               if (dso_get_channeldata(sdi, receive_transfer) != SR_OK)
                        break;
 
                /*
@@ -904,10 +925,11 @@ SR_PRIV struct sr_dev_driver hantek_dso_driver_info = {
        .scan = hw_scan,
        .dev_list = hw_dev_list,
        .dev_clear = clear_instances,
+       .config_get = config_get,
+       .config_set = config_set,
+       .config_list = config_list,
        .dev_open = hw_dev_open,
        .dev_close = hw_dev_close,
-       .info_get = hw_info_get,
-       .dev_config_set = hw_dev_config_set,
        .dev_acquisition_start = hw_dev_acquisition_start,
        .dev_acquisition_stop = hw_dev_acquisition_stop,
        .priv = NULL,