Analog Devices / Mbed OS tinyiiod-example
Committer:
adisuciu
Date:
Fri Dec 13 22:21:29 2019 +0000
Revision:
0:bf917bb43db6
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adisuciu 0:bf917bb43db6 1 /*
adisuciu 0:bf917bb43db6 2 * libtinyiiod - Tiny IIO Daemon Library
adisuciu 0:bf917bb43db6 3 *
adisuciu 0:bf917bb43db6 4 * Copyright (C) 2016 Analog Devices, Inc.
adisuciu 0:bf917bb43db6 5 * Author: Paul Cercueil <paul.cercueil@analog.com>
adisuciu 0:bf917bb43db6 6 *
adisuciu 0:bf917bb43db6 7 * This library is free software; you can redistribute it and/or
adisuciu 0:bf917bb43db6 8 * modify it under the terms of the GNU Lesser General Public
adisuciu 0:bf917bb43db6 9 * License as published by the Free Software Foundation; either
adisuciu 0:bf917bb43db6 10 * version 2.1 of the License, or (at your option) any later version.
adisuciu 0:bf917bb43db6 11 *
adisuciu 0:bf917bb43db6 12 * This library is distributed in the hope that it will be useful,
adisuciu 0:bf917bb43db6 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
adisuciu 0:bf917bb43db6 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
adisuciu 0:bf917bb43db6 15 * Lesser General Public License for more details.
adisuciu 0:bf917bb43db6 16 */
adisuciu 0:bf917bb43db6 17
adisuciu 0:bf917bb43db6 18 #include "tinyiiod-private.h"
adisuciu 0:bf917bb43db6 19
adisuciu 0:bf917bb43db6 20 #include "compat.h"
adisuciu 0:bf917bb43db6 21
adisuciu 0:bf917bb43db6 22 static int32_t parse_rw_string(struct tinyiiod *iiod, char *str, bool write)
adisuciu 0:bf917bb43db6 23 {
adisuciu 0:bf917bb43db6 24 char *device, *channel, *attr, *ptr;
adisuciu 0:bf917bb43db6 25 bool is_channel = false, output = false, debug = false;
adisuciu 0:bf917bb43db6 26 long bytes;
adisuciu 0:bf917bb43db6 27
adisuciu 0:bf917bb43db6 28 ptr = strchr(str, ' ');
adisuciu 0:bf917bb43db6 29 if (!ptr)
adisuciu 0:bf917bb43db6 30 return -EINVAL;
adisuciu 0:bf917bb43db6 31
adisuciu 0:bf917bb43db6 32 *ptr = '\0';
adisuciu 0:bf917bb43db6 33 device = str;
adisuciu 0:bf917bb43db6 34 str = ptr + 1;
adisuciu 0:bf917bb43db6 35
adisuciu 0:bf917bb43db6 36 if (!strncmp(str, "INPUT ", sizeof("INPUT ") - 1)) {
adisuciu 0:bf917bb43db6 37 is_channel = true;
adisuciu 0:bf917bb43db6 38 str += sizeof("INPUT ") - 1;
adisuciu 0:bf917bb43db6 39 } else if (!strncmp(str, "OUTPUT ", sizeof("OUTPUT ") - 1)) {
adisuciu 0:bf917bb43db6 40 is_channel = true;
adisuciu 0:bf917bb43db6 41 output = true;
adisuciu 0:bf917bb43db6 42 str += sizeof("OUTPUT ") - 1;
adisuciu 0:bf917bb43db6 43 } else if (!strncmp(str, "DEBUG ", sizeof("DEBUG ") - 1)) {
adisuciu 0:bf917bb43db6 44 debug = true;
adisuciu 0:bf917bb43db6 45 str += sizeof("DEBUG ") - 1;
adisuciu 0:bf917bb43db6 46 }
adisuciu 0:bf917bb43db6 47
adisuciu 0:bf917bb43db6 48 if (is_channel) {
adisuciu 0:bf917bb43db6 49 ptr = strchr(str, ' ');
adisuciu 0:bf917bb43db6 50 if (!ptr)
adisuciu 0:bf917bb43db6 51 return -EINVAL;
adisuciu 0:bf917bb43db6 52
adisuciu 0:bf917bb43db6 53 *ptr = '\0';
adisuciu 0:bf917bb43db6 54 channel = str;
adisuciu 0:bf917bb43db6 55 str = ptr + 1;
adisuciu 0:bf917bb43db6 56 } else {
adisuciu 0:bf917bb43db6 57 channel = NULL;
adisuciu 0:bf917bb43db6 58 }
adisuciu 0:bf917bb43db6 59
adisuciu 0:bf917bb43db6 60 ptr = strchr(str, ' ');
adisuciu 0:bf917bb43db6 61 if ((!!ptr) ^ write)
adisuciu 0:bf917bb43db6 62 return -EINVAL;
adisuciu 0:bf917bb43db6 63
adisuciu 0:bf917bb43db6 64 attr = str;
adisuciu 0:bf917bb43db6 65
adisuciu 0:bf917bb43db6 66 if (write) {
adisuciu 0:bf917bb43db6 67 *ptr = '\0';
adisuciu 0:bf917bb43db6 68 str = ptr + 1;
adisuciu 0:bf917bb43db6 69 } else {
adisuciu 0:bf917bb43db6 70 tinyiiod_do_read_attr(iiod, device, channel,
adisuciu 0:bf917bb43db6 71 output, attr, debug);
adisuciu 0:bf917bb43db6 72 return 0;
adisuciu 0:bf917bb43db6 73 }
adisuciu 0:bf917bb43db6 74
adisuciu 0:bf917bb43db6 75 bytes = strtol(str, &ptr, 10);
adisuciu 0:bf917bb43db6 76 if (str == ptr || bytes < 0)
adisuciu 0:bf917bb43db6 77 return -EINVAL;
adisuciu 0:bf917bb43db6 78
adisuciu 0:bf917bb43db6 79 tinyiiod_do_write_attr(iiod, device, channel,
adisuciu 0:bf917bb43db6 80 output, attr, (size_t) bytes, debug);
adisuciu 0:bf917bb43db6 81
adisuciu 0:bf917bb43db6 82 return 0;
adisuciu 0:bf917bb43db6 83 }
adisuciu 0:bf917bb43db6 84
adisuciu 0:bf917bb43db6 85 static int32_t parse_open_string(struct tinyiiod *iiod, char *str)
adisuciu 0:bf917bb43db6 86 {
adisuciu 0:bf917bb43db6 87 char *device, *ptr;
adisuciu 0:bf917bb43db6 88 long samples_count;
adisuciu 0:bf917bb43db6 89 uint32_t mask = 0;
adisuciu 0:bf917bb43db6 90
adisuciu 0:bf917bb43db6 91 ptr = strchr(str, ' ');
adisuciu 0:bf917bb43db6 92 if (!ptr)
adisuciu 0:bf917bb43db6 93 return -EINVAL;
adisuciu 0:bf917bb43db6 94
adisuciu 0:bf917bb43db6 95 *ptr = '\0';
adisuciu 0:bf917bb43db6 96 device = str;
adisuciu 0:bf917bb43db6 97 str = ptr + 1;
adisuciu 0:bf917bb43db6 98
adisuciu 0:bf917bb43db6 99 samples_count = strtol(str, &ptr, 10);
adisuciu 0:bf917bb43db6 100 if (str == ptr || *ptr != ' ' || samples_count < 0)
adisuciu 0:bf917bb43db6 101 return -EINVAL;
adisuciu 0:bf917bb43db6 102
adisuciu 0:bf917bb43db6 103 str = ptr + 1;
adisuciu 0:bf917bb43db6 104
adisuciu 0:bf917bb43db6 105 mask = strtoul(str, NULL, 16);
adisuciu 0:bf917bb43db6 106
adisuciu 0:bf917bb43db6 107 tinyiiod_do_open(iiod, device, (size_t) samples_count, mask);
adisuciu 0:bf917bb43db6 108
adisuciu 0:bf917bb43db6 109 return 0;
adisuciu 0:bf917bb43db6 110 }
adisuciu 0:bf917bb43db6 111
adisuciu 0:bf917bb43db6 112 static int32_t parse_timeout_string(struct tinyiiod *iiod, char *str)
adisuciu 0:bf917bb43db6 113 {
adisuciu 0:bf917bb43db6 114 uint32_t timeout = strtoul(str, NULL, 10);
adisuciu 0:bf917bb43db6 115
adisuciu 0:bf917bb43db6 116 return tinyiiod_set_timeout(iiod, timeout);
adisuciu 0:bf917bb43db6 117 }
adisuciu 0:bf917bb43db6 118
adisuciu 0:bf917bb43db6 119 static int32_t parse_writebuf_string(struct tinyiiod *iiod, char *str)
adisuciu 0:bf917bb43db6 120 {
adisuciu 0:bf917bb43db6 121 char *device, *ptr;
adisuciu 0:bf917bb43db6 122 long bytes_count;
adisuciu 0:bf917bb43db6 123
adisuciu 0:bf917bb43db6 124 ptr = strchr(str, ' ');
adisuciu 0:bf917bb43db6 125 if (!ptr)
adisuciu 0:bf917bb43db6 126 return -EINVAL;
adisuciu 0:bf917bb43db6 127
adisuciu 0:bf917bb43db6 128 *ptr = '\0';
adisuciu 0:bf917bb43db6 129 device = str;
adisuciu 0:bf917bb43db6 130 str = ptr + 1;
adisuciu 0:bf917bb43db6 131
adisuciu 0:bf917bb43db6 132 bytes_count = strtol(str, &ptr, 10);
adisuciu 0:bf917bb43db6 133 if (str == ptr || *ptr != '\0' || bytes_count < 0)
adisuciu 0:bf917bb43db6 134 return -EINVAL;
adisuciu 0:bf917bb43db6 135
adisuciu 0:bf917bb43db6 136 return tinyiiod_do_writebuf(iiod, device, (size_t) bytes_count);
adisuciu 0:bf917bb43db6 137 }
adisuciu 0:bf917bb43db6 138
adisuciu 0:bf917bb43db6 139 static int32_t parse_readbuf_string(struct tinyiiod *iiod, char *str)
adisuciu 0:bf917bb43db6 140 {
adisuciu 0:bf917bb43db6 141 char *device, *ptr;
adisuciu 0:bf917bb43db6 142 long bytes_count;
adisuciu 0:bf917bb43db6 143
adisuciu 0:bf917bb43db6 144 ptr = strchr(str, ' ');
adisuciu 0:bf917bb43db6 145 if (!ptr)
adisuciu 0:bf917bb43db6 146 return -EINVAL;
adisuciu 0:bf917bb43db6 147
adisuciu 0:bf917bb43db6 148 *ptr = '\0';
adisuciu 0:bf917bb43db6 149 device = str;
adisuciu 0:bf917bb43db6 150 str = ptr + 1;
adisuciu 0:bf917bb43db6 151
adisuciu 0:bf917bb43db6 152 bytes_count = strtol(str, &ptr, 10);
adisuciu 0:bf917bb43db6 153 if (str == ptr || *ptr != '\0' || bytes_count < 0)
adisuciu 0:bf917bb43db6 154 return -EINVAL;
adisuciu 0:bf917bb43db6 155
adisuciu 0:bf917bb43db6 156 return tinyiiod_do_readbuf(iiod, device, (size_t) bytes_count);
adisuciu 0:bf917bb43db6 157 }
adisuciu 0:bf917bb43db6 158
adisuciu 0:bf917bb43db6 159 int32_t tinyiiod_parse_string(struct tinyiiod *iiod, char *str)
adisuciu 0:bf917bb43db6 160 {
adisuciu 0:bf917bb43db6 161 while (*str == '\n' || *str == '\r')
adisuciu 0:bf917bb43db6 162 str++;
adisuciu 0:bf917bb43db6 163
adisuciu 0:bf917bb43db6 164 if (str[0] == '\0')
adisuciu 0:bf917bb43db6 165 return 0;
adisuciu 0:bf917bb43db6 166
adisuciu 0:bf917bb43db6 167 if (!strncmp(str, "VERSION", sizeof("VERSION"))) {
adisuciu 0:bf917bb43db6 168 char buf[32];
adisuciu 0:bf917bb43db6 169
adisuciu 0:bf917bb43db6 170 snprintf(buf, sizeof(buf), "%"PRIu16".%"PRIu16".%-7.7s\n",
adisuciu 0:bf917bb43db6 171 TINYIIOD_VERSION_MAJOR,
adisuciu 0:bf917bb43db6 172 TINYIIOD_VERSION_MINOR,
adisuciu 0:bf917bb43db6 173 TINYIIOD_VERSION_GIT);
adisuciu 0:bf917bb43db6 174 tinyiiod_write_string(iiod, buf);
adisuciu 0:bf917bb43db6 175 return 0;
adisuciu 0:bf917bb43db6 176 }
adisuciu 0:bf917bb43db6 177
adisuciu 0:bf917bb43db6 178 if (!strncmp(str, "PRINT", sizeof("PRINT"))) {
adisuciu 0:bf917bb43db6 179 tinyiiod_write_xml(iiod);
adisuciu 0:bf917bb43db6 180 return 0;
adisuciu 0:bf917bb43db6 181 }
adisuciu 0:bf917bb43db6 182
adisuciu 0:bf917bb43db6 183 if (!strncmp(str, "READ ", sizeof("READ ") - 1))
adisuciu 0:bf917bb43db6 184 return parse_rw_string(iiod, str + sizeof("READ ") - 1, false);
adisuciu 0:bf917bb43db6 185
adisuciu 0:bf917bb43db6 186 if (!strncmp(str, "WRITE ", sizeof("WRITE ") -1))
adisuciu 0:bf917bb43db6 187 return parse_rw_string(iiod, str + sizeof("WRITE ") - 1, true);
adisuciu 0:bf917bb43db6 188
adisuciu 0:bf917bb43db6 189 if (!strncmp(str, "OPEN ", sizeof("OPEN ") -1))
adisuciu 0:bf917bb43db6 190 return parse_open_string(iiod, str + sizeof("OPEN ") - 1);
adisuciu 0:bf917bb43db6 191
adisuciu 0:bf917bb43db6 192 if (!strncmp(str, "CLOSE ", sizeof("CLOSE ") -1)) {
adisuciu 0:bf917bb43db6 193 tinyiiod_do_close(iiod, str + sizeof("CLOSE ") - 1);
adisuciu 0:bf917bb43db6 194 return 0;
adisuciu 0:bf917bb43db6 195 }
adisuciu 0:bf917bb43db6 196
adisuciu 0:bf917bb43db6 197 if (!strncmp(str, "READBUF ", sizeof("READBUF ") -1))
adisuciu 0:bf917bb43db6 198 return parse_readbuf_string(iiod, str + sizeof("READBUF ") - 1);
adisuciu 0:bf917bb43db6 199
adisuciu 0:bf917bb43db6 200 if (!strncmp(str, "TIMEOUT ", sizeof("TIMEOUT ") - 1))
adisuciu 0:bf917bb43db6 201 return parse_timeout_string(iiod, str + sizeof("TIMEOUT ") - 1);
adisuciu 0:bf917bb43db6 202
adisuciu 0:bf917bb43db6 203 if (!strncmp(str, "WRITEBUF ", sizeof("WRITEBUF ") -1))
adisuciu 0:bf917bb43db6 204 return parse_writebuf_string(iiod, str + sizeof("WRITEBUF ") - 1);
adisuciu 0:bf917bb43db6 205
adisuciu 0:bf917bb43db6 206 if (!strncmp(str, "EXIT", sizeof("EXIT") - 1))
adisuciu 0:bf917bb43db6 207 return tinyiiod_do_close_instance(iiod);
adisuciu 0:bf917bb43db6 208
adisuciu 0:bf917bb43db6 209 if (!strncmp(str, "GETTRIG", sizeof("GETTRIG") - 1))
adisuciu 0:bf917bb43db6 210 return tinyiiod_write_value(iiod, -ENODEV);
adisuciu 0:bf917bb43db6 211
adisuciu 0:bf917bb43db6 212 return -EINVAL;
adisuciu 0:bf917bb43db6 213 }