2 * This file is part of the libsigrok project.
4 * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
5 * Copyright (C) 2011 Olivier Fauchon <olivier@aixmarseille.com>
6 * Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com>
7 * Copyright (C) 2015 Bartosz Golaszewski <bgolaszewski@baylibre.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 #include <libsigrok/libsigrok.h>
29 #include "libsigrok-internal.h"
31 #define LOG_PREFIX "demo"
33 #define DEFAULT_NUM_LOGIC_CHANNELS 8
34 #define DEFAULT_NUM_ANALOG_CHANNELS 4
36 /* The size in bytes of chunks to send through the session bus. */
37 #define LOGIC_BUFSIZE 4096
38 /* Size of the analog pattern space per channel. */
39 #define ANALOG_BUFSIZE 4096
41 #define DEFAULT_ANALOG_AMPLITUDE 10
42 #define ANALOG_SAMPLES_PER_PERIOD 20
44 /* Logic patterns we can generate. */
47 * Spells "sigrok" across 8 channels using '0's (with '1's as
48 * "background") when displayed using the 'bits' output format.
49 * The pattern is repeated every 8 channels, shifted to the right
54 /** Pseudo-random values on all channels. */
58 * Incrementing number across 8 channels. The pattern is repeated
59 * every 8 channels, shifted to the right in time by one bit.
63 /** All channels have a low logic state. */
66 /** All channels have a high logic state. */
70 /* Analog patterns we can generate. */
81 static const char *logic_pattern_str[] = {
89 static const char *analog_pattern_str[] = {
99 float pattern_data[ANALOG_BUFSIZE];
100 unsigned int num_samples;
101 struct sr_datafeed_analog_old packet;
102 float avg_val; /* Average value */
103 unsigned num_avgs; /* Number of samples averaged */
106 /* Private, per-device-instance driver context. */
108 uint64_t cur_samplerate;
109 uint64_t limit_samples;
111 uint64_t sent_samples;
116 int32_t num_logic_channels;
117 unsigned int logic_unitsize;
118 /* There is only ever one logic channel group, so its pattern goes here. */
119 uint8_t logic_pattern;
120 unsigned char logic_data[LOGIC_BUFSIZE];
122 int32_t num_analog_channels;
124 gboolean avg; /* True if averaging is enabled */
125 uint64_t avg_samples;
128 static const uint32_t drvopts[] = {
130 SR_CONF_LOGIC_ANALYZER,
131 SR_CONF_OSCILLOSCOPE,
134 static const uint32_t scanopts[] = {
135 SR_CONF_NUM_LOGIC_CHANNELS,
136 SR_CONF_NUM_ANALOG_CHANNELS,
139 static const uint32_t devopts[] = {
141 SR_CONF_LIMIT_SAMPLES | SR_CONF_GET | SR_CONF_SET,
142 SR_CONF_LIMIT_MSEC | SR_CONF_GET | SR_CONF_SET,
143 SR_CONF_SAMPLERATE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
144 SR_CONF_AVERAGING | SR_CONF_GET | SR_CONF_SET,
145 SR_CONF_AVG_SAMPLES | SR_CONF_GET | SR_CONF_SET,
148 static const uint32_t devopts_cg_logic[] = {
149 SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
152 static const uint32_t devopts_cg_analog_group[] = {
153 SR_CONF_AMPLITUDE | SR_CONF_GET | SR_CONF_SET,
156 static const uint32_t devopts_cg_analog_channel[] = {
157 SR_CONF_PATTERN_MODE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST,
158 SR_CONF_AMPLITUDE | SR_CONF_GET | SR_CONF_SET,
161 static const uint64_t samplerates[] = {
167 static const uint8_t pattern_sigrok[] = {
168 0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
169 0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
170 0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
171 0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
172 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
173 0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 static int dev_acquisition_stop(struct sr_dev_inst *sdi);
180 static void generate_analog_pattern(struct analog_gen *ag, uint64_t sample_rate)
184 unsigned int num_samples, i;
187 sr_dbg("Generating %s pattern.", analog_pattern_str[ag->pattern]);
189 num_samples = ANALOG_BUFSIZE / sizeof(float);
191 switch (ag->pattern) {
193 value = ag->amplitude;
195 for (i = 0; i < num_samples; i++) {
200 ag->pattern_data[i] = value;
202 ag->num_samples = last_end;
205 frequency = (double) sample_rate / ANALOG_SAMPLES_PER_PERIOD;
207 /* Make sure the number of samples we put out is an integer
208 * multiple of our period size */
209 /* FIXME we actually need only one period. A ringbuffer would be
211 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
214 for (i = 0; i < num_samples; i++) {
215 t = (double) i / (double) sample_rate;
216 ag->pattern_data[i] = ag->amplitude *
217 sin(2 * G_PI * frequency * t);
220 ag->num_samples = num_samples;
222 case PATTERN_TRIANGLE:
223 frequency = (double) sample_rate / ANALOG_SAMPLES_PER_PERIOD;
225 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
228 for (i = 0; i < num_samples; i++) {
229 t = (double) i / (double) sample_rate;
230 ag->pattern_data[i] = (2 * ag->amplitude / G_PI) *
231 asin(sin(2 * G_PI * frequency * t));
234 ag->num_samples = num_samples;
236 case PATTERN_SAWTOOTH:
237 frequency = (double) sample_rate / ANALOG_SAMPLES_PER_PERIOD;
239 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
242 for (i = 0; i < num_samples; i++) {
243 t = (double) i / (double) sample_rate;
244 ag->pattern_data[i] = 2 * ag->amplitude *
245 ((t * frequency) - floor(0.5f + t * frequency));
248 ag->num_samples = num_samples;
253 static GSList *scan(struct sr_dev_driver *di, GSList *options)
255 struct drv_context *drvc;
256 struct dev_context *devc;
257 struct sr_dev_inst *sdi;
258 struct sr_channel *ch;
259 struct sr_channel_group *cg, *acg;
260 struct sr_config *src;
261 struct analog_gen *ag;
263 int num_logic_channels, num_analog_channels, pattern, i;
264 char channel_name[16];
268 num_logic_channels = DEFAULT_NUM_LOGIC_CHANNELS;
269 num_analog_channels = DEFAULT_NUM_ANALOG_CHANNELS;
270 for (l = options; l; l = l->next) {
273 case SR_CONF_NUM_LOGIC_CHANNELS:
274 num_logic_channels = g_variant_get_int32(src->data);
276 case SR_CONF_NUM_ANALOG_CHANNELS:
277 num_analog_channels = g_variant_get_int32(src->data);
282 sdi = g_malloc0(sizeof(struct sr_dev_inst));
283 sdi->status = SR_ST_INACTIVE;
284 sdi->model = g_strdup("Demo device");
286 devc = g_malloc0(sizeof(struct dev_context));
287 devc->cur_samplerate = SR_KHZ(200);
288 devc->num_logic_channels = num_logic_channels;
289 devc->logic_unitsize = (devc->num_logic_channels + 7) / 8;
290 devc->logic_pattern = PATTERN_SIGROK;
291 devc->num_analog_channels = num_analog_channels;
293 if (num_logic_channels > 0) {
294 /* Logic channels, all in one channel group. */
295 cg = g_malloc0(sizeof(struct sr_channel_group));
296 cg->name = g_strdup("Logic");
297 for (i = 0; i < num_logic_channels; i++) {
298 sprintf(channel_name, "D%d", i);
299 ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE, channel_name);
300 cg->channels = g_slist_append(cg->channels, ch);
302 sdi->channel_groups = g_slist_append(NULL, cg);
305 /* Analog channels, channel groups and pattern generators. */
306 if (num_analog_channels > 0) {
308 /* An "Analog" channel group with all analog channels in it. */
309 acg = g_malloc0(sizeof(struct sr_channel_group));
310 acg->name = g_strdup("Analog");
311 sdi->channel_groups = g_slist_append(sdi->channel_groups, acg);
313 devc->ch_ag = g_hash_table_new(g_direct_hash, g_direct_equal);
314 for (i = 0; i < num_analog_channels; i++) {
315 snprintf(channel_name, 16, "A%d", i);
316 ch = sr_channel_new(sdi, i + num_logic_channels, SR_CHANNEL_ANALOG,
318 acg->channels = g_slist_append(acg->channels, ch);
320 /* Every analog channel gets its own channel group as well. */
321 cg = g_malloc0(sizeof(struct sr_channel_group));
322 cg->name = g_strdup(channel_name);
323 cg->channels = g_slist_append(NULL, ch);
324 sdi->channel_groups = g_slist_append(sdi->channel_groups, cg);
326 /* Every channel gets a generator struct. */
327 ag = g_malloc(sizeof(struct analog_gen));
328 ag->amplitude = DEFAULT_ANALOG_AMPLITUDE;
329 ag->packet.channels = cg->channels;
331 ag->packet.mqflags = 0;
332 ag->packet.unit = SR_UNIT_VOLT;
333 ag->packet.data = ag->pattern_data;
334 ag->pattern = pattern;
337 g_hash_table_insert(devc->ch_ag, ch, ag);
339 if (++pattern == ARRAY_SIZE(analog_pattern_str))
346 return std_scan_complete(di, g_slist_append(NULL, sdi));
349 static int dev_open(struct sr_dev_inst *sdi)
351 sdi->status = SR_ST_ACTIVE;
356 static int dev_close(struct sr_dev_inst *sdi)
358 sdi->status = SR_ST_INACTIVE;
363 static void clear_helper(void *priv)
365 struct dev_context *devc;
371 /* Analog generators. */
372 g_hash_table_iter_init(&iter, devc->ch_ag);
373 while (g_hash_table_iter_next(&iter, NULL, &value))
375 g_hash_table_unref(devc->ch_ag);
379 static int dev_clear(const struct sr_dev_driver *di)
381 return std_dev_clear(di, clear_helper);
384 static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
385 const struct sr_channel_group *cg)
387 struct dev_context *devc;
388 struct sr_channel *ch;
389 struct analog_gen *ag;
397 case SR_CONF_SAMPLERATE:
398 *data = g_variant_new_uint64(devc->cur_samplerate);
400 case SR_CONF_LIMIT_SAMPLES:
401 *data = g_variant_new_uint64(devc->limit_samples);
403 case SR_CONF_LIMIT_MSEC:
404 *data = g_variant_new_uint64(devc->limit_msec);
406 case SR_CONF_AVERAGING:
407 *data = g_variant_new_boolean(devc->avg);
409 case SR_CONF_AVG_SAMPLES:
410 *data = g_variant_new_uint64(devc->avg_samples);
412 case SR_CONF_PATTERN_MODE:
414 return SR_ERR_CHANNEL_GROUP;
415 /* Any channel in the group will do. */
416 ch = cg->channels->data;
417 if (ch->type == SR_CHANNEL_LOGIC) {
418 pattern = devc->logic_pattern;
419 *data = g_variant_new_string(logic_pattern_str[pattern]);
420 } else if (ch->type == SR_CHANNEL_ANALOG) {
421 ag = g_hash_table_lookup(devc->ch_ag, ch);
422 pattern = ag->pattern;
423 *data = g_variant_new_string(analog_pattern_str[pattern]);
427 case SR_CONF_AMPLITUDE:
429 return SR_ERR_CHANNEL_GROUP;
430 /* Any channel in the group will do. */
431 ch = cg->channels->data;
432 if (ch->type != SR_CHANNEL_ANALOG)
434 ag = g_hash_table_lookup(devc->ch_ag, ch);
435 *data = g_variant_new_double(ag->amplitude);
444 static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
445 const struct sr_channel_group *cg)
447 struct dev_context *devc;
448 struct analog_gen *ag;
449 struct sr_channel *ch;
451 int logic_pattern, analog_pattern, ret;
457 if (sdi->status != SR_ST_ACTIVE)
458 return SR_ERR_DEV_CLOSED;
462 case SR_CONF_SAMPLERATE:
463 devc->cur_samplerate = g_variant_get_uint64(data);
465 case SR_CONF_LIMIT_SAMPLES:
466 devc->limit_msec = 0;
467 devc->limit_samples = g_variant_get_uint64(data);
469 case SR_CONF_LIMIT_MSEC:
470 devc->limit_msec = g_variant_get_uint64(data);
471 devc->limit_samples = 0;
473 case SR_CONF_AVERAGING:
474 devc->avg = g_variant_get_boolean(data);
475 sr_dbg("%s averaging", devc->avg ? "Enabling" : "Disabling");
477 case SR_CONF_AVG_SAMPLES:
478 devc->avg_samples = g_variant_get_uint64(data);
479 sr_dbg("Setting averaging rate to %" PRIu64, devc->avg_samples);
481 case SR_CONF_PATTERN_MODE:
483 return SR_ERR_CHANNEL_GROUP;
484 stropt = g_variant_get_string(data, NULL);
485 logic_pattern = analog_pattern = -1;
486 for (i = 0; i < ARRAY_SIZE(logic_pattern_str); i++) {
487 if (!strcmp(stropt, logic_pattern_str[i])) {
492 for (i = 0; i < ARRAY_SIZE(analog_pattern_str); i++) {
493 if (!strcmp(stropt, analog_pattern_str[i])) {
498 if (logic_pattern == -1 && analog_pattern == -1)
500 for (l = cg->channels; l; l = l->next) {
502 if (ch->type == SR_CHANNEL_LOGIC) {
503 if (logic_pattern == -1)
505 sr_dbg("Setting logic pattern to %s",
506 logic_pattern_str[logic_pattern]);
507 devc->logic_pattern = logic_pattern;
508 /* Might as well do this now, these are static. */
509 if (logic_pattern == PATTERN_ALL_LOW)
510 memset(devc->logic_data, 0x00, LOGIC_BUFSIZE);
511 else if (logic_pattern == PATTERN_ALL_HIGH)
512 memset(devc->logic_data, 0xff, LOGIC_BUFSIZE);
513 } else if (ch->type == SR_CHANNEL_ANALOG) {
514 if (analog_pattern == -1)
516 sr_dbg("Setting analog pattern for channel %s to %s",
517 ch->name, analog_pattern_str[analog_pattern]);
518 ag = g_hash_table_lookup(devc->ch_ag, ch);
519 ag->pattern = analog_pattern;
524 case SR_CONF_AMPLITUDE:
526 return SR_ERR_CHANNEL_GROUP;
527 for (l = cg->channels; l; l = l->next) {
529 if (ch->type != SR_CHANNEL_ANALOG)
531 ag = g_hash_table_lookup(devc->ch_ag, ch);
532 ag->amplitude = g_variant_get_double(data);
542 static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
543 const struct sr_channel_group *cg)
545 struct sr_channel *ch;
549 if (key == SR_CONF_SCAN_OPTIONS) {
550 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
551 scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
555 if (key == SR_CONF_DEVICE_OPTIONS && !sdi) {
556 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
557 drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t));
566 case SR_CONF_DEVICE_OPTIONS:
567 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
568 devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
570 case SR_CONF_SAMPLERATE:
571 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
572 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
573 ARRAY_SIZE(samplerates), sizeof(uint64_t));
574 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
575 *data = g_variant_builder_end(&gvb);
581 ch = cg->channels->data;
583 case SR_CONF_DEVICE_OPTIONS:
584 if (ch->type == SR_CHANNEL_LOGIC)
585 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
586 devopts_cg_logic, ARRAY_SIZE(devopts_cg_logic),
588 else if (ch->type == SR_CHANNEL_ANALOG) {
589 if (strcmp(cg->name, "Analog") == 0)
590 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
591 devopts_cg_analog_group, ARRAY_SIZE(devopts_cg_analog_group),
594 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
595 devopts_cg_analog_channel, ARRAY_SIZE(devopts_cg_analog_channel),
601 case SR_CONF_PATTERN_MODE:
602 /* The analog group (with all 4 channels) shall not have a pattern property. */
603 if (strcmp(cg->name, "Analog") == 0)
606 if (ch->type == SR_CHANNEL_LOGIC)
607 *data = g_variant_new_strv(logic_pattern_str,
608 ARRAY_SIZE(logic_pattern_str));
609 else if (ch->type == SR_CHANNEL_ANALOG)
610 *data = g_variant_new_strv(analog_pattern_str,
611 ARRAY_SIZE(analog_pattern_str));
623 static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
625 struct dev_context *devc;
631 switch (devc->logic_pattern) {
633 memset(devc->logic_data, 0x00, size);
634 for (i = 0; i < size; i += devc->logic_unitsize) {
635 for (j = 0; j < devc->logic_unitsize; j++) {
636 pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
637 devc->logic_data[i + j] = ~pat;
643 for (i = 0; i < size; i++)
644 devc->logic_data[i] = (uint8_t)(rand() & 0xff);
647 for (i = 0; i < size; i++) {
648 for (j = 0; j < devc->logic_unitsize; j++) {
649 devc->logic_data[i + j] = devc->step;
654 case PATTERN_ALL_LOW:
655 case PATTERN_ALL_HIGH:
656 /* These were set when the pattern mode was selected. */
659 sr_err("Unknown pattern: %d.", devc->logic_pattern);
664 static void send_analog_packet(struct analog_gen *ag,
665 struct sr_dev_inst *sdi,
666 uint64_t *analog_sent,
668 uint64_t analog_todo)
670 struct sr_datafeed_packet packet;
671 struct dev_context *devc;
672 uint64_t sending_now, to_avg;
677 packet.type = SR_DF_ANALOG_OLD;
678 packet.payload = &ag->packet;
681 ag_pattern_pos = analog_pos % ag->num_samples;
682 sending_now = MIN(analog_todo, ag->num_samples-ag_pattern_pos);
683 ag->packet.data = ag->pattern_data + ag_pattern_pos;
684 ag->packet.num_samples = sending_now;
685 sr_session_send(sdi, &packet);
687 /* Whichever channel group gets there first. */
688 *analog_sent = MAX(*analog_sent, sending_now);
690 ag_pattern_pos = analog_pos % ag->num_samples;
691 to_avg = MIN(analog_todo, ag->num_samples-ag_pattern_pos);
693 for (i = 0; i < to_avg; i++) {
694 ag->avg_val = (ag->avg_val +
696 ag_pattern_pos + i)) / 2;
698 /* Time to send averaged data? */
699 if (devc->avg_samples > 0 &&
700 ag->num_avgs >= devc->avg_samples)
704 if (devc->avg_samples == 0) {
705 /* We're averaging all the samples, so wait with
706 * sending until the very end.
708 *analog_sent = ag->num_avgs;
713 ag->packet.data = &ag->avg_val;
714 ag->packet.num_samples = 1;
716 sr_session_send(sdi, &packet);
717 *analog_sent = ag->num_avgs;
724 /* Callback handling data */
725 static int prepare_data(int fd, int revents, void *cb_data)
727 struct sr_dev_inst *sdi;
728 struct dev_context *devc;
729 struct sr_datafeed_packet packet;
730 struct sr_datafeed_logic logic;
731 struct analog_gen *ag;
734 uint64_t samples_todo, logic_done, analog_done, analog_sent, sending_now;
735 int64_t elapsed_us, limit_us, todo_us;
744 if (devc->cur_samplerate <= 0
745 || (devc->num_logic_channels <= 0
746 && devc->num_analog_channels <= 0)) {
747 dev_acquisition_stop(sdi);
748 return G_SOURCE_CONTINUE;
751 /* What time span should we send samples for? */
752 elapsed_us = g_get_monotonic_time() - devc->start_us;
753 limit_us = 1000 * devc->limit_msec;
754 if (limit_us > 0 && limit_us < elapsed_us)
755 todo_us = MAX(0, limit_us - devc->spent_us);
757 todo_us = MAX(0, elapsed_us - devc->spent_us);
759 /* How many samples are outstanding since the last round? */
760 samples_todo = (todo_us * devc->cur_samplerate + G_USEC_PER_SEC - 1)
762 if (devc->limit_samples > 0) {
763 if (devc->limit_samples < devc->sent_samples)
765 else if (devc->limit_samples - devc->sent_samples < samples_todo)
766 samples_todo = devc->limit_samples - devc->sent_samples;
768 /* Calculate the actual time covered by this run back from the sample
769 * count, rounded towards zero. This avoids getting stuck on a too-low
770 * time delta with no samples being sent due to round-off.
772 todo_us = samples_todo * G_USEC_PER_SEC / devc->cur_samplerate;
774 logic_done = devc->num_logic_channels > 0 ? 0 : samples_todo;
775 analog_done = devc->num_analog_channels > 0 ? 0 : samples_todo;
777 while (logic_done < samples_todo || analog_done < samples_todo) {
779 if (logic_done < samples_todo) {
780 sending_now = MIN(samples_todo - logic_done,
781 LOGIC_BUFSIZE / devc->logic_unitsize);
782 logic_generator(sdi, sending_now * devc->logic_unitsize);
783 packet.type = SR_DF_LOGIC;
784 packet.payload = &logic;
785 logic.length = sending_now * devc->logic_unitsize;
786 logic.unitsize = devc->logic_unitsize;
787 logic.data = devc->logic_data;
788 sr_session_send(sdi, &packet);
789 logic_done += sending_now;
792 /* Analog, one channel at a time */
793 if (analog_done < samples_todo) {
796 g_hash_table_iter_init(&iter, devc->ch_ag);
797 while (g_hash_table_iter_next(&iter, NULL, &value)) {
798 send_analog_packet(value, sdi, &analog_sent,
799 devc->sent_samples + analog_done,
800 samples_todo - analog_done);
802 analog_done += analog_sent;
805 /* At this point, both logic_done and analog_done should be
806 * exactly equal to samples_todo, or else.
808 if (logic_done != samples_todo || analog_done != samples_todo) {
809 sr_err("BUG: Sample count mismatch.");
810 return G_SOURCE_REMOVE;
812 devc->sent_samples += samples_todo;
813 devc->spent_us += todo_us;
815 if ((devc->limit_samples > 0 && devc->sent_samples >= devc->limit_samples)
816 || (limit_us > 0 && devc->spent_us >= limit_us)) {
818 /* If we're averaging everything - now is the time to send data */
819 if (devc->avg_samples == 0) {
820 g_hash_table_iter_init(&iter, devc->ch_ag);
821 while (g_hash_table_iter_next(&iter, NULL, &value)) {
823 packet.type = SR_DF_ANALOG_OLD;
824 packet.payload = &ag->packet;
825 ag->packet.data = &ag->avg_val;
826 ag->packet.num_samples = 1;
827 sr_session_send(sdi, &packet);
830 sr_dbg("Requested number of samples reached.");
831 dev_acquisition_stop(sdi);
834 return G_SOURCE_CONTINUE;
837 static int dev_acquisition_start(const struct sr_dev_inst *sdi)
839 struct dev_context *devc;
843 if (sdi->status != SR_ST_ACTIVE)
844 return SR_ERR_DEV_CLOSED;
847 devc->sent_samples = 0;
849 g_hash_table_iter_init(&iter, devc->ch_ag);
850 while (g_hash_table_iter_next(&iter, NULL, &value))
851 generate_analog_pattern(value, devc->cur_samplerate);
853 sr_session_source_add(sdi->session, -1, 0, 100,
854 prepare_data, (struct sr_dev_inst *)sdi);
856 std_session_send_df_header(sdi, LOG_PREFIX);
858 /* We use this timestamp to decide how many more samples to send. */
859 devc->start_us = g_get_monotonic_time();
865 static int dev_acquisition_stop(struct sr_dev_inst *sdi)
867 sr_dbg("Stopping acquisition.");
868 sr_session_source_remove(sdi->session, -1);
869 std_session_send_df_end(sdi, LOG_PREFIX);
874 static struct sr_dev_driver demo_driver_info = {
876 .longname = "Demo driver and pattern generator",
879 .cleanup = std_cleanup,
881 .dev_list = std_dev_list,
882 .dev_clear = dev_clear,
883 .config_get = config_get,
884 .config_set = config_set,
885 .config_list = config_list,
886 .dev_open = dev_open,
887 .dev_close = dev_close,
888 .dev_acquisition_start = dev_acquisition_start,
889 .dev_acquisition_stop = dev_acquisition_stop,
892 SR_REGISTER_DEV_DRIVER(demo_driver_info);