20#include "lib/stdcompat/utility.h"
21#include "pw_allocator/allocator.h"
22#include "pw_bluetooth/hci_h4.emb.h"
23#include "pw_function/function.h"
24#include "pw_result/result.h"
25#include "pw_span/span.h"
38 using ReleaseFn =
Function<void(
const uint8_t*)>;
43 ReleaseFn&& release_fn)
45 hci_offset_(hci_offset),
46 release_fn_(std::move(release_fn)) {}
54 buffer_ = other.buffer_;
55 hci_offset_ = other.hci_offset_;
56 release_fn_ = std::move(other.release_fn_);
63 if (!buffer_.empty() && HasReleaseFn()) {
64 release_fn_(buffer_.data());
70 emboss::H4PacketType
GetH4Type()
const {
return DoGetH4Type(); }
73 void SetH4Type(emboss::H4PacketType type) { DoSetH4Type(type); }
78 return buffer_.empty() ? buffer_ : buffer_.subspan(hci_offset_);
81 return buffer_.empty() ? buffer_ : buffer_.subspan(hci_offset_);
84 bool HasReleaseFn() {
return bool{release_fn_}; }
88 ReleaseFn ResetAndReturnReleaseFn() {
89 ReleaseFn fn = std::move(release_fn_);
95 static constexpr std::uint8_t kH4PacketIndicatorSize = 1;
97 constexpr span<uint8_t> buffer() {
return buffer_; }
98 constexpr span<const uint8_t> buffer()
const {
return buffer_; }
101 virtual emboss::H4PacketType DoGetH4Type()
const = 0;
102 virtual void DoSetH4Type(emboss::H4PacketType) = 0;
105 buffer_ = span<uint8_t>();
107 release_fn_ = ReleaseFn{};
110 span<uint8_t> buffer_;
111 size_t hci_offset_ = 0;
112 ReleaseFn release_fn_{};
118template <
typename T,
typename... Args>
122 uint8_t* owned_buf =
static_cast<uint8_t*
>(
123 allocator.
Allocate(allocator::Layout::Of<uint8_t[]>(src.size())));
124 if (owned_buf ==
nullptr) {
127 std::memcpy(owned_buf, src.data(), src.size());
128 return T(std::forward<Args>(args)...,
130 [&allocator](
const uint8_t* data) {
131 allocator.Deallocate(const_cast<uint8_t*>(data));
144 ReleaseFn&& release_fn =
nullptr)
150 h4_span, kH4PacketIndicatorSize, std::move(release_fn)),
151 h4_type_(emboss::H4PacketType{h4_span[0]}) {}
159 return internal::CopyPacketFrom<H4PacketWithHci>(
164 emboss::H4PacketType DoGetH4Type()
const override {
return h4_type_; }
165 void DoSetH4Type(emboss::H4PacketType h4_type)
override {
169 emboss::H4PacketType h4_type_ = emboss::H4PacketType::UNKNOWN;
179 h4_span, kH4PacketIndicatorSize, std::move(release_fn)) {}
183 ReleaseFn&& release_fn =
nullptr)
194 return internal::CopyPacketFrom<H4PacketWithH4>(allocator,
199 emboss::H4PacketType DoGetH4Type()
const override {
201 return !h4_span.empty() ? emboss::H4PacketType(h4_span[0])
202 : emboss::H4PacketType::UNKNOWN;
205 void DoSetH4Type(emboss::H4PacketType h4_type)
override {
207 if (!h4_span.empty()) {
208 h4_span.data()[0] = cpp23::to_underlying(h4_type);
Definition: allocator.h:42
void * Allocate(Layout layout)
Definition: allocator.h:50
static constexpr Status ResourceExhausted()
Definition: status.h:230
Definition: h4_packet.h:36
H4PacketWithH4 is an H4Packet backed by an H4 buffer.
Definition: h4_packet.h:173
H4PacketWithHci is an H4Packet backed by an HCI buffer.
Definition: h4_packet.h:138
Definition: span_impl.h:235
constexpr span< uint8_t > GetHciSpan()
Definition: h4_packet.h:77
static Result< H4PacketWithH4 > CopyFrom(Allocator &allocator, const H4PacketWithH4 &packet)
Create an owned copy of the packet using the provided allocator.
Definition: h4_packet.h:192
Result< T > CopyPacketFrom(Allocator &allocator, span< const uint8_t > src, Args &&... args)
Create an owned copy of a packet using the provided allocator.
Definition: h4_packet.h:119
emboss::H4PacketType GetH4Type() const
Definition: h4_packet.h:70
void SetH4Type(emboss::H4PacketType type)
Sets HCI packet type indicator.
Definition: h4_packet.h:73
static Result< H4PacketWithHci > CopyFrom(Allocator &allocator, const H4PacketWithHci &packet)
Create an owned copy of the packet using the provided allocator.
Definition: h4_packet.h:157
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:27