3#include "libxr_mem.hpp"
15void Topic::CheckPublishSize(TopicHandle topic, uint32_t size)
17 if (topic->data_.check_length)
19 ASSERT(size == topic->data_.max_length);
23 ASSERT(size <= topic->data_.max_length);
27RawData Topic::StorePublishedData(TopicHandle topic,
void* addr, uint32_t size,
30 if (topic->data_.cache)
33 topic->data_.data.size_ = size;
37 topic->data_.data.addr_ = addr;
38 topic->data_.data.size_ = size;
41 topic->data_.timestamp = timestamp;
42 return topic->data_.data;
46 RawData data,
bool from_callback,
bool in_isr)
52 auto sync =
static_cast<SyncBlock*
>(&block);
53 uint32_t expected = SyncBlock::WAITING;
54 auto wake_waiter = sync->wait_state.compare_exchange_strong(
55 expected, SyncBlock::WAIT_CLAIMED, std::memory_order_acq_rel,
56 std::memory_order_acquire);
64 sync->timestamp = timestamp;
68 sync->sem.PostFromCallback(in_isr);
78 auto async =
static_cast<ASyncBlock*
>(&block);
79 if (async->state.load(std::memory_order_acquire) == ASyncSubscriberState::WAITING)
82 async->timestamp = timestamp;
83 async->state.store(ASyncSubscriberState::DATA_READY, std::memory_order_release);
89 auto queue_block =
static_cast<QueueBlock*
>(&block);
90 queue_block->fun(timestamp, data, *queue_block);
96 cb_block->cb.Run(from_callback && in_isr, timestamp, data);
103 RawData data,
bool from_callback,
bool in_isr)
105 topic->data_.subers.Foreach<SuberBlock>(
106 [=](SuberBlock& block)
108 DispatchSubscriber(block, timestamp, data, from_callback, in_isr);
114 bool from_callback,
bool in_isr)
125 CheckPublishSize(
block_, size);
126 RawData data = StorePublishedData(
block_, addr, size, timestamp);
127 DispatchSubscribers(
block_, timestamp, data, from_callback, in_isr);
143 PublishRaw(addr, size, timestamp,
false,
false);
154 PublishRaw(addr, size, timestamp,
true, in_isr);
回调函数封装块,提供参数绑定与擦除调用入口 / Callback block with bound argument and erased invoke entry
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
微秒时间戳 / Microsecond timestamp
可写原始数据视图 / Mutable raw data view
size_t size_
数据字节数 / Data size in bytes
void * addr_
数据起始地址 / Data start address
static Timebase * timebase
静态指针,用于存储全局时间基对象。 Static pointer storing the global timebase instance.
static MicrosecondTimestamp GetMicroseconds()
获取当前时间的微秒级时间戳。 Gets the current timestamp in microseconds.
@ SYNC
同步订阅者。Synchronous subscriber.
@ ASYNC
异步订阅者。Asynchronous subscriber.
@ QUEUE
队列订阅者。Queued subscriber.
@ CALLBACK
回调订阅者。Callback subscriber.
void Publish(Data &data)
发布数据 Publishes data
static void Unlock(TopicHandle topic)
解锁主题。Unlock the topic.
static MicrosecondTimestamp NowTimestamp()
生成默认发布时刻。Create the default publish timestamp.
static void Lock(TopicHandle topic)
锁定主题,防止其被多个订阅者同时访问。Lock the topic to prevent it from being accessed by multiple subscribers at the sa...
static void UnlockFromCallback(TopicHandle topic)
从回调中解锁主题。Unlock the topic from a callback.
static void LockFromCallback(TopicHandle topic)
从回调中锁定主题,防止其被多个订阅者同时访问。Lock the topic from a callback to prevent it from being accessed by multiple s...
void PublishFromCallback(Data &data, bool in_isr)
在回调函数中发布数据 Publishes data in a callback
TopicHandle block_
主题句柄,指向当前主题的内存块 Topic handle pointing to the memory block of the current topic
@ OK
操作成功 | Operation successful