21#include "wpi/util/SmallVector.hpp"
27template <
typename T,
typename... I>
28 requires wpi::util::StructSerializable<T, I...>
34template <
typename T,
typename... I>
35 requires wpi::util::StructSerializable<T, I...>
57 m_defaultValue{
std::move(defaultValue)},
58 m_info{
std::move(info)...} {}
90 wpi::util::SmallVector<uint8_t, 128> buf;
92 if (view.
value.size() < std::apply(S::GetSize, m_info)) {
96 [&](
const I&... info) {
122 wpi::util::SmallVector<uint8_t, 128> buf;
124 if (view.
value.size() < std::apply(S::GetSize, m_info)) {
125 return {0, 0, defaultValue};
130 [&](
const I&... info) {
return S::Unpack(view.
value, info...); },
148 std::vector<TimestampedValueType> rv;
149 rv.reserve(raw.size());
150 for (
auto&& r : raw) {
151 if (r.value.size() < std::apply(S::GetSize, m_info)) {
155 [&](
const I&... info) {
157 r.time, r.serverTime,
158 S::Unpack(std::span<const uint8_t>(r.value), info...));
173 [&](
const I&... info) {
182 [[no_unique_address]]
183 std::tuple<I...> m_info;
189template <
typename T,
typename... I>
209 rhs.m_schemaPublished.load(
std::memory_order_relaxed)},
210 m_info{
std::move(rhs.m_info)} {}
214 m_schemaPublished.store(
215 rhs.m_schemaPublished.load(std::memory_order_relaxed),
216 std::memory_order_relaxed);
217 m_info = std::move(rhs.m_info);
237 void Set(
const T& value, int64_t time = 0) {
238 if (!m_schemaPublished.exchange(
true, std::memory_order_relaxed)) {
240 [&](
const I&... info) {
245 if constexpr (
sizeof...(I) == 0) {
247 uint8_t buf[S::GetSize()];
253 wpi::util::SmallVector<uint8_t, 128> buf;
254 buf.resize_for_overwrite(std::apply(S::GetSize, m_info));
255 std::apply([&](
const I&... info) { S::Pack(buf, value, info...); }, m_info);
267 if (!m_schemaPublished.exchange(
true, std::memory_order_relaxed)) {
269 [&](
const I&... info) {
274 if constexpr (
sizeof...(I) == 0) {
276 uint8_t buf[S::GetSize()];
282 wpi::util::SmallVector<uint8_t, 128> buf;
283 buf.resize_for_overwrite(std::apply(S::GetSize, m_info));
284 std::apply([&](
const I&... info) { S::Pack(buf, value, info...); }, m_info);
295 [&](
const I&... info) {
303 std::atomic_bool m_schemaPublished{
false};
304 [[no_unique_address]]
305 std::tuple<I...> m_info;
313template <
typename T,
typename... I>
370template <
typename T,
typename... I>
391 :
Topic{handle}, m_info{
std::move(info)...} {}
400 :
Topic{topic}, m_info{
std::move(info)...} {}
421 [&](
const I&... info) {
426 std::move(defaultValue), info...};
449 [&](
const I&... info) {
478 const wpi::util::json& properties,
481 [&](
const I&... info) {
516 [&](
const I&... info) {
521 std::move(defaultValue), info...};
527 [[no_unique_address]]
528 std::tuple<I...> m_info;
Publisher(const Publisher &)=delete
Publisher & operator=(const Publisher &)=delete
NT_Publisher m_pubHandle
NetworkTables handle.
Definition Topic.hpp:440
NetworkTables struct-encoded value entry.
Definition StructTopic.hpp:316
T ValueType
Definition StructTopic.hpp:321
void Unpublish()
Stops publishing the entry if it's published.
Definition StructTopic.hpp:364
NT_Entry GetHandle() const
Gets the native handle for the entry.
Definition StructTopic.hpp:352
TopicType GetTopic() const
Get the corresponding topic.
Definition StructTopic.hpp:359
StructTopic< T, I... > TopicType
Definition StructTopic.hpp:320
const T & ParamType
Definition StructTopic.hpp:322
StructEntry(NT_Entry handle, T defaultValue, const I &... info)
Construct from an entry handle; recommended to use StructTopic::GetEntry() instead.
Definition StructTopic.hpp:336
Timestamped< T > TimestampedValueType
Definition StructTopic.hpp:324
StructPublisher< T, I... > PublisherType
Definition StructTopic.hpp:319
StructSubscriber< T, I... > SubscriberType
Definition StructTopic.hpp:318
NetworkTables struct-encoded value publisher.
Definition StructTopic.hpp:191
StructPublisher(StructPublisher &&rhs)
Definition StructTopic.hpp:206
void Set(const T &value, int64_t time=0)
Publish a new value.
Definition StructTopic.hpp:237
T ValueType
Definition StructTopic.hpp:196
StructPublisher()=default
void SetDefault(const T &value)
Publish a default value.
Definition StructTopic.hpp:266
StructPublisher & operator=(const StructPublisher &)=delete
const T & ParamType
Definition StructTopic.hpp:197
StructTopic< T, I... > TopicType
Definition StructTopic.hpp:195
Timestamped< T > TimestampedValueType
Definition StructTopic.hpp:199
StructPublisher(NT_Publisher handle, I... info)
Construct from a publisher handle; recommended to use StructTopic::Publish() instead.
Definition StructTopic.hpp:228
StructPublisher & operator=(StructPublisher &&rhs)
Definition StructTopic.hpp:212
StructPublisher(const StructPublisher &)=delete
TopicType GetTopic() const
Get the corresponding topic.
Definition StructTopic.hpp:293
NetworkTables struct-encoded value subscriber.
Definition StructTopic.hpp:36
StructTopic< T, I... > TopicType
Definition StructTopic.hpp:40
const T & ParamType
Definition StructTopic.hpp:42
bool GetInto(T *out)
Get the last published value, replacing the contents in place of an existing object.
Definition StructTopic.hpp:89
std::vector< TimestampedValueType > ReadQueue()
Get an array of all valid value changes since the last call to ReadQueue.
Definition StructTopic.hpp:146
Timestamped< T > TimestampedValueType
Definition StructTopic.hpp:43
StructSubscriber()=default
TimestampedValueType GetAtomic(const T &defaultValue) const
Get the last published value along with its timestamp.
Definition StructTopic.hpp:121
ValueType Get(const T &defaultValue) const
Get the last published value.
Definition StructTopic.hpp:77
T ValueType
Definition StructTopic.hpp:41
TimestampedValueType GetAtomic() const
Get the last published value along with its timestamp If no value has been published or the value can...
Definition StructTopic.hpp:111
TopicType GetTopic() const
Get the corresponding topic.
Definition StructTopic.hpp:171
StructSubscriber(NT_Subscriber handle, T defaultValue, I... info)
Construct from a subscriber handle; recommended to use StructTopic::Subscribe() instead.
Definition StructTopic.hpp:55
ValueType Get() const
Get the last published value.
Definition StructTopic.hpp:67
NetworkTables struct-encoded value topic.
Definition StructTopic.hpp:372
PublisherType Publish(const PubSubOptions &options=kDefaultPubSubOptions)
Create a new publisher to the topic.
Definition StructTopic.hpp:447
Timestamped< T > TimestampedValueType
Definition StructTopic.hpp:379
SubscriberType Subscribe(T defaultValue, const PubSubOptions &options=kDefaultPubSubOptions)
Create a new subscriber to the topic.
Definition StructTopic.hpp:418
StructTopic(NT_Topic handle, I... info)
Construct from a topic handle; recommended to use NetworkTableInstance::GetStructTopic() instead.
Definition StructTopic.hpp:390
StructEntry< T, I... > EntryType
Definition StructTopic.hpp:376
PublisherType PublishEx(const wpi::util::json &properties, const PubSubOptions &options=kDefaultPubSubOptions)
Create a new publisher to the topic, with type string and initial properties.
Definition StructTopic.hpp:477
EntryType GetEntry(T defaultValue, const PubSubOptions &options=kDefaultPubSubOptions)
Create a new entry for the topic.
Definition StructTopic.hpp:513
T ValueType
Definition StructTopic.hpp:377
StructTopic(Topic topic, I... info)
Construct from a generic topic.
Definition StructTopic.hpp:399
const T & ParamType
Definition StructTopic.hpp:378
StructPublisher< T, I... > PublisherType
Definition StructTopic.hpp:375
StructSubscriber< T, I... > SubscriberType
Definition StructTopic.hpp:374
Subscriber(const Subscriber &)=delete
NT_Subscriber m_subHandle
Definition Topic.hpp:385
NT_Topic m_handle
Definition Topic.hpp:316
NetworkTableInstance GetInstance() const
Gets the instance for the topic.
Specifies that a type is capable of raw struct serialization and deserialization.
Definition Struct.hpp:69
bool SetRaw(NT_Handle pubentry, std::span< const uint8_t > value, int64_t time=0)
Publish a new value.
std::vector< TimestampedRaw > ReadQueueRaw(NT_Handle subentry)
Get an array of all value changes since the last call to ReadQueue.
TimestampedRaw GetAtomicRaw(NT_Handle subentry, std::span< const uint8_t > defaultValue)
Get the last published value along with its timestamp.
bool SetDefaultRaw(NT_Handle pubentry, std::span< const uint8_t > defaultValue)
Publish a default value.
NT_Handle NT_Topic
Definition ntcore_c.h:42
NT_Handle NT_Subscriber
Definition ntcore_c.h:43
NT_Handle NT_Publisher
Definition ntcore_c.h:44
NT_Handle NT_Entry
Definition ntcore_c.h:37
@ NT_RAW
Definition ntcore_c.h:55
Timestamped< std::span< uint8_t > > TimestampedRawView
Timestamped Raw view (for wpi::util::SmallVector-taking functions).
Definition ntcore_cpp_types.hpp:469
constexpr PubSubOptions kDefaultPubSubOptions
Default publish/subscribe options.
Definition ntcore_cpp.hpp:388
NT_Entry GetEntry(NT_Inst inst, std::string_view name)
Get Entry Handle.
NT_Topic GetTopicFromHandle(NT_Handle pubsubentry)
Gets the topic handle from an entry/subscriber/publisher handle.
NT_Publisher Publish(NT_Topic topic, NT_Type type, std::string_view typeStr, const PubSubOptions &options=kDefaultPubSubOptions)
Creates a new publisher to a topic.
void Unpublish(NT_Handle pubentry)
Stops publisher.
NT_Publisher PublishEx(NT_Topic topic, NT_Type type, std::string_view typeStr, const wpi::util::json &properties, const PubSubOptions &options=kDefaultPubSubOptions)
Creates a new publisher to a topic.
NT_Subscriber Subscribe(NT_Topic topic, NT_Type type, std::string_view typeStr, const PubSubOptions &options=kDefaultPubSubOptions)
Creates a new subscriber to value changes on a topic.
Definition StringMap.hpp:773
NetworkTables (ntcore) namespace.
Definition NTSendable.hpp:9
void UnpackStructInto(T *out, std::span< const uint8_t > data, const I &... info)
Unpack a serialized struct into an existing object, overwriting its contents.
Definition Struct.hpp:259
constexpr auto GetStructTypeString(const I &... info)
Get the type string for a raw struct serializable type.
Definition Struct.hpp:314
constexpr bool is_constexpr(Lambda)
Definition type_traits.hpp:81
NetworkTables publish/subscribe options.
Definition ntcore_cpp.hpp:303
Timestamped value.
Definition ntcore_cpp_types.hpp:30
int64_t serverTime
Time in server time base.
Definition ntcore_cpp_types.hpp:43
T value
Value.
Definition ntcore_cpp_types.hpp:48
int64_t time
Time in local time base.
Definition ntcore_cpp_types.hpp:38
Struct serialization template.
Definition Struct.hpp:39