X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fdemo%2Fdemo.c;h=7f80310923fa07fa0e251b740e68eaabf1977e10;hb=34577da641d836dcf27433fee3c6384565ca7847;hp=44b9293133faba108c1218a7b0ff76b1c664d3b0;hpb=76372c5a9ce25d94ee992a5c84b8135f0d945293;p=libsigrok.git diff --git a/src/hardware/demo/demo.c b/src/hardware/demo/demo.c index 44b92931..7f803109 100644 --- a/src/hardware/demo/demo.c +++ b/src/hardware/demo/demo.c @@ -22,15 +22,9 @@ */ #include -#include #include #include -#ifdef _WIN32 -#include -#include -#define pipe(fds) _pipe(fds, 4096, _O_BINARY) -#endif -#include "libsigrok.h" +#include #include "libsigrok-internal.h" #define LOG_PREFIX "demo" @@ -110,8 +104,6 @@ struct analog_gen { /* Private, per-device-instance driver context. */ struct dev_context { - int pipe_fds[2]; - GIOChannel *channel; uint64_t cur_samplerate; gboolean continuous; uint64_t limit_samples; @@ -157,7 +149,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 +221,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 +234,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 +270,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 +362,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 +597,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 +604,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 +769,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) { @@ -837,33 +842,11 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) devc->continuous = !devc->limit_samples; devc->logic_counter = devc->analog_counter = 0; - /* - * Setting two channels connected by a pipe is a remnant from when the - * demo driver generated data in a thread, and collected and sent the - * data in the main program loop. - * They are kept here because it provides a convenient way of setting - * up a timeout-based polling mechanism. - */ - if (pipe(devc->pipe_fds)) { - sr_err("%s: pipe() failed", __func__); - return SR_ERR; - } - g_hash_table_iter_init(&iter, devc->ch_ag); while (g_hash_table_iter_next(&iter, NULL, &value)) generate_analog_pattern(value, devc->cur_samplerate); - devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]); - g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL); - - /* Set channel encoding to binary (default is UTF-8). */ - g_io_channel_set_encoding(devc->channel, NULL, NULL); - - /* Make channels unbuffered. */ - g_io_channel_set_buffered(devc->channel, FALSE); - - sr_session_source_add_channel(sdi->session, devc->channel, - G_IO_IN | G_IO_ERR, 40, prepare_data, (void *)sdi); + sr_session_source_add(sdi->session, -1, 0, 40, prepare_data, (void *)sdi); /* Send header packet to the session bus. */ std_session_send_df_header(sdi, LOG_PREFIX); @@ -876,18 +859,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) { - struct dev_context *devc; struct sr_datafeed_packet packet; (void)cb_data; - devc = sdi->priv; sr_dbg("Stopping acquisition."); - sr_session_source_remove_channel(sdi->session, devc->channel); - g_io_channel_shutdown(devc->channel, FALSE, NULL); - g_io_channel_unref(devc->channel); - devc->channel = NULL; + sr_session_source_remove(sdi->session, -1); /* Send last packet. */ packet.type = SR_DF_END; @@ -912,5 +890,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, };