summaryrefslogtreecommitdiffstats
path: root/libs/bitfield-c/src/canutil/read.c
diff options
context:
space:
mode:
authorRomain Forlot <romain.forlot@iot.bzh>2017-06-20 10:24:05 +0000
committerRomain Forlot <romain.forlot@iot.bzh>2017-06-20 10:24:05 +0000
commit32e25cbca210a359b09768537b6f443fe90a3070 (patch)
tree3309794c15d8a8f8e9c1c08cad072ee1378813ba /libs/bitfield-c/src/canutil/read.c
parent76c43dec62b2e21cd6446360c00d4fe6b437533f (diff)
Separation Generator to a dedicated repo
Change-Id: Id94831651c3266861435272a6e36c7884bef2c45 Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Diffstat (limited to 'libs/bitfield-c/src/canutil/read.c')
-rw-r--r--libs/bitfield-c/src/canutil/read.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libs/bitfield-c/src/canutil/read.c b/libs/bitfield-c/src/canutil/read.c
new file mode 100644
index 0000000..d0cbb71
--- /dev/null
+++ b/libs/bitfield-c/src/canutil/read.c
@@ -0,0 +1,34 @@
+#include <canutil/read.h>
+#include <bitfield/bitfield.h>
+#include <bitfield/8byte.h>
+
+static float decode_float(uint64_t raw, float factor, float offset) {
+ return raw * factor + offset;
+}
+
+float eightbyte_parse_float(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
+ float factor, float offset) {
+ return decode_float(eightbyte_get_bitfield(data, bit_offset, bit_size,
+ true), factor, offset);
+}
+
+bool eightbyte_parse_bool(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
+ float factor, float offset) {
+ float value = eightbyte_parse_float(data, bit_offset, bit_size, factor, offset);
+ return value == 0.0 ? false : true;
+}
+
+float bitfield_parse_float(const uint8_t source[], const uint16_t source_length,
+ const uint8_t bit_offset, const uint8_t bit_size, const float factor,
+ const float offset) {
+ return decode_float(get_bitfield(source, source_length, bit_offset, bit_size),
+ factor, offset);
+}
+
+bool bitfield_parse_bool(const uint8_t source[], const uint16_t source_length,
+ const uint8_t bit_offset, const uint8_t bit_size, const float factor,
+ const float offset) {
+ float value = bitfield_parse_float(source, source_length, bit_offset,
+ bit_size, factor, offset);
+ return value == 0.0 ? false : true;
+}