libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER > Class Template Reference

基于 RamFS 的命令行终端 / Command-line terminal backed by RamFS. More...

#include <terminal.hpp>

Collaboration diagram for LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >:
[legend]

Public Types

enum class  Mode : uint8_t { CRLF = 0 , LF = 1 , CR = 2 }
 终端换行模式 / Terminal line ending mode. More...
 

Public Member Functions

 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.
 
const HistoryLine & HistoryFromNewest (int index_from_newest)
 按“从最新到最旧”的顺序取历史记录 Fetches one history entry counting from newest to oldest
 
void LineFeed ()
 执行换行操作 Performs a line feed operation
 
void UpdateDisplayPosition ()
 更新光标位置 Updates cursor position
 
bool CanDisplayChar ()
 检查是否可以显示字符 Checks if a character can be displayed
 
bool CanDeleteChar ()
 检查是否可以删除字符 Checks if a character can be deleted
 
void AddCharToInputLine (char data)
 向输入行中添加字符,支持在光标位置插入 Adds a character to the input line, supports insertion at the cursor position
 
void DisplayChar (char data)
 在终端上显示字符,并根据历史记录模式进行相应操作 Displays a character on the terminal and updates accordingly if history mode is active
 
void RemoveCharFromInputLine ()
 从输入行中删除字符,支持在光标位置删除 Removes a character from the input line, supports deletion at the cursor position
 
void DeleteChar ()
 处理删除字符操作,支持回退删除,并在历史模式下更新显示 Handles the delete character operation, supports backspace deletion, and updates display in history mode
 
void ShowHeader ()
 显示终端提示符,包括当前目录信息 Displays the terminal prompt, including the current directory information
 
void ShowTruncatedLineNotice ()
 输出输入行被截断的提示 Prints the notice that the input line was truncated
 
void ClearLine ()
 清除当前行 Clears the current line
 
void Clear ()
 清除整个终端屏幕 Clears the entire terminal screen
 
void ShowHistory ()
 显示历史记录中的输入行,更新终端显示 Displays the input line from history and updates the terminal display
 
void CopyHistoryToInputLine ()
 将历史命令复制到输入行,并重置历史索引、光标偏移和截断标记 Copies the history command to the input line and resets the history index, the cursor offset and the truncation mark
 
void AddHistory ()
 将当前输入行添加到历史记录 Adds the current input line to the history
 
void GetArgs ()
 路径解析、命令执行与补全实现 / Path parsing, command execution, and completion.
 
RamFS::Dir * Path2Dir (char *path)
 将路径字符串解析为目录对象 Converts a path string into a directory object
 
RamFS::File * Path2File (char *path)
 将路径字符串解析为文件对象 Converts a path string into a file object
 
void ExecuteCommand ()
 解析并执行输入的命令 Parses and executes the entered command
 
void AutoComplete ()
 实现命令自动补全,匹配目录或文件名 Implements command auto-completion by matching directories or file names
 
void Parse (RawData &raw_data)
 输入与控制字符解析实现 / Input and control-character parsing.
 
void HandleAnsiCharacter (char data)
 处理 ANSI 序列中的后续字符 Handles the follow-up characters of an ANSI sequence
 
void HandleControlCharacter (char data)
 处理控制字符,包括换行、删除、制表符等 Handles control characters such as newline, delete, and tab
 
void HandleCharacter (char data)
 处理输入字符,根据类型调用相应的处理函数 Handles input characters, dispatching them to the appropriate handler
 

Static Public Member Functions

static size_t HistoryLineSize (const HistoryLine &line)
 行编辑、显示与历史记录实现 / Line editing, display, and command history.
 
static void ThreadFun (Terminal *term)
 在线程中读取输入并驱动终端 / Read input and drive the terminal in a thread.
 
static void TaskFun (Terminal *term)
 检查读取结果并推进终端输入 / Check read completion and advance terminal input.
 

Public Attributes

std::atomic< ReadOperation::OperationPollingStatus > read_status_
 读完成方发布、轮询入口读取的状态 / Read completion status used by the polling entry.
 
std::atomic< WriteOperation::OperationPollingStatus > write_status_
 写完成方发布的轮询状态 / Polling status published by write completion.
 
const Mode MODE
 终端换行模式 / Terminal line feed mode
 
WriteOperation write_op_
 终端写操作 / Terminal write operation
 
ReadPort * read_port_
 读取端口 / Read port
 
WritePort * write_port_
 写入端口 / Write port
 
WritePort::Stream write_stream_
 写入流 / Write stream
 
LibXR::Mutex * write_mutex_ = nullptr
 写入端口互斥锁 / Write port mutex
 
RamFS & ramfs_
 关联的文件系统 / Associated file system
 
char read_buff_ [READ_BUFF_SIZE]
 读取缓冲区 / Read buffer
 
size_t request_read_size_
 本轮计划读取的字节数 / Byte count requested for the current read attempt.
 
RamFS::Dir * current_dir_
 当前目录 / Current directory
 
uint8_t flag_ansi_ = 0
 ANSI 控制字符状态 / ANSI control character state.
 
int offset_ = 0
 光标偏移 / Cursor offset
 
Stack< char > input_line_
 输入行缓冲区 / Input line buffer
 
char * arg_tab_ [MAX_ARG_NUMBER]
 命令参数列表 / Command argument list
 
size_t arg_number_ = 0
 参数数量 / Number of arguments
 
Queue< HistoryLine > history_
 历史命令 / History of commands
 
int history_index_ = -1
 当前历史索引 / Current history index
 
bool linefeed_flag_ = false
 CRLF 抑制标志 / CRLF suppression flag.
 
char linefeed_char_ = '\0'
 上一个换行字符 / Previous line feed character
 
bool line_truncated_
 当前输入行丢弃过超长字符 / Characters beyond MAX_LINE_SIZE were dropped
 

Detailed Description

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
class LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >

基于 RamFS 的命令行终端 / Command-line terminal backed by RamFS.

Template Parameters
READ_BUFF_SIZE读取缓冲区大小 / Read buffer size.
MAX_LINE_SIZE最大输入行长度(字符数)。超出的字符不回显、不写入当前行, 回车时先输出一行截断提示,再照常执行已保留的部分。 Maximum input line length in characters. Further characters are neither echoed nor stored; on Enter a truncation notice is printed and the kept part is executed as usual.
MAX_ARG_NUMBER最大参数数量 / Maximum argument count.
MAX_HISTORY_NUMBER最大历史记录数量 / Maximum history entry count.

