hantek-dso: fix channel selection

This commit is contained in:
Bert Vermeulen 2012-05-01 20:35:04 +02:00
parent ae88b97ba2
commit 6e71ef3b6f
3 changed files with 24 additions and 21 deletions

View File

@ -92,7 +92,6 @@ static struct sr_dev_inst *dso_dev_new(int index, struct dso_profile *prof)
ctx->voffset_ch1 = DEFAULT_VERT_OFFSET;
ctx->voffset_ch2 = DEFAULT_VERT_OFFSET;
ctx->voffset_trigger = DEFAULT_VERT_TRIGGERPOS;
ctx->selected_channel = DEFAULT_SELECTED_CHANNEL;
ctx->framesize = DEFAULT_FRAMESIZE;
ctx->triggerslope = SLOPE_POSITIVE;
ctx->triggersource = DEFAULT_TRIGGER_SOURCE;
@ -108,11 +107,12 @@ static int configure_probes(struct context *ctx, GSList *probes)
struct sr_probe *probe;
GSList *l;
ctx->ch1_enabled = ctx->ch2_enabled = FALSE;
for (l = probes; l; l = l->next) {
probe = (struct sr_probe *)l->data;
if (probe->index == 0)
if (probe->index == 1)
ctx->ch1_enabled = probe->enabled;
else if (probe->index == 1)
else if (probe->index == 2)
ctx->ch2_enabled = probe->enabled;
}
@ -372,7 +372,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
struct sr_datafeed_analog analog;
struct context *ctx;
float ch1, ch2;
int i;
int num_probes, data_offset, i;
ctx = transfer->user_data;
sr_dbg("hantek-dso: receive_transfer(): status %d received %d bytes",
@ -385,17 +385,27 @@ static void receive_transfer(struct libusb_transfer *transfer)
ctx->current_transfer += transfer->actual_length;
sr_dbg("hantek-dso: got %d of %d in frame", ctx->current_transfer, ctx->framesize * 2);
num_probes = (ctx->ch1_enabled && ctx->ch2_enabled) ? 2 : 1;
packet.type = SR_DF_ANALOG;
packet.payload = &analog;
analog.num_samples = transfer->actual_length / 2;
analog.data = g_try_malloc(analog.num_samples * sizeof(float) * ctx->profile->num_probes);
for (i = 0; i < analog.num_samples; i++) {
/* Hardcoded for two channels, since the order/encoding is specific. */
/* TODO: support for 5xxx series 9-bit samples */
ch2 = (*(transfer->buffer + i * 2) / 255.0);
analog.num_samples = transfer->actual_length / 2;
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.
*/
/* TODO: support for 5xxx series 9-bit samples */
if (ctx->ch1_enabled) {
ch1 = (*(transfer->buffer + i * 2 + 1) / 255.0);
analog.data[i * ctx->profile->num_probes] = ch1;
analog.data[i * ctx->profile->num_probes + 1] = ch2;
analog.data[data_offset++] = ch1;
}
if (ctx->ch2_enabled) {
ch2 = (*(transfer->buffer + i * 2) / 255.0);
analog.data[data_offset++] = ch2;
}
}
g_free(transfer->buffer);
libusb_free_transfer(transfer);
@ -408,6 +418,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
if (ctx->limit_frames && ++ctx->num_frames == ctx->limit_frames) {
/* Terminate session */
/* TODO: don't leave pending USB transfers hanging */
packet.type = SR_DF_END;
sr_session_send(ctx->cb_data, &packet);
} else {

View File

@ -253,9 +253,9 @@ SR_PRIV int dso_set_trigger_samplerate(struct context *ctx)
}
cmdstring[2] |= tmp & 0x07;
cmdstring[2] = 0x45;
/* Selected channel */
cmdstring[3] = (ctx->selected_channel & 0x03) << 6;
cmdstring[3] = 0x02;
/* Enabled channels */
tmp = (((ctx->ch2_enabled ? 1 : 0) << 1) + (ctx->ch1_enabled ? 1 : 0)) - 1;
cmdstring[3] = tmp;
/* TODO: Fast rates channel */
cmdstring[3] |= 0 << 5;

View File

@ -37,7 +37,6 @@
#define DEFAULT_TIMEBASE TIME_1ms
#define DEFAULT_TRIGGER_SOURCE TRIGGER_CH1
#define DEFAULT_COUPLING COUPLING_AC
#define DEFAULT_SELECTED_CHANNEL SELECT_CH1CH2
/* Halfway between min and max = 0V */
#define DEFAULT_HORIZ_TRIGGERPOS 0x1400
@ -123,12 +122,6 @@ enum trigger_sources {
TRIGGER_EXT10
};
enum selected_channels {
SELECT_CH1 = 0,
SELECT_CH2,
SELECT_CH1CH2
};
enum capturestates {
CAPTURE_EMPTY = 0,
CAPTURE_FILLING = 1,
@ -194,7 +187,6 @@ struct context {
float voffset_ch2;
float voffset_trigger;
uint16_t channel_levels[2][9][2];
int selected_channel;
int framesize;
gboolean filter_ch1;
gboolean filter_ch2;