added support for printing out of progmem
This commit is contained in:
parent
25e7d3272c
commit
5fdfcf88c4
10 changed files with 157 additions and 4 deletions
100
Cargo.lock
generated
100
Cargo.lock
generated
|
@ -6,9 +6,27 @@ version = 3
|
||||||
name = "arduboy-rust"
|
name = "arduboy-rust"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"avr-progmem",
|
||||||
"panic-halt",
|
"panic-halt",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "avr-progmem"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4026b5cfd2368953bed46ffaa1acc7e4ea398bb7a610743d11895a5187498076"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"derivative",
|
||||||
|
"ufmt",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "demo2"
|
name = "demo2"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -44,6 +62,17 @@ dependencies = [
|
||||||
"arduboy-rust",
|
"arduboy-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "derivative"
|
||||||
|
version = "2.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "eeprom-demo"
|
name = "eeprom-demo"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -56,6 +85,7 @@ name = "game"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arduboy-rust",
|
"arduboy-rust",
|
||||||
|
"avr-progmem",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -71,6 +101,30 @@ dependencies = [
|
||||||
"arduboy-rust",
|
"arduboy-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-hack"
|
||||||
|
version = "0.5.20+deprecated"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.66"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.32"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustacean"
|
name = "rustacean"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -85,9 +139,55 @@ dependencies = [
|
||||||
"arduboy-rust",
|
"arduboy-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.109"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tone"
|
name = "tone"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arduboy-rust",
|
"arduboy-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ufmt"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "31d3c0c63312dfc9d8e5c71114d617018a19f6058674003c0da29ee8d8036cdd"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro-hack",
|
||||||
|
"ufmt-macros",
|
||||||
|
"ufmt-write",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ufmt-macros"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e4ab6c92f30c996394a8bd525aef9f03ce01d0d7ac82d81902968057e37dd7d9"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro-hack",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ufmt-write"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
|
||||||
|
|
|
@ -7,4 +7,5 @@ edition = "2021"
|
||||||
crate-type = ["staticlib"]
|
crate-type = ["staticlib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
avr-progmem = "0.3.3"
|
||||||
arduboy-rust = { path = "../../arduboy-rust" }
|
arduboy-rust = { path = "../../arduboy-rust" }
|
||||||
|
|
|
@ -1,16 +1,29 @@
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![allow(non_upper_case_globals)]
|
#![allow(non_upper_case_globals)]
|
||||||
|
#![feature(const_trait_impl)]
|
||||||
|
use core::cell::LazyCell;
|
||||||
|
|
||||||
//Include the Arduboy Library
|
//Include the Arduboy Library
|
||||||
//Initialize the arduboy object
|
//Initialize the arduboy object
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use arduboy_rust::prelude::*;
|
use arduboy_rust::prelude::*;
|
||||||
|
|
||||||
//#[link_section = ".progmem.data"]
|
#[link_section = ".progmem.data"]
|
||||||
|
static lol2: [u8; 29] = [
|
||||||
|
0x54, 0x68, 0x61, 0x6E, 0x6B, 0x73, 0x20, 0x61, 0x20, 0x6C, 0x6F, 0x74, 0x0A, 0x79, 0x6F, 0x75,
|
||||||
|
0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x20, 0x0A, 0x48, 0x65, 0x72, 0x6F, 0x00,
|
||||||
|
];
|
||||||
|
#[link_section = ".progmem.data"]
|
||||||
|
static lol1: [u8; 10] = LazyCell::new(|| "hallowelt\0".as_bytes().try_into().unwrap());
|
||||||
|
|
||||||
// The setup() function runs once when you turn your Arduboy on
|
// The setup() function runs once when you turn your Arduboy on
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn setup() {
|
pub unsafe extern "C" fn setup() {
|
||||||
// put your setup code here, to run once:
|
// put your setup code here, to run once:
|
||||||
|
arduboy.begin();
|
||||||
|
arduboy.clear();
|
||||||
|
arduboy.print(get_string_addr!(lol1));
|
||||||
|
arduboy.display();
|
||||||
}
|
}
|
||||||
// The loop() function repeats forever after setup() is done
|
// The loop() function repeats forever after setup() is done
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
|
|
@ -81,6 +81,10 @@ void arduboy_print_chars(const char *cstr)
|
||||||
{
|
{
|
||||||
arduboy.print(cstr);
|
arduboy.print(cstr);
|
||||||
}
|
}
|
||||||
|
size_t arduboy_print_chars_progmem(const char *cstr)
|
||||||
|
{
|
||||||
|
return arduboy.print(reinterpret_cast<const __FlashStringHelper *>(cstr));
|
||||||
|
}
|
||||||
size_t arduboy_print_char(char c)
|
size_t arduboy_print_char(char c)
|
||||||
{
|
{
|
||||||
return arduboy.print(c);
|
return arduboy.print(c);
|
||||||
|
|
|
@ -24,6 +24,7 @@ extern "C"
|
||||||
bool arduboy_pressed(uint8_t buttons);
|
bool arduboy_pressed(uint8_t buttons);
|
||||||
void arduboy_print_chars(const char *cstr);
|
void arduboy_print_chars(const char *cstr);
|
||||||
size_t arduboy_print_char(char c);
|
size_t arduboy_print_char(char c);
|
||||||
|
size_t arduboy_print_chars_progmem(const char *);
|
||||||
size_t arduboy_print_int(int n, int base);
|
size_t arduboy_print_int(int n, int base);
|
||||||
size_t arduboy_print_long(long n, int base);
|
size_t arduboy_print_long(long n, int base);
|
||||||
size_t arduboy_print_unsigned_char(unsigned char n, int base);
|
size_t arduboy_print_unsigned_char(unsigned char n, int base);
|
||||||
|
|
|
@ -13,4 +13,5 @@ categories = ["game-engines", "games", "api-bindings"]
|
||||||
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
avr-progmem = "0.3.3"
|
||||||
panic-halt = "0.2.0"
|
panic-halt = "0.2.0"
|
||||||
|
|
|
@ -6,7 +6,7 @@ mod hardware;
|
||||||
mod library;
|
mod library;
|
||||||
pub mod prelude;
|
pub mod prelude;
|
||||||
mod print;
|
mod print;
|
||||||
pub use crate::library::arduboy::{Arduboy, Color, FONT_SIZE, HEIGHT, WIDTH};
|
pub use crate::library::arduboy::{Arduboy, Color, Pstring, FONT_SIZE, HEIGHT, WIDTH};
|
||||||
pub use crate::library::arduboy_tone::Sound;
|
pub use crate::library::arduboy_tone::Sound;
|
||||||
pub use crate::library::eeprom::EEPROM;
|
pub use crate::library::eeprom::EEPROM;
|
||||||
pub use crate::library::{arduboy_tone_pitch, c, sprites};
|
pub use crate::library::{arduboy_tone_pitch, c, sprites};
|
||||||
|
|
|
@ -20,6 +20,11 @@ pub const WIDTH: u8 = 128;
|
||||||
///
|
///
|
||||||
/// this is to calculate with it.
|
/// this is to calculate with it.
|
||||||
pub const HEIGHT: u8 = 64;
|
pub const HEIGHT: u8 = 64;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct Pstring {
|
||||||
|
pub pointer: *const i8,
|
||||||
|
}
|
||||||
/// This item is to chose between Black or White
|
/// This item is to chose between Black or White
|
||||||
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
|
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
|
@ -411,6 +416,9 @@ extern "C" {
|
||||||
#[link_name = "arduboy_print_chars"]
|
#[link_name = "arduboy_print_chars"]
|
||||||
pub fn print_chars(cstr: *const c_char);
|
pub fn print_chars(cstr: *const c_char);
|
||||||
|
|
||||||
|
#[link_name = "arduboy_print_chars_progmem"]
|
||||||
|
pub fn print_chars_progmem(pstring: *const c_char);
|
||||||
|
|
||||||
// #[link_name = "arduboy_print_char"]
|
// #[link_name = "arduboy_print_char"]
|
||||||
// fn print_char(c: c_char) -> c_size_t;
|
// fn print_char(c: c_char) -> c_size_t;
|
||||||
|
|
||||||
|
|
|
@ -12,14 +12,14 @@ pub const arduboy: Arduboy = Arduboy {};
|
||||||
#[allow(non_upper_case_globals)]
|
#[allow(non_upper_case_globals)]
|
||||||
pub const sound: Sound = Sound {};
|
pub const sound: Sound = Sound {};
|
||||||
pub use crate::hardware::buttons::*;
|
pub use crate::hardware::buttons::*;
|
||||||
pub use crate::library::arduboy::{Color, Point, Rect, FONT_SIZE, HEIGHT, WIDTH};
|
pub use crate::library::arduboy::{Color, Point, Pstring, Rect, FONT_SIZE, HEIGHT, WIDTH};
|
||||||
pub use crate::library::arduboy_tone::*;
|
pub use crate::library::arduboy_tone::*;
|
||||||
pub use crate::library::arduino::*;
|
pub use crate::library::arduino::*;
|
||||||
pub use crate::library::c::*;
|
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_tones_addr};
|
pub use crate::{get_sprite_addr, get_string_addr, get_tones_addr};
|
||||||
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 {
|
||||||
|
|
|
@ -1,5 +1,18 @@
|
||||||
use core::ffi::c_int;
|
use core::ffi::c_int;
|
||||||
|
|
||||||
|
#[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;
|
||||||
|
|
||||||
|
use crate::Pstring;
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
|
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
|
||||||
pub enum Base {
|
pub enum Base {
|
||||||
Bin = 2,
|
Bin = 2,
|
||||||
|
@ -101,3 +114,15 @@ impl Printable for &str {
|
||||||
|
|
||||||
fn default_parameters() -> Self::Parameters {}
|
fn default_parameters() -> Self::Parameters {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Printable for Pstring {
|
||||||
|
type Parameters = ();
|
||||||
|
|
||||||
|
fn print_2(self, _params: Self::Parameters) {
|
||||||
|
unsafe {
|
||||||
|
crate::library::arduboy::print_chars_progmem(self.pointer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn default_parameters() -> Self::Parameters {}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue