19#include "lib/stdcompat/utility.h"
20#include "pw_bluetooth/hci_h4.emb.h"
21#include "pw_function/function.h"
22#include "pw_span/span.h"
35 using ReleaseFn =
Function<void(
const uint8_t*)>;
40 ReleaseFn&& release_fn)
42 hci_offset_(hci_offset),
43 release_fn_(std::move(release_fn)) {}
51 buffer_ = other.buffer_;
52 hci_offset_ = other.hci_offset_;
53 release_fn_ = std::move(other.release_fn_);
60 if (!buffer_.empty() && HasReleaseFn()) {
61 release_fn_(buffer_.data());
67 emboss::H4PacketType
GetH4Type()
const {
return DoGetH4Type(); }
70 void SetH4Type(emboss::H4PacketType type) { DoSetH4Type(type); }
75 return buffer_.empty() ? buffer_ : buffer_.subspan(hci_offset_);
78 return buffer_.empty() ? buffer_ : buffer_.subspan(hci_offset_);
81 bool HasReleaseFn() {
return bool{release_fn_}; }
85 ReleaseFn ResetAndReturnReleaseFn() {
86 ReleaseFn fn = std::move(release_fn_);
92 static constexpr std::uint8_t kH4PacketIndicatorSize = 1;
94 constexpr span<uint8_t> buffer() {
return buffer_; }
95 constexpr span<const uint8_t> buffer()
const {
return buffer_; }
98 virtual emboss::H4PacketType DoGetH4Type()
const = 0;
99 virtual void DoSetH4Type(emboss::H4PacketType) = 0;
102 buffer_ = span<uint8_t>();
104 release_fn_ = ReleaseFn{};
107 span<uint8_t> buffer_;
108 size_t hci_offset_ = 0;
109 ReleaseFn release_fn_{};
119 ReleaseFn&& release_fn =
nullptr)
125 h4_span, kH4PacketIndicatorSize, std::move(release_fn)),
126 h4_type_(emboss::H4PacketType{h4_span[0]}) {}
132 emboss::H4PacketType DoGetH4Type()
const override {
return h4_type_; }
133 void DoSetH4Type(emboss::H4PacketType h4_type)
override {
137 emboss::H4PacketType h4_type_ = emboss::H4PacketType::UNKNOWN;
147 h4_span, kH4PacketIndicatorSize, std::move(release_fn)) {}
151 ReleaseFn&& release_fn =
nullptr)
160 emboss::H4PacketType DoGetH4Type()
const override {
162 return !h4_span.empty() ? emboss::H4PacketType(h4_span[0])
163 : emboss::H4PacketType::UNKNOWN;
166 void DoSetH4Type(emboss::H4PacketType h4_type)
override {
168 if (!h4_span.empty()) {
169 h4_span.data()[0] = cpp23::to_underlying(h4_type);
Definition: h4_packet.h:33
H4PacketWithH4 is an H4Packet backed by an H4 buffer.
Definition: h4_packet.h:141
H4PacketWithHci is an H4Packet backed by an HCI buffer.
Definition: h4_packet.h:113
Definition: span_impl.h:235
constexpr span< uint8_t > GetHciSpan()
Definition: h4_packet.h:74
emboss::H4PacketType GetH4Type() const
Definition: h4_packet.h:67
void SetH4Type(emboss::H4PacketType type)
Sets HCI packet type indicator.
Definition: h4_packet.h:70
fit::function_impl< function_internal::config::kInlineCallableSize, !function_internal::config::kEnableDynamicAllocation, FunctionType, PW_FUNCTION_DEFAULT_ALLOCATOR_TYPE > Function
Definition: function.h:73
Lightweight proxy for augmenting Bluetooth functionality.
Definition: h4_packet.h:24