DRY up the float parser.
[apps/agl-service-can-low-level.git] / src / canutil / read.c
index b662e9b..d0cbb71 100644 (file)
@@ -2,10 +2,14 @@
 #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) {
-    uint64_t raw = eightbyte_get_bitfield(data, bit_offset, bit_size, true);
-    return raw * factor + 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,
@@ -17,10 +21,8 @@ bool eightbyte_parse_bool(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
 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) {
-    uint64_t raw = get_bitfield(source, source_length, bit_offset, bit_size);
-    // TODO seems dumb that this is repeated from eightbyte_parse_float - is it
-    // really worth keeping around these two implementations?
-    return raw * factor + 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,