33 const float temperature = std::isnan(data.temperature) ? 0.0f : std::clamp(data.temperature, -204.8f, 204.7f);
34 const auto t =
static_cast<int16_t
>(lroundf(
temperature * 10.0f));
35 const uint64_t packet = uint64_t(data.address) << 28 | uint64_t(data.battery_level) << 27 |
36 uint64_t(data.force_update) << 26 | uint64_t((data.channel - 1) & 0b11) << 24 |
37 uint64_t(t & 0x0FFF) << 12 | 0b1111 << 8 | data.humidity;
40 for (int8_t i = NBITS - 1; i >= 0; i--)
41 dst->
item(BIT_HIGH_US, (packet >> i) & 1 ? BIT_ONE_LOW_US : BIT_ZERO_LOW_US);
43 dst->
item(SYNC_HIGH_US, SYNC_LOW_US);
48 src.expect_item(SYNC_HIGH_US, SYNC_LOW_US);
49 if (
src.size() < NBITS * 2)
53 for (uint8_t i = 0; i < NBITS; i++) {
55 if (
src.expect_item(BIT_HIGH_US, BIT_ONE_LOW_US)) {
57 }
else if (!
src.expect_item(BIT_HIGH_US, BIT_ZERO_LOW_US)) {
61 if (((packet >> 8) & 0xF) != 0xF)
63 ESP_LOGV(TAG,
"Nexus packet: 0x%09" PRIX64, packet);
67 .temperature = (
static_cast<int16_t
>((packet >> 8) & 0xFFF0) >> 4) / 10.0f,
68 .
address =
static_cast<uint8_t
>(packet >> 28),
69 .battery_level =
static_cast<bool>((packet >> 27) & 1),
70 .force_update =
static_cast<bool>((packet >> 26) & 1),
71 .channel =
static_cast<uint8_t
>(((packet >> 24) & 0b11) + 1),
72 .humidity =
static_cast<uint8_t
>(packet),