Definition at line 33 of file terminal.hpp.

Member Enumeration Documentation

◆ Mode

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
enum class LibXR::Terminal::Mode : uint8_t
strong

终端换行模式 / Terminal line ending mode.

Enumerator
CRLF 

回车换行 / Carriage Return + Line Feed (\r\n)

LF 

仅换行 / Line Feed (\n)

CR 

仅回车 / Carriage Return (\r)

Definition at line 85 of file terminal.hpp.

86 {
87 CRLF = 0,
88 LF = 1,
89 CR = 2
90 };
@ CR
仅回车 / Carriage Return (\r)
@ CRLF
回车换行 / Carriage Return + Line Feed (\r\n)
@ LF
仅换行 / Line Feed (\n)

Constructor & Destructor Documentation

◆ Terminal()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::Terminal ( LibXR::RamFS & ramfs,
RamFS::Dir * current_dir = nullptr,
ReadPort * read_port = STDIO::read_,
WritePort * write_port = STDIO::write_,
Mode MODE = Mode::CRLF )
inline

初始化终端的文件系统和读写端口 / Initialize the terminal filesystem and ports.

Parameters
ramfs关联的文件系统 / Associated filesystem.
current_dir当前目录,默认根目录 / Current directory; defaults to the root.
read_port读端口,默认标准输入 / Read port; defaults to standard input.
write_port写端口,默认标准输出 / Write port; defaults to standard output.
MODE换行模式,默认 CRLF / Line ending mode; defaults to CRLF.
Note
构造时分配存储 / Allocates storage during construction.

Definition at line 102 of file terminal.hpp.

105 : read_status_(ReadOperation::OperationPollingStatus::READY),
106 write_status_(WriteOperation::OperationPollingStatus::READY),
107 MODE(MODE),
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 }
互斥锁类,提供线程同步机制 Mutex class providing thread synchronization mechanisms.
Definition mutex.hpp:18
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 WritePort * write_
写入端口 / Write port instance.
Definition stdio.hpp:26
std::atomic< ReadOperation::OperationPollingStatus > read_status_
读完成方发布、轮询入口读取的状态 / Read completion status used by the polling entry.
Definition terminal.hpp:139
WritePort * write_port_
写入端口 / Write port
Definition terminal.hpp:146
std::atomic< WriteOperation::OperationPollingStatus > write_status_
写完成方发布的轮询状态 / Polling status published by write completion.
Definition terminal.hpp:141
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
RamFS & ramfs_
关联的文件系统 / Associated file system
Definition terminal.hpp:151
WritePort::Stream write_stream_
写入流 / Write stream
Definition terminal.hpp:147
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
const Mode MODE
终端换行模式 / Terminal line feed mode
Definition terminal.hpp:143

Member Function Documentation

◆ AddCharToInputLine()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::AddCharToInputLine ( char data)
inline

向输入行中添加字符,支持在光标位置插入 Adds a character to the input line, supports insertion at the cursor position

Parameters
data要添加的字符 / The character to add

Definition at line 107 of file terminal.hpp.

113 : &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);

◆ AddHistory()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::AddHistory ( )
inline

将当前输入行添加到历史记录 Adds the current input line to the history

Note
超过 MAX_HISTORY_NUMBER 时,当前实现会丢掉最旧的一条,再压入最新输入。 When MAX_HISTORY_NUMBER is exceeded, the current implementation drops the oldest entry before pushing the newest input line.

Definition at line 317 of file terminal.hpp.

334{
335
347template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
348 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
349class Terminal
350{
351 private:
355 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
356
364 static constexpr char CLEAR_ALL[] =
365 "\033[2J\033[1H";
366 static constexpr char CLEAR_LINE[] =
367 "\033[2K\r";
368 static constexpr char CLEAR_BEHIND[] =
369 "\033[K";
370 static constexpr char KEY_RIGHT[] = "\033[C";
371 static constexpr char KEY_LEFT[] = "\033[D";
372 static constexpr char KEY_SAVE[] = "\033[s";
373 static constexpr char KEY_LOAD[] =
374 "\033[u";
375 static constexpr char DELETE_CHAR[] =
376 "\b \b";
377
384 char* StrchrRev(char* str, char c)
385 {
386 auto len = strlen(str);
387 for (int i = static_cast<int>(len - 1); i >= 0; i--)
388 {
389 if (str[i] == c)
390 {
391 return str + i;
392 }
393 }
394 return nullptr;
395 }
396
397 public:
401 enum class Mode : uint8_t
402 {
403 CRLF = 0,
404 LF = 1,
405 CR = 2
406 };
407
418 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
419 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
421 : read_status_(ReadOperation::OperationPollingStatus::READY),
422 write_status_(WriteOperation::OperationPollingStatus::READY),
423 MODE(MODE),
425 read_port_(read_port),
426 write_port_(write_port),
428 ramfs_(ramfs),
429 current_dir_(current_dir ? current_dir : &ramfs_.root_),
430 input_line_(MAX_LINE_SIZE + 1),
431 history_(MAX_HISTORY_NUMBER)
432 {
433 ASSERT(read_port != nullptr);
434 ASSERT(write_port != nullptr);
435 ASSERT(read_port->Readable());
436 ASSERT(write_port->Writable());
437
438 if (write_port == STDIO::write_)
439 {
440 if (STDIO::write_mutex_ == nullptr)
441 {
443 }
444
447 }
448 else
449 {
451 }
452 }
453
455 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
457 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
458
459 const Mode MODE;
461 ReadPort* read_port_;
462 WritePort* write_port_;
463 WritePort::Stream write_stream_;
464
465 LibXR::Mutex* write_mutex_ = nullptr;
466
467 RamFS& ramfs_;
468 char read_buff_[READ_BUFF_SIZE];
469
470 size_t request_read_size_ =
471 0;
472 RamFS::Dir* current_dir_;
473 uint8_t flag_ansi_ = 0;
474 int offset_ = 0;
475 Stack<char> input_line_;
476 char* arg_tab_[MAX_ARG_NUMBER];
477 size_t arg_number_ = 0;
478 Queue<HistoryLine> history_;
479 int history_index_ = -1;
480 bool linefeed_flag_ = false;
481 char linefeed_char_ = '\0';
482 bool line_truncated_ =
483 false;
484
488#include "display.hpp"
489
494#include "command.hpp"
495
499#include "input.hpp"
500
504#include "driver.hpp"
505};
506
507} // namespace LibXR
轻量级内存文件系统 / Lightweight in-memory file system
Definition ramfs.hpp:23
static ReadPort * read_
读取端口 / Read port instance.
Definition stdio.hpp:25
char * arg_tab_[MAX_ARG_NUMBER]
命令参数列表 / Command argument list
Definition terminal.hpp:160
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
char linefeed_char_
上一个换行字符 / Previous line feed character
Definition terminal.hpp:165
char read_buff_[READ_BUFF_SIZE]
读取缓冲区 / Read buffer
Definition terminal.hpp:152
int history_index_
当前历史索引 / Current history index
Definition terminal.hpp:163
int offset_
光标偏移 / Cursor offset
Definition terminal.hpp:158
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
bool linefeed_flag_
CRLF 抑制标志 / CRLF suppression flag.
Definition terminal.hpp:164
终端线程与轮询入口 / Thread and polling entry points for Terminal.
Operation< ErrorCode > ReadOperation
读操作的完成通知描述符 / Read completion descriptor.
Operation< ErrorCode > WriteOperation
写操作的完成通知描述符 / Write completion descriptor.

