From d632f29deedc18f83bf4f51d56a29b5ace9eded1 Mon Sep 17 00:00:00 2001 From: puffaboo Date: Wed, 13 Jul 2022 21:54:52 +0100 Subject: [PATCH] Initial commit -- have an eye --- .cargo/config.toml | 34 +++++++++++++++++++++ .gitignore | 4 +++ Cargo.toml | 30 ++++++++++++++++++ build.rs | 5 +++ rust-toolchain.toml | 2 ++ sdkconfig.defaults | 10 ++++++ src/eye.bmp | Bin 0 -> 8262 bytes src/main.rs | 73 ++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 158 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 build.rs create mode 100644 rust-toolchain.toml create mode 100644 sdkconfig.defaults create mode 100644 src/eye.bmp create mode 100644 src/main.rs 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 0000000000000000000000000000000000000000..b94fbde7d7715d10f3577168837d53ad302b832e GIT binary patch literal 8262 zcmeHLPe>zI9G+5xbMP<+p$P<qus z5rQbJQdl>7ST%yiD%+KXE{=yTSz+0cQkaD;I13G#Ll?4CaTchiQPRE zl1I#Y$$Rhne&6qVf5x8vu!pF;!szeU=>1Lg{SiSCAEP?qA&AeuRNm06yxtPTt5$;e zRBbmun+h})Xe!WDps9dO1wu@3-|LaN=uzy=?KiiNVmG4CM#!GuoHmDFvfDUGb{)m8 ztvk8L{5v5ac8g=;n1l+dxy7=;=3neRSp0kBL-0uV-I;ZA?}REMpjwn}af$zGy?^3; zv1p-pVsG~lat$vbt(2f}B~GrEN_)DLsPzem!}*)D*O^O7T^;s0O-&8wk+L%)4^RDX_dxgh$T@jPu!pWNFlqq4ftgu;%hCxUMz%yR7tNH*V8*pMk+=*fQwo$jG_6Kq&uhlgi zQPIpk!x3%YP9C2NDmr|^YGm`1wbQA6**bbr?%3DPX&pWAN%^&XJNEGzrN!rD*pH|w zMS*d0IB%VMPTtk*xY?vx)Y|W~t8v%d0iXbK;fp=R1AjSLbf2;E9w!g1;h3_l7R#)z z_29soK5E>WF1-_m^U2DI;2}1AhrZ!F{#9T55cp2+(6{09R4v%z3ehJSt6UlN@9p_H z);5|lU4tRoj{c(j$6|;s)b6W4P$7D=Z_MP(;n3Yi@4u_-iOLzz^3MkA^|$B0fb?Bo zh*s1G2|R?u<)yE#>vdOJ+VxjV|ML*{iSyU%G_be++Lyhw!=|!OhdtYVtuW(?heYy{yeO?^U;9`O@a?*7O;sPmpbMLAJo`J1y(eK6MH!uz~&{)^i*fii(Ocz| zoQ>Cl 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()) +}