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>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30 #define pipe(fds) _pipe(fds, 4096, _O_BINARY)
32 #include "libsigrok.h"
33 #include "libsigrok-internal.h"
35 #define LOG_PREFIX "demo"
37 #define DEFAULT_NUM_LOGIC_PROBES 8
38 #define DEFAULT_NUM_ANALOG_PROBES 4
40 /* The size in bytes of chunks to send through the session bus. */
41 #define LOGIC_BUFSIZE 4096
42 /* Size of the analog pattern space per channel. */
43 #define ANALOG_BUFSIZE 4096
45 #define ANALOG_AMPLITUDE 25
46 #define ANALOG_SAMPLES_PER_PERIOD 20
48 /* Logic patterns we can generate. */
51 * Spells "sigrok" across 8 probes using '0's (with '1's as
52 * "background") when displayed using the 'bits' output format.
53 * The pattern is repeasted every 8 probes, shifted to the right
58 /** Pseudo-random values on all probes. */
62 * Incrementing number across 8 probes. The pattern is repeasted
63 * every 8 probes, shifted to the right in time by one bit.
67 /** All probes have a low logic state. */
70 /** All probes have a high logic state. */
74 /* Analog patterns we can generate. */
84 static const char *logic_pattern_str[] = {
92 static const char *analog_pattern_str[] = {
100 float pattern_data[ANALOG_BUFSIZE];
101 unsigned int num_samples;
102 struct sr_datafeed_analog packet;
105 /* Private, per-device-instance driver context. */
109 uint64_t cur_samplerate;
110 uint64_t limit_samples;
112 uint64_t samples_counter;
116 int32_t num_logic_probes;
117 unsigned int logic_unitsize;
118 /* There is only ever one logic probe group, so its pattern goes here. */
119 uint8_t logic_pattern;
120 unsigned char logic_data[LOGIC_BUFSIZE];
122 int32_t num_analog_probes;
123 GSList *analog_probe_groups;
126 static const int32_t scanopts[] = {
127 SR_CONF_NUM_LOGIC_PROBES,
128 SR_CONF_NUM_ANALOG_PROBES,
131 static const int devopts[] = {
132 SR_CONF_LOGIC_ANALYZER,
135 SR_CONF_LIMIT_SAMPLES,
139 static const int devopts_pg[] = {
140 SR_CONF_PATTERN_MODE,
143 static const uint64_t samplerates[] = {
149 static uint8_t pattern_sigrok[] = {
150 0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
151 0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
152 0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
153 0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
154 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
155 0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 SR_PRIV struct sr_dev_driver demo_driver_info;
161 static struct sr_dev_driver *di = &demo_driver_info;
163 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
166 static int dev_clear(void)
168 return std_dev_clear(di, NULL);
171 static int init(struct sr_context *sr_ctx)
173 return std_init(sr_ctx, di, LOG_PREFIX);
176 static void generate_analog_pattern(const struct sr_probe_group *probe_group, uint64_t sample_rate)
178 struct analog_gen *ag;
181 unsigned int num_samples, i;
184 ag = probe_group->priv;
185 num_samples = ANALOG_BUFSIZE / sizeof(float);
187 sr_dbg("Generating %s pattern for probe group %s",
188 analog_pattern_str[ag->pattern],
191 switch (ag->pattern) {
195 for (i = 0; i < num_samples; i++) {
200 ag->pattern_data[i] = value;
202 ag->num_samples = last_end;
206 frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
208 /* Make sure the number of samples we put out is an integer
209 * multiple of our period size */
210 /* FIXME we actually need only one period. A ringbuffer would be
212 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
215 for (i = 0; i < num_samples; i++) {
216 t = (double) i / (double) sample_rate;
217 ag->pattern_data[i] = ANALOG_AMPLITUDE *
218 sin(2 * M_PI * frequency * t);
221 ag->num_samples = num_samples;
224 case PATTERN_TRIANGLE:
225 frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
227 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
230 for (i = 0; i < num_samples; i++) {
231 t = (double) i / (double) sample_rate;
232 ag->pattern_data[i] = (2 * ANALOG_AMPLITUDE / M_PI) *
233 asin(sin(2 * M_PI * frequency * t));
236 ag->num_samples = num_samples;
241 static GSList *scan(GSList *options)
243 struct drv_context *drvc;
244 struct dev_context *devc;
245 struct sr_dev_inst *sdi;
246 struct sr_probe *probe;
247 struct sr_probe_group *pg;
248 struct sr_config *src;
249 struct analog_gen *ag;
251 int num_logic_probes, num_analog_probes, i;
256 num_logic_probes = DEFAULT_NUM_LOGIC_PROBES;
257 num_analog_probes = DEFAULT_NUM_ANALOG_PROBES;
258 for (l = options; l; l = l->next) {
261 case SR_CONF_NUM_LOGIC_PROBES:
262 num_logic_probes = g_variant_get_int32(src->data);
264 case SR_CONF_NUM_ANALOG_PROBES:
265 num_analog_probes = g_variant_get_int32(src->data);
271 sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, "Demo device", NULL, NULL);
273 sr_err("Device instance creation failed.");
278 if (!(devc = g_try_malloc(sizeof(struct dev_context)))) {
279 sr_err("Device context malloc failed.");
282 devc->cur_samplerate = SR_KHZ(200);
283 devc->limit_samples = 0;
284 devc->limit_msec = 0;
286 devc->num_logic_probes = num_logic_probes;
287 devc->logic_unitsize = (devc->num_logic_probes + 7) / 8;
288 devc->logic_pattern = PATTERN_SIGROK;
289 devc->num_analog_probes = num_analog_probes;
290 devc->analog_probe_groups = NULL;
292 /* Logic probes, all in one probe group. */
293 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
295 pg->name = g_strdup("Logic");
298 for (i = 0; i < num_logic_probes; i++) {
299 sprintf(probe_name, "D%d", i);
300 if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, probe_name)))
302 sdi->probes = g_slist_append(sdi->probes, probe);
303 pg->probes = g_slist_append(pg->probes, probe);
305 sdi->probe_groups = g_slist_append(NULL, pg);
307 /* Analog probes, probe groups and pattern generators. */
308 for (i = 0; i < num_analog_probes; i++) {
309 sprintf(probe_name, "A%d", i);
310 if (!(probe = sr_probe_new(i, SR_PROBE_ANALOG, TRUE, probe_name)))
312 sdi->probes = g_slist_append(sdi->probes, probe);
314 /* Every analog probe gets its own probe group. */
315 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
317 pg->name = g_strdup(probe_name);
318 pg->probes = g_slist_append(NULL, probe);
320 /* Every probe group gets a generator struct. */
321 if (!(ag = g_try_malloc(sizeof(struct analog_gen))))
323 ag->packet.probes = pg->probes;
325 ag->packet.mqflags = 0;
326 ag->packet.unit = SR_UNIT_VOLT;
327 ag->packet.data = ag->pattern_data;
328 ag->pattern = PATTERN_SINE;
331 sdi->probe_groups = g_slist_append(sdi->probe_groups, pg);
332 devc->analog_probe_groups = g_slist_append(devc->analog_probe_groups, pg);
336 devices = g_slist_append(devices, sdi);
337 drvc->instances = g_slist_append(drvc->instances, sdi);
342 static GSList *dev_list(void)
344 return ((struct drv_context *)(di->priv))->instances;
347 static int dev_open(struct sr_dev_inst *sdi)
349 sdi->status = SR_ST_ACTIVE;
354 static int dev_close(struct sr_dev_inst *sdi)
356 sdi->status = SR_ST_INACTIVE;
361 static int cleanup(void)
366 static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
367 const struct sr_probe_group *probe_group)
369 struct dev_context *devc;
370 struct sr_probe *probe;
371 struct analog_gen *ag;
379 case SR_CONF_SAMPLERATE:
380 *data = g_variant_new_uint64(devc->cur_samplerate);
382 case SR_CONF_LIMIT_SAMPLES:
383 *data = g_variant_new_uint64(devc->limit_samples);
385 case SR_CONF_LIMIT_MSEC:
386 *data = g_variant_new_uint64(devc->limit_msec);
388 case SR_CONF_PATTERN_MODE:
390 return SR_ERR_PROBE_GROUP;
391 probe = probe_group->probes->data;
392 if (probe->type == SR_PROBE_LOGIC) {
393 pattern = devc->logic_pattern;
394 *data = g_variant_new_string(logic_pattern_str[pattern]);
395 } else if (probe->type == SR_PROBE_ANALOG) {
396 ag = probe_group->priv;
397 pattern = ag->pattern;
398 *data = g_variant_new_string(analog_pattern_str[pattern]);
402 case SR_CONF_NUM_LOGIC_PROBES:
403 *data = g_variant_new_int32(devc->num_logic_probes);
405 case SR_CONF_NUM_ANALOG_PROBES:
406 *data = g_variant_new_int32(devc->num_analog_probes);
415 static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
416 const struct sr_probe_group *probe_group)
418 struct dev_context *devc;
419 struct analog_gen *ag;
420 struct sr_probe *probe;
427 if (sdi->status != SR_ST_ACTIVE)
428 return SR_ERR_DEV_CLOSED;
432 case SR_CONF_SAMPLERATE:
433 devc->cur_samplerate = g_variant_get_uint64(data);
434 sr_dbg("Setting samplerate to %" PRIu64, devc->cur_samplerate);
436 case SR_CONF_LIMIT_SAMPLES:
437 devc->limit_msec = 0;
438 devc->limit_samples = g_variant_get_uint64(data);
439 sr_dbg("Setting sample limit to %" PRIu64, devc->limit_samples);
441 case SR_CONF_LIMIT_MSEC:
442 devc->limit_msec = g_variant_get_uint64(data);
443 devc->limit_samples = 0;
444 sr_dbg("Setting time limit to %" PRIu64"ms", devc->limit_msec);
446 case SR_CONF_PATTERN_MODE:
448 return SR_ERR_PROBE_GROUP;
449 stropt = g_variant_get_string(data, NULL);
450 probe = probe_group->probes->data;
452 if (probe->type == SR_PROBE_LOGIC) {
453 for (i = 0; i < ARRAY_SIZE(logic_pattern_str); i++) {
454 if (!strcmp(stropt, logic_pattern_str[i])) {
461 devc->logic_pattern = pattern;
463 /* Might as well do this now, these are static. */
464 if (pattern == PATTERN_ALL_LOW)
465 memset(devc->logic_data, 0x00, LOGIC_BUFSIZE);
466 else if (pattern == PATTERN_ALL_HIGH)
467 memset(devc->logic_data, 0xff, LOGIC_BUFSIZE);
468 sr_dbg("Setting logic pattern to %s",
469 logic_pattern_str[pattern]);
470 } else if (probe->type == SR_PROBE_ANALOG) {
471 for (i = 0; i < ARRAY_SIZE(analog_pattern_str); i++) {
472 if (!strcmp(stropt, analog_pattern_str[i])) {
479 sr_dbg("Setting analog pattern for probe group %s to %s",
481 analog_pattern_str[pattern]);
482 ag = probe_group->priv;
483 ag->pattern = pattern;
494 static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
495 const struct sr_probe_group *probe_group)
497 struct sr_probe *probe;
503 if (key == SR_CONF_SCAN_OPTIONS) {
504 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
505 scanopts, ARRAY_SIZE(scanopts), sizeof(int32_t));
514 case SR_CONF_DEVICE_OPTIONS:
515 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
516 devopts, ARRAY_SIZE(devopts), sizeof(int32_t));
518 case SR_CONF_SAMPLERATE:
519 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
520 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
521 ARRAY_SIZE(samplerates), sizeof(uint64_t));
522 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
523 *data = g_variant_builder_end(&gvb);
529 probe = probe_group->probes->data;
531 case SR_CONF_DEVICE_OPTIONS:
532 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
533 devopts_pg, ARRAY_SIZE(devopts_pg), sizeof(int32_t));
535 case SR_CONF_PATTERN_MODE:
536 if (probe->type == SR_PROBE_LOGIC)
537 *data = g_variant_new_strv(logic_pattern_str,
538 ARRAY_SIZE(logic_pattern_str));
539 else if (probe->type == SR_PROBE_ANALOG)
540 *data = g_variant_new_strv(analog_pattern_str,
541 ARRAY_SIZE(analog_pattern_str));
553 static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
555 struct dev_context *devc;
561 switch (devc->logic_pattern) {
563 memset(devc->logic_data, 0x00, size);
564 for (i = 0; i < size; i += devc->logic_unitsize) {
565 for (j = 0; j < devc->logic_unitsize; j++) {
566 pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
567 devc->logic_data[i + j] = ~pat;
573 for (i = 0; i < size; i++)
574 devc->logic_data[i] = (uint8_t)(rand() & 0xff);
577 for (i = 0; i < size; i++) {
578 for (j = 0; j < devc->logic_unitsize; j++) {
579 devc->logic_data[i + j] = devc->step;
584 case PATTERN_ALL_LOW:
585 case PATTERN_ALL_HIGH:
586 /* These were set when the pattern mode was selected. */
589 sr_err("Unknown pattern: %d.", devc->logic_pattern);
594 /* Callback handling data */
595 static int prepare_data(int fd, int revents, void *cb_data)
597 struct sr_dev_inst *sdi;
598 struct dev_context *devc;
599 struct sr_datafeed_packet packet;
600 struct sr_datafeed_logic logic;
601 struct sr_probe_group *pg;
602 struct analog_gen *ag;
604 uint64_t samples_to_send, expected_samplenum, analog_samples, sending_now;
605 int64_t time, elapsed;
613 /* How many "virtual" samples should we have collected by now? */
614 time = g_get_monotonic_time();
615 elapsed = time - devc->starttime;
616 expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
617 /* Of those, how many do we still have to send? */
618 samples_to_send = expected_samplenum - devc->samples_counter;
620 if (devc->limit_samples) {
621 samples_to_send = MIN(samples_to_send,
622 devc->limit_samples - devc->samples_counter);
625 while (samples_to_send > 0) {
629 if (devc->num_logic_probes > 0) {
630 sending_now = MIN(samples_to_send,
631 LOGIC_BUFSIZE / devc->logic_unitsize);
632 logic_generator(sdi, sending_now * devc->logic_unitsize);
633 packet.type = SR_DF_LOGIC;
634 packet.payload = &logic;
635 logic.length = sending_now * devc->logic_unitsize;
636 logic.unitsize = devc->logic_unitsize;
637 logic.data = devc->logic_data;
638 sr_session_send(sdi, &packet);
641 /* Analog, one probe at a time */
642 if (devc->num_analog_probes > 0) {
644 for (l = devc->analog_probe_groups; l; l = l->next) {
647 packet.type = SR_DF_ANALOG;
648 packet.payload = &ag->packet;
650 /* FIXME we should make sure we output a whole
651 * period of data before we send out again the
652 * beginning of our buffer. A ring buffer would
653 * help here as well */
655 analog_samples = MIN(samples_to_send, ag->num_samples);
656 /* Whichever probe group gets there first. */
657 sending_now = MAX(sending_now, analog_samples);
658 ag->packet.num_samples = analog_samples;
659 sr_session_send(sdi, &packet);
663 samples_to_send -= sending_now;
664 devc->samples_counter += sending_now;
667 if (devc->limit_samples &&
668 devc->samples_counter >= devc->limit_samples) {
669 sr_info("Requested number of samples reached.");
670 dev_acquisition_stop(sdi, cb_data);
677 static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
680 struct dev_context *devc;
682 if (sdi->status != SR_ST_ACTIVE)
683 return SR_ERR_DEV_CLOSED;
685 /* TODO: don't start without a sample limit set */
687 devc->samples_counter = 0;
690 * Setting two channels connected by a pipe is a remnant from when the
691 * demo driver generated data in a thread, and collected and sent the
692 * data in the main program loop.
693 * They are kept here because it provides a convenient way of setting
694 * up a timeout-based polling mechanism.
696 if (pipe(devc->pipe_fds)) {
697 sr_err("%s: pipe() failed", __func__);
701 for (l = devc->analog_probe_groups; l; l = l->next) {
702 generate_analog_pattern(l->data, devc->cur_samplerate);
705 devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]);
707 g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL);
709 /* Set channel encoding to binary (default is UTF-8). */
710 g_io_channel_set_encoding(devc->channel, NULL, NULL);
712 /* Make channels to unbuffered. */
713 g_io_channel_set_buffered(devc->channel, FALSE);
715 sr_session_source_add_channel(devc->channel, G_IO_IN | G_IO_ERR,
716 40, prepare_data, (void *)sdi);
718 /* Send header packet to the session bus. */
719 std_session_send_df_header(cb_data, LOG_PREFIX);
721 /* We use this timestamp to decide how many more samples to send. */
722 devc->starttime = g_get_monotonic_time();
727 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
729 struct dev_context *devc;
730 struct sr_datafeed_packet packet;
735 sr_dbg("Stopping aquisition.");
737 sr_session_source_remove_channel(devc->channel);
738 g_io_channel_shutdown(devc->channel, FALSE, NULL);
739 g_io_channel_unref(devc->channel);
740 devc->channel = NULL;
742 /* Send last packet. */
743 packet.type = SR_DF_END;
744 sr_session_send(sdi, &packet);
749 SR_PRIV struct sr_dev_driver demo_driver_info = {
751 .longname = "Demo driver and pattern generator",
756 .dev_list = dev_list,
757 .dev_clear = dev_clear,
758 .config_get = config_get,
759 .config_set = config_set,
760 .config_list = config_list,
761 .dev_open = dev_open,
762 .dev_close = dev_close,
763 .dev_acquisition_start = dev_acquisition_start,
764 .dev_acquisition_stop = dev_acquisition_stop,