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
29 #define pipe(fds) _pipe(fds, 4096, _O_BINARY)
31 #include "libsigrok.h"
32 #include "libsigrok-internal.h"
34 #define LOG_PREFIX "demo"
36 #define DEFAULT_NUM_LOGIC_PROBES 8
37 #define DEFAULT_NUM_ANALOG_PROBES 4
39 /* The size in bytes of chunks to send through the session bus. */
40 #define LOGIC_BUFSIZE 4096
41 /* Size of the analog pattern space per channel. */
42 #define ANALOG_BUFSIZE 4096
44 /* Patterns we can generate */
48 * Spells "sigrok" across 8 probes using '0's (with '1's as
49 * "background") when displayed using the 'bits' output format.
50 * The pattern is repeasted every 8 probes, shifted to the right
55 /** Pseudo-random values on all probes. */
59 * Incrementing number across 8 probes. The pattern is repeasted
60 * every 8 probes, shifted to the right in time by one bit.
64 /** All probes have a low logic state. */
67 /** All probes have a high logic state. */
77 static const char *logic_pattern_str[] = {
85 static const char *analog_pattern_str[] = {
91 float pattern_data[ANALOG_BUFSIZE];
92 unsigned int num_samples;
93 struct sr_datafeed_analog packet;
96 /* Private, per-device-instance driver context. */
100 uint64_t cur_samplerate;
101 uint64_t limit_samples;
103 uint64_t samples_counter;
107 int32_t num_logic_probes;
108 unsigned int logic_unitsize;
109 uint8_t logic_pattern;
110 unsigned char logic_data[LOGIC_BUFSIZE];
112 int32_t num_analog_probes;
113 GSList *analog_probe_groups;
116 static const int32_t scanopts[] = {
117 SR_CONF_NUM_LOGIC_PROBES,
118 SR_CONF_NUM_ANALOG_PROBES,
121 static const int devopts[] = {
122 SR_CONF_LOGIC_ANALYZER,
125 SR_CONF_LIMIT_SAMPLES,
129 static const int devopts_pg[] = {
130 SR_CONF_PATTERN_MODE,
133 static const uint64_t samplerates[] = {
139 static uint8_t pattern_sigrok[] = {
140 0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
141 0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
142 0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
143 0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
144 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
145 0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 SR_PRIV struct sr_dev_driver demo_driver_info;
151 static struct sr_dev_driver *di = &demo_driver_info;
153 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
156 static int dev_clear(void)
158 return std_dev_clear(di, NULL);
161 static int init(struct sr_context *sr_ctx)
163 return std_init(sr_ctx, di, LOG_PREFIX);
166 static void set_analog_pattern(const struct sr_probe_group *probe_group, int pattern)
168 struct analog_gen *ag;
170 unsigned int num_samples, i;
173 ag = probe_group->priv;
174 ag->pattern = pattern;
178 num_samples = ANALOG_BUFSIZE / sizeof(float);
181 for (i = 0; i < num_samples; i++) {
186 ag->pattern_data[i] = value;
188 ag->num_samples = last_end;
193 static GSList *scan(GSList *options)
195 struct drv_context *drvc;
196 struct dev_context *devc;
197 struct sr_dev_inst *sdi;
198 struct sr_probe *probe;
199 struct sr_probe_group *pg;
200 struct sr_config *src;
201 struct analog_gen *ag;
203 int num_logic_probes, num_analog_probes, i;
208 num_logic_probes = DEFAULT_NUM_LOGIC_PROBES;
209 num_analog_probes = DEFAULT_NUM_ANALOG_PROBES;
210 for (l = options; l; l = l->next) {
213 case SR_CONF_NUM_LOGIC_PROBES:
214 num_logic_probes = g_variant_get_int32(src->data);
216 case SR_CONF_NUM_ANALOG_PROBES:
217 num_analog_probes = g_variant_get_int32(src->data);
223 sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, "Demo device", NULL, NULL);
225 sr_err("Device instance creation failed.");
230 if (!(devc = g_try_malloc(sizeof(struct dev_context)))) {
231 sr_err("Device context malloc failed.");
234 devc->cur_samplerate = SR_KHZ(200);
235 devc->limit_samples = 0;
236 devc->limit_msec = 0;
238 devc->num_logic_probes = num_logic_probes;
239 devc->logic_unitsize = (devc->num_logic_probes + 7) / 8;
240 devc->logic_pattern = PATTERN_SIGROK;
241 devc->num_analog_probes = num_analog_probes;
242 devc->analog_probe_groups = NULL;
244 /* Logic probes, all in one probe group. */
245 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
247 pg->name = g_strdup("Logic");
250 for (i = 0; i < num_logic_probes; i++) {
251 sprintf(probe_name, "D%d", i);
252 if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, probe_name)))
254 sdi->probes = g_slist_append(sdi->probes, probe);
255 pg->probes = g_slist_append(pg->probes, probe);
257 sdi->probe_groups = g_slist_append(NULL, pg);
259 /* Analog probes, probe groups and pattern generators. */
260 for (i = 0; i < num_analog_probes; i++) {
261 sprintf(probe_name, "A%d", i);
262 if (!(probe = sr_probe_new(i, SR_PROBE_ANALOG, TRUE, probe_name)))
264 sdi->probes = g_slist_append(sdi->probes, probe);
266 /* Every analog probe gets its own probe group. */
267 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
269 pg->name = g_strdup(probe_name);
270 pg->probes = g_slist_append(NULL, probe);
272 /* Every probe group gets a generator struct. */
273 if (!(ag = g_try_malloc(sizeof(struct analog_gen))))
275 ag->packet.probes = pg->probes;
277 ag->packet.mqflags = 0;
278 ag->packet.unit = SR_UNIT_VOLT;
279 ag->packet.data = ag->pattern_data;
281 set_analog_pattern(pg, PATTERN_SQUARE);
283 sdi->probe_groups = g_slist_append(sdi->probe_groups, pg);
284 devc->analog_probe_groups = g_slist_append(devc->analog_probe_groups, pg);
288 devices = g_slist_append(devices, sdi);
289 drvc->instances = g_slist_append(drvc->instances, sdi);
294 static GSList *dev_list(void)
296 return ((struct drv_context *)(di->priv))->instances;
299 static int dev_open(struct sr_dev_inst *sdi)
301 sdi->status = SR_ST_ACTIVE;
306 static int dev_close(struct sr_dev_inst *sdi)
308 sdi->status = SR_ST_INACTIVE;
313 static int cleanup(void)
318 static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
319 const struct sr_probe_group *probe_group)
321 struct dev_context *devc;
327 case SR_CONF_SAMPLERATE:
328 *data = g_variant_new_uint64(devc->cur_samplerate);
330 case SR_CONF_LIMIT_SAMPLES:
331 *data = g_variant_new_uint64(devc->limit_samples);
333 case SR_CONF_LIMIT_MSEC:
334 *data = g_variant_new_uint64(devc->limit_msec);
336 case SR_CONF_PATTERN_MODE:
337 *data = g_variant_new_string(logic_pattern_str[devc->logic_pattern]);
339 case SR_CONF_NUM_LOGIC_PROBES:
340 *data = g_variant_new_int32(devc->num_logic_probes);
342 case SR_CONF_NUM_ANALOG_PROBES:
343 *data = g_variant_new_int32(devc->num_analog_probes);
352 static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
353 const struct sr_probe_group *probe_group)
355 struct dev_context *devc;
356 struct sr_probe_group *pg;
358 int logic_pattern, analog_pattern, ret;
364 if (sdi->status != SR_ST_ACTIVE)
365 return SR_ERR_DEV_CLOSED;
368 if (id == SR_CONF_SAMPLERATE) {
369 devc->cur_samplerate = g_variant_get_uint64(data);
370 sr_dbg("Setting samplerate to %" PRIu64, devc->cur_samplerate);
372 } else if (id == SR_CONF_LIMIT_SAMPLES) {
373 devc->limit_msec = 0;
374 devc->limit_samples = g_variant_get_uint64(data);
375 sr_dbg("Setting sample limit to %" PRIu64, devc->limit_samples);
377 } else if (id == SR_CONF_LIMIT_MSEC) {
378 /* TODO: convert to limit_samples */
379 devc->limit_msec = g_variant_get_uint64(data);
380 devc->limit_samples = 0;
381 sr_dbg("Setting time limit to %" PRIu64"ms", devc->limit_msec);
383 } else if (id == SR_CONF_PATTERN_MODE) {
384 stropt = g_variant_get_string(data, NULL);
385 logic_pattern = analog_pattern = -1;
386 /* Is it a logic pattern? */
387 for (i = 0; i < ARRAY_SIZE(logic_pattern_str); i++) {
388 if (!strcmp(stropt, logic_pattern_str[i])) {
393 if (logic_pattern == -1) {
394 /* Is it an analog pattern? */
395 for (i = 0; i < ARRAY_SIZE(analog_pattern_str); i++) {
396 if (!strcmp(stropt, analog_pattern_str[i])) {
402 if (logic_pattern > -1) {
403 devc->logic_pattern = logic_pattern;
404 /* Might as well do this now. */
405 if (logic_pattern == PATTERN_ALL_LOW)
406 memset(devc->logic_data, 0x00, LOGIC_BUFSIZE);
407 else if (logic_pattern == PATTERN_ALL_HIGH)
408 memset(devc->logic_data, 0xff, LOGIC_BUFSIZE);
410 sr_dbg("Setting logic pattern to %s", logic_pattern_str[logic_pattern]);
411 } else if (analog_pattern > -1) {
412 sr_dbg("Setting analog pattern to %s", analog_pattern_str[analog_pattern]);
414 set_analog_pattern(probe_group, analog_pattern);
416 /* No probe group specified, apply pattern to all of them. */
417 for (l = sdi->probe_groups; l; l = l->next) {
419 set_analog_pattern(pg, analog_pattern);
433 static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
434 const struct sr_probe_group *probe_group)
436 struct sr_probe *probe;
442 if (key == SR_CONF_SCAN_OPTIONS) {
443 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
444 scanopts, ARRAY_SIZE(scanopts), sizeof(int32_t));
453 case SR_CONF_DEVICE_OPTIONS:
454 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
455 devopts, ARRAY_SIZE(devopts), sizeof(int32_t));
457 case SR_CONF_SAMPLERATE:
458 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
459 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
460 ARRAY_SIZE(samplerates), sizeof(uint64_t));
461 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
462 *data = g_variant_builder_end(&gvb);
468 probe = probe_group->probes->data;
470 case SR_CONF_DEVICE_OPTIONS:
471 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
472 devopts_pg, ARRAY_SIZE(devopts_pg), sizeof(int32_t));
474 case SR_CONF_PATTERN_MODE:
475 if (probe->type == SR_PROBE_LOGIC)
476 *data = g_variant_new_strv(logic_pattern_str,
477 ARRAY_SIZE(logic_pattern_str));
479 *data = g_variant_new_strv(analog_pattern_str,
480 ARRAY_SIZE(analog_pattern_str));
490 static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
492 struct dev_context *devc;
498 switch (devc->logic_pattern) {
500 memset(devc->logic_data, 0x00, size);
501 for (i = 0; i < size; i += devc->logic_unitsize) {
502 for (j = 0; j < devc->logic_unitsize; j++) {
503 pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
504 devc->logic_data[i + j] = ~pat;
510 for (i = 0; i < size; i++)
511 devc->logic_data[i] = (uint8_t)(rand() & 0xff);
514 for (i = 0; i < size; i++) {
515 for (j = 0; j < devc->logic_unitsize; j++) {
516 devc->logic_data[i + j] = devc->step;
521 case PATTERN_ALL_LOW:
522 case PATTERN_ALL_HIGH:
523 /* These were set when the pattern mode was selected. */
526 sr_err("Unknown pattern: %d.", devc->logic_pattern);
531 /* Callback handling data */
532 static int prepare_data(int fd, int revents, void *cb_data)
534 struct sr_dev_inst *sdi;
535 struct dev_context *devc;
536 struct sr_datafeed_packet packet;
537 struct sr_datafeed_logic logic;
538 struct sr_probe_group *pg;
539 struct analog_gen *ag;
541 uint64_t samples_to_send, expected_samplenum, analog_samples, sending_now;
542 int64_t time, elapsed;
550 /* How many "virtual" samples should we have collected by now? */
551 time = g_get_monotonic_time();
552 elapsed = time - devc->starttime;
553 expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
554 /* Of those, how many do we still have to send? */
555 samples_to_send = expected_samplenum - devc->samples_counter;
557 if (devc->limit_samples) {
558 samples_to_send = MIN(samples_to_send,
559 devc->limit_samples - devc->samples_counter);
562 while (samples_to_send > 0) {
566 if (devc->num_logic_probes > 0) {
567 sending_now = MIN(samples_to_send,
568 LOGIC_BUFSIZE / devc->logic_unitsize);
569 logic_generator(sdi, sending_now * devc->logic_unitsize);
570 packet.type = SR_DF_LOGIC;
571 packet.payload = &logic;
572 logic.length = sending_now * devc->logic_unitsize;
573 logic.unitsize = devc->logic_unitsize;
574 logic.data = devc->logic_data;
575 sr_session_send(sdi, &packet);
578 /* Analog, one probe at a time */
579 if (devc->num_analog_probes > 0) {
581 for (l = devc->analog_probe_groups; l; l = l->next) {
584 packet.type = SR_DF_ANALOG;
585 packet.payload = &ag->packet;
586 analog_samples = MIN(samples_to_send, ag->num_samples);
587 /* Whichever probe group gets there first. */
588 sending_now = MAX(sending_now, analog_samples);
589 ag->packet.num_samples = analog_samples;
590 sr_session_send(sdi, &packet);
594 samples_to_send -= sending_now;
595 devc->samples_counter += sending_now;
598 if (devc->limit_samples &&
599 devc->samples_counter >= devc->limit_samples) {
600 sr_info("Requested number of samples reached.");
601 dev_acquisition_stop(sdi, cb_data);
608 static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
610 struct dev_context *devc;
612 if (sdi->status != SR_ST_ACTIVE)
613 return SR_ERR_DEV_CLOSED;
615 /* TODO: don't start without a sample limit set */
617 devc->samples_counter = 0;
620 * Setting two channels connected by a pipe is a remnant from when the
621 * demo driver generated data in a thread, and collected and sent the
622 * data in the main program loop.
623 * They are kept here because it provides a convenient way of setting
624 * up a timeout-based polling mechanism.
626 if (pipe(devc->pipe_fds)) {
627 sr_err("%s: pipe() failed", __func__);
631 devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]);
633 g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL);
635 /* Set channel encoding to binary (default is UTF-8). */
636 g_io_channel_set_encoding(devc->channel, NULL, NULL);
638 /* Make channels to unbuffered. */
639 g_io_channel_set_buffered(devc->channel, FALSE);
641 sr_session_source_add_channel(devc->channel, G_IO_IN | G_IO_ERR,
642 40, prepare_data, (void *)sdi);
644 /* Send header packet to the session bus. */
645 std_session_send_df_header(cb_data, LOG_PREFIX);
647 /* We use this timestamp to decide how many more samples to send. */
648 devc->starttime = g_get_monotonic_time();
653 static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
655 struct dev_context *devc;
656 struct sr_datafeed_packet packet;
661 sr_dbg("Stopping aquisition.");
663 sr_session_source_remove_channel(devc->channel);
664 g_io_channel_shutdown(devc->channel, FALSE, NULL);
665 g_io_channel_unref(devc->channel);
666 devc->channel = NULL;
668 /* Send last packet. */
669 packet.type = SR_DF_END;
670 sr_session_send(sdi, &packet);
675 SR_PRIV struct sr_dev_driver demo_driver_info = {
677 .longname = "Demo driver and pattern generator",
682 .dev_list = dev_list,
683 .dev_clear = dev_clear,
684 .config_get = config_get,
685 .config_set = config_set,
686 .config_list = config_list,
687 .dev_open = dev_open,
688 .dev_close = dev_close,
689 .dev_acquisition_start = dev_acquisition_start,
690 .dev_acquisition_stop = dev_acquisition_stop,