From a54fa90edc342e99d80c17e475b6aa1dd0440549 Mon Sep 17 00:00:00 2001 From: ZennDev1337 Date: Wed, 11 Oct 2023 14:55:18 +0200 Subject: [PATCH] Big refactor and new run script --- .gitignore | 1 + .idea/Rust-for-Arduboy.iml | 2 +- Cargo.lock | 2 +- Cargo.toml | 3 +- Examples/Arduboy-Tutorials/demo2/config.toml | 9 + Examples/Arduboy-Tutorials/demo3/config.toml | 9 + Examples/Arduboy-Tutorials/demo4/config.toml | 9 + Examples/Arduboy-Tutorials/demo5/config.toml | 9 + Examples/Arduboy-Tutorials/demo6/config.toml | 9 + Examples/Arduboy-Tutorials/demo6/src/lib.rs | 29 ++- Examples/Arduboy-Tutorials/demo7/config.toml | 9 + Examples/Arduboy-Tutorials/demo9/config.toml | 9 + Examples/Arduboy-Tutorials/eeprom/config.toml | 9 + Examples/Arduboy-Tutorials/eeprom/src/lib.rs | 4 +- .../{eeprom-byte => eeprom_byte}/Cargo.toml | 2 +- .../Arduboy-Tutorials/eeprom_byte/config.toml | 9 + .../{eeprom-byte => eeprom_byte}/src/lib.rs | 26 +-- .../Arduboy-Tutorials/progmem/config.toml | 9 + Examples/Arduboy-Tutorials/progmem/src/lib.rs | 7 +- Examples/Arduboy-Tutorials/serial/config.toml | 9 + Examples/Arduboy-Tutorials/tone/config.toml | 9 + Examples/Arduboy-Tutorials/tone/src/lib.rs | 18 +- Examples/ArduboyFX/fxbasicexample/config.toml | 9 + Examples/ArduboyFX/fxchompies/config.toml | 9 + Examples/ArduboyFX/fxchompies/src/lib.rs | 2 +- Examples/ArduboyFX/fxdrawballs/config.toml | 9 + Examples/ArduboyFX/fxdrawballs/src/lib.rs | 3 +- Examples/ArduboyFX/fxdrawframes/config.toml | 9 + Examples/ArduboyFX/fxhelloworld/config.toml | 9 + Examples/ArduboyFX/fxhelloworld/src/lib.rs | 2 +- .../ArduboyFX/fxloadgamestate/config.toml | 9 + Examples/ardvoice/config.toml | 9 + Examples/drboy/config.toml | 9 + Examples/drboy/src/lib.rs | 2 +- Examples/rustacean/config.toml | 9 + Examples/snake/config.toml | 9 + Examples/snake/src/lib.rs | 7 +- Project/game/config.toml | 9 + README.md | 63 ++--- arduboy-rust/Wrapper-Project/src/main.h | 2 +- arduboy-rust/src/hardware/buttons.rs | 8 +- arduboy-rust/src/lib.rs | 14 +- .../arduboy2_library}/arduboy2.rs | 177 +------------- .../src/libraries/arduboy2_library/binding.rs | 168 +++++++++++++ .../src/libraries/arduboy2_library/mod.rs | 12 + .../{ => libraries/arduboy2_library}/print.rs | 18 +- .../arduboy2_library}/sprites.rs | 0 .../arduboy_tones_library}/arduboy_tones.rs | 10 +- .../libraries/arduboy_tones_library/mod.rs | 8 + .../arduboy_tones_library}/tones_pitch.rs | 0 .../arduboyfx_library}/drawable_number.rs | 0 .../arduboyfx_library}/drawable_string.rs | 2 +- .../arduboyfx_library}/fx.rs | 0 .../arduboyfx_library}/fx_consts.rs | 0 .../arduboyfx_library/mod.rs} | 4 +- .../arduino_system}/arduino.rs | 0 .../arduino_system}/c.rs | 0 .../arduino_system}/eeprom.rs | 1 + .../src/libraries/arduino_system/mod.rs | 7 + .../arduino_system}/progmem.rs | 1 + .../arduino_system}/serial_print.rs | 4 +- .../ardvoice_library}/ardvoice.rs | 0 .../src/libraries/ardvoice_library/mod.rs | 5 + arduboy-rust/src/libraries/mod.rs | 5 + arduboy-rust/src/library/mod.rs | 9 - arduboy-rust/src/prelude.rs | 26 +-- import_config.h | 24 -- run.py | 220 ++++++++++++++++++ 68 files changed, 769 insertions(+), 336 deletions(-) create mode 100644 Examples/Arduboy-Tutorials/demo2/config.toml create mode 100644 Examples/Arduboy-Tutorials/demo3/config.toml create mode 100644 Examples/Arduboy-Tutorials/demo4/config.toml create mode 100644 Examples/Arduboy-Tutorials/demo5/config.toml create mode 100644 Examples/Arduboy-Tutorials/demo6/config.toml create mode 100644 Examples/Arduboy-Tutorials/demo7/config.toml create mode 100644 Examples/Arduboy-Tutorials/demo9/config.toml create mode 100644 Examples/Arduboy-Tutorials/eeprom/config.toml rename Examples/Arduboy-Tutorials/{eeprom-byte => eeprom_byte}/Cargo.toml (91%) create mode 100644 Examples/Arduboy-Tutorials/eeprom_byte/config.toml rename Examples/Arduboy-Tutorials/{eeprom-byte => eeprom_byte}/src/lib.rs (65%) create mode 100644 Examples/Arduboy-Tutorials/progmem/config.toml create mode 100644 Examples/Arduboy-Tutorials/serial/config.toml create mode 100644 Examples/Arduboy-Tutorials/tone/config.toml create mode 100644 Examples/ArduboyFX/fxbasicexample/config.toml create mode 100644 Examples/ArduboyFX/fxchompies/config.toml create mode 100644 Examples/ArduboyFX/fxdrawballs/config.toml create mode 100644 Examples/ArduboyFX/fxdrawframes/config.toml create mode 100644 Examples/ArduboyFX/fxhelloworld/config.toml create mode 100644 Examples/ArduboyFX/fxloadgamestate/config.toml create mode 100644 Examples/ardvoice/config.toml create mode 100644 Examples/drboy/config.toml create mode 100644 Examples/rustacean/config.toml create mode 100644 Examples/snake/config.toml create mode 100644 Project/game/config.toml rename arduboy-rust/src/{library => libraries/arduboy2_library}/arduboy2.rs (85%) create mode 100644 arduboy-rust/src/libraries/arduboy2_library/binding.rs create mode 100644 arduboy-rust/src/libraries/arduboy2_library/mod.rs rename arduboy-rust/src/{ => libraries/arduboy2_library}/print.rs (75%) rename arduboy-rust/src/{library => libraries/arduboy2_library}/sprites.rs (100%) rename arduboy-rust/src/{library => libraries/arduboy_tones_library}/arduboy_tones.rs (94%) create mode 100644 arduboy-rust/src/libraries/arduboy_tones_library/mod.rs rename arduboy-rust/src/{library/arduboy_tones => libraries/arduboy_tones_library}/tones_pitch.rs (100%) rename arduboy-rust/src/{library/arduboyfx => libraries/arduboyfx_library}/drawable_number.rs (100%) rename arduboy-rust/src/{library/arduboyfx => libraries/arduboyfx_library}/drawable_string.rs (95%) rename arduboy-rust/src/{library/arduboyfx => libraries/arduboyfx_library}/fx.rs (100%) rename arduboy-rust/src/{library/arduboyfx => libraries/arduboyfx_library}/fx_consts.rs (100%) rename arduboy-rust/src/{library/arduboyfx.rs => libraries/arduboyfx_library/mod.rs} (91%) rename arduboy-rust/src/{library => libraries/arduino_system}/arduino.rs (100%) rename arduboy-rust/src/{library => libraries/arduino_system}/c.rs (100%) rename arduboy-rust/src/{library => libraries/arduino_system}/eeprom.rs (98%) create mode 100644 arduboy-rust/src/libraries/arduino_system/mod.rs rename arduboy-rust/src/{library => libraries/arduino_system}/progmem.rs (98%) rename arduboy-rust/src/{ => libraries/arduino_system}/serial_print.rs (99%) rename arduboy-rust/src/{library => libraries/ardvoice_library}/ardvoice.rs (100%) create mode 100644 arduboy-rust/src/libraries/ardvoice_library/mod.rs create mode 100644 arduboy-rust/src/libraries/mod.rs delete mode 100644 arduboy-rust/src/library/mod.rs delete mode 100644 import_config.h create mode 100644 run.py diff --git a/.gitignore b/.gitignore index 876a054..c45df87 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ localcommands.txt arduboy-rust/Wrapper-Project/.pio arduboy-rust/Wrapper-Project/lib/*.a arduboy-rust/Wrapper-Project/build/*.hex +**/imports.h diff --git a/.idea/Rust-for-Arduboy.iml b/.idea/Rust-for-Arduboy.iml index 127d46b..6c761bc 100644 --- a/.idea/Rust-for-Arduboy.iml +++ b/.idea/Rust-for-Arduboy.iml @@ -9,7 +9,6 @@ - @@ -26,6 +25,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index d53b75e..a02629b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,7 +108,7 @@ dependencies = [ ] [[package]] -name = "eeprom-byte" +name = "eeprom_byte" version = "0.1.0" dependencies = [ "arduboy-rust", diff --git a/Cargo.toml b/Cargo.toml index 22951db..8ba939a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,9 @@ + [workspace] members = [ "arduboy-rust", "Examples/Arduboy-Tutorials/eeprom", - "Examples/Arduboy-Tutorials/eeprom-byte", + "Examples/Arduboy-Tutorials/eeprom_byte", "Examples/Arduboy-Tutorials/progmem", "Examples/Arduboy-Tutorials/tone", "Examples/Arduboy-Tutorials/serial", diff --git a/Examples/Arduboy-Tutorials/demo2/config.toml b/Examples/Arduboy-Tutorials/demo2/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo2/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/demo3/config.toml b/Examples/Arduboy-Tutorials/demo3/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo3/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/demo4/config.toml b/Examples/Arduboy-Tutorials/demo4/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo4/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/demo5/config.toml b/Examples/Arduboy-Tutorials/demo5/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo5/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/demo6/config.toml b/Examples/Arduboy-Tutorials/demo6/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo6/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/demo6/src/lib.rs b/Examples/Arduboy-Tutorials/demo6/src/lib.rs index 196e4b9..29d3cfb 100644 --- a/Examples/Arduboy-Tutorials/demo6/src/lib.rs +++ b/Examples/Arduboy-Tutorials/demo6/src/lib.rs @@ -5,22 +5,19 @@ #[allow(unused_imports)] use arduboy_rust::prelude::*; const arduboy: Arduboy2 = Arduboy2::new(); - -#[link_section = ".progmem.data"] -static background_sprite: [u8; 10] = [8, 8, 0x81, 0x00, 0x12, 0x40, 0x04, 0x11, 0x00, 0x04]; -#[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 player_sprite2: [u8; 34] = [ - 16, 16, 0xfc, 0x02, 0x19, 0x25, 0x25, 0x19, 0x01, 0x01, 0x01, 0x01, 0x19, 0x25, 0x25, 0x19, - 0x02, 0xfc, 0x3f, 0x40, 0x80, 0x98, 0x8c, 0x86, 0x82, 0x82, 0x82, 0x82, 0x86, 0x8c, 0x98, 0x80, - 0x40, 0x3f, -]; - +progmem!( + static background_sprite: [u8; _] = [8, 8, 0x81, 0x00, 0x12, 0x40, 0x04, 0x11, 0x00, 0x04]; + 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 player_sprite2: [u8; _] = [ + 16, 16, 0xfc, 0x02, 0x19, 0x25, 0x25, 0x19, 0x01, 0x01, 0x01, 0x01, 0x19, 0x25, 0x25, 0x19, + 0x02, 0xfc, 0x3f, 0x40, 0x80, 0x98, 0x8c, 0x86, 0x82, 0x82, 0x82, 0x82, 0x86, 0x8c, 0x98, + 0x80, 0x40, 0x3f, + ]; +); // Put your variables here static mut playerx: c_int = 5; static mut playery: c_int = 10; diff --git a/Examples/Arduboy-Tutorials/demo7/config.toml b/Examples/Arduboy-Tutorials/demo7/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo7/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/demo9/config.toml b/Examples/Arduboy-Tutorials/demo9/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/demo9/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/eeprom/config.toml b/Examples/Arduboy-Tutorials/eeprom/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/eeprom/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/eeprom/src/lib.rs b/Examples/Arduboy-Tutorials/eeprom/src/lib.rs index 241383a..8a89014 100644 --- a/Examples/Arduboy-Tutorials/eeprom/src/lib.rs +++ b/Examples/Arduboy-Tutorials/eeprom/src/lib.rs @@ -24,7 +24,7 @@ static mut s: Scorebord = Scorebord { pub unsafe extern "C" fn setup() { // put your setup code here, to run once: arduboy.begin(); - arduboy.set_frame_rate(1); + arduboy.set_frame_rate(30); arduboy.clear(); e.init(&mut s); } @@ -54,11 +54,9 @@ pub unsafe extern "C" fn loop_() { if s.player1 == 5 { arduboy.print(f!(b"lolxd\0")); s.text = "it works!!!\0"; - e.put(&s) } else { arduboy.print(f!(b"nope\0")); s.text = "lol\0"; - e.put(&s) } //e.get(&mut s); diff --git a/Examples/Arduboy-Tutorials/eeprom-byte/Cargo.toml b/Examples/Arduboy-Tutorials/eeprom_byte/Cargo.toml similarity index 91% rename from Examples/Arduboy-Tutorials/eeprom-byte/Cargo.toml rename to Examples/Arduboy-Tutorials/eeprom_byte/Cargo.toml index 4ae8c5f..258786e 100644 --- a/Examples/Arduboy-Tutorials/eeprom-byte/Cargo.toml +++ b/Examples/Arduboy-Tutorials/eeprom_byte/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "eeprom-byte" +name = "eeprom_byte" version = "0.1.0" authors = ["ZennDev "] license = "MIT OR Apache-2.0" diff --git a/Examples/Arduboy-Tutorials/eeprom_byte/config.toml b/Examples/Arduboy-Tutorials/eeprom_byte/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/eeprom_byte/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/eeprom-byte/src/lib.rs b/Examples/Arduboy-Tutorials/eeprom_byte/src/lib.rs similarity index 65% rename from Examples/Arduboy-Tutorials/eeprom-byte/src/lib.rs rename to Examples/Arduboy-Tutorials/eeprom_byte/src/lib.rs index 9b8046a..14ce7f0 100644 --- a/Examples/Arduboy-Tutorials/eeprom-byte/src/lib.rs +++ b/Examples/Arduboy-Tutorials/eeprom_byte/src/lib.rs @@ -11,7 +11,8 @@ const arduboy: Arduboy2 = Arduboy2::new(); // Setup eeprom memory static mut eeprom: EEPROMBYTE = EEPROMBYTE::new(10); -static mut count: u8 = 0; +static mut count_in_ram: u8 = 0; +static mut count_in_eeprom: u8 = 0; // The setup() function runs once when you turn your Arduboy on #[no_mangle] @@ -33,24 +34,23 @@ pub unsafe extern "C" fn loop_() { arduboy.clear(); arduboy.poll_buttons(); if arduboy.just_pressed(UP) { - count += 1; + count_in_ram += 1; } if arduboy.just_pressed(DOWN) { - count -= 1; + count_in_ram -= 1; } if arduboy.just_pressed(A) { - eeprom.update(count) + eeprom.update(count_in_ram); + count_in_eeprom = eeprom.read() } arduboy.set_cursor(0, 0); - arduboy.print(count as u16); - - arduboy.set_cursor(0, 30); - arduboy.print(f!(b"Counter:\0")); - arduboy.print(count as u16); - arduboy.set_cursor(0, 40); - arduboy.print(f!(b"eeprom:\0")); - - //arduboy.print(eeprom.read() as u16); + arduboy.print(f!(b"Up/Down: Edit InRam\n\nA: Save to EEPROM\0")); + arduboy.set_cursor(0, HEIGHT - FONT_HEIGHT); + arduboy.print(f!(b"InRam:\0")); + arduboy.print(count_in_ram as u16); + arduboy.set_cursor(10 * FONT_WIDTH, HEIGHT - FONT_HEIGHT); + arduboy.print(f!(b"EEPROM:\0")); + arduboy.print(count_in_eeprom as u16); arduboy.display(); } diff --git a/Examples/Arduboy-Tutorials/progmem/config.toml b/Examples/Arduboy-Tutorials/progmem/config.toml new file mode 100644 index 0000000..1193f35 --- /dev/null +++ b/Examples/Arduboy-Tutorials/progmem/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/progmem/src/lib.rs b/Examples/Arduboy-Tutorials/progmem/src/lib.rs index 01a1d18..c77d3f1 100644 --- a/Examples/Arduboy-Tutorials/progmem/src/lib.rs +++ b/Examples/Arduboy-Tutorials/progmem/src/lib.rs @@ -5,7 +5,7 @@ //Include the Arduboy Library //Initialize the arduboy object use arduboy_rust::prelude::*; -use arduboy_tones::tones_pitch::*; +use tones_pitch::*; const arduboy: Arduboy2 = Arduboy2::new(); const sound: ArduboyTones = ArduboyTones::new(); // Progmem data @@ -106,7 +106,10 @@ pub unsafe extern "C" fn loop_() { } } arduboy.clear(); - arduboy.set_cursor((WIDTH as i16 / 2) - (text1.len() as i16 * FONT_SIZE as i16 / 2), 10); + arduboy.set_cursor( + (WIDTH as i16 / 2) - (text1.len() as i16 * FONT_WIDTH / 2), + 10, + ); arduboy.print(get_string_addr!(text1)); sprites::draw_override(playerx, playery, get_sprite_addr!(player_sprite1), 0); arduboy.display(); diff --git a/Examples/Arduboy-Tutorials/serial/config.toml b/Examples/Arduboy-Tutorials/serial/config.toml new file mode 100644 index 0000000..fecbd18 --- /dev/null +++ b/Examples/Arduboy-Tutorials/serial/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/tone/config.toml b/Examples/Arduboy-Tutorials/tone/config.toml new file mode 100644 index 0000000..2345467 --- /dev/null +++ b/Examples/Arduboy-Tutorials/tone/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + "ArduboyTones", + # "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/Arduboy-Tutorials/tone/src/lib.rs b/Examples/Arduboy-Tutorials/tone/src/lib.rs index a486a2c..5eb17f0 100644 --- a/Examples/Arduboy-Tutorials/tone/src/lib.rs +++ b/Examples/Arduboy-Tutorials/tone/src/lib.rs @@ -4,7 +4,7 @@ //Initialize the arduboy object #[allow(unused_imports)] use arduboy_rust::prelude::*; -use arduboy_tones::tones_pitch::*; +use tones_pitch::*; const arduboy: Arduboy2 = Arduboy2::new(); const sound: ArduboyTones = ArduboyTones::new(); const NDUR: u16 = 100; @@ -346,7 +346,9 @@ pub unsafe extern "C" fn loop_() { sound.tone(1000, 0); arduboy.clear(); - arduboy.print(f!(b"tone(1000)\n\nB: no_tone()\n delay(1000)\n break\0")); + arduboy.print(f!( + b"tone(1000)\n\nB: no_tone()\n delay(1000)\n break\0" + )); while sound.playing() { move_circle(); if arduboy.pressed(B_BUTTON) { @@ -381,7 +383,9 @@ pub unsafe extern "C" fn loop_() { sound.tone3(NOTE_C7H, 500, NOTE_REST, 1000, NOTE_C6, 5000); arduboy.clear(); - arduboy.print(f!(b"tone(C7H,500,\n REST,1000,\n C6,6000)\n\nB: no_tone(), break\0")); + arduboy.print(f!( + b"tone(C7H,500,\n REST,1000,\n C6,6000)\n\nB: no_tone(), break\0" + )); while sound.playing() { move_circle(); if arduboy.pressed(B_BUTTON) { @@ -393,7 +397,9 @@ pub unsafe extern "C" fn loop_() { sound.tones(get_tones_addr!(allNotes)); arduboy.clear(); - arduboy.print(f!(b"tones(allNotes)\n\nA: no_tone(), again\nUP: again\nB: break\0")); + arduboy.print(f!( + b"tones(allNotes)\n\nA: no_tone(), again\nUP: again\nB: break\0" + )); while sound.playing() { move_circle(); if arduboy.pressed(A_BUTTON) { @@ -446,7 +452,9 @@ pub unsafe extern "C" fn loop_() { sound.volume_mode(VOLUME_ALWAYS_NORMAL); sound.tones(get_tones_addr!(sound1)); arduboy.clear(); - arduboy.print(f!(b"volume_mode(NORMAL)\ntones(sound1)\n\nB: no_tone(), break\0")); + arduboy.print(f!( + b"volume_mode(NORMAL)\ntones(sound1)\n\nB: no_tone(), break\0" + )); while sound.playing() { move_circle(); if arduboy.pressed(B) { diff --git a/Examples/ArduboyFX/fxbasicexample/config.toml b/Examples/ArduboyFX/fxbasicexample/config.toml new file mode 100644 index 0000000..edaaed5 --- /dev/null +++ b/Examples/ArduboyFX/fxbasicexample/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/ArduboyFX/fxchompies/config.toml b/Examples/ArduboyFX/fxchompies/config.toml new file mode 100644 index 0000000..edaaed5 --- /dev/null +++ b/Examples/ArduboyFX/fxchompies/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/ArduboyFX/fxchompies/src/lib.rs b/Examples/ArduboyFX/fxchompies/src/lib.rs index 6a16e9a..0e456f4 100644 --- a/Examples/ArduboyFX/fxchompies/src/lib.rs +++ b/Examples/ArduboyFX/fxchompies/src/lib.rs @@ -4,7 +4,7 @@ //Include the Arduboy Library //Initialize the arduboy object use arduboy_rust::prelude::*; -use arduboyfx::fx_consts::*; +use fx_consts::*; const arduboy: Arduboy2 = Arduboy2::new(); // FX Data diff --git a/Examples/ArduboyFX/fxdrawballs/config.toml b/Examples/ArduboyFX/fxdrawballs/config.toml new file mode 100644 index 0000000..edaaed5 --- /dev/null +++ b/Examples/ArduboyFX/fxdrawballs/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/ArduboyFX/fxdrawballs/src/lib.rs b/Examples/ArduboyFX/fxdrawballs/src/lib.rs index 5a4df17..5948963 100644 --- a/Examples/ArduboyFX/fxdrawballs/src/lib.rs +++ b/Examples/ArduboyFX/fxdrawballs/src/lib.rs @@ -1,10 +1,11 @@ #![no_std] #![allow(non_upper_case_globals)] -use arduboy_rust::arduboyfx::fx_consts::{dbmMasked, dbmNormal}; //Include the Arduboy Library //Initialize the arduboy object use arduboy_rust::prelude::*; +use fx_consts::{dbmMasked, dbmNormal}; + const arduboy: Arduboy2 = Arduboy2::new(); // FX Data diff --git a/Examples/ArduboyFX/fxdrawframes/config.toml b/Examples/ArduboyFX/fxdrawframes/config.toml new file mode 100644 index 0000000..edaaed5 --- /dev/null +++ b/Examples/ArduboyFX/fxdrawframes/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/ArduboyFX/fxhelloworld/config.toml b/Examples/ArduboyFX/fxhelloworld/config.toml new file mode 100644 index 0000000..edaaed5 --- /dev/null +++ b/Examples/ArduboyFX/fxhelloworld/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/ArduboyFX/fxhelloworld/src/lib.rs b/Examples/ArduboyFX/fxhelloworld/src/lib.rs index a56a035..0bbd5ce 100644 --- a/Examples/ArduboyFX/fxhelloworld/src/lib.rs +++ b/Examples/ArduboyFX/fxhelloworld/src/lib.rs @@ -4,7 +4,7 @@ //Include the Arduboy Library //Initialize the arduboy object use arduboy_rust::prelude::*; -use arduboyfx::fx_consts::*; +use fx_consts::*; const arduboy: Arduboy2 = Arduboy2::new(); //FX Data diff --git a/Examples/ArduboyFX/fxloadgamestate/config.toml b/Examples/ArduboyFX/fxloadgamestate/config.toml new file mode 100644 index 0000000..edaaed5 --- /dev/null +++ b/Examples/ArduboyFX/fxloadgamestate/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + "ArduboyFX", + # "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/ardvoice/config.toml b/Examples/ardvoice/config.toml new file mode 100644 index 0000000..ef464f0 --- /dev/null +++ b/Examples/ardvoice/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + # "ArduboyTones", + # "ArduboyFX", + "ArdVoice", + # "Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/drboy/config.toml b/Examples/drboy/config.toml new file mode 100644 index 0000000..b146980 --- /dev/null +++ b/Examples/drboy/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + "ArduboyTones", + #"ArduboyFX", + #"ArdVoice", + #"Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/drboy/src/lib.rs b/Examples/drboy/src/lib.rs index 9721682..3e3af11 100644 --- a/Examples/drboy/src/lib.rs +++ b/Examples/drboy/src/lib.rs @@ -4,7 +4,7 @@ //Include the Arduboy Library #[allow(unused_imports)] use arduboy_rust::prelude::*; -use arduboy_tones::tones_pitch::*; +use tones_pitch::*; mod gameloop; #[allow(dead_code)] diff --git a/Examples/rustacean/config.toml b/Examples/rustacean/config.toml new file mode 100644 index 0000000..b146980 --- /dev/null +++ b/Examples/rustacean/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + "ArduboyTones", + #"ArduboyFX", + #"ArdVoice", + #"Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/snake/config.toml b/Examples/snake/config.toml new file mode 100644 index 0000000..b146980 --- /dev/null +++ b/Examples/snake/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + "ArduboyTones", + #"ArduboyFX", + #"ArdVoice", + #"Serial", + "EEPROM", + "Arduino", +] diff --git a/Examples/snake/src/lib.rs b/Examples/snake/src/lib.rs index 125b6c4..b940e07 100644 --- a/Examples/snake/src/lib.rs +++ b/Examples/snake/src/lib.rs @@ -257,11 +257,8 @@ pub unsafe extern "C" fn loop_() { State::Win => (), State::Pause => { let msg = "[ Break ]\0"; - let l = msg.len() as u8 * FONT_SIZE / 2; - arduboy.set_cursor( - ((WIDTH / 2) as u16 - l as u16).try_into().unwrap(), - ((HEIGHT / 2) as u16).try_into().unwrap(), - ); + let l = msg.len() as i16 * FONT_WIDTH / 2; + arduboy.set_cursor(WIDTH / 2 - l, HEIGHT / 2); snake.render(); snake.boarder(); arduboy.print(msg); diff --git a/Project/game/config.toml b/Project/game/config.toml new file mode 100644 index 0000000..b146980 --- /dev/null +++ b/Project/game/config.toml @@ -0,0 +1,9 @@ +Libraries = [ + "Arduboy2", + "ArduboyTones", + #"ArduboyFX", + #"ArdVoice", + #"Serial", + "EEPROM", + "Arduino", +] diff --git a/README.md b/README.md index 62f6644..0ac31c8 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ add the following rule to the lsp settings : ```json { - "rust-analyzer.checkOnSave.allTargets": false + "rust-analyzer.checkOnSave.allTargets": false } ``` @@ -47,7 +47,7 @@ normal Arduboy C project. You can find the Docs here: -- [arduboy-rust Crate Docs](https://zenndev1337.github.io/Rust-for-Arduboy/) +- [arduboy-rust Crate Docs](https://zenndev1337.github.io/Rust-for-Arduboy/) or you can use the following command to open the arduboy-rust Crate docs locally @@ -68,9 +68,10 @@ I will from time to time also upload my projects to the Example folder so you ha requirements: -- [PlatformIO Core](https://docs.platformio.org/en/latest/core/installation/methods/pypi.html) must be installed -- The Arduboy must be plugged in -- You are in the root directory of this project +- Python3.11 or higher +- [PlatformIO Core](https://docs.platformio.org/en/latest/core/installation/methods/pypi.html) must be installed +- The Arduboy must be plugged in +- You are in the root directory of this project All builded `.hex` files are saved inside of `arduboy-rust/Wrapper-Project/build/.hex` after you uploaded them to the Arduboy. @@ -93,30 +94,30 @@ Windows: ### ZennDev1337 Games -- drboy +- drboy ### Rust Games -- snake -- rustacean +- snake +- rustacean ### The demo games / tutorials from the official Arduboy forum [Rewritten in Rust] -- [Make Your Own Arduboy Game: Part 1 - Setting Up Your Computer](https://community.arduboy.com/t/make-your-own-arduboy-game-part-1-setting-up-your-computer/7924/1) -- [demo2] [Make Your Own Arduboy Game: Part 2 - Printing Text](https://community.arduboy.com/t/make-your-own-arduboy-game-part-2-printing-text/7925) -- [demo3] [Make Your Own Arduboy Game: Part 3 - Storing Data & Loops](https://community.arduboy.com/t/make-your-own-arduboy-game-part-3-storing-data-loops/7926) -- [demo4] [Make Your Own Arduboy Game: Part 4 - Questions & Button Input](https://community.arduboy.com/t/make-your-own-arduboy-game-part-4-questions-button-input/7927) -- [demo5] [Make Your Own Arduboy Game: Part 5 - Your First Game!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-5-your-first-game/7928) -- [demo6] [Make Your Own Arduboy Game: Part 6 - Graphics!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-6-graphics/7929) - Link for the [ZennDev1337 Tile Converter](https://zenndev1337.github.io/Rust-for-Arduboy/tile-converter.html) -- [demo7] [Make Your Own Arduboy Game: Part 7 - Make Pong From Scratch!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-7-make-pong-from-scratch/7930) -- Prepare for - demo9 [Make Your Own Arduboy Game: Part 8 - Starting DinoSmasher](https://community.arduboy.com/t/make-your-own-arduboy-game-part-8-starting-dinosmasher/7932) -- [demo9] [Make Your Own Arduboy Game: Part 9 - Mapping DinoSmasher](https://community.arduboy.com/t/make-your-own-arduboy-game-part-9-mapping-dinosmasher/7931) -- [eeprom] [Help, I’m struggling with EEPROM!](https://community.arduboy.com/t/help-im-struggling-with-eeprom/7178) -- [eeprom-byte] [Help, I’m struggling with EEPROM!](https://community.arduboy.com/t/help-im-struggling-with-eeprom/7178) -- [progmem] Usage of the big 28'000 Bytes flash memory for Bitmaps Sound sequeces and Text. -- [tone] [ArduboyTonesTest](https://github.com/MLXXXp/ArduboyTones/blob/master/examples/ArduboyTonesTest/ArduboyTonesTest.ino) +- [Make Your Own Arduboy Game: Part 1 - Setting Up Your Computer](https://community.arduboy.com/t/make-your-own-arduboy-game-part-1-setting-up-your-computer/7924/1) +- [demo2] [Make Your Own Arduboy Game: Part 2 - Printing Text](https://community.arduboy.com/t/make-your-own-arduboy-game-part-2-printing-text/7925) +- [demo3] [Make Your Own Arduboy Game: Part 3 - Storing Data & Loops](https://community.arduboy.com/t/make-your-own-arduboy-game-part-3-storing-data-loops/7926) +- [demo4] [Make Your Own Arduboy Game: Part 4 - Questions & Button Input](https://community.arduboy.com/t/make-your-own-arduboy-game-part-4-questions-button-input/7927) +- [demo5] [Make Your Own Arduboy Game: Part 5 - Your First Game!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-5-your-first-game/7928) +- [demo6] [Make Your Own Arduboy Game: Part 6 - Graphics!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-6-graphics/7929) + Link for the [ZennDev1337 Tile Converter](https://zenndev1337.github.io/Rust-for-Arduboy/tile-converter.html) +- [demo7] [Make Your Own Arduboy Game: Part 7 - Make Pong From Scratch!](https://community.arduboy.com/t/make-your-own-arduboy-game-part-7-make-pong-from-scratch/7930) +- Prepare for + demo9 [Make Your Own Arduboy Game: Part 8 - Starting DinoSmasher](https://community.arduboy.com/t/make-your-own-arduboy-game-part-8-starting-dinosmasher/7932) +- [demo9] [Make Your Own Arduboy Game: Part 9 - Mapping DinoSmasher](https://community.arduboy.com/t/make-your-own-arduboy-game-part-9-mapping-dinosmasher/7931) +- [eeprom] [Help, I’m struggling with EEPROM!](https://community.arduboy.com/t/help-im-struggling-with-eeprom/7178) +- [eeprom-byte] [Help, I’m struggling with EEPROM!](https://community.arduboy.com/t/help-im-struggling-with-eeprom/7178) +- [progmem] Usage of the big 28'000 Bytes flash memory for Bitmaps Sound sequeces and Text. +- [tone] [ArduboyTonesTest](https://github.com/MLXXXp/ArduboyTones/blob/master/examples/ArduboyTonesTest/ArduboyTonesTest.ino) ## Usage of the FX Chip @@ -146,13 +147,13 @@ See the examples in `Examples/ArduboyFX`. More information: -- [Arduboy-Python-Utilities by MrBlinky](https://github.com/MrBlinky/Arduboy-Python-Utilities) +- [Arduboy-Python-Utilities by MrBlinky](https://github.com/MrBlinky/Arduboy-Python-Utilities) run Commands: -- `fxbuild` is used to build the fxdata.dat file. -- `fxupload` is used to upload the fxdata.dat file. -- `fxall` is used to build and upload the fxdata.dat file and build and upload the game all in one step. +- `fxbuild` is used to build the fxdata.dat file. +- `fxupload` is used to upload the fxdata.dat file. +- `fxall` is used to build and upload the fxdata.dat file and build and upload the game all in one step. Linux: @@ -272,10 +273,10 @@ that inspired me to try Rust on the Arduboy. You can license it under either one of those licenses: -- Apache License, Version 2.0 - ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) -- MIT license - ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) +- Apache License, Version 2.0 + ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license + ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) Whichever you may prefer. diff --git a/arduboy-rust/Wrapper-Project/src/main.h b/arduboy-rust/Wrapper-Project/src/main.h index a574aba..7d79d27 100644 --- a/arduboy-rust/Wrapper-Project/src/main.h +++ b/arduboy-rust/Wrapper-Project/src/main.h @@ -1,6 +1,6 @@ #pragma once -#include "../../../import_config.h" +#include "imports.h" #if defined(Arduboy2_Library) #include diff --git a/arduboy-rust/src/hardware/buttons.rs b/arduboy-rust/src/hardware/buttons.rs index 9935f32..4552102 100644 --- a/arduboy-rust/src/hardware/buttons.rs +++ b/arduboy-rust/src/hardware/buttons.rs @@ -47,18 +47,18 @@ pub struct ButtonSet { impl ButtonSet { pub unsafe fn pressed(&self) -> bool { - crate::library::arduboy2::pressed(self.flag_set) + crate::libraries::arduboy2_library::binding::pressed(self.flag_set) } pub unsafe fn just_pressed(&self) -> bool { - crate::library::arduboy2::just_pressed(self.flag_set) + crate::libraries::arduboy2_library::binding::just_pressed(self.flag_set) } pub unsafe fn just_released(&self) -> bool { - crate::library::arduboy2::just_released(self.flag_set) + crate::libraries::arduboy2_library::binding::just_released(self.flag_set) } pub unsafe fn not_pressed(&self) -> bool { - crate::library::arduboy2::not_pressed(self.flag_set) + crate::libraries::arduboy2_library::binding::not_pressed(self.flag_set) } } diff --git a/arduboy-rust/src/lib.rs b/arduboy-rust/src/lib.rs index e92b5fa..904193e 100644 --- a/arduboy-rust/src/lib.rs +++ b/arduboy-rust/src/lib.rs @@ -27,15 +27,11 @@ extern crate panic_halt; pub mod hardware; -mod library; +mod libraries; pub mod prelude; -mod print; + #[doc(inline)] pub extern crate heapless; -pub use crate::library::arduboy2::{self, Arduboy2, Color, FONT_SIZE, HEIGHT, WIDTH}; -pub use crate::library::arduboy_tones::{self, ArduboyTones}; -pub use crate::library::ardvoice::{self, ArdVoice}; -pub use crate::library::eeprom::{EEPROM, EEPROMBYTE}; -pub use crate::library::{arduino, c, sprites}; -pub use crate::library::arduboyfx::{self}; -pub mod serial_print; +pub use crate::libraries::{ + arduboy2_library, arduboy_tones_library, arduboyfx_library, arduino_system, ardvoice_library, +}; diff --git a/arduboy-rust/src/library/arduboy2.rs b/arduboy-rust/src/libraries/arduboy2_library/arduboy2.rs similarity index 85% rename from arduboy-rust/src/library/arduboy2.rs rename to arduboy-rust/src/libraries/arduboy2_library/arduboy2.rs index b4fcfeb..85374c4 100644 --- a/arduboy-rust/src/library/arduboy2.rs +++ b/arduboy-rust/src/libraries/arduboy2_library/arduboy2.rs @@ -3,16 +3,17 @@ //! All of the functions are safe wrapped inside the [Arduboy2] struct. #![allow(dead_code)] +use super::binding::*; +use super::print::Printable; use crate::hardware::buttons::ButtonSet; -use crate::print::Printable; -use core::ffi::{c_char, c_int, c_long, c_size_t, c_uchar, c_uint, c_ulong}; use core::mem; use core::ops::Not; /// The standard font size of the arduboy /// /// this is to calculate with it. -pub const FONT_SIZE: u8 = 6; +pub const FONT_WIDTH: i16 = 6; +pub const FONT_HEIGHT: i16 = 8; /// The standard width of the arduboy /// /// this is to calculate with it. @@ -650,7 +651,7 @@ impl Arduboy2 { ///The returned mask contains a bit for each button. For any pressed button, its bit will be 1. For released buttons their associated bits will be 0. /// ///The following defined mask values should be used for the buttons: - /// LEFT_BUTTON, RIGHT_BUTTON, UP_BUTTON, DOWN_BUTTON, A_BUTTON, B_BUTTON + /// LEFT_BUTTON, RIGHT_BUTTON, UP_BUTTON, DOWN_BUTTON, A_BUTTON, B_BUTTON pub fn buttons_state(&self) -> u8 { unsafe { arduboy_buttons_state() } } @@ -658,175 +659,9 @@ impl Arduboy2 { /// ///The sketch will exit and the bootloader will be started in command mode. The effect will be similar to pressing the reset button. /// - ///This function is intended to be used to allow uploading a new sketch, when the USB code has been removed to gain more code space. Ideally, the sketch would present a "New Sketch Upload" menu or prompt telling the user to "Press and hold the DOWN button when the procedure to upload a new sketch has been initiated". + ///This function is intended to be used to allow uploading a new sketch, when the USB code has been removed to gain more code space. Ideally, the sketch would present a "New Sketch Upload" menu or prompt telling the user to "Press and hold the DOWN button when the procedure to upload a new sketch has been initiated". ///The sketch would then wait for the DOWN button to be pressed and then call this function. pub fn exit_to_bootloader(&self) { unsafe { arduboy_exit_to_bootloader() } } } - -extern "C" { - #[link_name = "arduboy_begin"] - fn begin(); - - #[link_name = "arduboy_clear"] - fn clear(); - - #[link_name = "arduboy_display"] - fn display(); - - #[link_name = "arduboy_display_and_clear_buffer"] - fn display_and_clear_buffer(); - - #[link_name = "arduboy_draw_fast_hline"] - fn draw_fast_hline_raw(x: i16, y: i16, w: u8, color: u8); - - #[link_name = "arduboy_draw_fast_vline"] - fn draw_fast_vline_raw(x: i16, y: i16, h: u8, color: u8); - - #[link_name = "arduboy_draw_pixel"] - fn draw_pixel_raw(x: i16, y: i16, color: u8); - - #[link_name = "arduboy_draw_circle"] - fn draw_circle_raw(x: i16, y: i16, r: u8, color: u8); - - #[link_name = "arduboy_draw_rect"] - fn draw_rect_raw(x: i16, y: i16, w: u8, h: u8, color: u8); - - #[link_name = "arduboy_fill_circle"] - fn fill_circle_raw(x: i16, y: i16, r: u8, color: u8); - - #[link_name = "arduboy_fill_rect"] - fn fill_rect_raw(x: i16, y: i16, w: u8, h: u8, color: u8); - - #[link_name = "arduboy_fill_round_rect"] - fn fill_round_rect(x: i16, y: i16, w: u8, h: u8, r: u8, color: u8); - - #[link_name = "arduboy_draw_round_rect"] - fn draw_round_rect(x: i16, y: i16, w: u8, h: u8, r: u8, color: u8); - - #[link_name = "arduboy_fill_triangle"] - fn fill_triangle(x0: i16, y0: i16, x1: i16, y1: i16, x2: i16, y2: i16, color: u8); - - #[link_name = "arduboy_draw_triangle"] - fn draw_triangle(x0: i16, y0: i16, x1: i16, y1: i16, x2: i16, y2: i16, color: u8); - - #[link_name = "arduboy_get_pixel"] - fn get_pixel_raw(x: u8, y: u8) -> u8; - #[doc(hidden)] - #[link_name = "arduboy_init_random_seed"] - fn init_random_seed(); - #[doc(hidden)] - #[link_name = "arduboy_just_pressed"] - pub fn just_pressed(button: u8) -> bool; - #[doc(hidden)] - #[link_name = "arduboy_just_released"] - pub fn just_released(button: u8) -> bool; - #[doc(hidden)] - #[link_name = "arduboy_not_pressed"] - pub fn not_pressed(button: u8) -> bool; - - #[link_name = "arduboy_next_frame"] - fn next_frame() -> bool; - - #[link_name = "arduboy_poll_buttons"] - fn poll_buttons(); - #[doc(hidden)] - #[link_name = "arduboy_pressed"] - pub fn pressed(buttons: u8) -> bool; - #[doc(hidden)] - #[link_name = "arduboy_print_chars"] - pub fn print_chars(cstr: *const c_char); - #[doc(hidden)] - #[link_name = "arduboy_print_chars_progmem"] - pub fn print_chars_progmem(pstring: *const c_char); - - // #[link_name = "arduboy_print_char"] - // fn print_char(c: c_char) -> c_size_t; - #[doc(hidden)] - #[link_name = "arduboy_print_int"] - pub fn print_int(n: c_int, base: c_int) -> c_size_t; - #[doc(hidden)] - #[link_name = "arduboy_print_long"] - pub fn print_long(n: c_long, base: c_int) -> c_size_t; - #[doc(hidden)] - #[link_name = "arduboy_print_unsigned_char"] - pub fn print_unsigned_char(n: c_uchar, base: c_int) -> c_size_t; - #[doc(hidden)] - #[link_name = "arduboy_print_unsigned_int"] - pub fn print_unsigned_int(n: c_uint, base: c_int) -> c_size_t; - #[doc(hidden)] - #[link_name = "arduboy_print_unsigned_long"] - pub fn print_unsigned_long(n: c_ulong, base: c_int) -> c_size_t; - - #[link_name = "arduboy_set_cursor"] - fn set_cursor(x: i16, y: i16); - - #[link_name = "arduboy_set_frame_rate"] - fn set_frame_rate(rate: u8); - - #[link_name = "arduboy_set_text_size"] - fn set_text_size(size: u8); - - #[link_name = "arduboy_audio_on"] - fn arduboy_audio_on(); - - #[link_name = "arduboy_audio_off"] - fn arduboy_audio_off(); - - #[link_name = "arduboy_audio_save_on_off"] - fn arduboy_audio_save_on_off(); - - #[link_name = "arduboy_audio_toggle"] - fn arduboy_audio_toggle(); - - #[link_name = "arduboy_audio_enabled"] - fn arduboy_audio_enabled() -> bool; - - #[link_name = "arduboy_invert"] - fn arduboy_invert(inverse: bool); - - #[link_name = "arduboy_every_x_frames"] - fn every_x_frames(frames: u8) -> bool; - - #[link_name = "arduboy_flip_horizontal"] - fn flip_horizontal(flipped: bool); - - #[link_name = "arduboy_flip_vertical"] - fn flip_vertical(flipped: bool); - - #[link_name = "arduboy_set_text_color"] - fn set_text_color(color: u8); - - #[link_name = "arduboy_set_text_background_color"] - fn set_text_background_color(color: u8); - - #[link_name = "arduboy_set_cursor_x"] - fn set_cursor_x(x: i16); - #[link_name = "arduboy_set_cursor_y"] - fn set_cursor_y(y: i16); - - #[link_name = "arduboy_set_text_wrap"] - fn set_text_wrap(w: bool); - - #[link_name = "arduboy_idle"] - fn idle(); - - #[link_name = "arduboy_digital_write_rgb_single"] - fn digital_write_rgb_single(color: c_uchar, val: c_uchar); - - #[link_name = "arduboy_digital_write_rgb"] - fn digital_write_rgb(red: c_uchar, green: c_uchar, blue: c_uchar); - - #[link_name = "arduboy_set_rgb_led_single"] - fn set_rgb_led_single(color: c_uchar, val: c_uchar); - - #[link_name = "arduboy_set_rgb_led"] - fn set_rgb_led(red: c_uchar, green: c_uchar, blue: c_uchar); - - #[link_name = "arduboy_buttons_state"] - fn arduboy_buttons_state() -> u8; - - #[link_name = "arduboy_exit_to_bootloader"] - fn arduboy_exit_to_bootloader(); -} diff --git a/arduboy-rust/src/libraries/arduboy2_library/binding.rs b/arduboy-rust/src/libraries/arduboy2_library/binding.rs new file mode 100644 index 0000000..3cade6b --- /dev/null +++ b/arduboy-rust/src/libraries/arduboy2_library/binding.rs @@ -0,0 +1,168 @@ +use core::ffi::{c_char, c_int, c_long, c_size_t, c_uchar, c_uint, c_ulong}; + +extern "C" { + #[link_name = "arduboy_begin"] + pub fn begin(); + + #[link_name = "arduboy_clear"] + pub fn clear(); + + #[link_name = "arduboy_display"] + pub fn display(); + + #[link_name = "arduboy_display_and_clear_buffer"] + pub fn display_and_clear_buffer(); + + #[link_name = "arduboy_draw_fast_hline"] + pub fn draw_fast_hline_raw(x: i16, y: i16, w: u8, color: u8); + + #[link_name = "arduboy_draw_fast_vline"] + pub fn draw_fast_vline_raw(x: i16, y: i16, h: u8, color: u8); + + #[link_name = "arduboy_draw_pixel"] + pub fn draw_pixel_raw(x: i16, y: i16, color: u8); + + #[link_name = "arduboy_draw_circle"] + pub fn draw_circle_raw(x: i16, y: i16, r: u8, color: u8); + + #[link_name = "arduboy_draw_rect"] + pub fn draw_rect_raw(x: i16, y: i16, w: u8, h: u8, color: u8); + + #[link_name = "arduboy_fill_circle"] + pub fn fill_circle_raw(x: i16, y: i16, r: u8, color: u8); + + #[link_name = "arduboy_fill_rect"] + pub fn fill_rect_raw(x: i16, y: i16, w: u8, h: u8, color: u8); + + #[link_name = "arduboy_fill_round_rect"] + pub fn fill_round_rect(x: i16, y: i16, w: u8, h: u8, r: u8, color: u8); + + #[link_name = "arduboy_draw_round_rect"] + pub fn draw_round_rect(x: i16, y: i16, w: u8, h: u8, r: u8, color: u8); + + #[link_name = "arduboy_fill_triangle"] + pub fn fill_triangle(x0: i16, y0: i16, x1: i16, y1: i16, x2: i16, y2: i16, color: u8); + + #[link_name = "arduboy_draw_triangle"] + pub fn draw_triangle(x0: i16, y0: i16, x1: i16, y1: i16, x2: i16, y2: i16, color: u8); + + #[link_name = "arduboy_get_pixel"] + pub fn get_pixel_raw(x: u8, y: u8) -> u8; + + #[link_name = "arduboy_init_random_seed"] + pub fn init_random_seed(); + + #[link_name = "arduboy_just_pressed"] + pub fn just_pressed(button: u8) -> bool; + + #[link_name = "arduboy_just_released"] + pub fn just_released(button: u8) -> bool; + + #[link_name = "arduboy_not_pressed"] + pub fn not_pressed(button: u8) -> bool; + + #[link_name = "arduboy_next_frame"] + pub fn next_frame() -> bool; + + #[link_name = "arduboy_poll_buttons"] + pub fn poll_buttons(); + + #[link_name = "arduboy_pressed"] + pub fn pressed(buttons: u8) -> bool; + + #[link_name = "arduboy_print_chars"] + 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"] + // fn print_char(c: c_char) -> c_size_t; + + #[link_name = "arduboy_print_int"] + pub fn print_int(n: c_int, base: c_int) -> c_size_t; + + #[link_name = "arduboy_print_long"] + pub fn print_long(n: c_long, base: c_int) -> c_size_t; + + #[link_name = "arduboy_print_unsigned_char"] + pub fn print_unsigned_char(n: c_uchar, base: c_int) -> c_size_t; + + #[link_name = "arduboy_print_unsigned_int"] + pub fn print_unsigned_int(n: c_uint, base: c_int) -> c_size_t; + + #[link_name = "arduboy_print_unsigned_long"] + pub fn print_unsigned_long(n: c_ulong, base: c_int) -> c_size_t; + + #[link_name = "arduboy_set_cursor"] + pub fn set_cursor(x: i16, y: i16); + + #[link_name = "arduboy_set_frame_rate"] + pub fn set_frame_rate(rate: u8); + + #[link_name = "arduboy_set_text_size"] + pub fn set_text_size(size: u8); + + #[link_name = "arduboy_audio_on"] + pub fn arduboy_audio_on(); + + #[link_name = "arduboy_audio_off"] + pub fn arduboy_audio_off(); + + #[link_name = "arduboy_audio_save_on_off"] + pub fn arduboy_audio_save_on_off(); + + #[link_name = "arduboy_audio_toggle"] + pub fn arduboy_audio_toggle(); + + #[link_name = "arduboy_audio_enabled"] + pub fn arduboy_audio_enabled() -> bool; + + #[link_name = "arduboy_invert"] + pub fn arduboy_invert(inverse: bool); + + #[link_name = "arduboy_every_x_frames"] + pub fn every_x_frames(frames: u8) -> bool; + + #[link_name = "arduboy_flip_horizontal"] + pub fn flip_horizontal(flipped: bool); + + #[link_name = "arduboy_flip_vertical"] + pub fn flip_vertical(flipped: bool); + + #[link_name = "arduboy_set_text_color"] + pub fn set_text_color(color: u8); + + #[link_name = "arduboy_set_text_background_color"] + pub fn set_text_background_color(color: u8); + + #[link_name = "arduboy_set_cursor_x"] + pub fn set_cursor_x(x: i16); + + #[link_name = "arduboy_set_cursor_y"] + pub fn set_cursor_y(y: i16); + + #[link_name = "arduboy_set_text_wrap"] + pub fn set_text_wrap(w: bool); + + #[link_name = "arduboy_idle"] + pub fn idle(); + + #[link_name = "arduboy_digital_write_rgb_single"] + pub fn digital_write_rgb_single(color: c_uchar, val: c_uchar); + + #[link_name = "arduboy_digital_write_rgb"] + pub fn digital_write_rgb(red: c_uchar, green: c_uchar, blue: c_uchar); + + #[link_name = "arduboy_set_rgb_led_single"] + pub fn set_rgb_led_single(color: c_uchar, val: c_uchar); + + #[link_name = "arduboy_set_rgb_led"] + pub fn set_rgb_led(red: c_uchar, green: c_uchar, blue: c_uchar); + + #[link_name = "arduboy_buttons_state"] + pub fn arduboy_buttons_state() -> u8; + + #[link_name = "arduboy_exit_to_bootloader"] + pub fn arduboy_exit_to_bootloader(); +} diff --git a/arduboy-rust/src/libraries/arduboy2_library/mod.rs b/arduboy-rust/src/libraries/arduboy2_library/mod.rs new file mode 100644 index 0000000..4738d5d --- /dev/null +++ b/arduboy-rust/src/libraries/arduboy2_library/mod.rs @@ -0,0 +1,12 @@ +//! This is the Module to interact in a save way with the Arduboy2 C++ library. +//! +//! All of the functions are safe wrapped inside the [Arduboy2] struct. +#[doc(hidden)] +pub mod arduboy2; +#[doc(hidden)] +pub mod binding; +#[doc(hidden)] +pub mod print; + +pub mod sprites; +pub use arduboy2::{Arduboy2, Color, Point, Rect, FONT_HEIGHT, FONT_WIDTH, HEIGHT, WIDTH}; diff --git a/arduboy-rust/src/print.rs b/arduboy-rust/src/libraries/arduboy2_library/print.rs similarity index 75% rename from arduboy-rust/src/print.rs rename to arduboy-rust/src/libraries/arduboy2_library/print.rs index 3f6ba4c..d4c9623 100644 --- a/arduboy-rust/src/print.rs +++ b/arduboy-rust/src/libraries/arduboy2_library/print.rs @@ -1,4 +1,4 @@ -use crate::prelude::Pstring; +use crate::arduino_system::progmem::Pstring; use core::ffi::c_int; #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] @@ -28,7 +28,7 @@ impl Printable for i16 { fn print_2(self, params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_int(self, params as c_int); + super::binding::print_int(self, params as c_int); } } @@ -42,7 +42,7 @@ impl Printable for u16 { fn print_2(self, params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_unsigned_int(self, params as c_int); + super::binding::print_unsigned_int(self, params as c_int); } } @@ -56,7 +56,7 @@ impl Printable for i32 { fn print_2(self, params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_long(self, params as c_int); + super::binding::print_long(self, params as c_int); } } @@ -70,7 +70,7 @@ impl Printable for u32 { fn print_2(self, params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_unsigned_long(self, params as c_int); + super::binding::print_unsigned_long(self, params as c_int); } } @@ -84,7 +84,7 @@ impl Printable for &[u8] { fn print_2(self, _params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_chars(self as *const [u8] as *const i8); + super::binding::print_chars(self as *const [u8] as *const i8); } } @@ -96,7 +96,7 @@ impl Printable for &str { fn print_2(self, _params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_chars(self.as_bytes() as *const [u8] as *const i8); + super::binding::print_chars(self.as_bytes() as *const [u8] as *const i8); } } @@ -107,7 +107,7 @@ impl Printable for crate::heapless::String { fn print_2(self, _params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_chars(self.as_bytes() as *const [u8] as *const i8); + super::binding::print_chars(self.as_bytes() as *const [u8] as *const i8); } } @@ -119,7 +119,7 @@ impl Printable for Pstring { fn print_2(self, _params: Self::Parameters) { unsafe { - crate::library::arduboy2::print_chars_progmem(self.pointer); + super::binding::print_chars_progmem(self.pointer); } } diff --git a/arduboy-rust/src/library/sprites.rs b/arduboy-rust/src/libraries/arduboy2_library/sprites.rs similarity index 100% rename from arduboy-rust/src/library/sprites.rs rename to arduboy-rust/src/libraries/arduboy2_library/sprites.rs diff --git a/arduboy-rust/src/library/arduboy_tones.rs b/arduboy-rust/src/libraries/arduboy_tones_library/arduboy_tones.rs similarity index 94% rename from arduboy-rust/src/library/arduboy_tones.rs rename to arduboy-rust/src/libraries/arduboy_tones_library/arduboy_tones.rs index 2d3bff0..b790b40 100644 --- a/arduboy-rust/src/library/arduboy_tones.rs +++ b/arduboy-rust/src/libraries/arduboy_tones_library/arduboy_tones.rs @@ -1,13 +1,9 @@ -//!This is the Module to interact in a save way with the ArduboyTones C++ library. -//! -//! You will need to uncomment the ArduboyTones_Library in the import_config.h file. -pub mod tones_pitch; - use core::ffi::{c_uchar, c_uint, c_ulong}; ///This is the struct to interact in a save way with the ArduboyTones C++ library. /// /// You will need to uncomment the ArduboyTones_Library in the import_config.h file. + pub struct ArduboyTones {} impl ArduboyTones { ///Get a new instance of [ArduboyTones] @@ -71,9 +67,9 @@ impl ArduboyTones { /// Example: /// ``` /// use arduboy_rust::prelude::*; - /// const sound:ArduboyTones=ArduboyTones::new(); + /// const sound: ArduboyTones = ArduboyTones::new(); /// progmem!( - /// static sound1:[u8;_]=[220,1000, 0,250, 440,500, 880,2000,TONES_END]; + /// static sound1: [u8; _] = [220, 1000, 0, 250, 440, 500, 880, 2000, TONES_END]; /// ); /// /// sound.tones(get_tones_addr!(sound1)); diff --git a/arduboy-rust/src/libraries/arduboy_tones_library/mod.rs b/arduboy-rust/src/libraries/arduboy_tones_library/mod.rs new file mode 100644 index 0000000..1015d44 --- /dev/null +++ b/arduboy-rust/src/libraries/arduboy_tones_library/mod.rs @@ -0,0 +1,8 @@ +//!This is the Module to interact in a save way with the ArduboyTones C++ library. +//! +//! You will need to uncomment the ArduboyTones_Library in the import_config.h file. +#[doc(hidden)] +mod arduboy_tones; +pub mod tones_pitch; + +pub use arduboy_tones::ArduboyTones; diff --git a/arduboy-rust/src/library/arduboy_tones/tones_pitch.rs b/arduboy-rust/src/libraries/arduboy_tones_library/tones_pitch.rs similarity index 100% rename from arduboy-rust/src/library/arduboy_tones/tones_pitch.rs rename to arduboy-rust/src/libraries/arduboy_tones_library/tones_pitch.rs diff --git a/arduboy-rust/src/library/arduboyfx/drawable_number.rs b/arduboy-rust/src/libraries/arduboyfx_library/drawable_number.rs similarity index 100% rename from arduboy-rust/src/library/arduboyfx/drawable_number.rs rename to arduboy-rust/src/libraries/arduboyfx_library/drawable_number.rs diff --git a/arduboy-rust/src/library/arduboyfx/drawable_string.rs b/arduboy-rust/src/libraries/arduboyfx_library/drawable_string.rs similarity index 95% rename from arduboy-rust/src/library/arduboyfx/drawable_string.rs rename to arduboy-rust/src/libraries/arduboyfx_library/drawable_string.rs index 069eaab..808766f 100644 --- a/arduboy-rust/src/library/arduboyfx/drawable_string.rs +++ b/arduboy-rust/src/libraries/arduboyfx_library/drawable_string.rs @@ -1,5 +1,5 @@ +use crate::libraries::arduino_system::progmem::Pstring; use core::ffi::{c_char, c_uchar, c_ulong}; -use crate::library::progmem::Pstring; pub trait DrawableString where diff --git a/arduboy-rust/src/library/arduboyfx/fx.rs b/arduboy-rust/src/libraries/arduboyfx_library/fx.rs similarity index 100% rename from arduboy-rust/src/library/arduboyfx/fx.rs rename to arduboy-rust/src/libraries/arduboyfx_library/fx.rs diff --git a/arduboy-rust/src/library/arduboyfx/fx_consts.rs b/arduboy-rust/src/libraries/arduboyfx_library/fx_consts.rs similarity index 100% rename from arduboy-rust/src/library/arduboyfx/fx_consts.rs rename to arduboy-rust/src/libraries/arduboyfx_library/fx_consts.rs diff --git a/arduboy-rust/src/library/arduboyfx.rs b/arduboy-rust/src/libraries/arduboyfx_library/mod.rs similarity index 91% rename from arduboy-rust/src/library/arduboyfx.rs rename to arduboy-rust/src/libraries/arduboyfx_library/mod.rs index 57a343c..9f59064 100644 --- a/arduboy-rust/src/library/arduboyfx.rs +++ b/arduboy-rust/src/libraries/arduboyfx_library/mod.rs @@ -1,9 +1,11 @@ //! This is the Module to interact in a save way with the ArduboyFX C++ library. //! //! You will need to uncomment the ArduboyFX_Library in the import_config.h file. -pub mod fx_consts; mod drawable_number; +pub mod fx_consts; +#[doc(hidden)] pub use drawable_number::DrawableNumber; mod drawable_string; +#[doc(hidden)] pub use drawable_string::DrawableString; pub mod fx; diff --git a/arduboy-rust/src/library/arduino.rs b/arduboy-rust/src/libraries/arduino_system/arduino.rs similarity index 100% rename from arduboy-rust/src/library/arduino.rs rename to arduboy-rust/src/libraries/arduino_system/arduino.rs diff --git a/arduboy-rust/src/library/c.rs b/arduboy-rust/src/libraries/arduino_system/c.rs similarity index 100% rename from arduboy-rust/src/library/c.rs rename to arduboy-rust/src/libraries/arduino_system/c.rs diff --git a/arduboy-rust/src/library/eeprom.rs b/arduboy-rust/src/libraries/arduino_system/eeprom.rs similarity index 98% rename from arduboy-rust/src/library/eeprom.rs rename to arduboy-rust/src/libraries/arduino_system/eeprom.rs index d22bebc..30facca 100644 --- a/arduboy-rust/src/library/eeprom.rs +++ b/arduboy-rust/src/libraries/arduino_system/eeprom.rs @@ -1,3 +1,4 @@ +//!This is the module to interact with the eeprom memory use core::ffi::{c_int, c_uchar}; pub const EEPROM_STORAGE_SPACE_START: i16 = 16; diff --git a/arduboy-rust/src/libraries/arduino_system/mod.rs b/arduboy-rust/src/libraries/arduino_system/mod.rs new file mode 100644 index 0000000..b1172b3 --- /dev/null +++ b/arduboy-rust/src/libraries/arduino_system/mod.rs @@ -0,0 +1,7 @@ +//!This module contains all the Arduino system functions to interact with the hardware. + +pub mod arduino; +pub mod c; +pub mod eeprom; +pub mod progmem; +pub mod serial_print; diff --git a/arduboy-rust/src/library/progmem.rs b/arduboy-rust/src/libraries/arduino_system/progmem.rs similarity index 98% rename from arduboy-rust/src/library/progmem.rs rename to arduboy-rust/src/libraries/arduino_system/progmem.rs index 9a1663b..2f30db1 100644 --- a/arduboy-rust/src/library/progmem.rs +++ b/arduboy-rust/src/libraries/arduino_system/progmem.rs @@ -1,3 +1,4 @@ +//!This is the module to interact with the progmem memory #![allow(unused_imports)] /// Create a space for Progmem variable /// ## Example diff --git a/arduboy-rust/src/serial_print.rs b/arduboy-rust/src/libraries/arduino_system/serial_print.rs similarity index 99% rename from arduboy-rust/src/serial_print.rs rename to arduboy-rust/src/libraries/arduino_system/serial_print.rs index 5b82010..0cb3ea5 100644 --- a/arduboy-rust/src/serial_print.rs +++ b/arduboy-rust/src/libraries/arduino_system/serial_print.rs @@ -1,10 +1,10 @@ //! This is the Module to interact in a save way with the Arduino Serial C++ library. //! //! You will need to uncomment the Arduino_Serial_Library in the import_config.h file. -use crate::prelude::Pstring; +use crate::arduino_system::progmem::Pstring; use core::ffi::{c_char, c_int, c_long, c_size_t, c_uchar, c_uint, c_ulong}; -use crate::print::Base; +use crate::libraries::arduboy2_library::print::Base; extern "C" { #[link_name = "arduino_serial_begin"] fn serial_begin(serial: c_ulong); diff --git a/arduboy-rust/src/library/ardvoice.rs b/arduboy-rust/src/libraries/ardvoice_library/ardvoice.rs similarity index 100% rename from arduboy-rust/src/library/ardvoice.rs rename to arduboy-rust/src/libraries/ardvoice_library/ardvoice.rs diff --git a/arduboy-rust/src/libraries/ardvoice_library/mod.rs b/arduboy-rust/src/libraries/ardvoice_library/mod.rs new file mode 100644 index 0000000..34d4b04 --- /dev/null +++ b/arduboy-rust/src/libraries/ardvoice_library/mod.rs @@ -0,0 +1,5 @@ +//! This is the Module to interact in a save way with the ArdVoice C++ library. +//! +//! You will need to uncomment the ArdVoice_Library in the import_config.h file. +mod ardvoice; +pub use ardvoice::ArdVoice; diff --git a/arduboy-rust/src/libraries/mod.rs b/arduboy-rust/src/libraries/mod.rs new file mode 100644 index 0000000..ae60264 --- /dev/null +++ b/arduboy-rust/src/libraries/mod.rs @@ -0,0 +1,5 @@ +pub mod arduboy2_library; +pub mod arduboy_tones_library; +pub mod arduino_system; +pub mod arduboyfx_library; +pub mod ardvoice_library; diff --git a/arduboy-rust/src/library/mod.rs b/arduboy-rust/src/library/mod.rs deleted file mode 100644 index 2ee06c4..0000000 --- a/arduboy-rust/src/library/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub mod arduboy2; -pub mod arduboy_tones; -pub mod arduino; -pub mod ardvoice; -pub mod c; -pub mod eeprom; -pub mod progmem; -pub mod sprites; -pub mod arduboyfx; \ No newline at end of file diff --git a/arduboy-rust/src/prelude.rs b/arduboy-rust/src/prelude.rs index 3228782..f8010dc 100644 --- a/arduboy-rust/src/prelude.rs +++ b/arduboy-rust/src/prelude.rs @@ -5,23 +5,19 @@ //! use arduboy_rust::prelude::*; //! ``` #[doc(inline)] -pub use crate::hardware::buttons::{self, *}; +pub use crate::hardware::buttons::*; #[doc(inline)] -pub use crate::hardware::led::{self, *}; +pub use crate::hardware::led::*; pub use crate::heapless::{LinearMap, String, Vec}; -pub use crate::library::arduboy2::{self, *}; -pub use crate::library::arduboy_tones::{self, ArduboyTones}; -pub use crate::library::arduboyfx::{self, fx}; -pub use crate::library::arduino::*; -pub use crate::library::ardvoice::{self, ArdVoice}; -pub use crate::library::c::*; -pub use crate::library::eeprom::{EEPROM, EEPROMBYTE, EEPROMBYTECHECKLESS}; -#[doc(hidden)] -pub use crate::library::progmem::Pstring; -pub use crate::library::sprites; -pub use crate::print::*; -#[doc(inline)] -pub use crate::serial_print as serial; +pub use crate::libraries::arduboy2_library::*; +pub use crate::libraries::arduboy_tones_library::*; +pub use crate::libraries::arduboyfx_library::*; +pub use crate::libraries::arduino_system::arduino::*; +pub use crate::libraries::arduino_system::c::*; +pub use crate::libraries::arduino_system::eeprom::*; +pub use crate::libraries::arduino_system::progmem::*; +pub use crate::libraries::arduino_system::serial_print as serial; +pub use crate::libraries::ardvoice_library::ArdVoice; pub use crate::{ f, get_ardvoice_tone_addr, get_sprite_addr, get_string_addr, get_tones_addr, progmem, }; diff --git a/import_config.h b/import_config.h deleted file mode 100644 index 3e09dc4..0000000 --- a/import_config.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -// ################# -// # WARNING # -// ################# -// -// ## Read the docs before change here things!! ## -// -// https://zenndev1337.github.io/Rust-for-Arduboy/ -// -// Comment out the libraries you dont need. -// This saves memory but be careful if the libraries are not defined -// it will not export the given functions for the rust project. -// -// to save a good amount you can comment out -// the ArduboyTones library if you don't need it. - -#define Arduboy2_Library ; -// #define ArduboyTones_Library ; -// #define ArduboyFX_Library ; -// #define ArdVoice_Library ; -#define EEPROM_Library ; -#define Arduino_Library ; -// #define Arduino_Serial_Library ; \ No newline at end of file diff --git a/run.py b/run.py new file mode 100644 index 0000000..9c07818 --- /dev/null +++ b/run.py @@ -0,0 +1,220 @@ +import sys +import os +import tomllib +import subprocess +import platform + +# Global Params +param1 = "" +param2 = "" +fx_mode=False +project_list=[] +parameter_validation_check=False +project=[] + +# Functions +def get_args(): + global param1 + global param2 + global fx_mode + if len(sys.argv)==1: + help() + if len(sys.argv)>1: + param1 = sys.argv[1] + if len(sys.argv)>2: + param2 = sys.argv[2] + fx_mode=True + +def help(): + print("Usage build and upload Project:") + print(" run.py list Get a list of all Projects") + print(" run.py new Create a new game in the Project folder") + print(" run.py For uploading a game") + print("") + print("Usage FX-Data build and upload:") + print(" run.py fxbuild Build your fxdata") + print(" run.py fxupload Upload your fxdata") + print(" run.py fxall Build and Upload your fxdata") + print(" and the game in one step") + sys.exit() + +def get_projects(): + global project_list + with open("Cargo.toml", "rb") as f: + data = tomllib.load(f) + path=data["workspace"]["members"] + for p in path: + name = p.split("/")[-1] + if name =="arduboy-rust": + continue + project=[name,p] + project_list.append(project) + +def validate_args(): + global parameter_validation_check + global project + if fx_mode: + for p in project_list: + if param2 in p: + parameter_validation_check=True + project = p + + else: + for p in project_list: + if param1 in p: + parameter_validation_check=True + project = p + if not parameter_validation_check: + help() + +def execute_options(): + if param1=="list": + group="" + for p in project_list: + if not group==p[1].split("/")[-2]: + group=p[1].split("/")[-2] + print(f"\n{group}:") + print(f" {p[0]}") + print("") + exit() + if param1=="new": + create_new_project() + exit() + +def _dumps_value(value): + if isinstance(value, bool): + return "true" if value else "false" + elif isinstance(value, (int, float)): + return str(value) + elif isinstance(value, str): + return f'"{value}"' + elif isinstance(value, list): + return f"[{', '.join(_dumps_value(v) for v in value)}]" + else: + raise TypeError(f"{type(value).__name__} {value!r} is not supported") + +def dumps(toml_dict, table=""): + toml = [] + for key, value in toml_dict.items(): + if isinstance(value, dict): + table_key = f"{table}.{key}" if table else key + toml.append(f"\n[{table_key}]\n{dumps(value, table_key)}") + else: + toml.append(f"{key} = {_dumps_value(value)}") + return "\n".join(toml) + +def create_new_project(): + project_name = param2.replace("-","_") + for p in project_list: + if p[0]==project_name: + sys.exit() + error_code=os.system(f'cargo new --vcs=none --lib ./Project/{project_name}') + if error_code>0: + sys.exit() + # Edit main Cargo.toml + with open("Cargo.toml", "rb") as f: + data = tomllib.load(f) + data["workspace"]["members"].append(f"Project/{project_name}") + with open("Cargo.toml","w") as f: + f.write(dumps(data)) + # Edit new project Cargo.toml + with open(f"Project/{project_name}/Cargo.toml", "rb") as f: + data = tomllib.load(f) + newdata={} + newdata["package"]=data["package"] + newdata["lib"]={'crate-type':["staticlib"]} + newdata["dependencies"]={"arduboy-rust":{"path":"../../arduboy-rust"}} + with open(f"Project/{project_name}/Cargo.toml","w") as f: + f.write(dumps(newdata)) + # Edit lib.rs + with open(f"Project/{project_name}/src/lib.rs","w") as f: + f.write('''#![no_std] +#![allow(non_upper_case_globals)] + +//Include the Arduboy Library +#[allow(unused_imports)] +use arduboy_rust::prelude::*; + +#[allow(dead_code)] +const arduboy: Arduboy2 = Arduboy2::new(); + +// Progmem data + +// dynamic ram variables + +// 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: +} + +// The loop() function repeats forever after setup() is done +#[no_mangle] +#[export_name = "loop"] +pub unsafe extern "C" fn loop_() { + // put your main code here, to run repeatedly: +}''') + +def generate_import_h(): + with open(f"{project[1]}/config.toml", "rb") as f: + data = tomllib.load(f) + strings=["#pragma once\n"] + for lib in data["Libraries"]: + strings.append(f"#define {lib}_Library ;\n") + f = open("arduboy-rust/Wrapper-Project/src/imports.h", "w") + f.writelines(strings) + f.close() + +def upload_to_arduboy(): + if not fx_mode: + game_name=param1 + else: + game_name=param2 + if platform.system()=="Linux": + cmd=f"cargo build -p {game_name} --release; cp ./target/arduboy/release/lib{game_name}.a ./arduboy-rust/Wrapper-Project/lib/libgame.a; cd arduboy-rust/Wrapper-Project/; pio run -v -t upload; cp ./.pio/build/arduboy/firmware.hex ./build/{game_name}.hex; pio run -t clean; rm ./lib/libgame.a; cd ../../" + process = subprocess.Popen(cmd, stdout=subprocess.PIPE) + + elif platform.system()=="Windows": + cmd=f'cargo build -p {game_name} --release; cp ./target/arduboy/release/lib{game_name}.a ./arduboy-rust/Wrapper-Project/lib/libgame.a; cd arduboy-rust/Wrapper-Project/; pio run -v -t upload; cp ./.pio/build/arduboy/firmware.hex ./build/{game_name}.hex; pio run -t clean; rm lib/libgame.a; cd ../../' + process = subprocess.Popen(["powershell", "-Command", cmd], stdout=subprocess.PIPE) + else: + sys.exit() + for c in iter(lambda: process.stdout.read(1),b""): + sys.stdout.buffer.write(c) + if process.returncode != 0: + sys.exit() + +def fx_build(): + error_code=os.system(f'python ./Tools/Arduboy-Python-Utilities/fxdata-build.py ./{project[1]}/fxdata/fxdata.txt') + if error_code>0: + sys.exit() + +def fx_upload(): + error_code=os.system(f'python ./Tools/Arduboy-Python-Utilities/fxdata-upload.py ./{project[1]}/fxdata/fxdata.bin') + if error_code>0: + sys.exit() + +def fx_commands(): + print("") + if param1=="fxbuild": + fx_build() + elif param1=="fxupload": + fx_upload() + elif param1=="fxall": + fx_build() + fx_upload() + upload_to_arduboy() + + +# Execute Script +get_args() +get_projects() +execute_options() +validate_args() + +generate_import_h() + +if fx_mode: + fx_commands() +else: + upload_to_arduboy()