iio: Find attributes and channels in iio device
authorBrendan Le Foll <brendan.le.foll@intel.com>
Tue, 29 Sep 2015 13:19:42 +0000 (14:19 +0100)
committerBrendan Le Foll <brendan.le.foll@intel.com>
Tue, 15 Dec 2015 10:42:06 +0000 (10:42 +0000)
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
api/mraa/iio.h
examples/iio_driver.c
include/mraa_internal_types.h
src/iio/iio.c

index 5bfb9ab..4811916 100644 (file)
@@ -61,14 +61,18 @@ mraa_iio_context mraa_iio_init(int device);
  */
 int mraa_iio_get_channel_count(mraa_iio_context dev);
 
+int mraa_iio_get_attr_count(mraa_iio_context dev, int channel);
+
+const char* mraa_iio_get_device_name(mraa_iio_context dev);
+
 /**
  */
-mraa_result_t mraa_iio_read(mraa_iio_context dev, int channel, const char* attribute, float* data);
+mraa_result_t mraa_iio_read(mraa_iio_context dev, const char* attribute, float* data);
 
 /**
  *
  */
-mraa_result_t mraa_iio_write(mraa_iio_context dev, int channel, const char* attribute);
+mraa_result_t mraa_iio_write(mraa_iio_context dev, const char* attribute);
 
 /**
  * De-inits an mraa_iio_context device
index eb9cedd..3519f45 100644 (file)
@@ -37,7 +37,10 @@ main()
     }
 
     float iio_value;
-    mraa_result_t ret = mraa_iio_read(iio_device0, 0, "raw", &iio_value);
+    fprintf(stdout, "IIO device has %d channels and %d attributes\n",
+            mraa_iio_get_channel_count(iio_device0),
+            mraa_iio_get_attr_count(iio_device0, 0));
+    mraa_result_t ret = mraa_iio_read(iio_device0, "in_voltage0_raw", &iio_value);
     if (ret == MRAA_SUCCESS) {
         fprintf(stdout, "IIO read %f\n", iio_value);
     }
index b5a495c..06bc7d8 100644 (file)
@@ -130,11 +130,13 @@ struct _uart {
 };
 
 /**
- * A structure reprensting an IIO device
+ * A structure representing an IIO device
  */
 struct _iio {
     int num; /**< IIO device number */
     char* name; /**< IIO device name */
+    int channum;
+    int attrnum;
 };
 
 /**
index 982a5dd..3bf100d 100644 (file)
 
 #include "iio.h"
 #include "mraa_internal.h"
+#include "dirent.h"
+#include <string.h>
+
+#define IIO_SYSFS_DEVICE "/sys/bus/iio/devices/iio:device"
 
 mraa_iio_context
 mraa_iio_init(int device)
@@ -31,20 +35,77 @@ mraa_iio_init(int device)
     if (device > plat->iio_device_count) {
         return NULL;
     }
-    return &plat->iio_devices[device];
+
+    mraa_iio_context dev = &plat->iio_devices[device];
+
+    char* buf;
+    char sep[] = "_";
+    char* splitbuf;
+    DIR* dir;
+    struct dirent *ent;
+    if ((dir = opendir (IIO_SYSFS_DEVICE "0/")) != NULL) {
+        while ((ent = readdir (dir)) != NULL) {
+            if (strlen(ent->d_name) > 3) {
+                if (strncmp(ent->d_name, "in_", 3) == 0) {
+                    dev->attrnum++;
+                    buf = strndup(&ent->d_name[3], 64);
+                    splitbuf = strsep(&buf, sep);
+                    if (buf == NULL) {
+                        return NULL;
+                    }
+                    int num = atoi(&splitbuf[strlen(splitbuf)-1]);
+                    if (dev->channum < num) {
+                        dev->channum = num;
+                    }
+                    free(splitbuf);
+                }
+                else if (strncmp(ent->d_name, "out_", 4) == 0) {
+                    dev->attrnum++;
+                }
+            }
+        }
+        closedir (dir);
+    } else {
+        return NULL;
+    }
+
+    return dev;
+}
+
+// -1 is the device 'channel'
+int
+mraa_iio_get_attr_count(mraa_iio_context dev, int channel)
+{
+    // search is 0 indexed
+    return dev->attrnum + 1;
 }
 
 int
 mraa_iio_get_channel_count(mraa_iio_context dev)
 {
-    return 1;
+    // search is 0 indexed
+    return dev->channum + 1;
+}
+
+const char*
+mraa_iio_get_device_name(mraa_iio_context dev)
+{
+    return dev->name;
+}
+
+#if 0
+mraa_result_t
+mraa_iio_get_attr_data(mraa_iio_context dev, mraa_iio_channel* chan)
+{
+    return MRAA_FEATURE_NOT_IMPLEMENTED;
 }
+#endif
 
 mraa_result_t
-mraa_iio_read(mraa_iio_context dev, int channel, const char* attribute, float* data)
+mraa_iio_read(mraa_iio_context dev, const char* attribute, float* data)
 {
     char buf[64];
-    snprintf(buf, 64, "/sys/bus/iio/devices/iio:device%d/in_voltage%d_%s", dev->num, channel, attribute);
+    snprintf(buf, 64, IIO_SYSFS_DEVICE, "%d/%s", dev->num, attribute);
     int fd = open(buf, O_RDONLY);
     if (fd != -1) {
         int len = read(fd, &buf, 64);
@@ -55,7 +116,7 @@ mraa_iio_read(mraa_iio_context dev, int channel, const char* attribute, float* d
 }
 
 mraa_result_t
-mraa_iio_write(mraa_iio_context dev, int channel, const char* attribute)
+mraa_iio_write(mraa_iio_context dev, const char* attribute)
 {
     return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
 }