commit d632f29deedc18f83bf4f51d56a29b5ace9eded1 Author: puffaboo Date: Wed Jul 13 21:54:52 2022 +0100 Initial commit -- have an eye diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..357b621 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,34 @@ +[build] +# Uncomment the relevant target for your chip here (ESP32, ESP32-S2, ESP32-S3 or ESP32-C3) +target = "xtensa-esp32-espidf" +#target = "xtensa-esp32s2-espidf" +#target = "xtensa-esp32s3-espidf" +#target = "riscv32imc-esp-espidf" + +[target.xtensa-esp32-espidf] +linker = "ldproxy" + +[target.xtensa-esp32s2-espidf] +linker = "ldproxy" + +[target.xtensa-esp32s3-espidf] +linker = "ldproxy" + +[target.riscv32imc-esp-espidf] +linker = "ldproxy" + +# Future - necessary for the experimental "native build" of esp-idf-sys with ESP32C3 +# See also https://github.com/ivmarkov/embuild/issues/16 +rustflags = ["-C", "default-linker-libraries"] + +[unstable] + +build-std = ["std", "panic_abort"] +#build-std-features = ["panic_immediate_abort"] # Required for older ESP-IDF versions without a realpath implementation + +[env] +# Note: these variables are not used when using pio builder +# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF stable (v4.4) +ESP_IDF_VERSION = { value = "branch:release/v4.4" } +# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF master (mainline) +#ESP_IDF_VERSION = { value = "master" } diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73a638b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.vscode +/.embuild +/target +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0899395 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "eyeiii" +version = "0.1.0" +authors = ["puffaboo "] +edition = "2018" +resolver = "2" + +[profile.release] +opt-level = "s" + +[profile.dev] +debug = true # Symbols are nice and they don't increase the size on Flash +opt-level = "z" + +[features] +pio = ["esp-idf-sys/pio"] + +[dependencies] +embedded-graphics = "0.7.1" +embedded-hal = "1.0.0-alpha.8" +esp-idf-hal = "0.38.0" +esp-idf-svc = "0.42.0" +esp-idf-sys = { version = "0.31.6", features = ["binstart"] } +ssd1331 = "0.3.0" +tinybmp = "0.3.3" + + +[build-dependencies] +embuild = "0.29" +anyhow = "1" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..4dd5e1f --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +// Necessary because of this issue: https://github.com/rust-lang/cargo/issues/9641 +fn main() -> anyhow::Result<()> { + embuild::build::CfgArgs::output_propagated("ESP_IDF")?; + embuild::build::LinkArgs::output_propagated("ESP_IDF") +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..a2f5ab5 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "esp" diff --git a/sdkconfig.defaults b/sdkconfig.defaults new file mode 100644 index 0000000..a139649 --- /dev/null +++ b/sdkconfig.defaults @@ -0,0 +1,10 @@ +# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K) +CONFIG_ESP_MAIN_TASK_STACK_SIZE=20000 + +# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default). +# This allows to use 1 ms granuality for thread sleeps (10 ms by default). +#CONFIG_FREERTOS_HZ=1000 + +# Workaround for https://github.com/espressif/esp-idf/issues/7631 +#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n +#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=n diff --git a/src/eye.bmp b/src/eye.bmp new file mode 100644 index 0000000..b94fbde Binary files /dev/null and b/src/eye.bmp differ diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..4a43557 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,73 @@ +use std::{error::Error, thread::sleep, time::Duration}; + +use embedded_graphics::{image::Image, pixelcolor::Rgb565, prelude::*}; +use esp_idf_hal::{ + gpio::{Gpio16, Gpio17, Gpio18, Gpio23, Gpio5, Output}, + prelude::{Hertz, Peripherals}, + spi::{self, Pins, SPI3}, +}; +use esp_idf_sys as _; // If using the `binstart` feature of `esp-idf-sys`, always keep this module imported +use ssd1331::{DisplayRotation::Rotate0, Ssd1331}; +use tinybmp::Bmp; + +fn secondary() -> Result<(), Box> { + // Temporary. Will disappear once ESP-IDF 4.4 is released, but for now it is necessary to call this function once, + // or else some patches to the runtime implemented by esp-idf-sys might not link properly. + esp_idf_sys::link_patches(); + + // Bind the log crate to the ESP Logging facilities + esp_idf_svc::log::EspLogger::initialize_default(); + let peripherals = Peripherals::take().unwrap(); + let spi3 = peripherals.spi3; + let pins = peripherals.pins; + let cs: Gpio17 = pins.gpio17.into_output()?; + let dc: Gpio16 = pins.gpio16.into_output()?; + let mosi: Gpio23 = pins.gpio23.into_output()?; + let sclk: Gpio18 = pins.gpio18.into_output()?; + let reset: Gpio5 = pins.gpio5.into_output()?; + + // // Set up SPI interface and digital pin. These are stub implementations used in examples. + let spiman = + spi::Master::, Gpio23, Gpio5, Gpio17>::new( + spi3, + Pins { + sclk: sclk, + sdo: mosi, + sdi: Some(reset), + cs: Some(cs), + }, + spi::config::Config { + baudrate: Hertz(24000000), + data_mode: embedded_hal::spi::MODE_0, + write_only: false, + dma: spi::Dma::Disabled, + }, + )?; + let mut display = Ssd1331::new(spiman, dc, Rotate0); + display.init().unwrap(); + + display.flush().unwrap(); + + let (w, h) = display.dimensions(); + println!("got resolution {} x {}", w.clone(), h.clone()); + + let bmp = Bmp::from_slice(include_bytes!("./eye.bmp")).expect("Failed to load BMP image"); + + let im: Image> = Image::new(&bmp, Point::zero()); + + // Position image in the center of the display + let moved = im.translate(Point::new( + (w as u32 - bmp.size().width) as i32 / 2, + (h as u32 - bmp.size().height) as i32 / 2, + )); + + moved.draw(&mut display).unwrap(); + + display.flush().unwrap(); + Ok(()) +} + +fn main() -> Result<(), Box> { + sleep(Duration::from_secs(1)); + Ok(secondary().unwrap()) +}