+static void samples_generator(uint8_t *buf, uint64_t size, void *data)
+{
+ struct databag *mydata = data;
+ uint64_t p, i;
+
+ memset(buf, 0, size);
+
+ switch (mydata->sample_generator) {
+ case GENMODE_DEFAULT:
+ p = 0;
+ for (i = 0; i < size; i++) {
+ *(buf + i) = ~(genmode_default[p] >> 1);
+ if (++p == 64)
+ p = 0;
+ }
+ break;
+ case GENMODE_RANDOM: /* Random */
+ for (i = 0; i < size; i++)
+ *(buf + i) = (uint8_t)(rand() & 0xff);
+ break;
+ case GENMODE_INC: /* Simple increment */
+ for (i = 0; i < size; i++)
+ *(buf + i) = i;
+ break;
+ }
+}
+
+/* Thread function */
+static void thread_func(void *data)
+{
+ struct databag *mydata = data;
+ uint8_t buf[BUFSIZE];
+ uint64_t nb_to_send = 0;
+ int bytes_written;
+ unsigned int msec_elapsed;
+
+ while (thread_running) {
+ if (limit_samples)
+ nb_to_send = limit_samples - mydata->samples_counter;
+ else
+ nb_to_send = BUFSIZE; /* Continuous mode */
+
+ if (limit_msec) {
+ msec_elapsed = g_timer_elapsed(mydata->timer, NULL) * 1000;
+ if (msec_elapsed > limit_msec)
+ nb_to_send = 0;
+ }
+
+ if (nb_to_send == 0) {
+ close(mydata->pipe_fds[1]);
+ thread_running = 0;
+ hw_stop_acquisition(mydata->device_index,
+ mydata->session_device_id);
+ } else if (nb_to_send > BUFSIZE) {
+ nb_to_send = BUFSIZE;
+ }
+
+ samples_generator(buf, nb_to_send, data);
+ mydata->samples_counter += nb_to_send;
+
+ g_io_channel_write_chars(channels[1], (gchar *)&buf,
+ nb_to_send, (gsize *)&bytes_written, NULL);
+
+ g_usleep(mydata->loop_sleep);
+ }
+}
+
+/* Callback handling data */
+static int receive_data(int fd, int revents, void *user_data)
+{
+ struct datafeed_packet packet;
+ char c[BUFSIZE];
+ uint64_t z;
+
+ /* Avoid compiler warnings. */
+ fd = fd;
+ revents = revents;
+
+ g_io_channel_read_chars(channels[0], (gchar *)&c, BUFSIZE, &z, NULL);
+
+ if (z > 0) {
+ packet.type = DF_LOGIC;
+ packet.length = z;
+ packet.unitsize = 1;
+ packet.payload = c;
+ session_bus(user_data, &packet);
+ }
+ return TRUE;
+}
+