19 releases

0.3.7 Aug 18, 2024
0.3.6 Aug 6, 2024
0.2.7 Jul 30, 2024
0.1.2 Jul 26, 2024

#133 in Embedded development

Download history 598/week @ 2024-07-22 308/week @ 2024-07-29 608/week @ 2024-08-05 119/week @ 2024-08-12 45/week @ 2024-08-19 12/week @ 2024-08-26

868 downloads per month
Used in good-os-framework

MIT license

47KB
1K SLoC

OS Terminal

A no_std terminal library for embedded systems and OS kernels.

The environment should have initialized global_allocator since alloc crate is used for dynamic memory allocation.

Screenshot

This screenshot shows the result of running fastfetch in the example terminal. You can try it by running cargo run --example terminal (Linux only). It will execute bash by default.

Features

  • Embedded smooth noto sans mono font rendering
  • Truetype font support
  • VT100 and part of xterm escape sequence support
  • Beautiful color scheme
  • Cursor display and shape control

Usage

Create a display wrapper to wrap your framebuffer and implement the DrawTarget trait for it.

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

Then you can create a terminal with a box-wrapped font manager, and write to it.

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

To use truetype font, enable truetype feature and create a TrueTypeFont instance from a font file with size.

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

Notice that you are supposed to use a variable-font-supported ttf file otherwise font weight will not change.

Italic font support is also optional. If not provided, it will be rendered with default Roman font.

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

If you want to get the logs from the terminal, you can set a logger that receives fmt::Arguments.

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

Default flush strategy is synchronous. If you need higher performance, you can disable the auto flush and flush manually when needed.

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

Features

  • bitmap: Enable embedded noto sans mono bitmap font support. This feature is enabled by default.
  • truetype: Enable truetype font support. This feature is disabled by default.

Acknowledgement

Thanks to the original author and contributors for their great work.

Dependencies

~0.4–0.9MB
~17K SLoC