◆ AutoComplete()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::AutoComplete ( )
inline

实现命令自动补全,匹配目录或文件名 Implements command auto-completion by matching directories or file names

Note
当前自动补全只处理“第一参数且光标在该参数尾部”这一种情况,不会解析后续参数。 The current auto-completion handles only the first argument when the cursor is at that argument's tail; it does not parse later arguments.

Definition at line 240 of file terminal.hpp.

257{
258
270template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
271 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
272class Terminal
273{
274 private:
278 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
279
287 static constexpr char CLEAR_ALL[] =
288 "\033[2J\033[1H";
289 static constexpr char CLEAR_LINE[] =
290 "\033[2K\r";
291 static constexpr char CLEAR_BEHIND[] =
292 "\033[K";
293 static constexpr char KEY_RIGHT[] = "\033[C";
294 static constexpr char KEY_LEFT[] = "\033[D";
295 static constexpr char KEY_SAVE[] = "\033[s";
296 static constexpr char KEY_LOAD[] =
297 "\033[u";
298 static constexpr char DELETE_CHAR[] =
299 "\b \b";
300
307 char* StrchrRev(char* str, char c)
308 {
309 auto len = strlen(str);
310 for (int i = static_cast<int>(len - 1); i >= 0; i--)
311 {
312 if (str[i] == c)
313 {
314 return str + i;
315 }
316 }
317 return nullptr;
318 }
319
320 public:
324 enum class Mode : uint8_t
325 {
326 CRLF = 0,
327 LF = 1,
328 CR = 2
329 };
330
341 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
342 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
344 : read_status_(ReadOperation::OperationPollingStatus::READY),
345 write_status_(WriteOperation::OperationPollingStatus::READY),
346 MODE(MODE),
348 read_port_(read_port),
349 write_port_(write_port),
351 ramfs_(ramfs),
352 current_dir_(current_dir ? current_dir : &ramfs_.root_),
353 input_line_(MAX_LINE_SIZE + 1),
354 history_(MAX_HISTORY_NUMBER)
355 {
356 ASSERT(read_port != nullptr);
357 ASSERT(write_port != nullptr);
358 ASSERT(read_port->Readable());
359 ASSERT(write_port->Writable());
360
361 if (write_port == STDIO::write_)
362 {
363 if (STDIO::write_mutex_ == nullptr)
364 {
366 }
367
370 }
371 else
372 {
374 }
375 }
376
378 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
380 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
381
382 const Mode MODE;
384 ReadPort* read_port_;
385 WritePort* write_port_;
386 WritePort::Stream write_stream_;
387
388 LibXR::Mutex* write_mutex_ = nullptr;
389
390 RamFS& ramfs_;
391 char read_buff_[READ_BUFF_SIZE];
392
393 size_t request_read_size_ =
394 0;
395 RamFS::Dir* current_dir_;
396 uint8_t flag_ansi_ = 0;
397 int offset_ = 0;
398 Stack<char> input_line_;
399 char* arg_tab_[MAX_ARG_NUMBER];
400 size_t arg_number_ = 0;
401 Queue<HistoryLine> history_;
402 int history_index_ = -1;
403 bool linefeed_flag_ = false;
404 char linefeed_char_ = '\0';
405 bool line_truncated_ =
406 false;
407
411#include "display.hpp"
412
417#include "command.hpp"
418
422#include "input.hpp"
423
427#include "driver.hpp"
428};
429
430} // namespace LibXR

◆ CanDeleteChar()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
bool LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::CanDeleteChar ( )
inline

检查是否可以删除字符 Checks if a character can be deleted

Returns
bool 是否可以删除字符 / Whether the character can be deleted

Definition at line 100 of file terminal.hpp.

◆ CanDisplayChar()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
bool LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::CanDisplayChar ( )
inline

检查是否可以显示字符 Checks if a character can be displayed

Returns
bool 是否可以显示字符 / Whether the character can be displayed

Definition at line 93 of file terminal.hpp.

◆ Clear()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::Clear ( )
inline

清除整个终端屏幕 Clears the entire terminal screen

Definition at line 264 of file terminal.hpp.

