diff --git a/Cargo.lock b/Cargo.lock index a4cb8a9..08f7d4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,12 +23,6 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "cortex-m" version = "0.7.7" @@ -68,48 +62,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" -[[package]] -name = "defmt" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" -dependencies = [ - "bitflags", - "defmt-macros", -] - -[[package]] -name = "defmt-macros" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" -dependencies = [ - "defmt-parser", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "defmt-parser" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" -dependencies = [ - "thiserror", -] - -[[package]] -name = "defmt-rtt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d5a25c99d89c40f5676bec8cefe0614f17f0f40e916f98e345dae941807f9e" -dependencies = [ - "critical-section", - "defmt", -] - [[package]] name = "deranged" version = "0.5.8" @@ -275,16 +227,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11" -[[package]] -name = "panic-probe" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd402d00b0fb94c5aee000029204a46884b1262e0c443f166d86d2c0747e1a1a" -dependencies = [ - "cortex-m", - "defmt", -] - [[package]] name = "portable-atomic" version = "1.13.1" @@ -297,28 +239,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -398,14 +318,12 @@ version = "0.1.0" dependencies = [ "cortex-m", "cortex-m-rt", - "defmt", - "defmt-rtt", "embedded-hal 1.0.0", "otm8009a", "panic-halt", - "panic-probe", "stm32f4", "stm32f4xx-hal", + "time", ] [[package]] @@ -448,26 +366,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "time" version = "0.3.47" diff --git a/Cargo.toml b/Cargo.toml index 90a1b4c..4adb76a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,21 +7,15 @@ edition = "2024" cortex-m = {version = "0.7.7", features = ["critical-section-single-core"]} cortex-m-rt = "0.7.5" embedded-hal = "1.0.0" -defmt-rtt = "1.1.0" -defmt = "1.0.1" -panic-probe = {version = "1.0.0", features = ["print-defmt"]} panic-halt = "1.0.0" otm8009a = "0.1.0" stm32f4 = "0.16.0" +time = {version = "0.3.47", default-features = false} [dependencies.stm32f4xx-hal] version = "0.23.0" features = ["stm32f469"] -[features] -default = [] -ccmram = [] - [[bin]] name = "stm32f469ni" test = false diff --git a/src/main.rs b/src/main.rs index 07986f4..1fd6e31 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,8 +15,8 @@ use otm8009a::{Otm8009A, Otm8009AConfig}; use panic_halt as _; use stm32f4xx_hal::{self as hal, gpio::Speed, ltdc, rcc::Config}; -const WIDTH: usize = 480; -const HEIGHT: usize = 800; +const WIDTH: usize = 800; +const HEIGHT: usize = 480; const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig { active_width: WIDTH as _, @@ -34,6 +34,11 @@ const DISPLAY_CONFIGURATION: DisplayConfig = DisplayConfig { pixel_clock_pol: true, }; +const LINE_WIDTH: usize = 20; +const DIGIT_HEIGHT: usize = 350; +const DIGIT_WIDTH: usize = 150; +const DIGIT_MARGIN: usize = 20; + #[entry] fn main() -> ! { let peripherals = Peripherals::take().unwrap(); @@ -165,6 +170,13 @@ fn main() -> ! { while fmc.sdsr().read().busy().bit_is_set() {} + let rtc = peripherals.RTC; + let mut pwr = peripherals.PWR; + + let mut enabled_rtc = hal::rtc::Rtc::new(rtc, &mut rcc, &mut pwr); + //let time_val = time::Time::from_hms_micro(0, 0, 0, 0).unwrap(); + //enabled_rtc.set_time(&time_val).unwrap(); + let mut lcd_reset = gpioh.ph7.into_push_pull_output(); lcd_reset.set_low(); delay.delay_ms(20_u32); @@ -234,7 +246,7 @@ fn main() -> ! { &mut dsi_host, Otm8009AConfig { frame_rate: otm8009a::FrameRate::_60Hz, - mode: otm8009a::Mode::Portrait, + mode: otm8009a::Mode::Landscape, color_map: otm8009a::ColorMap::Rgb, cols: WIDTH as u16, rows: HEIGHT as u16, @@ -244,13 +256,34 @@ fn main() -> ! { .unwrap(); unsafe { - (0..480 * 800).for_each(|i| BUFF[i] = 0xFF00FFFF); + (0..480 * 800).for_each(|i| BUFF[i] = 0xFF000000); } + draw_0(&mut display, ltdc::Layer::L1, (DIGIT_WIDTH, 65), 0xFFFFFFFF); + draw_5( + &mut display, + ltdc::Layer::L1, + (DIGIT_WIDTH * 2 + DIGIT_MARGIN, 65), + 0xFFFFFFFF, + ); + draw_colon( + &mut display, + ltdc::Layer::L1, + (WIDTH / 2 + LINE_WIDTH / 2, 65), + 0xFFFFFFFF, + ); + draw_2( + &mut display, + ltdc::Layer::L1, + (WIDTH - DIGIT_WIDTH - DIGIT_MARGIN, 65), + 0xFFFFFFFF, + ); + draw_8(&mut display, ltdc::Layer::L1, (WIDTH, 65), 0xFFFFFFFF); + display.reload(); gpiog.pg6.into_push_pull_output().set_low(); - gpiod.pd4.into_push_pull_output().set_low(); + let mut led = gpiod.pd4.into_push_pull_output(); gpiod.pd5.into_push_pull_output().set_low(); peripherals .GPIOK @@ -259,5 +292,315 @@ fn main() -> ! { .into_push_pull_output() .set_low(); - loop {} + loop { + if enabled_rtc.get_datetime().time().second() == 20 { + led.set_low(); + } else { + led.set_high(); + } + } +} + +// (x, y) +// 0,0 is top left + +// a +// ___ +// f |_g| b +// e |__| c +// d + +fn draw_rectangle( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + bottom_right: (usize, usize), + color: u32, +) { + for x in bottom_right.0.min(top_left.0)..bottom_right.0.max(top_left.0) { + for y in bottom_right.1.min(top_left.1)..bottom_right.1.max(top_left.1) { + display.draw_pixel(layer, x, y, color); + } + } +} + +fn draw_horizontal_line( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_rectangle( + display, + layer, + (top_left.0, top_left.1), + (top_left.0 - DIGIT_WIDTH, top_left.1 + LINE_WIDTH), + color, + ); +} + +fn draw_vertical_line( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_rectangle( + display, + layer, + (top_left.0, top_left.1), + (top_left.0 - LINE_WIDTH, top_left.1 + DIGIT_HEIGHT / 2), + color, + ); +} + +fn draw_a( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_horizontal_line(display, layer, top_left, color); +} + +fn draw_b( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_vertical_line( + display, + layer, + (top_left.0 - DIGIT_WIDTH + LINE_WIDTH, top_left.1), + color, + ); +} + +fn draw_c( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_vertical_line( + display, + layer, + ( + top_left.0 - DIGIT_WIDTH + LINE_WIDTH, + top_left.1 + DIGIT_HEIGHT / 2 - LINE_WIDTH, + ), + color, + ); +} + +fn draw_d( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_horizontal_line( + display, + layer, + (top_left.0, top_left.1 + DIGIT_HEIGHT - LINE_WIDTH), + color, + ); +} + +fn draw_e( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_vertical_line( + display, + layer, + (top_left.0, top_left.1 + DIGIT_HEIGHT / 2 - LINE_WIDTH), + color, + ); +} + +fn draw_f( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_vertical_line(display, layer, (top_left.0, top_left.1), color); +} + +fn draw_g( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_horizontal_line( + display, + layer, + (top_left.0, top_left.1 + DIGIT_HEIGHT / 2 - LINE_WIDTH), + color, + ); +} + +fn draw_colon( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_rectangle( + display, + layer, + (top_left.0, top_left.1 + DIGIT_MARGIN * 2), + ( + top_left.0 - LINE_WIDTH, + top_left.1 + LINE_WIDTH + DIGIT_MARGIN * 2, + ), + color, + ); + draw_rectangle( + display, + layer, + ( + top_left.0, + top_left.1 + DIGIT_HEIGHT - LINE_WIDTH - DIGIT_MARGIN * 2, + ), + ( + top_left.0 - LINE_WIDTH, + top_left.1 + DIGIT_HEIGHT - DIGIT_MARGIN * 2, + ), + color, + ); +} + +fn draw_0( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_e(display, layer, top_left, color); + draw_f(display, layer, top_left, color); +} + +fn draw_1( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); +} + +fn draw_2( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_b(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_e(display, layer, top_left, color); + draw_g(display, layer, top_left, color); +} + +fn draw_3( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_g(display, layer, top_left, color); +} + +fn draw_4( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_f(display, layer, top_left, color); + draw_g(display, layer, top_left, color); +} + +fn draw_5( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_f(display, layer, top_left, color); + draw_g(display, layer, top_left, color); +} + +fn draw_6( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_e(display, layer, top_left, color); + draw_f(display, layer, top_left, color); + draw_g(display, layer, top_left, color); +} + +fn draw_7( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); +} + +fn draw_8( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_e(display, layer, top_left, color); + draw_f(display, layer, top_left, color); + draw_g(display, layer, top_left, color); +} + +fn draw_9( + display: &mut DisplayController, + layer: ltdc::Layer, + top_left: (usize, usize), + color: u32, +) { + draw_a(display, layer, top_left, color); + draw_b(display, layer, top_left, color); + draw_c(display, layer, top_left, color); + draw_d(display, layer, top_left, color); + draw_f(display, layer, top_left, color); + draw_g(display, layer, top_left, color); }