]> sigrok.org Git - libsigrok.git/blobdiff - hardware/hantek-dso/api.c
sr: analog: Add MQ and UNIT enums.
[libsigrok.git] / hardware / hantek-dso / api.c
index 5f2301ff9167eff0ac7fe48e5f038dc0dc05df9e..c9310336173bd6e625352355cf4a374ab939b7f5 100644 (file)
@@ -27,7 +27,6 @@
 #include <string.h>
 #include <sys/time.h>
 #include <inttypes.h>
-#include <arpa/inet.h>
 #include <glib.h>
 #include <libusb.h>
 #include "sigrok.h"
@@ -555,7 +554,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
        struct sr_datafeed_packet packet;
        struct sr_datafeed_analog analog;
        struct context *ctx;
-       float ch1, ch2;
+       float ch1, ch2, range;
        int num_probes, data_offset, i;
 
        ctx = transfer->user_data;
@@ -574,21 +573,32 @@ static void receive_transfer(struct libusb_transfer *transfer)
        packet.payload = &analog;
        /* TODO: support for 5xxx series 9-bit samples */
        analog.num_samples = transfer->actual_length / 2;
-       analog.unit = SR_UNIT_VOLTAGE;
+       analog.mq = SR_MQ_VOLTAGE;
+       analog.unit = SR_UNIT_VOLT;
        analog.data = g_try_malloc(analog.num_samples * sizeof(float) * num_probes);
        data_offset = 0;
        for (i = 0; i < analog.num_samples; i++) {
                /* The device always sends data for both channels. If a channel
                 * is disabled, it contains a copy of the enabled channel's
                 * data. However, we only send the requested channels to the bus.
+                *
+                * Voltage values are encoded as a value 0-255 (0-512 on the 5200*),
+                * where the value is a point in the range represented by the vdiv
+                * setting. There are 8 vertical divs, so e.g. 500mV/div represents
+                * 4V peak-to-peak where 0 = -2V and 255 = +2V.
                 */
                /* TODO: support for 5xxx series 9-bit samples */
                if (ctx->ch1_enabled) {
-                       ch1 = (*(transfer->buffer + i * 2 + 1) / 255.0);
+                       range = ((float)vdivs[ctx->voltage_ch1].p / vdivs[ctx->voltage_ch1].q) * 8;
+                       ch1 = range / 255 * *(transfer->buffer + i * 2 + 1);
+                       /* Value is centered around 0V. */
+                       ch1 -= range / 2;
                        analog.data[data_offset++] = ch1;
                }
                if (ctx->ch2_enabled) {
-                       ch2 = (*(transfer->buffer + i * 2) / 255.0);
+                       range = ((float)vdivs[ctx->voltage_ch2].p / vdivs[ctx->voltage_ch2].q) * 8;
+                       ch2 = range / 255 * *(transfer->buffer + i * 2);
+                       ch2 -= range / 2;
                        analog.data[data_offset++] = ch2;
                }
        }
@@ -619,7 +629,8 @@ static int handle_event(int fd, int revents, void *cb_data)
        struct sr_datafeed_packet packet;
        struct timeval tv;
        struct context *ctx;
-       int capturestate;
+       uint32_t trigger_offset;
+       uint8_t capturestate;
 
        /* Avoid compiler warnings. */
        (void)fd;
@@ -645,12 +656,11 @@ static int handle_event(int fd, int revents, void *cb_data)
        if (ctx->dev_state != CAPTURE)
                return TRUE;
 
-       if ((capturestate = dso_get_capturestate(ctx)) == CAPTURE_UNKNOWN) {
-               /* Generated by the function, not the hardware. */
+       if ((dso_get_capturestate(ctx, &capturestate, &trigger_offset)) != SR_OK)
                return TRUE;
-       }
 
        sr_dbg("hantek-dso: capturestate %d", capturestate);
+       sr_dbg("hantek-dso: trigger offset 0x%.6x", trigger_offset);
        switch (capturestate) {
        case CAPTURE_EMPTY:
                if (++ctx->capture_empty_count >= MAX_CAPTURE_EMPTY) {