iio: iio update channel
authorLay, Kuan Loon <kuan.loon.lay@intel.com>
Fri, 6 Nov 2015 01:49:54 +0000 (09:49 +0800)
committerBrendan Le Foll <brendan.le.foll@intel.com>
Tue, 15 Dec 2015 10:42:06 +0000 (10:42 +0000)
Signed-off-by: Lay, Kuan Loon <kuan.loon.lay@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
api/mraa/iio.h
src/iio/iio.c

index 2b84fc2..77b6728 100644 (file)
@@ -124,6 +124,8 @@ mraa_result_t mraa_iio_event_extract_event(struct iio_event_data* event,
 mraa_result_t mraa_iio_get_mounting_matrix(mraa_iio_context dev, float mm[9]);
 
 mraa_result_t mraa_iio_create_trigger(mraa_iio_context dev, const char* trigger);
+
+mraa_result_t mraa_iio_update_channels(mraa_iio_context dev);
 /**
  * De-inits an mraa_iio_context device
  *
index 16e4915..7f4ed5c 100644 (file)
@@ -559,6 +559,60 @@ mraa_iio_create_trigger(mraa_iio_context dev, const char* trigger)
     return MRAA_ERROR_UNSPECIFIED;
 }
 
+mraa_result_t
+mraa_iio_update_channels(mraa_iio_context dev)
+{
+    const struct dirent* ent;
+    DIR* dir;
+    int chan_num = 0;
+    char buf[MAX_SIZE];
+    char readbuf[32];
+    int fd;
+    mraa_iio_channel* chan;
+
+    dev->datasize = 0;
+    memset(buf, 0, MAX_SIZE);
+    snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/" IIO_SCAN_ELEM, dev->num);
+    dir = opendir(buf);
+    if (dir != NULL) {
+        while ((ent = readdir(dir)) != NULL) {
+            if (strcmp(ent->d_name + strlen(ent->d_name) - strlen("_index"), "_index") == 0) {
+                snprintf(buf, MAX_SIZE, IIO_SYSFS_DEVICE "%d/" IIO_SCAN_ELEM "/%s", dev->num, ent->d_name);
+                fd = open(buf, O_RDONLY);
+                if (fd > 0) {
+                    if (read(fd, readbuf, 2 * sizeof(char)) != 2) {
+                        break;
+                    }
+                    chan_num = ((int) strtol(readbuf, NULL, 10));
+                    chan = &dev->channels[chan_num];
+                    chan->index = chan_num;
+                    close(fd);
+
+                    buf[(strlen(buf) - 5)] = '\0';
+                    char* str = strdup(buf);
+                    // grab the enable flag of channel
+                    snprintf(buf, MAX_SIZE, "%sen", str);
+                    fd = open(buf, O_RDONLY);
+                    if (fd > 0) {
+                        if (read(fd, readbuf, 2 * sizeof(char)) != 2) {
+                            syslog(LOG_ERR, "iio: Failed to read a sensible value from sysfs");
+                            return -1;
+                        }
+                        chan->enabled = (int) strtol(readbuf, NULL, 10);
+                        // only calculate enable buffer size for trigger buffer extract data
+                        if (chan->enabled) {
+                            dev->datasize += chan->bytes;
+                        }
+                        close(fd);
+                    }
+                    // clean up str var
+                    free(str);
+                }
+            }
+        }
+    }
+    return MRAA_SUCCESS;
+}
 #if 0
 // does stop make any sense on iio devices?
 mraa_result_t