281{
282
294template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
295 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
296class Terminal
297{
298 private:
302 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
303
311 static constexpr char CLEAR_ALL[] =
312 "\033[2J\033[1H";
313 static constexpr char CLEAR_LINE[] =
314 "\033[2K\r";
315 static constexpr char CLEAR_BEHIND[] =
316 "\033[K";
317 static constexpr char KEY_RIGHT[] = "\033[C";
318 static constexpr char KEY_LEFT[] = "\033[D";
319 static constexpr char KEY_SAVE[] = "\033[s";
320 static constexpr char KEY_LOAD[] =
321 "\033[u";
322 static constexpr char DELETE_CHAR[] =
323 "\b \b";
324
331 char* StrchrRev(char* str, char c)
332 {
333 auto len = strlen(str);
334 for (int i = static_cast<int>(len - 1); i >= 0; i--)
335 {
336 if (str[i] == c)
337 {
338 return str + i;
339 }
340 }
341 return nullptr;
342 }
343
344 public:
348 enum class Mode : uint8_t
349 {
350 CRLF = 0,
351 LF = 1,
352 CR = 2
353 };
354
365 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
366 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
368 : read_status_(ReadOperation::OperationPollingStatus::READY),
369 write_status_(WriteOperation::OperationPollingStatus::READY),
370 MODE(MODE),
372 read_port_(read_port),
373 write_port_(write_port),
375 ramfs_(ramfs),
376 current_dir_(current_dir ? current_dir : &ramfs_.root_),
377 input_line_(MAX_LINE_SIZE + 1),
378 history_(MAX_HISTORY_NUMBER)
379 {
380 ASSERT(read_port != nullptr);
381 ASSERT(write_port != nullptr);
382 ASSERT(read_port->Readable());
383 ASSERT(write_port->Writable());
384
385 if (write_port == STDIO::write_)
386 {
387 if (STDIO::write_mutex_ == nullptr)
388 {
390 }
391
394 }
395 else
396 {
398 }
399 }
400
402 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
404 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
405
406 const Mode MODE;
408 ReadPort* read_port_;
409 WritePort* write_port_;
410 WritePort::Stream write_stream_;
411
412 LibXR::Mutex* write_mutex_ = nullptr;
413
414 RamFS& ramfs_;
415 char read_buff_[READ_BUFF_SIZE];
416
417 size_t request_read_size_ =
418 0;
419 RamFS::Dir* current_dir_;
420 uint8_t flag_ansi_ = 0;
421 int offset_ = 0;
422 Stack<char> input_line_;
423 char* arg_tab_[MAX_ARG_NUMBER];
424 size_t arg_number_ = 0;
425 Queue<HistoryLine> history_;
426 int history_index_ = -1;
427 bool linefeed_flag_ = false;
428 char linefeed_char_ = '\0';
429 bool line_truncated_ =
430 false;
431
435#include "display.hpp"
436
441#include "command.hpp"
442
446#include "input.hpp"
447
451#include "driver.hpp"
452};
453
454} // namespace LibXR

◆ ClearLine()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ClearLine ( )
inline

清除当前行 Clears the current line

Definition at line 258 of file terminal.hpp.

275{
276
288template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
289 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
290class Terminal
291{
292 private:
296 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
297
305 static constexpr char CLEAR_ALL[] =
306 "\033[2J\033[1H";
307 static constexpr char CLEAR_LINE[] =
308 "\033[2K\r";
309 static constexpr char CLEAR_BEHIND[] =
310 "\033[K";
311 static constexpr char KEY_RIGHT[] = "\033[C";
312 static constexpr char KEY_LEFT[] = "\033[D";
313 static constexpr char KEY_SAVE[] = "\033[s";
314 static constexpr char KEY_LOAD[] =
315 "\033[u";
316 static constexpr char DELETE_CHAR[] =
317 "\b \b";
318
325 char* StrchrRev(char* str, char c)
326 {
327 auto len = strlen(str);
328 for (int i = static_cast<int>(len - 1); i >= 0; i--)
329 {
330 if (str[i] == c)
331 {
332 return str + i;
333 }
334 }
335 return nullptr;
336 }
337
338 public:
342 enum class Mode : uint8_t
343 {
344 CRLF = 0,
345 LF = 1,
346 CR = 2
347 };
348
359 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
360 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
362 : read_status_(ReadOperation::OperationPollingStatus::READY),
363 write_status_(WriteOperation::OperationPollingStatus::READY),
364 MODE(MODE),
366 read_port_(read_port),
367 write_port_(write_port),
369 ramfs_(ramfs),
370 current_dir_(current_dir ? current_dir : &ramfs_.root_),
371 input_line_(MAX_LINE_SIZE + 1),
372 history_(MAX_HISTORY_NUMBER)
373 {
374 ASSERT(read_port != nullptr);
375 ASSERT(write_port != nullptr);
376 ASSERT(read_port->Readable());
377 ASSERT(write_port->Writable());
378
379 if (write_port == STDIO::write_)
380 {
381 if (STDIO::write_mutex_ == nullptr)
382 {
384 }
385
388 }
389 else
390 {
392 }
393 }
394
396 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
398 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
399
400 const Mode MODE;
402 ReadPort* read_port_;
403 WritePort* write_port_;
404 WritePort::Stream write_stream_;
405
406 LibXR::Mutex* write_mutex_ = nullptr;
407
408 RamFS& ramfs_;
409 char read_buff_[READ_BUFF_SIZE];
410
411 size_t request_read_size_ =
412 0;
413 RamFS::Dir* current_dir_;
414 uint8_t flag_ansi_ = 0;
415 int offset_ = 0;
416 Stack<char> input_line_;
417 char* arg_tab_[MAX_ARG_NUMBER];
418 size_t arg_number_ = 0;
419 Queue<HistoryLine> history_;
420 int history_index_ = -1;
421 bool linefeed_flag_ = false;
422 char linefeed_char_ = '\0';
423 bool line_truncated_ =
424 false;
425
429#include "display.hpp"
430
435#include "command.hpp"
436
440#include "input.hpp"
441
445#include "driver.hpp"
446};
447
448} // namespace LibXR

◆ CopyHistoryToInputLine()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::CopyHistoryToInputLine ( )
inline

将历史命令复制到输入行,并重置历史索引、光标偏移和截断标记 Copies the history command to the input line and resets the history index, the cursor offset and the truncation mark

Definition at line 295 of file terminal.hpp.

