Rust-for-Arduboy/Examples/ArduboyFX/fxdrawframes/src/lib.rs

70 lines
1.7 KiB
Rust
Raw Normal View History

#![no_std]
#![allow(non_upper_case_globals)]
//Include the Arduboy Library
//Initialize the arduboy object
use arduboy_rust::prelude::*;
const arduboy: Arduboy2 = Arduboy2::new();
// FX Data
const FX_DATA_PAGE: u16 = 0xfffd;
const FX_DATA_BYTES: u32 = 674;
const ArduboyLogo: u32 = 0x000000;
const ArduboyLogoWidth: u16 = 88;
const ArduboyLogoHeight: u16 = 16;
const FXLogo: u32 = 0x0000B4;
const FXLogoWidth: u16 = 28;
const FXLogoHeight: u16 = 16;
const ArduboyLogo_Frame: u32 = 0x000128;
const ArduboyLogo_LastFrame: u32 = 0x000290;
enum State {
Init,
Logo,
Wait,
Main,
}
static mut state: State = State::Init;
static mut timer: u8 = 0;
//The setup() function runs once when you turn your Arduboy on
#[no_mangle]
pub unsafe extern "C" fn setup() {
// put your setup code here, to run once:
arduboy.begin();
fx::begin_data(FX_DATA_PAGE);
arduboy.clear();
}
#[no_mangle]
#[export_name = "loop"]
pub unsafe extern "C" fn loop_() {
// put your main code here, to run repeatedly:
if !arduboy.next_frame() {
return;
}
arduboy.poll_buttons();
match state {
State::Init => {
fx::set_frame(ArduboyLogo_Frame, 0);
state = State::Logo;
}
State::Logo => {
if fx::draw_loaded_frame() == 0 {
state = State::Wait;
timer = 60;
}
}
State::Wait => {
fx::draw_frame(ArduboyLogo_LastFrame);
timer -= 1;
if timer == 0 {
state = State::Main;
}
}
State::Main => {
if arduboy.just_pressed(A | B) {
state = State::Init;
}
}
}
fx::display_clear();
}