Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
parser.cpp@0:bf917bb43db6, 2019-12-13 (annotated)
- Committer:
- adisuciu
- Date:
- Fri Dec 13 22:21:29 2019 +0000
- Revision:
- 0:bf917bb43db6
Initial revision
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |

