Paul Cercueil / libiio

Dependencies:   libserialport libxml2

Committer:
pcercuei
Date:
Thu Aug 25 15:54:09 2016 +0000
Revision:
0:df031b60ca29
Child:
2:9eb0a9a1f958
Add first version of libiio, from upsteam commit 775b9f6 unmodified.

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-errno.h"
pcercuei 0:df031b60ca29 20 #include "iio-private.h"
pcercuei 0:df031b60ca29 21
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 0:df031b60ca29 108 goto err_free_info_list;
pcercuei 0:df031b60ca29 109
pcercuei 0:df031b60ca29 110 for (i = old_size; i < new_size; i++) {
pcercuei 0:df031b60ca29 111 /* Make sure iio_context_info_list_free won't overflow */
pcercuei 0:df031b60ca29 112 info[i + 1] = NULL;
pcercuei 0:df031b60ca29 113
pcercuei 0:df031b60ca29 114 info[i] = zalloc(sizeof(**info));
pcercuei 0:df031b60ca29 115 if (!info[i])
pcercuei 0:df031b60ca29 116 goto err_free_info_list;
pcercuei 0:df031b60ca29 117 }
pcercuei 0:df031b60ca29 118
pcercuei 0:df031b60ca29 119 scan_result->info = info;
pcercuei 0:df031b60ca29 120 scan_result->size = new_size;
pcercuei 0:df031b60ca29 121
pcercuei 0:df031b60ca29 122 return &info[old_size];
pcercuei 0:df031b60ca29 123
pcercuei 0:df031b60ca29 124 err_free_info_list:
pcercuei 0:df031b60ca29 125 scan_result->size = 0;
pcercuei 0:df031b60ca29 126 iio_context_info_list_free(scan_result->info);
pcercuei 0:df031b60ca29 127 return NULL;
pcercuei 0:df031b60ca29 128 }
pcercuei 0:df031b60ca29 129
pcercuei 0:df031b60ca29 130 struct iio_scan_context * iio_create_scan_context(
pcercuei 0:df031b60ca29 131 const char *backend, unsigned int flags)
pcercuei 0:df031b60ca29 132 {
pcercuei 0:df031b60ca29 133 struct iio_scan_context *ctx;
pcercuei 0:df031b60ca29 134
pcercuei 0:df031b60ca29 135 /* "flags" must be zero for now */
pcercuei 0:df031b60ca29 136 if (flags != 0) {
pcercuei 0:df031b60ca29 137 errno = EINVAL;
pcercuei 0:df031b60ca29 138 return NULL;
pcercuei 0:df031b60ca29 139 }
pcercuei 0:df031b60ca29 140
pcercuei 0:df031b60ca29 141 ctx = calloc(1, sizeof(*ctx));
pcercuei 0:df031b60ca29 142 if (!ctx) {
pcercuei 0:df031b60ca29 143 errno = ENOMEM;
pcercuei 0:df031b60ca29 144 return NULL;
pcercuei 0:df031b60ca29 145 }
pcercuei 0:df031b60ca29 146
pcercuei 0:df031b60ca29 147 if (!backend || !strcmp(backend, "local"))
pcercuei 0:df031b60ca29 148 ctx->scan_local = true;
pcercuei 0:df031b60ca29 149
pcercuei 0:df031b60ca29 150 #ifdef WITH_USB_BACKEND
pcercuei 0:df031b60ca29 151 if (!backend || !strcmp(backend, "usb"))
pcercuei 0:df031b60ca29 152 ctx->usb_ctx = usb_context_scan_init();
pcercuei 0:df031b60ca29 153 #endif
pcercuei 0:df031b60ca29 154
pcercuei 0:df031b60ca29 155 return ctx;
pcercuei 0:df031b60ca29 156 }
pcercuei 0:df031b60ca29 157
pcercuei 0:df031b60ca29 158 void iio_scan_context_destroy(struct iio_scan_context *ctx)
pcercuei 0:df031b60ca29 159 {
pcercuei 0:df031b60ca29 160 #ifdef WITH_USB_BACKEND
pcercuei 0:df031b60ca29 161 if (ctx->usb_ctx)
pcercuei 0:df031b60ca29 162 usb_context_scan_free(ctx->usb_ctx);
pcercuei 0:df031b60ca29 163 #endif
pcercuei 0:df031b60ca29 164 free(ctx);
pcercuei 0:df031b60ca29 165 }
pcercuei 0:df031b60ca29 166