iio: Find attributes and channels in iio device
[contrib/mraa.git] / src / iio / iio.c
index d5d3c3b..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)
 {
-    mraa_iio_context dev = (mraa_iio_context) calloc(1, sizeof(struct _iio));
-    if (dev == NULL) {
-        syslog(LOG_CRIT, "iio: Failed to allocate memory for context");
+    if (device > plat->iio_device_count) {
+        return NULL;
+    }
+
+    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)
+{
+    // 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, const char* attribute, float* data)
+{
+    char buf[64];
+    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);
+        *data = strtol(buf, NULL, 10);
+        return MRAA_SUCCESS;
+    }
+    return MRAA_ERROR_UNSPECIFIED;
+}
 
 mraa_result_t
-mraa_iio_read(mraa_iio_context dev, uint32_t* data, int length)
+mraa_iio_write(mraa_iio_context dev, const char* attribute)
 {
-   return 0;
+    return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED;
 }
 
 mraa_result_t