312{
313
325template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
326 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
327class Terminal
328{
329 private:
333 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
334
342 static constexpr char CLEAR_ALL[] =
343 "\033[2J\033[1H";
344 static constexpr char CLEAR_LINE[] =
345 "\033[2K\r";
346 static constexpr char CLEAR_BEHIND[] =
347 "\033[K";
348 static constexpr char KEY_RIGHT[] = "\033[C";
349 static constexpr char KEY_LEFT[] = "\033[D";
350 static constexpr char KEY_SAVE[] = "\033[s";
351 static constexpr char KEY_LOAD[] =
352 "\033[u";
353 static constexpr char DELETE_CHAR[] =
354 "\b \b";
355
362 char* StrchrRev(char* str, char c)
363 {
364 auto len = strlen(str);
365 for (int i = static_cast<int>(len - 1); i >= 0; i--)
366 {
367 if (str[i] == c)
368 {
369 return str + i;
370 }
371 }
372 return nullptr;
373 }
374
375 public:
379 enum class Mode : uint8_t
380 {
381 CRLF = 0,
382 LF = 1,
383 CR = 2
384 };
385
396 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
397 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
399 : read_status_(ReadOperation::OperationPollingStatus::READY),
400 write_status_(WriteOperation::OperationPollingStatus::READY),
401 MODE(MODE),
403 read_port_(read_port),
404 write_port_(write_port),
406 ramfs_(ramfs),
407 current_dir_(current_dir ? current_dir : &ramfs_.root_),
408 input_line_(MAX_LINE_SIZE + 1),
409 history_(MAX_HISTORY_NUMBER)
410 {
411 ASSERT(read_port != nullptr);
412 ASSERT(write_port != nullptr);
413 ASSERT(read_port->Readable());
414 ASSERT(write_port->Writable());
415
416 if (write_port == STDIO::write_)
417 {
418 if (STDIO::write_mutex_ == nullptr)
419 {
421 }
422
425 }
426 else
427 {
429 }
430 }
431
433 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
435 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
436
437 const Mode MODE;
439 ReadPort* read_port_;
440 WritePort* write_port_;
441 WritePort::Stream write_stream_;
442
443 LibXR::Mutex* write_mutex_ = nullptr;
444
445 RamFS& ramfs_;
446 char read_buff_[READ_BUFF_SIZE];
447
448 size_t request_read_size_ =
449 0;
450 RamFS::Dir* current_dir_;
451 uint8_t flag_ansi_ = 0;
452 int offset_ = 0;
453 Stack<char> input_line_;
454 char* arg_tab_[MAX_ARG_NUMBER];
455 size_t arg_number_ = 0;
456 Queue<HistoryLine> history_;
457 int history_index_ = -1;
458 bool linefeed_flag_ = false;
459 char linefeed_char_ = '\0';
460 bool line_truncated_ =
461 false;
462
466#include "display.hpp"
467
472#include "command.hpp"
473
477#include "input.hpp"
478
482#include "driver.hpp"
483};
484
485} // namespace LibXR

◆ DeleteChar()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::DeleteChar ( )
inline

处理删除字符操作,支持回退删除,并在历史模式下更新显示 Handles the delete character operation, supports backspace deletion, and updates display in history mode

Definition at line 181 of file terminal.hpp.

◆ DisplayChar()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::DisplayChar ( char data)
inline

在终端上显示字符,并根据历史记录模式进行相应操作 Displays a character on the terminal and updates accordingly if history mode is active

Parameters
data要显示的字符 / The character to display

Definition at line 126 of file terminal.hpp.

133 {
135 }
136 }
137
139 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
141 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
142
143 const Mode MODE;
145 ReadPort* read_port_;
146 WritePort* write_port_;
147 WritePort::Stream write_stream_;
148
149 LibXR::Mutex* write_mutex_ = nullptr;
150
151 RamFS& ramfs_;
152 char read_buff_[READ_BUFF_SIZE];
153
154 size_t request_read_size_ =
155 0;
156 RamFS::Dir* current_dir_;

◆ ExecuteCommand()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ExecuteCommand ( )
inline

解析并执行输入的命令 Parses and executes the entered command

Note
当前实现只内建了 cd 和 ls;其它命令都按“把第一个参数当 RamFS 可执行文件 路径”来处理。 The current implementation provides only the built-in cd and ls; every other command is handled by treating the first argument as the path of an executable RamFS file.

Definition at line 152 of file terminal.hpp.

◆ GetArgs()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::GetArgs ( )
inline

路径解析、命令执行与补全实现 / Path parsing, command execution, and completion.

Terminal 的命令解析片段 Command-parsing fragment of Terminal

Note
这一组函数只负责把当前输入行解释成命令:参数切分、路径解析、内建命令执行、 可执行文件查找以及自动补全。 This group is responsible only for interpreting the current input line as a command: argument tokenization, path resolution, built-in command execution, executable lookup, and auto-completion.

解析输入行,将其拆分为参数数组 Parses the input line and splits it into argument array

Note
该过程会原地把空格改成 \0,并把每个参数起始位置填进 arg_tab_。 This process overwrites spaces in-place with \0 and stores each argument start pointer into arg_tab_.

Definition at line 21 of file terminal.hpp.

