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. */
83 static const char *logic_pattern_str[] = {
91 static const char *analog_pattern_str[] = {
98 float pattern_data[ANALOG_BUFSIZE];
99 unsigned int num_samples;
100 struct sr_datafeed_analog packet;
103 /* Private, per-device-instance driver context. */
107 uint64_t cur_samplerate;
108 uint64_t limit_samples;
110 uint64_t samples_counter;
114 int32_t num_logic_probes;
115 unsigned int logic_unitsize;
116 /* There is only ever one logic probe group, so its pattern goes here. */
117 uint8_t logic_pattern;
118 unsigned char logic_data[LOGIC_BUFSIZE];
120 int32_t num_analog_probes;
121 GSList *analog_probe_groups;
124 static const int32_t scanopts[] = {
125 SR_CONF_NUM_LOGIC_PROBES,
126 SR_CONF_NUM_ANALOG_PROBES,
129 static const int devopts[] = {
130 SR_CONF_LOGIC_ANALYZER,
133 SR_CONF_LIMIT_SAMPLES,
137 static const int devopts_pg[] = {
138 SR_CONF_PATTERN_MODE,
141 static const uint64_t samplerates[] = {
147 static uint8_t pattern_sigrok[] = {
148 0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
149 0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
150 0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
151 0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
152 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
153 0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 SR_PRIV struct sr_dev_driver demo_driver_info;
159 static struct sr_dev_driver *di = &demo_driver_info;
161 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
164 static int dev_clear(void)
166 return std_dev_clear(di, NULL);
169 static int init(struct sr_context *sr_ctx)
171 return std_init(sr_ctx, di, LOG_PREFIX);
174 static void generate_analog_pattern(const struct sr_probe_group *probe_group, uint64_t sample_rate)
176 struct analog_gen *ag;
179 unsigned int num_samples, i;
182 ag = probe_group->priv;
183 num_samples = ANALOG_BUFSIZE / sizeof(float);
185 sr_dbg("Generating %s pattern for probe group %s",
186 analog_pattern_str[ag->pattern],
189 switch (ag->pattern) {
193 for (i = 0; i < num_samples; i++) {
198 ag->pattern_data[i] = value;
200 ag->num_samples = last_end;
204 frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
206 /* Make sure the number of samples we put out is an integer
207 * multiple of our period size */
208 /* FIXME we actually need only one period. A ringbuffer would be
210 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
213 for (i = 0; i < num_samples; i++) {
214 t = (double) i / (double) sample_rate;
215 ag->pattern_data[i] = ANALOG_AMPLITUDE *
216 sin(2 * M_PI * frequency * t);
219 ag->num_samples = num_samples;
224 static GSList *scan(GSList *options)
226 struct drv_context *drvc;
227 struct dev_context *devc;
228 struct sr_dev_inst *sdi;
229 struct sr_probe *probe;
230 struct sr_probe_group *pg;
231 struct sr_config *src;
232 struct analog_gen *ag;
234 int num_logic_probes, num_analog_probes, i;
239 num_logic_probes = DEFAULT_NUM_LOGIC_PROBES;
240 num_analog_probes = DEFAULT_NUM_ANALOG_PROBES;
241 for (l = options; l; l = l->next) {
244 case SR_CONF_NUM_LOGIC_PROBES:
245 num_logic_probes = g_variant_get_int32(src->data);
247 case SR_CONF_NUM_ANALOG_PROBES:
248 num_analog_probes = g_variant_get_int32(src->data);
254 sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, "Demo device", NULL, NULL);
256 sr_err("Device instance creation failed.");
261 if (!(devc = g_try_malloc(sizeof(struct dev_context)))) {
262 sr_err("Device context malloc failed.");
265 devc->cur_samplerate = SR_KHZ(200);
266 devc->limit_samples = 0;
267 devc->limit_msec = 0;
269 devc->num_logic_probes = num_logic_probes;
270 devc->logic_unitsize = (devc->num_logic_probes + 7) / 8;
271 devc->logic_pattern = PATTERN_SIGROK;
272 devc->num_analog_probes = num_analog_probes;
273 devc->analog_probe_groups = NULL;
275 /* Logic probes, all in one probe group. */
276 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
278 pg->name = g_strdup("Logic");
281 for (i = 0; i < num_logic_probes; i++) {
282 sprintf(probe_name, "D%d", i);
283 if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, probe_name)))
285 sdi->probes = g_slist_append(sdi->probes, probe);
286 pg->probes = g_slist_append(pg->probes, probe);
288 sdi->probe_groups = g_slist_append(NULL, pg);
290 /* Analog probes, probe groups and pattern generators. */
291 for (i = 0; i < num_analog_probes; i++) {
292 sprintf(probe_name, "A%d", i);
293 if (!(probe = sr_probe_new(i, SR_PROBE_ANALOG, TRUE, probe_name)))
295 sdi->probes = g_slist_append(sdi->probes, probe);
297 /* Every analog probe gets its own probe group. */
298 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
300 pg->name = g_strdup(probe_name);
301 pg->probes = g_slist_append(NULL, probe);
303 /* Every probe group gets a generator struct. */
304 if (!(ag = g_try_malloc(sizeof(struct analog_gen))))
306 ag->packet.probes = pg->probes;
308 ag->packet.mqflags = 0;
309 ag->packet.unit = SR_UNIT_VOLT;
310 ag->packet.data = ag->pattern_data;
311 ag->pattern = PATTERN_SINE;
314 sdi->probe_groups = g_slist_append(sdi->probe_groups, pg);
315 devc->analog_probe_groups = g_slist_append(devc->analog_probe_groups, pg);
319 devices = g_slist_append(devices, sdi);
320 drvc->instances = g_slist_append(drvc->instances, sdi);
325 static GSList *dev_list(void)
327 return ((struct drv_context *)(di->priv))->instances;
330 static int dev_open(struct sr_dev_inst *sdi)
332 sdi->status = SR_ST_ACTIVE;
337 static int dev_close(struct sr_dev_inst *sdi)
339 sdi->status = SR_ST_INACTIVE;
344 static int cleanup(void)
349 static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
350 const struct sr_probe_group *probe_group)
352 struct dev_context *devc;
353 struct sr_probe *probe;
354 struct analog_gen *ag;
362 case SR_CONF_SAMPLERATE:
363 *data = g_variant_new_uint64(devc->cur_samplerate);
365 case SR_CONF_LIMIT_SAMPLES:
366 *data = g_variant_new_uint64(devc->limit_samples);
368 case SR_CONF_LIMIT_MSEC:
369 *data = g_variant_new_uint64(devc->limit_msec);
371 case SR_CONF_PATTERN_MODE:
373 return SR_ERR_PROBE_GROUP;
374 probe = probe_group->probes->data;
375 if (probe->type == SR_PROBE_LOGIC) {
376 pattern = devc->logic_pattern;
377 *data = g_variant_new_string(logic_pattern_str[pattern]);
378 } else if (probe->type == SR_PROBE_ANALOG) {
379 ag = probe_group->priv;
380 pattern = ag->pattern;
381 *data = g_variant_new_string(analog_pattern_str[pattern]);
385 case SR_CONF_NUM_LOGIC_PROBES:
386 *data = g_variant_new_int32(devc->num_logic_probes);
388 case SR_CONF_NUM_ANALOG_PROBES:
389 *data = g_variant_new_int32(devc->num_analog_probes);
398 static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
399 const struct sr_probe_group *probe_group)
401 struct dev_context *devc;
402 struct analog_gen *ag;
403 struct sr_probe *probe;
410 if (sdi->status != SR_ST_ACTIVE)
411 return SR_ERR_DEV_CLOSED;
415 case SR_CONF_SAMPLERATE:
416 devc->cur_samplerate = g_variant_get_uint64(data);
417 sr_dbg("Setting samplerate to %" PRIu64, devc->cur_samplerate);
419 case SR_CONF_LIMIT_SAMPLES:
420 devc->limit_msec = 0;
421 devc->limit_samples = g_variant_get_uint64(data);
422 sr_dbg("Setting sample limit to %" PRIu64, devc->limit_samples);
424 case SR_CONF_LIMIT_MSEC:
425 devc->limit_msec = g_variant_get_uint64(data);
426 devc->limit_samples = 0;
427 sr_dbg("Setting time limit to %" PRIu64"ms", devc->limit_msec);
429 case SR_CONF_PATTERN_MODE:
431 return SR_ERR_PROBE_GROUP;
432 stropt = g_variant_get_string(data, NULL);
433 probe = probe_group->probes->data;
435 if (probe->type == SR_PROBE_LOGIC) {
436 for (i = 0; i < ARRAY_SIZE(logic_pattern_str); i++) {
437 if (!strcmp(stropt, logic_pattern_str[i])) {
444 devc->logic_pattern = pattern;
446 /* Might as well do this now, these are static. */
447 if (pattern == PATTERN_ALL_LOW)
448 memset(devc->logic_data, 0x00, LOGIC_BUFSIZE);
449 else if (pattern == PATTERN_ALL_HIGH)
450 memset(devc->logic_data, 0xff, LOGIC_BUFSIZE);
451 sr_dbg("Setting logic pattern to %s",
452 logic_pattern_str[pattern]);
453 } else if (probe->type == SR_PROBE_ANALOG) {
454 for (i = 0; i < ARRAY_SIZE(analog_pattern_str); i++) {
455 if (!strcmp(stropt, analog_pattern_str[i])) {
462 sr_dbg("Setting analog pattern for probe group %s to %s",
464 analog_pattern_str[pattern]);
465 ag = probe_group->priv;
466 ag->pattern = pattern;
477 static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
478 const struct sr_probe_group *probe_group)
480 struct sr_probe *probe;
486 if (key == SR_CONF_SCAN_OPTIONS) {
487 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
488 scanopts, ARRAY_SIZE(scanopts), sizeof(int32_t));
497 case SR_CONF_DEVICE_OPTIONS:
498 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
499 devopts, ARRAY_SIZE(devopts), sizeof(int32_t));
501 case SR_CONF_SAMPLERATE:
502 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
503 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
504 ARRAY_SIZE(samplerates), sizeof(uint64_t));
505 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
506 *data = g_variant_builder_end(&gvb);
512 probe = probe_group->probes->data;
514 case SR_CONF_DEVICE_OPTIONS:
515 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
516 devopts_pg, ARRAY_SIZE(devopts_pg), sizeof(int32_t));
518 case SR_CONF_PATTERN_MODE:
519 if (probe->type == SR_PROBE_LOGIC)
520 *data = g_variant_new_strv(logic_pattern_str,
521 ARRAY_SIZE(logic_pattern_str));
522 else if (probe->type == SR_PROBE_ANALOG)
523 *data = g_variant_new_strv(analog_pattern_str,
524 ARRAY_SIZE(analog_pattern_str));
536 static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
538 struct dev_context *devc;
544 switch (devc->logic_pattern) {
546 memset(devc->logic_data, 0x00, size);
547 for (i = 0; i < size; i += devc->logic_unitsize) {
548 for (j = 0; j < devc->logic_unitsize; j++) {
549 pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
550 devc->logic_data[i + j] = ~pat;
556 for (i = 0; i < size; i++)
557 devc->logic_data[i] = (uint8_t)(rand() & 0xff);
560 for (i = 0; i < size; i++) {
561 for (j = 0; j < devc->logic_unitsize; j++) {
562 devc->logic_data[i + j] = devc->step;
567 case PATTERN_ALL_LOW:
568 case PATTERN_ALL_HIGH:
569 /* These were set when the pattern mode was selected. */
572 sr_err("Unknown pattern: %d.", devc->logic_pattern);
577 /* Callback handling data */
578 static int prepare_data(int fd, int revents, void *cb_data)
580 struct sr_dev_inst *sdi;
581 struct dev_context *devc;
582 struct sr_datafeed_packet packet;
583 struct sr_datafeed_logic logic;
584 struct sr_probe_group *pg;
585 struct analog_gen *ag;
587 uint64_t samples_to_send, expected_samplenum, analog_samples, sending_now;
588 int64_t time, elapsed;
596 /* How many "virtual" samples should we have collected by now? */
597 time = g_get_monotonic_time();
598 elapsed = time - devc->starttime;
599 expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
600 /* Of those, how many do we still have to send? */
601 samples_to_send = expected_samplenum - devc->samples_counter;
603 if (devc->limit_samples) {
604 samples_to_send = MIN(samples_to_send,
605 devc->limit_samples - devc->samples_counter);
608 while (samples_to_send > 0) {
612 if (devc->num_logic_probes > 0) {
613 sending_now = MIN(samples_to_send,
614 LOGIC_BUFSIZE / devc->logic_unitsize);
615 logic_generator(sdi, sending_now * devc->logic_unitsize);
616 packet.type = SR_DF_LOGIC;
617 packet.payload = &logic;
618 logic.length = sending_now * devc->logic_unitsize;
619 logic.unitsize = devc->logic_unitsize;
620 logic.data = devc->logic_data;
621 sr_session_send(sdi, &packet);
624 /* Analog, one probe at a time */
625 if (devc->num_analog_probes > 0) {
627 for (l = devc->analog_probe_groups; l; l = l->next) {
630 packet.type = SR_DF_ANALOG;
631 packet.payload = &ag->packet;
633 /* FIXME we should make sure we output a whole
634 * period of data before we send out again the
635 * beginning of our buffer. A ring buffer would
636 * help here as well */
638 analog_samples = MIN(samples_to_send, ag->num_samples);
639 /* Whichever probe group gets there first. */
640 sending_now = MAX(sending_now, analog_samples);
641 ag->packet.num_samples = analog_samples;
642 sr_session_send(sdi, &packet);
646 samples_to_send -= sending_now;
647 devc->samples_counter += sending_now;
650 if (devc->limit_samples &&
651 devc->samples_counter >= devc->limit_samples) {
652 sr_info("Requested number of samples reached.");
653 dev_acquisition_stop(sdi, cb_data);
660 static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
663 struct dev_context *devc;
665 if (sdi->status != SR_ST_ACTIVE)
666 return SR_ERR_DEV_CLOSED;
668 /* TODO: don't start without a sample limit set */
670 devc->samples_counter = 0;
673 * Setting two channels connected by a pipe is a remnant from when the
674 * demo driver generated data in a thread, and collected and sent the
675 * data in the main program loop.
676 * They are kept here because it provides a convenient way of setting
677 * up a timeout-based polling mechanism.
679 if (pipe(devc->pipe_fds)) {
680 sr_err("%s: pipe() failed", __func__);
684 for (l = devc->analog_probe_groups; l; l = l->next) {
685 generate_analog_pattern(l->data, devc->cur_samplerate);
688 devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]);
690 g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL);
692 /* Set channel encoding to binary (default is UTF-8). */
693 g_io_channel_set_encoding(devc->channel, NULL, NULL);
695 /* Make channels to unbuffered. */
696 g_io_channel_set_buffered(devc->channel, FALSE);
698 sr_session_source_add_channel(devc->channel, G_IO_IN | G_IO_ERR,
699 40, prepare_data, (void *)sdi);
701 /* Send header packet to the session bus. */
702 std_session_send_df_header(cb_data, LOG_PREFIX);
704 /* We use this timestamp to decide how many more samples to send. */
705 devc->starttime = g_get_monotonic_time();
710 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
712 struct dev_context *devc;
713 struct sr_datafeed_packet packet;
718 sr_dbg("Stopping aquisition.");
720 sr_session_source_remove_channel(devc->channel);
721 g_io_channel_shutdown(devc->channel, FALSE, NULL);
722 g_io_channel_unref(devc->channel);
723 devc->channel = NULL;
725 /* Send last packet. */
726 packet.type = SR_DF_END;
727 sr_session_send(sdi, &packet);
732 SR_PRIV struct sr_dev_driver demo_driver_info = {
734 .longname = "Demo driver and pattern generator",
739 .dev_list = dev_list,
740 .dev_clear = dev_clear,
741 .config_get = config_get,
742 .config_set = config_set,
743 .config_list = config_list,
744 .dev_open = dev_open,
745 .dev_close = dev_close,
746 .dev_acquisition_start = dev_acquisition_start,
747 .dev_acquisition_stop = dev_acquisition_stop,