float adt7310_read_float(adt7310_t *dev) { int16_t raw = adt7310_read_raw(dev); if (raw == INT16_MIN) { return (0.0f / 0.0f); /* return NaN */ } if (!dev->high_res) { /* filter out the flag bits */ raw &= ADT7310_REG_VALUE_MASK_13BIT; } return (((float) raw) * ADT7310_TEMPERATURE_LSB_FLOAT); }
int32_t adt7310_read(adt7310_t *dev) { int16_t raw = adt7310_read_raw(dev); if (raw == INT16_MIN) { return INT32_MIN; } if (!dev->high_res) { /* filter out the flag bits */ raw &= ADT7310_REG_VALUE_MASK_13BIT; } return ((((int32_t)raw) * 1000) >> ADT7310_VALUE_FRAC_BITS); }
float adt7310_read_float(const adt7310_t *dev) { int16_t raw = adt7310_read_raw(dev); if (raw == INT16_MIN) { /* cppcheck-suppress duplicateExpression * (reason: we want to create a NaN here) */ return (0.0f / 0.0f); /* return NaN */ } if (!dev->high_res) { /* filter out the flag bits */ raw &= ADT7310_REG_VALUE_MASK_13BIT; } return (((float) raw) * ADT7310_TEMPERATURE_LSB_FLOAT); }
int test_adt7310_sample_print(adt7310_t *dev) { int16_t raw; float celsius_float; int32_t millicelsius; raw = adt7310_read_raw(dev); if (raw == INT16_MIN) { puts("Reading temperature data (adt7310_read_raw)... "); puts("[Failed]\n"); return 1; } millicelsius = adt7310_read(dev); if (millicelsius == INT32_MIN) { puts("Reading temperature data (adt7310_read)... "); puts("[Failed]\n"); return 1; }; celsius_float = adt7310_read_float(dev); if (isnan(celsius_float)) { puts("Reading temperature data (adt7310_read_float)... "); puts("[Failed]\n"); return 1; }; /* Several platforms usually build with nano.specs, (without float printf) */ /* Split value into two integer parts for printing. */ float integral = 0; float fractional; fractional = modff(celsius_float, &integral); printf("0x%04" PRIx16 " %7" PRId32 " mC %4d.%07u C)\n", raw, millicelsius, (int)integral, abs(fractional * 10000000.f)); return 0; }