]> sigrok.org Git - libsigrok.git/blame - hardware/demo/demo.c
demo: Cycle through all available patterns for default analog probes.
[libsigrok.git] / hardware / demo / demo.c
CommitLineData
6239c175 1/*
50985c20 2 * This file is part of the libsigrok project.
6239c175
UH
3 *
4 * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
fc96e6f8 5 * Copyright (C) 2011 Olivier Fauchon <olivier@aixmarseille.com>
c216d623 6 * Copyright (C) 2012 Alexandru Gagniuc <mr.nuke.me@gmail.com>
6239c175
UH
7 *
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.
12 *
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.
17 *
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
21 */
22
23#include <stdlib.h>
85b5af06 24#include <unistd.h>
6239c175 25#include <string.h>
4374219b 26#include <math.h>
d35aaf02
UH
27#ifdef _WIN32
28#include <io.h>
29#include <fcntl.h>
30#define pipe(fds) _pipe(fds, 4096, _O_BINARY)
31#endif
45c59c8b
BV
32#include "libsigrok.h"
33#include "libsigrok-internal.h"
6239c175 34
3544f848 35#define LOG_PREFIX "demo"
92bcedf6 36
c07f60e7
BV
37#define DEFAULT_NUM_LOGIC_PROBES 8
38#define DEFAULT_NUM_ANALOG_PROBES 4
c03ed397 39
8b2d41ed 40/* The size in bytes of chunks to send through the session bus. */
61c39f54 41#define LOGIC_BUFSIZE 4096
8b2d41ed
BV
42/* Size of the analog pattern space per channel. */
43#define ANALOG_BUFSIZE 4096
2474d87e 44
4374219b
DJ
45#define ANALOG_AMPLITUDE 25
46#define ANALOG_SAMPLES_PER_PERIOD 20
47
2388ae86 48/* Logic patterns we can generate. */
e15f48c2 49enum {
0d31276b 50 /**
61c39f54
BV
51 * Spells "sigrok" across 8 probes using '0's (with '1's as
52 * "background") when displayed using the 'bits' output format.
c07f60e7
BV
53 * The pattern is repeasted every 8 probes, shifted to the right
54 * in time by one bit.
0d31276b 55 */
c8f4624d 56 PATTERN_SIGROK,
0d31276b 57
c07f60e7 58 /** Pseudo-random values on all probes. */
c8f4624d 59 PATTERN_RANDOM,
0d31276b
UH
60
61 /**
c07f60e7
BV
62 * Incrementing number across 8 probes. The pattern is repeasted
63 * every 8 probes, shifted to the right in time by one bit.
0d31276b 64 */
c8f4624d 65 PATTERN_INC,
c03ed397 66
61c39f54 67 /** All probes have a low logic state. */
c03ed397
UH
68 PATTERN_ALL_LOW,
69
61c39f54 70 /** All probes have a high logic state. */
c03ed397 71 PATTERN_ALL_HIGH,
2388ae86 72};
8b2d41ed 73
2388ae86
BV
74/* Analog patterns we can generate. */
75enum {
8b2d41ed
BV
76 /**
77 * Square wave.
78 */
79 PATTERN_SQUARE,
4374219b 80 PATTERN_SINE,
091c9621 81 PATTERN_TRIANGLE,
9f54e0e8 82 PATTERN_SAWTOOTH,
e15f48c2 83};
85b5af06 84
8b2d41ed 85static const char *logic_pattern_str[] = {
61c39f54
BV
86 "sigrok",
87 "random",
88 "incremental",
89 "all-low",
90 "all-high",
91};
92
8b2d41ed
BV
93static const char *analog_pattern_str[] = {
94 "square",
4374219b 95 "sine",
091c9621 96 "triangle",
9f54e0e8 97 "sawtooth",
8b2d41ed
BV
98};
99
100struct analog_gen {
101 int pattern;
102 float pattern_data[ANALOG_BUFSIZE];
103 unsigned int num_samples;
104 struct sr_datafeed_analog packet;
105};
106
b4750a3a
BV
107/* Private, per-device-instance driver context. */
108struct dev_context {
e15f48c2 109 int pipe_fds[2];
e0532047 110 GIOChannel *channel;
a7684294
JH
111 uint64_t cur_samplerate;
112 uint64_t limit_samples;
113 uint64_t limit_msec;
e15f48c2 114 uint64_t samples_counter;
3b203673 115 int64_t starttime;
61c39f54 116 uint64_t step;
8b2d41ed 117 /* Logic */
c07f60e7
BV
118 int32_t num_logic_probes;
119 unsigned int logic_unitsize;
2388ae86 120 /* There is only ever one logic probe group, so its pattern goes here. */
c07f60e7
BV
121 uint8_t logic_pattern;
122 unsigned char logic_data[LOGIC_BUFSIZE];
8b2d41ed 123 /* Analog */
c07f60e7 124 int32_t num_analog_probes;
8b2d41ed 125 GSList *analog_probe_groups;
c07f60e7
BV
126};
127
7a1da331 128static const int32_t scanopts[] = {
c07f60e7
BV
129 SR_CONF_NUM_LOGIC_PROBES,
130 SR_CONF_NUM_ANALOG_PROBES,
e15f48c2 131};
85b5af06 132
7a1da331 133static const int devopts[] = {
1953564a
BV
134 SR_CONF_LOGIC_ANALYZER,
135 SR_CONF_DEMO_DEV,
136 SR_CONF_SAMPLERATE,
1953564a
BV
137 SR_CONF_LIMIT_SAMPLES,
138 SR_CONF_LIMIT_MSEC,
6239c175
UH
139};
140
7a1da331
BV
141static const int devopts_pg[] = {
142 SR_CONF_PATTERN_MODE,
143};
144
d00088ca
BV
145static const uint64_t samplerates[] = {
146 SR_HZ(1),
147 SR_GHZ(1),
148 SR_HZ(1),
4bfbf9fc
BV
149};
150
c8f4624d 151static uint8_t pattern_sigrok[] = {
917e0e71
BV
152 0x4c, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00,
153 0x82, 0xfe, 0xfe, 0x82, 0x00, 0x00, 0x00, 0x00,
154 0x7c, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00,
155 0xfe, 0x12, 0x12, 0x32, 0xcc, 0x00, 0x00, 0x00,
156 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00, 0x00,
157 0xfe, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0xbe, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160};
161
dcf03d6d 162SR_PRIV struct sr_dev_driver demo_driver_info;
a873c594 163static struct sr_dev_driver *di = &demo_driver_info;
6239c175 164
6078d2c9 165static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data);
6239c175 166
c07f60e7 167
3b412e3a 168static int dev_clear(void)
eebb6067 169{
1c2d542d 170 return std_dev_clear(di, NULL);
eebb6067
UH
171}
172
6078d2c9 173static int init(struct sr_context *sr_ctx)
61136ea6 174{
f6beaac5 175 return std_init(sr_ctx, di, LOG_PREFIX);
61136ea6
BV
176}
177
4374219b 178static void generate_analog_pattern(const struct sr_probe_group *probe_group, uint64_t sample_rate)
8b2d41ed
BV
179{
180 struct analog_gen *ag;
4374219b 181 double t, frequency;
8b2d41ed
BV
182 float value;
183 unsigned int num_samples, i;
184 int last_end;
185
186 ag = probe_group->priv;
4374219b
DJ
187 num_samples = ANALOG_BUFSIZE / sizeof(float);
188
189 sr_dbg("Generating %s pattern for probe group %s",
190 analog_pattern_str[ag->pattern],
191 probe_group->name);
8b2d41ed 192
4374219b 193 switch (ag->pattern) {
8b2d41ed 194 case PATTERN_SQUARE:
2438b737 195 value = ANALOG_AMPLITUDE;
8b2d41ed
BV
196 last_end = 0;
197 for (i = 0; i < num_samples; i++) {
198 if (i % 5 == 0)
199 value = -value;
200 if (i % 10 == 0)
201 last_end = i - 1;
202 ag->pattern_data[i] = value;
203 }
204 ag->num_samples = last_end;
205 break;
4374219b
DJ
206
207 case PATTERN_SINE:
208 frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
209
210 /* Make sure the number of samples we put out is an integer
211 * multiple of our period size */
212 /* FIXME we actually need only one period. A ringbuffer would be
213 * usefull here.*/
214 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
215 num_samples--;
216
217 for (i = 0; i < num_samples; i++) {
218 t = (double) i / (double) sample_rate;
219 ag->pattern_data[i] = ANALOG_AMPLITUDE *
220 sin(2 * M_PI * frequency * t);
221 }
222
091c9621
DJ
223 ag->num_samples = num_samples;
224 break;
225
226 case PATTERN_TRIANGLE:
227 frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
228
229 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
230 num_samples--;
231
232 for (i = 0; i < num_samples; i++) {
233 t = (double) i / (double) sample_rate;
234 ag->pattern_data[i] = (2 * ANALOG_AMPLITUDE / M_PI) *
235 asin(sin(2 * M_PI * frequency * t));
236 }
237
9f54e0e8
DJ
238 ag->num_samples = num_samples;
239 break;
240
241 case PATTERN_SAWTOOTH:
242 frequency = sample_rate / ANALOG_SAMPLES_PER_PERIOD;
243
244 while (num_samples % ANALOG_SAMPLES_PER_PERIOD != 0)
245 num_samples--;
246
247 for (i = 0; i < num_samples; i++) {
248 t = (double) i / (double) sample_rate;
249 ag->pattern_data[i] = 2 * ANALOG_AMPLITUDE *
250 ((t * frequency) - floor(0.5f + t * frequency));
251 }
252
4374219b
DJ
253 ag->num_samples = num_samples;
254 break;
8b2d41ed
BV
255 }
256}
257
6078d2c9 258static GSList *scan(GSList *options)
6239c175 259{
b4750a3a 260 struct drv_context *drvc;
33ef7573 261 struct dev_context *devc;
c07f60e7
BV
262 struct sr_dev_inst *sdi;
263 struct sr_probe *probe;
8b2d41ed 264 struct sr_probe_group *pg;
c07f60e7 265 struct sr_config *src;
8b2d41ed 266 struct analog_gen *ag;
c07f60e7 267 GSList *devices, *l;
2b36d6c6 268 int num_logic_probes, num_analog_probes, pattern, i;
61c39f54 269 char probe_name[16];
067d0716 270
a873c594 271 drvc = di->priv;
4b97c74e 272
c07f60e7
BV
273 num_logic_probes = DEFAULT_NUM_LOGIC_PROBES;
274 num_analog_probes = DEFAULT_NUM_ANALOG_PROBES;
275 for (l = options; l; l = l->next) {
276 src = l->data;
277 switch (src->key) {
278 case SR_CONF_NUM_LOGIC_PROBES:
279 num_logic_probes = g_variant_get_int32(src->data);
280 break;
281 case SR_CONF_NUM_ANALOG_PROBES:
282 num_analog_probes = g_variant_get_int32(src->data);
283 break;
284 }
285 }
85b5af06 286
c07f60e7 287 devices = NULL;
61c39f54 288 sdi = sr_dev_inst_new(0, SR_ST_ACTIVE, "Demo device", NULL, NULL);
c03ed397 289 if (!sdi) {
e45ad6e2
UH
290 sr_err("Device instance creation failed.");
291 return NULL;
c03ed397 292 }
a873c594 293 sdi->driver = di;
e15f48c2 294
8b2d41ed
BV
295 if (!(devc = g_try_malloc(sizeof(struct dev_context)))) {
296 sr_err("Device context malloc failed.");
297 return NULL;
298 }
299 devc->cur_samplerate = SR_KHZ(200);
300 devc->limit_samples = 0;
301 devc->limit_msec = 0;
302 devc->step = 0;
303 devc->num_logic_probes = num_logic_probes;
304 devc->logic_unitsize = (devc->num_logic_probes + 7) / 8;
305 devc->logic_pattern = PATTERN_SIGROK;
306 devc->num_analog_probes = num_analog_probes;
307 devc->analog_probe_groups = NULL;
308
309 /* Logic probes, all in one probe group. */
310 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
311 return NULL;
312 pg->name = g_strdup("Logic");
313 pg->probes = NULL;
314 pg->priv = NULL;
c07f60e7 315 for (i = 0; i < num_logic_probes; i++) {
61c39f54
BV
316 sprintf(probe_name, "D%d", i);
317 if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE, probe_name)))
87ca93c5
BV
318 return NULL;
319 sdi->probes = g_slist_append(sdi->probes, probe);
8b2d41ed 320 pg->probes = g_slist_append(pg->probes, probe);
87ca93c5 321 }
8b2d41ed 322 sdi->probe_groups = g_slist_append(NULL, pg);
87ca93c5 323
8b2d41ed 324 /* Analog probes, probe groups and pattern generators. */
2b36d6c6
BV
325
326 pattern = 0;
c07f60e7
BV
327 for (i = 0; i < num_analog_probes; i++) {
328 sprintf(probe_name, "A%d", i);
03aa381e
BV
329 if (!(probe = sr_probe_new(i + num_logic_probes,
330 SR_PROBE_ANALOG, TRUE, probe_name)))
c07f60e7
BV
331 return NULL;
332 sdi->probes = g_slist_append(sdi->probes, probe);
c07f60e7 333
8b2d41ed
BV
334 /* Every analog probe gets its own probe group. */
335 if (!(pg = g_try_malloc(sizeof(struct sr_probe_group))))
336 return NULL;
337 pg->name = g_strdup(probe_name);
338 pg->probes = g_slist_append(NULL, probe);
85b5af06 339
8b2d41ed
BV
340 /* Every probe group gets a generator struct. */
341 if (!(ag = g_try_malloc(sizeof(struct analog_gen))))
342 return NULL;
343 ag->packet.probes = pg->probes;
344 ag->packet.mq = 0;
345 ag->packet.mqflags = 0;
346 ag->packet.unit = SR_UNIT_VOLT;
347 ag->packet.data = ag->pattern_data;
2b36d6c6 348 ag->pattern = pattern;
8b2d41ed 349 pg->priv = ag;
8b2d41ed
BV
350
351 sdi->probe_groups = g_slist_append(sdi->probe_groups, pg);
352 devc->analog_probe_groups = g_slist_append(devc->analog_probe_groups, pg);
2b36d6c6
BV
353
354 if (++pattern == ARRAY_SIZE(analog_pattern_str))
355 pattern = 0;
33ef7573 356 }
33ef7573
JH
357
358 sdi->priv = devc;
8b2d41ed
BV
359 devices = g_slist_append(devices, sdi);
360 drvc->instances = g_slist_append(drvc->instances, sdi);
33ef7573 361
067d0716 362 return devices;
6239c175
UH
363}
364
6078d2c9 365static GSList *dev_list(void)
811deee4 366{
0e94d524 367 return ((struct drv_context *)(di->priv))->instances;
811deee4
BV
368}
369
6078d2c9 370static int dev_open(struct sr_dev_inst *sdi)
6239c175 371{
e73ffd42 372 sdi->status = SR_ST_ACTIVE;
697785d1 373
e46b8fb1 374 return SR_OK;
6239c175
UH
375}
376
6078d2c9 377static int dev_close(struct sr_dev_inst *sdi)
6239c175 378{
decfe89d 379 sdi->status = SR_ST_INACTIVE;
697785d1
UH
380
381 return SR_OK;
6239c175
UH
382}
383
6078d2c9 384static int cleanup(void)
6239c175 385{
1c2d542d 386 return dev_clear();
6239c175
UH
387}
388
8f996b89
ML
389static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
390 const struct sr_probe_group *probe_group)
6239c175 391{
c07f60e7 392 struct dev_context *devc;
2388ae86
BV
393 struct sr_probe *probe;
394 struct analog_gen *ag;
395 int pattern;
6f57fd96 396
2388ae86
BV
397 if (!sdi)
398 return SR_ERR_ARG;
8f996b89 399
c07f60e7 400 devc = sdi->priv;
035a1078 401 switch (id) {
123e1313 402 case SR_CONF_SAMPLERATE:
a7684294 403 *data = g_variant_new_uint64(devc->cur_samplerate);
6239c175 404 break;
2474d87e 405 case SR_CONF_LIMIT_SAMPLES:
a7684294 406 *data = g_variant_new_uint64(devc->limit_samples);
2474d87e
BV
407 break;
408 case SR_CONF_LIMIT_MSEC:
a7684294 409 *data = g_variant_new_uint64(devc->limit_msec);
2474d87e
BV
410 break;
411 case SR_CONF_PATTERN_MODE:
2388ae86
BV
412 if (!probe_group)
413 return SR_ERR_PROBE_GROUP;
414 probe = probe_group->probes->data;
415 if (probe->type == SR_PROBE_LOGIC) {
416 pattern = devc->logic_pattern;
417 *data = g_variant_new_string(logic_pattern_str[pattern]);
418 } else if (probe->type == SR_PROBE_ANALOG) {
419 ag = probe_group->priv;
420 pattern = ag->pattern;
421 *data = g_variant_new_string(analog_pattern_str[pattern]);
422 } else
423 return SR_ERR_BUG;
c07f60e7
BV
424 break;
425 case SR_CONF_NUM_LOGIC_PROBES:
426 *data = g_variant_new_int32(devc->num_logic_probes);
427 break;
428 case SR_CONF_NUM_ANALOG_PROBES:
429 *data = g_variant_new_int32(devc->num_analog_probes);
2474d87e 430 break;
7dfcf010 431 default:
bd6fbf62 432 return SR_ERR_NA;
6239c175
UH
433 }
434
dfb0fa1a 435 return SR_OK;
6239c175
UH
436}
437
8f996b89
ML
438static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
439 const struct sr_probe_group *probe_group)
6239c175 440{
8b2d41ed 441 struct dev_context *devc;
4374219b 442 struct analog_gen *ag;
2388ae86
BV
443 struct sr_probe *probe;
444 int pattern, ret;
61c39f54 445 unsigned int i;
1b79df2f 446 const char *stropt;
6239c175 447
8b2d41ed 448 devc = sdi->priv;
6239c175 449
e73ffd42
BV
450 if (sdi->status != SR_ST_ACTIVE)
451 return SR_ERR_DEV_CLOSED;
452
2388ae86
BV
453 ret = SR_OK;
454 switch (id) {
455 case SR_CONF_SAMPLERATE:
a7684294 456 devc->cur_samplerate = g_variant_get_uint64(data);
61c39f54 457 sr_dbg("Setting samplerate to %" PRIu64, devc->cur_samplerate);
2388ae86
BV
458 break;
459 case SR_CONF_LIMIT_SAMPLES:
a7684294
JH
460 devc->limit_msec = 0;
461 devc->limit_samples = g_variant_get_uint64(data);
8b2d41ed 462 sr_dbg("Setting sample limit to %" PRIu64, devc->limit_samples);
2388ae86
BV
463 break;
464 case SR_CONF_LIMIT_MSEC:
a7684294
JH
465 devc->limit_msec = g_variant_get_uint64(data);
466 devc->limit_samples = 0;
8b2d41ed 467 sr_dbg("Setting time limit to %" PRIu64"ms", devc->limit_msec);
2388ae86
BV
468 break;
469 case SR_CONF_PATTERN_MODE:
470 if (!probe_group)
471 return SR_ERR_PROBE_GROUP;
d00088ca 472 stropt = g_variant_get_string(data, NULL);
2388ae86
BV
473 probe = probe_group->probes->data;
474 pattern = -1;
475 if (probe->type == SR_PROBE_LOGIC) {
476 for (i = 0; i < ARRAY_SIZE(logic_pattern_str); i++) {
477 if (!strcmp(stropt, logic_pattern_str[i])) {
478 pattern = i;
8b2d41ed
BV
479 break;
480 }
481 }
2388ae86
BV
482 if (pattern == -1)
483 return SR_ERR_ARG;
484 devc->logic_pattern = pattern;
485
486 /* Might as well do this now, these are static. */
487 if (pattern == PATTERN_ALL_LOW)
8b2d41ed 488 memset(devc->logic_data, 0x00, LOGIC_BUFSIZE);
2388ae86 489 else if (pattern == PATTERN_ALL_HIGH)
8b2d41ed 490 memset(devc->logic_data, 0xff, LOGIC_BUFSIZE);
2388ae86
BV
491 sr_dbg("Setting logic pattern to %s",
492 logic_pattern_str[pattern]);
493 } else if (probe->type == SR_PROBE_ANALOG) {
494 for (i = 0; i < ARRAY_SIZE(analog_pattern_str); i++) {
495 if (!strcmp(stropt, analog_pattern_str[i])) {
496 pattern = i;
497 break;
8b2d41ed 498 }
8b2d41ed 499 }
2388ae86
BV
500 if (pattern == -1)
501 return SR_ERR_ARG;
4374219b
DJ
502 sr_dbg("Setting analog pattern for probe group %s to %s",
503 probe_group->name,
2388ae86 504 analog_pattern_str[pattern]);
4374219b
DJ
505 ag = probe_group->priv;
506 ag->pattern = pattern;
2388ae86
BV
507 } else
508 return SR_ERR_BUG;
509 break;
510 default:
bd6fbf62 511 ret = SR_ERR_NA;
6239c175
UH
512 }
513
514 return ret;
515}
516
8f996b89
ML
517static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
518 const struct sr_probe_group *probe_group)
a1c743fc 519{
7a1da331 520 struct sr_probe *probe;
d00088ca
BV
521 GVariant *gvar;
522 GVariantBuilder gvb;
a1c743fc
BV
523
524 (void)sdi;
525
7a1da331 526 if (key == SR_CONF_SCAN_OPTIONS) {
c07f60e7 527 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
7a1da331
BV
528 scanopts, ARRAY_SIZE(scanopts), sizeof(int32_t));
529 return SR_OK;
530 }
531
532 if (!sdi)
533 return SR_ERR_ARG;
534
535 if (!probe_group) {
536 switch (key) {
537 case SR_CONF_DEVICE_OPTIONS:
538 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
539 devopts, ARRAY_SIZE(devopts), sizeof(int32_t));
540 break;
541 case SR_CONF_SAMPLERATE:
542 g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
543 gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
544 ARRAY_SIZE(samplerates), sizeof(uint64_t));
545 g_variant_builder_add(&gvb, "{sv}", "samplerate-steps", gvar);
546 *data = g_variant_builder_end(&gvb);
547 break;
548 default:
549 return SR_ERR_NA;
550 }
551 } else {
552 probe = probe_group->probes->data;
553 switch (key) {
554 case SR_CONF_DEVICE_OPTIONS:
555 *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
556 devopts_pg, ARRAY_SIZE(devopts_pg), sizeof(int32_t));
557 break;
558 case SR_CONF_PATTERN_MODE:
559 if (probe->type == SR_PROBE_LOGIC)
560 *data = g_variant_new_strv(logic_pattern_str,
561 ARRAY_SIZE(logic_pattern_str));
2388ae86 562 else if (probe->type == SR_PROBE_ANALOG)
7a1da331
BV
563 *data = g_variant_new_strv(analog_pattern_str,
564 ARRAY_SIZE(analog_pattern_str));
2388ae86
BV
565 else
566 return SR_ERR_BUG;
7a1da331
BV
567 break;
568 default:
569 return SR_ERR_NA;
570 }
a1c743fc
BV
571 }
572
573 return SR_OK;
574}
575
c07f60e7 576static void logic_generator(struct sr_dev_inst *sdi, uint64_t size)
85b5af06 577{
61c39f54 578 struct dev_context *devc;
c07f60e7
BV
579 uint64_t i, j;
580 uint8_t pat;
85b5af06 581
61c39f54 582 devc = sdi->priv;
85b5af06 583
c07f60e7 584 switch (devc->logic_pattern) {
61c39f54 585 case PATTERN_SIGROK:
c07f60e7
BV
586 memset(devc->logic_data, 0x00, size);
587 for (i = 0; i < size; i += devc->logic_unitsize) {
588 for (j = 0; j < devc->logic_unitsize; j++) {
589 pat = pattern_sigrok[(devc->step + j) % sizeof(pattern_sigrok)] >> 1;
590 devc->logic_data[i + j] = ~pat;
591 }
592 devc->step++;
917e0e71
BV
593 }
594 break;
61c39f54 595 case PATTERN_RANDOM:
5096c6a6 596 for (i = 0; i < size; i++)
61c39f54 597 devc->logic_data[i] = (uint8_t)(rand() & 0xff);
85b5af06 598 break;
61c39f54 599 case PATTERN_INC:
c07f60e7
BV
600 for (i = 0; i < size; i++) {
601 for (j = 0; j < devc->logic_unitsize; j++) {
602 devc->logic_data[i + j] = devc->step;
603 }
604 devc->step++;
605 }
c03ed397 606 break;
61c39f54
BV
607 case PATTERN_ALL_LOW:
608 case PATTERN_ALL_HIGH:
609 /* These were set when the pattern mode was selected. */
c03ed397
UH
610 break;
611 default:
c07f60e7 612 sr_err("Unknown pattern: %d.", devc->logic_pattern);
c03ed397 613 break;
85b5af06
UH
614 }
615}
616
85b5af06 617/* Callback handling data */
61c39f54 618static int prepare_data(int fd, int revents, void *cb_data)
85b5af06 619{
61c39f54
BV
620 struct sr_dev_inst *sdi;
621 struct dev_context *devc;
b9c735a2 622 struct sr_datafeed_packet packet;
9c939c51 623 struct sr_datafeed_logic logic;
8b2d41ed
BV
624 struct sr_probe_group *pg;
625 struct analog_gen *ag;
626 GSList *l;
627 uint64_t samples_to_send, expected_samplenum, analog_samples, sending_now;
3b203673 628 int64_t time, elapsed;
1924f59f 629
cb93f8a9
UH
630 (void)fd;
631 (void)revents;
1924f59f 632
61c39f54
BV
633 sdi = cb_data;
634 devc = sdi->priv;
635
3b203673
AG
636 /* How many "virtual" samples should we have collected by now? */
637 time = g_get_monotonic_time();
638 elapsed = time - devc->starttime;
a7684294 639 expected_samplenum = elapsed * devc->cur_samplerate / 1000000;
3b203673
AG
640 /* Of those, how many do we still have to send? */
641 samples_to_send = expected_samplenum - devc->samples_counter;
642
a7684294 643 if (devc->limit_samples) {
3b203673 644 samples_to_send = MIN(samples_to_send,
c07f60e7 645 devc->limit_samples - devc->samples_counter);
3b203673 646 }
85b5af06 647
3b203673 648 while (samples_to_send > 0) {
8b2d41ed 649 sending_now = 0;
3b203673 650
c07f60e7 651 /* Logic */
8b2d41ed
BV
652 if (devc->num_logic_probes > 0) {
653 sending_now = MIN(samples_to_send,
654 LOGIC_BUFSIZE / devc->logic_unitsize);
655 logic_generator(sdi, sending_now * devc->logic_unitsize);
656 packet.type = SR_DF_LOGIC;
657 packet.payload = &logic;
658 logic.length = sending_now * devc->logic_unitsize;
659 logic.unitsize = devc->logic_unitsize;
660 logic.data = devc->logic_data;
661 sr_session_send(sdi, &packet);
662 }
663
664 /* Analog, one probe at a time */
665 if (devc->num_analog_probes > 0) {
666 sending_now = 0;
667 for (l = devc->analog_probe_groups; l; l = l->next) {
668 pg = l->data;
669 ag = pg->priv;
670 packet.type = SR_DF_ANALOG;
671 packet.payload = &ag->packet;
4374219b
DJ
672
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 */
677
8b2d41ed
BV
678 analog_samples = MIN(samples_to_send, ag->num_samples);
679 /* Whichever probe group gets there first. */
680 sending_now = MAX(sending_now, analog_samples);
681 ag->packet.num_samples = analog_samples;
682 sr_session_send(sdi, &packet);
683 }
684 }
685
686 samples_to_send -= sending_now;
3b203673
AG
687 devc->samples_counter += sending_now;
688 }
689
a7684294
JH
690 if (devc->limit_samples &&
691 devc->samples_counter >= devc->limit_samples) {
35e199da 692 sr_info("Requested number of samples reached.");
61c39f54 693 dev_acquisition_stop(sdi, cb_data);
c216d623 694 return TRUE;
85b5af06 695 }
1924f59f 696
85b5af06
UH
697 return TRUE;
698}
699
6078d2c9 700static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
6239c175 701{
4374219b 702 GSList *l;
61c39f54 703 struct dev_context *devc;
85b5af06 704
e73ffd42
BV
705 if (sdi->status != SR_ST_ACTIVE)
706 return SR_ERR_DEV_CLOSED;
707
8b2d41ed 708 /* TODO: don't start without a sample limit set */
61c39f54 709 devc = sdi->priv;
b4750a3a 710 devc->samples_counter = 0;
85b5af06 711
3b203673
AG
712 /*
713 * Setting two channels connected by a pipe is a remnant from when the
714 * demo driver generated data in a thread, and collected and sent the
715 * data in the main program loop.
716 * They are kept here because it provides a convenient way of setting
717 * up a timeout-based polling mechanism.
718 */
b4750a3a 719 if (pipe(devc->pipe_fds)) {
92bcedf6 720 sr_err("%s: pipe() failed", __func__);
e46b8fb1 721 return SR_ERR;
c03ed397 722 }
85b5af06 723
4374219b
DJ
724 for (l = devc->analog_probe_groups; l; l = l->next) {
725 generate_analog_pattern(l->data, devc->cur_samplerate);
726 }
727
e0532047 728 devc->channel = g_io_channel_unix_new(devc->pipe_fds[0]);
d35aaf02 729
e0532047 730 g_io_channel_set_flags(devc->channel, G_IO_FLAG_NONBLOCK, NULL);
e6e8f8e0 731
d35aaf02 732 /* Set channel encoding to binary (default is UTF-8). */
e0532047 733 g_io_channel_set_encoding(devc->channel, NULL, NULL);
d35aaf02
UH
734
735 /* Make channels to unbuffered. */
e0532047 736 g_io_channel_set_buffered(devc->channel, FALSE);
d35aaf02 737
e0532047 738 sr_session_source_add_channel(devc->channel, G_IO_IN | G_IO_ERR,
61c39f54 739 40, prepare_data, (void *)sdi);
85b5af06 740
4afdfd46 741 /* Send header packet to the session bus. */
29a27196 742 std_session_send_df_header(cb_data, LOG_PREFIX);
f366e86c 743
3b203673
AG
744 /* We use this timestamp to decide how many more samples to send. */
745 devc->starttime = g_get_monotonic_time();
746
e46b8fb1 747 return SR_OK;
6239c175
UH
748}
749
6078d2c9 750static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
6239c175 751{
8b2d41ed 752 struct dev_context *devc;
c216d623 753 struct sr_datafeed_packet packet;
7fd3e859 754
33ef7573 755 (void)cb_data;
7fd3e859 756
8b2d41ed 757 devc = sdi->priv;
49145a63
AG
758 sr_dbg("Stopping aquisition.");
759
e0532047
JH
760 sr_session_source_remove_channel(devc->channel);
761 g_io_channel_shutdown(devc->channel, FALSE, NULL);
2150a69b
JH
762 g_io_channel_unref(devc->channel);
763 devc->channel = NULL;
c216d623
AG
764
765 /* Send last packet. */
766 packet.type = SR_DF_END;
c07f60e7 767 sr_session_send(sdi, &packet);
7fd3e859 768
3010f21c 769 return SR_OK;
6239c175
UH
770}
771
c09f0b57 772SR_PRIV struct sr_dev_driver demo_driver_info = {
e519ba86
UH
773 .name = "demo",
774 .longname = "Demo driver and pattern generator",
775 .api_version = 1,
6078d2c9
UH
776 .init = init,
777 .cleanup = cleanup,
778 .scan = scan,
779 .dev_list = dev_list,
3b412e3a 780 .dev_clear = dev_clear,
035a1078
BV
781 .config_get = config_get,
782 .config_set = config_set,
a1c743fc 783 .config_list = config_list,
6078d2c9
UH
784 .dev_open = dev_open,
785 .dev_close = dev_close,
786 .dev_acquisition_start = dev_acquisition_start,
787 .dev_acquisition_stop = dev_acquisition_stop,
b4750a3a 788 .priv = NULL,
6239c175 789};