Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b8d076b3c | ||
|
|
88dce365ad |
Generated
+9
-133
@@ -229,16 +229,6 @@ version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "ch1115"
|
||||
version = "0.1.2"
|
||||
source = "git+https://github.com/ede1998/ch1115.git?rev=2d3a3ba38050efe012e6a210afe3e125ec280c37#2d3a3ba38050efe012e6a210afe3e125ec280c37"
|
||||
dependencies = [
|
||||
"display-interface",
|
||||
"embedded-graphics-core",
|
||||
"embedded-hal 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cobs"
|
||||
version = "0.3.0"
|
||||
@@ -313,16 +303,15 @@ name = "creaturedex"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"ch1115",
|
||||
"critical-section",
|
||||
"display-interface-spi",
|
||||
"embassy-executor",
|
||||
"embassy-futures",
|
||||
"embassy-time",
|
||||
"embedded-graphics",
|
||||
"embedded-graphics-core",
|
||||
"embedded-hal 1.0.0",
|
||||
"embedded-hal-bus",
|
||||
"embedded-hal-compat",
|
||||
"embedded-io 0.7.1",
|
||||
"esp-alloc",
|
||||
"esp-bootloader-esp-idf",
|
||||
@@ -334,8 +323,6 @@ dependencies = [
|
||||
"log",
|
||||
"ndef",
|
||||
"pn532",
|
||||
"sh1106",
|
||||
"ssd1306",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -620,17 +607,6 @@ version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ba2aab1ef3793e6f7804162debb5ac5edb93b3d650fbcc5aeb72fcd0e6c03a0"
|
||||
|
||||
[[package]]
|
||||
name = "display-interface-i2c"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0d964fa85bbbb5a6ecd06e58699407ac5dc3e3ad72dac0ab7e6b0d00a1cd262d"
|
||||
dependencies = [
|
||||
"display-interface",
|
||||
"embedded-hal 1.0.0",
|
||||
"embedded-hal-async",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "display-interface-spi"
|
||||
version = "0.5.0"
|
||||
@@ -970,17 +946,6 @@ dependencies = [
|
||||
"embedded-hal 1.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-hal-compat"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08ecac72f6be75ad2d4809c9f07d45502e2e5c9a4e9579077f28d7135de81df3"
|
||||
dependencies = [
|
||||
"embedded-hal 0.2.7",
|
||||
"embedded-hal 1.0.0",
|
||||
"nb 1.1.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-io"
|
||||
version = "0.4.0"
|
||||
@@ -1566,27 +1531,27 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
|
||||
|
||||
[[package]]
|
||||
name = "futures-core"
|
||||
version = "0.3.33"
|
||||
version = "0.3.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7"
|
||||
checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
|
||||
|
||||
[[package]]
|
||||
name = "futures-sink"
|
||||
version = "0.3.33"
|
||||
version = "0.3.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307"
|
||||
checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d"
|
||||
|
||||
[[package]]
|
||||
name = "futures-task"
|
||||
version = "0.3.33"
|
||||
version = "0.3.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109"
|
||||
checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.33"
|
||||
version = "0.3.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa"
|
||||
checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-task",
|
||||
@@ -1952,30 +1917,6 @@ version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
|
||||
|
||||
[[package]]
|
||||
name = "manyhow"
|
||||
version = "0.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587"
|
||||
dependencies = [
|
||||
"manyhow-macros",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "manyhow-macros"
|
||||
version = "0.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495"
|
||||
dependencies = [
|
||||
"proc-macro-utils",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matchers"
|
||||
version = "0.2.0"
|
||||
@@ -1991,19 +1932,6 @@ version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
|
||||
|
||||
[[package]]
|
||||
name = "maybe-async-cfg"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8dbfaa67a76e2623580df07d6bb5e7956c0a4bae4b418314083a9c619bd66627"
|
||||
dependencies = [
|
||||
"manyhow",
|
||||
"proc-macro2",
|
||||
"pulldown-cmark",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.3"
|
||||
@@ -2763,17 +2691,6 @@ dependencies = [
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-utils"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.107"
|
||||
@@ -2803,17 +2720,6 @@ dependencies = [
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pulldown-cmark"
|
||||
version = "0.11.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625"
|
||||
dependencies = [
|
||||
"bitflags 2.13.1",
|
||||
"memchr",
|
||||
"unicase",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.47"
|
||||
@@ -3140,16 +3046,6 @@ dependencies = [
|
||||
"unsafe-libyaml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sh1106"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc12a0563ec9b3b1f99b1f64613581ebbade1347416a34766564f406c15d1bf3"
|
||||
dependencies = [
|
||||
"embedded-graphics-core",
|
||||
"embedded-hal 0.2.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sharded-slab"
|
||||
version = "0.1.7"
|
||||
@@ -3238,20 +3134,6 @@ version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a0f368519fc6c85fc1afdb769fb5a51123f6158013e143656e25a3485a0d401c"
|
||||
|
||||
[[package]]
|
||||
name = "ssd1306"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ed51935bdc6e9e976d3d9a747e768589eaea0cf26f483213bfededc947c8624"
|
||||
dependencies = [
|
||||
"display-interface",
|
||||
"display-interface-i2c",
|
||||
"display-interface-spi",
|
||||
"embedded-graphics-core",
|
||||
"embedded-hal 1.0.0",
|
||||
"maybe-async-cfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.2.1"
|
||||
@@ -3519,12 +3401,6 @@ version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69"
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "2.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-id-start"
|
||||
version = "1.4.0"
|
||||
|
||||
+4
-10
@@ -9,7 +9,7 @@ name = "creaturedex"
|
||||
path = "./src/bin/main.rs"
|
||||
|
||||
[dependencies]
|
||||
esp-hal = { version = "~1.1.0", features = ["esp32s3", "log-04", "unstable"] }
|
||||
esp-hal = { version = "~1.1.0", features = ["esp32s3", "log-04", "unstable"] } #, "embassy", "embassy-time-timg0", "embassy-executor-thread"] }
|
||||
|
||||
esp-rtos = { version = "0.3.0", features = [
|
||||
"embassy",
|
||||
@@ -24,8 +24,10 @@ log = "0.4.27"
|
||||
|
||||
critical-section = "1.2.0"
|
||||
embedded-io = "0.7.1"
|
||||
embassy-executor = { version = "0.10.0", default-features = false }
|
||||
embassy-executor = { version = "0.10.0", features = [
|
||||
] }
|
||||
embassy-time = { version = "0.5.1", default-features = false }
|
||||
embassy-futures = "0.1.2"
|
||||
esp-alloc = "0.10.0"
|
||||
esp-hal-wifimanager = { git = "https://github.com/InvisibleUSA/esp-hal-wifimanager", default-features = false, features = [
|
||||
"ap",
|
||||
@@ -34,7 +36,6 @@ esp-hal-wifimanager = { git = "https://github.com/InvisibleUSA/esp-hal-wifimanag
|
||||
esp-println = { version = "0.17.0", features = ["esp32s3", "log-04"] }
|
||||
display-interface-spi = "0.5.0"
|
||||
ili9341 = "0.6.0"
|
||||
ssd1306 = "0.9.0"
|
||||
embedded-hal = "1.0.0"
|
||||
embedded-hal-bus = "0.3.0"
|
||||
embedded-graphics = "0.8.2"
|
||||
@@ -42,13 +43,6 @@ embedded-graphics-core = "0.4.1"
|
||||
base64 = { version = "0.22", default-features = false, features = ["alloc"] }
|
||||
pn532 = "0.5.0"
|
||||
ndef = "0.5.0"
|
||||
ch1115 = { version = "0.1.2", features = ["graphics"] }
|
||||
sh1106 = "0.5.0"
|
||||
embedded-hal-compat = "0.13.0"
|
||||
|
||||
|
||||
[patch.crates-io]
|
||||
ch1115 = { git = "https://github.com/ede1998/ch1115.git", rev = "2d3a3ba38050efe012e6a210afe3e125ec280c37" }
|
||||
|
||||
# For fine tuning these settings, please refer to https://doc.rust-lang.org/cargo/reference/profiles.html
|
||||
[profile.dev]
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![deny(
|
||||
clippy::mem_forget,
|
||||
reason = "mem::forget is generally not safe to do with esp_hal types, especially those \
|
||||
holding buffers for the duration of a data transfer."
|
||||
)]
|
||||
|
||||
use ch1115::Ch1115;
|
||||
use core::cell::RefCell;
|
||||
use creaturedex::display::shared_bus::SharedPin;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_time::Timer;
|
||||
use embedded_graphics::pixelcolor::BinaryColor;
|
||||
use embedded_graphics::{
|
||||
mono_font::{MonoTextStyle, ascii::FONT_6X10},
|
||||
prelude::*,
|
||||
text::Text,
|
||||
};
|
||||
use esp_hal::clock::CpuClock;
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig};
|
||||
use esp_hal::spi::Mode;
|
||||
use esp_hal::spi::master::{Config as SpiConfig, Spi};
|
||||
use esp_hal::time::Rate;
|
||||
use esp_hal::timer::timg::TimerGroup;
|
||||
use log::error;
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(panic_info: &core::panic::PanicInfo) -> ! {
|
||||
error!("{}", panic_info);
|
||||
loop {}
|
||||
}
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
esp_bootloader_esp_idf::esp_app_desc!();
|
||||
|
||||
#[esp_rtos::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
esp_println::logger::init_logger_from_env();
|
||||
|
||||
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
||||
let peripherals = esp_hal::init(config);
|
||||
|
||||
// The following GPIO pins are in use by some feature of the module and should not be used.
|
||||
let _ = peripherals.GPIO27;
|
||||
let _ = peripherals.GPIO28;
|
||||
let _ = peripherals.GPIO29;
|
||||
let _ = peripherals.GPIO30;
|
||||
let _ = peripherals.GPIO31;
|
||||
let _ = peripherals.GPIO32;
|
||||
let _ = peripherals.GPIO33;
|
||||
let _ = peripherals.GPIO34;
|
||||
|
||||
esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744);
|
||||
|
||||
let mut delay = Delay::new();
|
||||
|
||||
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
||||
let sw_interrupt =
|
||||
esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
|
||||
esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0);
|
||||
|
||||
let spi = peripherals.SPI2;
|
||||
let sck = peripherals.GPIO36;
|
||||
let mosi = peripherals.GPIO35;
|
||||
let cs = peripherals.GPIO13;
|
||||
let reset = peripherals.GPIO10;
|
||||
let dc = peripherals.GPIO12;
|
||||
let miso = peripherals.GPIO37;
|
||||
|
||||
let cs = Output::new(cs, Level::High, OutputConfig::default());
|
||||
let dc = Output::new(dc, Level::Low, OutputConfig::default());
|
||||
let reset = Output::new(reset, Level::High, OutputConfig::default());
|
||||
|
||||
let spi = Spi::new(
|
||||
spi,
|
||||
SpiConfig::default()
|
||||
.with_frequency(Rate::from_khz(5000))
|
||||
.with_mode(Mode::_0),
|
||||
)
|
||||
.unwrap()
|
||||
.with_sck(sck)
|
||||
.with_mosi(mosi)
|
||||
.with_miso(miso);
|
||||
|
||||
let spi = RefCell::new(spi);
|
||||
let spi_dev = embedded_hal_bus::spi::RefCellDevice::new(&spi, cs, delay).unwrap();
|
||||
let interface = display_interface_spi::SPIInterface::new(spi_dev, dc);
|
||||
|
||||
let mut display = Ch1115::new(interface, reset, ch1115::Size128x64);
|
||||
display.init(&mut delay).unwrap();
|
||||
|
||||
|
||||
loop {
|
||||
log::info!("Init finished");
|
||||
let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On);
|
||||
Text::new("Hello OLED", Point::new(10, 20), text_style)
|
||||
.draw(&mut display)
|
||||
.unwrap();
|
||||
|
||||
display.flush().unwrap();
|
||||
Timer::after_millis(1000).await;
|
||||
}
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![deny(
|
||||
clippy::mem_forget,
|
||||
reason = "mem::forget is generally not safe to do with esp_hal types, especially those \
|
||||
holding buffers for the duration of a data transfer."
|
||||
)]
|
||||
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_time::Timer;
|
||||
use embedded_graphics::pixelcolor::BinaryColor;
|
||||
use embedded_graphics::{
|
||||
mono_font::{MonoTextStyle, ascii::FONT_6X10},
|
||||
prelude::*,
|
||||
text::Text,
|
||||
};
|
||||
use embedded_hal_compat::ReverseCompat;
|
||||
use esp_hal::clock::CpuClock;
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig};
|
||||
use esp_hal::spi::Mode;
|
||||
use esp_hal::spi::master::{Config as SpiConfig, Spi};
|
||||
use esp_hal::time::Rate;
|
||||
use esp_hal::timer::timg::TimerGroup;
|
||||
use log::error;
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(panic_info: &core::panic::PanicInfo) -> ! {
|
||||
error!("{}", panic_info);
|
||||
loop {}
|
||||
}
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
esp_bootloader_esp_idf::esp_app_desc!();
|
||||
|
||||
// This creates a defaembedded_hal_compatedReverseCompat::reverse(Output::new(cs,Level::High,OutputConfig::default()))vel::High,OutputConfig::default())) more information see: embedded_hal_compat::ForwardCompat::forward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi))rward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi)) to allocate larger buffers etc. in main"
|
||||
#[esp_rtos::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
esp_println::logger::init_logger_from_env();
|
||||
|
||||
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
||||
let peripherals = esp_hal::init(config);
|
||||
|
||||
// The following GPIO pins are in use by some feature of the module and should not be used.
|
||||
let _ = peripherals.GPIO27;
|
||||
let _ = peripherals.GPIO28;
|
||||
let _ = peripherals.GPIO29;
|
||||
let _ = peripherals.GPIO30;
|
||||
let _ = peripherals.GPIO31;
|
||||
let _ = peripherals.GPIO32;
|
||||
let _ = peripherals.GPIO33;
|
||||
let _ = peripherals.GPIO34;
|
||||
|
||||
esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744);
|
||||
|
||||
let delay = Delay::new();
|
||||
|
||||
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
||||
let sw_interrupt =
|
||||
esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
|
||||
esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0);
|
||||
|
||||
let spi = peripherals.SPI2;
|
||||
let sck = peripherals.GPIO36;
|
||||
let mosi = peripherals.GPIO35;
|
||||
let cs = peripherals.GPIO13;
|
||||
let reset = peripherals.GPIO10;
|
||||
let dc = peripherals.GPIO12;
|
||||
let miso = peripherals.GPIO37;
|
||||
|
||||
let cs = Output::new(cs, Level::High, OutputConfig::default()).reverse_cell();
|
||||
let dc = Output::new(dc, Level::Low, OutputConfig::default()).reverse_cell();
|
||||
let mut reset = Output::new(reset, Level::High, OutputConfig::default());
|
||||
|
||||
let spi = Spi::new(
|
||||
spi,
|
||||
SpiConfig::default()
|
||||
.with_frequency(Rate::from_khz(5000))
|
||||
.with_mode(Mode::_0),
|
||||
)
|
||||
.unwrap()
|
||||
.with_sck(sck)
|
||||
.with_mosi(mosi)
|
||||
.with_miso(miso)
|
||||
.reverse();
|
||||
|
||||
let mut display: sh1106::mode::GraphicsMode<_> =
|
||||
sh1106::Builder::new().connect_spi(spi, dc, cs).into();
|
||||
|
||||
display.init().unwrap();
|
||||
|
||||
// Hard reset the OLED
|
||||
reset.set_high();
|
||||
delay.delay_millis(1);
|
||||
reset.set_low();
|
||||
delay.delay_millis(10);
|
||||
reset.set_high();
|
||||
|
||||
display.flush().unwrap();
|
||||
|
||||
display.set_pixel(10, 20, 1);
|
||||
|
||||
display.flush().unwrap();
|
||||
|
||||
let mut oled = display;
|
||||
|
||||
oled.clear();
|
||||
|
||||
let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On);
|
||||
Text::new("Hello OLED", Point::new(10, 20), text_style)
|
||||
.draw(&mut oled)
|
||||
.unwrap();
|
||||
|
||||
oled.flush().unwrap();
|
||||
|
||||
loop {
|
||||
log::info!("Init finished");
|
||||
Timer::after_millis(1000).await;
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
#![deny(
|
||||
clippy::mem_forget,
|
||||
reason = "mem::forget is generally not safe to do with esp_hal types, especially those \
|
||||
holding buffers for the duration of a data transfer."
|
||||
)]
|
||||
#![deny(clippy::large_stack_frames)]
|
||||
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_time::Timer;
|
||||
use embedded_graphics::draw_target::DrawTarget;
|
||||
use embedded_graphics::pixelcolor::BinaryColor;
|
||||
use embedded_graphics::text::Text;
|
||||
use embedded_graphics::{
|
||||
mono_font::{MonoTextStyle, ascii::FONT_6X10},
|
||||
prelude::*,
|
||||
};
|
||||
|
||||
use core::cell::RefCell;
|
||||
use esp_hal::clock::CpuClock;
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig};
|
||||
use esp_hal::spi::Mode;
|
||||
use esp_hal::spi::master::{Config as SpiConfig, Spi};
|
||||
use esp_hal::time::Rate;
|
||||
use esp_hal::timer::timg::TimerGroup;
|
||||
use log::error;
|
||||
use ssd1306::Ssd1306;
|
||||
use ssd1306::mode::DisplayConfig;
|
||||
use ssd1306::rotation::DisplayRotation;
|
||||
use ssd1306::size::DisplaySize128x64;
|
||||
|
||||
#[panic_handler]
|
||||
fn panic(panic_info: &core::panic::PanicInfo) -> ! {
|
||||
error!("{}", panic_info);
|
||||
loop {}
|
||||
}
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
esp_bootloader_esp_idf::esp_app_desc!();
|
||||
|
||||
// This creates a defaembedded_hal_compatedReverseCompat::reverse(Output::new(cs,Level::High,OutputConfig::default()))vel::High,OutputConfig::default())) more information see: embedded_hal_compat::ForwardCompat::forward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi))rward(Spi::new(spi,SpiConfig::default().with_frequency(Rate::from_khz(100)).with_mode(Mode::_0),).unwrap().with_sck(sck).with_mosi(mosi)) to allocate larger buffers etc. in main"
|
||||
#[esp_rtos::main]
|
||||
async fn main(_spawner: Spawner) {
|
||||
esp_println::logger::init_logger_from_env();
|
||||
|
||||
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
||||
let peripherals = esp_hal::init(config);
|
||||
|
||||
// The following GPIO pins are in use by some feature of the module and should not be used.
|
||||
let _ = peripherals.GPIO27;
|
||||
let _ = peripherals.GPIO28;
|
||||
let _ = peripherals.GPIO29;
|
||||
let _ = peripherals.GPIO30;
|
||||
let _ = peripherals.GPIO31;
|
||||
let _ = peripherals.GPIO32;
|
||||
let _ = peripherals.GPIO33;
|
||||
let _ = peripherals.GPIO34;
|
||||
|
||||
esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744);
|
||||
|
||||
let mut delay = Delay::new();
|
||||
|
||||
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
||||
let sw_interrupt =
|
||||
esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
|
||||
esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0);
|
||||
|
||||
let spi = peripherals.SPI2;
|
||||
let sck = peripherals.GPIO36;
|
||||
let mosi = peripherals.GPIO35;
|
||||
let cs = peripherals.GPIO13;
|
||||
let reset = peripherals.GPIO10;
|
||||
let dc = peripherals.GPIO12;
|
||||
let miso = peripherals.GPIO37;
|
||||
|
||||
let cs = Output::new(cs, Level::High, OutputConfig::default());
|
||||
let dc = Output::new(dc, Level::Low, OutputConfig::default());
|
||||
let mut reset = Output::new(reset, Level::High, OutputConfig::default());
|
||||
|
||||
let spi = Spi::new(
|
||||
spi,
|
||||
SpiConfig::default()
|
||||
.with_frequency(Rate::from_khz(5000))
|
||||
.with_mode(Mode::_0),
|
||||
)
|
||||
.unwrap()
|
||||
.with_sck(sck)
|
||||
.with_mosi(mosi)
|
||||
.with_miso(miso);
|
||||
|
||||
let spi = RefCell::new(spi);
|
||||
let spi_dev = embedded_hal_bus::spi::RefCellDevice::new(&spi, cs, delay).unwrap();
|
||||
let interface = display_interface_spi::SPIInterface::new(spi_dev, dc);
|
||||
let mut display = Ssd1306::new(
|
||||
interface,
|
||||
DisplaySize128x64,
|
||||
DisplayRotation::Rotate0,
|
||||
)
|
||||
.into_buffered_graphics_mode();
|
||||
|
||||
display.reset(&mut reset, &mut delay).unwrap();
|
||||
display.init().unwrap();
|
||||
display.clear(BinaryColor::Off).unwrap();
|
||||
|
||||
|
||||
let mut oled = display;
|
||||
|
||||
let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On);
|
||||
Text::new("Hello OLED", Point::new(10, 20), text_style)
|
||||
.draw(&mut oled)
|
||||
.unwrap();
|
||||
|
||||
oled.flush().unwrap();
|
||||
|
||||
loop {
|
||||
log::info!("Init finished");
|
||||
Timer::after_millis(1000).await;
|
||||
}
|
||||
}
|
||||
+35
-48
@@ -8,25 +8,21 @@
|
||||
#![deny(clippy::large_stack_frames)]
|
||||
|
||||
use creaturedex::card::mock::{MOCK_PAYLOAD, MOCK_PAYLOAD2};
|
||||
use creaturedex::display::shared_bus::init_dual_displays;
|
||||
|
||||
use creaturedex::display::primary_lcd::init_primary_lcd;
|
||||
use creaturedex::display::views::card_view::render_nfc_payload;
|
||||
use creaturedex::drivers::nfc_pn532::NfcPn532Driver;
|
||||
use creaturedex::navigation::input::init_navigation_button;
|
||||
use creaturedex::navigation::inputs::Inputs;
|
||||
use creaturedex::navigation::navigation;
|
||||
use creaturedex::navigation::state::NavigationState;
|
||||
use creaturedex::network::wifi::setup_wifi;
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_time::Timer;
|
||||
use embedded_graphics::draw_target::DrawTarget;
|
||||
use embedded_graphics::pixelcolor::{BinaryColor, Rgb565};
|
||||
use embedded_graphics::pixelcolor::Rgb565;
|
||||
use embedded_graphics::prelude::RgbColor;
|
||||
use embedded_graphics::{
|
||||
mono_font::{MonoTextStyle, ascii::FONT_6X10},
|
||||
prelude::*,
|
||||
text::Text,
|
||||
};
|
||||
use esp_hal::clock::CpuClock;
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::{Input, InputConfig, Pull};
|
||||
use esp_hal::time::Duration;
|
||||
use esp_hal::timer::timg::TimerGroup;
|
||||
use log::error;
|
||||
@@ -39,6 +35,8 @@ fn panic(panic_info: &core::panic::PanicInfo) -> ! {
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
const HEAP_SIZE: usize = 73744;
|
||||
|
||||
// This creates a default app-descriptor required by the esp-idf bootloader.
|
||||
// For more information see: <https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/app_image_format.html#application-description>
|
||||
esp_bootloader_esp_idf::esp_app_desc!();
|
||||
@@ -54,54 +52,31 @@ async fn main(spawner: Spawner) {
|
||||
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
||||
let peripherals = esp_hal::init(config);
|
||||
|
||||
// The following GPIO pins are in use by some feature of the module and should not be used.
|
||||
let _ = peripherals.GPIO27;
|
||||
let _ = peripherals.GPIO28;
|
||||
let _ = peripherals.GPIO29;
|
||||
let _ = peripherals.GPIO30;
|
||||
let _ = peripherals.GPIO31;
|
||||
let _ = peripherals.GPIO32;
|
||||
let _ = peripherals.GPIO33;
|
||||
let _ = peripherals.GPIO34;
|
||||
esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: HEAP_SIZE);
|
||||
|
||||
esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 73744);
|
||||
|
||||
let mut delay = Delay::new();
|
||||
let button1 = init_navigation_button(peripherals.GPIO38);
|
||||
|
||||
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
||||
let sw_interrupt =
|
||||
esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
|
||||
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
||||
esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0);
|
||||
|
||||
let (mut display, mut oled) = init_dual_displays(
|
||||
log::info!("Setup complete, entering main loop");
|
||||
|
||||
let mut display = init_primary_lcd(
|
||||
peripherals.SPI2,
|
||||
peripherals.GPIO36, // sck
|
||||
peripherals.GPIO35, // mosi
|
||||
peripherals.GPIO37, // miso
|
||||
peripherals.GPIO11, // primary cs
|
||||
peripherals.GPIO13, // oled cs
|
||||
peripherals.GPIO10, // shared reset
|
||||
peripherals.GPIO12, // shared dc
|
||||
&mut delay,
|
||||
peripherals.GPIO36,
|
||||
peripherals.GPIO35,
|
||||
peripherals.GPIO37,
|
||||
peripherals.GPIO11,
|
||||
peripherals.GPIO10,
|
||||
peripherals.GPIO12,
|
||||
);
|
||||
|
||||
setup_wifi(peripherals.WIFI, peripherals.FLASH, &spawner).await;
|
||||
|
||||
log::info!("Setup complete, entering main loop");
|
||||
|
||||
let mut nav_state = NavigationState::new();
|
||||
|
||||
oled.clear(BinaryColor::Off).unwrap();
|
||||
|
||||
let text_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On);
|
||||
Text::new("Hello OLED", Point::new(10, 20), text_style)
|
||||
.draw(&mut oled)
|
||||
.unwrap();
|
||||
oled.flush().unwrap();
|
||||
|
||||
let text_style = MonoTextStyle::new(&FONT_6X10, Rgb565::WHITE);
|
||||
display.clear_screen(0).unwrap();
|
||||
Text::new("Hello OLED", Point::new(10, 20), text_style).draw(&mut display).unwrap();
|
||||
|
||||
let mut nfc_driver =
|
||||
NfcPn532Driver::new(peripherals.I2C0, peripherals.GPIO17, peripherals.GPIO18);
|
||||
let timeout = Duration::from_millis(1000);
|
||||
@@ -111,7 +86,19 @@ async fn main(spawner: Spawner) {
|
||||
log::error!("NFC SAM configuration failed");
|
||||
}
|
||||
|
||||
loop {
|
||||
Timer::after_millis(10).await;
|
||||
}
|
||||
log::info!("Setup complete, entering main loop");
|
||||
|
||||
let mut nav_state = NavigationState::new();
|
||||
|
||||
let button_config = InputConfig::default().with_pull(Pull::Up);
|
||||
let mut inputs = Inputs {
|
||||
up: Input::new(peripherals.GPIO38, button_config.clone()),
|
||||
down: Input::new(peripherals.GPIO0, button_config.clone()),
|
||||
left: Input::new(peripherals.GPIO1, button_config.clone()),
|
||||
right: Input::new(peripherals.GPIO2, button_config.clone()),
|
||||
back: Input::new(peripherals.GPIO3, button_config.clone()),
|
||||
ok: Input::new(peripherals.GPIO4, button_config.clone()),
|
||||
};
|
||||
|
||||
spawner.spawn(navigation::run(inputs).expect("run task failed"));
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
pub mod palette;
|
||||
pub mod primary_lcd;
|
||||
pub mod secondary_oled;
|
||||
pub mod shared_bus;
|
||||
pub mod sprite;
|
||||
pub mod tertiary_lcd;
|
||||
pub mod views;
|
||||
|
||||
|
||||
+41
-30
@@ -1,43 +1,56 @@
|
||||
use core::cell::RefCell;
|
||||
use display_interface_spi::SPIInterface;
|
||||
use embedded_graphics::draw_target::DrawTarget;
|
||||
use embedded_graphics::pixelcolor::Rgb565;
|
||||
use embedded_graphics::prelude::RgbColor;
|
||||
use embedded_hal::digital::OutputPin as EhOutputPin;
|
||||
use embedded_hal_bus::spi::RefCellDevice;
|
||||
use embedded_hal_bus::spi::ExclusiveDevice;
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig, OutputPin};
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig};
|
||||
use esp_hal::peripherals::{GPIO10, GPIO11, GPIO12, GPIO35, GPIO36, GPIO37, SPI2};
|
||||
use esp_hal::spi::{
|
||||
Mode,
|
||||
master::{Config, Spi},
|
||||
};
|
||||
use esp_hal::time::Rate;
|
||||
use ili9341::{DisplaySize240x320, Ili9341, Orientation};
|
||||
|
||||
pub type PrimaryLcdDisplay<'a, BUS, DC, RES> = Ili9341<
|
||||
SPIInterface<
|
||||
RefCellDevice<'a, BUS, Output<'a>, Delay>,
|
||||
DC,
|
||||
>,
|
||||
RES,
|
||||
pub type PrimaryLcdDisplay<'a> = Ili9341<
|
||||
SPIInterface<ExclusiveDevice<Spi<'a, esp_hal::Blocking>, Output<'a>, Delay>, Output<'a>>,
|
||||
Output<'a>,
|
||||
>;
|
||||
|
||||
pub fn init_primary_lcd_on_bus<'a, BUS, CS, RES, DC>(
|
||||
spi_bus: &'a RefCell<BUS>,
|
||||
cs: CS,
|
||||
reset: RES,
|
||||
dc: DC,
|
||||
delay: &mut Delay,
|
||||
) -> PrimaryLcdDisplay<'a, BUS, DC, RES>
|
||||
where
|
||||
BUS: embedded_hal::spi::SpiBus,
|
||||
CS: OutputPin + 'static,
|
||||
RES: EhOutputPin,
|
||||
DC: EhOutputPin,
|
||||
{
|
||||
let cs_pin = Output::new(cs, Level::High, OutputConfig::default());
|
||||
let spi_dev = RefCellDevice::new(spi_bus, cs_pin, *delay).unwrap();
|
||||
let iface = SPIInterface::new(spi_dev, dc);
|
||||
pub fn init_primary_lcd(
|
||||
spi2: SPI2<'static>,
|
||||
sck: GPIO36<'static>,
|
||||
mosi: GPIO35<'static>,
|
||||
miso: GPIO37<'static>,
|
||||
cs: GPIO11<'static>,
|
||||
reset: GPIO10<'static>,
|
||||
dc: GPIO12<'static>,
|
||||
) -> PrimaryLcdDisplay<'static> {
|
||||
let freq = Rate::from_khz(60_000);
|
||||
log::info!("Display freq: {freq}");
|
||||
|
||||
let spi_bus = Spi::new(
|
||||
spi2,
|
||||
Config::default().with_frequency(freq).with_mode(Mode::_0),
|
||||
)
|
||||
.unwrap()
|
||||
.with_sck(sck)
|
||||
.with_mosi(mosi)
|
||||
.with_miso(miso);
|
||||
|
||||
let mut delay = Delay::new();
|
||||
|
||||
let cs_main = Output::new(cs, Level::High, OutputConfig::default());
|
||||
let spi_dev = ExclusiveDevice::new(spi_bus, cs_main, delay).unwrap();
|
||||
let reset_main = Output::new(reset, Level::High, OutputConfig::default());
|
||||
let spi_dc = Output::new(dc, Level::High, OutputConfig::default());
|
||||
let iface = SPIInterface::new(spi_dev, spi_dc);
|
||||
|
||||
let mut display = Ili9341::new(
|
||||
iface,
|
||||
reset,
|
||||
delay,
|
||||
reset_main,
|
||||
&mut delay,
|
||||
Orientation::Portrait,
|
||||
DisplaySize240x320,
|
||||
)
|
||||
@@ -46,5 +59,3 @@ where
|
||||
display.clear(Rgb565::BLACK).unwrap();
|
||||
display
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,54 +1 @@
|
||||
use core::cell::RefCell;
|
||||
use display_interface_spi::SPIInterface;
|
||||
use embedded_graphics::pixelcolor::BinaryColor;
|
||||
use embedded_graphics::prelude::*;
|
||||
use embedded_hal::digital::OutputPin as EhOutputPin;
|
||||
use embedded_hal_bus::spi::RefCellDevice;
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig, OutputPin};
|
||||
use ssd1306::mode::BufferedGraphicsMode;
|
||||
use ssd1306::prelude::*;
|
||||
use ssd1306::Ssd1306;
|
||||
|
||||
pub type SecondaryOledDisplay<'a, BUS, DC> = Ssd1306<
|
||||
SPIInterface<
|
||||
RefCellDevice<'a, BUS, Output<'a>, Delay>,
|
||||
DC,
|
||||
>,
|
||||
DisplaySize128x64,
|
||||
BufferedGraphicsMode<DisplaySize128x64>,
|
||||
>;
|
||||
|
||||
pub fn init_secondary_oled_on_bus<'a, BUS, CS, RES, DC>(
|
||||
spi_bus: &'a RefCell<BUS>,
|
||||
cs: CS,
|
||||
mut res: RES,
|
||||
dc: DC,
|
||||
delay: &mut Delay,
|
||||
) -> SecondaryOledDisplay<'a, BUS, DC>
|
||||
where
|
||||
BUS: embedded_hal::spi::SpiBus,
|
||||
CS: OutputPin + 'static,
|
||||
RES: EhOutputPin,
|
||||
DC: EhOutputPin,
|
||||
{
|
||||
let cs_pin = Output::new(cs, Level::High, OutputConfig::default());
|
||||
let spi_dev = RefCellDevice::new(spi_bus, cs_pin, *delay).unwrap();
|
||||
let interface = SPIInterface::new(spi_dev, dc);
|
||||
|
||||
let mut display = Ssd1306::new(
|
||||
interface,
|
||||
DisplaySize128x64,
|
||||
DisplayRotation::Rotate0,
|
||||
)
|
||||
.into_buffered_graphics_mode();
|
||||
|
||||
display.reset(&mut res, delay).unwrap();
|
||||
display.init().unwrap();
|
||||
display.clear(BinaryColor::Off).unwrap();
|
||||
display.flush().unwrap();
|
||||
|
||||
display
|
||||
}
|
||||
|
||||
|
||||
// Secondary OLED module
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
use alloc::boxed::Box;
|
||||
use core::cell::RefCell;
|
||||
use embedded_hal::digital::{ErrorType, OutputPin as EhOutputPin, PinState};
|
||||
use esp_hal::delay::Delay;
|
||||
use esp_hal::gpio::interconnect::{PeripheralInput, PeripheralOutput};
|
||||
use esp_hal::gpio::{Level, Output, OutputConfig, OutputPin};
|
||||
use esp_hal::spi::master::{Config as SpiConfig, Spi};
|
||||
use esp_hal::spi::Mode;
|
||||
use esp_hal::time::Rate;
|
||||
use crate::display::primary_lcd::{init_primary_lcd_on_bus, PrimaryLcdDisplay};
|
||||
|
||||
use crate::display::secondary_oled::{init_secondary_oled_on_bus, SecondaryOledDisplay};
|
||||
|
||||
pub struct SharedPin<'a>(pub &'a RefCell<Output<'static>>);
|
||||
|
||||
impl<'a> ErrorType for SharedPin<'a> {
|
||||
type Error = core::convert::Infallible;
|
||||
}
|
||||
|
||||
impl<'a> EhOutputPin for SharedPin<'a> {
|
||||
fn set_low(&mut self) -> Result<(), Self::Error> {
|
||||
self.0.borrow_mut().set_low();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_high(&mut self) -> Result<(), Self::Error> {
|
||||
self.0.borrow_mut().set_high();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_state(&mut self, state: PinState) -> Result<(), Self::Error> {
|
||||
self.0.borrow_mut().set_state(state);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub type DisplaySpiBus = Spi<'static, esp_hal::Blocking>;
|
||||
pub type DualPrimaryDisplay<'a> = PrimaryLcdDisplay<'a, DisplaySpiBus, SharedPin<'a>, SharedPin<'a>>;
|
||||
pub type DualSecondaryDisplay<'a> = SecondaryOledDisplay<'a, DisplaySpiBus, SharedPin<'a>>;
|
||||
|
||||
pub fn init_dual_displays<SPI, SCK, MOSI, MISO, CS1, CS2, RES, DC>(
|
||||
spi_peripheral: SPI,
|
||||
sck: SCK,
|
||||
mosi: MOSI,
|
||||
miso: MISO,
|
||||
cs_primary: CS1,
|
||||
cs_secondary: CS2,
|
||||
reset_pin: RES,
|
||||
dc_pin: DC,
|
||||
delay: &mut Delay,
|
||||
) -> (DualPrimaryDisplay<'static>, DualSecondaryDisplay<'static>)
|
||||
|
||||
where
|
||||
SPI: esp_hal::spi::master::Instance + 'static,
|
||||
SCK: PeripheralOutput<'static>,
|
||||
MOSI: PeripheralOutput<'static>,
|
||||
MISO: PeripheralInput<'static>,
|
||||
CS1: OutputPin + 'static,
|
||||
CS2: OutputPin + 'static,
|
||||
RES: OutputPin + 'static,
|
||||
DC: OutputPin + 'static,
|
||||
{
|
||||
let spi = Spi::new(
|
||||
spi_peripheral,
|
||||
SpiConfig::default().with_frequency(Rate::from_khz(20_000)).with_mode(Mode::_0),
|
||||
)
|
||||
.unwrap()
|
||||
.with_sck(sck)
|
||||
.with_mosi(mosi)
|
||||
.with_miso(miso);
|
||||
|
||||
let bus_static: &'static RefCell<DisplaySpiBus> = Box::leak(Box::new(RefCell::new(spi)));
|
||||
let reset_static: &'static RefCell<Output<'static>> = Box::leak(Box::new(RefCell::new(
|
||||
Output::new(reset_pin, Level::High, OutputConfig::default()),
|
||||
)));
|
||||
let dc_static: &'static RefCell<Output<'static>> = Box::leak(Box::new(RefCell::new(
|
||||
Output::new(dc_pin, Level::High, OutputConfig::default()),
|
||||
)));
|
||||
|
||||
let primary = init_primary_lcd_on_bus(
|
||||
bus_static,
|
||||
cs_primary,
|
||||
SharedPin(reset_static),
|
||||
SharedPin(dc_static),
|
||||
delay,
|
||||
);
|
||||
|
||||
let secondary = init_secondary_oled_on_bus(
|
||||
bus_static,
|
||||
cs_secondary,
|
||||
SharedPin(reset_static),
|
||||
SharedPin(dc_static),
|
||||
delay,
|
||||
);
|
||||
|
||||
(primary, secondary)
|
||||
}
|
||||
|
||||
+3
-1
@@ -1,2 +1,4 @@
|
||||
pub mod input;
|
||||
pub mod inputs;
|
||||
pub mod main_menu;
|
||||
pub mod navigation;
|
||||
pub mod state;
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
use esp_hal::gpio::{Input, InputConfig, Pull};
|
||||
use esp_hal::peripherals::GPIO38;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum NavCommand {
|
||||
NextCard,
|
||||
PrevCard,
|
||||
Select,
|
||||
ScanTag,
|
||||
}
|
||||
|
||||
pub fn init_navigation_button(pin: GPIO38<'static>) -> Input<'static> {
|
||||
let button_config = InputConfig::default().with_pull(Pull::Up);
|
||||
Input::new(pin, button_config)
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
use esp_hal::gpio::{Input, InputConfig, Pull};
|
||||
use esp_hal::peripherals::Peripherals;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum NavCommand {
|
||||
NextCard,
|
||||
PrevCard,
|
||||
Select,
|
||||
ScanTag,
|
||||
}
|
||||
|
||||
pub struct Inputs {
|
||||
pub up: Input<'static>,
|
||||
pub down: Input<'static>,
|
||||
pub left: Input<'static>,
|
||||
pub right: Input<'static>,
|
||||
pub back: Input<'static>,
|
||||
pub ok: Input<'static>,
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
use crate::navigation::inputs::Inputs;
|
||||
|
||||
pub const MAX_SELECTED: i8 = 3;
|
||||
|
||||
pub struct MainMenu {
|
||||
pub selected: i8,
|
||||
}
|
||||
|
||||
impl MainMenu {
|
||||
pub async fn display(self: &Self) {}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
use crate::navigation::inputs::Inputs;
|
||||
use crate::navigation::main_menu::{MAX_SELECTED, MainMenu};
|
||||
|
||||
use embassy_futures::select::Either6;
|
||||
use embassy_futures::select::select6;
|
||||
|
||||
#[embassy_executor::task]
|
||||
pub async fn run(mut inputs: Inputs) {
|
||||
let mut state = MainMenu { selected: 0 };
|
||||
|
||||
loop {
|
||||
let selection = select6(
|
||||
inputs.up.wait_for_low(),
|
||||
inputs.down.wait_for_low(),
|
||||
inputs.left.wait_for_low(),
|
||||
inputs.right.wait_for_low(),
|
||||
inputs.ok.wait_for_low(),
|
||||
inputs.back.wait_for_low(),
|
||||
)
|
||||
.await;
|
||||
|
||||
let value = match selection {
|
||||
Either6::First(_) => (state.selected.wrapping_sub(1)) % MAX_SELECTED,
|
||||
Either6::Second(_) => (state.selected.wrapping_add(1)) % MAX_SELECTED,
|
||||
_ => continue, // Either6::Third(_) => ,
|
||||
// Either6::Fourth(_) => (),
|
||||
// Either6::Fifth(_) => (),
|
||||
// Either6::Sixth(_) => (),
|
||||
};
|
||||
|
||||
state.selected = value;
|
||||
|
||||
state.display().await
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user