libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::WritePort Class Reference

WritePort class for handling write operations. More...

#include <libxr_rw.hpp>

Inheritance diagram for LibXR::WritePort:
[legend]
Collaboration diagram for LibXR::WritePort:
[legend]

Public Member Functions

 WritePort (size_t queue_size=3, size_t buffer_size=128)
 构造一个新的 WritePort 对象。 Constructs a new WritePort object.
 
virtual size_t EmptySize ()
 获取数据队列的剩余可用空间。 Gets the remaining available space in the data queue.
 
virtual size_t Size ()
 获取当前数据队列的已使用大小。 Gets the used size of the current data queue.
 
bool Writable ()
 判断端口是否可写。 Checks whether the port is writable.
 
WritePortoperator= (WriteFun fun)
 赋值运算符重载,用于设置写入函数。 Overloaded assignment operator to set the write function.
 
void Finish (bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size)
 更新写入操作的状态。 Updates the status of the write operation.
 
void MarkAsRunning (WriteOperation &op)
 标记写入操作为运行中。 Marks the write operation as running.
 
ErrorCode operator() (ConstRawData data, WriteOperation &op)
 执行写入操作。 Performs a write operation.
 
virtual void Reset ()
 Resets the WritePort.
 

Data Fields

WriteFun write_fun_ = nullptr
 
LockFreeQueue< WriteInfoBlock > * queue_info_
 
LockFreeQueue< uint8_t > * queue_data_
 
Mutex mutex_
 
size_t write_size_ = 0
 

Detailed Description

WritePort class for handling write operations.

处理写入操作的WritePort类。

Definition at line 563 of file libxr_rw.hpp.

Constructor & Destructor Documentation

◆ WritePort()

LibXR::WritePort::WritePort ( size_t queue_size = 3,
size_t buffer_size = 128 )
inline

构造一个新的 WritePort 对象。 Constructs a new WritePort object.

该构造函数初始化无锁操作队列 queue_info_ 和数据块队列 queue_data_。 This constructor initializes the lock-free operation queue queue_info_ and the data block queue queue_data_.

Parameters
queue_size队列的大小,默认为 3。 The size of the queue, default is 3.
block_size缓存的数据的最大大小,默认为 128。 The maximum size of cached data, default is 128.

Definition at line 585 of file libxr_rw.hpp.

586 : queue_info_(new(std::align_val_t(LIBXR_CACHE_LINE_SIZE))
587 LockFreeQueue<WriteInfoBlock>(queue_size)),
588 queue_data_(buffer_size > 0 ? new(std::align_val_t(LIBXR_CACHE_LINE_SIZE))
589 LockFreeQueue<uint8_t>(buffer_size)
590 : nullptr)
591 {
592 }

Member Function Documentation

◆ EmptySize()

virtual size_t LibXR::WritePort::EmptySize ( )
inlinevirtual

获取数据队列的剩余可用空间。 Gets the remaining available space in the data queue.

Returns
返回数据队列的空闲大小。 Returns the empty size of the data queue.

Reimplemented in LibXR::ESP32UARTWritePort, and LibXR::TinyUSBUARTWritePort.

Definition at line 601 of file libxr_rw.hpp.

602 {
603 ASSERT(queue_data_ != nullptr);
604 return queue_data_->EmptySize();
605 }
size_t EmptySize()
计算队列剩余可用空间 / Calculates the remaining available space in the queue

◆ Finish()

void LibXR::WritePort::Finish ( bool in_isr,
ErrorCode ans,
WriteInfoBlock & info,
uint32_t size )
inline

更新写入操作的状态。 Updates the status of the write operation.

该函数在写入操作过程中更新 write_size_ 并调用 UpdateStatus 方法更新 op 的状态。 This function updates write_size_ and calls UpdateStatus on op during a write operation.

