Library for interfacing with IIO devices. Licensed under the LGPLv2+
Dependencies: libserialport libxml2
scan.c@3:d147beabba0e, 2017-01-30 (annotated)
- Committer:
- pcercuei
- Date:
- Mon Jan 30 13:00:39 2017 +0000
- Revision:
- 3:d147beabba0e
- Parent:
- 2:9eb0a9a1f958
Update to libiio v0.9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pcercuei | 0:df031b60ca29 | 1 | /* |
pcercuei | 0:df031b60ca29 | 2 | * libiio - Library for interfacing industrial I/O (IIO) devices |
pcercuei | 0:df031b60ca29 | 3 | * |
pcercuei | 0:df031b60ca29 | 4 | * Copyright (C) 2016 Analog Devices, Inc. |
pcercuei | 0:df031b60ca29 | 5 | * Author: Paul Cercueil <paul.cercueil@analog.com> |
pcercuei | 0:df031b60ca29 | 6 | * |
pcercuei | 0:df031b60ca29 | 7 | * This library is free software; you can redistribute it and/or |
pcercuei | 0:df031b60ca29 | 8 | * modify it under the terms of the GNU Lesser General Public |
pcercuei | 0:df031b60ca29 | 9 | * License as published by the Free Software Foundation; either |
pcercuei | 0:df031b60ca29 | 10 | * version 2.1 of the License, or (at your option) any later version. |
pcercuei | 0:df031b60ca29 | 11 | * |
pcercuei | 0:df031b60ca29 | 12 | * This library is distributed in the hope that it will be useful, |
pcercuei | 0:df031b60ca29 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
pcercuei | 0:df031b60ca29 | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
pcercuei | 0:df031b60ca29 | 15 | * Lesser General Public License for more details. |
pcercuei | 0:df031b60ca29 | 16 | */ |
pcercuei | 0:df031b60ca29 | 17 | |
pcercuei | 0:df031b60ca29 | 18 | #include "iio-config.h" |
pcercuei | 0:df031b60ca29 | 19 | #include "iio-private.h" |
pcercuei | 0:df031b60ca29 | 20 | |
pcercuei | 2:9eb0a9a1f958 | 21 | #include <errno.h> |
pcercuei | 0:df031b60ca29 | 22 | #include <stdbool.h> |
pcercuei | 0:df031b60ca29 | 23 | #include <string.h> |
pcercuei | 0:df031b60ca29 | 24 | |
pcercuei | 0:df031b60ca29 | 25 | struct iio_scan_context { |
pcercuei | 0:df031b60ca29 | 26 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 27 | struct iio_scan_backend_context *usb_ctx; |
pcercuei | 0:df031b60ca29 | 28 | #endif |
pcercuei | 0:df031b60ca29 | 29 | bool scan_local; |
pcercuei | 0:df031b60ca29 | 30 | }; |
pcercuei | 0:df031b60ca29 | 31 | |
pcercuei | 0:df031b60ca29 | 32 | const char * iio_context_info_get_description( |
pcercuei | 0:df031b60ca29 | 33 | const struct iio_context_info *info) |
pcercuei | 0:df031b60ca29 | 34 | { |
pcercuei | 0:df031b60ca29 | 35 | return info->description; |
pcercuei | 0:df031b60ca29 | 36 | } |
pcercuei | 0:df031b60ca29 | 37 | |
pcercuei | 0:df031b60ca29 | 38 | const char * iio_context_info_get_uri( |
pcercuei | 0:df031b60ca29 | 39 | const struct iio_context_info *info) |
pcercuei | 0:df031b60ca29 | 40 | { |
pcercuei | 0:df031b60ca29 | 41 | return info->uri; |
pcercuei | 0:df031b60ca29 | 42 | } |
pcercuei | 0:df031b60ca29 | 43 | |
pcercuei | 0:df031b60ca29 | 44 | ssize_t iio_scan_context_get_info_list(struct iio_scan_context *ctx, |
pcercuei | 0:df031b60ca29 | 45 | struct iio_context_info ***info) |
pcercuei | 0:df031b60ca29 | 46 | { |
pcercuei | 0:df031b60ca29 | 47 | struct iio_scan_result scan_result = { 0, NULL }; |
pcercuei | 0:df031b60ca29 | 48 | |
pcercuei | 0:df031b60ca29 | 49 | #ifdef WITH_LOCAL_BACKEND |
pcercuei | 0:df031b60ca29 | 50 | if (ctx->scan_local) { |
pcercuei | 0:df031b60ca29 | 51 | int ret = local_context_scan(&scan_result); |
pcercuei | 0:df031b60ca29 | 52 | if (ret < 0) { |
pcercuei | 0:df031b60ca29 | 53 | if (scan_result.info) |
pcercuei | 0:df031b60ca29 | 54 | iio_context_info_list_free(scan_result.info); |
pcercuei | 0:df031b60ca29 | 55 | return ret; |
pcercuei | 0:df031b60ca29 | 56 | } |
pcercuei | 0:df031b60ca29 | 57 | } |
pcercuei | 0:df031b60ca29 | 58 | #endif |
pcercuei | 0:df031b60ca29 | 59 | |
pcercuei | 0:df031b60ca29 | 60 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 61 | if (ctx->usb_ctx) { |
pcercuei | 0:df031b60ca29 | 62 | int ret = usb_context_scan(ctx->usb_ctx, &scan_result); |
pcercuei | 0:df031b60ca29 | 63 | if (ret < 0) { |
pcercuei | 0:df031b60ca29 | 64 | if (scan_result.info) |
pcercuei | 0:df031b60ca29 | 65 | iio_context_info_list_free(scan_result.info); |
pcercuei | 0:df031b60ca29 | 66 | return ret; |
pcercuei | 0:df031b60ca29 | 67 | } |
pcercuei | 0:df031b60ca29 | 68 | } |
pcercuei | 0:df031b60ca29 | 69 | #endif |
pcercuei | 0:df031b60ca29 | 70 | |
pcercuei | 0:df031b60ca29 | 71 | *info = scan_result.info; |
pcercuei | 0:df031b60ca29 | 72 | |
pcercuei | 0:df031b60ca29 | 73 | return (ssize_t) scan_result.size; |
pcercuei | 0:df031b60ca29 | 74 | } |
pcercuei | 0:df031b60ca29 | 75 | |
pcercuei | 0:df031b60ca29 | 76 | void iio_context_info_list_free(struct iio_context_info **list) |
pcercuei | 0:df031b60ca29 | 77 | { |
pcercuei | 0:df031b60ca29 | 78 | struct iio_context_info **it; |
pcercuei | 0:df031b60ca29 | 79 | |
pcercuei | 0:df031b60ca29 | 80 | if (!list) |
pcercuei | 0:df031b60ca29 | 81 | return; |
pcercuei | 0:df031b60ca29 | 82 | |
pcercuei | 0:df031b60ca29 | 83 | for (it = list; *it; it++) { |
pcercuei | 0:df031b60ca29 | 84 | struct iio_context_info *info = *it; |
pcercuei | 0:df031b60ca29 | 85 | |
pcercuei | 0:df031b60ca29 | 86 | if (info->description) |
pcercuei | 0:df031b60ca29 | 87 | free(info->description); |
pcercuei | 0:df031b60ca29 | 88 | if (info->uri) |
pcercuei | 0:df031b60ca29 | 89 | free(info->uri); |
pcercuei | 0:df031b60ca29 | 90 | free(info); |
pcercuei | 0:df031b60ca29 | 91 | } |
pcercuei | 0:df031b60ca29 | 92 | |
pcercuei | 0:df031b60ca29 | 93 | free(list); |
pcercuei | 0:df031b60ca29 | 94 | } |
pcercuei | 0:df031b60ca29 | 95 | |
pcercuei | 0:df031b60ca29 | 96 | struct iio_context_info ** iio_scan_result_add( |
pcercuei | 0:df031b60ca29 | 97 | struct iio_scan_result *scan_result, size_t num) |
pcercuei | 0:df031b60ca29 | 98 | { |
pcercuei | 0:df031b60ca29 | 99 | struct iio_context_info **info; |
pcercuei | 0:df031b60ca29 | 100 | size_t old_size, new_size; |
pcercuei | 0:df031b60ca29 | 101 | size_t i; |
pcercuei | 0:df031b60ca29 | 102 | |
pcercuei | 0:df031b60ca29 | 103 | old_size = scan_result->size; |
pcercuei | 0:df031b60ca29 | 104 | new_size = old_size + num; |
pcercuei | 0:df031b60ca29 | 105 | |
pcercuei | 0:df031b60ca29 | 106 | info = realloc(scan_result->info, (new_size + 1) * sizeof(*info)); |
pcercuei | 0:df031b60ca29 | 107 | if (!info) |
pcercuei | 3:d147beabba0e | 108 | return NULL; |
pcercuei | 3:d147beabba0e | 109 | |
pcercuei | 3:d147beabba0e | 110 | scan_result->info = info; |
pcercuei | 3:d147beabba0e | 111 | scan_result->size = new_size; |
pcercuei | 0:df031b60ca29 | 112 | |
pcercuei | 0:df031b60ca29 | 113 | for (i = old_size; i < new_size; i++) { |
pcercuei | 0:df031b60ca29 | 114 | /* Make sure iio_context_info_list_free won't overflow */ |
pcercuei | 0:df031b60ca29 | 115 | info[i + 1] = NULL; |
pcercuei | 0:df031b60ca29 | 116 | |
pcercuei | 0:df031b60ca29 | 117 | info[i] = zalloc(sizeof(**info)); |
pcercuei | 0:df031b60ca29 | 118 | if (!info[i]) |
pcercuei | 3:d147beabba0e | 119 | return NULL; |
pcercuei | 0:df031b60ca29 | 120 | } |
pcercuei | 0:df031b60ca29 | 121 | |
pcercuei | 0:df031b60ca29 | 122 | return &info[old_size]; |
pcercuei | 0:df031b60ca29 | 123 | } |
pcercuei | 0:df031b60ca29 | 124 | |
pcercuei | 0:df031b60ca29 | 125 | struct iio_scan_context * iio_create_scan_context( |
pcercuei | 0:df031b60ca29 | 126 | const char *backend, unsigned int flags) |
pcercuei | 0:df031b60ca29 | 127 | { |
pcercuei | 0:df031b60ca29 | 128 | struct iio_scan_context *ctx; |
pcercuei | 0:df031b60ca29 | 129 | |
pcercuei | 0:df031b60ca29 | 130 | /* "flags" must be zero for now */ |
pcercuei | 0:df031b60ca29 | 131 | if (flags != 0) { |
pcercuei | 0:df031b60ca29 | 132 | errno = EINVAL; |
pcercuei | 0:df031b60ca29 | 133 | return NULL; |
pcercuei | 0:df031b60ca29 | 134 | } |
pcercuei | 0:df031b60ca29 | 135 | |
pcercuei | 0:df031b60ca29 | 136 | ctx = calloc(1, sizeof(*ctx)); |
pcercuei | 0:df031b60ca29 | 137 | if (!ctx) { |
pcercuei | 0:df031b60ca29 | 138 | errno = ENOMEM; |
pcercuei | 0:df031b60ca29 | 139 | return NULL; |
pcercuei | 0:df031b60ca29 | 140 | } |
pcercuei | 0:df031b60ca29 | 141 | |
pcercuei | 0:df031b60ca29 | 142 | if (!backend || !strcmp(backend, "local")) |
pcercuei | 0:df031b60ca29 | 143 | ctx->scan_local = true; |
pcercuei | 0:df031b60ca29 | 144 | |
pcercuei | 0:df031b60ca29 | 145 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 146 | if (!backend || !strcmp(backend, "usb")) |
pcercuei | 0:df031b60ca29 | 147 | ctx->usb_ctx = usb_context_scan_init(); |
pcercuei | 0:df031b60ca29 | 148 | #endif |
pcercuei | 0:df031b60ca29 | 149 | |
pcercuei | 0:df031b60ca29 | 150 | return ctx; |
pcercuei | 0:df031b60ca29 | 151 | } |
pcercuei | 0:df031b60ca29 | 152 | |
pcercuei | 0:df031b60ca29 | 153 | void iio_scan_context_destroy(struct iio_scan_context *ctx) |
pcercuei | 0:df031b60ca29 | 154 | { |
pcercuei | 0:df031b60ca29 | 155 | #ifdef WITH_USB_BACKEND |
pcercuei | 0:df031b60ca29 | 156 | if (ctx->usb_ctx) |
pcercuei | 0:df031b60ca29 | 157 | usb_context_scan_free(ctx->usb_ctx); |
pcercuei | 0:df031b60ca29 | 158 | #endif |
pcercuei | 0:df031b60ca29 | 159 | free(ctx); |
pcercuei | 0:df031b60ca29 | 160 | } |
pcercuei | 3:d147beabba0e | 161 | |
pcercuei | 3:d147beabba0e | 162 | #ifdef WITH_MATLAB_BINDINGS_API |
pcercuei | 3:d147beabba0e | 163 | |
pcercuei | 3:d147beabba0e | 164 | struct iio_scan_block { |
pcercuei | 3:d147beabba0e | 165 | struct iio_scan_context *ctx; |
pcercuei | 3:d147beabba0e | 166 | struct iio_context_info **info; |
pcercuei | 3:d147beabba0e | 167 | ssize_t ctx_cnt; |
pcercuei | 3:d147beabba0e | 168 | }; |
pcercuei | 3:d147beabba0e | 169 | |
pcercuei | 3:d147beabba0e | 170 | ssize_t iio_scan_block_scan(struct iio_scan_block *blk) |
pcercuei | 3:d147beabba0e | 171 | { |
pcercuei | 3:d147beabba0e | 172 | iio_context_info_list_free(blk->info); |
pcercuei | 3:d147beabba0e | 173 | blk->info = NULL; |
pcercuei | 3:d147beabba0e | 174 | blk->ctx_cnt = iio_scan_context_get_info_list(blk->ctx, &blk->info); |
pcercuei | 3:d147beabba0e | 175 | return blk->ctx_cnt; |
pcercuei | 3:d147beabba0e | 176 | } |
pcercuei | 3:d147beabba0e | 177 | |
pcercuei | 3:d147beabba0e | 178 | struct iio_context_info *iio_scan_block_get_info( |
pcercuei | 3:d147beabba0e | 179 | struct iio_scan_block *blk, unsigned int index) |
pcercuei | 3:d147beabba0e | 180 | { |
pcercuei | 3:d147beabba0e | 181 | if (!blk->info || (ssize_t)index >= blk->ctx_cnt) { |
pcercuei | 3:d147beabba0e | 182 | errno = EINVAL; |
pcercuei | 3:d147beabba0e | 183 | return NULL; |
pcercuei | 3:d147beabba0e | 184 | } |
pcercuei | 3:d147beabba0e | 185 | return blk->info[index]; |
pcercuei | 3:d147beabba0e | 186 | } |
pcercuei | 3:d147beabba0e | 187 | |
pcercuei | 3:d147beabba0e | 188 | struct iio_scan_block *iio_create_scan_block( |
pcercuei | 3:d147beabba0e | 189 | const char *backend, unsigned int flags) |
pcercuei | 3:d147beabba0e | 190 | { |
pcercuei | 3:d147beabba0e | 191 | struct iio_scan_block *blk; |
pcercuei | 3:d147beabba0e | 192 | |
pcercuei | 3:d147beabba0e | 193 | blk = calloc(1, sizeof(*blk)); |
pcercuei | 3:d147beabba0e | 194 | if (!blk) { |
pcercuei | 3:d147beabba0e | 195 | errno = ENOMEM; |
pcercuei | 3:d147beabba0e | 196 | return NULL; |
pcercuei | 3:d147beabba0e | 197 | } |
pcercuei | 3:d147beabba0e | 198 | |
pcercuei | 3:d147beabba0e | 199 | blk->ctx = iio_create_scan_context(backend, flags); |
pcercuei | 3:d147beabba0e | 200 | if (!blk->ctx) { |
pcercuei | 3:d147beabba0e | 201 | free(blk); |
pcercuei | 3:d147beabba0e | 202 | return NULL; |
pcercuei | 3:d147beabba0e | 203 | } |
pcercuei | 3:d147beabba0e | 204 | |
pcercuei | 3:d147beabba0e | 205 | return blk; |
pcercuei | 3:d147beabba0e | 206 | } |
pcercuei | 3:d147beabba0e | 207 | |
pcercuei | 3:d147beabba0e | 208 | void iio_scan_block_destroy(struct iio_scan_block *blk) |
pcercuei | 3:d147beabba0e | 209 | { |
pcercuei | 3:d147beabba0e | 210 | iio_context_info_list_free(blk->info); |
pcercuei | 3:d147beabba0e | 211 | iio_scan_context_destroy(blk->ctx); |
pcercuei | 3:d147beabba0e | 212 | free(blk); |
pcercuei | 3:d147beabba0e | 213 | } |
pcercuei | 3:d147beabba0e | 214 | #endif |
pcercuei | 0:df031b60ca29 | 215 |