mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 11:36:00 +00:00
Merge "Fix HCI parser and packetizer"
This commit is contained in:
@@ -105,15 +105,12 @@ void H4Protocol::SendDataToPacketizer(uint8_t* buffer, size_t length) {
|
||||
buffer_offset += 1;
|
||||
} else {
|
||||
bool packet_ready = hci_packetizer_.OnDataReady(
|
||||
hci_packet_type_, input_buffer, buffer_offset);
|
||||
hci_packet_type_, input_buffer, &buffer_offset);
|
||||
if (packet_ready) {
|
||||
// Call packet callback and move offset.
|
||||
buffer_offset += OnPacketReady(hci_packetizer_.GetPacket());
|
||||
// Call packet callback.
|
||||
OnPacketReady(hci_packetizer_.GetPacket());
|
||||
// Get ready for the next type byte.
|
||||
hci_packet_type_ = PacketType::UNKNOWN;
|
||||
} else {
|
||||
// The data was consumed, but there wasn't a packet.
|
||||
buffer_offset = input_buffer.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,9 +51,10 @@ const std::vector<uint8_t>& HciPacketizer::GetPacket() const { return packet_; }
|
||||
|
||||
bool HciPacketizer::OnDataReady(PacketType packet_type,
|
||||
const std::vector<uint8_t>& buffer,
|
||||
size_t offset) {
|
||||
size_t* offset) {
|
||||
bool packet_completed = false;
|
||||
size_t bytes_available = buffer.size() - offset;
|
||||
size_t bytes_available = buffer.size() - *offset;
|
||||
|
||||
switch (state_) {
|
||||
case HCI_HEADER: {
|
||||
size_t header_size =
|
||||
@@ -62,18 +63,20 @@ bool HciPacketizer::OnDataReady(PacketType packet_type,
|
||||
bytes_remaining_ = header_size;
|
||||
packet_.clear();
|
||||
}
|
||||
|
||||
size_t bytes_to_copy = std::min(bytes_remaining_, bytes_available);
|
||||
packet_.insert(packet_.end(), buffer.begin() + offset,
|
||||
buffer.begin() + offset + bytes_to_copy);
|
||||
packet_.insert(packet_.end(), buffer.begin() + *offset,
|
||||
buffer.begin() + *offset + bytes_to_copy);
|
||||
bytes_remaining_ -= bytes_to_copy;
|
||||
bytes_available -= bytes_to_copy;
|
||||
*offset += bytes_to_copy;
|
||||
|
||||
if (bytes_remaining_ == 0) {
|
||||
bytes_remaining_ = HciGetPacketLengthForType(packet_type, packet_);
|
||||
if (bytes_remaining_ > 0) {
|
||||
state_ = HCI_PAYLOAD;
|
||||
if (bytes_available > 0) {
|
||||
packet_completed =
|
||||
OnDataReady(packet_type, buffer, offset + bytes_to_copy);
|
||||
packet_completed = OnDataReady(packet_type, buffer, offset);
|
||||
}
|
||||
} else {
|
||||
packet_completed = true;
|
||||
@@ -84,9 +87,10 @@ bool HciPacketizer::OnDataReady(PacketType packet_type,
|
||||
|
||||
case HCI_PAYLOAD: {
|
||||
size_t bytes_to_copy = std::min(bytes_remaining_, bytes_available);
|
||||
packet_.insert(packet_.end(), buffer.begin() + offset,
|
||||
buffer.begin() + offset + bytes_to_copy);
|
||||
packet_.insert(packet_.end(), buffer.begin() + *offset,
|
||||
buffer.begin() + *offset + bytes_to_copy);
|
||||
bytes_remaining_ -= bytes_to_copy;
|
||||
*offset += bytes_to_copy;
|
||||
if (bytes_remaining_ == 0) {
|
||||
state_ = HCI_HEADER;
|
||||
packet_completed = true;
|
||||
@@ -94,6 +98,7 @@ bool HciPacketizer::OnDataReady(PacketType packet_type,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return packet_completed;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ class HciPacketizer {
|
||||
public:
|
||||
HciPacketizer() = default;
|
||||
bool OnDataReady(PacketType packet_type, const std::vector<uint8_t>& data,
|
||||
size_t offset);
|
||||
size_t* offset);
|
||||
const std::vector<uint8_t>& GetPacket() const;
|
||||
|
||||
protected:
|
||||
|
||||
Reference in New Issue
Block a user