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_CHANNELS 8
38 #define DEFAULT_NUM_ANALOG_CHANNELS 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 channels using '0's (with '1's as
52 * "background") when displayed using the 'bits' output format.
53 * The pattern is repeated every 8 channels, shifted to the right
58 /** Pseudo-random values on all channels. */
62 * Incrementing number across 8 channels. The pattern is repeated
63 * every 8 channels, shifted to the right in time by one bit.
67 /** All channels have a low logic state. */
70 /** All channels have a high logic state. */
74 /* Analog patterns we can generate. */
85 static const char *logic_pattern_str[] = {
93 static const char *analog_pattern_str[] = {
102 float pattern_data[ANALOG_BUFSIZE];
103 unsigned int num_samples;
104 struct sr_datafeed_analog packet;
107 /* Private, per-device-instance driver context. */
111 uint64_t cur_samplerate;
113 uint64_t limit_samples;
115 uint64_t logic_counter;
116 uint64_t analog_counter;
120 int32_t num_logic_channels;
121 unsigned int logic_unitsize;
122 /* There is only ever one logic channel group, so its pattern goes here. */
123 uint8_t logic_pattern;
124 unsigned char logic_data[LOGIC_BUFSIZE];
126 int32_t num_analog_channels;
127 GSList *analog_channel_groups;
130 static const int32_t scanopts[] = {
131 SR_CONF_NUM_LOGIC_CHANNELS,
132 SR_CONF_NUM_ANALOG_CHANNELS,
135 static const int devopts[] = {
136 SR_CONF_LOGIC_ANALYZER,
140 SR_CONF_LIMIT_SAMPLES,
144 static const int devopts_cg[] = {
145 SR_CONF_PATTERN_MODE,
148 static const uint64_t samplerates[] = {
154 static uint8_t pattern_sigrok[] = {
155 0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
156 0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
157 0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
158 0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
159 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
160 0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 SR_PRIV struct sr_dev_driver demo_driver_info;
166 static struct sr_dev_driver *di = &demo_driver_info;
168 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
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_channel_group *cg, uint64_t sample_rate)
178 struct analog_gen *ag;
181 unsigned int num_samples, i;
185 num_samples = ANALOG_BUFSIZE / sizeof(float);
187 sr_dbg("Generating %s pattern for channel group %s",
188 analog_pattern_str[ag->pattern], cg->name);
190 switch (ag->pattern) {
192 value = ANALOG_AMPLITUDE;
194 for (i = 0; i < num_samples; i++) {
199 ag->pattern_data[i] = value;
201 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] = ANALOG_AMPLITUDE *
217 sin(2 * M_PI * frequency * t);
220 ag->num_samples = num_samples;
223 case PATTERN_TRIANGLE:
224 frequency = (double) sample_rate / ANALOG_SAMPLES_PER_PERIOD;
226 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
229 for (i = 0; i < num_samples; i++) {
230 t = (double) i / (double) sample_rate;
231 ag->pattern_data[i] = (2 * ANALOG_AMPLITUDE / M_PI) *
232 asin(sin(2 * M_PI * frequency * t));
235 ag->num_samples = num_samples;
238 case PATTERN_SAWTOOTH:
239 frequency = (double) sample_rate / ANALOG_SAMPLES_PER_PERIOD;
241 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
244 for (i = 0; i < num_samples; i++) {
245 t = (double) i / (double) sample_rate;
246 ag->pattern_data[i] = 2 * ANALOG_AMPLITUDE *
247 ((t * frequency) - floor(0.5f + t * frequency));
250 ag->num_samples = num_samples;
255 static GSList *scan(GSList *options)
257 struct drv_context *drvc;
258 struct dev_context *devc;
259 struct sr_dev_inst *sdi;
260 struct sr_channel *ch;
261 struct sr_channel_group *cg;
262 struct sr_config *src;
263 struct analog_gen *ag;
265 int num_logic_channels, num_analog_channels, pattern, i;
266 char channel_name[16];
270 num_logic_channels = DEFAULT_NUM_LOGIC_CHANNELS;
271 num_analog_channels = DEFAULT_NUM_ANALOG_CHANNELS;
272 for (l = options; l; l = l->next) {
275 case SR_CONF_NUM_LOGIC_CHANNELS:
276 num_logic_channels = g_variant_get_int32(src->data);
278 case SR_CONF_NUM_ANALOG_CHANNELS:
279 num_analog_channels = g_variant_get_int32(src->data);
285 sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, "Demo device", NULL, NULL);
287 sr_err("Device instance creation failed.");
292 if (!(devc = g_try_malloc(sizeof(struct dev_context)))) {
293 sr_err("Device context malloc failed.");
296 devc->cur_samplerate = SR_KHZ(200);
297 devc->limit_samples = 0;
298 devc->limit_msec = 0;
300 devc->continuous = FALSE;
301 devc->num_logic_channels = num_logic_channels;
302 devc->logic_unitsize = (devc->num_logic_channels + 7) / 8;
303 devc->logic_pattern = PATTERN_SIGROK;
304 devc->num_analog_channels = num_analog_channels;
305 devc->analog_channel_groups = NULL;
307 /* Logic channels, all in one channel group. */
308 if (!(cg = g_try_malloc(sizeof(struct sr_channel_group))))
310 cg->name = g_strdup("Logic");
313 for (i = 0; i < num_logic_channels; i++) {
314 sprintf(channel_name, "D%d", i);
315 if (!(ch = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE, channel_name)))
317 sdi->channels = g_slist_append(sdi->channels, ch);
318 cg->channels = g_slist_append(cg->channels, ch);
320 sdi->channel_groups = g_slist_append(NULL, cg);
322 /* Analog channels, channel groups and pattern generators. */
325 for (i = 0; i < num_analog_channels; i++) {
326 sprintf(channel_name, "A%d", i);
327 if (!(ch = sr_channel_new(i + num_logic_channels,
328 SR_CHANNEL_ANALOG, TRUE, channel_name)))
330 sdi->channels = g_slist_append(sdi->channels, ch);
332 /* Every analog channel gets its own channel group. */
333 if (!(cg = g_try_malloc(sizeof(struct sr_channel_group))))
335 cg->name = g_strdup(channel_name);
336 cg->channels = g_slist_append(NULL, ch);
338 /* Every channel group gets a generator struct. */
339 if (!(ag = g_try_malloc(sizeof(struct analog_gen))))
341 ag->packet.channels = cg->channels;
343 ag->packet.mqflags = 0;
344 ag->packet.unit = SR_UNIT_VOLT;
345 ag->packet.data = ag->pattern_data;
346 ag->pattern = pattern;
349 sdi->channel_groups = g_slist_append(sdi->channel_groups, cg);
350 devc->analog_channel_groups = g_slist_append(devc->analog_channel_groups, cg);
352 if (++pattern == ARRAY_SIZE(analog_pattern_str))
357 devices = g_slist_append(devices, sdi);
358 drvc->instances = g_slist_append(drvc->instances, sdi);
363 static GSList *dev_list(void)
365 return ((struct drv_context *)(di->priv))->instances;
368 static int dev_open(struct sr_dev_inst *sdi)
370 sdi->status = SR_ST_ACTIVE;
375 static int dev_close(struct sr_dev_inst *sdi)
377 sdi->status = SR_ST_INACTIVE;
382 static int cleanup(void)
384 return std_dev_clear(di, NULL);
387 static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
388 const struct sr_channel_group *cg)
390 struct dev_context *devc;
391 struct sr_channel *ch;
392 struct analog_gen *ag;
400 case SR_CONF_SAMPLERATE:
401 *data = g_variant_new_uint64(devc->cur_samplerate);
403 case SR_CONF_LIMIT_SAMPLES:
404 *data = g_variant_new_uint64(devc->limit_samples);
406 case SR_CONF_LIMIT_MSEC:
407 *data = g_variant_new_uint64(devc->limit_msec);
409 case SR_CONF_PATTERN_MODE:
411 return SR_ERR_CHANNEL_GROUP;
412 ch = cg->channels->data;
413 if (ch->type == SR_CHANNEL_LOGIC) {
414 pattern = devc->logic_pattern;
415 *data = g_variant_new_string(logic_pattern_str[pattern]);
416 } else if (ch->type == SR_CHANNEL_ANALOG) {
418 pattern = ag->pattern;
419 *data = g_variant_new_string(analog_pattern_str[pattern]);
423 case SR_CONF_NUM_LOGIC_CHANNELS:
424 *data = g_variant_new_int32(devc->num_logic_channels);
426 case SR_CONF_NUM_ANALOG_CHANNELS:
427 *data = g_variant_new_int32(devc->num_analog_channels);
436 static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
437 const struct sr_channel_group *cg)
439 struct dev_context *devc;
440 struct analog_gen *ag;
441 struct sr_channel *ch;
448 if (sdi->status != SR_ST_ACTIVE)
449 return SR_ERR_DEV_CLOSED;
453 case SR_CONF_SAMPLERATE:
454 devc->cur_samplerate = g_variant_get_uint64(data);
455 sr_dbg("Setting samplerate to %" PRIu64, devc->cur_samplerate);
457 case SR_CONF_LIMIT_SAMPLES:
458 devc->limit_msec = 0;
459 devc->limit_samples = g_variant_get_uint64(data);
460 sr_dbg("Setting sample limit to %" PRIu64, devc->limit_samples);
462 case SR_CONF_LIMIT_MSEC:
463 devc->limit_msec = g_variant_get_uint64(data);
464 devc->limit_samples = 0;
465 sr_dbg("Setting time limit to %" PRIu64"ms", devc->limit_msec);
467 case SR_CONF_PATTERN_MODE:
469 return SR_ERR_CHANNEL_GROUP;
470 stropt = g_variant_get_string(data, NULL);
471 ch = cg->channels->data;
473 if (ch->type == SR_CHANNEL_LOGIC) {
474 for (i = 0; i < ARRAY_SIZE(logic_pattern_str); i++) {
475 if (!strcmp(stropt, logic_pattern_str[i])) {
482 devc->logic_pattern = pattern;
484 /* Might as well do this now, these are static. */
485 if (pattern == PATTERN_ALL_LOW)
486 memset(devc->logic_data, 0x00, LOGIC_BUFSIZE);
487 else if (pattern == PATTERN_ALL_HIGH)
488 memset(devc->logic_data, 0xff, LOGIC_BUFSIZE);
489 sr_dbg("Setting logic pattern to %s",
490 logic_pattern_str[pattern]);
491 } else if (ch->type == SR_CHANNEL_ANALOG) {
492 for (i = 0; i < ARRAY_SIZE(analog_pattern_str); i++) {
493 if (!strcmp(stropt, analog_pattern_str[i])) {
500 sr_dbg("Setting analog pattern for channel group %s to %s",
501 cg->name, analog_pattern_str[pattern]);
503 ag->pattern = pattern;
514 static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
515 const struct sr_channel_group *cg)
517 struct sr_channel *ch;
523 if (key == SR_CONF_SCAN_OPTIONS) {
524 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
525 scanopts, ARRAY_SIZE(scanopts), sizeof(int32_t));
534 case SR_CONF_DEVICE_OPTIONS:
535 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
536 devopts, ARRAY_SIZE(devopts), sizeof(int32_t));
538 case SR_CONF_SAMPLERATE:
539 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
540 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
541 ARRAY_SIZE(samplerates), sizeof(uint64_t));
542 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
543 *data = g_variant_builder_end(&gvb);
549 ch = cg->channels->data;
551 case SR_CONF_DEVICE_OPTIONS:
552 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
553 devopts_cg, ARRAY_SIZE(devopts_cg), sizeof(int32_t));
555 case SR_CONF_PATTERN_MODE:
556 if (ch->type == SR_CHANNEL_LOGIC)
557 *data = g_variant_new_strv(logic_pattern_str,
558 ARRAY_SIZE(logic_pattern_str));
559 else if (ch->type == SR_CHANNEL_ANALOG)
560 *data = g_variant_new_strv(analog_pattern_str,
561 ARRAY_SIZE(analog_pattern_str));
573 static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
575 struct dev_context *devc;
581 switch (devc->logic_pattern) {
583 memset(devc->logic_data, 0x00, size);
584 for (i = 0; i < size; i += devc->logic_unitsize) {
585 for (j = 0; j < devc->logic_unitsize; j++) {
586 pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
587 devc->logic_data[i + j] = ~pat;
593 for (i = 0; i < size; i++)
594 devc->logic_data[i] = (uint8_t)(rand() & 0xff);
597 for (i = 0; i < size; i++) {
598 for (j = 0; j < devc->logic_unitsize; j++) {
599 devc->logic_data[i + j] = devc->step;
604 case PATTERN_ALL_LOW:
605 case PATTERN_ALL_HIGH:
606 /* These were set when the pattern mode was selected. */
609 sr_err("Unknown pattern: %d.", devc->logic_pattern);
614 /* Callback handling data */
615 static int prepare_data(int fd, int revents, void *cb_data)
617 struct sr_dev_inst *sdi;
618 struct dev_context *devc;
619 struct sr_datafeed_packet packet;
620 struct sr_datafeed_logic logic;
621 struct sr_channel_group *cg;
622 struct analog_gen *ag;
624 uint64_t logic_todo, analog_todo, expected_samplenum, analog_sent, sending_now;
625 int64_t time, elapsed;
632 logic_todo = analog_todo = 0;
634 /* How many samples should we have sent by now? */
635 time = g_get_monotonic_time();
636 elapsed = time - devc->starttime;
637 expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
639 /* But never more than the limit, if there is one. */
640 if (!devc->continuous)
641 expected_samplenum = MIN(expected_samplenum, devc->limit_samples);
643 /* Of those, how many do we still have to send? */
644 if (devc->num_logic_channels)
645 logic_todo = expected_samplenum - devc->logic_counter;
646 if (devc->num_analog_channels)
647 analog_todo = expected_samplenum - devc->analog_counter;
649 while (logic_todo || analog_todo) {
651 if (logic_todo > 0) {
652 sending_now = MIN(logic_todo, LOGIC_BUFSIZE / devc->logic_unitsize);
653 logic_generator(sdi, sending_now * devc->logic_unitsize);
654 packet.type = SR_DF_LOGIC;
655 packet.payload = &logic;
656 logic.length = sending_now * devc->logic_unitsize;
657 logic.unitsize = devc->logic_unitsize;
658 logic.data = devc->logic_data;
659 sr_session_send(sdi, &packet);
660 logic_todo -= sending_now;
661 devc->logic_counter += sending_now;
664 /* Analog, one channel at a time */
665 if (analog_todo > 0) {
667 for (l = devc->analog_channel_groups; l; l = l->next) {
670 packet.type = SR_DF_ANALOG;
671 packet.payload = &ag->packet;
673 /* FIXME we should make sure we output a whole
674 * period of data before we send out again the
675 * beginning of our buffer. A ring buffer would
676 * help here as well */
678 sending_now = MIN(analog_todo, ag->num_samples);
679 ag->packet.num_samples = sending_now;
680 sr_session_send(sdi, &packet);
682 /* Whichever channel group gets there first. */
683 analog_sent = MAX(analog_sent, sending_now);
685 analog_todo -= analog_sent;
686 devc->analog_counter += analog_sent;
690 if (!devc->continuous
691 && (!devc->num_logic_channels || devc->logic_counter >= devc->limit_samples)
692 && (!devc->num_analog_channels || devc->analog_counter >= devc->limit_samples)) {
693 sr_dbg("Requested number of samples reached.");
694 dev_acquisition_stop(sdi, cb_data);
701 static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
704 struct dev_context *devc;
708 if (sdi->status != SR_ST_ACTIVE)
709 return SR_ERR_DEV_CLOSED;
712 devc->continuous = !devc->limit_samples;
713 devc->logic_counter = devc->analog_counter = 0;
716 * Setting two channels connected by a pipe is a remnant from when the
717 * demo driver generated data in a thread, and collected and sent the
718 * data in the main program loop.
719 * They are kept here because it provides a convenient way of setting
720 * up a timeout-based polling mechanism.
722 if (pipe(devc->pipe_fds)) {
723 sr_err("%s: pipe() failed", __func__);
727 for (l = devc->analog_channel_groups; l; l = l->next)
728 generate_analog_pattern(l->data, devc->cur_samplerate);
730 devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]);
731 g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL);
733 /* Set channel encoding to binary (default is UTF-8). */
734 g_io_channel_set_encoding(devc->channel, NULL, NULL);
736 /* Make channels unbuffered. */
737 g_io_channel_set_buffered(devc->channel, FALSE);
739 sr_session_source_add_channel(sdi->session, devc->channel,
740 G_IO_IN | G_IO_ERR, 40, prepare_data, (void *)sdi);
742 /* Send header packet to the session bus. */
743 std_session_send_df_header(sdi, LOG_PREFIX);
745 /* We use this timestamp to decide how many more samples to send. */
746 devc->starttime = g_get_monotonic_time();
751 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
753 struct dev_context *devc;
754 struct sr_datafeed_packet packet;
759 sr_dbg("Stopping acquisition.");
761 sr_session_source_remove_channel(sdi->session, devc->channel);
762 g_io_channel_shutdown(devc->channel, FALSE, NULL);
763 g_io_channel_unref(devc->channel);
764 devc->channel = NULL;
766 /* Send last packet. */
767 packet.type = SR_DF_END;
768 sr_session_send(sdi, &packet);
773 SR_PRIV struct sr_dev_driver demo_driver_info = {
775 .longname = "Demo driver and pattern generator",
780 .dev_list = dev_list,
782 .config_get = config_get,
783 .config_set = config_set,
784 .config_list = config_list,
785 .dev_open = dev_open,
786 .dev_close = dev_close,
787 .dev_acquisition_start = dev_acquisition_start,
788 .dev_acquisition_stop = dev_acquisition_stop,