X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=blobdiff_plain;f=src%2Fbinary_helpers.c;h=14196110475e00c34d66bdb32d194587437af307;hp=e1c00dddc47162be18415c2b1594cac63b7daa01;hb=HEAD;hpb=e7fe5bb4974e9c4f8f28ab219fdf4c425c510ec2 diff --git a/src/binary_helpers.c b/src/binary_helpers.c index e1c00ddd..14196110 100644 --- a/src/binary_helpers.c +++ b/src/binary_helpers.c @@ -22,8 +22,8 @@ #include #include "libsigrok-internal.h" -SR_PRIV int bv_get_value(float *out, const struct binary_value_spec *spec, - const void *data, size_t length) +SR_PRIV int bv_get_value_len(float *out, const struct binary_value_spec *spec, + const uint8_t *data, size_t length) { float value; @@ -41,14 +41,12 @@ SR_PRIV int bv_get_value(float *out, const struct binary_value_spec *spec, VALUE_TYPE(BVT_UINT8, read_u8, sizeof(uint8_t)); VALUE_TYPE(BVT_BE_UINT16, read_u16be, sizeof(uint16_t)); + VALUE_TYPE(BVT_BE_UINT24, read_u24be, 3 * sizeof(uint8_t)); VALUE_TYPE(BVT_BE_UINT32, read_u32be, sizeof(uint32_t)); - VALUE_TYPE(BVT_BE_UINT64, read_u64be, sizeof(uint64_t)); - VALUE_TYPE(BVT_BE_FLOAT, read_fltbe, sizeof(float)); VALUE_TYPE(BVT_LE_UINT16, read_u16le, sizeof(uint16_t)); + VALUE_TYPE(BVT_LE_UINT24, read_u24le, 3 * sizeof(uint8_t)); VALUE_TYPE(BVT_LE_UINT32, read_u32le, sizeof(uint32_t)); - VALUE_TYPE(BVT_LE_UINT64, read_u64le, sizeof(uint64_t)); - VALUE_TYPE(BVT_LE_FLOAT, read_fltle, sizeof(float)); default: return SR_ERR_ARG; @@ -56,8 +54,45 @@ SR_PRIV int bv_get_value(float *out, const struct binary_value_spec *spec, #undef VALUE_TYPE - if (spec->scale) - value *= spec->scale; + if (out) + *out = value; + return SR_OK; +} + +SR_PRIV int bv_get_value(float *out, const struct binary_value_spec *spec, + const uint8_t *data) +{ + float value; + const uint8_t *ptr; + + ptr = &data[spec->offset]; + + switch (spec->type) { + case BVT_UINT8: + value = read_u8(ptr); + break; + case BVT_BE_UINT16: + value = read_u16be(ptr); + break; + case BVT_BE_UINT24: + value = read_u24be(ptr); + break; + case BVT_BE_UINT32: + value = read_u32be(ptr); + break; + case BVT_LE_UINT16: + value = read_u16le(ptr); + break; + case BVT_LE_UINT24: + value = read_u24le(ptr); + break; + case BVT_LE_UINT32: + value = read_u32le(ptr); + break; + default: + return SR_ERR_ARG; + } + if (out) *out = value; return SR_OK;