aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bitfield/8byte.c4
-rw-r--r--src/bitfield/8byte.h10
-rw-r--r--src/canutil/read.c16
-rw-r--r--src/canutil/read.h10
-rw-r--r--src/canutil/write.c14
-rw-r--r--src/canutil/write.h18
6 files changed, 47 insertions, 25 deletions
diff --git a/src/bitfield/8byte.c b/src/bitfield/8byte.c
index bfceb788..76dccc75 100644
--- a/src/bitfield/8byte.c
+++ b/src/bitfield/8byte.c
@@ -8,7 +8,7 @@
uint8_t eightbyte_get_nibble(const uint64_t source, const uint8_t nibble_index,
const bool data_is_big_endian) {
- return get_bit_field(source, NIBBLE_SIZE * nibble_index, NIBBLE_SIZE,
+ return eightbyte_get_bit_field(source, NIBBLE_SIZE * nibble_index, NIBBLE_SIZE,
data_is_big_endian);
}
@@ -20,7 +20,7 @@ uint8_t eightbyte_get_byte(uint64_t source, const uint8_t byte_index,
return (source >> (EIGHTBYTE_BIT - ((byte_index + 1) * CHAR_BIT))) & 0xFF;
}
-uint64_t get_bit_field(uint64_t source, const uint16_t offset,
+uint64_t eightbyte_get_bit_field(uint64_t source, const uint16_t offset,
const uint16_t bit_count, const bool data_is_big_endian) {
int startByte = offset / CHAR_BIT;
int endByte = (offset + bit_count - 1) / CHAR_BIT;
diff --git a/src/bitfield/8byte.h b/src/bitfield/8byte.h
index 0abc1f07..194007c8 100644
--- a/src/bitfield/8byte.h
+++ b/src/bitfield/8byte.h
@@ -36,7 +36,7 @@ extern "C" {
*
* Returns the value of the requested bit field, right aligned in a uint64_t.
*/
-uint64_t get_bit_field(uint64_t source, const uint16_t offset,
+uint64_t eightbyte_get_bit_field(uint64_t source, const uint16_t offset,
const uint16_t bit_count, const bool data_is_big_endian);
/* Public: Return a single nibble from the payload, with range checking.
@@ -50,7 +50,7 @@ uint64_t get_bit_field(uint64_t source, const uint16_t offset,
* Returns the retreived nibble, right aligned in a uint8_t.
*/
uint8_t eightbyte_get_nibble(const uint64_t source, const uint8_t nibble_index,
- const bool data_is_big_endian);
+ const bool data_is_big_endian);
/* Public: Return a single byte from the payload, with range checking.
*
@@ -62,7 +62,7 @@ uint8_t eightbyte_get_nibble(const uint64_t source, const uint8_t nibble_index,
* Returns the retreived byte.
*/
uint8_t eightbyte_get_byte(const uint64_t source, const uint8_t byte_index,
- const bool data_is_big_endian);
+ const bool data_is_big_endian);
/* Public: Set the bit field in the given data array to the new value.
*
@@ -74,8 +74,8 @@ uint8_t eightbyte_get_byte(const uint64_t source, const uint8_t byte_index,
* Returns true if the bit_count is enough to fully represent the value, and
* false if it will not fit.
*/
-bool set_bit_field(uint64_t* destination, uint64_t value, const uint16_t offset,
- const uint16_t bit_count);
+bool eightbyte_set_bit_field(uint64_t* destination, uint64_t value,
+ const uint16_t offset, const uint16_t bit_count);
/* Private: Determine the index of the last bit used.
*/
diff --git a/src/canutil/read.c b/src/canutil/read.c
index fddf75e3..4864a60f 100644
--- a/src/canutil/read.c
+++ b/src/canutil/read.c
@@ -2,15 +2,21 @@
#include <bitfield/bitfield.h>
#include <bitfield/8byte.h>
-float bitfield_parse_float(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
+float eightbyte_parse_float(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
float factor, float offset) {
- uint64_t raw = get_bit_field(data, bit_offset,
- bit_size, true);
+ uint64_t raw = eightbyte_get_bit_field(data, bit_offset, bit_size, true);
return raw * factor + offset;
}
-bool bitfield_parse_bool(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
+bool eightbyte_parse_bool(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
float factor, float offset) {
- float value = bitfield_parse_float(data, bit_offset, bit_size, factor, 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 data[], const uint16_t size,
+ const uint8_t bit_offset, const uint8_t bit_size, const float factor,
+ const float offset) {
+ //TODO
+ return 0;
+}
diff --git a/src/canutil/read.h b/src/canutil/read.h
index 865bb278..bf6c0ade 100644
--- a/src/canutil/read.h
+++ b/src/canutil/read.h
@@ -20,8 +20,12 @@ extern "C" {
*
* Returns the decoded and transformed value of the signal.
*/
-float bitfield_parse_float(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
- float factor, float offset);
+float eightbyte_parse_float(const uint64_t data, const uint8_t bit_offset,
+ const uint8_t bit_size, const float factor, const float offset);
+
+float bitfield_parse_float(const uint8_t data[], const uint16_t size,
+ const uint8_t bit_offset, const uint8_t bit_size, const float factor,
+ const float offset);
/* Public: Parse a CAN signal from a message and interpret it as a boolean.
*
@@ -35,7 +39,7 @@ float bitfield_parse_float(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
*
* Returns false if the value was 0, otherwise true.
*/
-bool bitfield_parse_bool(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
+bool eightbyte_parse_bool(uint64_t data, uint8_t bit_offset, uint8_t bit_size,
float factor, float offset);
#ifdef __cplusplus
diff --git a/src/canutil/write.c b/src/canutil/write.c
index 12c8fa28..09e6caa3 100644
--- a/src/canutil/write.c
+++ b/src/canutil/write.c
@@ -2,11 +2,13 @@
#include <bitfield/bitfield.h>
#include <bitfield/8byte.h>
-uint64_t bitfield_encode_float(float value, uint8_t bit_offset, uint8_t bit_size,
+uint64_t eightbyte_encode_float(float value, uint8_t bit_offset, uint8_t bit_size,
float factor, float offset) {
float raw = (value - offset) / factor;
if(raw > 0) {
// round up to avoid losing precision when we cast to an int
+ // TODO do we need a way to encode an int back to a signal without any
+ // rounding?
raw += 0.5;
}
uint64_t result = 0;
@@ -16,7 +18,13 @@ uint64_t bitfield_encode_float(float value, uint8_t bit_offset, uint8_t bit_size
return result;
}
-uint64_t bitfield_encode_bool(const bool value, const uint8_t bit_offset,
+uint64_t eightbyte_encode_bool(const bool value, const uint8_t bit_offset,
const uint8_t bit_size) {
- return bitfield_encode_float(value, bit_offset, bit_size, 1.0, 0);
+ return eightbyte_encode_float(value, bit_offset, bit_size, 1.0, 0);
+}
+
+bool bitfield_encode_float(float value, uint8_t bit_offset,
+ uint8_t bit_size, float factor, float offset, uint8_t destination[]) {
+ // TODO
+ return 0;
}
diff --git a/src/canutil/write.h b/src/canutil/write.h
index f117a06c..8fd18cdb 100644
--- a/src/canutil/write.h
+++ b/src/canutil/write.h
@@ -14,8 +14,8 @@ extern "C" {
* value - the floating point value to encode.
* bit_offset - the starting point for the encoded bits in the returned value.
* bit_size - The max width of the field in the resulting bit array. If bit_size
- * isn't big enough to store the fixed point version of the value, the bitfeld
- * will *not* be set. TODO some error reporting would be nice.
+ * isn't big enough to store the fixed point version of the value, the
+ * bitfeld will *not* be set. TODO some error reporting would be nice.
* factor - a factor used to transform from floating to fixed point before
* encoding. Use 1.0 for no factor.
* offset - an offset used to transform from floating to fixed point before
@@ -23,20 +23,24 @@ extern "C" {
*
* Returns a big-endian uint64_t with the value encoded as a bitfield.
*/
-uint64_t bitfield_encode_float(float value, uint8_t bit_offset, uint8_t bit_size,
- float factor, float offset);
+uint64_t eightbyte_encode_float(float value, uint8_t bit_offset,
+ uint8_t bit_size, float factor, float offset);
+
+bool bitfield_encode_float(float value, uint8_t bit_offset,
+ uint8_t bit_size, float factor, float offset, uint8_t destination[]);
/* Public: Encode a boolean into fixed bit width field in a bit array.
*
* value - the boolean value to encode - true will be 1, false will be 0.
* bit_offset - the starting point for the encoded bits in the returned value.
* bit_size - The max width of the field in the resulting bit array. If bit_size
- * isn't big enough to store the fixed point version of the value, the bitfeld
- * will *not* be set. TODO some error reporting would be nice.
+ * isn't big enough to store the fixed point version of the value, the
+ * bitfeld will *not* be set. TODO some error reporting would be nice.
*
* Returns a big-endian uint64_t with the value encoded as a bitfield.
*/
-uint64_t bitfield_encode_bool(const bool value, const uint8_t bit_offset, const uint8_t bit_size);
+uint64_t eightbyte_encode_bool(const bool value, const uint8_t bit_offset,
+ const uint8_t bit_size);
#ifdef __cplusplus
}