simplification

master
able 2022-08-02 06:00:21 -05:00
parent b1dee8506b
commit 347975e4fa
4 changed files with 104 additions and 130 deletions

View File

@ -1,4 +1,4 @@
,-""""-. OS: $BLUE$AbleOS$RESET$ ,-""""-. OS: \0BLUE\0 AbleOS \0RESET\0
,'\ _ _`. Host: ??? ,'\ _ _`. Host: ???
/ \)_)-)_)-\ Kernel: AKern-{}-v{} / \)_)-)_)-\ Kernel: AKern-{}-v{}
: : Uptime: {} : : Uptime: {}

View File

@ -6,7 +6,8 @@ user_processes = ["shell"]
enabled = true enabled = true
level = "Trace" level = "Trace"
log_to_serial = true log_to_serial = true
filter = ["ableos::vterm"] filter = []
# "ableos::vterm"]
[tests] [tests]

View File

@ -16,6 +16,9 @@ use kernel::allocator::ALLOCATOR;
use spin::Lazy; use spin::Lazy;
use x86_64::instructions::interrupts::{disable, enable}; use x86_64::instructions::interrupts::{disable, enable};
pub const BANNER_WIDTH: &str =
"================================================================================";
// TODO: move to a better place // TODO: move to a better place
#[derive(Clone, Copy, Debug, PartialEq, Eq)] #[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AcpiStruct {} pub struct AcpiStruct {}
@ -60,6 +63,8 @@ pub fn scratchpad() {
// bruh(); // bruh();
// panic!(":>"); // panic!(":>");
println!("\0RED\0OHNO\0RESET\0");
disable(); disable();
let tick_time = fetch_time(); let tick_time = fetch_time();
@ -70,8 +75,22 @@ pub fn scratchpad() {
enable(); enable();
println!( println!(
include_str!("../assets/balloon.txt"), "{}
,-------. OS: \0BLUE\0AbleOS\0RESET\0
,'\\ _ _`. Host: None
/ \\)_)-)_)-\\ Kernel: \0RED\0AKern-{}-v{}\0RESET\0
: : Uptime: {}
\\ / Packages: None
\\ / Shell: BuiltinShell
`. ,' Resolution: 640x480
`. ,' Terminal: VGABuffer
`.,' CPU: {}
/\\`. ,-._ GPU: VGA Compatible
`-' Memory: {}/{}
{}",
// include_str!("../assets/balloon.txt"),
// kstate.hostname, // kstate.hostname,
BANNER_WIDTH,
RELEASE_TYPE, RELEASE_TYPE,
KERNEL_VERSION, KERNEL_VERSION,
tick_time, tick_time,
@ -79,7 +98,8 @@ pub fn scratchpad() {
// "", // "",
// mem // mem
used, used,
size size,
BANNER_WIDTH
); );
real_shell(); real_shell();
@ -118,7 +138,7 @@ pub fn real_shell() {
match x86_64::instructions::interrupts::without_interrupts(|| KEYBUFF.lock().pop()) { match x86_64::instructions::interrupts::without_interrupts(|| KEYBUFF.lock().pop()) {
Some('\n') => { Some('\n') => {
// panic!(); // panic!();
// println!(); println!();
// match engine.eval_with_scope::<rhai::Dynamic>(&mut scope, &buf) { // match engine.eval_with_scope::<rhai::Dynamic>(&mut scope, &buf) {
// Ok(o) => println!("{o}"), // Ok(o) => println!("{o}"),
@ -129,7 +149,7 @@ pub fn real_shell() {
} }
buf.clear(); buf.clear();
print!("\n{}", prompt); print!("{}", prompt);
} }
Some('\u{0008}') => { Some('\u{0008}') => {
print!("\u{08}"); print!("\u{08}");

View File

@ -8,6 +8,7 @@ const CURSOR_COLOR: Color16 = Color16::Cyan;
#[derive(Debug)] #[derive(Debug)]
pub struct Term { pub struct Term {
dirty: bool, dirty: bool,
color: Color16,
term: [(char, Color16); 80 * 60], term: [(char, Color16); 80 * 60],
x: u8, x: u8,
} }
@ -21,6 +22,7 @@ impl Term {
dirty: false, dirty: false,
x: 0, x: 0,
term: [('\0', Color16::LightGrey); 80 * 60], term: [('\0', Color16::LightGrey); 80 * 60],
color: Color16::White,
} }
} }
pub fn is_dirty(&self) -> bool { pub fn is_dirty(&self) -> bool {
@ -32,70 +34,38 @@ impl Term {
} }
pub fn print(&mut self, data: &str) { pub fn print(&mut self, data: &str) {
for c in data.chars() { let mut lex = Token::lexer(data);
if self.x == 79 {
self.move_up();
return;
}
match c {
'\u{08}' => {
if self.x == 0 {
// trace!("IMPOSSIBLE BACKSPACE");
return;
}
trace!("BACKSPACE");
self.x -= 1;
self.term[TERM_MINUS_ONE_LINE + (self.x as usize)] = ('\0', Color16::LightGrey);
}
'\n' => {
self.move_up();
self.x = 0;
}
c => {
self.term[TERM_MINUS_ONE_LINE + (self.x as usize)] = (c, Color16::White);
self.x += 1;
}
}
}
}
// TODO:DEADLOCK: Fix this up
pub fn cprint(&mut self, data: &str) {
let lex = Token::lexer(data);
trace!("{:?}", lex);
let mut color = Color16::Red;
for toke in lex { for toke in lex {
match toke { match toke {
Token::Error => Token::Reset => {
// unsafe { asm!("int 54") }, self.color = Color16::White;
{} }
Token::TBlack => color = Color16::Black, Token::Error => {}
Token::TBlue => { Token::TBlack => self.color = Color16::Black,
color = Color16::Blue; Token::TBlue => self.color = Color16::Blue,
trace!(""); Token::TGreen => self.color = Color16::Green,
Token::TCyan => self.color = Color16::Cyan,
Token::TRed => self.color = Color16::Red,
Token::TMagenta => self.color = Color16::Magenta,
Token::TBrown => self.color = Color16::Brown,
Token::TLightGrey => self.color = Color16::LightGrey,
Token::TDarkGrey => self.color = Color16::DarkGrey,
Token::TLightBlue => self.color = Color16::LightBlue,
Token::TLightGreen => self.color = Color16::LightGreen,
Token::TLightCyan => self.color = Color16::LightCyan,
Token::TLightRed => self.color = Color16::LightRed,
Token::TPink => self.color = Color16::Pink,
Token::TYellow => self.color = Color16::Yellow,
Token::TWhite => self.color = Color16::White,
Token::Space => {
self.term[TERM_MINUS_ONE_LINE + (self.x as usize)] = (' ', self.color);
self.x += 1;
} }
Token::TGreen => color = Color16::Green,
Token::TCyan => color = Color16::Cyan,
Token::TRed => color = Color16::Red,
Token::TMagenta => color = Color16::Magenta,
Token::TBrown => color = Color16::Brown,
Token::TLightGrey => color = Color16::LightGrey,
Token::TDarkGrey => color = Color16::DarkGrey,
Token::TLightBlue => color = Color16::LightBlue,
Token::TLightGreen => color = Color16::LightGreen,
Token::TLightCyan => color = Color16::LightCyan,
Token::TLightRed => color = Color16::LightRed,
Token::TPink => color = Color16::Pink,
Token::TYellow => color = Color16::Yellow,
Token::TWhite => color = Color16::White,
Token::Text(st) => { Token::Text(st) => {
for c in st.chars() { for c in st.chars() {
if self.x == 79 { if self.x == 80 {
self.move_up(); self.move_up();
return;
} }
match c { match c {
@ -115,7 +85,8 @@ impl Term {
} }
c => { c => {
self.term[TERM_MINUS_ONE_LINE + (self.x as usize)] = (c, color); self.term[TERM_MINUS_ONE_LINE + (self.x as usize)] =
(c, self.color);
self.x += 1; self.x += 1;
} }
} }
@ -144,29 +115,6 @@ impl Term {
use Color16::*; use Color16::*;
let mode = VGAE.lock(); let mode = VGAE.lock();
mode.clear_screen(DarkGrey); mode.clear_screen(DarkGrey);
let mouse_coord = x86_64::instructions::interrupts::without_interrupts(|| {
let cursor = MOUSE.lock();
(cursor.get_x() as usize, cursor.get_y() as usize)
});
mode.draw_line(
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 0),
(mouse_coord.0 as isize + 10, mouse_coord.1 as isize + 10),
CURSOR_COLOR,
);
mode.draw_line(
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 0),
(mouse_coord.0 as isize + 5, mouse_coord.1 as isize + 0),
CURSOR_COLOR,
);
mode.draw_line(
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 0),
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 5),
CURSOR_COLOR,
);
let mut x = 0; let mut x = 0;
let mut y = 0; let mut y = 0;
@ -180,6 +128,30 @@ impl Term {
} }
} }
{
let mouse_coord = x86_64::instructions::interrupts::without_interrupts(|| {
let cursor = MOUSE.lock();
(cursor.get_x() as usize, cursor.get_y() as usize)
});
mode.draw_line(
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 0),
(mouse_coord.0 as isize + 10, mouse_coord.1 as isize + 10),
CURSOR_COLOR,
);
mode.draw_line(
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 0),
(mouse_coord.0 as isize + 5, mouse_coord.1 as isize + 0),
CURSOR_COLOR,
);
mode.draw_line(
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 0),
(mouse_coord.0 as isize + 0, mouse_coord.1 as isize + 5),
CURSOR_COLOR,
);
}
self.set_dirty(false); self.set_dirty(false);
trace!("Finished drawing"); trace!("Finished drawing");
} }
@ -188,72 +160,53 @@ impl Term {
#[derive(Logos, Debug, Clone, PartialEq)] #[derive(Logos, Debug, Clone, PartialEq)]
pub enum Token { pub enum Token {
#[regex(r"[\t\n\f]+", logos::skip)] #[regex(r"", logos::skip)]
#[error] #[error]
Error, Error,
#[token("$BLACK$")] #[token("\0RESET\0", priority = 10)]
Reset,
#[token("\0BLACK\0", priority = 10)]
TBlack, TBlack,
#[token("$BLUE$")] #[regex("\0BLUE\0", priority = 10)]
TBlue, TBlue,
#[token("$GREEN$")] #[token("\0GREEN\0", priority = 10)]
TGreen, TGreen,
#[token("$CYAN$")] #[token("\0CYAN\0", priority = 10)]
TCyan, TCyan,
#[token("$RED$")] #[token("\0RED\0", priority = 10)]
TRed, TRed,
#[token("$MAGENTA$")] #[token("\0MAGENTA\0", priority = 10)]
TMagenta, TMagenta,
#[token("$BROWN$")] #[token("\0BROWN\0", priority = 10)]
TBrown, TBrown,
#[token("$LIGHTGREY$")] #[token("\0LIGHTGREY\0", priority = 10)]
TLightGrey, TLightGrey,
#[token("$DARKGREY$")] #[token("\0DARKGREY\0", priority = 10)]
TDarkGrey, TDarkGrey,
#[token("$LIGHTBLUE$")] #[token("\0LIGHTBLUE\0", priority = 10)]
TLightBlue, TLightBlue,
#[token("$LIGHTGREEN$")] #[token("\0LIGHTGREEN\0", priority = 10)]
TLightGreen, TLightGreen,
#[token("$LIGHTCYAN$")] #[token("\0LIGHTCYAN\0", priority = 10)]
TLightCyan, TLightCyan,
#[token("$LIGHTRED$")] #[token("\0LIGHTRED\0", priority = 10)]
TLightRed, TLightRed,
#[token("$PINK$")] #[token("\0PINK\0", priority = 10)]
TPink, TPink,
#[token("$YELLOW$")] #[token("\0YELLOW\0", priority = 10)]
TYellow, TYellow,
#[token("$WHITE$")] #[token("\0WHITE\0", priority = 10)]
TWhite, TWhite,
#[regex("/[\x00-\x7F]/", text_lex)] #[token(" ")]
Space,
#[regex("[\t\n!-~]+", text_lex, priority = 0)]
Text(String), Text(String),
} }
fn text_lex(lex: &mut Lexer<Token>) -> String { fn text_lex(lex: &mut Lexer<Token>) -> String {
lex.slice().into() lex.slice().into()
} }
impl Into<Color16> for Token {
fn into(self) -> Color16 {
match self {
Token::Error => todo!(),
Token::TBlack => Color16::Black,
Token::TBlue => Color16::Blue,
Token::TGreen => Color16::Green,
Token::TCyan => Color16::Cyan,
Token::TRed => Color16::Red,
Token::TMagenta => Color16::Magenta,
Token::TBrown => Color16::Brown,
Token::TLightGrey => Color16::LightGrey,
Token::TDarkGrey => Color16::DarkGrey,
Token::TLightBlue => Color16::LightBlue,
Token::TLightGreen => Color16::LightGreen,
Token::TLightCyan => Color16::LightCyan,
Token::TLightRed => Color16::LightRed,
Token::TPink => Color16::Pink,
Token::TYellow => Color16::Yellow,
Token::TWhite => Color16::White,
Token::Text(_) => todo!(),
}
}
}