X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fanalog.c;h=a8ca3bce650424165227546b534924081dfbef3c;hb=cdc311957b6c1fbe68a88ed3a44fefa4a9037605;hp=634e9a674ba8ada7817bd489d68bedbe7853ed59;hpb=962172e4950f3fbc42d5a79cdf63dc179d7513be;p=libsigrok.git diff --git a/src/analog.c b/src/analog.c index 634e9a67..a8ca3bce 100644 --- a/src/analog.c +++ b/src/analog.c @@ -63,8 +63,8 @@ static struct unit_mq_string unit_strings[] = { { SR_UNIT_BOOLEAN, "" }, { SR_UNIT_SECOND, "s" }, { SR_UNIT_SIEMENS, "S" }, - { SR_UNIT_DECIBEL_MW, "dBu" }, - { SR_UNIT_DECIBEL_VOLT, "dBv" }, + { SR_UNIT_DECIBEL_MW, "dBm" }, + { SR_UNIT_DECIBEL_VOLT, "dBV" }, { SR_UNIT_UNITLESS, "" }, { SR_UNIT_DECIBEL_SPL, "dB" }, { SR_UNIT_CONCENTRATION, "ppm" }, @@ -156,14 +156,14 @@ SR_PRIV int sr_analog_init(struct sr_datafeed_analog *analog, /** * Convert an analog datafeed payload to an array of floats. * + * Sufficient memory for outbuf must have been pre-allocated by the caller, + * who is also responsible for freeing it when no longer needed. + * * @param[in] analog The analog payload to convert. Must not be NULL. * analog->data, analog->meaning, and analog->encoding * must not be NULL. * @param[out] outbuf Memory where to store the result. Must not be NULL. * - * Sufficient memory for outbuf must have been pre-allocated by the caller, - * who is also responsible for freeing it when no longer needed. - * * @retval SR_OK Success. * @retval SR_ERR Unsupported encoding. * @retval SR_ERR_ARG Invalid argument. @@ -188,6 +188,7 @@ SR_API int sr_analog_to_float(const struct sr_datafeed_analog *analog, #else bigendian = FALSE; #endif + if (!analog->encoding->is_float) { float offset = analog->encoding->offset.p / (float)analog->encoding->offset.q; float scale = analog->encoding->scale.p / (float)analog->encoding->scale.q; @@ -258,8 +259,8 @@ SR_API int sr_analog_to_float(const struct sr_datafeed_analog *analog, } break; default: - sr_err("Unsupported unit size '%d' for analog-to-float conversion.", - analog->encoding->unitsize); + sr_err("Unsupported unit size '%d' for analog-to-float" + " conversion.", analog->encoding->unitsize); return SR_ERR; } return SR_OK; @@ -307,33 +308,37 @@ SR_API const char *sr_analog_si_prefix(float *value, int *digits) { #define NEG_PREFIX_COUNT 5 /* number of prefixes below unity */ #define POS_PREFIX_COUNT (int)(ARRAY_SIZE(prefixes) - NEG_PREFIX_COUNT - 1) - static const char *prefixes[] = { "f","p","n","µ","m","","k","M","G","T" }; + static const char *prefixes[] = { "f", "p", "n", "µ", "m", "", "k", "M", "G", "T" }; - if (value == NULL || digits == NULL || isnan(*value)) + if (!value || !digits || isnan(*value)) return prefixes[NEG_PREFIX_COUNT]; float logval = log10f(fabsf(*value)); int prefix = (logval / 3) - (logval < 1); - if (prefix < -NEG_PREFIX_COUNT) prefix = -NEG_PREFIX_COUNT; - if (3 * prefix < -*digits) prefix = (-*digits + 2 * (*digits < 0)) / 3; - if (prefix > POS_PREFIX_COUNT) prefix = POS_PREFIX_COUNT; + if (prefix < -NEG_PREFIX_COUNT) + prefix = -NEG_PREFIX_COUNT; + if (3 * prefix < -*digits) + prefix = (-*digits + 2 * (*digits < 0)) / 3; + if (prefix > POS_PREFIX_COUNT) + prefix = POS_PREFIX_COUNT; *value *= powf(10, -3 * prefix); *digits += 3 * prefix; + return prefixes[prefix + NEG_PREFIX_COUNT]; } /** * Convert the unit/MQ/MQ flags in the analog struct to a string. * + * The string is allocated by the function and must be freed by the caller + * after use by calling g_free(). + * * @param[in] analog Struct containing the unit, MQ and MQ flags. * Must not be NULL. analog->meaning must not be NULL. * @param[out] result Pointer to store result. Must not be NULL. * - * The string is allocated by the function and must be freed by the caller - * after use by calling g_free(). - * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid argument. * @@ -432,15 +437,15 @@ static void mult_uint64(struct sr_uint128_t *res, const uint64_t a, #endif /** - * Compare two sr_rational for equality + * Compare two sr_rational for equality. * - * @param[in] a First value - * @param[in] b Second value + * The values are compared for numerical equality, i.e. 2/10 == 1/5. * - * The values are compared for numerical equality, i.e. 2/10 == 1/5 + * @param[in] a First value. + * @param[in] b Second value. * - * @retval 1 if both values are equal - * @retval 0 otherwise + * @retval 1 if both values are equal. + * @retval 0 Otherwise. * * @since 0.5.0 */ @@ -466,20 +471,20 @@ SR_API int sr_rational_eq(const struct sr_rational *a, const struct sr_rational } /** - * Multiply two sr_rational - * - * @param[in] a First value - * @param[in] b Second value - * @param[out] res Result + * Multiply two sr_rational. * * The resulting nominator/denominator are reduced if the result would not fit * otherwise. If the resulting nominator/denominator are relatively prime, * this may not be possible. * - * It is save to use the same variable for result and input values + * It is safe to use the same variable for result and input values. + * + * @param[in] a First value. + * @param[in] b Second value. + * @param[out] res Result. * * @retval SR_OK Success. - * @retval SR_ERR_ARG Resulting value to large + * @retval SR_ERR_ARG Resulting value too large. * * @since 0.5.0 */ @@ -519,10 +524,12 @@ SR_API int sr_rational_mult(struct sr_rational *res, const struct sr_rational *a while (!(p.low & 1) && !(q.low & 1)) { p.low /= 2; - if (p.high & 1) p.low |= (1ll << 63); + if (p.high & 1) + p.low |= (1ll << 63); p.high >>= 1; q.low /= 2; - if (q.high & 1) q.low |= (1ll << 63); + if (q.high & 1) + q.low |= (1ll << 63); q.high >>= 1; } @@ -541,22 +548,22 @@ SR_API int sr_rational_mult(struct sr_rational *res, const struct sr_rational *a } /** - * Divide rational a by rational b - * - * @param[in] num numerator - * @param[in] div divisor - * @param[out] res Result + * Divide rational a by rational b. * * The resulting nominator/denominator are reduced if the result would not fit * otherwise. If the resulting nominator/denominator are relatively prime, * this may not be possible. * - * It is save to use the same variable for result and input values + * It is safe to use the same variable for result and input values. + * + * @param[in] num Numerator. + * @param[in] div Divisor. + * @param[out] res Result. * * @retval SR_OK Success. - * @retval SR_ERR_ARG Division by zero - * @retval SR_ERR_ARG Denominator of divisor to large - * @retval SR_ERR_ARG Resulting value to large + * @retval SR_ERR_ARG Division by zero. + * @retval SR_ERR_ARG Denominator of divisor too large. + * @retval SR_ERR_ARG Resulting value too large. * * @since 0.5.0 */