diff --git a/Examples/Arduboy-Tutorials/progmem/src/lib.rs b/Examples/Arduboy-Tutorials/progmem/src/lib.rs index 4050bd3..3c32f5e 100644 --- a/Examples/Arduboy-Tutorials/progmem/src/lib.rs +++ b/Examples/Arduboy-Tutorials/progmem/src/lib.rs @@ -9,60 +9,111 @@ use arduboy_rust::arduboy_tone_pitch::*; use arduboy_rust::prelude::*; // Progmem data -#[link_section = ".progmem.data"] -static lol1: [u8; 19] = *b"I'm a PROGMEM Text\0"; -#[link_section = ".progmem.data"] -static player_sprite1: [u8; 34] = [ - 16, 16, 0xfe, 0x01, 0x3d, 0x25, 0x25, 0x3d, 0x01, 0x01, 0xc1, 0x01, 0x3d, 0x25, 0x25, 0x3d, - 0x01, 0xfe, 0x7f, 0x80, 0x9c, 0xbc, 0xb0, 0xb0, 0xb2, 0xb2, 0xb3, 0xb0, 0xb0, 0xb0, 0xbc, 0x9c, - 0x80, 0x7f, -]; -#[link_section = ".progmem.data"] -static tones: [u16; 43] = [ - NOTE_E4, - 400, - NOTE_D4, - 200, - NOTE_C4, - 400, - NOTE_REST, - 200, - NOTE_D4, - 200, - NOTE_C4, - 300, - NOTE_REST, - 100, - NOTE_C4, - 300, - NOTE_REST, - 100, - NOTE_E4, - 300, - NOTE_REST, - 100, - NOTE_G4, - 300, - NOTE_REST, - 100, - NOTE_F4, - 300, - NOTE_REST, - 100, - NOTE_A4, - 300, - NOTE_REST, - 100, - NOTE_D5H, - 200, - NOTE_REST, - 200, - NOTE_D5H, - 200, - NOTE_REST, - 1500, - TONES_REPEAT, -]; +progmem!( + static lol1: [u8; _] = *b"I'm a PROGMEM Text\0"; + static player_sprite1: [u8; _] = [ + 16, 16, 0xfe, 0x01, 0x3d, 0x25, 0x25, 0x3d, 0x01, 0x01, 0xc1, 0x01, 0x3d, 0x25, 0x25, 0x3d, + 0x01, 0xfe, 0x7f, 0x80, 0x9c, 0xbc, 0xb0, 0xb0, 0xb2, 0xb2, 0xb3, 0xb0, 0xb0, 0xb0, 0xbc, + 0x9c, 0x80, 0x7f, + ]; + static tones: [u16; _] = [ + NOTE_E4, + 400, + NOTE_D4, + 200, + NOTE_C4, + 400, + NOTE_REST, + 200, + NOTE_D4, + 200, + NOTE_C4, + 300, + NOTE_REST, + 100, + NOTE_C4, + 300, + NOTE_REST, + 100, + NOTE_E4, + 300, + NOTE_REST, + 100, + NOTE_G4, + 300, + NOTE_REST, + 100, + NOTE_F4, + 300, + NOTE_REST, + 100, + NOTE_A4, + 300, + NOTE_REST, + 100, + NOTE_D5H, + 200, + NOTE_REST, + 200, + NOTE_D5H, + 200, + NOTE_REST, + 1500, + TONES_REPEAT, + ]; +); +//#[link_section = ".progmem.data"] +//static player_sprite1: [u8; 34] = [ +// 16, 16, 0xfe, 0x01, 0x3d, 0x25, 0x25, 0x3d, 0x01, 0x01, 0xc1, 0x01, 0x3d, 0x25, 0x25, 0x3d, +// 0x01, 0xfe, 0x7f, 0x80, 0x9c, 0xbc, 0xb0, 0xb0, 0xb2, 0xb2, 0xb3, 0xb0, 0xb0, 0xb0, 0xbc, 0x9c, +// 0x80, 0x7f, +//]; +// #[link_section = ".progmem.data"] +// static tones: [u16; 43] = [ +// NOTE_E4, +// 400, +// NOTE_D4, +// 200, +// NOTE_C4, +// 400, +// NOTE_REST, +// 200, +// NOTE_D4, +// 200, +// NOTE_C4, +// 300, +// NOTE_REST, +// 100, +// NOTE_C4, +// 300, +// NOTE_REST, +// 100, +// NOTE_E4, +// 300, +// NOTE_REST, +// 100, +// NOTE_G4, +// 300, +// NOTE_REST, +// 100, +// NOTE_F4, +// 300, +// NOTE_REST, +// 100, +// NOTE_A4, +// 300, +// NOTE_REST, +// 100, +// NOTE_D5H, +// 200, +// NOTE_REST, +// 200, +// NOTE_D5H, +// 200, +// NOTE_REST, +// 1500, +// TONES_REPEAT, +// ]; // dynamic ram variables static mut playerx: c_int = 5; diff --git a/Examples/Arduboy-Tutorials/tone/src/lib.rs b/Examples/Arduboy-Tutorials/tone/src/lib.rs index ab7eb78..c220b9b 100644 --- a/Examples/Arduboy-Tutorials/tone/src/lib.rs +++ b/Examples/Arduboy-Tutorials/tone/src/lib.rs @@ -6,259 +6,261 @@ use arduboy_rust::arduboy_tone_pitch::*; #[allow(unused_imports)] use arduboy_rust::prelude::*; -#[link_section = ".progmem.data"] -static allNotes: [u16; 241] = [ - NOTE_C0H, - NDUR, - NOTE_CS0, - NDUR, - NOTE_D0, - NDUR, - NOTE_DS0, - NDUR, - NOTE_E0, - NDUR, - NOTE_F0, - NDUR, - NOTE_FS0, - NDUR, - NOTE_G0, - NDUR, - NOTE_GS0, - NDUR, - NOTE_A0, - NDUR, - NOTE_AS0, - NDUR, - NOTE_B0, - NDUR, - NOTE_C1H, - NDUR, - NOTE_CS1, - NDUR, - NOTE_D1, - NDUR, - NOTE_DS1, - NDUR, - NOTE_E1, - NDUR, - NOTE_F1, - NDUR, - NOTE_FS1, - NDUR, - NOTE_G1, - NDUR, - NOTE_GS1, - NDUR, - NOTE_A1, - NDUR, - NOTE_AS1, - NDUR, - NOTE_B1, - NDUR, - NOTE_C2H, - NDUR, - NOTE_CS2, - NDUR, - NOTE_D2, - NDUR, - NOTE_DS2, - NDUR, - NOTE_E2, - NDUR, - NOTE_F2, - NDUR, - NOTE_FS2, - NDUR, - NOTE_G2, - NDUR, - NOTE_GS2, - NDUR, - NOTE_A2, - NDUR, - NOTE_AS2, - NDUR, - NOTE_B2, - NDUR, - NOTE_C3H, - NDUR, - NOTE_CS3, - NDUR, - NOTE_D3, - NDUR, - NOTE_DS3, - NDUR, - NOTE_E3, - NDUR, - NOTE_F3, - NDUR, - NOTE_FS3, - NDUR, - NOTE_G3, - NDUR, - NOTE_GS3, - NDUR, - NOTE_A3, - NDUR, - NOTE_AS3, - NDUR, - NOTE_B3, - NDUR, - NOTE_C4H, - NDUR, - NOTE_CS4, - NDUR, - NOTE_D4, - NDUR, - NOTE_DS4, - NDUR, - NOTE_E4, - NDUR, - NOTE_F4, - NDUR, - NOTE_FS4, - NDUR, - NOTE_G4, - NDUR, - NOTE_GS4, - NDUR, - NOTE_A4, - NDUR, - NOTE_AS4, - NDUR, - NOTE_B4, - NDUR, - NOTE_C5H, - NDUR, - NOTE_CS5, - NDUR, - NOTE_D5, - NDUR, - NOTE_DS5, - NDUR, - NOTE_E5, - NDUR, - NOTE_F5, - NDUR, - NOTE_FS5, - NDUR, - NOTE_G5, - NDUR, - NOTE_GS5, - NDUR, - NOTE_A5, - NDUR, - NOTE_AS5, - NDUR, - NOTE_B5, - NDUR, - NOTE_C6H, - NDUR, - NOTE_CS6, - NDUR, - NOTE_D6, - NDUR, - NOTE_DS6, - NDUR, - NOTE_E6, - NDUR, - NOTE_F6, - NDUR, - NOTE_FS6, - NDUR, - NOTE_G6, - NDUR, - NOTE_GS6, - NDUR, - NOTE_A6, - NDUR, - NOTE_AS6, - NDUR, - NOTE_B6, - NDUR, - NOTE_C7H, - NDUR, - NOTE_CS7, - NDUR, - NOTE_D7, - NDUR, - NOTE_DS7, - NDUR, - NOTE_E7, - NDUR, - NOTE_F7, - NDUR, - NOTE_FS7, - NDUR, - NOTE_G7, - NDUR, - NOTE_GS7, - NDUR, - NOTE_A7, - NDUR, - NOTE_AS7, - NDUR, - NOTE_B7, - NDUR, - NOTE_C8H, - NDUR, - NOTE_CS8, - NDUR, - NOTE_D8, - NDUR, - NOTE_DS8, - NDUR, - NOTE_E8, - NDUR, - NOTE_F8, - NDUR, - NOTE_FS8, - NDUR, - NOTE_G8, - NDUR, - NOTE_GS8, - NDUR, - NOTE_A8, - NDUR, - NOTE_AS8, - NDUR, - NOTE_B8, - NDUR, - NOTE_C9H, - NDUR, - NOTE_CS9, - NDUR, - NOTE_D9, - NDUR, - NOTE_DS9, - NDUR, - NOTE_E9, - NDUR, - NOTE_F9, - NDUR, - NOTE_FS9, - NDUR, - NOTE_G9, - NDUR, - NOTE_GS9, - NDUR, - NOTE_A9, - NDUR, - NOTE_AS9, - NDUR, - NOTE_B9, - NDUR, - TONES_REPEAT, -]; -#[link_section = ".progmem.data"] -static sound1: [u16; 73] = [ - NOTE_C1, 500, NOTE_C1H, 500, NOTE_G1, 500, NOTE_G1H, 500, NOTE_C2, 500, NOTE_C2H, 500, NOTE_G2, - 500, NOTE_G2H, 500, NOTE_C3, 500, NOTE_C3H, 500, NOTE_G3, 500, NOTE_G3H, 500, NOTE_C4, 500, - NOTE_C4H, 500, NOTE_G4, 500, NOTE_G4H, 500, NOTE_C5, 500, NOTE_C5H, 500, NOTE_G5, 500, - NOTE_G5H, 500, NOTE_C6, 500, NOTE_C6H, 500, NOTE_G6, 500, NOTE_G6H, 500, NOTE_C7, 500, - NOTE_C7H, 500, NOTE_G7, 500, NOTE_G7H, 500, NOTE_C8, 500, NOTE_C8H, 500, NOTE_G8, 500, - NOTE_G8H, 500, NOTE_C9, 500, NOTE_C9H, 500, NOTE_G9, 500, NOTE_G9H, 500, TONES_END, -]; +progmem!( + static allNotes: [u16; _] = [ + NOTE_C0H, + NDUR, + NOTE_CS0, + NDUR, + NOTE_D0, + NDUR, + NOTE_DS0, + NDUR, + NOTE_E0, + NDUR, + NOTE_F0, + NDUR, + NOTE_FS0, + NDUR, + NOTE_G0, + NDUR, + NOTE_GS0, + NDUR, + NOTE_A0, + NDUR, + NOTE_AS0, + NDUR, + NOTE_B0, + NDUR, + NOTE_C1H, + NDUR, + NOTE_CS1, + NDUR, + NOTE_D1, + NDUR, + NOTE_DS1, + NDUR, + NOTE_E1, + NDUR, + NOTE_F1, + NDUR, + NOTE_FS1, + NDUR, + NOTE_G1, + NDUR, + NOTE_GS1, + NDUR, + NOTE_A1, + NDUR, + NOTE_AS1, + NDUR, + NOTE_B1, + NDUR, + NOTE_C2H, + NDUR, + NOTE_CS2, + NDUR, + NOTE_D2, + NDUR, + NOTE_DS2, + NDUR, + NOTE_E2, + NDUR, + NOTE_F2, + NDUR, + NOTE_FS2, + NDUR, + NOTE_G2, + NDUR, + NOTE_GS2, + NDUR, + NOTE_A2, + NDUR, + NOTE_AS2, + NDUR, + NOTE_B2, + NDUR, + NOTE_C3H, + NDUR, + NOTE_CS3, + NDUR, + NOTE_D3, + NDUR, + NOTE_DS3, + NDUR, + NOTE_E3, + NDUR, + NOTE_F3, + NDUR, + NOTE_FS3, + NDUR, + NOTE_G3, + NDUR, + NOTE_GS3, + NDUR, + NOTE_A3, + NDUR, + NOTE_AS3, + NDUR, + NOTE_B3, + NDUR, + NOTE_C4H, + NDUR, + NOTE_CS4, + NDUR, + NOTE_D4, + NDUR, + NOTE_DS4, + NDUR, + NOTE_E4, + NDUR, + NOTE_F4, + NDUR, + NOTE_FS4, + NDUR, + NOTE_G4, + NDUR, + NOTE_GS4, + NDUR, + NOTE_A4, + NDUR, + NOTE_AS4, + NDUR, + NOTE_B4, + NDUR, + NOTE_C5H, + NDUR, + NOTE_CS5, + NDUR, + NOTE_D5, + NDUR, + NOTE_DS5, + NDUR, + NOTE_E5, + NDUR, + NOTE_F5, + NDUR, + NOTE_FS5, + NDUR, + NOTE_G5, + NDUR, + NOTE_GS5, + NDUR, + NOTE_A5, + NDUR, + NOTE_AS5, + NDUR, + NOTE_B5, + NDUR, + NOTE_C6H, + NDUR, + NOTE_CS6, + NDUR, + NOTE_D6, + NDUR, + NOTE_DS6, + NDUR, + NOTE_E6, + NDUR, + NOTE_F6, + NDUR, + NOTE_FS6, + NDUR, + NOTE_G6, + NDUR, + NOTE_GS6, + NDUR, + NOTE_A6, + NDUR, + NOTE_AS6, + NDUR, + NOTE_B6, + NDUR, + NOTE_C7H, + NDUR, + NOTE_CS7, + NDUR, + NOTE_D7, + NDUR, + NOTE_DS7, + NDUR, + NOTE_E7, + NDUR, + NOTE_F7, + NDUR, + NOTE_FS7, + NDUR, + NOTE_G7, + NDUR, + NOTE_GS7, + NDUR, + NOTE_A7, + NDUR, + NOTE_AS7, + NDUR, + NOTE_B7, + NDUR, + NOTE_C8H, + NDUR, + NOTE_CS8, + NDUR, + NOTE_D8, + NDUR, + NOTE_DS8, + NDUR, + NOTE_E8, + NDUR, + NOTE_F8, + NDUR, + NOTE_FS8, + NDUR, + NOTE_G8, + NDUR, + NOTE_GS8, + NDUR, + NOTE_A8, + NDUR, + NOTE_AS8, + NDUR, + NOTE_B8, + NDUR, + NOTE_C9H, + NDUR, + NOTE_CS9, + NDUR, + NOTE_D9, + NDUR, + NOTE_DS9, + NDUR, + NOTE_E9, + NDUR, + NOTE_F9, + NDUR, + NOTE_FS9, + NDUR, + NOTE_G9, + NDUR, + NOTE_GS9, + NDUR, + NOTE_A9, + NDUR, + NOTE_AS9, + NDUR, + NOTE_B9, + NDUR, + TONES_REPEAT, + ]; + + static sound1: [u16; _] = [ + NOTE_C1, 500, NOTE_C1H, 500, NOTE_G1, 500, NOTE_G1H, 500, NOTE_C2, 500, NOTE_C2H, 500, + NOTE_G2, 500, NOTE_G2H, 500, NOTE_C3, 500, NOTE_C3H, 500, NOTE_G3, 500, NOTE_G3H, 500, + NOTE_C4, 500, NOTE_C4H, 500, NOTE_G4, 500, NOTE_G4H, 500, NOTE_C5, 500, NOTE_C5H, 500, + NOTE_G5, 500, NOTE_G5H, 500, NOTE_C6, 500, NOTE_C6H, 500, NOTE_G6, 500, NOTE_G6H, 500, + NOTE_C7, 500, NOTE_C7H, 500, NOTE_G7, 500, NOTE_G7H, 500, NOTE_C8, 500, NOTE_C8H, 500, + NOTE_G8, 500, NOTE_G8H, 500, NOTE_C9, 500, NOTE_C9H, 500, NOTE_G9, 500, NOTE_G9H, 500, + TONES_END, + ]; +); static mut circle_pos: i16 = 7; const BUTTON_DELAY: u32 = 200; diff --git a/arduboy-rust/src/library/arduboy_tone.rs b/arduboy-rust/src/library/arduboy_tone.rs index a07ac8b..90d093f 100644 --- a/arduboy-rust/src/library/arduboy_tone.rs +++ b/arduboy-rust/src/library/arduboy_tone.rs @@ -1,14 +1,5 @@ //pub use crate::library::arduboy_tone_pitch::*; use core::ffi::{c_uchar, c_uint, c_ulong}; -///Create a `const` raw pointer to a sprite as u16, without creating an intermediate reference. -#[macro_export] -macro_rules! get_tones_addr { - ( $s:expr ) => { - addr_of!($s) as *const u16 - }; -} -#[allow(unused_imports)] -pub(super) use get_tones_addr; extern "C" { #[link_name = "sound_tone"] diff --git a/arduboy-rust/src/library/mod.rs b/arduboy-rust/src/library/mod.rs index ac52f6e..51c80b6 100644 --- a/arduboy-rust/src/library/mod.rs +++ b/arduboy-rust/src/library/mod.rs @@ -4,4 +4,5 @@ pub mod arduboy_tone_pitch; pub mod arduino; pub mod c; pub mod eeprom; +pub mod progmem; pub mod sprites; diff --git a/arduboy-rust/src/library/progmem.rs b/arduboy-rust/src/library/progmem.rs new file mode 100644 index 0000000..148fa33 --- /dev/null +++ b/arduboy-rust/src/library/progmem.rs @@ -0,0 +1,65 @@ +#![allow(unused_imports)] +/// Create a space for Progrem variable +/// ## Example +/// ``` +/// //for text +/// progmem!( +/// static text: [u8; _] = *b"I'm a PROGMEM Text\0"; +/// ); +/// //for tone sequence +/// progmem!( +/// static tone: [u16; 43] = [ +/// NOTE_E4, 400, NOTE_D4, 200, NOTE_C4, 400, NOTE_D4, 200, NOTE_C4, 300, NOTE_REST, +/// ]; +/// ); +/// //for for bitmap +/// progmem!( +/// static image: [u8; _] = [8, 8, 0x81, 0x00, 0x12, 0x40, 0x04, 0x11, 0x00, 0x04]; +/// ); +/// ``` +#[macro_export] +macro_rules! progmem { + ( + $( #[$attr:meta] )* + $v:vis $id:ident $name:ident: [$ty:ty; _] = $value:expr; + $($rest:tt)* + ) => { + $( #[$attr] )* + #[link_section = ".progmem.data"] + $v $id $name: [$ty; $value.len()] = $value; + $crate::progmem!{ + $($rest)* + } + }; + () => () +} + +pub(super) use progmem; +///Create a `const` raw pointer to a sprite as u8, without creating an intermediate reference. +#[macro_export] +macro_rules! get_sprite_addr { + ( $s:expr ) => { + addr_of!($s) as *const u8 + }; +} +pub(super) use get_sprite_addr; + +///Create a `const` raw pointer to a sprite as u16, without creating an intermediate reference. +#[macro_export] +macro_rules! get_tones_addr { + ( $s:expr ) => { + addr_of!($s) as *const u16 + }; +} +pub(super) use get_tones_addr; + +///Create a `const` raw pointer to a \[u8;_] that saves text, without creating an intermediate reference. +#[macro_export] +macro_rules! get_string_addr { + ( $s:expr ) => { + Pstring { + pointer: addr_of!($s) as *const i8, + } + }; +} +pub(super) use get_string_addr; diff --git a/arduboy-rust/src/library/sprites.rs b/arduboy-rust/src/library/sprites.rs index 0839eda..bf43923 100644 --- a/arduboy-rust/src/library/sprites.rs +++ b/arduboy-rust/src/library/sprites.rs @@ -1,14 +1,5 @@ //!This is the module to interact in a save way with the Sprites C++ library. use core::ffi::{c_int, c_uchar}; -///Create a `const` raw pointer to a sprite as u8, without creating an intermediate reference. -#[macro_export] -macro_rules! get_sprite_addr { - ( $s:expr ) => { - addr_of!($s) as *const u8 - }; -} -#[allow(unused_imports)] -pub(super) use get_sprite_addr; extern "C" { #[link_name = "arduino_draw_override"] diff --git a/arduboy-rust/src/prelude.rs b/arduboy-rust/src/prelude.rs index 37136f6..a225165 100644 --- a/arduboy-rust/src/prelude.rs +++ b/arduboy-rust/src/prelude.rs @@ -19,7 +19,7 @@ pub use crate::library::c::*; pub use crate::library::eeprom::EEPROM; pub use crate::library::sprites; pub use crate::print::*; -pub use crate::{get_sprite_addr, get_string_addr, get_tones_addr}; +pub use crate::{get_sprite_addr, get_string_addr, get_tones_addr, progmem}; use core::cmp; pub fn constrain(x: T, a: T, b: T) -> T { diff --git a/arduboy-rust/src/print.rs b/arduboy-rust/src/print.rs index 0b99b40..7ce7946 100644 --- a/arduboy-rust/src/print.rs +++ b/arduboy-rust/src/print.rs @@ -1,16 +1,5 @@ use crate::prelude::Pstring; use core::ffi::c_int; -///Create a `const` raw pointer to a \[u8;_] that saves text, without creating an intermediate reference. -#[macro_export] -macro_rules! get_string_addr { - ( $s:expr ) => { - Pstring { - pointer: addr_of!($s) as *const i8, - } - }; -} -#[allow(unused_imports)] -pub(super) use get_string_addr; #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] pub enum Base {