Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: libserialport libxml2
Diff: channel.c
- Revision:
- 3:d147beabba0e
- Parent:
- 2:9eb0a9a1f958
- Child:
- 4:ad69b39bf124
--- a/channel.c Tue Sep 20 15:34:31 2016 +0000 +++ b/channel.c Mon Jan 30 13:00:39 2017 +0000 @@ -175,28 +175,31 @@ *length = len - 1; /* Skip the \0 */ if (attr->filename) - snprintf(str, len, "<attribute name=\"%s\" filename=\"%s\" />", + iio_snprintf(str, len, "<attribute name=\"%s\" filename=\"%s\" />", attr->name, attr->filename); else - snprintf(str, len, "<attribute name=\"%s\" />", attr->name); + iio_snprintf(str, len, "<attribute name=\"%s\" />", attr->name); return str; } static char * get_scan_element(const struct iio_channel *chn, size_t *length) { - char buf[1024], *str; + char buf[1024], repeat[8] = "", *str; char processed = (chn->format.is_fully_defined ? 'A' - 'a' : 0); - snprintf(buf, sizeof(buf), "<scan-element index=\"%li\" " - "format=\"%ce:%c%u/%u>>%u\" />", + if (chn->format.repeat > 1) + iio_snprintf(repeat, sizeof(repeat), "X%u", chn->format.repeat); + + iio_snprintf(buf, sizeof(buf), "<scan-element index=\"%li\" " + "format=\"%ce:%c%u/%u%s>>%u\" />", chn->index, chn->format.is_be ? 'b' : 'l', chn->format.is_signed ? 's' + processed : 'u' + processed, - chn->format.bits, chn->format.length, + chn->format.bits, chn->format.length, repeat, chn->format.shift); if (chn->format.with_scale) { char *ptr = strrchr(buf, '\0'); - snprintf(ptr - 2, buf + sizeof(buf) - ptr + 2, + iio_snprintf(ptr - 2, buf + sizeof(buf) - ptr + 2, "scale=\"%f\" />", chn->format.scale); } @@ -244,7 +247,7 @@ if (!str) goto err_free_attrs; - snprintf(str, len, "<channel id=\"%s\"", chn->id); + iio_snprintf(str, len, "<channel id=\"%s\"", chn->id); ptr = strrchr(str, '\0'); if (chn->name) { @@ -519,33 +522,46 @@ void iio_channel_convert(const struct iio_channel *chn, void *dst, const void *src) { + uintptr_t src_ptr = (uintptr_t) src, dst_ptr = (uintptr_t) dst; unsigned int len = chn->format.length / 8; + ptrdiff_t end = len * chn->format.repeat; + uintptr_t end_ptr = src_ptr + end; #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ bool swap = chn->format.is_be; #else bool swap = !chn->format.is_be; #endif - if (len == 1 || !swap) - memcpy(dst, src, len); - else - byte_swap(dst, src, len); + for (src_ptr = (uintptr_t) src; src_ptr < end_ptr; + src_ptr += len, dst_ptr += len) { + if (len == 1 || !swap) + memcpy((void *) dst_ptr, (const void *) src_ptr, len); + else + byte_swap((void *) dst_ptr, (const void *) src_ptr, + len); - if (chn->format.shift) - shift_bits(dst, chn->format.shift, len, false); + if (chn->format.shift) + shift_bits((void *) dst_ptr, chn->format.shift, len, + false); - if (!chn->format.is_fully_defined) { - if (chn->format.is_signed) - sign_extend(dst, chn->format.bits, len); - else - mask_upper_bits(dst, chn->format.bits, len); + if (!chn->format.is_fully_defined) { + if (chn->format.is_signed) + sign_extend((void *) dst_ptr, + chn->format.bits, len); + else + mask_upper_bits((void *) dst_ptr, + chn->format.bits, len); + } } } void iio_channel_convert_inverse(const struct iio_channel *chn, void *dst, const void *src) { + uintptr_t src_ptr = (uintptr_t) src, dst_ptr = (uintptr_t) dst; unsigned int len = chn->format.length / 8; + ptrdiff_t end = len * chn->format.repeat; + uintptr_t end_ptr = dst_ptr + end; #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ bool swap = chn->format.is_be; #else @@ -557,23 +573,26 @@ if (len > sizeof(buf)) return; - memcpy(buf, src, len); - mask_upper_bits(buf, chn->format.bits, len); + for (dst_ptr = (uintptr_t) dst; dst_ptr < end_ptr; + src_ptr += len, dst_ptr += len) { + memcpy(buf, (const void *) src_ptr, len); + mask_upper_bits(buf, chn->format.bits, len); - if (chn->format.shift) - shift_bits(buf, chn->format.shift, len, true); + if (chn->format.shift) + shift_bits(buf, chn->format.shift, len, true); - if (len == 1 || !swap) - memcpy(dst, buf, len); - else - byte_swap(dst, buf, len); + if (len == 1 || !swap) + memcpy((void *) dst_ptr, buf, len); + else + byte_swap((void *) dst_ptr, buf, len); + } } size_t iio_channel_read_raw(const struct iio_channel *chn, struct iio_buffer *buf, void *dst, size_t len) { uintptr_t src_ptr, dst_ptr = (uintptr_t) dst, end = dst_ptr + len; - unsigned int length = chn->format.length / 8; + unsigned int length = chn->format.length / 8 * chn->format.repeat; uintptr_t buf_end = (uintptr_t) iio_buffer_end(buf); ptrdiff_t buf_step = iio_buffer_step(buf); @@ -588,7 +607,7 @@ struct iio_buffer *buf, void *dst, size_t len) { uintptr_t src_ptr, dst_ptr = (uintptr_t) dst, end = dst_ptr + len; - unsigned int length = chn->format.length / 8; + unsigned int length = chn->format.length / 8 * chn->format.repeat; uintptr_t buf_end = (uintptr_t) iio_buffer_end(buf); ptrdiff_t buf_step = iio_buffer_step(buf); @@ -604,7 +623,7 @@ struct iio_buffer *buf, const void *src, size_t len) { uintptr_t dst_ptr, src_ptr = (uintptr_t) src, end = src_ptr + len; - unsigned int length = chn->format.length / 8; + unsigned int length = chn->format.length / 8 * chn->format.repeat; uintptr_t buf_end = (uintptr_t) iio_buffer_end(buf); ptrdiff_t buf_step = iio_buffer_step(buf); @@ -619,7 +638,7 @@ struct iio_buffer *buf, const void *src, size_t len) { uintptr_t dst_ptr, src_ptr = (uintptr_t) src, end = src_ptr + len; - unsigned int length = chn->format.length / 8; + unsigned int length = chn->format.length / 8 * chn->format.repeat; uintptr_t buf_end = (uintptr_t) iio_buffer_end(buf); ptrdiff_t buf_step = iio_buffer_step(buf); @@ -675,7 +694,7 @@ { ssize_t ret; char buf[1024]; - snprintf(buf, sizeof(buf), "%lld", val); + iio_snprintf(buf, sizeof(buf), "%lld", val); ret = iio_channel_attr_write(chn, attr, buf); return ret < 0 ? ret : 0; }