[bluetooth.generic] Preserve decimals when writing integer fields with a DecimalExponent - #21528
Open
vkolotov wants to merge 1 commit into
Open
[bluetooth.generic] Preserve decimals when writing integer fields with a DecimalExponent#21528vkolotov wants to merge 1 commit into
vkolotov wants to merge 1 commit into
Conversation
…h a DecimalExponent A GATT integer field can carry a DecimalExponent, which makes it represent a fractional real-world value: the Temperature characteristic (0x2A6E), for example, is a sint16 in units of 0.01 degrees C. When writing such a field, the state was converted with DecimalType#longValue(), which truncates the fraction before the field multiplier is applied. Writing 21.5 degrees therefore serialized to a raw 2100 (21.00 degrees) instead of 2150, silently losing everything after the decimal point. Use DecimalType#doubleValue() instead. GattRequest#setField(String, Double) divides by the field multiplier before encoding, so the fractional part survives into the raw integer value that is written to the device. Signed-off-by: Vlad Kolotoff <vkolotoff@pm.me>
vkolotov
marked this pull request as ready for review
August 28, 2026 23:12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A GATT integer field can carry a DecimalExponent, which makes it represent a fractional real-world value. The Temperature characteristic (0x2A6E) is a sint16 in units of 0.01 degrees C.
When writing such a field, the state was converted with
DecimalType#longValue(), which truncates the fraction before the field multiplier is applied. Writing 21.5 degrees serialized to a raw 2100 (21.00 degrees) instead of 2150, so everything after the decimal point was silently lost.The fix is to use
DecimalType#doubleValue()instead.GattRequest#setField(String, Double)divides by the field multiplier before encoding, so the fractional part survives into the raw integer written to the device.Added a regression test that serializes 21.5 degrees through the Temperature characteristic.