diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bitfield/8byte.c | 4 | ||||
-rw-r--r-- | src/bitfield/8byte.h | 10 | ||||
-rw-r--r-- | src/canutil/read.c | 16 | ||||
-rw-r--r-- | src/canutil/read.h | 10 | ||||
-rw-r--r-- | src/canutil/write.c | 14 | ||||
-rw-r--r-- | src/canutil/write.h | 18 |
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 } |