libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
terminal.hpp
1#pragma once
2
3#include <array>
4#include <atomic>
5#include <cctype>
6#include <cstddef>
7#include <cstdint>
8#include <cstdio>
9#include <cstring>
10#include <utility>
11
12#include "libxr_rw.hpp"
13#include "ramfs.hpp"
14#include "semaphore.hpp"
15#include "stack.hpp"
16
17namespace LibXR
31template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
32 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
34{
35 private:
39 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
40
48 static constexpr char CLEAR_ALL[] =
49 "\033[2J\033[1H";
50 static constexpr char CLEAR_LINE[] =
51 "\033[2K\r";
52 static constexpr char CLEAR_BEHIND[] =
53 "\033[K";
54 static constexpr char KEY_RIGHT[] = "\033[C";
55 static constexpr char KEY_LEFT[] = "\033[D";
56 static constexpr char KEY_SAVE[] = "\033[s";
57 static constexpr char KEY_LOAD[] =
58 "\033[u";
59 static constexpr char DELETE_CHAR[] =
60 "\b \b";
61
68 char* StrchrRev(char* str, char c)
69 {
70 auto len = strlen(str);
71 for (int i = static_cast<int>(len - 1); i >= 0; i--)
72 {
73 if (str[i] == c)
74 {
75 return str + i;
76 }
77 }
78 return nullptr;
79 }
80
81 public:
85 enum class Mode : uint8_t
86 {
87 CRLF = 0,
88 LF = 1,
89 CR = 2
90 };
91
102 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
103 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
105 : read_status_(ReadOperation::OperationPollingStatus::READY),
106 write_status_(WriteOperation::OperationPollingStatus::READY),
109 read_port_(read_port),
110 write_port_(write_port),
112 ramfs_(ramfs),
113 current_dir_(current_dir ? current_dir : &ramfs_.root_),
114 input_line_(MAX_LINE_SIZE + 1),
115 history_(MAX_HISTORY_NUMBER)
116 {
117 ASSERT(read_port != nullptr);
118 ASSERT(write_port != nullptr);
119 ASSERT(read_port->Readable());
120 ASSERT(write_port->Writable());
121
122 if (write_port == STDIO::write_)
123 {
124 if (STDIO::write_mutex_ == nullptr)
125 {
127 }
128
131 }
132 else
133 {
135 }
136 }
137
139 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
141 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
142
143 const Mode MODE;
148
150
152 char read_buff_[READ_BUFF_SIZE];
153
155 0;
157 uint8_t flag_ansi_ = 0;
158 int offset_ = 0;
160 char* arg_tab_[MAX_ARG_NUMBER];
161 size_t arg_number_ = 0;
163 int history_index_ = -1;
164 bool linefeed_flag_ = false;
165 char linefeed_char_ = '\0';
167 false;
168
172#include "display.hpp"
173
178#include "command.hpp"
179
183#include "input.hpp"
184
188#include "driver.hpp"
189};
190
191} // namespace LibXR
互斥锁类,提供线程同步机制 Mutex class providing thread synchronization mechanisms.
Definition mutex.hpp:18
基于 QueueBase 的泛型队列模板类。 Generic queue template class based on QueueBase.
目录节点片段 / Directory-node fragment
Definition ramfs.hpp:10
轻量级内存文件系统 / Lightweight in-memory file system
Definition ramfs.hpp:23
基于 SPSC 字节队列的读端口 / Read endpoint backed by an SPSC byte queue.
Definition read_port.hpp:30
static LibXR::WritePort::Stream * write_stream_
可选的外部托管写流 / Optional externally owned write stream.
Definition stdio.hpp:29
static LibXR::Mutex * write_mutex_
写入端口互斥锁 / Write port mutex.
Definition stdio.hpp:27
static ReadPort * read_
读取端口 / Read port instance.
Definition stdio.hpp:25
static WritePort * write_
写入端口 / Write port instance.
Definition stdio.hpp:26
线程安全的栈数据结构 / Thread-safe stack data structure
Definition stack.hpp:25
基于 RamFS 的命令行终端 / Command-line terminal backed by RamFS.
Definition terminal.hpp:34
std::atomic< ReadOperation::OperationPollingStatus > read_status_
读完成方发布、轮询入口读取的状态 / Read completion status used by the polling entry.
Definition terminal.hpp:139
char * arg_tab_[MAX_ARG_NUMBER]
命令参数列表 / Command argument list
Definition terminal.hpp:160
WritePort * write_port_
写入端口 / Write port
Definition terminal.hpp:146
size_t arg_number_
参数数量 / Number of arguments
Definition terminal.hpp:161
uint8_t flag_ansi_
ANSI 控制字符状态 / ANSI control character state.
Definition terminal.hpp:157
Terminal(LibXR::RamFS &ramfs, RamFS::Dir *current_dir=nullptr, ReadPort *read_port=STDIO::read_, WritePort *write_port=STDIO::write_, Mode MODE=Mode::CRLF)
初始化终端的文件系统和读写端口 / Initialize the terminal filesystem and ports.
Definition terminal.hpp:102
bool line_truncated_
当前输入行丢弃过超长字符 / Characters beyond MAX_LINE_SIZE were dropped
Definition terminal.hpp:166
std::atomic< WriteOperation::OperationPollingStatus > write_status_
写完成方发布的轮询状态 / Polling status published by write completion.
Definition terminal.hpp:141
char linefeed_char_
上一个换行字符 / Previous line feed character
Definition terminal.hpp:165
ReadPort * read_port_
读取端口 / Read port
Definition terminal.hpp:145
WriteOperation write_op_
终端写操作 / Terminal write operation
Definition terminal.hpp:144
Queue< HistoryLine > history_
历史命令 / History of commands
Definition terminal.hpp:162
char read_buff_[READ_BUFF_SIZE]
读取缓冲区 / Read buffer
Definition terminal.hpp:152
int history_index_
当前历史索引 / Current history index
Definition terminal.hpp:163
RamFS & ramfs_
关联的文件系统 / Associated file system
Definition terminal.hpp:151
WritePort::Stream write_stream_
写入流 / Write stream
Definition terminal.hpp:147
int offset_
光标偏移 / Cursor offset
Definition terminal.hpp:158
LibXR::Mutex * write_mutex_
写入端口互斥锁 / Write port mutex
Definition terminal.hpp:149
RamFS::Dir * current_dir_
当前目录 / Current directory
Definition terminal.hpp:156
Stack< char > input_line_
输入行缓冲区 / Input line buffer
Definition terminal.hpp:159
size_t request_read_size_
本轮计划读取的字节数 / Byte count requested for the current read attempt.
Definition terminal.hpp:154
Mode
终端换行模式 / Terminal line ending mode.
Definition terminal.hpp:86
@ CR
仅回车 / Carriage Return (\r)
@ CRLF
回车换行 / Carriage Return + Line Feed (\r\n)
@ LF
仅换行 / Line Feed (\n)
bool linefeed_flag_
CRLF 抑制标志 / CRLF suppression flag.
Definition terminal.hpp:164
const Mode MODE
终端换行模式 / Terminal line feed mode
Definition terminal.hpp:143
合并多次写入的流接口 / Stream interface for batched writes.
基于 SPSC 字节队列的写端口 / Write endpoint backed by an SPSC byte queue.
终端线程与轮询入口 / Thread and polling entry points for Terminal.
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14