#include <string.h>
#include <sys/time.h>
#include <inttypes.h>
-#include <arpa/inet.h>
#include <glib.h>
#include <libusb.h>
#include "sigrok.h"
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;
packet.payload = &analog;
/* TODO: support for 5xxx series 9-bit samples */
analog.num_samples = transfer->actual_length / 2;
+ 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;
}
}
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;
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) {