From f3310667d9011a5c31a46e949a2cb97b8ae3ac75 Mon Sep 17 00:00:00 2001 From: Kat Inskip Date: Fri, 17 Oct 2025 07:56:55 -0700 Subject: [PATCH] feat: god damn --- .envrc | 1 + .gitignore | 1 + flake.nix | 3 ++- src/main.rs | 29 ++++++++++++++++++++++++++--- 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 2f7896d..599a890 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ target/ +.direnv diff --git a/flake.nix b/flake.nix index 5609650..ab7cf32 100644 --- a/flake.nix +++ b/flake.nix @@ -9,6 +9,7 @@ outputs = { nixpkgs, flake-utils, esp-rs-nix, ... }@inputs: let mkPkgs = system: (import nixpkgs) { inherit system; + rust.rustcTarget = "riscv32imc-unknown-none-elf"; }; eachSystemOutputs = flake-utils.lib.eachDefaultSystem (system: let pkgs = mkPkgs system; @@ -20,9 +21,9 @@ esp-rs pkgs.rustup pkgs.espflash - #pkgs.rust-analyzer pkgs.pkg-config pkgs.stdenv.cc + #pkgs.rust-analyzer #pkgs.bacon #pkgs.systemdMinimal #pkgs.lunarvim diff --git a/src/main.rs b/src/main.rs index bd10edc..e730395 100644 --- a/src/main.rs +++ b/src/main.rs @@ -55,10 +55,33 @@ type TFTSpiDevice<'spi> = ExclusiveDevice, Output<'spi>, NoD type TFTSpiInterface<'spi> = SPIInterface, Output<'spi>, NoDelay>, Output<'spi>>; +type Ili<'spi> = Ili9341, Output<'spi>>; + pub struct TFT<'spi> { - display: Ili9341, Output<'spi>>, + display: Ili<'spi>, } +impl <'spi>TFT<'spi> { + fn draw_target(&mut self) -> DrawFlipper<'_,'spi> { + DrawFlipper { display: &mut self.display } + } +} + +struct DrawFlipper<'a,'spi> { display: &'a mut Ili<'spi>, } +impl<'a, 'spi> DrawTarget for DrawFlipper<'a, 'spi> { + type Error = as DrawTarget>::Error; + type Color = as DrawTarget>::Color; + fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> + where I: IntoIterator> { + let width = self.bounding_box().size.width as i32; + self.display.draw_iter(pixels.into_iter().map(|mut p| { p.0.x = width - p.0.x; p })) + } +} +impl<'a> Dimensions for DrawFlipper<'a,'_> { + fn bounding_box(&self) -> Rectangle { + self.display.bounding_box() + } +} impl<'spi> TFT<'spi> { pub fn new( spi2: SPI2<'spi>, @@ -105,14 +128,14 @@ impl<'spi> TFT<'spi> { pub fn part_clear(&mut self, x: i32, y: i32, w: u32, h: u32) { Rectangle::new(Point::new(x, y), Size::new(w, h)) .into_styled(PrimitiveStyle::with_fill(Rgb565::WHITE)) - .draw(&mut self.display) + .draw(&mut self.draw_target()) .unwrap(); } pub fn println(&mut self, text: &str, x: i32, y: i32) { let style = MonoTextStyle::new(&FONT_8X13, Rgb565::RED); Text::with_alignment(text, Point::new(x, y), style, Alignment::Center) - .draw(&mut self.display) + .draw(&mut self.draw_target()) .unwrap(); } }