X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fhantek-dso%2Fapi.c;h=c9310336173bd6e625352355cf4a374ab939b7f5;hb=9edfee3ee31bc6cd7657392f2c9ac28ccf7a7dce;hp=5f2301ff9167eff0ac7fe48e5f038dc0dc05df9e;hpb=aff5a729abfaa016555f5d4a6a1e2c953405179d;p=libsigrok.git diff --git a/hardware/hantek-dso/api.c b/hardware/hantek-dso/api.c index 5f2301ff..c9310336 100644 --- a/hardware/hantek-dso/api.c +++ b/hardware/hantek-dso/api.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #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) {