I'm trying to implement this Bluetooth mesh characteristic:
<!--
Copyright 2017 Bluetooth SIG, Inc. All rights reserved.
-->
<Characteristic xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schemas.bluetooth.org/Documents/characteristic.xsd" name="Illuminance" type="org.bluetooth.characteristic.illuminance" uuid="2AFB" last-modified="2017-07-11" approved="Yes">
<InformativeText>
<Abstract>
The Illuminance characteristic is used to represent a measure of illuminance in units of lux.
</Abstract>
</InformativeText>
<Value>
<Field name="Illuminance">
<InformativeText>Unit is lux with a resolution of 0.01.</InformativeText>
<Format>uint24</Format>
<Unit>org.bluetooth.unit.lux</Unit>
<Minimum>0</Minimum>
<Maximum>167772.14</Maximum>
<DecimalExponent>-2</DecimalExponent>
<BinaryExponent>0</BinaryExponent>
<Multipler>1</Multipler>
<Description>
A value of 0xFFFFFF represents 'value is not known'. All other values are Prohibited.
</Description>
</Field>
</Value>
</Characteristic>
https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Specifications/Mesh/Xml/Characteristics/org.bluetooth.characteristic.illuminance.xml. This characteristic represents a lux value in 3 bytes.
But I don't know how I would be able to convert a value like 0x123456 to the real floating-point number. It doesn't seem that the standard IEEE 754 standard is used. I also don't know what they mean with DecimalExponent
and BinaryExponent
.
Could anyone help me out? Kind regards, Daan
There is no floating point in the page you link to. It uses
-2
withDecimalExponent
merely to specify that a 24-bit integer value that in plain binary would be some number x from 0 to 16,777,214 (with 16,777,215 reserved for “not known”) represents a value of x•10−2 lux, ranging from 0.00 lux to 167,772.14 lux. This is fixed point, not floating point; the point is fixed at the position two digits to the left of where it would be in the plain binary integer representation.