20#include "pw_assert/assert.h"
21#include "pw_bytes/span.h"
22#include "pw_result/result.h"
23#include "pw_rpc/internal/config.h"
24#include "pw_rpc/internal/lock.h"
25#include "pw_rpc/internal/packet.h"
26#include "pw_span/span.h"
27#include "pw_status/status.h"
33template <
typename,
typename, u
int32_t>
40Status OverwriteChannelId(
ByteSpan rpc_packet, uint32_t channel_id_under_128);
59template <u
int32_t kNewChannelId>
61 static_assert(kNewChannelId < 128u,
62 "Channel IDs must be less than 128 to avoid needing to "
63 "re-encode the packet");
64 return internal::OverwriteChannelId(rpc_packet, kNewChannelId);
71 uint32_t new_channel_id) {
72 PW_ASSERT(new_channel_id < 128);
73 return internal::OverwriteChannelId(rpc_packet, new_channel_id);
89 size_t encode_buffer_size = cfg::kEncodingBufferSizeBytes) {
90 return encode_buffer_size > internal::Packet::kMinEncodedSizeWithoutPayload
91 ? encode_buffer_size -
92 internal::Packet::kMinEncodedSizeWithoutPayload
100 static constexpr size_t kUnlimited = std::numeric_limits<size_t>::max();
108 constexpr const char* name()
const {
return name_; }
113 virtual size_t MaximumTransmissionUnit() {
return kUnlimited; }
115#if PW_RPC_LOCKLESS_CHANNEL_SEND
116#define PW_RPC_CHANNEL_OUTPUT_SEND_LOCK_REQUIREMENT
118#define PW_RPC_CHANNEL_OUTPUT_SEND_LOCK_REQUIREMENT \
119 PW_EXCLUSIVE_LOCKS_REQUIRED(internal::rpc_lock())
150 PW_RPC_CHANNEL_OUTPUT_SEND_LOCK_REQUIREMENT = 0;
164 static constexpr uint32_t kUnassignedChannelId = 0;
174 template <
typename UnusedType =
void>
175 constexpr void Configure(uint32_t
id,
ChannelOutput& output) {
177 !cfg::kDynamicAllocationEnabled<UnusedType>,
178 "Configure() may not be used if PW_RPC_DYNAMIC_ALLOCATION is "
179 "enabled. Call CloseChannel/OpenChannel on the endpoint instead.");
180 PW_ASSERT(id_ == kUnassignedChannelId);
181 PW_ASSERT(
id != kUnassignedChannelId);
187 template <
typename T,
188 typename = std::enable_if_t<std::is_enum_v<T>>,
189 typename U = std::underlying_type_t<T>>
192 !cfg::kDynamicAllocationEnabled<T>,
193 "Configure() may not be used if PW_RPC_DYNAMIC_ALLOCATION is enabled. "
194 "Call CloseChannel/OpenChannel on the endpoint instead.");
195 static_assert(
sizeof(U) <=
sizeof(uint32_t));
196 const U kIntId =
static_cast<U
>(id);
197 PW_ASSERT(kIntId > 0);
198 return Configure<T>(
static_cast<uint32_t
>(kIntId), output);
204 template <
typename UnusedType =
void>
207 !cfg::kDynamicAllocationEnabled<UnusedType>,
208 "set_channel_output() may not be used if PW_RPC_DYNAMIC_ALLOCATION is "
209 "enabled. Call CloseChannel/OpenChannel on the endpoint instead.");
210 PW_ASSERT(id_ != kUnassignedChannelId);
214 constexpr uint32_t id()
const {
return id_; }
215 constexpr bool assigned()
const {
return id_ != kUnassignedChannelId; }
225 constexpr void Close() {
226 PW_ASSERT(id_ != kUnassignedChannelId);
227 id_ = kUnassignedChannelId;
233 size_t MaxWriteSizeBytes()
const;
237 : id_(
id), output_(output) {}
252 template <u
int32_t kId>
254 static_assert(kId != kUnassignedChannelId,
"Channel ID cannot be 0");
260 typename T =
decltype(kId),
261 typename = std::enable_if_t<std::is_enum_v<T>>,
262 typename U = std::underlying_type_t<T>>
264 constexpr U kIntId =
static_cast<U
>(kId);
265 static_assert(kIntId >= 0,
"Channel ID cannot be negative");
266 static_assert(kIntId <= std::numeric_limits<uint32_t>::max(),
267 "Channel ID must fit in a uint32");
268 return Create<static_cast<uint32_t>(kIntId)>(output);
275 template <
typename,
typename, u
int32_t>
277 friend class internal::ChannelList;
281 PW_ASSERT(
id != kUnassignedChannelId);
286 using internal::ChannelBase::Close;
287 using internal::ChannelBase::MaxWriteSizeBytes;
288 using internal::ChannelBase::Send;
Definition: channel.h:247
Definition: channel.h:162
constexpr size_t MaxSafePayloadSize(size_t encode_buffer_size=cfg::kEncodingBufferSizeBytes)
Definition: channel.h:88
Status ChangeEncodedChannelId(ByteSpan rpc_packet)
Definition: channel.h:60
Result< uint32_t > ExtractChannelId(ConstByteSpan packet)
#define PW_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: lock_annotations.h:147