19个版本

新版本 0.3.7 2024年8月18日
0.3.6 2024年8月6日
0.2.7 2024年7月30日
0.1.2 2024年7月26日

#108 in 嵌入式开发

Download history 779/week @ 2024-07-25 642/week @ 2024-08-01 96/week @ 2024-08-08 140/week @ 2024-08-15

1,657 每月下载
用于 good-os-framework

MIT 许可证

47KB
1K SLoC

OS Terminal

适用于嵌入式系统和操作系统内核的 no_std 终端库。

由于使用了动态内存分配的 alloc 包,因此环境应已初始化 global_allocator

屏幕截图

此屏幕截图显示了在示例终端中运行 fastfetch 的结果。您可以通过运行 cargo run --example terminal(仅限Linux)来尝试它。它将默认执行 bash

功能

  • 嵌入式平滑Noto Sans Mono字体渲染
  • TrueType字体支持
  • VT100和部分xterm转义序列支持
  • 美丽的配色方案
  • 光标显示和形状控制

使用方法

创建一个用于包装您的帧缓冲区的显示包装器,并为它实现 DrawTarget 特性。

use alloc::boxed::Box;
use os_terminal::{DrawTarget, Rgb888, Terminal};
use os_terminal::font::BitmapFont;

struct Display {
    width: usize,
    height: usize,
    buffer: &'static [u32],
}

impl DrawTarget for Display {
    fn size(&self) -> (usize, usize) {
        (self.width, self.height)
    }

    #[inline(always)]
    fn draw_pixel(&mut self, x: usize, y: usize, color: Rgb888) {
        let value = (color.0 as u32) << 16 | (color.1 as u32) << 8 | color.2 as u32;
        self.buffer[y * self.width + x] = value;
    }
}

然后您可以使用包装框的字体管理器创建一个终端,并向其写入。

let mut terminal = Terminal::new(display);
terminal.set_font_manager(Box::new(BitmapFont));
terminal.write_bstr(b"\x1b[31mHello, world!\x1b[0m");
terminal.write_fmt(format_args!("{} + {} = {}", 1, 2, 3));

要使用TrueType字体,请启用 truetype 功能,并从具有大小的字体文件创建一个 TrueTypeFont 实例。

let font_buffer = include_bytes!("SourceCodeVF.otf");
terminal.set_font_manager(Box::new(TrueTypeFont::new(14.0, font_buffer)));

请注意,您应该使用支持变量字体的ttf文件,否则字体粗细将不会改变。

斜体字体支持是可选的。如果没有提供,它将以默认罗马字体渲染。

let font_buffer = include_bytes!("SourceCodeVF.otf");
let italic_buffer = include_bytes!("SourceCodeVF-Italic.otf");
let font_manager = TrueTypeFont::new(10.0, font_buffer).with_italic_font(italic_buffer);
terminal.set_font_manager(Box::new(font_manager));

如果您想从终端获取日志,您可以设置一个接收 fmt::Arguments 的记录器。

os_terminal::set_logger(|args| println!("Terminal: {:?}", args));

默认刷新策略是同步的。如果您需要更高的性能,您可以禁用自动刷新,并在需要时手动刷新。

terminal.set_auto_flush(false);
terminal.flush();

功能

  • bitmap:启用嵌入式Noto Sans Mono位图字体支持。此功能默认启用。
  • truetype:启用TrueType字体支持。此功能默认禁用。

致谢

感谢原作者和贡献者的出色工作。

依赖项

~0.4–0.9MB
~17K SLoC