Parameters
in_isr指示是否在中断上下文中执行。 Indicates whether the operation is executed in an interrupt context.
ans错误码,用于指示操作的结果。 Error code indicating the result of the operation.
op需要更新状态的 WriteOperation 引用。 Reference to the WriteOperation whose status needs to be updated.
size写入的数据大小。 The size of the written data.

Definition at line 665 of file libxr_rw.hpp.

666 {
667 write_size_ = size;
668 info.op.UpdateStatus(in_isr, std::forward<ErrorCode>(ans));
669 }

◆ MarkAsRunning()

void LibXR::WritePort::MarkAsRunning ( WriteOperation & op)
inline

标记写入操作为运行中。 Marks the write operation as running.

该函数用于将 op 标记为运行状态,以指示当前正在进行写入操作。 This function marks op as running to indicate an ongoing write operation.

Parameters
op需要更新状态的 WriteOperation 引用。 Reference to the WriteOperation whose status needs to be updated.

Definition at line 681 of file libxr_rw.hpp.

681{ op.MarkAsRunning(); }

◆ operator()()

ErrorCode LibXR::WritePort::operator() ( ConstRawData data,
WriteOperation & op )
inline

执行写入操作。 Performs a write operation.

该函数检查端口是否可写,并根据 data.size_op 的类型执行不同的操作。 This function checks if the port is writable and performs different actions based on data.size_ and the type of op.

Parameters
data需要写入的原始数据。 Raw data to be written.
op写入操作对象,包含操作类型和同步机制。 Write operation object containing the operation type and synchronization mechanism.
Returns
返回操作的 ErrorCode,指示操作结果。 Returns an ErrorCode indicating the result of the operation.

Definition at line 699 of file libxr_rw.hpp.

700 {
701 if (Writable())
702 {
703 if (data.size_ == 0)
704 {
705 write_size_ = 0;
706 if (op.type != WriteOperation::OperationType::BLOCK)
707 {
708 op.UpdateStatus(false, ErrorCode::OK);
709 }
710 return ErrorCode::OK;
711 }
712
713 mutex_.Lock();
714
715 if (queue_info_->EmptySize() < 1)
716 {
717 mutex_.Unlock();
718 return ErrorCode::FULL;
719 }
720
721 if (queue_data_)
722 {
723 if (queue_data_->EmptySize() < data.size_)
724 {
725 mutex_.Unlock();
726 return ErrorCode::FULL;
727 }
728
729 auto ans = queue_data_->PushBatch(reinterpret_cast<const uint8_t *>(data.addr_),
730 data.size_);
731 UNUSED(ans);
732 ASSERT(ans == ErrorCode::OK);
733
734 WriteInfoBlock info{data, op};
735 ans = queue_info_->Push(info);
736
737 ASSERT(ans == ErrorCode::OK);
738
739 op.MarkAsRunning();
740
741 ans = write_fun_(*this);
742
743 mutex_.Unlock();
744
745 if (ans == ErrorCode::OK)
746 {
747 write_size_ = data.size_;
748 if (op.type != WriteOperation::OperationType::BLOCK)
749 {
750 op.UpdateStatus(false, ErrorCode::OK);
751 }
752 return ErrorCode::OK;
753 }
754
755 if (op.type == WriteOperation::OperationType::BLOCK)
756 {
757 return op.data.sem_info.sem->Wait(op.data.sem_info.timeout);
758 }
759
760 return ErrorCode::OK;
761 }
762 else
763 {
764 WriteInfoBlock info{data, op};
765 auto ans = queue_info_->Push(info);
766
767 ASSERT(ans == ErrorCode::OK);
768
769 op.MarkAsRunning();
770
771 ans = write_fun_(*this);
772
773 mutex_.Unlock();
774
775 if (ans == ErrorCode::OK)
776 {
777 write_size_ = data.size_;
778 if (op.type != WriteOperation::OperationType::BLOCK)
779 {
780 op.UpdateStatus(false, ErrorCode::OK);
781 }
782 return ErrorCode::OK;
783 }
784
785 if (op.type == WriteOperation::OperationType::BLOCK)
786 {
787 return op.data.sem_info.sem->Wait(op.data.sem_info.timeout);
788 }
789 else
790 {
791 return ErrorCode::OK;
792 }
793 }
794 }
795 else
796 {
797 return ErrorCode::NOT_SUPPORT;
798 }
799 }
ErrorCode PushBatch(const Data *data, size_t size)
批量推入数据 / Pushes multiple elements into the queue
ErrorCode Lock()
加锁,如果锁已被占用,则阻塞等待 (Lock the mutex, blocking if it is already locked).
Definition mutex.cpp:14
void Unlock()
解锁互斥锁 (Unlock the mutex).
Definition mutex.cpp:28
bool Writable()
判断端口是否可写。 Checks whether the port is writable.
Definition libxr_rw.hpp:627

