25 void RequestConfig() { state_.fetch_or(CONFIG_PENDING, std::memory_order_release); }
27 [[nodiscard]]
bool TryEnterRx()
29 uint32_t expected = 0U;
30 return state_.compare_exchange_strong(expected, RX_ACTIVE, std::memory_order_acquire,
31 std::memory_order_relaxed);
39 uint32_t observed = state_.load(std::memory_order_relaxed);
42 ASSERT((observed & RX_ACTIVE) != 0U);
43 const uint32_t desired = observed & ~RX_ACTIVE;
44 if (state_.compare_exchange_weak(observed, desired, std::memory_order_release,
45 std::memory_order_relaxed))
47 return (observed & CONFIG_PENDING) != 0U;
52 [[nodiscard]]
bool TryEnterConfig()
54 uint32_t expected = CONFIG_PENDING;
55 return state_.compare_exchange_strong(
56 expected, CONFIG_ACTIVE, std::memory_order_acquire, std::memory_order_relaxed);
61 uint32_t observed = state_.load(std::memory_order_relaxed);
64 ASSERT((observed & CONFIG_ACTIVE) != 0U);
65 const uint32_t desired = observed & ~CONFIG_ACTIVE;
66 if (state_.compare_exchange_weak(observed, desired, std::memory_order_release,
67 std::memory_order_relaxed))
74 [[nodiscard]]
bool ConfigRequested()
const
76 return (state_.load(std::memory_order_acquire) & (CONFIG_PENDING | CONFIG_ACTIVE)) !=
80 UartRxConfigGate() =
default;
81 UartRxConfigGate(
const UartRxConfigGate&) =
delete;
82 UartRxConfigGate& operator=(
const UartRxConfigGate&) =
delete;
85 static constexpr uint32_t RX_ACTIVE = 1U << 0U;
86 static constexpr uint32_t CONFIG_PENDING = 1U << 1U;
87 static constexpr uint32_t CONFIG_ACTIVE = 1U << 2U;
89 std::atomic<uint32_t> state_{0U};