diff options
Diffstat (limited to 'examples/dummy-iiostream.c')
-rw-r--r-- | examples/dummy-iiostream.c | 374 |
1 files changed, 0 insertions, 374 deletions
diff --git a/examples/dummy-iiostream.c b/examples/dummy-iiostream.c deleted file mode 100644 index 0f74808..0000000 --- a/examples/dummy-iiostream.c +++ /dev/null @@ -1,374 +0,0 @@ -/* - * libiio - Dummy IIO streaming example - * - * This example libiio program is meant to exercise the features of IIO present - * in the sample dummy IIO device. For buffered access it relies on the hrtimer - * trigger but could be modified to use the sysfs trigger. No hardware should - * be required to run this program. - * - * Copyright (c) 2016, DAQRI. All rights reserved. - * Author: Lucas Magasweran <lucas.magasweran@daqri.com> - * - * Based on AD9361 example: - * Copyright (C) 2014 IABG mbH - * Author: Michael Feilen <feilen_at_iabg.de> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * How to setup the sample IIO dummy device and hrtimer trigger: - * - * 1. Check if `configfs` is already mounted - * - * $ mount | grep 'config' - * configfs on /sys/kernel/config type configfs (rw,relatime) - * - * 1.b. Mount `configfs` if it is not already mounted - * $ sudo mount -t configfs none /sys/kernel/config - * - * 2. Load modules one by one - * - * $ sudo modprobe industrialio - * $ sudo modprobe industrialio-configfs - * $ sudo modprobe industrialio-sw-device - * $ sudo modprobe industrialio-sw-trigger - * $ sudo modprobe iio-trig-hrtimer - * $ sudo modprobe iio_dummy - * - * 3. Create trigger and dummy device under `/sys/kernel/config` - * - * $ sudo mkdir /sys/kernel/config/iio/triggers/hrtimer/instance1 - * $ sudo mkdir /sys/kernel/config/iio/devices/dummy/my_dummy_device - * - * 4. Run `iio_info` to see that all worked properly - * - * $ iio_info - * Library version: 0.14 (git tag: c9909f2) - * Compiled with backends: local xml ip - * IIO context created with local backend. - * Backend version: 0.14 (git tag: c9909f2) - * Backend description string: Linux ... - * IIO context has 1 attributes: - * local,kernel: 4.13.0-39-generic - * IIO context has 2 devices: - * iio:device0: my_dummy_device - * 10 channels found: - * activity_walking: (input) - * 1 channel-specific attributes found: - * attr 0: input value: 4 - * ... - * - **/ - -#include <stdbool.h> -#include <stdint.h> -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include <signal.h> -#include <stdio.h> -#include <errno.h> -#include <getopt.h> - -#ifdef __APPLE__ -#include <iio/iio.h> -#else -#include <iio.h> -#endif - -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) - -static char *name = "iio_dummy_part_no"; -static char *trigger_str = "instance1"; -static int buffer_length = 1; -static int count = -1; - -// libiio supports multiple methods for reading data from a buffer -enum { - BUFFER_POINTER, - SAMPLE_CALLBACK, - CHANNEL_READ_RAW, - CHANNEL_READ, - MAX_READ_METHOD, -}; -static int buffer_read_method = BUFFER_POINTER; - -// Streaming devices -static struct iio_device *dev; - -/* IIO structs required for streaming */ -static struct iio_context *ctx; -static struct iio_buffer *rxbuf; -static struct iio_channel **channels; -static int channel_count; - -static bool stop; -static bool has_repeat; - -/* cleanup and exit */ -static void shutdown() -{ - if (channels) { free(channels); } - - printf("* Destroying buffers\n"); - if (rxbuf) { iio_buffer_destroy(rxbuf); } - - printf("* Disassociate trigger\n"); - if (dev) { iio_device_set_trigger(dev, NULL); } - - printf("* Destroying context\n"); - if (ctx) { iio_context_destroy(ctx); } - exit(0); -} - -static void handle_sig(int sig) -{ - printf("Waiting for process to finish...\n"); - stop = true; -} - -static ssize_t sample_cb(const struct iio_channel *chn, void *src, size_t bytes, void *d) -{ - const struct iio_data_format *fmt = iio_channel_get_data_format(chn); - unsigned int repeat = has_repeat ? fmt->repeat : 1; - - printf("%s ", iio_channel_get_id(chn)); - for (int j = 0; j < repeat; ++j) { - if (bytes == sizeof(int16_t)) - printf("%i ", ((int16_t *)src)[j]); - else if (bytes == sizeof(int64_t)) - printf("%ld ", ((int64_t *)src)[j]); - } - - return bytes * repeat; -} - -static void usage(int argc, char *argv[]) -{ - printf("Usage: %s [OPTION]\n", argv[0]); - printf(" -d\tdevice name (default \"iio_dummy_part_no\")\n"); - printf(" -t\ttrigger name (default \"instance1\")\n"); - printf(" -b\tbuffer length (default 1)\n"); - printf(" -r\tread method (default 0 pointer, 1 callback, 2 read, 3 read raw)\n"); - printf(" -c\tread count (default no limit)\n"); -} - -static void parse_options(int argc, char *argv[]) -{ - int c; - - while ((c = getopt(argc, argv, "d:t:b:r:c:h")) != -1) { - switch (c) - { - case 'd': - name = optarg; - break; - case 't': - trigger_str = optarg; - break; - case 'b': - buffer_length = atoi(optarg); - break; - case 'r': - if (atoi(optarg) >= 0 && atoi(optarg) < MAX_READ_METHOD) { - buffer_read_method = atoi(optarg); - } else { - usage(argc, argv); - exit(1); - } - break; - case 'c': - if (atoi(optarg) > 0) { - count = atoi(optarg); - } else { - usage(argc, argv); - exit(1); - } - break; - case 'h': - default: - usage(argc, argv); - exit(1); - } - } -} - -/* simple configuration and streaming */ -int main (int argc, char **argv) -{ - // Hardware trigger - struct iio_device *trigger; - - parse_options(argc, argv); - - // Listen to ctrl+c and assert - signal(SIGINT, handle_sig); - - unsigned int major, minor; - char git_tag[8]; - iio_library_get_version(&major, &minor, git_tag); - printf("Library version: %u.%u (git tag: %s)\n", major, minor, git_tag); - - /* check for struct iio_data_format.repeat support */ - has_repeat = major >= 0 && minor >= 8 ? true : false; - - printf("* Acquiring IIO context\n"); - assert((ctx = iio_create_default_context()) && "No context"); - assert(iio_context_get_devices_count(ctx) > 0 && "No devices"); - - printf("* Acquiring device %s\n", name); - dev = iio_context_find_device(ctx, name); - if (!dev) { - perror("No device found"); - shutdown(); - } - - printf("* Initializing IIO streaming channels:\n"); - for (int i = 0; i < iio_device_get_channels_count(dev); ++i) { - struct iio_channel *chn = iio_device_get_channel(dev, i); - if (iio_channel_is_scan_element(chn)) { - printf("%s\n", iio_channel_get_id(chn)); - channel_count++; - } - } - if (channel_count == 0) { - printf("No scan elements found (make sure the driver built with 'CONFIG_IIO_SIMPLE_DUMMY_BUFFER=y')\n"); - shutdown(); - } - channels = calloc(channel_count, sizeof *channels); - if (!channels) { - perror("Channel array allocation failed"); - shutdown(); - } - for (int i = 0; i < channel_count; ++i) { - struct iio_channel *chn = iio_device_get_channel(dev, i); - if (iio_channel_is_scan_element(chn)) - channels[i] = chn; - } - - printf("* Acquiring trigger %s\n", trigger_str); - trigger = iio_context_find_device(ctx, trigger_str); - if (!trigger || !iio_device_is_trigger(trigger)) { - perror("No trigger found (try setting up the iio-trig-hrtimer module)"); - shutdown(); - } - - printf("* Enabling IIO streaming channels for buffered capture\n"); - for (int i = 0; i < channel_count; ++i) - iio_channel_enable(channels[i]); - - printf("* Enabling IIO buffer trigger\n"); - if (iio_device_set_trigger(dev, trigger)) { - perror("Could not set trigger\n"); - shutdown(); - } - - printf("* Creating non-cyclic IIO buffers with %d samples\n", buffer_length); - rxbuf = iio_device_create_buffer(dev, buffer_length, false); - if (!rxbuf) { - perror("Could not create buffer"); - shutdown(); - } - - printf("* Starting IO streaming (press CTRL+C to cancel)\n"); - bool has_ts = strcmp(iio_channel_get_id(channels[channel_count-1]), "timestamp") == 0; - int64_t last_ts = 0; - while (!stop) - { - ssize_t nbytes_rx; - void *p_dat, *p_end; - ptrdiff_t p_inc; - int64_t now_ts; - - // Refill RX buffer - nbytes_rx = iio_buffer_refill(rxbuf); - if (nbytes_rx < 0) { - printf("Error refilling buf: %d\n", (int)nbytes_rx); - shutdown(); - } - - p_inc = iio_buffer_step(rxbuf); - p_end = iio_buffer_end(rxbuf); - - // Print timestamp delta in ms - if (has_ts) - for (p_dat = iio_buffer_first(rxbuf, channels[channel_count-1]); p_dat < p_end; p_dat += p_inc) { - now_ts = (((int64_t *)p_dat)[0]); - printf("[%04ld] ", last_ts > 0 ? (now_ts - last_ts)/1000/1000 : 0); - last_ts = now_ts; - } - - // Print each captured sample - switch (buffer_read_method) - { - case BUFFER_POINTER: - for (int i = 0; i < channel_count; ++i) { - const struct iio_data_format *fmt = iio_channel_get_data_format(channels[i]); - unsigned int repeat = has_repeat ? fmt->repeat : 1; - - printf("%s ", iio_channel_get_id(channels[i])); - for (p_dat = iio_buffer_first(rxbuf, channels[i]); p_dat < p_end; p_dat += p_inc) { - for (int j = 0; j < repeat; ++j) { - if (fmt->length/8 == sizeof(int16_t)) - printf("%i ", ((int16_t *)p_dat)[j]); - else if (fmt->length/8 == sizeof(int64_t)) - printf("%ld ", ((int64_t *)p_dat)[j]); - } - } - } - printf("\n"); - break; - - case SAMPLE_CALLBACK: - iio_buffer_foreach_sample(rxbuf, sample_cb, NULL); - printf("\n"); - break; - - case CHANNEL_READ_RAW: - case CHANNEL_READ: - for (int i = 0; i < channel_count; ++i) { - uint8_t *buf; - size_t bytes; - const struct iio_data_format *fmt = iio_channel_get_data_format(channels[i]); - unsigned int repeat = has_repeat ? fmt->repeat : 1; - size_t sample_size = fmt->length / 8 * repeat; - - buf = malloc(sample_size * buffer_length); - - if (buffer_read_method == CHANNEL_READ_RAW) - bytes = iio_channel_read_raw(channels[i], rxbuf, buf, sample_size * buffer_length); - else - bytes = iio_channel_read(channels[i], rxbuf, buf, sample_size * buffer_length); - - printf("%s ", iio_channel_get_id(channels[i])); - for (int sample = 0; sample < bytes / sample_size; ++sample) { - for (int j = 0; j < repeat; ++j) { - if (fmt->length / 8 == sizeof(int16_t)) - printf("%i ", ((int16_t *)buf)[sample+j]); - else if (fmt->length / 8 == sizeof(int64_t)) - printf("%li ", ((int64_t *)buf)[sample+j]); - } - } - - free(buf); - } - printf("\n"); - break; - } - - if (count != -1 && --count == 0) - break; - } - - shutdown(); - - return 0; -} - |