bb driver impl (not tested)

This commit is contained in:
2026-08-14 00:51:19 -05:00
parent 2456b83c0d
commit f85dee5d7a
4 changed files with 372 additions and 24 deletions
+16 -8
View File
@@ -1,6 +1,7 @@
#include "bbnow_pub.hpp"
#include <cassert>
#include <esp_log.h>
#include <utility>
const static char TAG[] = "bbnow_pub";
@@ -49,12 +50,15 @@ size_t BBNowPubPacket::serialize_into(std::vector<uint8_t>& buf) const {
switch (this->packet_type) {
case BBNowPubPacketType::NONE:
break;
case BBNowPubPacketType::DISCOVERY:
static_assert(sizeof(this->packet_data.discovery) == 2, "expect discovery data to be 2 bytes");
uint16_t data = static_cast<uint16_t>(this->packet_data.discovery.expantion_type);
case BBNowPubPacketType::DISCOVERY: {
const auto& discovery =
std::get<BlkBoxNowPubDiscoveryData>(this->packet_data);
static_assert(sizeof(discovery) == 2, "expect discovery data to be 2 bytes");
uint16_t data = static_cast<uint16_t>(discovery.expantion_type);
buf.push_back((data >> 8) & 0xFF);
buf.push_back((data >> 0) & 0xFF);
break;
}
}
assert(buf.size() - initial_size == size);
@@ -88,7 +92,7 @@ std::optional<BBNowPubPacket> BBNowPubPacket::deserialize(std::span<const uint8_
static_assert(sizeof(BBNowPubPacketType) == 2, "expect packet type to be 2 bytes");
uint16_t packet_type = ((uint16_t)bytes[4] << 8) | ((uint16_t)bytes[5]);
packet.packet_type = static_cast<BBNowPubPacketType>(packet_type);
if (packet.packet_type > BBNowPubPacketType::MAX) {
if (packet.packet_type == BBNowPubPacketType::NONE) {
ESP_LOGW(TAG, "BlkBoxPubPacketType was NONE! discarding");
return std::nullopt;
}
@@ -111,14 +115,18 @@ std::optional<BBNowPubPacket> BBNowPubPacket::deserialize(std::span<const uint8_
switch (packet.packet_type) {
case BBNowPubPacketType::NONE:
break;
case BBNowPubPacketType::DISCOVERY:
case BBNowPubPacketType::DISCOVERY: {
uint16_t device = ((uint16_t)bytes[6] << 8) | ((uint16_t)bytes[7]);
packet.packet_data.discovery.expantion_type = static_cast<BlkBoxExpantion>(device);
if (packet.packet_data.discovery.expantion_type > BlkBoxExpantion::MAX) {
auto data = BlkBoxNowPubDiscoveryData{
.expantion_type = static_cast<BlkBoxExpantion>(device)
};
if (data.expantion_type > BlkBoxExpantion::MAX) {
ESP_LOGW(TAG, "BlkBoxExpantion not in range! discarding");
return std::nullopt;
}
packet.packet_data = data;
break;
}
}
return packet;
}
@@ -126,6 +134,6 @@ std::optional<BBNowPubPacket> BBNowPubPacket::deserialize(std::span<const uint8_
BBNowPubPacket BBNowPubPacket::new_discovery(BlkBoxNowPubDiscoveryData data) {
BBNowPubPacket packet;
packet.packet_type = BBNowPubPacketType::DISCOVERY;
packet.packet_data.discovery = data;
packet.packet_data = std::move(data);
return packet;
}