34{
35 private:

◆ HandleAnsiCharacter()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::HandleAnsiCharacter ( char data)
inline

处理 ANSI 序列中的后续字符 Handles the follow-up characters of an ANSI sequence

Parameters
data输入字符 / The input character
Note
当前实现只识别箭头键对应的尾字符;其它 ANSI 序列会被静默忽略。 The current implementation recognizes only the tail characters used by arrow keys; other ANSI sequences are ignored silently.

Definition at line 37 of file terminal.hpp.

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

◆ HandleCharacter()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::HandleCharacter ( char data)
inline

处理输入字符,根据类型调用相应的处理函数 Handles input characters, dispatching them to the appropriate handler

Parameters
data输入的字符 / The input character

Definition at line 171 of file terminal.hpp.

◆ HandleControlCharacter()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::HandleControlCharacter ( char data)
inline

处理控制字符,包括换行、删除、制表符等 Handles control characters such as newline, delete, and tab

Parameters
data输入的控制字符 / The input control character
Note
这里还负责去掉一对 \r\n / \n\r 双换行中的重复第二字节,避免一次回车被 当成两次命令提交。 This path also suppresses the duplicated second byte of one \r\n / \n\r pair so a single Enter key does not submit the command twice.

Definition at line 111 of file terminal.hpp.

113 : &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;
145 ReadPort* read_port_;
146 WritePort* write_port_;
147 WritePort::Stream write_stream_;
148
149 LibXR::Mutex* write_mutex_ = nullptr;
150
151 RamFS& ramfs_;
152 char read_buff_[READ_BUFF_SIZE];
153
154 size_t request_read_size_ =
155 0;
156 RamFS::Dir* current_dir_;
157 uint8_t flag_ansi_ = 0;
158 int offset_ = 0;
159 Stack<char> input_line_;
160 char* arg_tab_[MAX_ARG_NUMBER];
161 size_t arg_number_ = 0;
162 Queue<HistoryLine> history_;
163 int history_index_ = -1;
164 bool linefeed_flag_ = false;

◆ HistoryFromNewest()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
const HistoryLine & LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::HistoryFromNewest ( int index_from_newest)
inline

按“从最新到最旧”的顺序取历史记录 Fetches one history entry counting from newest to oldest

Parameters
index_from_newest从最新一条开始的偏移;0 表示最新一条 Offset counted from the newest entry; 0 means the newest one
Returns
const HistoryLine& 对应的历史记录 Reference to the requested history entry
Note
Queue::operator[] 支持负索引从尾部反向访问,但这里把这个细节包起来, 避免调用点直接暴露 history_[-index - 1] 这种难读写法。 Queue::operator[] supports negative indices to walk backward from the tail, but this helper hides that detail so call sites do not have to expose the hard-to-read history_[-index - 1] form directly.

Definition at line 42 of file terminal.hpp.

◆ HistoryLineSize()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
static size_t LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::HistoryLineSize ( const HistoryLine & line)
inlinestatic

行编辑、显示与历史记录实现 / Line editing, display, and command history.

Terminal 的显示与历史记录片段 Display and history fragment of Terminal

Note
这一组函数只负责行编辑、提示符显示、光标移动,以及历史记录的展示/拷回。 This group is responsible only for line editing, prompt rendering, cursor movement, and displaying / restoring history entries.

计算一条历史命令的实际文本长度 Calculates the actual text length of one stored history line

Parameters
line历史命令缓存 / Stored history line
Returns
size_t 历史命令的实际长度 Actual length of the history line

Definition at line 18 of file terminal.hpp.

18{
19

◆ LineFeed()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::LineFeed ( )
inline

执行换行操作 Performs a line feed operation

Note
具体输出 \r\n、\n 还是 \r 由构造时选定的 MODE 决定。 The actual emitted line ending is selected by the MODE chosen at construction time.

Definition at line 57 of file terminal.hpp.

69 {
70 auto len = strlen(str);
71 for (int i = static_cast<int>(len - 1); i >= 0; i--)

◆ Parse()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::Parse ( RawData & raw_data)
inline

输入与控制字符解析实现 / Input and control-character parsing.

Terminal 的输入解析片段 Input-parsing fragment of Terminal

Note
这一组函数只负责把读到的原始字节分发成 ANSI 序列、可显示字符或控制字符, 不直接处理文件系统命令语义。 This group is responsible only for routing raw bytes into ANSI sequences, printable characters, or control characters; it does not directly own filesystem-command semantics.

解析输入数据流,将其转换为字符并处理 Parses the input data stream, converting it into characters and processing them

Parameters
raw_data输入的原始数据 / Input raw data

Definition at line 19 of file terminal.hpp.

◆ Path2Dir()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
RamFS::Dir * LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::Path2Dir ( char * path)
inline

将路径字符串解析为目录对象 Converts a path string into a directory object

Parameters
path目录路径字符串 / The directory path string
Returns
RamFS::Dir* 解析出的目录指针,若找不到则返回 nullptr Pointer to the resolved directory, or nullptr if not found
Note
解析过程中会暂时把路径中的 / 改写成 \0 再恢复,所以调用方必须传入可写 缓冲区,而不是字符串常量。 The resolver temporarily rewrites / to \0 and restores it later, so callers must provide a writable buffer rather than a string literal.

Definition at line 52 of file terminal.hpp.

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

◆ Path2File()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
RamFS::File * LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::Path2File ( char * path)
inline

将路径字符串解析为文件对象 Converts a path string into a file object

Parameters
path文件路径字符串 / The file path string
Returns
RamFS::File* 解析出的文件指针,若找不到则返回 nullptr Pointer to the resolved file, or nullptr if not found
Note
这个解析同样会临时切开路径字符串,因此也要求 path 可写。 This resolver also temporarily splits the path string and therefore requires path to be writable.

Definition at line 110 of file terminal.hpp.

113 : &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_;

◆ RemoveCharFromInputLine()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::RemoveCharFromInputLine ( )
inline

从输入行中删除字符,支持在光标位置删除 Removes a character from the input line, supports deletion at the cursor position

Definition at line 163 of file terminal.hpp.

◆ ShowHeader()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ShowHeader ( )
inline

显示终端提示符,包括当前目录信息 Displays the terminal prompt, including the current directory information

Definition at line 214 of file terminal.hpp.

231{
232
244template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
245 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
246class Terminal
247{
248 private:
252 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
253
261 static constexpr char CLEAR_ALL[] =
262 "\033[2J\033[1H";
263 static constexpr char CLEAR_LINE[] =
264 "\033[2K\r";
265 static constexpr char CLEAR_BEHIND[] =
266 "\033[K";
267 static constexpr char KEY_RIGHT[] = "\033[C";
268 static constexpr char KEY_LEFT[] = "\033[D";
269 static constexpr char KEY_SAVE[] = "\033[s";
270 static constexpr char KEY_LOAD[] =
271 "\033[u";
272 static constexpr char DELETE_CHAR[] =
273 "\b \b";
274
281 char* StrchrRev(char* str, char c)
282 {
283 auto len = strlen(str);
284 for (int i = static_cast<int>(len - 1); i >= 0; i--)
285 {
286 if (str[i] == c)
287 {
288 return str + i;
289 }
290 }
291 return nullptr;
292 }
293
294 public:
298 enum class Mode : uint8_t
299 {
300 CRLF = 0,
301 LF = 1,
302 CR = 2
303 };
304
315 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
316 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
318 : read_status_(ReadOperation::OperationPollingStatus::READY),
319 write_status_(WriteOperation::OperationPollingStatus::READY),
320 MODE(MODE),
322 read_port_(read_port),
323 write_port_(write_port),
325 ramfs_(ramfs),
326 current_dir_(current_dir ? current_dir : &ramfs_.root_),
327 input_line_(MAX_LINE_SIZE + 1),
328 history_(MAX_HISTORY_NUMBER)
329 {
330 ASSERT(read_port != nullptr);
331 ASSERT(write_port != nullptr);
332 ASSERT(read_port->Readable());
333 ASSERT(write_port->Writable());
334
335 if (write_port == STDIO::write_)
336 {
337 if (STDIO::write_mutex_ == nullptr)
338 {
340 }
341
344 }
345 else
346 {
348 }
349 }
350
352 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
354 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
355
356 const Mode MODE;
358 ReadPort* read_port_;
359 WritePort* write_port_;
360 WritePort::Stream write_stream_;
361
362 LibXR::Mutex* write_mutex_ = nullptr;
363
364 RamFS& ramfs_;
365 char read_buff_[READ_BUFF_SIZE];
366
367 size_t request_read_size_ =
368 0;
369 RamFS::Dir* current_dir_;
370 uint8_t flag_ansi_ = 0;
371 int offset_ = 0;
372 Stack<char> input_line_;
373 char* arg_tab_[MAX_ARG_NUMBER];
374 size_t arg_number_ = 0;
375 Queue<HistoryLine> history_;
376 int history_index_ = -1;
377 bool linefeed_flag_ = false;
378 char linefeed_char_ = '\0';
379 bool line_truncated_ =
380 false;
381
385#include "display.hpp"
386
391#include "command.hpp"
392
396#include "input.hpp"
397
401#include "driver.hpp"
402};
403
404} // namespace LibXR

◆ ShowHistory()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ShowHistory ( )
inline

显示历史记录中的输入行,更新终端显示 Displays the input line from history and updates the terminal display

Note
当 history_index_ < 0 时,这里回显的是当前尚未提交的输入行,而不是历史项。 When history_index_ < 0, this echoes the current in-progress input line rather than one history entry.

Definition at line 274 of file terminal.hpp.

291{
292
304template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
305 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
306class Terminal
307{
308 private:
312 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
313
321 static constexpr char CLEAR_ALL[] =
322 "\033[2J\033[1H";
323 static constexpr char CLEAR_LINE[] =
324 "\033[2K\r";
325 static constexpr char CLEAR_BEHIND[] =
326 "\033[K";
327 static constexpr char KEY_RIGHT[] = "\033[C";
328 static constexpr char KEY_LEFT[] = "\033[D";
329 static constexpr char KEY_SAVE[] = "\033[s";
330 static constexpr char KEY_LOAD[] =
331 "\033[u";
332 static constexpr char DELETE_CHAR[] =
333 "\b \b";
334
341 char* StrchrRev(char* str, char c)
342 {
343 auto len = strlen(str);
344 for (int i = static_cast<int>(len - 1); i >= 0; i--)
345 {
346 if (str[i] == c)
347 {
348 return str + i;
349 }
350 }
351 return nullptr;
352 }
353
354 public:
358 enum class Mode : uint8_t
359 {
360 CRLF = 0,
361 LF = 1,
362 CR = 2
363 };
364
375 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
376 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
378 : read_status_(ReadOperation::OperationPollingStatus::READY),
379 write_status_(WriteOperation::OperationPollingStatus::READY),
380 MODE(MODE),
382 read_port_(read_port),
383 write_port_(write_port),
385 ramfs_(ramfs),
386 current_dir_(current_dir ? current_dir : &ramfs_.root_),
387 input_line_(MAX_LINE_SIZE + 1),
388 history_(MAX_HISTORY_NUMBER)
389 {
390 ASSERT(read_port != nullptr);
391 ASSERT(write_port != nullptr);
392 ASSERT(read_port->Readable());
393 ASSERT(write_port->Writable());
394
395 if (write_port == STDIO::write_)
396 {
397 if (STDIO::write_mutex_ == nullptr)
398 {
400 }
401
404 }
405 else
406 {
408 }
409 }
410
412 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
414 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
415
416 const Mode MODE;
418 ReadPort* read_port_;
419 WritePort* write_port_;
420 WritePort::Stream write_stream_;
421
422 LibXR::Mutex* write_mutex_ = nullptr;
423
424 RamFS& ramfs_;
425 char read_buff_[READ_BUFF_SIZE];
426
427 size_t request_read_size_ =
428 0;
429 RamFS::Dir* current_dir_;
430 uint8_t flag_ansi_ = 0;
431 int offset_ = 0;
432 Stack<char> input_line_;
433 char* arg_tab_[MAX_ARG_NUMBER];
434 size_t arg_number_ = 0;
435 Queue<HistoryLine> history_;
436 int history_index_ = -1;
437 bool linefeed_flag_ = false;
438 char linefeed_char_ = '\0';
439 bool line_truncated_ =
440 false;
441
445#include "display.hpp"
446
451#include "command.hpp"
452
456#include "input.hpp"
457
461#include "driver.hpp"
462};
463
464} // namespace LibXR

◆ ShowTruncatedLineNotice()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ShowTruncatedLineNotice ( )
inline

输出输入行被截断的提示 Prints the notice that the input line was truncated

Note
提示写明保留的字符数,即模板参数 MAX_LINE_SIZE,随后换行。 The notice names the kept character count, the template parameter MAX_LINE_SIZE, and ends with a line feed.

Definition at line 237 of file terminal.hpp.

254{
255
267template <size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE,
268 size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
269class Terminal
270{
271 private:
275 using HistoryLine = std::array<char, MAX_LINE_SIZE + 1>;
276
284 static constexpr char CLEAR_ALL[] =
285 "\033[2J\033[1H";
286 static constexpr char CLEAR_LINE[] =
287 "\033[2K\r";
288 static constexpr char CLEAR_BEHIND[] =
289 "\033[K";
290 static constexpr char KEY_RIGHT[] = "\033[C";
291 static constexpr char KEY_LEFT[] = "\033[D";
292 static constexpr char KEY_SAVE[] = "\033[s";
293 static constexpr char KEY_LOAD[] =
294 "\033[u";
295 static constexpr char DELETE_CHAR[] =
296 "\b \b";
297
304 char* StrchrRev(char* str, char c)
305 {
306 auto len = strlen(str);
307 for (int i = static_cast<int>(len - 1); i >= 0; i--)
308 {
309 if (str[i] == c)
310 {
311 return str + i;
312 }
313 }
314 return nullptr;
315 }
316
317 public:
321 enum class Mode : uint8_t
322 {
323 CRLF = 0,
324 LF = 1,
325 CR = 2
326 };
327
338 Terminal(LibXR::RamFS& ramfs, RamFS::Dir* current_dir = nullptr,
339 ReadPort* read_port = STDIO::read_, WritePort* write_port = STDIO::write_,
341 : read_status_(ReadOperation::OperationPollingStatus::READY),
342 write_status_(WriteOperation::OperationPollingStatus::READY),
343 MODE(MODE),
345 read_port_(read_port),
346 write_port_(write_port),
348 ramfs_(ramfs),
349 current_dir_(current_dir ? current_dir : &ramfs_.root_),
350 input_line_(MAX_LINE_SIZE + 1),
351 history_(MAX_HISTORY_NUMBER)
352 {
353 ASSERT(read_port != nullptr);
354 ASSERT(write_port != nullptr);
355 ASSERT(read_port->Readable());
356 ASSERT(write_port->Writable());
357
358 if (write_port == STDIO::write_)
359 {
360 if (STDIO::write_mutex_ == nullptr)
361 {
363 }
364
367 }
368 else
369 {
371 }
372 }
373
375 std::atomic<ReadOperation::OperationPollingStatus> read_status_;
377 std::atomic<WriteOperation::OperationPollingStatus> write_status_;
378
379 const Mode MODE;
381 ReadPort* read_port_;
382 WritePort* write_port_;
383 WritePort::Stream write_stream_;
384
385 LibXR::Mutex* write_mutex_ = nullptr;
386
387 RamFS& ramfs_;
388 char read_buff_[READ_BUFF_SIZE];
389
390 size_t request_read_size_ =
391 0;
392 RamFS::Dir* current_dir_;
393 uint8_t flag_ansi_ = 0;
394 int offset_ = 0;
395 Stack<char> input_line_;
396 char* arg_tab_[MAX_ARG_NUMBER];
397 size_t arg_number_ = 0;
398 Queue<HistoryLine> history_;
399 int history_index_ = -1;
400 bool linefeed_flag_ = false;
401 char linefeed_char_ = '\0';
402 bool line_truncated_ =
403 false;
404
408#include "display.hpp"
409
414#include "command.hpp"
415
419#include "input.hpp"
420
424#include "driver.hpp"
425};
426
427} // namespace LibXR

◆ TaskFun()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
static void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::TaskFun ( Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER > * term)
inlinestatic

检查读取结果并推进终端输入 / Check read completion and advance terminal input.

Parameters
term终端实例 / Terminal instance.
Note
首次调用发起读取;RUNNING 时返回,DONE 时解析并提交输出,再发起下次读取。 ERROR 时重新读取。解析和输出提交受 write_mutex_ 保护。 Starts a read on first use; returns for RUNNING. On DONE, parses and commits output, then starts the next read. On ERROR, restarts reading. Parsing and output submission hold write_mutex_.

Definition at line 46 of file terminal.hpp.

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 };

◆ ThreadFun()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
static void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ThreadFun ( Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER > * term)
inlinestatic

在线程中读取输入并驱动终端 / Read input and drive the terminal in a thread.

Parameters
term终端实例 / Terminal instance.
Note
无数据时通过零长度 BLOCK 读等待队列非空;取得输入后,在 write_mutex_ 保护下 解析并提交输出。 With no data, a zero-length BLOCK read waits for a nonempty queue. Received input is parsed and output committed under write_mutex_.

Definition at line 15 of file terminal.hpp.

18{
19
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>
33class Terminal
34{
35 private:

◆ UpdateDisplayPosition()

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
void LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::UpdateDisplayPosition ( )
inline

更新光标位置 Updates cursor position

Note
这里只重绘光标右侧的可见后缀;光标左侧的内容已经在输入缓冲区中保留。 This redraws only the visible suffix to the right of the cursor; the left side is already preserved in the input buffer.

Definition at line 81 of file terminal.hpp.

81 :
85 enum class Mode : uint8_t
86 {

Member Data Documentation

◆ arg_number_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
size_t LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::arg_number_ = 0

参数数量 / Number of arguments

Definition at line 161 of file terminal.hpp.

◆ arg_tab_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
char* LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::arg_tab_[MAX_ARG_NUMBER]

命令参数列表 / Command argument list

Definition at line 160 of file terminal.hpp.

◆ current_dir_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
RamFS::Dir* LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::current_dir_

当前目录 / Current directory

Definition at line 156 of file terminal.hpp.

◆ flag_ansi_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
uint8_t LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::flag_ansi_ = 0

ANSI 控制字符状态 / ANSI control character state.

Definition at line 157 of file terminal.hpp.

◆ history_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
Queue<HistoryLine> LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::history_

历史命令 / History of commands

Definition at line 162 of file terminal.hpp.

◆ history_index_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
int LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::history_index_ = -1

当前历史索引 / Current history index

Definition at line 163 of file terminal.hpp.

◆ input_line_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
Stack<char> LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::input_line_

输入行缓冲区 / Input line buffer

Definition at line 159 of file terminal.hpp.

◆ line_truncated_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
bool LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::line_truncated_
Initial value:
=
false

当前输入行丢弃过超长字符 / Characters beyond MAX_LINE_SIZE were dropped

Definition at line 166 of file terminal.hpp.

◆ linefeed_char_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
char LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::linefeed_char_ = '\0'

上一个换行字符 / Previous line feed character

Definition at line 165 of file terminal.hpp.

◆ linefeed_flag_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
bool LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::linefeed_flag_ = false

CRLF 抑制标志 / CRLF suppression flag.

Definition at line 164 of file terminal.hpp.

◆ MODE

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
const Mode LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::MODE

终端换行模式 / Terminal line feed mode

Definition at line 143 of file terminal.hpp.

◆ offset_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
int LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::offset_ = 0

光标偏移 / Cursor offset

Definition at line 158 of file terminal.hpp.

◆ ramfs_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
RamFS& LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::ramfs_

关联的文件系统 / Associated file system

Definition at line 151 of file terminal.hpp.

◆ read_buff_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
char LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::read_buff_[READ_BUFF_SIZE]

读取缓冲区 / Read buffer

Definition at line 152 of file terminal.hpp.

◆ read_port_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
ReadPort* LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::read_port_

读取端口 / Read port

Definition at line 145 of file terminal.hpp.

◆ read_status_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
std::atomic<ReadOperation::OperationPollingStatus> LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::read_status_

读完成方发布、轮询入口读取的状态 / Read completion status used by the polling entry.

Definition at line 139 of file terminal.hpp.

◆ request_read_size_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
size_t LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::request_read_size_
Initial value:
=
0

本轮计划读取的字节数 / Byte count requested for the current read attempt.

Definition at line 154 of file terminal.hpp.

◆ write_mutex_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
LibXR::Mutex* LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::write_mutex_ = nullptr

写入端口互斥锁 / Write port mutex

Definition at line 149 of file terminal.hpp.

◆ write_op_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
WriteOperation LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::write_op_

终端写操作 / Terminal write operation

Definition at line 144 of file terminal.hpp.

◆ write_port_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
WritePort* LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::write_port_

写入端口 / Write port

Definition at line 146 of file terminal.hpp.

◆ write_status_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
std::atomic<WriteOperation::OperationPollingStatus> LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::write_status_

写完成方发布的轮询状态 / Polling status published by write completion.

Definition at line 141 of file terminal.hpp.

◆ write_stream_

template<size_t READ_BUFF_SIZE = 32, size_t MAX_LINE_SIZE = READ_BUFF_SIZE, size_t MAX_ARG_NUMBER = 5, size_t MAX_HISTORY_NUMBER = 5>
WritePort::Stream LibXR::Terminal< READ_BUFF_SIZE, MAX_LINE_SIZE, MAX_ARG_NUMBER, MAX_HISTORY_NUMBER >::write_stream_

写入流 / Write stream

Definition at line 147 of file terminal.hpp.


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