libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
publish.cpp
1#include <atomic>
2
3#include "subscriber/async.hpp"
4#include "subscriber/callback.hpp"
5#include "subscriber/queue.hpp"
6#include "subscriber/sync.hpp"
7#include "timebase.hpp"
8#include "topic.hpp"
9
10using namespace LibXR;
11
12void Topic::DispatchSubscriber(SuberBlock& block, MicrosecondTimestamp timestamp,
13 void* payload_addr, bool from_callback, bool in_isr)
14{
15 switch (block.type)
16 {
17 case SuberType::SYNC:
18 {
19 auto sync = static_cast<SyncBlock*>(&block);
20 uint32_t expected = SyncBlock::WAITING;
21 auto wake_waiter = sync->wait_state.compare_exchange_strong(
22 expected, SyncBlock::WAIT_CLAIMED, std::memory_order_acq_rel,
23 std::memory_order_acquire);
24
25 if (!wake_waiter)
26 {
27 break;
28 }
29
30 sync->copy_payload(sync->buff_addr, payload_addr);
31 sync->timestamp = timestamp;
32
33 if (from_callback)
34 {
35 sync->sem.PostFromCallback(in_isr);
36 }
37 else
38 {
39 sync->sem.Post();
40 }
41 break;
42 }
44 {
45 auto async = static_cast<ASyncBlock*>(&block);
46 if (async->state.load(std::memory_order_acquire) == ASyncSubscriberState::WAITING)
47 {
48 async->copy_payload(async->buff_addr, payload_addr);
49 async->timestamp = timestamp;
50 async->state.store(ASyncSubscriberState::DATA_READY, std::memory_order_release);
51 }
52 break;
53 }
55 {
56 auto queue_block = static_cast<QueueBlock*>(&block);
57 queue_block->fun(timestamp, payload_addr, *queue_block);
58 break;
59 }
61 {
62 auto cb_block = static_cast<CallbackBlock*>(&block);
63 cb_block->Run(from_callback && in_isr, timestamp, payload_addr);
64 break;
65 }
66 }
67}
68
69void Topic::DispatchSubscribers(TopicHandle topic, MicrosecondTimestamp timestamp,
70 void* payload_addr, bool from_callback, bool in_isr)
71{
72 topic->data_.subers.Foreach<SuberBlock>(
73 [=](SuberBlock& block)
74 {
75 DispatchSubscriber(block, timestamp, payload_addr, from_callback, in_isr);
76 return ErrorCode::OK;
77 });
78}
79
81
82void Topic::CheckPublishContract(TopicHandle topic, TypeID::ID payload_type_id,
83 size_t payload_size, size_t payload_alignment)
84{
85 ASSERT(topic != nullptr);
86 ASSERT(payload_type_id != nullptr);
87 ASSERT(topic->data_.payload_type_id == payload_type_id);
88 ASSERT(topic->data_.payload_size == payload_size);
89 ASSERT(topic->data_.payload_alignment == payload_alignment);
90}
回调函数封装块,提供参数绑定与擦除调用入口 / Callback block with bound argument and erased invoke entry
Definition libxr_cb.hpp:40
微秒时间戳 / Microsecond timestamp
static MicrosecondTimestamp GetMicroseconds()
获取当前时间的微秒级时间戳。 Gets the current timestamp in microseconds.
@ SYNC
同步等待型订阅者 / Synchronous wait-based subscriber.
@ ASYNC
异步本地缓冲型订阅者 / Asynchronous local-buffer subscriber.
@ QUEUE
队列转发型订阅者 / Queue-forwarding subscriber.
@ CALLBACK
回调执行型订阅者 / Callback-executing subscriber.
static MicrosecondTimestamp NowTimestamp()
读取当前时间戳 / Read the current timestamp
Definition publish.cpp:80
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
@ OK
操作成功 / Operation successful
@ WAITING
当前有一个挂起的等待者 / One waiter is currently pending.
Definition sync.hpp:26