Library for interfacing with IIO devices. Licensed under the LGPLv2+

Dependencies:   libserialport libxml2

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?

UserRevisionLine numberNew 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