◆ operator=()

WritePort & LibXR::WritePort::operator= ( WriteFun fun)
inline

赋值运算符重载,用于设置写入函数。 Overloaded assignment operator to set the write function.

该函数允许使用 WriteFun 类型的函数对象赋值给 WritePort,从而设置 write_fun_。 This function allows assigning a WriteFun function object to WritePort, setting write_fun_.

Parameters
fun要分配的写入函数。 The write function to be assigned.
Returns
返回自身的引用,以支持链式调用。 Returns a reference to itself for chaining.

Definition at line 642 of file libxr_rw.hpp.

643 {
644 write_fun_ = fun;
645 return *this;
646 }

◆ Reset()

virtual void LibXR::WritePort::Reset ( )
inlinevirtual

Resets the WritePort.

重置WritePort。

Reimplemented in LibXR::ESP32UARTWritePort, and LibXR::TinyUSBUARTWritePort.

Definition at line 803 of file libxr_rw.hpp.

804 {
805 ASSERT(queue_data_ != nullptr);
806 Mutex::LockGuard lock_guard(mutex_);
807 queue_info_->Reset();
808 queue_data_->Reset();
809 write_size_ = 0;
810 }
void Reset()
重置队列 / Resets the queue

◆ Size()

virtual size_t LibXR::WritePort::Size ( )
inlinevirtual

获取当前数据队列的已使用大小。 Gets the used size of the current data queue.

Returns
返回数据队列的已使用大小。 Returns the size of the data queue.

Reimplemented in LibXR::ESP32UARTWritePort, and LibXR::TinyUSBUARTWritePort.

Definition at line 614 of file libxr_rw.hpp.

615 {
616 ASSERT(queue_data_ != nullptr);
617 return queue_data_->Size();
618 }
size_t Size() const
获取当前队列中的元素数量 / Returns the number of elements currently in the queue

◆ Writable()

bool LibXR::WritePort::Writable ( )
inline

判断端口是否可写。 Checks whether the port is writable.

Returns
如果 write_fun_ 不为空,则返回 true,否则返回 false。 Returns true if write_fun_ is not null, otherwise returns false.

Definition at line 627 of file libxr_rw.hpp.

627{ return write_fun_ != nullptr; }

Field Documentation

◆ mutex_

Mutex LibXR::WritePort::mutex_

Definition at line 569 of file libxr_rw.hpp.

◆ queue_data_

LockFreeQueue<uint8_t>* LibXR::WritePort::queue_data_

Definition at line 568 of file libxr_rw.hpp.

◆ queue_info_

LockFreeQueue<WriteInfoBlock>* LibXR::WritePort::queue_info_

Definition at line 567 of file libxr_rw.hpp.

◆ write_fun_

WriteFun LibXR::WritePort::write_fun_ = nullptr

Definition at line 566 of file libxr_rw.hpp.

◆ write_size_

size_t LibXR::WritePort::write_size_ = 0

Definition at line 570 of file libxr_rw.hpp.


The documentation for this class was generated from the following file: