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