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 "mbed.h"
adisuciu 0:bf917bb43db6 19 #include "platform/mbed_thread.h"
adisuciu 0:bf917bb43db6 20 #include <errno.h>
adisuciu 0:bf917bb43db6 21 #include <signal.h>
adisuciu 0:bf917bb43db6 22 #include <stdio.h>
adisuciu 0:bf917bb43db6 23 #include <string.h>
adisuciu 0:bf917bb43db6 24 #include "tinyiiod.h"
adisuciu 0:bf917bb43db6 25
adisuciu 0:bf917bb43db6 26 Serial pc(USBTX, USBRX, 115200);
adisuciu 0:bf917bb43db6 27 DigitalOut led1(LED1);
adisuciu 0:bf917bb43db6 28 DigitalOut led2(LED2);
adisuciu 0:bf917bb43db6 29
adisuciu 0:bf917bb43db6 30
adisuciu 0:bf917bb43db6 31 static ssize_t read_data(char *buf, size_t len)
adisuciu 0:bf917bb43db6 32 {
adisuciu 0:bf917bb43db6 33 // get data from UART
adisuciu 0:bf917bb43db6 34 for(int i=0;i<len;i++)
adisuciu 0:bf917bb43db6 35 buf[i]=pc.getc();
adisuciu 0:bf917bb43db6 36 return len;
adisuciu 0:bf917bb43db6 37 }
adisuciu 0:bf917bb43db6 38
adisuciu 0:bf917bb43db6 39 static ssize_t write_data(const char *buf, size_t len)
adisuciu 0:bf917bb43db6 40 {
adisuciu 0:bf917bb43db6 41 // send data over UART
adisuciu 0:bf917bb43db6 42 for(int i=0;i<len;i++)
adisuciu 0:bf917bb43db6 43 pc.putc(buf[i]);
adisuciu 0:bf917bb43db6 44 return len;
adisuciu 0:bf917bb43db6 45 }
adisuciu 0:bf917bb43db6 46
adisuciu 0:bf917bb43db6 47 static ssize_t read_attr(const char *device, const char *attr,
adisuciu 0:bf917bb43db6 48 char *buf, size_t len, bool debug)
adisuciu 0:bf917bb43db6 49 {
adisuciu 0:bf917bb43db6 50 // dispatcher method for read device attr
adisuciu 0:bf917bb43db6 51 if (!strcmp(device, "adc") || !strcmp(device, "0")) {
adisuciu 0:bf917bb43db6 52 if (debug) {
adisuciu 0:bf917bb43db6 53 if (!strcmp(attr, "direct_reg_access"))
adisuciu 0:bf917bb43db6 54 return (ssize_t) snprintf(buf, len, "0");
adisuciu 0:bf917bb43db6 55 } else {
adisuciu 0:bf917bb43db6 56 if (!strcmp(attr, "sample_rate"))
adisuciu 0:bf917bb43db6 57 return (ssize_t) snprintf(buf, len, "1000");
adisuciu 0:bf917bb43db6 58 }
adisuciu 0:bf917bb43db6 59 }
adisuciu 0:bf917bb43db6 60
adisuciu 0:bf917bb43db6 61 return -ENOENT;
adisuciu 0:bf917bb43db6 62 }
adisuciu 0:bf917bb43db6 63
adisuciu 0:bf917bb43db6 64 static ssize_t write_attr(const char *device, const char *attr,
adisuciu 0:bf917bb43db6 65 const char *buf, size_t len, bool debug)
adisuciu 0:bf917bb43db6 66 {
adisuciu 0:bf917bb43db6 67 // dispatcher method for write device attr
adisuciu 0:bf917bb43db6 68 return -ENOSYS;
adisuciu 0:bf917bb43db6 69 }
adisuciu 0:bf917bb43db6 70
adisuciu 0:bf917bb43db6 71 static ssize_t ch_read_attr(const char *device, const char *channel,
adisuciu 0:bf917bb43db6 72 bool ch_out, const char *attr, char *buf, size_t len)
adisuciu 0:bf917bb43db6 73 {
adisuciu 0:bf917bb43db6 74
adisuciu 0:bf917bb43db6 75 // dispatcher method for channel read attr
adisuciu 0:bf917bb43db6 76 int temp;
adisuciu 0:bf917bb43db6 77 if (!strcmp(device, "adc") || !strcmp(device, "0")) {
adisuciu 0:bf917bb43db6 78 if (ch_out)
adisuciu 0:bf917bb43db6 79 return -ENOENT;
adisuciu 0:bf917bb43db6 80
adisuciu 0:bf917bb43db6 81 if (!strcmp(channel, "voltage0")) {
adisuciu 0:bf917bb43db6 82 if (!strcmp(attr, "scale"))
adisuciu 0:bf917bb43db6 83 return (ssize_t) snprintf(buf, len, "0.033");
adisuciu 0:bf917bb43db6 84 else if (!strcmp(attr, "led"))
adisuciu 0:bf917bb43db6 85 {
adisuciu 0:bf917bb43db6 86 temp=led1;
adisuciu 0:bf917bb43db6 87 return (ssize_t) snprintf(buf, len, "%d",temp);
adisuciu 0:bf917bb43db6 88 }
adisuciu 0:bf917bb43db6 89
adisuciu 0:bf917bb43db6 90 } else if (!strcmp(channel, "voltage1")) {
adisuciu 0:bf917bb43db6 91 if (!strcmp(attr, "scale"))
adisuciu 0:bf917bb43db6 92 return (ssize_t) snprintf(buf, len, "0.033");
adisuciu 0:bf917bb43db6 93 else if (!strcmp(attr, "led2"))
adisuciu 0:bf917bb43db6 94 {temp=led2;
adisuciu 0:bf917bb43db6 95 return (ssize_t) snprintf(buf, len, "%d",temp);
adisuciu 0:bf917bb43db6 96 }
adisuciu 0:bf917bb43db6 97 }
adisuciu 0:bf917bb43db6 98 }
adisuciu 0:bf917bb43db6 99
adisuciu 0:bf917bb43db6 100 return -ENOENT;
adisuciu 0:bf917bb43db6 101 }
adisuciu 0:bf917bb43db6 102
adisuciu 0:bf917bb43db6 103 static ssize_t ch_write_attr(const char *device, const char *channel,
adisuciu 0:bf917bb43db6 104 bool ch_out, const char *attr, const char *buf, size_t len)
adisuciu 0:bf917bb43db6 105 {
adisuciu 0:bf917bb43db6 106 // dispatcher method for write channel attribute
adisuciu 0:bf917bb43db6 107 ssize_t retval;
adisuciu 0:bf917bb43db6 108 int temp;
adisuciu 0:bf917bb43db6 109 if (!strcmp(device, "adc") || !strcmp(device, "0")) {
adisuciu 0:bf917bb43db6 110 if (ch_out)
adisuciu 0:bf917bb43db6 111 return -ENOENT;
adisuciu 0:bf917bb43db6 112
adisuciu 0:bf917bb43db6 113 if (!strcmp(channel, "voltage0")) {
adisuciu 0:bf917bb43db6 114 if (!strcmp(attr, "scale"))
adisuciu 0:bf917bb43db6 115 return -ENOSYS;
adisuciu 0:bf917bb43db6 116 else if (!strcmp(attr, "led"))
adisuciu 0:bf917bb43db6 117 {
adisuciu 0:bf917bb43db6 118 // return (ssize_t) snprintf(buf, len, "%d",led1);
adisuciu 0:bf917bb43db6 119 retval = (ssize_t) sscanf(buf,"%d",&temp);
adisuciu 0:bf917bb43db6 120 led1=temp;
adisuciu 0:bf917bb43db6 121 return retval;
adisuciu 0:bf917bb43db6 122
adisuciu 0:bf917bb43db6 123 }
adisuciu 0:bf917bb43db6 124 } else if (!strcmp(channel, "voltage1")) {
adisuciu 0:bf917bb43db6 125 if (!strcmp(attr, "scale"))
adisuciu 0:bf917bb43db6 126 return -ENOSYS;
adisuciu 0:bf917bb43db6 127 else if (!strcmp(attr, "led2"))
adisuciu 0:bf917bb43db6 128 {
adisuciu 0:bf917bb43db6 129 retval = (ssize_t) sscanf(buf,"%d",&temp);
adisuciu 0:bf917bb43db6 130 led2=temp;
adisuciu 0:bf917bb43db6 131 return retval;
adisuciu 0:bf917bb43db6 132 }
adisuciu 0:bf917bb43db6 133 }
adisuciu 0:bf917bb43db6 134 }
adisuciu 0:bf917bb43db6 135 return -ENOSYS;
adisuciu 0:bf917bb43db6 136 }
adisuciu 0:bf917bb43db6 137
adisuciu 0:bf917bb43db6 138 // XML describes the IIO context hierarchy
adisuciu 0:bf917bb43db6 139 static const char * const xml =
adisuciu 0:bf917bb43db6 140 "<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE context [<!ELEMENT context "
adisuciu 0:bf917bb43db6 141 "(device)*><!ELEMENT device (channel | attribute | debug-attribute)*><!ELEMENT "
adisuciu 0:bf917bb43db6 142 "channel (scan-element?, attribute*)><!ELEMENT attribute EMPTY><!ELEMENT "
adisuciu 0:bf917bb43db6 143 "scan-element EMPTY><!ELEMENT debug-attribute EMPTY><!ATTLIST context name "
adisuciu 0:bf917bb43db6 144 "CDATA #REQUIRED description CDATA #IMPLIED><!ATTLIST device id CDATA "
adisuciu 0:bf917bb43db6 145 "#REQUIRED name CDATA #IMPLIED><!ATTLIST channel id CDATA #REQUIRED type "
adisuciu 0:bf917bb43db6 146 "(input|output) #REQUIRED name CDATA #IMPLIED><!ATTLIST scan-element index "
adisuciu 0:bf917bb43db6 147 "CDATA #REQUIRED format CDATA #REQUIRED scale CDATA #IMPLIED><!ATTLIST "
adisuciu 0:bf917bb43db6 148 "attribute name CDATA #REQUIRED filename CDATA #IMPLIED><!ATTLIST "
adisuciu 0:bf917bb43db6 149 "debug-attribute name CDATA #REQUIRED>]><context name=\"tiny\" "
adisuciu 0:bf917bb43db6 150 "description=\"Tiny IIOD\" >"
adisuciu 0:bf917bb43db6 151 "<device id=\"0\" name=\"adc\" >"
adisuciu 0:bf917bb43db6 152 "<channel id=\"voltage0\" type=\"input\" >"
adisuciu 0:bf917bb43db6 153 "<attribute name=\"scale\" /><attribute name=\"led\" /></channel>"
adisuciu 0:bf917bb43db6 154 "<channel id=\"voltage1\" type=\"input\" >"
adisuciu 0:bf917bb43db6 155 "<attribute name=\"scale\" /><attribute name=\"led2\" /></channel>"
adisuciu 0:bf917bb43db6 156 "<attribute name=\"sample_rate\" />"
adisuciu 0:bf917bb43db6 157 "<debug-attribute name=\"direct_reg_access\" />"
adisuciu 0:bf917bb43db6 158 "</device></context>";
adisuciu 0:bf917bb43db6 159
adisuciu 0:bf917bb43db6 160 static ssize_t get_xml(char **outxml)
adisuciu 0:bf917bb43db6 161 {
adisuciu 0:bf917bb43db6 162
adisuciu 0:bf917bb43db6 163 *outxml = (char*)calloc(1, strlen(xml) + 1);
adisuciu 0:bf917bb43db6 164 if (!(*outxml))
adisuciu 0:bf917bb43db6 165 return -ENOMEM;
adisuciu 0:bf917bb43db6 166 memcpy(*outxml, xml, strlen(xml));
adisuciu 0:bf917bb43db6 167
adisuciu 0:bf917bb43db6 168 return 0;
adisuciu 0:bf917bb43db6 169 }
adisuciu 0:bf917bb43db6 170
adisuciu 0:bf917bb43db6 171 struct tinyiiod_ops ops = {
adisuciu 0:bf917bb43db6 172 .read = read_data,
adisuciu 0:bf917bb43db6 173 .write = write_data,
adisuciu 0:bf917bb43db6 174
adisuciu 0:bf917bb43db6 175 .read_attr = read_attr,
adisuciu 0:bf917bb43db6 176 .write_attr = write_attr,
adisuciu 0:bf917bb43db6 177 .ch_read_attr = ch_read_attr,
adisuciu 0:bf917bb43db6 178 .ch_write_attr = ch_write_attr,
adisuciu 0:bf917bb43db6 179 .get_xml = get_xml,
adisuciu 0:bf917bb43db6 180 };
adisuciu 0:bf917bb43db6 181
adisuciu 0:bf917bb43db6 182 static bool stop;
adisuciu 0:bf917bb43db6 183
adisuciu 0:bf917bb43db6 184 static void set_handler(int32_t signal_nb, void (*handler)(int32_t))
adisuciu 0:bf917bb43db6 185 {
adisuciu 0:bf917bb43db6 186 // error handling commented out due to errors with mbed
adisuciu 0:bf917bb43db6 187 /*
adisuciu 0:bf917bb43db6 188 struct sigaction sig;
adisuciu 0:bf917bb43db6 189 sigaction(signal_nb, NULL, &sig);
adisuciu 0:bf917bb43db6 190 sig.sa_handler = handler;
adisuciu 0:bf917bb43db6 191 sigaction(signal_nb, &sig, NULL);*/
adisuciu 0:bf917bb43db6 192 }
adisuciu 0:bf917bb43db6 193
adisuciu 0:bf917bb43db6 194 static void quit_all(int32_t sig)
adisuciu 0:bf917bb43db6 195 {
adisuciu 0:bf917bb43db6 196 stop = true;
adisuciu 0:bf917bb43db6 197 }
adisuciu 0:bf917bb43db6 198
adisuciu 0:bf917bb43db6 199 int32_t main(void)
adisuciu 0:bf917bb43db6 200 {
adisuciu 0:bf917bb43db6 201 struct tinyiiod *iiod = tinyiiod_create(&ops);
adisuciu 0:bf917bb43db6 202 led1=1;
adisuciu 0:bf917bb43db6 203
adisuciu 0:bf917bb43db6 204 // error handling commented out
adisuciu 0:bf917bb43db6 205 /*set_handler(SIGHUP, &quit_all);
adisuciu 0:bf917bb43db6 206 set_handler(SIGPIPE, &quit_all);
adisuciu 0:bf917bb43db6 207 set_handler(SIGINT, &quit_all);
adisuciu 0:bf917bb43db6 208 set_handler(SIGSEGV, &quit_all);
adisuciu 0:bf917bb43db6 209 set_handler(SIGTERM, &quit_all);*/
adisuciu 0:bf917bb43db6 210
adisuciu 0:bf917bb43db6 211 while (!stop)
adisuciu 0:bf917bb43db6 212 tinyiiod_read_command(iiod);
adisuciu 0:bf917bb43db6 213
adisuciu 0:bf917bb43db6 214 tinyiiod_destroy(iiod);
adisuciu 0:bf917bb43db6 215
adisuciu 0:bf917bb43db6 216 return 0;
adisuciu 0:bf917bb43db6 217 }