added a new macro progmem!() at the inside you can add new progmem data.

This commit is contained in:
Zenn 2023-08-07 19:18:34 +02:00
parent d9cb232cef
commit 28cbec07f8
8 changed files with 427 additions and 337 deletions

View file

@ -9,60 +9,111 @@ use arduboy_rust::arduboy_tone_pitch::*;
use arduboy_rust::prelude::*; use arduboy_rust::prelude::*;
// Progmem data // Progmem data
#[link_section = ".progmem.data"] progmem!(
static lol1: [u8; 19] = *b"I'm a PROGMEM Text\0"; static lol1: [u8; _] = *b"I'm a PROGMEM Text\0";
#[link_section = ".progmem.data"] static player_sprite1: [u8; _] = [
static player_sprite1: [u8; 34] = [ 16, 16, 0xfe, 0x01, 0x3d, 0x25, 0x25, 0x3d, 0x01, 0x01, 0xc1, 0x01, 0x3d, 0x25, 0x25, 0x3d,
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,
0x01, 0xfe, 0x7f, 0x80, 0x9c, 0xbc, 0xb0, 0xb0, 0xb2, 0xb2, 0xb3, 0xb0, 0xb0, 0xb0, 0xbc, 0x9c, 0x9c, 0x80, 0x7f,
0x80, 0x7f, ];
]; static tones: [u16; _] = [
#[link_section = ".progmem.data"] NOTE_E4,
static tones: [u16; 43] = [ 400,
NOTE_E4, NOTE_D4,
400, 200,
NOTE_D4, NOTE_C4,
200, 400,
NOTE_C4, NOTE_REST,
400, 200,
NOTE_REST, NOTE_D4,
200, 200,
NOTE_D4, NOTE_C4,
200, 300,
NOTE_C4, NOTE_REST,
300, 100,
NOTE_REST, NOTE_C4,
100, 300,
NOTE_C4, NOTE_REST,
300, 100,
NOTE_REST, NOTE_E4,
100, 300,
NOTE_E4, NOTE_REST,
300, 100,
NOTE_REST, NOTE_G4,
100, 300,
NOTE_G4, NOTE_REST,
300, 100,
NOTE_REST, NOTE_F4,
100, 300,
NOTE_F4, NOTE_REST,
300, 100,
NOTE_REST, NOTE_A4,
100, 300,
NOTE_A4, NOTE_REST,
300, 100,
NOTE_REST, NOTE_D5H,
100, 200,
NOTE_D5H, NOTE_REST,
200, 200,
NOTE_REST, NOTE_D5H,
200, 200,
NOTE_D5H, NOTE_REST,
200, 1500,
NOTE_REST, TONES_REPEAT,
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 // dynamic ram variables
static mut playerx: c_int = 5; static mut playerx: c_int = 5;

View file

@ -6,259 +6,261 @@ use arduboy_rust::arduboy_tone_pitch::*;
#[allow(unused_imports)] #[allow(unused_imports)]
use arduboy_rust::prelude::*; use arduboy_rust::prelude::*;
#[link_section = ".progmem.data"] progmem!(
static allNotes: [u16; 241] = [ static allNotes: [u16; _] = [
NOTE_C0H, NOTE_C0H,
NDUR, NDUR,
NOTE_CS0, NOTE_CS0,
NDUR, NDUR,
NOTE_D0, NOTE_D0,
NDUR, NDUR,
NOTE_DS0, NOTE_DS0,
NDUR, NDUR,
NOTE_E0, NOTE_E0,
NDUR, NDUR,
NOTE_F0, NOTE_F0,
NDUR, NDUR,
NOTE_FS0, NOTE_FS0,
NDUR, NDUR,
NOTE_G0, NOTE_G0,
NDUR, NDUR,
NOTE_GS0, NOTE_GS0,
NDUR, NDUR,
NOTE_A0, NOTE_A0,
NDUR, NDUR,
NOTE_AS0, NOTE_AS0,
NDUR, NDUR,
NOTE_B0, NOTE_B0,
NDUR, NDUR,
NOTE_C1H, NOTE_C1H,
NDUR, NDUR,
NOTE_CS1, NOTE_CS1,
NDUR, NDUR,
NOTE_D1, NOTE_D1,
NDUR, NDUR,
NOTE_DS1, NOTE_DS1,
NDUR, NDUR,
NOTE_E1, NOTE_E1,
NDUR, NDUR,
NOTE_F1, NOTE_F1,
NDUR, NDUR,
NOTE_FS1, NOTE_FS1,
NDUR, NDUR,
NOTE_G1, NOTE_G1,
NDUR, NDUR,
NOTE_GS1, NOTE_GS1,
NDUR, NDUR,
NOTE_A1, NOTE_A1,
NDUR, NDUR,
NOTE_AS1, NOTE_AS1,
NDUR, NDUR,
NOTE_B1, NOTE_B1,
NDUR, NDUR,
NOTE_C2H, NOTE_C2H,
NDUR, NDUR,
NOTE_CS2, NOTE_CS2,
NDUR, NDUR,
NOTE_D2, NOTE_D2,
NDUR, NDUR,
NOTE_DS2, NOTE_DS2,
NDUR, NDUR,
NOTE_E2, NOTE_E2,
NDUR, NDUR,
NOTE_F2, NOTE_F2,
NDUR, NDUR,
NOTE_FS2, NOTE_FS2,
NDUR, NDUR,
NOTE_G2, NOTE_G2,
NDUR, NDUR,
NOTE_GS2, NOTE_GS2,
NDUR, NDUR,
NOTE_A2, NOTE_A2,
NDUR, NDUR,
NOTE_AS2, NOTE_AS2,
NDUR, NDUR,
NOTE_B2, NOTE_B2,
NDUR, NDUR,
NOTE_C3H, NOTE_C3H,
NDUR, NDUR,
NOTE_CS3, NOTE_CS3,
NDUR, NDUR,
NOTE_D3, NOTE_D3,
NDUR, NDUR,
NOTE_DS3, NOTE_DS3,
NDUR, NDUR,
NOTE_E3, NOTE_E3,
NDUR, NDUR,
NOTE_F3, NOTE_F3,
NDUR, NDUR,
NOTE_FS3, NOTE_FS3,
NDUR, NDUR,
NOTE_G3, NOTE_G3,
NDUR, NDUR,
NOTE_GS3, NOTE_GS3,
NDUR, NDUR,
NOTE_A3, NOTE_A3,
NDUR, NDUR,
NOTE_AS3, NOTE_AS3,
NDUR, NDUR,
NOTE_B3, NOTE_B3,
NDUR, NDUR,
NOTE_C4H, NOTE_C4H,
NDUR, NDUR,
NOTE_CS4, NOTE_CS4,
NDUR, NDUR,
NOTE_D4, NOTE_D4,
NDUR, NDUR,
NOTE_DS4, NOTE_DS4,
NDUR, NDUR,
NOTE_E4, NOTE_E4,
NDUR, NDUR,
NOTE_F4, NOTE_F4,
NDUR, NDUR,
NOTE_FS4, NOTE_FS4,
NDUR, NDUR,
NOTE_G4, NOTE_G4,
NDUR, NDUR,
NOTE_GS4, NOTE_GS4,
NDUR, NDUR,
NOTE_A4, NOTE_A4,
NDUR, NDUR,
NOTE_AS4, NOTE_AS4,
NDUR, NDUR,
NOTE_B4, NOTE_B4,
NDUR, NDUR,
NOTE_C5H, NOTE_C5H,
NDUR, NDUR,
NOTE_CS5, NOTE_CS5,
NDUR, NDUR,
NOTE_D5, NOTE_D5,
NDUR, NDUR,
NOTE_DS5, NOTE_DS5,
NDUR, NDUR,
NOTE_E5, NOTE_E5,
NDUR, NDUR,
NOTE_F5, NOTE_F5,
NDUR, NDUR,
NOTE_FS5, NOTE_FS5,
NDUR, NDUR,
NOTE_G5, NOTE_G5,
NDUR, NDUR,
NOTE_GS5, NOTE_GS5,
NDUR, NDUR,
NOTE_A5, NOTE_A5,
NDUR, NDUR,
NOTE_AS5, NOTE_AS5,
NDUR, NDUR,
NOTE_B5, NOTE_B5,
NDUR, NDUR,
NOTE_C6H, NOTE_C6H,
NDUR, NDUR,
NOTE_CS6, NOTE_CS6,
NDUR, NDUR,
NOTE_D6, NOTE_D6,
NDUR, NDUR,
NOTE_DS6, NOTE_DS6,
NDUR, NDUR,
NOTE_E6, NOTE_E6,
NDUR, NDUR,
NOTE_F6, NOTE_F6,
NDUR, NDUR,
NOTE_FS6, NOTE_FS6,
NDUR, NDUR,
NOTE_G6, NOTE_G6,
NDUR, NDUR,
NOTE_GS6, NOTE_GS6,
NDUR, NDUR,
NOTE_A6, NOTE_A6,
NDUR, NDUR,
NOTE_AS6, NOTE_AS6,
NDUR, NDUR,
NOTE_B6, NOTE_B6,
NDUR, NDUR,
NOTE_C7H, NOTE_C7H,
NDUR, NDUR,
NOTE_CS7, NOTE_CS7,
NDUR, NDUR,
NOTE_D7, NOTE_D7,
NDUR, NDUR,
NOTE_DS7, NOTE_DS7,
NDUR, NDUR,
NOTE_E7, NOTE_E7,
NDUR, NDUR,
NOTE_F7, NOTE_F7,
NDUR, NDUR,
NOTE_FS7, NOTE_FS7,
NDUR, NDUR,
NOTE_G7, NOTE_G7,
NDUR, NDUR,
NOTE_GS7, NOTE_GS7,
NDUR, NDUR,
NOTE_A7, NOTE_A7,
NDUR, NDUR,
NOTE_AS7, NOTE_AS7,
NDUR, NDUR,
NOTE_B7, NOTE_B7,
NDUR, NDUR,
NOTE_C8H, NOTE_C8H,
NDUR, NDUR,
NOTE_CS8, NOTE_CS8,
NDUR, NDUR,
NOTE_D8, NOTE_D8,
NDUR, NDUR,
NOTE_DS8, NOTE_DS8,
NDUR, NDUR,
NOTE_E8, NOTE_E8,
NDUR, NDUR,
NOTE_F8, NOTE_F8,
NDUR, NDUR,
NOTE_FS8, NOTE_FS8,
NDUR, NDUR,
NOTE_G8, NOTE_G8,
NDUR, NDUR,
NOTE_GS8, NOTE_GS8,
NDUR, NDUR,
NOTE_A8, NOTE_A8,
NDUR, NDUR,
NOTE_AS8, NOTE_AS8,
NDUR, NDUR,
NOTE_B8, NOTE_B8,
NDUR, NDUR,
NOTE_C9H, NOTE_C9H,
NDUR, NDUR,
NOTE_CS9, NOTE_CS9,
NDUR, NDUR,
NOTE_D9, NOTE_D9,
NDUR, NDUR,
NOTE_DS9, NOTE_DS9,
NDUR, NDUR,
NOTE_E9, NOTE_E9,
NDUR, NDUR,
NOTE_F9, NOTE_F9,
NDUR, NDUR,
NOTE_FS9, NOTE_FS9,
NDUR, NDUR,
NOTE_G9, NOTE_G9,
NDUR, NDUR,
NOTE_GS9, NOTE_GS9,
NDUR, NDUR,
NOTE_A9, NOTE_A9,
NDUR, NDUR,
NOTE_AS9, NOTE_AS9,
NDUR, NDUR,
NOTE_B9, NOTE_B9,
NDUR, NDUR,
TONES_REPEAT, TONES_REPEAT,
]; ];
#[link_section = ".progmem.data"]
static sound1: [u16; 73] = [ static sound1: [u16; _] = [
NOTE_C1, 500, NOTE_C1H, 500, NOTE_G1, 500, NOTE_G1H, 500, NOTE_C2, 500, NOTE_C2H, 500, NOTE_G2, NOTE_C1, 500, NOTE_C1H, 500, NOTE_G1, 500, NOTE_G1H, 500, NOTE_C2, 500, NOTE_C2H, 500,
500, NOTE_G2H, 500, NOTE_C3, 500, NOTE_C3H, 500, NOTE_G3, 500, NOTE_G3H, 500, NOTE_C4, 500, NOTE_G2, 500, NOTE_G2H, 500, NOTE_C3, 500, NOTE_C3H, 500, NOTE_G3, 500, NOTE_G3H, 500,
NOTE_C4H, 500, NOTE_G4, 500, NOTE_G4H, 500, NOTE_C5, 500, NOTE_C5H, 500, NOTE_G5, 500, NOTE_C4, 500, NOTE_C4H, 500, NOTE_G4, 500, NOTE_G4H, 500, NOTE_C5, 500, NOTE_C5H, 500,
NOTE_G5H, 500, NOTE_C6, 500, NOTE_C6H, 500, NOTE_G6, 500, NOTE_G6H, 500, NOTE_C7, 500, NOTE_G5, 500, NOTE_G5H, 500, NOTE_C6, 500, NOTE_C6H, 500, NOTE_G6, 500, NOTE_G6H, 500,
NOTE_C7H, 500, NOTE_G7, 500, NOTE_G7H, 500, NOTE_C8, 500, NOTE_C8H, 500, NOTE_G8, 500, NOTE_C7, 500, NOTE_C7H, 500, NOTE_G7, 500, NOTE_G7H, 500, NOTE_C8, 500, NOTE_C8H, 500,
NOTE_G8H, 500, NOTE_C9, 500, NOTE_C9H, 500, NOTE_G9, 500, NOTE_G9H, 500, TONES_END, 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; static mut circle_pos: i16 = 7;
const BUTTON_DELAY: u32 = 200; const BUTTON_DELAY: u32 = 200;

View file

@ -1,14 +1,5 @@
//pub use crate::library::arduboy_tone_pitch::*; //pub use crate::library::arduboy_tone_pitch::*;
use core::ffi::{c_uchar, c_uint, c_ulong}; 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" { extern "C" {
#[link_name = "sound_tone"] #[link_name = "sound_tone"]

View file

@ -4,4 +4,5 @@ pub mod arduboy_tone_pitch;
pub mod arduino; pub mod arduino;
pub mod c; pub mod c;
pub mod eeprom; pub mod eeprom;
pub mod progmem;
pub mod sprites; pub mod sprites;

View file

@ -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;

View file

@ -1,14 +1,5 @@
//!This is the module to interact in a save way with the Sprites C++ library. //!This is the module to interact in a save way with the Sprites C++ library.
use core::ffi::{c_int, c_uchar}; 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" { extern "C" {
#[link_name = "arduino_draw_override"] #[link_name = "arduino_draw_override"]

View file

@ -19,7 +19,7 @@ pub use crate::library::c::*;
pub use crate::library::eeprom::EEPROM; pub use crate::library::eeprom::EEPROM;
pub use crate::library::sprites; pub use crate::library::sprites;
pub use crate::print::*; 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; use core::cmp;
pub fn constrain<T: Ord>(x: T, a: T, b: T) -> T { pub fn constrain<T: Ord>(x: T, a: T, b: T) -> T {

View file

@ -1,16 +1,5 @@
use crate::prelude::Pstring; use crate::prelude::Pstring;
use core::ffi::c_int; 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)] #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub enum Base { pub enum Base {