diff --git a/user/src/bin/embed_graph.rs b/user/src/bin/embed_graph.rs index 3866994cd414703a3d51dbae0674660bfd0c1ac3..e1b3ea8349366f153d943679fd14df057b23c2ba 100644 --- a/user/src/bin/embed_graph.rs +++ b/user/src/bin/embed_graph.rs @@ -1,13 +1,12 @@ #![no_std] #![no_main] -use user_lib::{framebuffer, framebuffer_flush}; - #[macro_use] extern crate user_lib; - extern crate alloc; +use user_lib::{framebuffer, framebuffer_flush}; + use embedded_graphics::pixelcolor::Rgb888; use embedded_graphics::prelude::{Drawable, Point, RgbColor, Size}; use embedded_graphics::primitives::Primitive; diff --git a/user/src/bin/embed_graph_uart.rs b/user/src/bin/embed_graph_uart.rs new file mode 100644 index 0000000000000000000000000000000000000000..9e0933b064503a565f2896551ceb30193344ae18 --- /dev/null +++ b/user/src/bin/embed_graph_uart.rs @@ -0,0 +1,124 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; +extern crate alloc; + +use user_lib::console::getchar; +use user_lib::{framebuffer, framebuffer_flush}; + +use embedded_graphics::pixelcolor::Rgb888; +use embedded_graphics::prelude::{Drawable, Point, RgbColor, Size}; +use embedded_graphics::primitives::Primitive; +use embedded_graphics::primitives::{PrimitiveStyle, Rectangle}; +use embedded_graphics::{draw_target::DrawTarget, prelude::OriginDimensions}; + +pub const VIRTGPU_XRES: usize = 1280; +pub const VIRTGPU_YRES: usize = 800; +pub const VIRTGPU_LEN: usize = VIRTGPU_XRES * VIRTGPU_YRES * 4; + +const INIT_X: i32 = 640; +const INIT_Y: i32 = 400; +const RECT_SIZE: u32 = 40; + +pub struct Display { + pub size: Size, + pub point: Point, + //pub fb: Arc<&'static mut [u8]>, + pub fb: &'static mut [u8], +} + +impl Display { + pub fn new(size: Size, point: Point) -> Self { + let fb_ptr = framebuffer() as *mut u8; + println!( + "Hello world from user mode program! 0x{:X} , len {}", + fb_ptr as usize, VIRTGPU_LEN + ); + let fb = + unsafe { core::slice::from_raw_parts_mut(fb_ptr as *mut u8, VIRTGPU_LEN as usize) }; + Self { size, point, fb } + } +} + +impl OriginDimensions for Display { + fn size(&self) -> Size { + self.size + } +} + +impl DrawTarget for Display { + type Color = Rgb888; + + type Error = core::convert::Infallible; + + fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> + where + I: IntoIterator>, + { + pixels.into_iter().for_each(|px| { + let idx = ((self.point.y + px.0.y) * VIRTGPU_XRES as i32 + self.point.x + px.0.x) + as usize + * 4; + if idx + 2 >= self.fb.len() { + return; + } + self.fb[idx] = px.1.b(); + self.fb[idx + 1] = px.1.g(); + self.fb[idx + 2] = px.1.r(); + }); + framebuffer_flush(); + Ok(()) + } +} + +pub struct DrawingBoard { + disp: Display, + latest_pos: Point, +} + +impl DrawingBoard { + pub fn new() -> Self { + Self { + disp: Display::new(Size::new(1280, 800), Point::new(0, 0)), + latest_pos: Point::new(INIT_X, INIT_Y), + } + } + fn paint(&mut self) { + Rectangle::with_center(self.latest_pos, Size::new(RECT_SIZE, RECT_SIZE)) + .into_styled(PrimitiveStyle::with_stroke(Rgb888::WHITE, 1)) + .draw(&mut self.disp) + .ok(); + } + fn unpaint(&mut self) { + Rectangle::with_center(self.latest_pos, Size::new(RECT_SIZE, RECT_SIZE)) + .into_styled(PrimitiveStyle::with_stroke(Rgb888::BLACK, 1)) + .draw(&mut self.disp) + .ok(); + } + pub fn move_rect(&mut self, dx: i32, dy: i32) { + self.unpaint(); + self.latest_pos.x += dx; + self.latest_pos.y += dy; + self.paint(); + } +} + +const LF: u8 = 0x0au8; +const CR: u8 = 0x0du8; +#[no_mangle] +pub fn main() -> i32 { + // let fb_ptr = framebuffer() as *mut u8; + let mut board = DrawingBoard::new(); + for i in 0..20 { + let c=getchar(); + if c == LF || c == CR { + break; + } + board.latest_pos.x += i; + board.latest_pos.y += i; + board.paint(); + } + 0 +} diff --git a/user/src/bin/gui_simple.rs b/user/src/bin/gui_simple.rs index df4cfbb871771486de7f49d677f72c0520d284ed..83fb721d7843c087913a3bb430ad4b48d822736e 100644 --- a/user/src/bin/gui_simple.rs +++ b/user/src/bin/gui_simple.rs @@ -1,19 +1,11 @@ #![no_std] #![no_main] -use user_lib::{framebuffer, framebuffer_flush}; - #[macro_use] extern crate user_lib; -// use embedded_graphics::pixelcolor::Rgb888; -// use embedded_graphics::prelude::{Drawable, Point, RgbColor, Size}; -// use embedded_graphics::primitives::Primitive; -// use embedded_graphics::primitives::{PrimitiveStyle, Rectangle}; -// use embedded_graphics::{ -// draw_target::DrawTarget, -// prelude::{OriginDimensions}, -// }; +use user_lib::{framebuffer, framebuffer_flush}; + pub const VIRTGPU_XRES: usize = 1280; pub const VIRTGPU_YRES: usize = 800;