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);
}
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;
*
* 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.
* 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.
*
* 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.
*
* 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.
*/
#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;
+}
*
* 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.
*
*
* 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
#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;
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;
}
* 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
*
* 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
}
START_TEST (test_one_bit_not_swapped)
{
uint64_t data = 0x80;
- uint64_t result = get_bit_field(data, 0, 1, false);
+ uint64_t result = eightbyte_get_bit_field(data, 0, 1, false);
fail_if(result == 1);
}
END_TEST
START_TEST (test_one_bit)
{
uint64_t data = 0x8000000000000000;
- uint64_t result = get_bit_field(data, 0, 1, false);
+ uint64_t result = eightbyte_get_bit_field(data, 0, 1, false);
fail_unless(result == 0x1,
"First bit in 0x%llx was 0x%llx instead of 0x1", data, result);
}
START_TEST (test_32_bit_parse)
{
uint64_t data = 0x0402574d555a0401;
- uint64_t result = get_bit_field(data, 16, 32, false);
+ uint64_t result = eightbyte_get_bit_field(data, 16, 32, false);
uint64_t expectedValue = 0x574d555a;
fail_unless(result == expectedValue,
"Field retrieved in 0x%llx was 0x%llx instead of 0x%llx", data,
START_TEST (test_16_bit_parse)
{
uint64_t data = 0xF34DFCFF00000000;
- uint64_t result = get_bit_field(data, 16, 16, false);
+ uint64_t result = eightbyte_get_bit_field(data, 16, 16, false);
uint64_t expectedValue = 0xFCFF;
fail_unless(result == expectedValue,
"Field retrieved in 0x%llx was 0x%llx instead of 0x%llx", data,
START_TEST (test_one_byte)
{
uint64_t data = 0xFA00000000000000;
- uint64_t result = get_bit_field(data, 0, 4, false);
+ uint64_t result = eightbyte_get_bit_field(data, 0, 4, false);
fail_unless(result == 0xF,
"First nibble in 0x%llx was 0x%llx instead of 0xF", data, result);
- result = get_bit_field(data, 4, 4, false);
+ result = eightbyte_get_bit_field(data, 4, 4, false);
fail_unless(result == 0xA,
"Second nibble in 0x%llx was 0x%llx instead of 0xA", data, result);
- result = get_bit_field(data, 0, 8, false);
+ result = eightbyte_get_bit_field(data, 0, 8, false);
fail_unless(result == 0xFA,
"All bits in 0x%llx were 0x%llx instead of 0x%llx", data, result, data);
}
START_TEST (test_multi_byte)
{
uint64_t data = 0x12FA000000000000;
- uint64_t result = get_bit_field(data, 0, 4, false);
+ uint64_t result = eightbyte_get_bit_field(data, 0, 4, false);
fail_unless(result == 0x1,
"First 4 bits in 0x%llx was 0x%llx instead of 0xF", (data >> 60) & 0xF,
result);
- result = get_bit_field(data, 4, 4, false);
+ result = eightbyte_get_bit_field(data, 4, 4, false);
fail_unless(result == 0x2,
"Second 4 bits in 0x%llx was 0x%llx instead of 0xA", (data >> 56) & 0xF,
result);
- result = get_bit_field(data, 8, 4, false);
+ result = eightbyte_get_bit_field(data, 8, 4, false);
fail_unless(result == 0xF,
"First 4 bits in 0x%llx was 0x%llx instead of 0x1", (data >> 52) & 0xF,
result);
- result = get_bit_field(data, 12, 4, false);
+ result = eightbyte_get_bit_field(data, 12, 4, false);
fail_unless(result == 0xA,
"Second 4 bits in 0x%llx was 0x%llx instead of 0x2", (data >> 48) % 0xF,
result);
START_TEST (test_get_multi_byte)
{
uint64_t data = 0x12FA000000000000;
- uint64_t result = get_bit_field(data, 0, 9, false);
+ uint64_t result = eightbyte_get_bit_field(data, 0, 9, false);
ck_assert_int_eq(result, 0x25);
}
END_TEST
START_TEST (test_get_off_byte_boundary)
{
uint64_t data = 0x000012FA00000000;
- uint64_t result = get_bit_field(data, 12, 8, false);
+ uint64_t result = eightbyte_get_bit_field(data, 12, 8, false);
ck_assert_int_eq(result, 0x01);
} END_TEST
{
uint64_t data = 0;
fail_unless(set_bit_field(&data, 1, 0, 1));
- uint64_t result = get_bit_field(data, 0, 1, false);
+ uint64_t result = eightbyte_get_bit_field(data, 0, 1, false);
ck_assert_int_eq(result, 0x1);
data = 0;
fail_unless(set_bit_field(&data, 1, 1, 1));
- result = get_bit_field(data, 1, 1, false);
+ result = eightbyte_get_bit_field(data, 1, 1, false);
ck_assert_int_eq(result, 0x1);
data = 0;
fail_unless(set_bit_field(&data, 0xf, 3, 4));
- result = get_bit_field(data, 3, 4, false);
+ result = eightbyte_get_bit_field(data, 3, 4, false);
ck_assert_int_eq(result, 0xf);
}
END_TEST
{
uint64_t data = 0xFFFC4DF300000000;
fail_unless(set_bit_field(&data, 0x4fc8, 16, 16));
- uint64_t result = get_bit_field(data, 16, 16, false);
+ uint64_t result = eightbyte_get_bit_field(data, 16, 16, false);
fail_unless(result == 0x4fc8,
"Field retrieved in 0x%llx was 0x%llx instead of 0x%x", data, result,
0xc84f);
{
uint64_t data = 0xFFFC4DF300000000;
fail_unless(set_bit_field(&data, 0x12, 12, 8));
- uint64_t result = get_bit_field(data, 12, 12, false);
+ uint64_t result = eightbyte_get_bit_field(data, 12, 12, false);
ck_assert_int_eq(result,0x12d);
}
END_TEST
{
uint64_t data = 0xFFFC4DF300000000LLU;
fail_unless(set_bit_field(&data, 0x12, 11, 5));
- uint64_t result = get_bit_field(data, 11, 5, false);
+ uint64_t result = eightbyte_get_bit_field(data, 11, 5, false);
fail_unless(result == 0x12,
"Field set in 0x%llx%llx%llx%llx was 0x%llx instead of 0x%llx", data, result,
0x12);
data = 0xFFFC4DF300000000LLU;
fail_unless(set_bit_field(&data, 0x2, 11, 5));
- result = get_bit_field(data, 11, 5, false);
+ result = eightbyte_get_bit_field(data, 11, 5, false);
fail_unless(result == 0x2,
"Field set in 0x%llx%llx%llx%llx was 0x%llx instead of 0x%llx", data, result,
0x2);
START_TEST (test_parse_float)
{
- float result = bitfield_parse_float(BIG_ENDIAN_TEST_DATA, 2, 4, 1001.0,
+ float result = eightbyte_parse_float(BIG_ENDIAN_TEST_DATA, 2, 4, 1001.0,
-30000.0);
float correctResult = 0xA * 1001.0 - 30000.0;
fail_unless(result == correctResult,
START_TEST (test_parse_bool)
{
- float result = bitfield_parse_bool(BIG_ENDIAN_TEST_DATA, 0, 1, 1.0, 0);
+ float result = eightbyte_parse_bool(BIG_ENDIAN_TEST_DATA, 0, 1, 1.0, 0);
float correctResult = true;
fail_unless(result == correctResult,
"parse is incorrect: %d but should be %d", result, correctResult);
START_TEST (test_encode_can_signal)
{
- uint64_t value = bitfield_encode_float(0, 1, 3, 1, 0);
+ uint64_t value = eightbyte_encode_float(0, 1, 3, 1, 0);
ck_assert_int_eq(value, 0);
- value = bitfield_encode_float(1, 1, 3, 1, 0);
+ value = eightbyte_encode_float(1, 1, 3, 1, 0);
ck_assert_int_eq(value, 0x1000000000000000LLU);
}
END_TEST
START_TEST (test_encode_can_signal_rounding_precision)
{
- uint64_t value = bitfield_encode_float(50, 2, 19, 0.001, 0);
+ uint64_t value = eightbyte_encode_float(50, 2, 19, 0.001, 0);
ck_assert_int_eq(value, 0x061a800000000000LLU);
}
END_TEST
START_TEST (test_encode_bool)
{
- uint64_t value = bitfield_encode_bool(true, 1, 3);
+ uint64_t value = eightbyte_encode_bool(true, 1, 3);
ck_assert_int_eq(value, 0x1000000000000000LLU);
- value = bitfield_encode_bool(false, 1, 3);
+ value = eightbyte_encode_bool(false, 1, 3);
ck_assert_int_eq(value, 0x0000000000000000LLU);
}
END_TEST