demo: Moved demo configuration variables into dev_context

This commit is contained in:
Joel Holdsworth 2013-04-14 17:00:47 +01:00 committed by Bert Vermeulen
parent 33c6e4c5a4
commit a76842947f
1 changed files with 33 additions and 29 deletions

View File

@ -84,6 +84,9 @@ struct dev_context {
struct sr_dev_inst *sdi; struct sr_dev_inst *sdi;
int pipe_fds[2]; int pipe_fds[2];
GIOChannel *channel; GIOChannel *channel;
uint64_t cur_samplerate;
uint64_t limit_samples;
uint64_t limit_msec;
uint8_t sample_generator; uint8_t sample_generator;
uint64_t samples_counter; uint64_t samples_counter;
void *cb_data; void *cb_data;
@ -137,10 +140,6 @@ static uint8_t pattern_sigrok[] = {
/* List of struct sr_dev_inst, maintained by dev_open()/dev_close(). */ /* List of struct sr_dev_inst, maintained by dev_open()/dev_close(). */
SR_PRIV struct sr_dev_driver demo_driver_info; SR_PRIV struct sr_dev_driver demo_driver_info;
static struct sr_dev_driver *di = &demo_driver_info; static struct sr_dev_driver *di = &demo_driver_info;
static uint64_t cur_samplerate = SR_KHZ(200);
static uint64_t limit_samples = 0;
static uint64_t limit_msec = 0;
static int default_pattern = PATTERN_SIGROK;
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data); static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
@ -195,6 +194,10 @@ static GSList *hw_scan(GSList *options)
} }
devc->sdi = sdi; devc->sdi = sdi;
devc->cur_samplerate = SR_KHZ(200);
devc->limit_samples = 0;
devc->limit_msec = 0;
devc->sample_generator = PATTERN_SIGROK;
sdi->priv = devc; sdi->priv = devc;
@ -232,20 +235,20 @@ static int hw_cleanup(void)
static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi) static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi)
{ {
(void)sdi; struct dev_context *const devc = sdi->priv;
switch (id) { switch (id) {
case SR_CONF_SAMPLERATE: case SR_CONF_SAMPLERATE:
*data = g_variant_new_uint64(cur_samplerate); *data = g_variant_new_uint64(devc->cur_samplerate);
break; break;
case SR_CONF_LIMIT_SAMPLES: case SR_CONF_LIMIT_SAMPLES:
*data = g_variant_new_uint64(limit_samples); *data = g_variant_new_uint64(devc->limit_samples);
break; break;
case SR_CONF_LIMIT_MSEC: case SR_CONF_LIMIT_MSEC:
*data = g_variant_new_uint64(limit_msec); *data = g_variant_new_uint64(devc->limit_msec);
break; break;
case SR_CONF_PATTERN_MODE: case SR_CONF_PATTERN_MODE:
switch (default_pattern) { switch (devc->sample_generator) {
case PATTERN_SIGROK: case PATTERN_SIGROK:
*data = g_variant_new_string(STR_PATTERN_SIGROK); *data = g_variant_new_string(STR_PATTERN_SIGROK);
break; break;
@ -275,42 +278,43 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
int ret; int ret;
const char *stropt; const char *stropt;
(void)sdi; struct dev_context *const devc = sdi->priv;
if (id == SR_CONF_SAMPLERATE) { if (id == SR_CONF_SAMPLERATE) {
cur_samplerate = g_variant_get_uint64(data); devc->cur_samplerate = g_variant_get_uint64(data);
sr_dbg("%s: setting samplerate to %" PRIu64, __func__, sr_dbg("%s: setting samplerate to %" PRIu64, __func__,
cur_samplerate); devc->cur_samplerate);
ret = SR_OK; ret = SR_OK;
} else if (id == SR_CONF_LIMIT_SAMPLES) { } else if (id == SR_CONF_LIMIT_SAMPLES) {
limit_msec = 0; devc->limit_msec = 0;
limit_samples = g_variant_get_uint64(data); devc->limit_samples = g_variant_get_uint64(data);
sr_dbg("%s: setting limit_samples to %" PRIu64, __func__, sr_dbg("%s: setting limit_samples to %" PRIu64, __func__,
limit_samples); devc->limit_samples);
ret = SR_OK; ret = SR_OK;
} else if (id == SR_CONF_LIMIT_MSEC) { } else if (id == SR_CONF_LIMIT_MSEC) {
limit_msec = g_variant_get_uint64(data); devc->limit_msec = g_variant_get_uint64(data);
limit_samples = 0; devc->limit_samples = 0;
sr_dbg("%s: setting limit_msec to %" PRIu64, __func__, sr_dbg("%s: setting limit_msec to %" PRIu64, __func__,
limit_msec); devc->limit_msec);
ret = SR_OK; ret = SR_OK;
} else if (id == SR_CONF_PATTERN_MODE) { } else if (id == SR_CONF_PATTERN_MODE) {
stropt = g_variant_get_string(data, NULL); stropt = g_variant_get_string(data, NULL);
ret = SR_OK; ret = SR_OK;
if (!strcmp(stropt, STR_PATTERN_SIGROK)) { if (!strcmp(stropt, STR_PATTERN_SIGROK)) {
default_pattern = PATTERN_SIGROK; devc->sample_generator = PATTERN_SIGROK;
} else if (!strcmp(stropt, STR_PATTERN_RANDOM)) { } else if (!strcmp(stropt, STR_PATTERN_RANDOM)) {
default_pattern = PATTERN_RANDOM; devc->sample_generator = PATTERN_RANDOM;
} else if (!strcmp(stropt, STR_PATTERN_INC)) { } else if (!strcmp(stropt, STR_PATTERN_INC)) {
default_pattern = PATTERN_INC; devc->sample_generator = PATTERN_INC;
} else if (!strcmp(stropt, STR_PATTERN_ALL_LOW)) { } else if (!strcmp(stropt, STR_PATTERN_ALL_LOW)) {
default_pattern = PATTERN_ALL_LOW; devc->sample_generator = PATTERN_ALL_LOW;
} else if (!strcmp(stropt, STR_PATTERN_ALL_HIGH)) { } else if (!strcmp(stropt, STR_PATTERN_ALL_HIGH)) {
default_pattern = PATTERN_ALL_HIGH; devc->sample_generator = PATTERN_ALL_HIGH;
} else { } else {
ret = SR_ERR; ret = SR_ERR;
} }
sr_dbg("%s: setting pattern to %d", __func__, default_pattern); sr_dbg("%s: setting pattern to %d",
__func__, devc->sample_generator);
} else { } else {
ret = SR_ERR; ret = SR_ERR;
} }
@ -399,13 +403,13 @@ static int receive_data(int fd, int revents, void *cb_data)
/* How many "virtual" samples should we have collected by now? */ /* How many "virtual" samples should we have collected by now? */
time = g_get_monotonic_time(); time = g_get_monotonic_time();
elapsed = time - devc->starttime; elapsed = time - devc->starttime;
expected_samplenum = elapsed * cur_samplerate / 1000000; expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
/* Of those, how many do we still have to send? */ /* Of those, how many do we still have to send? */
samples_to_send = expected_samplenum - devc->samples_counter; samples_to_send = expected_samplenum - devc->samples_counter;
if (limit_samples) { if (devc->limit_samples) {
samples_to_send = MIN(samples_to_send, samples_to_send = MIN(samples_to_send,
limit_samples - devc->samples_counter); devc->limit_samples - devc->samples_counter);
} }
while (samples_to_send > 0) { while (samples_to_send > 0) {
@ -422,7 +426,8 @@ static int receive_data(int fd, int revents, void *cb_data)
devc->samples_counter += sending_now; devc->samples_counter += sending_now;
} }
if (limit_samples && devc->samples_counter >= limit_samples) { if (devc->limit_samples &&
devc->samples_counter >= devc->limit_samples) {
sr_info("Requested number of samples reached."); sr_info("Requested number of samples reached.");
hw_dev_acquisition_stop(devc->sdi, cb_data); hw_dev_acquisition_stop(devc->sdi, cb_data);
return TRUE; return TRUE;
@ -436,7 +441,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
{ {
struct dev_context *const devc = sdi->priv; struct dev_context *const devc = sdi->priv;
devc->sample_generator = default_pattern;
devc->cb_data = cb_data; devc->cb_data = cb_data;
devc->samples_counter = 0; devc->samples_counter = 0;