diff --git a/src/main.rs b/src/main.rs index d9b0f8e..7eca3c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,15 +13,17 @@ use core::ptr::addr_of; use atmega_hal::{ Adc, Usart, adc::AdcSettings, + delay, spi::{self, Settings}, usart::Baudrate, }; +use embedded_hal::delay::DelayNs; use panic_halt as _; use crate::{ display::{Display, Rgb565, Vec2}, font::{draw_number, draw_text}, - graphics::{Image, LARGE_CAT_UNSAFE}, + graphics::{Image, LARGE_CAT_UNSAFE, draw_image}, peripherals::{Button, Knob}, }; @@ -84,106 +86,100 @@ fn main() -> ! { adc, }; - let mut idx = 0; let images = [Image::from(addr_of!(LARGE_CAT_UNSAFE))]; - let len = images.len(); + + let mut delay = atmega_hal::delay::Delay::::new(); let mut position = Vec2 { x: 10, y: 10 }; + let original_position = position.clone(); draw_text( &mut display, - "button:\n", + "dice:\n", Rgb565::white(), Rgb565::black(), &mut position, 3, ); - let button_pos = position.clone(); - let mut counter = 0; + let number_pos = position.clone(); draw_number( &mut display, - counter, + 0, Rgb565::white(), Rgb565::black(), - &mut button_pos.clone(), + &mut number_pos.clone(), 3, ); - - draw_text( - &mut display, - "\nvolume:\n", - Rgb565::white(), - Rgb565::black(), - &mut position, - 3, - ); - - let volume_pos = position.clone(); - let mut last_volume = knob.raw(); - let mut counter = 0; - draw_number( - &mut display, - last_volume.into(), - Rgb565::white(), - Rgb565::black(), - &mut volume_pos.clone(), - 3, - ); - + let mut clock = 0u32; + let mut animation = 0; + let mut animation_reached = true; + let mut cat_received = false; + let max_number = 10; loop { - let volume = knob.raw(); - if volume != last_volume { - if volume == 0 || last_volume == 0 || last_volume.ilog10() > volume.ilog10() { - // Clear previous + clock += 1; + if button.poll() { + animation = 50; + animation_reached = false; + if cat_received { + display.draw_rect( + Vec2 { x: 0, y: 0 }, + Vec2 { x: 240, y: 240 }, + Rgb565::black().as_color(), + ); draw_text( &mut display, - " ", + "dice:\n", Rgb565::white(), Rgb565::black(), - &mut volume_pos.clone(), + &mut original_position.clone(), + 3, + ); + cat_received = false; + } + } + if animation > 0 { + let modulo = match animation { + 50..100 => 5, + 20..50 => 10, + 0..20 => 20, + _ => 10, + }; + animation -= 1; + if animation % modulo == 0 { + let random = (((clock * 543_128) ^ 7_643_125) & 0b11111111) as f32 / 255f32; + let dice = (random * max_number as f32) as u32; + draw_number( + &mut display, + dice, + Rgb565::white(), + Rgb565::black(), + &mut number_pos.clone(), 3, ); } - last_volume = volume; + } else if !animation_reached { + animation_reached = true; + let random = (((clock * 543_128) ^ 7_643_125) & 0b11111111) as f32 / 255f32; + let dice = (random * max_number as f32 + 1f32) as u32; draw_number( &mut display, - volume.into(), + dice, Rgb565::white(), Rgb565::black(), - &mut volume_pos.clone(), + &mut number_pos.clone(), 3, ); - } - if button.poll() { - counter += 1; - draw_number( - &mut display, - counter, - Rgb565::white(), - Rgb565::black(), - &mut button_pos.clone(), - 3, - ); - // match draw_image( - // &mut serial, - // &mut images[idx].iter(), - // &mut display, - // Vec2 { x: 0, y: 0 }, - // ) { - // Ok(_) => ufmt::uwriteln!(serial, "Successfully read QOI").unwrap(), - // Err(e) => ufmt::uwriteln!(serial, "Error: {:?}", e).unwrap(), - // } - - // draw_text( - // &mut display, - // "you just lost the game!", - // Rgb565::white(), - // Rgb565::black(), - // &mut Vec2 { x: 10, y: 10 }, - // 3, - // ); - - // idx = (idx + 1) % len; + if dice == max_number { + delay.delay_ms(1000); + draw_image( + &mut serial, + &mut Image::from(addr_of!(LARGE_CAT_UNSAFE)).iter(), + &mut display, + Vec2 { x: 0, y: 0 }, + ) + .unwrap(); + cat_received = true; + } } } }