puffidle
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 221 KiB |
|
@ -0,0 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
for image in $(ls puffidle-*.bmp); do
|
||||
# echo $image
|
||||
convert $image -define bmp:subtype=RGB565 -alpha off -resize 64x64 $image
|
||||
done
|
|
@ -3,7 +3,7 @@ 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
|
||||
CONFIG_FREERTOS_HZ=1000
|
||||
|
||||
# Workaround for https://github.com/espressif/esp-idf/issues/7631
|
||||
#CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
|
||||
|
|
After Width: | Height: | Size: 12 KiB |
110
src/main.rs
|
@ -2,14 +2,14 @@ use std::{error::Error, thread::sleep, time::Duration};
|
|||
|
||||
use embedded_graphics::{image::Image, pixelcolor::Rgb565, prelude::*};
|
||||
use esp_idf_hal::{
|
||||
gpio::{Gpio16, Gpio17, Gpio18, Gpio23, Gpio5, Output},
|
||||
gpio::{Gpio12, Gpio14, Gpio16, Gpio17, Gpio18, Gpio23, Gpio5, Input, Output},
|
||||
prelude::{Hertz, Peripherals},
|
||||
spi::{self, Master, Pins, SPI3},
|
||||
};
|
||||
// If using the `binstart` feature of `esp-idf-sys`, always keep this module imported
|
||||
use esp_idf_sys as _;
|
||||
use rand::Rng;
|
||||
// If using the `binstart` feature of `esp-idf-sys`, always keep this module imported
|
||||
use ssd1331::{DisplayRotation::Rotate0, Ssd1331};
|
||||
use ssd1331::Ssd1331;
|
||||
use tinybmp::Bmp;
|
||||
|
||||
fn secondary() -> Result<(), Box<dyn Error>> {
|
||||
|
@ -28,7 +28,9 @@ fn secondary() -> Result<(), Box<dyn Error>> {
|
|||
let sclk: Gpio18<Output> = pins.gpio18.into_output()?;
|
||||
let reset: Gpio5<Output> = pins.gpio5.into_output()?;
|
||||
|
||||
// // Set up SPI interface and digital pin. These are stub implementations used in examples.
|
||||
let read: Gpio12<Input> = pins.gpio12.into_input()?;
|
||||
let write: Gpio14<Output> = pins.gpio14.into_output()?;
|
||||
|
||||
let spiman =
|
||||
spi::Master::<SPI3, Gpio18<Output>, Gpio23<Output>, Gpio5<Output>, Gpio17<Output>>::new(
|
||||
spi3,
|
||||
|
@ -45,7 +47,7 @@ fn secondary() -> Result<(), Box<dyn Error>> {
|
|||
dma: spi::Dma::Disabled,
|
||||
},
|
||||
)?;
|
||||
let mut display = Ssd1331::new(spiman, dc, Rotate0);
|
||||
let mut display = Ssd1331::new(spiman, dc, ssd1331::DisplayRotation::Rotate180);
|
||||
display.init().unwrap();
|
||||
display.flush().unwrap();
|
||||
|
||||
|
@ -56,11 +58,16 @@ fn secondary() -> Result<(), Box<dyn Error>> {
|
|||
let eye = Bmp::from_slice(include_bytes!("./eye.bmp")).expect("Failed to load BMP image");
|
||||
let eye_closed =
|
||||
Bmp::from_slice(include_bytes!("./eye_closed.bmp")).expect("Failed to load BMP image");
|
||||
let emilis = Bmp::from_slice(include_bytes!("./emilis.bmp")).expect("Failed to load BMP image");
|
||||
print_image(emilis, &mut display, h as u32, w as u32);
|
||||
sleep(Duration::from_secs(3));
|
||||
display.clear();
|
||||
puff_idle(&mut display, h as u32, w as u32);
|
||||
loop {
|
||||
print_image(eye, &mut display, h as u32, w as u32);
|
||||
sleep(Duration::from_secs(rng.gen_range(1..10)));
|
||||
sleep(Duration::from_secs(rng.gen_range(2..8)));
|
||||
print_image(eye_closed, &mut display, h as u32, w as u32);
|
||||
sleep(Duration::from_millis(400))
|
||||
sleep(Duration::from_millis(190))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -85,6 +92,95 @@ fn print_image(
|
|||
display.flush().unwrap();
|
||||
}
|
||||
|
||||
fn puff_idle(
|
||||
display: &mut Ssd1331<
|
||||
Master<SPI3, Gpio18<Output>, Gpio23<Output>, Gpio5<Output>, Gpio17<Output>>,
|
||||
Gpio16<Output>,
|
||||
>,
|
||||
h: u32,
|
||||
w: u32,
|
||||
) -> ! {
|
||||
let raw = get_puff_raw();
|
||||
let mut frames = Vec::<Bmp<Rgb565>>::new();
|
||||
for raw_image in raw {
|
||||
let frame_bmp = Bmp::from_slice(raw_image).unwrap();
|
||||
frames.push(frame_bmp);
|
||||
}
|
||||
loop {
|
||||
for frame in &frames {
|
||||
print_image(*frame, display, h, w);
|
||||
sleep(Duration::from_millis(1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Manually unrolled because im gay
|
||||
fn get_puff_raw() -> Vec<&'static [u8]> {
|
||||
let mut raw = Vec::<&[u8]>::new();
|
||||
raw.push(include_bytes!("../puff/puffidle-0.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-1.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-2.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-3.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-4.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-5.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-6.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-7.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-8.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-9.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-10.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-11.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-12.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-13.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-14.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-15.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-16.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-17.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-18.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-19.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-20.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-21.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-22.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-23.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-24.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-25.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-26.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-27.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-28.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-29.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-30.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-31.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-32.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-33.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-34.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-35.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-36.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-37.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-38.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-39.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-40.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-41.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-42.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-43.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-44.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-45.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-46.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-47.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-48.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-49.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-50.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-51.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-52.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-53.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-54.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-55.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-56.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-57.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-58.bmp"));
|
||||
raw.push(include_bytes!("../puff/puffidle-59.bmp"));
|
||||
|
||||
raw
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
sleep(Duration::from_secs(1));
|
||||
Ok(secondary().unwrap())
|
||||
|
|