4 // Panic provider crate
8 // Used to set the program entry point
9 use cortex_m_rt::entry;
11 // Provides definitions for our development board
13 gpio::{p0::Parts as P0Parts, p1::Parts as P1Parts, Level},
15 spim::{Frequency as SpimFrequency, Pins as SpimPins, MODE_0},
16 target::{CorePeripherals, Peripherals},
17 twim::{Frequency as TwimFrequency, Pins as TwimPins},
18 Clocks, Rng, Spim, Timer, Twim,
21 use rtt_target::{rprint, rprintln, rtt_init_print};
23 use embedded_graphics::{
24 fonts::{Font8x16, Text},
27 style::{TextStyle, TextStyleBuilder},
30 use bbq10kbd::{Bbq10Kbd, KeyRaw};
34 use ili9341::{Ili9341, Orientation};
36 const TEXT_SAMPLE: &[&str] = &[
39 " let rand: u16 = rng.random_u16();",
40 " buffy.iter_mut().for_each(|px| {",
46 " (32 * (x + 1)) - 1,",
47 " (24 * (y + 1)) - 1,",
54 const TEXT_SAMPLE2: &[&[(i32, Rgb565, &str)]] = &[
55 // "for x in 0..10 {",
57 (0, Rgb565::RED, "for "),
58 (4, Rgb565::WHITE, "x "),
59 (6, Rgb565::RED, "in "),
60 (9, Rgb565::MAGENTA, "0"),
61 (10, Rgb565::RED, ".."),
62 (12, Rgb565::MAGENTA, "10"),
63 (14, Rgb565::WHITE, " {"),
65 // " for y in 0..10 {",
67 (2, Rgb565::RED, "for "),
68 (6, Rgb565::WHITE, "y "),
69 (8, Rgb565::RED, "in "),
70 (11, Rgb565::MAGENTA, "0"),
71 (12, Rgb565::RED, ".."),
72 (14, Rgb565::MAGENTA, "10"),
73 (16, Rgb565::WHITE, " {"),
75 // " let rand: u16 = rng.random_u16();",
77 (4, Rgb565::CYAN, "let "),
78 (8, Rgb565::WHITE, "rand: "),
79 (14, Rgb565::CYAN, "u16 "),
80 (18, Rgb565::RED, "= "),
81 (20, Rgb565::WHITE, "rng."),
82 (24, Rgb565::CYAN, "random_u16"),
83 (34, Rgb565::WHITE, "();"),
85 // " buffy.iter_mut().for_each(|px| {",
87 (4, Rgb565::WHITE, "buffy."),
88 (10, Rgb565::CYAN, "iter_mut"),
89 (18, Rgb565::WHITE, "()."),
90 (21, Rgb565::CYAN, "for_each"),
91 (29, Rgb565::WHITE, "(|"),
92 (31, Rgb565::YELLOW, "px"),
93 (33, Rgb565::WHITE, "| {"),
95 // " *px = swap(rand)",
97 (6, Rgb565::RED, "*"),
98 (7, Rgb565::WHITE, "px "),
99 (10, Rgb565::RED, "= "),
100 (12, Rgb565::CYAN, "swap"),
101 (16, Rgb565::WHITE, "(rand)"),
104 &[(4, Rgb565::WHITE, "});")],
107 (4, Rgb565::WHITE, "lcd."),
108 (8, Rgb565::CYAN, "draw_raw"),
109 (16, Rgb565::WHITE, "("),
113 (6, Rgb565::MAGENTA, "32 "),
114 (9, Rgb565::RED, "* "),
115 (11, Rgb565::WHITE, "x,"),
119 (6, Rgb565::MAGENTA, "24 "),
120 (9, Rgb565::RED, "* "),
121 (11, Rgb565::WHITE, "y,"),
123 // " (32 * (x + 1)) - 1,",
125 (6, Rgb565::WHITE, "("),
126 (7, Rgb565::MAGENTA, "32 "),
127 (10, Rgb565::RED, "* "),
128 (12, Rgb565::WHITE, "(x "),
129 (15, Rgb565::RED, "+ "),
130 (17, Rgb565::MAGENTA, "1"),
131 (18, Rgb565::WHITE, ")) "),
132 (21, Rgb565::RED, "- "),
133 (23, Rgb565::MAGENTA, "1"),
134 (24, Rgb565::WHITE, ","),
136 // " (24 * (y + 1)) - 1,",
138 (6, Rgb565::WHITE, "("),
139 (7, Rgb565::MAGENTA, "24 "),
140 (10, Rgb565::RED, "* "),
141 (12, Rgb565::WHITE, "(y "),
142 (15, Rgb565::RED, "+ "),
143 (17, Rgb565::MAGENTA, "1"),
144 (18, Rgb565::WHITE, ")) "),
145 (21, Rgb565::RED, "- "),
146 (23, Rgb565::MAGENTA, "1"),
147 (24, Rgb565::WHITE, ","),
150 &[(6, Rgb565::RED, "&"), (7, Rgb565::WHITE, "buffy,")],
153 (4, Rgb565::WHITE, ")."),
154 (6, Rgb565::CYAN, "unwrap"),
155 (12, Rgb565::WHITE, "();"),
158 &[(2, Rgb565::WHITE, "}")],
160 &[(0, Rgb565::WHITE, "}")],
166 Ok(()) => cortex_m::peripheral::SCB::sys_reset(),
171 fn inner_main() -> Result<(), &'static str> {
172 let mut board = Peripherals::take().ok_or("Error getting board!")?;
173 let mut corep = CorePeripherals::take().ok_or("Error")?;
174 let mut timer = Timer::new(board.TIMER0);
175 let mut delay = Timer::new(board.TIMER1);
176 let mut rng = Rng::new(board.RNG);
177 let mut toggle = false;
178 let _clocks = Clocks::new(board.CLOCK).enable_ext_hfosc();
180 // use ChannelMode::NoBlockS
181 rtt_init_print!(NoBlockSkip, 4096);
183 if let Some(msg) = panic_persist::get_panic_message_utf8() {
184 rprintln!("{}", msg);
186 rprintln!("Clean boot!");
189 let p0 = P0Parts::new(board.P0);
190 let p1 = P1Parts::new(board.P1);
192 let kbd_lcd_reset = p1.p1_08; // GPIO5, D5
193 let stm_cs = p0.p0_07; // GPIO6, D6,
194 let lcd_cs = p0.p0_26; // GPIO9, D9,
195 let lcd_dc = p0.p0_27; // GPIO10, D10
197 let kbd_sda = p0.p0_12.into_floating_input().degrade();
198 let kbd_scl = p0.p0_11.into_floating_input().degrade();
200 let kbd_i2c = Twim::new(
209 let mut kbd = Bbq10Kbd::new(kbd_i2c);
211 // Pull the neopixel lines low so noise doesn't make it turn on spuriously
212 let keywing_neopixel = p0.p0_06.into_push_pull_output(Level::Low); // GPIO11, D11
213 let feather_neopixel = p0.p0_16.into_push_pull_output(Level::Low);
215 let spim = Spim::new(
218 sck: p0.p0_14.into_push_pull_output(Level::Low).degrade(),
219 miso: Some(p0.p0_15.into_floating_input().degrade()),
220 mosi: Some(p0.p0_13.into_push_pull_output(Level::Low).degrade()),
227 let mut lcd = Ili9341::new_spi(
229 lcd_cs.into_push_pull_output(Level::High),
230 lcd_dc.into_push_pull_output(Level::High),
231 kbd_lcd_reset.into_push_pull_output(Level::High),
236 lcd.set_orientation(Orientation::Landscape).unwrap();
238 let mut _buffy = [0u16; 24 * 32];
239 let mut buffy2 = [[0u16; 320]; 240];
241 let mut fbuffy = buffer::FrameBuffer::new(&mut buffy2);
243 // // rrrrr gggggg bbbbb
244 // buffy.iter_mut().for_each(|px| *px = 0b11111_000000_00000);
246 let mut style = TextStyleBuilder::new(Font8x16)
247 .text_color(Rgb565::WHITE)
248 .background_color(Rgb565::BLACK)
252 kbd.set_backlight(ctr).unwrap();
254 let vers = kbd.get_version().unwrap();
256 rprintln!("Vers: {:?}", vers);
258 kbd.sw_reset().unwrap();
259 timer.delay_ms(10u8);
261 let vers = kbd.get_version().unwrap();
263 rprintln!("Vers: {:?}", vers);
265 let mut cursor_y = 0;
266 let mut cursor_x = 0;
268 let mut cursor = Cursor { x: 0, y: 0 };
270 lcd.clear(Rgb565::BLACK).map_err(|_| "Fade to error")?;
271 fbuffy.clear(Rgb565::BLACK).map_err(|_| "Fade to error")?;
274 let key = kbd.get_fifo_key_raw().map_err(|_| "bad fifo")?;
278 KeyRaw::Pressed(6) => {
279 style = TextStyleBuilder::new(Font8x16)
280 .text_color(Rgb565::WHITE)
281 .background_color(Rgb565::BLACK)
285 KeyRaw::Pressed(17) => {
286 style = TextStyleBuilder::new(Font8x16)
287 .text_color(Rgb565::RED)
288 .background_color(Rgb565::BLACK)
292 KeyRaw::Pressed(7) => {
293 style = TextStyleBuilder::new(Font8x16)
294 .text_color(Rgb565::GREEN)
295 .background_color(Rgb565::BLACK)
299 KeyRaw::Pressed(18) => {
300 style = TextStyleBuilder::new(Font8x16)
301 .text_color(Rgb565::BLUE)
302 .background_color(Rgb565::BLACK)
306 KeyRaw::Pressed(1) => {
310 KeyRaw::Pressed(2) => {
314 KeyRaw::Pressed(3) => {
318 KeyRaw::Pressed(4) => {
322 KeyRaw::Pressed(5) => {
323 kbd.sw_reset().unwrap();
324 cursor = Cursor { x: 0, y: 0 };
325 fbuffy.clear(Rgb565::BLACK).map_err(|_| "Fade to error")?;
328 KeyRaw::Pressed(8) => {
330 Text::new(" ", cursor.pos())
333 .map_err(|_| "bad lcd")?;
336 KeyRaw::Pressed(10) => {
339 KeyRaw::Pressed(k) => {
340 rprintln!("Got key {}", k);
341 if let Ok(s) = core::str::from_utf8(&[k]) {
342 Text::new(s, cursor.pos())
345 .map_err(|_| "bad lcd")?;
351 if let Some(buf) = fbuffy.inner() {
352 timer.start(1_000_000u32);
357 ).map_err(|_| "bad buffy")?;
358 let done = timer.read();
359 rprintln!("Drew in {}ms.", done / 1000);
361 timer.delay_ms(38u8);
404 fn right(&mut self) {
412 fn enter(&mut self) {
419 fn pos(&self) -> Point {
420 Point::new(self.x * 8, self.y * 16)
424 // let key_raw = kbd.get_fifo_key_raw().unwrap();
427 // KeyRaw::Invalid => {
428 // timer.delay_ms(1000u16);
429 // let state = kbd.get_key_status().unwrap();
430 // rprintln!("Key Status: {:?}", state);
433 // ctr = ctr.wrapping_add(5);
434 // rprintln!("Key: {:?} - {}", key, ctr);
435 // kbd.set_backlight(ctr).unwrap();
436 // assert_eq!(kbd.get_backlight().unwrap(), ctr);