X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fdemo.c;h=920c1e4d6c93b33d79b0a1021d6e3d64373d8c98;hb=6c7d80afcaf043eb8128a3102519032850fec1af;hp=44b9293133faba108c1218a7b0ff76b1c664d3b0;hpb=76372c5a9ce25d94ee992a5c84b8135f0d945293;p=libsigrok.git diff --git a/src/hardware/demo/demo.c b/src/hardware/demo/demo.c index 44b92931..920c1e4d 100644 --- a/src/hardware/demo/demo.c +++ b/src/hardware/demo/demo.c @@ -157,7 +157,11 @@ static const uint32_t devopts_cg_logic[] = { SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, }; -static const uint32_t devopts_cg_analog[] = { +static const uint32_t devopts_cg_analog_group[] = { + SR_CONF_AMPLITUDE | SR_CONF_GET | SR_CONF_SET, +}; + +static const uint32_t devopts_cg_analog_channel[] = { SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, SR_CONF_AMPLITUDE | SR_CONF_GET | SR_CONF_SET, }; @@ -225,7 +229,7 @@ static void generate_analog_pattern(struct analog_gen *ag, uint64_t sample_rate) for (i = 0; i < num_samples; i++) { t = (double) i / (double) sample_rate; ag->pattern_data[i] = ag->amplitude * - sin(2 * PI * frequency * t); + sin(2 * G_PI * frequency * t); } ag->num_samples = num_samples; @@ -238,8 +242,8 @@ static void generate_analog_pattern(struct analog_gen *ag, uint64_t sample_rate) for (i = 0; i < num_samples; i++) { t = (double) i / (double) sample_rate; - ag->pattern_data[i] = (2 * ag->amplitude / PI) * - asin(sin(2 * PI * frequency * t)); + ag->pattern_data[i] = (2 * ag->amplitude / G_PI) * + asin(sin(2 * G_PI * frequency * t)); } ag->num_samples = num_samples; @@ -274,7 +278,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) int num_logic_channels, num_analog_channels, pattern, i; char channel_name[16]; - drvc = di->priv; + drvc = di->context; num_logic_channels = DEFAULT_NUM_LOGIC_CHANNELS; num_analog_channels = DEFAULT_NUM_ANALOG_CHANNELS; @@ -366,7 +370,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) static GSList *dev_list(const struct sr_dev_driver *di) { - return ((struct drv_context *)(di->priv))->instances; + return ((struct drv_context *)(di->context))->instances; } static int dev_open(struct sr_dev_inst *sdi) @@ -601,7 +605,6 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * return SR_ERR_NA; } } else { - /* Any channel in the group will do. */ ch = cg->channels->data; switch (key) { case SR_CONF_DEVICE_OPTIONS: @@ -609,14 +612,24 @@ static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst * *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, devopts_cg_logic, ARRAY_SIZE(devopts_cg_logic), sizeof(uint32_t)); - else if (ch->type == SR_CHANNEL_ANALOG) - *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, - devopts_cg_analog, ARRAY_SIZE(devopts_cg_analog), - sizeof(uint32_t)); + else if (ch->type == SR_CHANNEL_ANALOG) { + if (strcmp(cg->name, "Analog") == 0) + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + devopts_cg_analog_group, ARRAY_SIZE(devopts_cg_analog_group), + sizeof(uint32_t)); + else + *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32, + devopts_cg_analog_channel, ARRAY_SIZE(devopts_cg_analog_channel), + sizeof(uint32_t)); + } else return SR_ERR_BUG; break; case SR_CONF_PATTERN_MODE: + /* The analog group (with all 4 channels) shall not have a pattern property. */ + if (strcmp(cg->name, "Analog") == 0) + return SR_ERR_NA; + if (ch->type == SR_CHANNEL_LOGIC) *data = g_variant_new_strv(logic_pattern_str, ARRAY_SIZE(logic_pattern_str)); @@ -764,9 +777,9 @@ static int prepare_data(int fd, int revents, void *cb_data) expected_samplenum = MIN(expected_samplenum, devc->limit_samples); /* Of those, how many do we still have to send? */ - if (devc->num_logic_channels) + if (devc->num_logic_channels && (devc->logic_counter < devc->limit_samples)) logic_todo = expected_samplenum - devc->logic_counter; - if (devc->num_analog_channels) + if (devc->num_analog_channels && (devc->analog_counter < devc->limit_samples)) analog_todo = expected_samplenum - devc->analog_counter; while (logic_todo || analog_todo) { @@ -888,6 +901,8 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) g_io_channel_shutdown(devc->channel, FALSE, NULL); g_io_channel_unref(devc->channel); devc->channel = NULL; + close(devc->pipe_fds[0]); + close(devc->pipe_fds[1]); /* Send last packet. */ packet.type = SR_DF_END; @@ -912,5 +927,5 @@ SR_PRIV struct sr_dev_driver demo_driver_info = { .dev_close = dev_close, .dev_acquisition_start = dev_acquisition_start, .dev_acquisition_stop = dev_acquisition_stop, - .priv = NULL, + .context = NULL, };