libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
libxr_rw.hpp
1#pragma once
2
3#include <atomic>
4#include <cstdarg>
5#include <cstddef>
6#include <cstdint>
7#include <cstdio>
8#include <utility>
9
10#include "libxr_cb.hpp"
11#include "libxr_def.hpp"
12#include "libxr_type.hpp"
13#include "lockfree_queue.hpp"
14#include "mutex.hpp"
15#include "semaphore.hpp"
16
17namespace LibXR
18{
19
27template <typename Args>
29{
30 public:
32
35 enum class OperationType : uint8_t
36 {
37 CALLBACK,
38 BLOCK,
39 POLLING,
40 NONE
41 };
42
45 enum class OperationPollingStatus : uint8_t
46 {
47 READY,
48 RUNNING,
49 DONE,
50 ERROR
51 };
52
55 Operation() : type(OperationType::NONE) { Memory::FastSet(&data, 0, sizeof(data)); }
56
63 Operation(Semaphore &sem, uint32_t timeout = UINT32_MAX) : type(OperationType::BLOCK)
64 {
65 data.sem_info.sem = &sem;
66 data.sem_info.timeout = timeout;
67 }
68
74 Operation(Callback &callback) : type(OperationType::CALLBACK)
75 {
76 data.callback = &callback;
77 }
78
85 {
86 data.status = &status;
87 }
88
96 {
97 if (this != &op)
98 {
99 type = op.type;
100 switch (type)
101 {
102 case OperationType::CALLBACK:
103 data.callback = op.data.callback;
104 break;
105 case OperationType::BLOCK:
106 data.sem_info.sem = op.data.sem_info.sem;
107 data.sem_info.timeout = op.data.sem_info.timeout;
108 break;
109 case OperationType::POLLING:
110 data.status = op.data.status;
111 break;
112 case OperationType::NONE:
113 break;
114 }
115 }
116 return *this;
117 }
118
126 {
127 if (this != &op)
128 {
129 type = op.type;
130 switch (type)
131 {
132 case OperationType::CALLBACK:
133 data.callback = op.data.callback;
134 break;
135 case OperationType::BLOCK:
136 data.sem_info.sem = op.data.sem_info.sem;
137 data.sem_info.timeout = op.data.sem_info.timeout;
138 break;
139 case OperationType::POLLING:
140 data.status = op.data.status;
141 break;
142 case OperationType::NONE:
143 break;
144 }
145 }
146 return *this;
147 }
148
157 template <
158 typename InitOperation,
159 typename = std::enable_if_t<std::is_same_v<std::decay_t<InitOperation>, Operation>>>
160 Operation(InitOperation &&op)
161 {
162 *this = std::forward<InitOperation>(op);
163 }
164
171 template <typename Status>
172 void UpdateStatus(bool in_isr, Status &&status)
173 {
174 //TODO: 任何操作类型都应拿到执行结果。
175 switch (type)
176 {
177 case OperationType::CALLBACK:
178 data.callback->Run(in_isr, std::forward<Status>(status));
179 break;
180 case OperationType::BLOCK:
181 data.sem_info.sem->PostFromCallback(in_isr);
182 break;
183 case OperationType::POLLING:
184 /* 中断不允许阻塞语义 / ISR does not allow blocking semantics */
185 ASSERT(!in_isr);
186 *data.status = (status == ErrorCode::OK) ? OperationPollingStatus::DONE
187 : OperationPollingStatus::ERROR;
188 break;
189 case OperationType::NONE:
190 break;
191 }
192 }
193
208 {
209 if (type == OperationType::POLLING)
210 {
211 *data.status = OperationPollingStatus::RUNNING;
212 }
213 }
214
217 union
218 {
219 Callback *callback;
220 struct
221 {
222 Semaphore *sem;
223 uint32_t timeout;
224 } sem_info;
226 // TODO: state
228
232};
233
234class ReadPort;
235class WritePort;
236
240
244
247typedef ErrorCode (*WriteFun)(WritePort &port, bool in_isr);
248
251typedef ErrorCode (*ReadFun)(ReadPort &port, bool in_isr);
252
262
268
274{
275 public:
276 enum class BusyState : uint32_t
277 {
278 IDLE = 0,
279 PENDING = 1,
280 EVENT = UINT32_MAX
281 };
282
283 ReadFun read_fun_ = nullptr;
284 LockFreeQueue<uint8_t> *queue_data_ = nullptr;
285 ReadInfoBlock info_;
286 std::atomic<BusyState> busy_{BusyState::IDLE};
287
297 ReadPort(size_t buffer_size = 128);
298
309 size_t EmptySize();
310
321 size_t Size();
322
325 bool Readable();
326
341
353 void Finish(bool in_isr, ErrorCode ans, ReadInfoBlock &info);
354
365 void MarkAsRunning(ReadInfoBlock &info);
366
385 ErrorCode operator()(RawData data, ReadOperation &op, bool in_isr = false);
386
394 virtual void OnRxDequeue(bool) {}
395
403 void ProcessPendingReads(bool in_isr);
404
407 void Reset();
408};
409
415{
416 public:
417 enum class LockState : uint32_t
418 {
419 LOCKED = 0,
420 UNLOCKED = UINT32_MAX
421 };
422
423 WriteFun write_fun_ = nullptr;
425 LockFreeQueue<uint8_t> *queue_data_;
426 std::atomic<LockState> lock_{LockState::UNLOCKED};
427
439 class Stream
440 {
441 public:
449
455 ~Stream();
456
463 Stream &operator<<(const ConstRawData &data);
464
476 ErrorCode Commit();
477
478 private:
481 size_t cap_;
482 size_t size_ = 0;
483 bool locked_ = false;
484 };
485
502 WritePort(size_t queue_size = 3, size_t buffer_size = 128);
503
511 size_t EmptySize();
512
520 size_t Size();
521
529 bool Writable();
530
545
561 void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info);
562
574
593 ErrorCode operator()(ConstRawData data, WriteOperation &op, bool in_isr = false);
594
597 void Reset();
598
613 ErrorCode CommitWrite(ConstRawData data, WriteOperation &op, bool pushed = false,
614 bool in_isr = false);
615};
616
621class STDIO
622{
623 public:
624 // NOLINTBEGIN
625 static inline ReadPort *read_ = nullptr;
626 static inline WritePort *write_ = nullptr;
627 static inline LibXR::Mutex *write_mutex_ =
628 nullptr;
629 static inline LibXR::WritePort::Stream *write_stream_ = nullptr;
630#if LIBXR_PRINTF_BUFFER_SIZE > 0
631 static inline char
632 printf_buff_[LIBXR_PRINTF_BUFFER_SIZE];
633#endif
634 // NOLINTEND
635
645 static int Printf(const char *fmt, ...); // NOLINT
646};
647} // namespace LibXR
通用回调包装,支持动态参数传递 / Generic callback wrapper supporting dynamic argument passing
Definition libxr_cb.hpp:150
常量原始数据封装类。 A class for encapsulating constant raw data.
无锁队列实现 / Lock-free queue implementation
static void FastSet(void *dst, uint8_t value, size_t size)
快速内存填充 / Fast memory fill
互斥锁类,提供线程同步机制 (Mutex class providing thread synchronization mechanisms).
Definition mutex.hpp:18
Defines an operation with different execution modes.
Definition libxr_rw.hpp:29
Operation & operator=(const Operation &op)
Copy assignment operator.
Definition libxr_rw.hpp:95
Operation(Semaphore &sem, uint32_t timeout=UINT32_MAX)
Constructs a blocking operation with a semaphore and timeout.
Definition libxr_rw.hpp:63
Operation & operator=(Operation &&op) noexcept
Move assignment operator.
Definition libxr_rw.hpp:125
Operation(Callback &callback)
Constructs a callback-based operation.
Definition libxr_rw.hpp:74
union LibXR::Operation::@5 data
Operation()
Default constructor, initializes with NONE type.
Definition libxr_rw.hpp:55
void UpdateStatus(bool in_isr, Status &&status)
Updates operation status based on type.
Definition libxr_rw.hpp:172
void MarkAsRunning()
标记操作为运行状态。 Marks the operation as running.
Definition libxr_rw.hpp:207
OperationType type
Definition libxr_rw.hpp:231
Operation(OperationPollingStatus &status)
Constructs a polling operation.
Definition libxr_rw.hpp:84
Operation(InitOperation &&op)
构造一个新的 Operation 对象(初始化操作)。 Constructs a new Operation object (initialization operation).
Definition libxr_rw.hpp:160
原始数据封装类。 A class for encapsulating raw data.
ReadPort class for handling read operations.
Definition libxr_rw.hpp:274
bool Readable()
Checks if read operations are supported.
Definition libxr_rw.cpp:30
void Finish(bool in_isr, ErrorCode ans, ReadInfoBlock &info)
更新读取操作的状态。 Updates the status of the read operation.
Definition libxr_rw.cpp:38
ReadPort(size_t buffer_size=128)
Constructs a ReadPort with queue sizes.
Definition libxr_rw.cpp:11
void Reset()
Resets the ReadPort.
Definition libxr_rw.cpp:153
size_t EmptySize()
获取队列的剩余可用空间。 Gets the remaining available space in the queue.
Definition libxr_rw.cpp:18
ErrorCode operator()(RawData data, ReadOperation &op, bool in_isr=false)
读取操作符重载,用于执行读取操作。 Overloaded function call operator to perform a read operation.
Definition libxr_rw.cpp:46
void ProcessPendingReads(bool in_isr)
Processes pending reads.
Definition libxr_rw.cpp:126
ReadPort & operator=(ReadFun fun)
赋值运算符重载,用于设置读取函数。 Overloaded assignment operator to set the read function.
Definition libxr_rw.cpp:32
size_t Size()
获取当前队列的已使用大小。 Gets the currently used size of the queue.
Definition libxr_rw.cpp:24
virtual void OnRxDequeue(bool)
RX 数据从软件队列成功出队后的通知。 Notification after bytes are popped from RX data queue.
Definition libxr_rw.hpp:394
void MarkAsRunning(ReadInfoBlock &info)
标记读取操作为运行中。 Marks the read operation as running.
Definition libxr_rw.cpp:44
STDIO interface for read/write ports.
Definition libxr_rw.hpp:622
static int Printf(const char *fmt,...)
Prints a formatted string to the write port (like printf).
Definition libxr_rw.cpp:376
static LibXR::Mutex * write_mutex_
Write port mutex. 写入端口互斥锁。
Definition libxr_rw.hpp:627
static ReadPort * read_
Read port instance. 读取端口。
Definition libxr_rw.hpp:625
static WritePort * write_
Write port instance. 写入端口。
Definition libxr_rw.hpp:626
信号量类,实现线程同步机制 Semaphore class implementing thread synchronization
Definition semaphore.hpp:23
WritePort 的流式写入操作器,支持链式 << 操作和批量提交。
Definition libxr_rw.hpp:440
bool locked_
是否持有写锁 Whether write lock is held
Definition libxr_rw.hpp:483
size_t size_
当前已写入但未提交的字节数 Bytes written but not yet committed
Definition libxr_rw.hpp:482
ErrorCode Commit()
手动提交已写入的数据到队列,并尝试续锁。
Definition libxr_rw.cpp:349
size_t cap_
当前队列容量 Current queue capacity
Definition libxr_rw.hpp:481
LibXR::WritePort * port_
写端口指针 Pointer to the WritePort
Definition libxr_rw.hpp:479
LibXR::WriteOperation op_
写操作对象 Write operation object
Definition libxr_rw.hpp:480
~Stream()
析构时自动提交已累积的数据并释放锁。
Definition libxr_rw.cpp:301
Stream(LibXR::WritePort *port, LibXR::WriteOperation op)
构造流写入对象,并尝试锁定端口。
Definition libxr_rw.cpp:284
Stream & operator<<(const ConstRawData &data)
追加写入数据,支持链式调用。
Definition libxr_rw.cpp:315
WritePort class for handling write operations.
Definition libxr_rw.hpp:415
size_t EmptySize()
获取数据队列的剩余可用空间。 Gets the remaining available space in the data queue.
Definition libxr_rw.cpp:168
size_t Size()
获取当前数据队列的已使用大小。 Gets the used size of the current data queue.
Definition libxr_rw.cpp:174
void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info)
更新写入操作的状态。 Updates the status of the write operation.
Definition libxr_rw.cpp:188
WritePort(size_t queue_size=3, size_t buffer_size=128)
构造一个新的 WritePort 对象。 Constructs a new WritePort object.
Definition libxr_rw.cpp:159
WritePort & operator=(WriteFun fun)
赋值运算符重载,用于设置写入函数。 Overloaded assignment operator to set the write function.
Definition libxr_rw.cpp:182
bool Writable()
判断端口是否可写。 Checks whether the port is writable.
Definition libxr_rw.cpp:180
ErrorCode CommitWrite(ConstRawData data, WriteOperation &op, bool pushed=false, bool in_isr=false)
提交写入操作。 Commits a write operation.
Definition libxr_rw.cpp:222
void MarkAsRunning(WriteOperation &op)
标记写入操作为运行中。 Marks the write operation as running.
Definition libxr_rw.cpp:193
void Reset()
Resets the WritePort.
Definition libxr_rw.cpp:277
ErrorCode operator()(ConstRawData data, WriteOperation &op, bool in_isr=false)
执行写入操作。 Performs a write operation.
Definition libxr_rw.cpp:195
LibXR 命名空间
ErrorCode(* ReadFun)(ReadPort &port, bool in_isr)
Function pointer type for read operations.
Definition libxr_rw.hpp:251
ErrorCode(* WriteFun)(WritePort &port, bool in_isr)
Function pointer type for write operations.
Definition libxr_rw.hpp:247
Operation< ErrorCode > ReadOperation
Read operation type.
Definition libxr_rw.hpp:239
Operation< ErrorCode > WriteOperation
Write operation type.
Definition libxr_rw.hpp:243
Read information block structure.
Definition libxr_rw.hpp:258
RawData data
Data buffer. 数据缓冲区。
Definition libxr_rw.hpp:259
ReadOperation op
Read operation instance. 读取操作实例。
Definition libxr_rw.hpp:260
ConstRawData data
Data buffer. 数据缓冲区。
Definition libxr_rw.hpp:265
WriteOperation op
Write operation instance. 写入操作实例。
Definition libxr_rw.hpp:266