From: Brendan Le Foll Date: Mon, 5 Oct 2015 11:01:00 +0000 (+0100) Subject: iio: Improve iio channel parsing to add enabled channels X-Git-Tag: v0.9.0~55 X-Git-Url: http://review.tizen.org/git/?p=contrib%2Fmraa.git;a=commitdiff_plain;h=acfb74f04ee416a7697d6127dd3bf372bb9d4aae iio: Improve iio channel parsing to add enabled channels scale and other attributes have to be read individually as they vary quite alot depending on the channel. We only care/take data from scan_elements Signed-off-by: Brendan Le Foll --- diff --git a/api/mraa/iio.h b/api/mraa/iio.h index f0b42a3..d00ac7c 100644 --- a/api/mraa/iio.h +++ b/api/mraa/iio.h @@ -38,7 +38,6 @@ typedef struct { unsigned int bytes; unsigned int shift; unsigned int location; - float scale; } mraa_iio_channel; /** diff --git a/examples/iio_driver.c b/examples/iio_driver.c index 4c88add..e2ca3e3 100644 --- a/examples/iio_driver.c +++ b/examples/iio_driver.c @@ -29,15 +29,13 @@ static void printword(uint16_t input, mraa_iio_channel *chan) { int16_t res; + if (!chan->lendian) { input = be16toh(input); } else { input = le16toh(input); } - // currently we don't treat scales - chan->scale = 1.0f; - input >>= chan->shift; input &= chan->mask; if (chan->signedd) { @@ -45,7 +43,7 @@ printword(uint16_t input, mraa_iio_channel *chan) } else { res = input; } - printf("chan %d == %05f\n", chan->index, ((float)res + chan->offset) * chan->scale); + printf(" value = %05f\n", chan->index, (float)res); } mraa_iio_context iio_device0; @@ -57,13 +55,14 @@ interrupt(char* data) int i = 0; for (i; i < mraa_iio_get_channel_count(iio_device0); i++) { - printf("channel bytes %d\n", channels[i].bytes); - switch (channels[i].bytes) { - case 2: - printword(*(uint16_t *)(data + channels[i].location), &channels[i]); + if (channels[i].enabled) { + printf("channel %d - bytes %d\n", channels[i].index, channels[i].bytes); + switch (channels[i].bytes) { + case 2: + printword(*(uint16_t *)(data + channels[i].location), &channels[i]); + } } } - printf("data %s\n", (char*) data); } int diff --git a/src/iio/iio.c b/src/iio/iio.c index 7be318f..dcf80d4 100644 --- a/src/iio/iio.c +++ b/src/iio/iio.c @@ -105,6 +105,7 @@ mraa_iio_get_channel_data(mraa_iio_context dev) buf[(strlen(buf)-5)] = '\0'; char* str = strdup(buf); + // grab the type of the buffer snprintf(buf, MAX_SIZE, "%stype", str); fd = open(buf, O_RDONLY); if (fd > 0) { @@ -119,8 +120,11 @@ mraa_iio_get_channel_data(mraa_iio_context dev) chan->location = curr_bytes - curr_bytes%chan->bytes + chan->bytes; } curr_bytes = chan->location + chan->bytes; + // probably should be 5? if (ret < 0) { - // probably should be 5? + // cleanup + free(str); + close(fd); return MRAA_IO_SETUP_FAILURE; } chan->signedd = (signchar == 's'); @@ -130,10 +134,21 @@ mraa_iio_get_channel_data(mraa_iio_context dev) } else { chan->mask = (1 << chan->bits_used) - 1; } - close(fd); } - // todo - read scale & _en attributes + // 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); + close(fd); + } + // clean up str var + free(str); } } } diff --git a/src/mraa.c b/src/mraa.c index bdc91bc..3cacba3 100644 --- a/src/mraa.c +++ b/src/mraa.c @@ -173,13 +173,14 @@ mraa_init() device->num = i; snprintf(filepath, 64, "/sys/bus/iio/devices/iio:device%d/name", i); fd = open(filepath, O_RDONLY); - if (fd != -1) { + if (fd > 0) { len = read(fd, &name, 64); if (len > 1) { // use strndup device->name = malloc((sizeof(char) * len) + sizeof(char)); strncpy(device->name, name, len); } + close(fd); } }