From 7ff01f12e964fd814991a32b162d8f288ef1bb6a Mon Sep 17 00:00:00 2001 From: Luke D Jones Date: Mon, 29 Mar 2021 19:36:30 +1300 Subject: [PATCH] Add extra models to ledmodes - Configurable anime example - Gfx power states as enum Closes #72 --- CHANGELOG.md | 5 + Cargo.lock | 101 +- Cargo.toml | 2 +- asus-notify/Cargo.toml | 2 +- asus-notify/src/main.rs | 3 - asusctl/Cargo.toml | 5 +- asusctl/examples/animatrix-grid.rs | 26 + asusctl/examples/animatrix-outline.rs | 129 ++ asusctl/examples/animatrix-png.rs | 42 + asusctl/examples/animatrix-spinning.rs | 49 + asusctl/examples/animatrix.rs | 44 - asusctl/examples/doom.png | Bin 0 -> 143718 bytes asusctl/examples/ferris.png | Bin 0 -> 25954 bytes asusctl/examples/non-skewed.bmp | Bin 18634 -> 0 bytes asusctl/examples/non-skewed_r.bmp | Bin 18634 -> 0 bytes asusctl/examples/nudoom.png | Bin 0 -> 74119 bytes asusctl/examples/per-key-effect-2.rs | 4 +- asusctl/examples/rust.bmp | Bin 7754 -> 0 bytes asusctl/examples/rust.png | Bin 0 -> 29814 bytes asusctl/examples/test-skinny-45deg.bmp | Bin 2714 -> 0 bytes asusctl/examples/test.bmp | Bin 3162 -> 0 bytes asusctl/examples/test2.bmp | Bin 7754 -> 0 bytes asusctl/src/anime_cli.rs | 94 ++ asusctl/src/main.rs | 77 +- daemon/Cargo.toml | 3 +- daemon/src/ctrl_anime.rs | 89 +- daemon/src/ctrl_fan_cpu.rs | 18 +- daemon/src/ctrl_gfx/error.rs | 2 + daemon/src/ctrl_gfx/gfx.rs | 30 +- daemon/src/ctrl_leds.rs | 2 +- daemon/src/ctrl_supported.rs | 4 +- daemon/src/daemon.rs | 4 +- daemon/src/error.rs | 5 +- rog-anime/Cargo.toml | 25 + rog-anime/LICENSE | 373 ++++++ rog-anime/README.md | 56 + rog-anime/src/anime_data.rs | 62 + rog-anime/src/anime_grid.rs | 165 +++ rog-anime/src/anime_image.rs | 1626 ++++++++++++++++++++++++ rog-anime/src/error.rs | 37 + rog-anime/src/lib.rs | 15 + rog-dbus/Cargo.toml | 3 +- rog-dbus/src/zbus_anime.rs | 16 +- rog-dbus/src/zbus_gfx.rs | 6 +- rog-types/Cargo.toml | 2 +- rog-types/src/anime_matrix.rs | 291 ----- rog-types/src/aura_perkey.rs | 7 +- rog-types/src/cli_options.rs | 57 - rog-types/src/error.rs | 26 + rog-types/src/gfx_vendors.rs | 32 + rog-types/src/lib.rs | 6 - rog-types/src/profile.rs | 2 +- 52 files changed, 2983 insertions(+), 564 deletions(-) create mode 100644 asusctl/examples/animatrix-grid.rs create mode 100644 asusctl/examples/animatrix-outline.rs create mode 100644 asusctl/examples/animatrix-png.rs create mode 100644 asusctl/examples/animatrix-spinning.rs delete mode 100644 asusctl/examples/animatrix.rs create mode 100644 asusctl/examples/doom.png create mode 100644 asusctl/examples/ferris.png delete mode 100644 asusctl/examples/non-skewed.bmp delete mode 100644 asusctl/examples/non-skewed_r.bmp create mode 100644 asusctl/examples/nudoom.png delete mode 100644 asusctl/examples/rust.bmp create mode 100644 asusctl/examples/rust.png delete mode 100644 asusctl/examples/test-skinny-45deg.bmp delete mode 100644 asusctl/examples/test.bmp delete mode 100644 asusctl/examples/test2.bmp create mode 100644 asusctl/src/anime_cli.rs create mode 100644 rog-anime/Cargo.toml create mode 100644 rog-anime/LICENSE create mode 100644 rog-anime/README.md create mode 100644 rog-anime/src/anime_data.rs create mode 100644 rog-anime/src/anime_grid.rs create mode 100644 rog-anime/src/anime_image.rs create mode 100644 rog-anime/src/error.rs create mode 100644 rog-anime/src/lib.rs delete mode 100644 rog-types/src/anime_matrix.rs delete mode 100644 rog-types/src/cli_options.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f80a5fa..ac1b52bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Display PNG images on AniMe with scale, position, angle, and brightness +- AniMe display parts split out to individual crate in preparation for publishing + on crates.io + # [3.3.0] - 2021-04-3 ### Changed - Add ledmodes for G733QS diff --git a/Cargo.lock b/Cargo.lock index b3ee9a81..db0ac285 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,11 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "0.7.15" @@ -34,10 +40,12 @@ dependencies = [ [[package]] name = "asusctl" -version = "3.1.5" +version = "3.3.1" dependencies = [ "daemon", + "glam", "gumdrop", + "rog_anime", "rog_dbus", "rog_types", "serde_json", @@ -197,12 +205,13 @@ dependencies = [ [[package]] name = "daemon" -version = "3.3.0" +version = "3.3.1" dependencies = [ "env_logger", "intel-pstate", "log", "logind-zbus", + "rog_anime", "rog_dbus", "rog_fan_curve", "rog_types", @@ -431,6 +440,15 @@ dependencies = [ "wasi 0.10.2+wasi-snapshot-preview1", ] +[[package]] +name = "glam" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70155b56080764b8b758e91e4c63d06da0262c0c939f2cd991cd1382087147df" +dependencies = [ + "spirv-std", +] + [[package]] name = "gumdrop" version = "0.8.0" @@ -509,6 +527,12 @@ version = "0.2.90" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba4aede83fc3617411dc6993bc8c70919750c1c257c6ca6a502aed6e0e2394ae" +[[package]] +name = "libm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" + [[package]] name = "libudev-sys" version = "0.1.4" @@ -581,6 +605,16 @@ version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "nb-connect" version = "1.0.3" @@ -657,6 +691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -700,6 +735,12 @@ version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +[[package]] +name = "owo-colors" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fe43bf372b08cc9ccee5144715db59c79ab00168bbe4cf0d274dc0d5f64d7f" + [[package]] name = "parking" version = "2.0.0" @@ -718,12 +759,28 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pix" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea9d5c668f13b4a1b97d848780e00cfabf76eb83538129c264c0c6d6a968047" + [[package]] name = "pkg-config" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" +[[package]] +name = "png_pong" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75851150081bd473079e03e2fa00e25557bcb19706e502b095ca71ce392b70ff" +dependencies = [ + "miniz_oxide", + "pix", +] + [[package]] name = "polling" version = "2.0.2" @@ -887,9 +944,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" [[package]] -name = "rog_dbus" -version = "3.1.0" +name = "rog_anime" +version = "1.0.0" dependencies = [ + "glam", + "owo-colors", + "pix", + "png_pong", + "serde", + "serde_derive", + "zvariant", + "zvariant_derive", +] + +[[package]] +name = "rog_dbus" +version = "3.2.0" +dependencies = [ + "rog_anime", "rog_fan_curve", "rog_types", "serde_json", @@ -1044,6 +1116,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "spirv-std" +version = "0.4.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6de6f1b80004dfc3e9e02fdf8eb32c663f3b85e3942f39d02b6540ed0d2460dd" +dependencies = [ + "num-traits", + "spirv-std-macros", +] + +[[package]] +name = "spirv-std-macros" +version = "0.4.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4972082b5236fd57a46cc47fbc315ad78b5ad07b33e51077c688a2fe28d6f2d" +dependencies = [ + "proc-macro2", + "quote 1.0.9", + "syn 1.0.64", +] + [[package]] name = "strum" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 9462e627..3c6d9912 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["asusctl", "asus-notify", "daemon", "rog-types", "rog-dbus"] +members = ["asusctl", "asus-notify", "daemon", "rog-types", "rog-dbus", "rog-anime"] [profile.release] lto = true diff --git a/asus-notify/Cargo.toml b/asus-notify/Cargo.toml index 24b320bf..38bf2ad1 100644 --- a/asus-notify/Cargo.toml +++ b/asus-notify/Cargo.toml @@ -14,6 +14,6 @@ rog_types = { path = "../rog-types" } daemon = { path = "../daemon" } [dependencies.notify-rust] -version = "^4.0" +version = "^4.3" default-features = false features = ["z"] \ No newline at end of file diff --git a/asus-notify/src/main.rs b/asus-notify/src/main.rs index 01dd7206..0d0c71aa 100644 --- a/asus-notify/src/main.rs +++ b/asus-notify/src/main.rs @@ -9,9 +9,6 @@ fn main() -> Result<(), Box> { println!(" daemon version {}", daemon::VERSION); println!(" rog-dbus version {}", rog_dbus::VERSION); - // let mut cfg = Config::read_new()?; - // let mut last_profile = String::new(); - let (proxies, conn) = DbusProxies::new()?; let signals = Signals::new(&proxies)?; diff --git a/asusctl/Cargo.toml b/asusctl/Cargo.toml index 293e06a7..5145ddfe 100644 --- a/asusctl/Cargo.toml +++ b/asusctl/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "asusctl" -version = "3.1.5" +version = "3.3.1" authors = ["Luke D Jones "] edition = "2018" @@ -9,13 +9,14 @@ edition = "2018" [dependencies] # serialisation serde_json = "^1.0" +rog_anime = { path = "../rog-anime" } rog_dbus = { path = "../rog-dbus" } rog_types = { path = "../rog-types" } daemon = { path = "../daemon" } gumdrop = "^0.8" yansi-term = "^0.1" - [dev-dependencies] tinybmp = "^0.2.3" +glam = "*" rog_dbus = { path = "../rog-dbus" } \ No newline at end of file diff --git a/asusctl/examples/animatrix-grid.rs b/asusctl/examples/animatrix-grid.rs new file mode 100644 index 00000000..1773d088 --- /dev/null +++ b/asusctl/examples/animatrix-grid.rs @@ -0,0 +1,26 @@ +use rog_anime::{AniMeDataBuffer, AniMeGrid}; +use rog_dbus::AuraDbusClient; + +// In usable data: +// Top row start at 1, ends at 32 + +fn main() { + let (client, _) = AuraDbusClient::new().unwrap(); + let mut matrix = AniMeGrid::new(); + { + let tmp = matrix.get_mut(); + for row in tmp.iter_mut() { + row[row.len() - 33] = 0xff; + + row[row.len() - 22] = 0xff; + + row[row.len() - 11] = 0xff; + + row[row.len() - 1] = 0xff; + } + } + + let matrix = ::from(matrix); + + client.proxies().anime().write(matrix).unwrap(); +} diff --git a/asusctl/examples/animatrix-outline.rs b/asusctl/examples/animatrix-outline.rs new file mode 100644 index 00000000..5efd207a --- /dev/null +++ b/asusctl/examples/animatrix-outline.rs @@ -0,0 +1,129 @@ +use rog_anime::AniMeDataBuffer; +use rog_dbus::AuraDbusClient; + +// In usable data: +// Top row start at 1, ends at 32 + +fn main() { + let (client, _) = AuraDbusClient::new().unwrap(); + let mut matrix = AniMeDataBuffer::new(); + matrix.get_mut()[1] = 100; // start = 1 + for n in matrix.get_mut()[2..32].iter_mut() { + *n = 250; + } + matrix.get_mut()[32] = 100; // end + matrix.get_mut()[34] = 100; // start x = 0 + matrix.get_mut()[66] = 100; // end + matrix.get_mut()[69] = 100; // start x = 1 + matrix.get_mut()[101] = 100; // end + matrix.get_mut()[102] = 100; // start + matrix.get_mut()[134] = 100; // end + matrix.get_mut()[137] = 100; // start + matrix.get_mut()[169] = 100; // end + matrix.get_mut()[170] = 100; // start + matrix.get_mut()[202] = 100; // end + matrix.get_mut()[204] = 100; // start + matrix.get_mut()[236] = 100; // end + matrix.get_mut()[237] = 100; // start + matrix.get_mut()[268] = 100; // end + matrix.get_mut()[270] = 100; // start + matrix.get_mut()[301] = 100; // end + matrix.get_mut()[302] = 100; // start + matrix.get_mut()[332] = 100; // end + matrix.get_mut()[334] = 100; // start + matrix.get_mut()[364] = 100; // end + matrix.get_mut()[365] = 100; // start + matrix.get_mut()[394] = 100; // end + matrix.get_mut()[396] = 100; // start + matrix.get_mut()[425] = 100; // end + matrix.get_mut()[426] = 100; // start + matrix.get_mut()[454] = 100; // end + matrix.get_mut()[456] = 100; // start + matrix.get_mut()[484] = 100; // end + matrix.get_mut()[485] = 100; // start + matrix.get_mut()[512] = 100; // end + matrix.get_mut()[514] = 100; // start + matrix.get_mut()[541] = 100; // end + matrix.get_mut()[542] = 100; // start + matrix.get_mut()[568] = 100; // end + matrix.get_mut()[570] = 100; // start + matrix.get_mut()[596] = 100; // end + matrix.get_mut()[597] = 100; // start + matrix.get_mut()[622] = 100; // end + matrix.get_mut()[624] = 100; // start + matrix.get_mut()[649] = 100; // end + matrix.get_mut()[650] = 100; // start + matrix.get_mut()[674] = 100; // end + matrix.get_mut()[676] = 100; // start + matrix.get_mut()[700] = 100; // end + matrix.get_mut()[701] = 100; // start + matrix.get_mut()[724] = 100; // end + matrix.get_mut()[726] = 100; // start + matrix.get_mut()[749] = 100; // end + matrix.get_mut()[750] = 100; // start + matrix.get_mut()[772] = 100; // end + matrix.get_mut()[774] = 100; // start + matrix.get_mut()[796] = 100; // end + matrix.get_mut()[797] = 100; // start + matrix.get_mut()[818] = 100; // end + matrix.get_mut()[820] = 100; // start + matrix.get_mut()[841] = 100; // end + matrix.get_mut()[842] = 100; // start + matrix.get_mut()[862] = 100; // end + matrix.get_mut()[864] = 100; // start + matrix.get_mut()[884] = 100; // end + matrix.get_mut()[885] = 100; // start + matrix.get_mut()[904] = 100; // end + matrix.get_mut()[906] = 100; // start + matrix.get_mut()[925] = 100; // end + matrix.get_mut()[926] = 100; // start + matrix.get_mut()[944] = 100; // end + matrix.get_mut()[946] = 100; // start + matrix.get_mut()[964] = 100; // end + matrix.get_mut()[965] = 100; // start + matrix.get_mut()[982] = 100; // end + matrix.get_mut()[984] = 100; // start + matrix.get_mut()[1001] = 100; // end + matrix.get_mut()[1002] = 100; // start + matrix.get_mut()[1018] = 100; // end + matrix.get_mut()[1020] = 100; // start + matrix.get_mut()[1036] = 100; // end + matrix.get_mut()[1037] = 100; // start + matrix.get_mut()[1052] = 100; // end + matrix.get_mut()[1054] = 100; // start + matrix.get_mut()[1069] = 100; // end + matrix.get_mut()[1070] = 100; // start + matrix.get_mut()[1084] = 100; // end + matrix.get_mut()[1086] = 100; // start + matrix.get_mut()[1100] = 100; // end + matrix.get_mut()[1101] = 100; // start + matrix.get_mut()[1114] = 100; // end + matrix.get_mut()[1116] = 100; // start + matrix.get_mut()[1129] = 100; // end + matrix.get_mut()[1130] = 100; // start + matrix.get_mut()[1142] = 100; // end + matrix.get_mut()[1144] = 100; // start + matrix.get_mut()[1156] = 100; // end + matrix.get_mut()[1157] = 100; // start + matrix.get_mut()[1168] = 100; // end + matrix.get_mut()[1170] = 100; // start + matrix.get_mut()[1181] = 100; // end + matrix.get_mut()[1182] = 100; // start + matrix.get_mut()[1192] = 100; // end + matrix.get_mut()[1194] = 100; // start + matrix.get_mut()[1204] = 100; // end + matrix.get_mut()[1205] = 100; // start + matrix.get_mut()[1214] = 100; // end + matrix.get_mut()[1216] = 100; // start + matrix.get_mut()[1225] = 100; // end + matrix.get_mut()[1226] = 100; // start + matrix.get_mut()[1234] = 100; // end + matrix.get_mut()[1236] = 100; // start + for n in matrix.get_mut()[1237..1244].iter_mut() { + *n = 250; + } + matrix.get_mut()[1244] = 100; // end + println!("{:?}", &matrix); + + client.proxies().anime().write(matrix).unwrap(); +} diff --git a/asusctl/examples/animatrix-png.rs b/asusctl/examples/animatrix-png.rs new file mode 100644 index 00000000..dc6619a3 --- /dev/null +++ b/asusctl/examples/animatrix-png.rs @@ -0,0 +1,42 @@ +use std::{env, error::Error, path::Path, process::exit}; + +use rog_anime::{ + AniMeDataBuffer, {AnimeImage, Vec2}, +}; +use rog_dbus::AuraDbusClient; + +fn main() -> Result<(), Box> { + let (client, _) = AuraDbusClient::new().unwrap(); + + let args: Vec = env::args().into_iter().collect(); + if args.len() != 8 { + println!( + "Usage: " + ); + println!("e.g, asusctl/examples/doom_large.png 0.9 0.9 0.4 0.0 0.0, 0.8"); + println!("All args except path and fineness are floats"); + exit(-1); + } + + let matrix = AnimeImage::from_png( + Path::new(&args[1]), + Vec2::new( + args[2].parse::().unwrap(), + args[3].parse::().unwrap(), + ), + args[4].parse::().unwrap(), + Vec2::new( + args[5].parse::().unwrap(), + args[6].parse::().unwrap(), + ), + args[7].parse::().unwrap(), + )?; + + client + .proxies() + .anime() + .write(::from(&matrix)) + .unwrap(); + + Ok(()) +} diff --git a/asusctl/examples/animatrix-spinning.rs b/asusctl/examples/animatrix-spinning.rs new file mode 100644 index 00000000..73bd8f2e --- /dev/null +++ b/asusctl/examples/animatrix-spinning.rs @@ -0,0 +1,49 @@ +use std::{ + env, error::Error, f32::consts::PI, path::Path, process::exit, thread::sleep, time::Duration, +}; + +use rog_anime::{ + AniMeDataBuffer, {AnimeImage, Vec2}, +}; +use rog_dbus::AuraDbusClient; + +fn main() -> Result<(), Box> { + let (client, _) = AuraDbusClient::new().unwrap(); + + let args: Vec = env::args().into_iter().collect(); + if args.len() != 8 { + println!("Usage: "); + println!("e.g, asusctl/examples/doom_large.bmp 0.9 0.9 0.4 0.0 0.0, 0.8"); + println!("All args except path and fineness are floats"); + exit(-1); + } + + let mut matrix = AnimeImage::from_png( + Path::new(&args[1]), + Vec2::new( + args[2].parse::().unwrap(), + args[3].parse::().unwrap(), + ), + args[4].parse::().unwrap(), + Vec2::new( + args[5].parse::().unwrap(), + args[6].parse::().unwrap(), + ), + args[7].parse::().unwrap(), + )?; + + loop { + matrix.angle += 0.05; + if matrix.angle > PI * 2.0 { + matrix.angle = 0.0 + } + matrix.update(); + + client + .proxies() + .anime() + .write(::from(&matrix)) + .unwrap(); + sleep(Duration::from_micros(500)); + } +} diff --git a/asusctl/examples/animatrix.rs b/asusctl/examples/animatrix.rs deleted file mode 100644 index dcaa4106..00000000 --- a/asusctl/examples/animatrix.rs +++ /dev/null @@ -1,44 +0,0 @@ -use rog_dbus::AuraDbusClient; -use rog_types::anime_matrix::{AniMeImageBuffer, HEIGHT, WIDTH}; -use tinybmp::{Bmp, Pixel}; - -fn main() { - let (client, _) = AuraDbusClient::new().unwrap(); - - let bmp = Bmp::from_slice(include_bytes!("rust.bmp")).expect("Failed to parse BMP image"); - let pixels: Vec = bmp.into_iter().collect(); - //assert_eq!(pixels.len(), 56 * 56); - - // Try an outline, top and right - let mut matrix = AniMeImageBuffer::new(); - - // Aligned left - for (i, px) in pixels.iter().enumerate() { - if (px.x as usize / 2) < WIDTH && (px.y as usize) < HEIGHT && px.x % 2 == 0 { - let c = px.color as u32; - matrix.get_mut()[px.y as usize][px.x as usize / 2] = c as u8; - } - } - - // Throw an alignment border up - { - let tmp = matrix.get_mut(); - for x in tmp[0].iter_mut() { - *x = 0xff; - } - for (i, row) in tmp.iter_mut().enumerate() { - if i % 2 == 0 { - let l = row.len(); - row[l - 1] = 0xff; - } - } - } - - matrix.debug_print(); - - //let mut matrix: AniMePacketType = AniMePacketType::from(matrix); - // println!("{:?}", matrix[0].to_vec()); - // println!("{:?}", matrix[1].to_vec()); - - client.proxies().anime().write_image(matrix).unwrap(); -} diff --git a/asusctl/examples/doom.png b/asusctl/examples/doom.png new file mode 100644 index 0000000000000000000000000000000000000000..a4853c5a84da99aa598faff817226b481d68c9e7 GIT binary patch literal 143718 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�Q$42!fEd93}Y{jQnta;R|!p>8R_;!(}8lsPRO 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

N&@9sH8I~mKr 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 literal 0 HcmV?d00001 diff --git a/asusctl/examples/ferris.png b/asusctl/examples/ferris.png new file mode 100644 index 0000000000000000000000000000000000000000..e20a802f15365d61ddbbe540c72185cdf4bdba8d GIT binary patch literal 25954 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 S!h`2?=FFMn-E%qRjsJfp`>yc- diff --git a/asusctl/examples/non-skewed_r.bmp b/asusctl/examples/non-skewed_r.bmp deleted file mode 100644 index 2fb40a236afd43e791f95fb7bb9f0f8bdc98d9b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18634 zcmeI2NoZ9`6oxbCGVa7}F9eq^bg2+yprg{8-UtzO;ediD+75_~IDn!qLUbWfQE@;; zMN||NML}_h^BA1LdBQ2qQ}z4G{Fi!lhnLp8y!X0q;Y-!6I(6zl=bk!s>RfC7Xs#=> zWpU>3-o=wf~fBvPB_SO|)!VE{aroU7N zsSTtyklH|M1E~$9HjvstY6Gbaq&AS+KxzZ24Wu@Z+CXXpsSTtyklH|M1E~$9HjvuD z|HTG|4I5@^YiomVL~GZsHT)z$WA*j*!L$1R3w32>Wgu7Au3c^W-o1O~)vH&gfB*hw z(4ax))2C1NN1Hyzph5mFUAhGGU0$WEn^UJwS@}kd8f69#9&EmS`(`M&Zrw6BZrreK z{?Mk60u8jIM~}91PoF*==%ti(0rsa)pIR9|fBtOkz&^C&4|c;G%9AHgN>(4^#*H&y zzI-v*#gZjUY}*(A_3PK>^5x6s`}gnuP~;_Uu{vzLzaqW*QqC4R({OU{kEY zT6_2IHLP81Izbmn1sNVadSq6vTxs6Fe{V_U8`iB`XXUwg@nRB-*fG{FHhu7};>yE^ z56zr8a{|oO)z#*}fdkft9zT9;`|&kDTUfhT^nqVvFJr$^<;amEA*_BJaqir?sHwK^ z-Me==&m`6cLoxVRd_5)VoLIhmxz$BQMMX#_dY|}@r~Lx6ni?}=#0Ycu?p=HK zE?l@UbY5v~u!wJ=>Nq=>F3QWxV==O4;)>!^*;21wz0C08!!54~6DEXo0w1sxLJz{o z+QbBYIePS{#g(LsZr!>Cv8X?vXJU5vyYV{D@a);Mr+M?{O=uceqz@OP`tn&57ZG=A zzX%+@lXa8!h;W@he_qof>qCbQ1@dVQ^^_@7Ed8ZRm&}eGJA(5HEX1*ei0$v+zaNr; zee9kit_)G_`Sa(8c=#Rt`t=Lx0{8o z!Cy?BIyDRH$&)8FJ+huTb7mGjykEY2X=%4^-D;*!pKjwCO$HNpK!2b4m^%8IyC?T8 zw=7z;D1=?>a#vAtb;9}4+S;n2P(5whv=C3?4aIc+1TYO5G9)xdI6Ar}PlNB*o!!NQ zKk3n5=orix&o7ef##cbJ=hB zZeKTG10#8-j+Wo&NA3#Wuk!ZoTbs*Tzka>#qIT!R#o%Ceb6{V;eih4{HG1jOr%#~o z-Me>(=77=7!MT_^x=jvCc^lW4Ba<5wF&0(Oh2j&i;g1wkMbSs~ZQQsq(EExNE3!zy z2F8w-JB}ZDJ>|7Ne*9?W&Yf%Twt&LdF)uFeL>H@9ueLNglP_GjkR?xh9(1k?qdNy| zVANPXYx2In9~G8;`}SE3N%xVfSFc(c`Ifl&Ry^Zse1 z_}U}i_U+p(ZQNPQSu}9qK(lJqDqqat8Q<;76%4dBI!hm5aQBOFkjshlouW~VuZW80 z7(aOMV3wSI{3{-^Md?KS)a;kKy1FbrqRU6^`cvU>&m8sr+giHNUWz-1@!La(4h_y1 zVm7yQra$%1TNlT#w28rachW^uQ&a4j>Cw#g)ckWnS z=uV0*;^GnMLT3{?bYow5cV;}M{TCIlyK-{Jg7*6L>uz^!o4hdeOP4NsQL@@su3QOpDVe%=?`~;0f7GW*TAMXBR;W7ZdlYv4{Q2`N z+a{+tdGh3}KFLLm?I4S9Q}j{DA=BQxd9!`ykG@BZA3wg}`p|nw`d*38Aop|p_;D+P z8!rSxWg6Uz;U`}s-kc+@@03kyZZUnY6y~Jw*~)j!o;_P4glg>(Ul+s|QD>^lK(U;# z6hp25??7${`_-NXH#tzg;orV}+Z7{d6R!^#Fu>;C8yXr6d2?cLa!pYM-mHOL@E(fs z|2w$vgm26FE@Q`zEgE0p${y9m$Fj#c|A-0v{r)q$f(N|dNxPVQXOs?-`iL1R_<>x$ zz||GB^1bZ2q%}%ujM$#LKldzhYuv{v+-a1T=9#wcInY4M9Ok-t{8EzL$LhxRKlA@_ fH3z;fFMpj`+O<`AX diff --git a/asusctl/examples/nudoom.png b/asusctl/examples/nudoom.png new file mode 100644 index 0000000000000000000000000000000000000000..7b8d3a7bdd1196ee8b825291979a2c5e7c48a005 GIT binary patch literal 74119 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 z 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 Result<(), Box> { loop { let count = 49; for _ in 0..count { - *key_colours.key(Key::ROG).unwrap().0 += 5; + *key_colours.key(Key::Rog).unwrap().0 += 5; *key_colours.key(Key::L).unwrap().0 += 5; *key_colours.key(Key::I).unwrap().0 += 5; *key_colours.key(Key::N).unwrap().0 += 5; @@ -19,7 +19,7 @@ fn main() -> Result<(), Box> { dbus.proxies().led().set_per_key(&key_colours)?; } for _ in 0..count { - *key_colours.key(Key::ROG).unwrap().0 -= 5; + *key_colours.key(Key::Rog).unwrap().0 -= 5; *key_colours.key(Key::L).unwrap().0 -= 5; *key_colours.key(Key::I).unwrap().0 -= 5; *key_colours.key(Key::N).unwrap().0 -= 5; diff --git a/asusctl/examples/rust.bmp b/asusctl/examples/rust.bmp deleted file mode 100644 index a079736bb99239231c0a7b86a2821c9586061e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7754 zcmeHLM@Xef5PrLR_Ug%977rdh2*O?j84zK?gDYM{(37aBs0(Ajcu)+CA_!*1fS@9R z;$T(;F(G0WvoM%Z%-P=e^=$pr-|v4(oxQBZ`(LL@U0vN(-Jb&f{LLhx!2F+P{@l&q zALj2T)9=9G#r5^I@b>l=i;Ii$LmhoVK|w$KoN8}x7pbYK;>(vW z0`T?gS8;cDCqL8yMMXs-EiFv|_ea@fZf;JToScZ!(NQVW=nrGS0q%S25gQvTd2VcM z7>PFQ11|I++V{{2>)zYjD^5>OHJJ|&58~UmZ(3We0JpENPx{Pz=l~v9S68YSxi-GO zzT)NO#bS(ifcCxgxVX6BtYy8ct4s2~zrPm;2M6Nz_SOOi9iV-y9{c$Up8FH|@>I+Ews)6+_AT~UTU*muJwHFodGk4ymzRr_loSoeRt3B`ts`~p z(Y?JronH(M4H@!TU0v0QhrbLC4hrZEA0~jGI3kopuB9=7@-A|f!UhIIWZFSVVRm?-$VVEt7bYOk-aYciCFD)&V zXD;G0(K%A8XJbRWP@KxEnjSMVGZwV)mxYA|t$$}{N5ehXq)ZtM<>&&vTaI=H^DYySr=jJf?y-=%b>dbTqsH8$?G( zOT5m`PK}Q$S8W3q0NY}|$TJHH3M4(*g5LY}MlJZm!4-bd+K<jTECwvn2S8V}3ii?XSZ`_^ifwQ@C zTwI*Ii-0fY3wu{rR|_?!k}WVN*vuZ}=jS_R5A1agh+{^!!1)Lr5IZO@<8*4BY-evR zXq@YTz2fQVY2g=;fxU@%s@ei)IQcr)B{w(MDSPmBfsYv3g7_o0a9bQ69!j4|NJtch(MsWu4Gl*<&tE7FaW8^>swm{AU-U9;z zI*RS>ZKrKvw6;2?RvKgr_ze7tLq|u4)PwZ2Wd|Bl&vnkvS{?Z($)L9f!o}M9`T0pb z)I5!38kK6CBYrqz5xb3m_KuM)utp>&FE3B4Q=hGp$99t6Iy1;YtCfpWyufv<>?Ch-5 zdO#+>M`7*NT-%mS$QI$@;TCxbpN}JT^;AiuR*_~pSp)35dMNV%-=B4PkuqX)6>(X?5e6NS-$2ShIpy(QdlqK zD74;?4^V9Zdi70$a&O}8OsT%p(OsVBKhQ(91>TNSztaL!1u7W0OWymCXpPz mM?ynG1@6@xKnosku?OkI&sg{e2jsMvKXQ82PQU{#@%aau0~{>? diff --git a/asusctl/examples/rust.png b/asusctl/examples/rust.png new file mode 100644 index 0000000000000000000000000000000000000000..e9a4c2e37547372823a2740421543c6a44a7c692 GIT binary patch literal 29814 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 _Il%gsJhq!VR_LXI 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 literal 0 HcmV?d00001 diff --git a/asusctl/examples/test-skinny-45deg.bmp b/asusctl/examples/test-skinny-45deg.bmp deleted file mode 100644 index 4e6cf9f3850e6414e1ad9f4d77d8e9e98122f513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2714 zcmeH{e^69a6vsaXQ{-f`W!78q7t2hFKaeFFSqz&N90amPG?gDh3AO23CM(L1tme6v z22U$DF(EJ%O+joz%3w*$uo)UjP_#+S9Cai5u{DZjx{vO{48pEEQ~!5n?wfnh_nvdl z`JQv0apso6^hmxxED^gAVnvEIh=3mbnA;&Zw08-m8^9QsWa$C_!{;`yyMq|Dx&cj0 z21W1HVVp6SDNTQ4mbWo1a{~doFshGUM~Z!&_-6|kxBW+gf+u1v`;?8fr${jEC3E$0 z#$@ehvN4$;TN|2)R6?g)nY^!yj~ZGydGQ)j_BNJVD+maWBQs|gL1D8o&R@r47gYl8 z9Yt35D{TMj0-D(?2usRAsqCQPqKiojZN#mpMsGccMQKMfXAKeJ4c+qnBDN@^wmZnT z?O@}+t3=LTi!^*RBaKfpE4zeX{R~257IUDzi)rmDx;5Wn+;@d{c78$J`~}D#{7mkq z(`e_cL%;kJ;-A~hokPbHm{rcC%0Ee3^dW{h@1u!YKwQS#3=N*jSX&1=%TX+AJ|?&L zPs-~4KyUA2vEBj+l)Tk!09fPq>McD z;vH*MClf5Yhm1Th(6+?_Oy$=htHx^Un2PB&&acV z#ep+7Sd?GF^o(8HewUW9CEsCv?-;{Vi?}Z+jEa3H2pS(l?7Up=k9v*J>hqY_|3G9) z9s$}(jGg)d<~5CEt~!GAN;gNG-GpS-vAVpCn&xX5XJs=yDUZbVZl1W%%~Pfvl2`2I z)bBTlu69x)`b62?G0D7*iFtc? zxb#P?JCCuau>)iBRSuCqcF|R#A z%gIZ`Jek4hC3ZBauXD%vN3k{h#r@-B8CUuXW%euR4bvGGqUQtqDT;Pn#j?HwtF4N+ zcO6IGb`9$mr|@|UYw?$8?viNy#!2PjztO~J^48XR0)(w5xq$GZ!$g#{^XM6sSP_T* z<^9ZEx?9w*jge`)8Ifo~llTJh>G^~#X+TOTz}Tds-+lqZbTLb!FEm3(U|6_boU@Rk z(n)&e4GfQG6C!-KoVki-cqj=qP7E{GiX1BmQBGrBUxV>Cm4qYRJbtE|M6tJ4-JtHc z3+bU8QnI&jS#T9(ZT9*b{IBrMfWP=R`;ewq-&8i)?M*(+C~uZ^zAzkGr%#M#HP9#M zaB6*G1ggj3B~Lspuu-U*S`{SEOs1?4_XPVt!*qcDH zYU&t>>Eu8p#jUIN%3sn3U~*$a6ltIpIQ_tE7g|60*MV3$N+BpULaTTt@4$pe`&InW z+6J0AO#UJ?w@XRqS)^v!oskkPX192t6%M<32y}|r3l-1$^=8y5pTkdabJ|ZL?5(lx zqp~txF}W%2CpuX?QdogmRlHo<-5EK}f-JeEpNV@LtD2!pEdyPBng@m?m*K028f#5{ zYNx22r;#`xHOaDY>+q|%1*ntNbTHKl0{Tl+y*R~6g0pE_Q+9tugr;=}g-(`44|&p6 ztoHO&>4H4(azEc{cN?CQ?Ov4hO-_yK?gtNX*f+X02UU-9_gri4c~R#XNDt<4iq4aK zj9s95cdpi}CwuI~APeVNVc& diff --git a/asusctl/examples/test.bmp b/asusctl/examples/test.bmp deleted file mode 100644 index 1d5824d6f8619dc5d9cf33a6ec389aa10fd76a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3162 zcmeH{dr*{B7>6GlC%49$EiWx3>cULAD9CO!vY0t7FbJzQE_h){DcN##y^O3lT(oI) zQLF_sH*XN4fQFzp3S|Lld1;0QGZ1wW(iycVr^rz>m0db4%Voq5wy8hcne(0Vo%cDv z-}|0(zST`P4#xFM8wg9p$XB!w(FP!M&0iS=et{iLOtuHmMH(!w;6Hdg){7m$$aNLS z!xFIVC`UJSHWN?X$Go_o0AMQuHfC958JYzD!?!*}ITky|LCg+G&K z-^-S=yM)AKqVOJtkM0d-CgtF#o=RZYVvg0f@JhWC-;9gs%I@&tzORX#JCC)ye<<#BUN~>`nMu&SJ?pOv<*K zyA3S<82I82C=8?JWBsC!snzgJoH@xORr+i{)rG{Dl)GC z#!Om@IirfiH8nKfX``mO4V9^!b-QXgSbY!O%p|-Gsp#w5m~pL*SqqbiTXl#_f3z~W zw3!@nPqOlVK$G=7G0Trr{fh%lR2)J24fv#$l4je3Dg7`{dyN)*@*~N%D#~kbpwP_2 zxZ-^VKKT^SEwY38$BwXa7UVW6=%lC`( ztHtN_{fy9Ckn5KcH9rm2k_r^Ybabbjs0**5jS%0GxEJyvBhW6$7Vjn$q4P1kxdH98 zBveBCOygbT-ho6PY(_ghQ`A_5Dyso&_Ca*NJBhAoV_IVydNH<^v{HV~f#Stvj7dAW zE%r)jt?u=2@c)E|JK*e}b9%(|4>|v9p*}6$ZXPiGq~#KlWI6)vj3go=t}H|+$#jM~ z`$wHhmq%YRxbu*7>WI6-l1z7067fWa_OiRR9#xYI>4)i7_*dC@EaOT?(#jnWoh0I} zr@eMb#uaFPNFyD4*9AUu`&^8qN!OA-66wi^v7}bVhty{_?zQcmv`jbT0V9dDJ9K8$ z(RbC+W6;g?n0$EXhWfDTH0u*_Lmn{wATA+~n1?Ir_1;;3uRxE9ew_sC0pkJUiHsEU EH`uRYFaQ7m diff --git a/asusctl/examples/test2.bmp b/asusctl/examples/test2.bmp deleted file mode 100644 index 589295a706367380d936b3199c2917be4489251e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7754 zcmds+T}V|~6vyw(Jp1aC4TA$d_~1hz2qH)z;)sYNif=v$K7I@@z` zfBo)KpM3Z4T=x~|zQWwsFRnjazq!Z3GcMPkAzv={^xu!TTwi{e%em;kv-BNb$6vo) z=$44o|MwLh9xn0m@u$AetgI}lsHiwqI|2d%FGH&Oz=x#VWG^=&&%}m^r>M27Z4W@9z2kRg@t1=!G})s zMqpr|C-We2odY^Z4;&sjsh>_wV1U^$7_H);ewXNynI&80qit zmlrQy$kx`DynOlc8$Jh<`}gmwdrzJ`k-fb=<5(0G6)FATfUeEWO}TUDj@aWBOfFrz zq-;GnIFRx2aicXbA|gUz0nP;l1%ge)-@w3tz-4xf&z?Q2{I4TwK05d;u3lM@K6@Y-?+?_Se_fCu?hK!v5LgjT<*4EiFy; zL~w`6J`pactE*Eo;V=A-PB@jCM*qVczqGctDlDq2tJO0n#oya=<>loHd;F{~)?K@H zP1SgEmpSl{k^I2?%lhpuef*bo|O+{V`H+hu_5QrpSSdptHdS#0v}WQwH)#kuB4U{59nE4 zT~)E5*MJkXM9-ZV$wPb(KXi3Kcv z_FCi~d!%=onVIn_n?7i8a8TtAoC$}J&)#g-IR5CU?SP}`CE!JG@`(rdggpNA>62G` ze^j^Udi(+>^M1(rmN&dLCd4Z?d$ZM3?n&nKTEquuIsb*p>({Rx>9@4a^jh%4ahTA1 zCMPEgF>CJw^z$Z1PfRqQ5JU78DJdzA)H2UK5GUR+v7hC5_NbmROwH|>kfYQ)eU{^m z=S=DKlw-$)`Ub!0vmAS`?D?D%b1)%ih*{1QoH)zz#cnX6-oUSihlh^x#rNzXN0yhD z6&B>`_tragpS%DIC(d$wwVAUV&TyPM%kk9?c$5CZ^jVIt`t`cp++0V_a Result { + let s = s.to_lowercase(); + match s.as_str() { + "on" => Ok(AniMeStatusValue::On), + "off" => Ok(AniMeStatusValue::Off), + _ => { + print!("Invalid argument, must be one of: on, off"); + Err(AuraError::ParseAnime) + } + } + } +} +impl From for bool { + fn from(value: AniMeStatusValue) -> Self { + match value { + AniMeStatusValue::On => true, + AniMeStatusValue::Off => false, + } + } +} + +#[derive(Options)] +pub struct AniMeLeds { + #[options(help = "print help message")] + help: bool, + #[options( + no_long, + required, + short = "b", + meta = "", + help = "set all leds brightness value" + )] + led_brightness: u8, +} +impl AniMeLeds { + pub fn led_brightness(&self) -> u8 { + self.led_brightness + } +} + +#[derive(Options)] +pub struct AniMeCommand { + #[options(help = "print help message")] + pub help: bool, + #[options( + meta = "", + help = "turn on/off the panel (accept/reject write requests)" + )] + pub turn: Option, + #[options(meta = "", help = "turn on/off the panel at boot (with Asus effect)")] + pub boot: Option, + #[options(command)] + pub command: Option, +} + +#[derive(Options)] +pub enum AniMeActions { + #[options(help = "change all leds brightness")] + Leds(AniMeLeds), + #[options(help = "display an 8bit greyscale png")] + Image(AniMeImage), +} + +#[derive(Options)] +pub struct AniMeImage { + #[options(help = "print help message")] + pub help: bool, + #[options(meta = "", help = "full path to the png to display")] + pub path: String, + #[options(meta = "", default = "0.0", help = "x scale 0.0-1.0")] + pub x_scale: f32, + #[options(meta = "", default = "0.0", help = "y scale 0.0-1.0")] + pub y_scale: f32, + #[options(meta = "", default = "0.0", help = "x position (float)")] + pub x_pos: f32, + #[options(meta = "", default = "0.0", help = "y position (float)")] + pub y_pos: f32, + #[options(meta = "", default = "0.0", help = "the angle in radians")] + pub angle: f32, + #[options(meta = "", default = "1.0", help = "brightness 0.0-1.0")] + pub bright: f32, +} diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index 4a1ddd01..657bfbe4 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -1,25 +1,29 @@ +mod anime_cli; mod aura_cli; use crate::aura_cli::{LedBrightness, SetAuraBuiltin}; +use anime_cli::{AniMeActions, AniMeCommand}; use daemon::{ ctrl_fan_cpu::FanCpuSupportedFunctions, ctrl_leds::LedSupportedFunctions, ctrl_rog_bios::RogBiosSupportedFunctions, ctrl_supported::SupportedFunctions, }; use gumdrop::{Opt, Options}; +use rog_anime::{ + AniMeDataBuffer, ANIME_DATA_LEN, + AnimeImage, Vec2, +}; use rog_dbus::AuraDbusClient; use rog_types::{ - anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN}, aura_modes::{self, AuraEffect, AuraModeNum}, - cli_options::{AniMeActions, AniMeStatusValue}, gfx_vendors::GfxVendors, profile::{FanLevel, ProfileCommand, ProfileEvent}, }; -use std::env::args; +use std::{env::args, path::Path}; use yansi_term::Colour::Green; use yansi_term::Colour::Red; #[derive(Default, Options)] -struct CLIStart { +struct CliStart { #[options(help_flag, help = "print help message")] help: bool, #[options(help = "show program version number")] @@ -82,21 +86,6 @@ struct GraphicsCommand { force: bool, } -#[derive(Options)] -struct AniMeCommand { - #[options(help = "print help message")] - help: bool, - #[options( - meta = "", - help = "turn on/off the panel (accept/reject write requests)" - )] - turn: Option, - #[options(meta = "", help = "turn on/off the panel at boot (with Asus effect)")] - boot: Option, - #[options(command)] - command: Option, -} - #[derive(Options, Debug)] struct BiosCommand { #[options(help = "print help message")] @@ -118,14 +107,14 @@ struct BiosCommand { fn main() -> Result<(), Box> { let args: Vec = args().skip(1).collect(); - let parsed: CLIStart; + let parsed: CliStart; let missing_argument_k = gumdrop::Error::missing_argument(Opt::Short('k')); - match CLIStart::parse_args_default(&args) { + match CliStart::parse_args_default(&args) { Ok(p) => { parsed = p; } Err(err) if err.to_string() == missing_argument_k.to_string() => { - parsed = CLIStart { + parsed = CliStart { kbd_bright: Some(LedBrightness::new(None)), ..Default::default() }; @@ -175,9 +164,32 @@ fn main() -> Result<(), Box> { if let Some(action) = cmd.command { match action { AniMeActions::Leds(anime_leds) => { - let mut data = AniMeDataBuffer::new(); - data.set([anime_leds.led_brightness(); FULL_PANE_LEN]); - dbus.proxies().anime().write_direct(data)?; + let data = AniMeDataBuffer::from_vec( + [anime_leds.led_brightness(); ANIME_DATA_LEN].to_vec(), + ); + dbus.proxies().anime().write(data)?; + } + AniMeActions::Image(image) => { + if image.help_requested() { + println!("Missing arg or command\n\n{}", image.self_usage()); + if let Some(lst) = image.self_command_list() { + println!("\n{}", lst); + } + std::process::exit(1); + } + + let matrix = AnimeImage::from_png( + Path::new(&image.path), + Vec2::new(image.x_scale, image.y_scale), + image.angle, + Vec2::new(image.x_pos, image.y_pos), + image.bright, + )?; + + dbus.proxies() + .anime() + .write(::from(&matrix)) + .unwrap(); } } } @@ -190,9 +202,9 @@ fn main() -> Result<(), Box> { && parsed.chg_limit.is_none()) || parsed.help { - println!("{}", CLIStart::usage()); + println!("{}", CliStart::usage()); println!(); - println!("{}", CLIStart::command_list().unwrap()); + println!("{}", CliStart::command_list().unwrap()); } } } @@ -224,7 +236,7 @@ fn main() -> Result<(), Box> { Ok(()) } -fn print_supported_help(supported: &SupportedFunctions, parsed: &CLIStart) { +fn print_supported_help(supported: &SupportedFunctions, parsed: &CliStart) { // As help option don't work with `parse_args_default` // we will call `parse_args_default_or_exit` instead let usage: Vec = parsed.self_usage().lines().map(|s| s.to_string()).collect(); @@ -311,10 +323,11 @@ fn do_gfx( } if command.pow { let res = dbus.proxies().gfx().gfx_get_pwr()?; - if res.contains("active") { - println!("Current power status: {}", Red.paint(&res)); - } else { - println!("Current power status: {}", Green.paint(&res)); + match res { + rog_types::gfx_vendors::GfxPower::Active => { + println!("Current power status: {}", Red.paint(<&str>::from(&res))) + } + _ => println!("Current power status: {}", Green.paint(<&str>::from(&res))), } } Ok(()) diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index 5fe268b9..f3a5fb7a 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "daemon" -version = "3.3.0" +version = "3.3.1" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] @@ -18,6 +18,7 @@ name = "asusd" path = "src/daemon.rs" [dependencies] +rog_anime = { path = "../rog-anime" } rog_types = { path = "../rog-types" } rog_dbus = { path = "../rog-dbus" } rusb = "^0.7" diff --git a/daemon/src/ctrl_anime.rs b/daemon/src/ctrl_anime.rs index 09de479f..14f29051 100644 --- a/daemon/src/ctrl_anime.rs +++ b/daemon/src/ctrl_anime.rs @@ -14,12 +14,7 @@ const APPLY: u8 = 0xc4; const ON_OFF: u8 = 0x04; use log::{error, info, warn}; -use rog_types::{ - anime_matrix::{ - AniMeDataBuffer, AniMeImageBuffer, AniMePacketType, ANIME_PANE1_PREFIX, ANIME_PANE2_PREFIX, - }, - error::AuraError, -}; +use rog_anime::{AniMeDataBuffer, AniMePacketType}; use rusb::{Device, DeviceHandle}; use std::error::Error; use std::time::Duration; @@ -45,11 +40,8 @@ pub struct CtrlAnimeDisplay { //AnimatrixWrite pub trait Dbus { - /// Write an image 34x56 pixels. Each pixel is 0-255 greyscale. - fn write_image(&self, input: AniMeImageBuffer); - /// Write a direct stream of data - fn write_direct(&self, input: AniMeDataBuffer); + fn write(&self, input: AniMeDataBuffer); fn set_on_off(&self, status: bool); @@ -70,16 +62,9 @@ impl crate::ZbusAdd for CtrlAnimeDisplay { #[dbus_interface(name = "org.asuslinux.Daemon")] impl Dbus for CtrlAnimeDisplay { - /// Writes a 34x56 image - fn write_image(&self, input: AniMeImageBuffer) { - self.write_image_buffer(input) - .map_or_else(|err| warn!("{}", err), |()| info!("Writing image to Anime")); - } - /// Writes a data stream of length - fn write_direct(&self, input: AniMeDataBuffer) { - self.write_data_buffer(input) - .map_or_else(|err| warn!("{}", err), |()| info!("Writing data to Anime")); + fn write(&self, input: AniMeDataBuffer) { + self.write_data_buffer(input); } fn set_on_off(&self, status: bool) { @@ -98,16 +83,8 @@ impl Dbus for CtrlAnimeDisplay { } fn set_boot_on_off(&self, status: bool) { - let status_str = if status { "on" } else { "off" }; - - self.do_set_boot(status).map_or_else( - |err| warn!("{}", err), - |()| info!("Turning {} the AniMe at boot/shutdown", status_str), - ); - self.do_apply().map_or_else( - |err| warn!("{}", err), - |()| info!("Turning {} the AniMe at boot/shutdown", status_str), - ); + self.do_set_boot(status); + self.do_apply(); } } @@ -132,7 +109,7 @@ impl CtrlAnimeDisplay { info!("Device has an AniMe Matrix display"); let ctrl = CtrlAnimeDisplay { handle: device }; - ctrl.do_initialization()?; + ctrl.do_initialization(); Ok(ctrl) } @@ -167,48 +144,16 @@ impl CtrlAnimeDisplay { } } #[inline] - fn write_data_buffer(&self, buffer: AniMeDataBuffer) -> Result<(), AuraError> { - let mut image = AniMePacketType::from(buffer); - image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX); - image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX); - - for row in image.iter() { + fn write_data_buffer(&self, buffer: AniMeDataBuffer) { + let data = AniMePacketType::from(buffer); + for row in data.iter() { self.write_bytes(row); } - self.do_flush()?; - Ok(()) - } - - /// Write an Animatrix image - /// - /// The expected USB input here is *two* Vectors, 640 bytes in length. The two vectors - /// are each one half of the full image write. - /// - /// After each write a flush is written, it is assumed that this tells the device to - /// go ahead and display the written bytes - /// - /// # Note: - /// The vectors are expected to contain the full sequence of bytes as follows - /// - /// - Write pane 1: 0x5e 0xc0 0x02 0x01 0x00 0x73 0x02 .. - /// - Write pane 2: 0x5e 0xc0 0x02 0x74 0x02 0x73 0x02 .. - /// - /// Where led brightness is 0..255, low to high - #[inline] - fn write_image_buffer(&self, buffer: AniMeImageBuffer) -> Result<(), AuraError> { - let mut image = AniMePacketType::from(buffer); - image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX); - image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX); - - for row in image.iter() { - self.write_bytes(row); - } - self.do_flush()?; - Ok(()) + self.do_flush(); } #[inline] - fn do_initialization(&self) -> Result<(), AuraError> { + fn do_initialization(&self) { let mut init = [0; PACKET_SIZE]; init[0] = DEV_PAGE; // This is the USB page we're using throughout for (idx, byte) in INIT_STR.as_bytes().iter().enumerate() { @@ -224,22 +169,20 @@ impl CtrlAnimeDisplay { init[1] = INIT; self.write_bytes(&init); - Ok(()) } #[inline] - fn do_flush(&self) -> Result<(), AuraError> { + fn do_flush(&self) { let mut flush = [0; PACKET_SIZE]; flush[0] = DEV_PAGE; flush[1] = WRITE; flush[2] = 0x03; self.write_bytes(&flush); - Ok(()) } #[inline] - fn do_set_boot(&self, status: bool) -> Result<(), AuraError> { + fn do_set_boot(&self, status: bool) { let mut flush = [0; PACKET_SIZE]; flush[0] = DEV_PAGE; flush[1] = SET; @@ -247,11 +190,10 @@ impl CtrlAnimeDisplay { flush[3] = if status { 0x00 } else { 0x80 }; self.write_bytes(&flush); - Ok(()) } #[inline] - fn do_apply(&self) -> Result<(), AuraError> { + fn do_apply(&self) { let mut flush = [0; PACKET_SIZE]; flush[0] = DEV_PAGE; flush[1] = APPLY; @@ -259,6 +201,5 @@ impl CtrlAnimeDisplay { flush[3] = 0x80; self.write_bytes(&flush); - Ok(()) } } diff --git a/daemon/src/ctrl_fan_cpu.rs b/daemon/src/ctrl_fan_cpu.rs index a3a67302..a33fdeb3 100644 --- a/daemon/src/ctrl_fan_cpu.rs +++ b/daemon/src/ctrl_fan_cpu.rs @@ -14,7 +14,7 @@ static FAN_TYPE_1_PATH: &str = "/sys/devices/platform/asus-nb-wmi/throttle_therm static FAN_TYPE_2_PATH: &str = "/sys/devices/platform/asus-nb-wmi/fan_boost_mode"; static AMD_BOOST_PATH: &str = "/sys/devices/system/cpu/cpufreq/boost"; -pub struct CtrlFanAndCPU { +pub struct CtrlFanAndCpu { pub path: &'static str, config: Arc>, } @@ -26,12 +26,12 @@ pub struct FanCpuSupportedFunctions { pub fan_curve_set: bool, } -impl GetSupported for CtrlFanAndCPU { +impl GetSupported for CtrlFanAndCpu { type A = FanCpuSupportedFunctions; fn get_supported() -> Self::A { FanCpuSupportedFunctions { - stock_fan_modes: CtrlFanAndCPU::get_fan_path().is_ok(), + stock_fan_modes: CtrlFanAndCpu::get_fan_path().is_ok(), min_max_freq: intel_pstate::PState::new().is_ok(), fan_curve_set: rog_fan_curve::Board::from_board_name().is_some(), } @@ -39,11 +39,11 @@ impl GetSupported for CtrlFanAndCPU { } pub struct DbusFanAndCpu { - inner: Arc>, + inner: Arc>, } impl DbusFanAndCpu { - pub fn new(inner: Arc>) -> Self { + pub fn new(inner: Arc>) -> Self { Self { inner } } } @@ -189,7 +189,7 @@ impl crate::ZbusAdd for DbusFanAndCpu { } } -impl crate::Reloadable for CtrlFanAndCPU { +impl crate::Reloadable for CtrlFanAndCpu { fn reload(&mut self) -> Result<(), RogError> { if let Ok(mut config) = self.config.clone().try_lock() { let profile = config.active_profile.clone(); @@ -203,11 +203,11 @@ impl crate::Reloadable for CtrlFanAndCPU { } } -impl CtrlFanAndCPU { +impl CtrlFanAndCpu { pub fn new(config: Arc>) -> Result { - let path = CtrlFanAndCPU::get_fan_path()?; + let path = CtrlFanAndCpu::get_fan_path()?; info!("Device has thermal throttle control"); - Ok(CtrlFanAndCPU { path, config }) + Ok(CtrlFanAndCpu { path, config }) } fn get_fan_path() -> Result<&'static str, RogError> { diff --git a/daemon/src/ctrl_gfx/error.rs b/daemon/src/ctrl_gfx/error.rs index fb039cd6..ec765653 100644 --- a/daemon/src/ctrl_gfx/error.rs +++ b/daemon/src/ctrl_gfx/error.rs @@ -6,6 +6,7 @@ use crate::error::RogError; #[derive(Debug)] pub enum GfxError { ParseVendor, + ParsePower, Bus(String, std::io::Error), DisplayManagerAction(String, ExitStatus), DisplayManagerTimeout(String), @@ -22,6 +23,7 @@ impl fmt::Display for GfxError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { GfxError::ParseVendor => write!(f, "Could not parse vendor name"), + GfxError::ParsePower => write!(f, "Could not parse dGPU power status"), GfxError::Bus(func, error) => write!(f, "Bus error: {}: {}", func, error), GfxError::DisplayManagerAction(action, status) => { write!(f, "Display-manager action {} failed: {}", action, status) diff --git a/daemon/src/ctrl_gfx/gfx.rs b/daemon/src/ctrl_gfx/gfx.rs index d61aadbe..cac9e174 100644 --- a/daemon/src/ctrl_gfx/gfx.rs +++ b/daemon/src/ctrl_gfx/gfx.rs @@ -6,11 +6,11 @@ use logind_zbus::{ types::{SessionClass, SessionInfo, SessionState, SessionType}, ManagerProxy, SessionProxy, }; -use rog_types::gfx_vendors::{GfxRequiredUserAction, GfxVendors}; -use std::sync::mpsc; +use rog_types::gfx_vendors::{GfxPower, GfxRequiredUserAction, GfxVendors}; use std::{io::Write, ops::Add, path::Path, time::Instant}; use std::{iter::FromIterator, thread::JoinHandle}; use std::{process::Command, thread::sleep, time::Duration}; +use std::{str::FromStr, sync::mpsc}; use std::{sync::Arc, sync::Mutex}; use sysfs_class::{PciDevice, SysClass}; use system::{GraphicsDevice, PciBus}; @@ -33,7 +33,7 @@ pub struct CtrlGraphics { trait Dbus { fn vendor(&self) -> zbus::fdo::Result; - fn power(&self) -> String; + fn power(&self) -> zbus::fdo::Result; fn set_vendor(&mut self, vendor: GfxVendors) -> zbus::fdo::Result; fn notify_gfx(&self, vendor: &GfxVendors) -> zbus::Result<()>; fn notify_action(&self, action: &GfxRequiredUserAction) -> zbus::Result<()>; @@ -48,8 +48,11 @@ impl Dbus for CtrlGraphics { }) } - fn power(&self) -> String { - Self::get_runtime_status().unwrap_or_else(|err| format!("Get power status failed: {}", err)) + fn power(&self) -> zbus::fdo::Result { + Self::get_runtime_status().map_err(|err| { + error!("GFX: {}", err); + zbus::fdo::Error::Failed(format!("GFX fail: {}", err)) + }) } fn set_vendor(&mut self, vendor: GfxVendors) -> zbus::fdo::Result { @@ -178,10 +181,19 @@ impl CtrlGraphics { Ok(GfxVendors::Hybrid) } - fn get_runtime_status() -> Result { - const PATH: &str = "/sys/bus/pci/devices/0000:01:00.0/power/runtime_status"; - let buf = std::fs::read_to_string(PATH).map_err(|err| RogError::Read(PATH.into(), err))?; - Ok(buf) + fn get_runtime_status() -> Result { + let path = Path::new("/sys/bus/pci/devices/0000:01:00.0/power/runtime_status"); + if path.exists() { + let buf = std::fs::read_to_string(path).map_err(|err| { + RogError::Read( + "/sys/bus/pci/devices/0000:01:00.0/power/runtime_status".to_string(), + err, + ) + })?; + Ok(GfxPower::from_str(&buf)?) + } else { + Ok(GfxPower::Off) + } } /// Some systems have a fallback service to load nouveau if nvidia fails diff --git a/daemon/src/ctrl_leds.rs b/daemon/src/ctrl_leds.rs index 00634c38..2fa93046 100644 --- a/daemon/src/ctrl_leds.rs +++ b/daemon/src/ctrl_leds.rs @@ -248,7 +248,7 @@ impl crate::CtrlTask for CtrlKbdBacklight { } return Ok(()); } - Err(RogError::ParseLED) + Err(RogError::ParseLed) } } diff --git a/daemon/src/ctrl_supported.rs b/daemon/src/ctrl_supported.rs index 64d043d6..c52a56bc 100644 --- a/daemon/src/ctrl_supported.rs +++ b/daemon/src/ctrl_supported.rs @@ -5,7 +5,7 @@ use zbus::dbus_interface; use crate::{ ctrl_anime::{AnimeSupportedFunctions, CtrlAnimeDisplay}, ctrl_charge::{ChargeSupportedFunctions, CtrlCharge}, - ctrl_fan_cpu::{CtrlFanAndCPU, FanCpuSupportedFunctions}, + ctrl_fan_cpu::{CtrlFanAndCpu, FanCpuSupportedFunctions}, ctrl_leds::{CtrlKbdBacklight, LedSupportedFunctions}, ctrl_rog_bios::{CtrlRogBios, RogBiosSupportedFunctions}, GetSupported, @@ -47,7 +47,7 @@ impl GetSupported for SupportedFunctions { keyboard_led: CtrlKbdBacklight::get_supported(), anime_ctrl: CtrlAnimeDisplay::get_supported(), charge_ctrl: CtrlCharge::get_supported(), - fan_cpu_ctrl: CtrlFanAndCPU::get_supported(), + fan_cpu_ctrl: CtrlFanAndCpu::get_supported(), rog_bios_ctrl: CtrlRogBios::get_supported(), } } diff --git a/daemon/src/daemon.rs b/daemon/src/daemon.rs index b07842fd..9f8199cf 100644 --- a/daemon/src/daemon.rs +++ b/daemon/src/daemon.rs @@ -5,7 +5,7 @@ use daemon::{ use daemon::{config_aura::AuraConfig, ctrl_charge::CtrlCharge}; use daemon::{ctrl_anime::CtrlAnimeDisplay, ctrl_gfx::gfx::CtrlGraphics}; use daemon::{ - ctrl_fan_cpu::{CtrlFanAndCPU, DbusFanAndCpu}, + ctrl_fan_cpu::{CtrlFanAndCpu, DbusFanAndCpu}, laptops::LaptopLedData, }; @@ -134,7 +134,7 @@ fn start_daemon() -> Result<(), Box> { // Collect tasks for task thread let mut tasks: Vec>> = Vec::new(); - if let Ok(mut ctrl) = CtrlFanAndCPU::new(config).map_err(|err| { + if let Ok(mut ctrl) = CtrlFanAndCpu::new(config).map_err(|err| { error!("Profile control: {}", err); }) { ctrl.reload() diff --git a/daemon/src/error.rs b/daemon/src/error.rs index 79140f57..ba3384d5 100644 --- a/daemon/src/error.rs +++ b/daemon/src/error.rs @@ -10,7 +10,7 @@ use crate::ctrl_gfx::error::GfxError; pub enum RogError { ParseFanLevel, ParseVendor, - ParseLED, + ParseLed, MissingProfile(String), Udev(String, std::io::Error), Path(String, std::io::Error), @@ -38,7 +38,7 @@ impl fmt::Display for RogError { match self { RogError::ParseFanLevel => write!(f, "Parse profile error"), RogError::ParseVendor => write!(f, "Parse gfx vendor error"), - RogError::ParseLED => write!(f, "Parse LED error"), + RogError::ParseLed => write!(f, "Parse LED error"), RogError::MissingProfile(profile) => write!(f, "Profile does not exist {}", profile), RogError::Udev(deets, error) => write!(f, "udev {}: {}", deets, error), RogError::Path(path, error) => write!(f, "Path {}: {}", path, error), @@ -80,6 +80,7 @@ impl From for RogError { fn from(err: GraphicsError) -> Self { match err { GraphicsError::ParseVendor => RogError::GfxSwitching(GfxError::ParseVendor), + GraphicsError::ParsePower => RogError::GfxSwitching(GfxError::ParsePower), } } } diff --git a/rog-anime/Cargo.toml b/rog-anime/Cargo.toml new file mode 100644 index 00000000..b22dbe35 --- /dev/null +++ b/rog-anime/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "rog_anime" +version = "1.0.0" +license = "MPL-2.0" +readme = "README.md" +authors = ["Luke "] +repository = "https://gitlab.com/asus-linux/asus-nb-ctrl" +homepage = "https://gitlab.com/asus-linux/asus-nb-ctrl" +description = "Types useful for translating images and other data for display on the ASUS AniMe Matrix display" +edition = "2018" + +[dependencies] +png_pong = "^0.8.0" +glam = "*" +pix = "0.13" +owo-colors = "2.0.0" + +serde = "^1.0" +serde_derive = "^1.0" +zvariant = "^2.5" +zvariant_derive = "^2.5" + +[features] +default = ["zbus"] +zbus = [] \ No newline at end of file diff --git a/rog-anime/LICENSE b/rog-anime/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/rog-anime/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/rog-anime/README.md b/rog-anime/README.md new file mode 100644 index 00000000..31b2018a --- /dev/null +++ b/rog-anime/README.md @@ -0,0 +1,56 @@ +# rog-anime + +## Features + +`zbus` is enabled by default. + +## Example + +```rust +use std::{env, error::Error, path::Path, process::exit}; + +use rog_dbus::AuraDbusClient; +use rog_anime::{ + anime_data::AniMeDataBuffer, + anime_image::{AnimeImage, Vec2}, +}; + +fn main() -> Result<(), Box> { + let (client, _) = AuraDbusClient::new().unwrap(); + + let args: Vec = env::args().into_iter().collect(); + if args.len() != 8 { + println!( + "Usage: " + ); + println!("e.g, asusctl/examples/doom_large.png 0.9 0.9 0.4 0.0 0.0, 0.8"); + println!("All args except path and fineness are floats"); + exit(-1); + } + + let image = AnimeImage::from_png( + Path::new(&args[1]), + Vec2::new( + args[2].parse::().unwrap(), + args[3].parse::().unwrap(), + ), + args[4].parse::().unwrap(), + Vec2::new( + args[5].parse::().unwrap(), + args[6].parse::().unwrap(), + ), + args[7].parse::().unwrap(), + )?; + + /// This data can also be written direct to the USB device by transforming with + let data = AniMePacketType::from(image); + let data = ::from(&image); + client + .proxies() + .anime() + .write(data) + .unwrap(); + + Ok(()) +} +``` \ No newline at end of file diff --git a/rog-anime/src/anime_data.rs b/rog-anime/src/anime_data.rs new file mode 100644 index 00000000..df360049 --- /dev/null +++ b/rog-anime/src/anime_data.rs @@ -0,0 +1,62 @@ +use serde_derive::{Deserialize, Serialize}; +#[cfg(feature = "zbus")] +use zvariant_derive::Type; + +/// The first 7 bytes of a USB packet are accounted for by `USB_PREFIX1` and `USB_PREFIX2` +const BLOCK_START: usize = 7; +/// *Not* inclusive, the byte before this is the final for each "pane" +const BLOCK_END: usize = 634; +/// Individual usable data length of each USB packet +const PANE_LEN: usize = BLOCK_END - BLOCK_START; +/// The length of usable data +pub const ANIME_DATA_LEN: usize = PANE_LEN * 2; + +const USB_PREFIX1: [u8; 7] = [0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02]; +const USB_PREFIX2: [u8; 7] = [0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02]; + +/// The minimal serializable data that can be transferred over wire types. +/// Other data structures in `rog_anime` will convert to this. +#[cfg_attr(feature = "zbus", derive(Type))] +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct AniMeDataBuffer(Vec); + +impl Default for AniMeDataBuffer { + fn default() -> Self { + Self::new() + } +} + +impl AniMeDataBuffer { + pub fn new() -> Self { + AniMeDataBuffer(vec![0u8; ANIME_DATA_LEN]) + } + + pub fn get(&self) -> &[u8] { + &self.0 + } + + pub fn get_mut(&mut self) -> &mut [u8] { + &mut self.0 + } + + pub fn from_vec(input: Vec) -> Self { + Self(input) + } +} + +/// The two packets to be written to USB +pub type AniMePacketType = [[u8; 640]; 2]; + +impl From for AniMePacketType { + #[inline] + fn from(anime: AniMeDataBuffer) -> Self { + assert!(anime.0.len() == ANIME_DATA_LEN); + let mut buffers = [[0; 640]; 2]; + for (idx, chunk) in anime.0.as_slice().chunks(PANE_LEN).enumerate() { + buffers[idx][BLOCK_START..BLOCK_END].copy_from_slice(chunk); + } + buffers[0][..7].copy_from_slice(&USB_PREFIX1); + buffers[1][..7].copy_from_slice(&USB_PREFIX2); + buffers + } +} diff --git a/rog-anime/src/anime_grid.rs b/rog-anime/src/anime_grid.rs new file mode 100644 index 00000000..0d0d319a --- /dev/null +++ b/rog-anime/src/anime_grid.rs @@ -0,0 +1,165 @@ +use crate::anime_data::{AniMeDataBuffer, ANIME_DATA_LEN}; +use crate::anime_image::LED_IMAGE_POSITIONS; +use owo_colors::{OwoColorize, Rgb}; + +const WIDTH: usize = 33; +const HEIGHT: usize = 55; + +/// Helper structure for writing images. +/// +/// See the examples for ways to write an image to `AniMeMatrix` format. +/// Width = 33 +/// height = 55 +#[derive(Debug, Clone)] +pub struct AniMeGrid([[u8; WIDTH]; HEIGHT]); + +impl Default for AniMeGrid { + fn default() -> Self { + Self::new() + } +} + +impl AniMeGrid { + pub fn new() -> Self { + AniMeGrid([[0u8; WIDTH]; HEIGHT]) + } + + pub fn set(&mut self, x: usize, y: usize, b: u8) { + self.0[y][x] = b; + } + + pub fn get(&self) -> &[[u8; WIDTH]; HEIGHT] { + &self.0 + } + + pub fn get_mut(&mut self) -> &mut [[u8; WIDTH]; HEIGHT] { + &mut self.0 + } + + pub fn fill_with(&mut self, fill: u8) { + for row in self.0.iter_mut() { + for x in row.iter_mut() { + *x = fill; + } + } + } + + pub fn debug_print(&self) { + // this is the index from right. It is used to progressively shorten rows + let mut prog_row_len = WIDTH - 2; + + for (count, row) in self.0.iter().enumerate() { + // Switch to next block (looks like ) + if count % 2 != 0 { + // Row after 6 is only 1 less, then rows after 7 follow pattern + if count == 7 { + prog_row_len -= 1; + } else { + prog_row_len -= 2; + } + } else { + prog_row_len += 1; // if count 6, 0 + } + + let index = row.len() - prog_row_len; + + if count % 2 == 0 { + print!(" "); + } + for (i, n) in row.iter().enumerate() { + if i >= index { + print!(" {}", "XXX".color(Rgb(0, *n, 0))); + } else { + print!(" "); + } + } + println!(); + } + } +} + +impl From for AniMeDataBuffer { + /// Do conversion from the nested Vec in AniMeMatrix to the two required + /// packets suitable for sending over USB + #[inline] + fn from(anime: AniMeGrid) -> Self { + let mut buf = vec![0u8; ANIME_DATA_LEN]; + + for (idx, pos) in LED_IMAGE_POSITIONS.iter().enumerate() { + if let Some(pos) = pos { + let x = pos.x().ceil() as usize; + let y = pos.y().ceil() as usize; + buf[idx + 1] = anime.0[y][x]; + } + } + AniMeDataBuffer::from_vec(buf) + } +} + +#[cfg(test)] +mod tests { + use crate::anime_grid::*; + + #[test] + fn check_data_alignment() { + let mut matrix = AniMeGrid::new(); + { + let tmp = matrix.get_mut(); + for row in tmp.iter_mut() { + let idx = row.len() - 1; + row[idx] = 0xff; + } + } + + let matrix = ::from(matrix); + + let data_cmp = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + assert_eq!(matrix.get(), &data_cmp); + } +} diff --git a/rog-anime/src/anime_image.rs b/rog-anime/src/anime_image.rs new file mode 100644 index 00000000..8f1ad4b8 --- /dev/null +++ b/rog-anime/src/anime_image.rs @@ -0,0 +1,1626 @@ +use std::path::Path; + +pub use glam::Vec2; +use glam::{Mat3, Vec3}; + +use crate::{ + anime_data::{AniMeDataBuffer, ANIME_DATA_LEN}, + error::AnimeError, +}; + +const LED_PIXEL_LEN: usize = 1244; + +#[derive(Copy, Clone, Debug, Default)] +struct Pixel { + color: u32, + alpha: f32, +} + +/// A single LED position and brightness. The intention of this struct +/// is to be used to sample an image and set the LED brightness. +/// +/// The position of the Led in `LedPositions` determines the placement in the final +/// data packets when written to the AniMe. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Led(f32, f32, u8); + +impl Led { + const fn new(x: f32, y: f32) -> Self { + Led(x, y, 0) + } + + pub(crate) const fn x(&self) -> f32 { + self.0 + } + + pub(crate) const fn y(&self) -> f32 { + self.1 + } + + const fn bright(&self) -> u8 { + self.2 + } + + fn set_bright(&mut self, a: u8) { + self.2 = a; + } +} + +/// Container of `Led`, each of which specifies a position within the image +/// The main use of this is to position and sample colours for the final image +/// to show on AniMe +pub struct AnimeImage { + pub scale: Vec2, + /// Angle in radians + pub angle: f32, + pub translation: Vec2, + /// Brightness of final image, `0.0` = off, `1.0` = full + pub bright: f32, + /// Positions of all the LEDs + led_pos: [Option; LED_PIXEL_LEN], + /// THe image data for sampling + img_pixels: Vec, + width: u32, +} + +impl AnimeImage { + const fn new( + scale: Vec2, + angle: f32, + translation: Vec2, + bright: f32, + pixels: Vec, + width: u32, + ) -> Self { + Self { + scale, + angle, + translation, + bright, + led_pos: LED_IMAGE_POSITIONS, + img_pixels: pixels, + width, + } + } + + /// Scale ratio in CM + const fn scale_x() -> f32 { + 0.8 + } + + /// Scale ratio in CM + const fn scale_y() -> f32 { + 0.3 + } + + /// Get the starting X position for the data we actually require when writing + /// it out to LEDs + const fn first_x(y: u32) -> u32 { + if y < 5 { + return 0; + } + (y + 1) / 2 - 3 + } + + /// Width in LED count + const fn width(y: u32) -> u32 { + if y < 5 { + return 33; + } + 36 - (y + 1) / 2 + } + + fn phys_width() -> f32 { + (32.0 - -0.5 + 1.0) * Self::scale_x() + } + + /// Height in LED count + const fn height() -> u32 { + 55 + } + + fn phys_height() -> f32 { + (54.0 + 1.0) * Self::scale_y() + } + + const fn pitch(y: u32) -> u32 { + match y { + 0 | 2 | 4 => 33, + 1 | 3 => 35, + _ => 36 - y / 2, + } + } + + /// Really only used to generate the output for including as a full const in `LED_IMAGE_POSITIONS` + pub fn generate() -> Vec> { + (0..AnimeImage::height()) + .flat_map(|y| { + (0..AnimeImage::pitch(y)).map(move |l| { + if l < AnimeImage::width(y) { + let x = AnimeImage::first_x(y) + l; + Some(Led::new(x as f32 - 0.5 * (y % 2) as f32, y as f32)) + } else { + None + } + }) + }) + .collect() + } + + /// Called after setting new angle, position, or scale to refresh the image + /// samples, the result can then been transformed to the appropriate data + /// for displaying + pub fn update(&mut self) { + let width = self.width as i32; + let height = self.img_pixels.len() as i32 / width; + let led_from_px = self.put(width as f32, height as f32); + // Steps should be configurable as "sharpness" + let du = led_from_px * Vec3::new(-0.5, 0.5, 0.0); + let dv = led_from_px * Vec3::new(0.5, 0.5, 0.0); + + for led in self.led_pos.iter_mut() { + if let Some(led) = led { + let mut sum = 0.0; + let mut alpha = 0.0; + let mut count = 0; + + let pos = Vec3::new(led.x(), led.y(), 1.0); + let x0 = led_from_px.mul_vec3(pos + Vec3::new(0.0, -0.5, 0.0)); + + const GROUP: [f32; 4] = [0.0, 0.5, 1.0, 1.5]; + for u in GROUP.iter() { + for v in GROUP.iter() { + let sample = x0 + *u * du + *v * dv; + + let mut y = sample.y as i32; + if y > height - 1 { + y = height - 1 + } else if y < 0 { + y = 0; + } + + let mut x = sample.x as i32; + if x > width - 1 { + x = width - 1; + } else if x < 0 { + x = 0; + } + + let p = self.img_pixels[(x + (y * width)) as usize]; + sum += p.color as f32; + alpha += p.alpha; + count += 1; + } + } + alpha /= count as f32; + sum /= count as f32; + led.set_bright((sum * self.bright * alpha) as u8); + } + } + } + + fn put(&self, bmp_w: f32, bmp_h: f32) -> Mat3 { + // Center of image + let center = Mat3::from_translation(Vec2::new(-0.5 * bmp_w, -0.5 * bmp_h)); + // Find the scale required for cleanly showing the image + let h = AnimeImage::phys_height() / bmp_h; + let mut base_scale = AnimeImage::phys_width() / bmp_w; + if base_scale > h { + base_scale = h; + } + + let cm_from_px = Mat3::from_scale(Vec2::new(base_scale, base_scale)); + + let led_from_cm = Mat3::from_scale(Vec2::new( + 1.0 / AnimeImage::scale_x(), + 1.0 / AnimeImage::scale_y(), + )); + + let transform = + Mat3::from_scale_angle_translation(self.scale, self.angle, self.translation); + + let pos_in_leds = Mat3::from_translation(Vec2::new(20.0, 20.0)); + // Get LED-to-image coords + let led_from_px = pos_in_leds * led_from_cm * transform * cm_from_px * center; + + led_from_px.inverse() + } + + /// Generate the base image from inputs. The result can be displayed as is or + /// updated via scale, position, or angle then displayed again after `update()`. + pub fn from_png( + path: &Path, + scale: Vec2, + angle: f32, + translation: Vec2, + bright: f32, + ) -> Result { + use pix::el::Pixel; + let data = std::fs::read(path)?; + let data = std::io::Cursor::new(data); + let decoder = png_pong::Decoder::new(data)?.into_steps(); + let png_pong::Step { raster, delay: _ } = decoder + .last() + .ok_or(AnimeError::NoFrames)??; + + let width; + let pixels = match raster { + png_pong::PngRaster::Graya8(ras) => { + width = ras.width(); + ras.pixels() + .iter() + .map(|px| crate::anime_image::Pixel { + color: ::from(px.one()) as u32, + alpha: ::from(px.alpha()), + }) + .collect() + } + _ => return Err(AnimeError::Format), + }; + + let mut matrix = AnimeImage::new(scale, angle, translation, bright, pixels, width); + + matrix.update(); + Ok(matrix) + } +} + +impl From<&AnimeImage> for AniMeDataBuffer { + /// Do conversion from the nested Vec in AniMeMatrix to the two required + /// packets suitable for sending over USB + #[inline] + fn from(leds: &AnimeImage) -> Self { + let mut l: Vec = leds + .led_pos + .iter() + .map(|l| if let Some(l) = l { l.bright() } else { 0 }) + .collect(); + let mut v = Vec::with_capacity(ANIME_DATA_LEN); + v.push(0); + v.append(&mut l); + v.append(&mut vec![0u8; 9]); + AniMeDataBuffer::from_vec(v) + } +} + +/// Data starts at first index which means that when mapping this data to the final +/// USB packet it must start from index 8, not 7. +/// +/// Verbatim copy of `generate()`. `LED_IMAGE_POSITIONS` is `const` so prefer this. +pub const LED_IMAGE_POSITIONS: [Option; LED_PIXEL_LEN] = [ + Some(Led(0.0, 0.0, 0)), + Some(Led(1.0, 0.0, 0)), + Some(Led(2.0, 0.0, 0)), + Some(Led(3.0, 0.0, 0)), + Some(Led(4.0, 0.0, 0)), + Some(Led(5.0, 0.0, 0)), + Some(Led(6.0, 0.0, 0)), + Some(Led(7.0, 0.0, 0)), + Some(Led(8.0, 0.0, 0)), + Some(Led(9.0, 0.0, 0)), + Some(Led(10.0, 0.0, 0)), + Some(Led(11.0, 0.0, 0)), + Some(Led(12.0, 0.0, 0)), + Some(Led(13.0, 0.0, 0)), + Some(Led(14.0, 0.0, 0)), + Some(Led(15.0, 0.0, 0)), + Some(Led(16.0, 0.0, 0)), + Some(Led(17.0, 0.0, 0)), + Some(Led(18.0, 0.0, 0)), + Some(Led(19.0, 0.0, 0)), + Some(Led(20.0, 0.0, 0)), + Some(Led(21.0, 0.0, 0)), + Some(Led(22.0, 0.0, 0)), + Some(Led(23.0, 0.0, 0)), + Some(Led(24.0, 0.0, 0)), + Some(Led(25.0, 0.0, 0)), + Some(Led(26.0, 0.0, 0)), + Some(Led(27.0, 0.0, 0)), + Some(Led(28.0, 0.0, 0)), + Some(Led(29.0, 0.0, 0)), + Some(Led(30.0, 0.0, 0)), + Some(Led(31.0, 0.0, 0)), + Some(Led(32.0, 0.0, 0)), + Some(Led(-0.5, 1.0, 0)), + Some(Led(0.5, 1.0, 0)), + Some(Led(1.5, 1.0, 0)), + Some(Led(2.5, 1.0, 0)), + Some(Led(3.5, 1.0, 0)), + Some(Led(4.5, 1.0, 0)), + Some(Led(5.5, 1.0, 0)), + Some(Led(6.5, 1.0, 0)), + Some(Led(7.5, 1.0, 0)), + Some(Led(8.5, 1.0, 0)), + Some(Led(9.5, 1.0, 0)), + Some(Led(10.5, 1.0, 0)), + Some(Led(11.5, 1.0, 0)), + Some(Led(12.5, 1.0, 0)), + Some(Led(13.5, 1.0, 0)), + Some(Led(14.5, 1.0, 0)), + Some(Led(15.5, 1.0, 0)), + Some(Led(16.5, 1.0, 0)), + Some(Led(17.5, 1.0, 0)), + Some(Led(18.5, 1.0, 0)), + Some(Led(19.5, 1.0, 0)), + Some(Led(20.5, 1.0, 0)), + Some(Led(21.5, 1.0, 0)), + Some(Led(22.5, 1.0, 0)), + Some(Led(23.5, 1.0, 0)), + Some(Led(24.5, 1.0, 0)), + Some(Led(25.5, 1.0, 0)), + Some(Led(26.5, 1.0, 0)), + Some(Led(27.5, 1.0, 0)), + Some(Led(28.5, 1.0, 0)), + Some(Led(29.5, 1.0, 0)), + Some(Led(30.5, 1.0, 0)), + Some(Led(31.5, 1.0, 0)), + None, + None, + Some(Led(0.0, 2.0, 0)), + Some(Led(1.0, 2.0, 0)), + Some(Led(2.0, 2.0, 0)), + Some(Led(3.0, 2.0, 0)), + Some(Led(4.0, 2.0, 0)), + Some(Led(5.0, 2.0, 0)), + Some(Led(6.0, 2.0, 0)), + Some(Led(7.0, 2.0, 0)), + Some(Led(8.0, 2.0, 0)), + Some(Led(9.0, 2.0, 0)), + Some(Led(10.0, 2.0, 0)), + Some(Led(11.0, 2.0, 0)), + Some(Led(12.0, 2.0, 0)), + Some(Led(13.0, 2.0, 0)), + Some(Led(14.0, 2.0, 0)), + Some(Led(15.0, 2.0, 0)), + Some(Led(16.0, 2.0, 0)), + Some(Led(17.0, 2.0, 0)), + Some(Led(18.0, 2.0, 0)), + Some(Led(19.0, 2.0, 0)), + Some(Led(20.0, 2.0, 0)), + Some(Led(21.0, 2.0, 0)), + Some(Led(22.0, 2.0, 0)), + Some(Led(23.0, 2.0, 0)), + Some(Led(24.0, 2.0, 0)), + Some(Led(25.0, 2.0, 0)), + Some(Led(26.0, 2.0, 0)), + Some(Led(27.0, 2.0, 0)), + Some(Led(28.0, 2.0, 0)), + Some(Led(29.0, 2.0, 0)), + Some(Led(30.0, 2.0, 0)), + Some(Led(31.0, 2.0, 0)), + Some(Led(32.0, 2.0, 0)), + Some(Led(-0.5, 3.0, 0)), + Some(Led(0.5, 3.0, 0)), + Some(Led(1.5, 3.0, 0)), + Some(Led(2.5, 3.0, 0)), + Some(Led(3.5, 3.0, 0)), + Some(Led(4.5, 3.0, 0)), + Some(Led(5.5, 3.0, 0)), + Some(Led(6.5, 3.0, 0)), + Some(Led(7.5, 3.0, 0)), + Some(Led(8.5, 3.0, 0)), + Some(Led(9.5, 3.0, 0)), + Some(Led(10.5, 3.0, 0)), + Some(Led(11.5, 3.0, 0)), + Some(Led(12.5, 3.0, 0)), + Some(Led(13.5, 3.0, 0)), + Some(Led(14.5, 3.0, 0)), + Some(Led(15.5, 3.0, 0)), + Some(Led(16.5, 3.0, 0)), + Some(Led(17.5, 3.0, 0)), + Some(Led(18.5, 3.0, 0)), + Some(Led(19.5, 3.0, 0)), + Some(Led(20.5, 3.0, 0)), + Some(Led(21.5, 3.0, 0)), + Some(Led(22.5, 3.0, 0)), + Some(Led(23.5, 3.0, 0)), + Some(Led(24.5, 3.0, 0)), + Some(Led(25.5, 3.0, 0)), + Some(Led(26.5, 3.0, 0)), + Some(Led(27.5, 3.0, 0)), + Some(Led(28.5, 3.0, 0)), + Some(Led(29.5, 3.0, 0)), + Some(Led(30.5, 3.0, 0)), + Some(Led(31.5, 3.0, 0)), + None, + None, + Some(Led(0.0, 4.0, 0)), + Some(Led(1.0, 4.0, 0)), + Some(Led(2.0, 4.0, 0)), + Some(Led(3.0, 4.0, 0)), + Some(Led(4.0, 4.0, 0)), + Some(Led(5.0, 4.0, 0)), + Some(Led(6.0, 4.0, 0)), + Some(Led(7.0, 4.0, 0)), + Some(Led(8.0, 4.0, 0)), + Some(Led(9.0, 4.0, 0)), + Some(Led(10.0, 4.0, 0)), + Some(Led(11.0, 4.0, 0)), + Some(Led(12.0, 4.0, 0)), + Some(Led(13.0, 4.0, 0)), + Some(Led(14.0, 4.0, 0)), + Some(Led(15.0, 4.0, 0)), + Some(Led(16.0, 4.0, 0)), + Some(Led(17.0, 4.0, 0)), + Some(Led(18.0, 4.0, 0)), + Some(Led(19.0, 4.0, 0)), + Some(Led(20.0, 4.0, 0)), + Some(Led(21.0, 4.0, 0)), + Some(Led(22.0, 4.0, 0)), + Some(Led(23.0, 4.0, 0)), + Some(Led(24.0, 4.0, 0)), + Some(Led(25.0, 4.0, 0)), + Some(Led(26.0, 4.0, 0)), + Some(Led(27.0, 4.0, 0)), + Some(Led(28.0, 4.0, 0)), + Some(Led(29.0, 4.0, 0)), + Some(Led(30.0, 4.0, 0)), + Some(Led(31.0, 4.0, 0)), + Some(Led(32.0, 4.0, 0)), + Some(Led(-0.5, 5.0, 0)), + Some(Led(0.5, 5.0, 0)), + Some(Led(1.5, 5.0, 0)), + Some(Led(2.5, 5.0, 0)), + Some(Led(3.5, 5.0, 0)), + Some(Led(4.5, 5.0, 0)), + Some(Led(5.5, 5.0, 0)), + Some(Led(6.5, 5.0, 0)), + Some(Led(7.5, 5.0, 0)), + Some(Led(8.5, 5.0, 0)), + Some(Led(9.5, 5.0, 0)), + Some(Led(10.5, 5.0, 0)), + Some(Led(11.5, 5.0, 0)), + Some(Led(12.5, 5.0, 0)), + Some(Led(13.5, 5.0, 0)), + Some(Led(14.5, 5.0, 0)), + Some(Led(15.5, 5.0, 0)), + Some(Led(16.5, 5.0, 0)), + Some(Led(17.5, 5.0, 0)), + Some(Led(18.5, 5.0, 0)), + Some(Led(19.5, 5.0, 0)), + Some(Led(20.5, 5.0, 0)), + Some(Led(21.5, 5.0, 0)), + Some(Led(22.5, 5.0, 0)), + Some(Led(23.5, 5.0, 0)), + Some(Led(24.5, 5.0, 0)), + Some(Led(25.5, 5.0, 0)), + Some(Led(26.5, 5.0, 0)), + Some(Led(27.5, 5.0, 0)), + Some(Led(28.5, 5.0, 0)), + Some(Led(29.5, 5.0, 0)), + Some(Led(30.5, 5.0, 0)), + Some(Led(31.5, 5.0, 0)), + None, + Some(Led(0.0, 6.0, 0)), + Some(Led(1.0, 6.0, 0)), + Some(Led(2.0, 6.0, 0)), + Some(Led(3.0, 6.0, 0)), + Some(Led(4.0, 6.0, 0)), + Some(Led(5.0, 6.0, 0)), + Some(Led(6.0, 6.0, 0)), + Some(Led(7.0, 6.0, 0)), + Some(Led(8.0, 6.0, 0)), + Some(Led(9.0, 6.0, 0)), + Some(Led(10.0, 6.0, 0)), + Some(Led(11.0, 6.0, 0)), + Some(Led(12.0, 6.0, 0)), + Some(Led(13.0, 6.0, 0)), + Some(Led(14.0, 6.0, 0)), + Some(Led(15.0, 6.0, 0)), + Some(Led(16.0, 6.0, 0)), + Some(Led(17.0, 6.0, 0)), + Some(Led(18.0, 6.0, 0)), + Some(Led(19.0, 6.0, 0)), + Some(Led(20.0, 6.0, 0)), + Some(Led(21.0, 6.0, 0)), + Some(Led(22.0, 6.0, 0)), + Some(Led(23.0, 6.0, 0)), + Some(Led(24.0, 6.0, 0)), + Some(Led(25.0, 6.0, 0)), + Some(Led(26.0, 6.0, 0)), + Some(Led(27.0, 6.0, 0)), + Some(Led(28.0, 6.0, 0)), + Some(Led(29.0, 6.0, 0)), + Some(Led(30.0, 6.0, 0)), + Some(Led(31.0, 6.0, 0)), + Some(Led(32.0, 6.0, 0)), + Some(Led(0.5, 7.0, 0)), + Some(Led(1.5, 7.0, 0)), + Some(Led(2.5, 7.0, 0)), + Some(Led(3.5, 7.0, 0)), + Some(Led(4.5, 7.0, 0)), + Some(Led(5.5, 7.0, 0)), + Some(Led(6.5, 7.0, 0)), + Some(Led(7.5, 7.0, 0)), + Some(Led(8.5, 7.0, 0)), + Some(Led(9.5, 7.0, 0)), + Some(Led(10.5, 7.0, 0)), + Some(Led(11.5, 7.0, 0)), + Some(Led(12.5, 7.0, 0)), + Some(Led(13.5, 7.0, 0)), + Some(Led(14.5, 7.0, 0)), + Some(Led(15.5, 7.0, 0)), + Some(Led(16.5, 7.0, 0)), + Some(Led(17.5, 7.0, 0)), + Some(Led(18.5, 7.0, 0)), + Some(Led(19.5, 7.0, 0)), + Some(Led(20.5, 7.0, 0)), + Some(Led(21.5, 7.0, 0)), + Some(Led(22.5, 7.0, 0)), + Some(Led(23.5, 7.0, 0)), + Some(Led(24.5, 7.0, 0)), + Some(Led(25.5, 7.0, 0)), + Some(Led(26.5, 7.0, 0)), + Some(Led(27.5, 7.0, 0)), + Some(Led(28.5, 7.0, 0)), + Some(Led(29.5, 7.0, 0)), + Some(Led(30.5, 7.0, 0)), + Some(Led(31.5, 7.0, 0)), + None, + Some(Led(1.0, 8.0, 0)), + Some(Led(2.0, 8.0, 0)), + Some(Led(3.0, 8.0, 0)), + Some(Led(4.0, 8.0, 0)), + Some(Led(5.0, 8.0, 0)), + Some(Led(6.0, 8.0, 0)), + Some(Led(7.0, 8.0, 0)), + Some(Led(8.0, 8.0, 0)), + Some(Led(9.0, 8.0, 0)), + Some(Led(10.0, 8.0, 0)), + Some(Led(11.0, 8.0, 0)), + Some(Led(12.0, 8.0, 0)), + Some(Led(13.0, 8.0, 0)), + Some(Led(14.0, 8.0, 0)), + Some(Led(15.0, 8.0, 0)), + Some(Led(16.0, 8.0, 0)), + Some(Led(17.0, 8.0, 0)), + Some(Led(18.0, 8.0, 0)), + Some(Led(19.0, 8.0, 0)), + Some(Led(20.0, 8.0, 0)), + Some(Led(21.0, 8.0, 0)), + Some(Led(22.0, 8.0, 0)), + Some(Led(23.0, 8.0, 0)), + Some(Led(24.0, 8.0, 0)), + Some(Led(25.0, 8.0, 0)), + Some(Led(26.0, 8.0, 0)), + Some(Led(27.0, 8.0, 0)), + Some(Led(28.0, 8.0, 0)), + Some(Led(29.0, 8.0, 0)), + Some(Led(30.0, 8.0, 0)), + Some(Led(31.0, 8.0, 0)), + Some(Led(32.0, 8.0, 0)), + Some(Led(1.5, 9.0, 0)), + Some(Led(2.5, 9.0, 0)), + Some(Led(3.5, 9.0, 0)), + Some(Led(4.5, 9.0, 0)), + Some(Led(5.5, 9.0, 0)), + Some(Led(6.5, 9.0, 0)), + Some(Led(7.5, 9.0, 0)), + Some(Led(8.5, 9.0, 0)), + Some(Led(9.5, 9.0, 0)), + Some(Led(10.5, 9.0, 0)), + Some(Led(11.5, 9.0, 0)), + Some(Led(12.5, 9.0, 0)), + Some(Led(13.5, 9.0, 0)), + Some(Led(14.5, 9.0, 0)), + Some(Led(15.5, 9.0, 0)), + Some(Led(16.5, 9.0, 0)), + Some(Led(17.5, 9.0, 0)), + Some(Led(18.5, 9.0, 0)), + Some(Led(19.5, 9.0, 0)), + Some(Led(20.5, 9.0, 0)), + Some(Led(21.5, 9.0, 0)), + Some(Led(22.5, 9.0, 0)), + Some(Led(23.5, 9.0, 0)), + Some(Led(24.5, 9.0, 0)), + Some(Led(25.5, 9.0, 0)), + Some(Led(26.5, 9.0, 0)), + Some(Led(27.5, 9.0, 0)), + Some(Led(28.5, 9.0, 0)), + Some(Led(29.5, 9.0, 0)), + Some(Led(30.5, 9.0, 0)), + Some(Led(31.5, 9.0, 0)), + None, + Some(Led(2.0, 10.0, 0)), + Some(Led(3.0, 10.0, 0)), + Some(Led(4.0, 10.0, 0)), + Some(Led(5.0, 10.0, 0)), + Some(Led(6.0, 10.0, 0)), + Some(Led(7.0, 10.0, 0)), + Some(Led(8.0, 10.0, 0)), + Some(Led(9.0, 10.0, 0)), + Some(Led(10.0, 10.0, 0)), + Some(Led(11.0, 10.0, 0)), + Some(Led(12.0, 10.0, 0)), + Some(Led(13.0, 10.0, 0)), + Some(Led(14.0, 10.0, 0)), + Some(Led(15.0, 10.0, 0)), + Some(Led(16.0, 10.0, 0)), + Some(Led(17.0, 10.0, 0)), + Some(Led(18.0, 10.0, 0)), + Some(Led(19.0, 10.0, 0)), + Some(Led(20.0, 10.0, 0)), + Some(Led(21.0, 10.0, 0)), + Some(Led(22.0, 10.0, 0)), + Some(Led(23.0, 10.0, 0)), + Some(Led(24.0, 10.0, 0)), + Some(Led(25.0, 10.0, 0)), + Some(Led(26.0, 10.0, 0)), + Some(Led(27.0, 10.0, 0)), + Some(Led(28.0, 10.0, 0)), + Some(Led(29.0, 10.0, 0)), + Some(Led(30.0, 10.0, 0)), + Some(Led(31.0, 10.0, 0)), + Some(Led(32.0, 10.0, 0)), + Some(Led(2.5, 11.0, 0)), + Some(Led(3.5, 11.0, 0)), + Some(Led(4.5, 11.0, 0)), + Some(Led(5.5, 11.0, 0)), + Some(Led(6.5, 11.0, 0)), + Some(Led(7.5, 11.0, 0)), + Some(Led(8.5, 11.0, 0)), + Some(Led(9.5, 11.0, 0)), + Some(Led(10.5, 11.0, 0)), + Some(Led(11.5, 11.0, 0)), + Some(Led(12.5, 11.0, 0)), + Some(Led(13.5, 11.0, 0)), + Some(Led(14.5, 11.0, 0)), + Some(Led(15.5, 11.0, 0)), + Some(Led(16.5, 11.0, 0)), + Some(Led(17.5, 11.0, 0)), + Some(Led(18.5, 11.0, 0)), + Some(Led(19.5, 11.0, 0)), + Some(Led(20.5, 11.0, 0)), + Some(Led(21.5, 11.0, 0)), + Some(Led(22.5, 11.0, 0)), + Some(Led(23.5, 11.0, 0)), + Some(Led(24.5, 11.0, 0)), + Some(Led(25.5, 11.0, 0)), + Some(Led(26.5, 11.0, 0)), + Some(Led(27.5, 11.0, 0)), + Some(Led(28.5, 11.0, 0)), + Some(Led(29.5, 11.0, 0)), + Some(Led(30.5, 11.0, 0)), + Some(Led(31.5, 11.0, 0)), + None, + Some(Led(3.0, 12.0, 0)), + Some(Led(4.0, 12.0, 0)), + Some(Led(5.0, 12.0, 0)), + Some(Led(6.0, 12.0, 0)), + Some(Led(7.0, 12.0, 0)), + Some(Led(8.0, 12.0, 0)), + Some(Led(9.0, 12.0, 0)), + Some(Led(10.0, 12.0, 0)), + Some(Led(11.0, 12.0, 0)), + Some(Led(12.0, 12.0, 0)), + Some(Led(13.0, 12.0, 0)), + Some(Led(14.0, 12.0, 0)), + Some(Led(15.0, 12.0, 0)), + Some(Led(16.0, 12.0, 0)), + Some(Led(17.0, 12.0, 0)), + Some(Led(18.0, 12.0, 0)), + Some(Led(19.0, 12.0, 0)), + Some(Led(20.0, 12.0, 0)), + Some(Led(21.0, 12.0, 0)), + Some(Led(22.0, 12.0, 0)), + Some(Led(23.0, 12.0, 0)), + Some(Led(24.0, 12.0, 0)), + Some(Led(25.0, 12.0, 0)), + Some(Led(26.0, 12.0, 0)), + Some(Led(27.0, 12.0, 0)), + Some(Led(28.0, 12.0, 0)), + Some(Led(29.0, 12.0, 0)), + Some(Led(30.0, 12.0, 0)), + Some(Led(31.0, 12.0, 0)), + Some(Led(32.0, 12.0, 0)), + Some(Led(3.5, 13.0, 0)), + Some(Led(4.5, 13.0, 0)), + Some(Led(5.5, 13.0, 0)), + Some(Led(6.5, 13.0, 0)), + Some(Led(7.5, 13.0, 0)), + Some(Led(8.5, 13.0, 0)), + Some(Led(9.5, 13.0, 0)), + Some(Led(10.5, 13.0, 0)), + Some(Led(11.5, 13.0, 0)), + Some(Led(12.5, 13.0, 0)), + Some(Led(13.5, 13.0, 0)), + Some(Led(14.5, 13.0, 0)), + Some(Led(15.5, 13.0, 0)), + Some(Led(16.5, 13.0, 0)), + Some(Led(17.5, 13.0, 0)), + Some(Led(18.5, 13.0, 0)), + Some(Led(19.5, 13.0, 0)), + Some(Led(20.5, 13.0, 0)), + Some(Led(21.5, 13.0, 0)), + Some(Led(22.5, 13.0, 0)), + Some(Led(23.5, 13.0, 0)), + Some(Led(24.5, 13.0, 0)), + Some(Led(25.5, 13.0, 0)), + Some(Led(26.5, 13.0, 0)), + Some(Led(27.5, 13.0, 0)), + Some(Led(28.5, 13.0, 0)), + Some(Led(29.5, 13.0, 0)), + Some(Led(30.5, 13.0, 0)), + Some(Led(31.5, 13.0, 0)), + None, + Some(Led(4.0, 14.0, 0)), + Some(Led(5.0, 14.0, 0)), + Some(Led(6.0, 14.0, 0)), + Some(Led(7.0, 14.0, 0)), + Some(Led(8.0, 14.0, 0)), + Some(Led(9.0, 14.0, 0)), + Some(Led(10.0, 14.0, 0)), + Some(Led(11.0, 14.0, 0)), + Some(Led(12.0, 14.0, 0)), + Some(Led(13.0, 14.0, 0)), + Some(Led(14.0, 14.0, 0)), + Some(Led(15.0, 14.0, 0)), + Some(Led(16.0, 14.0, 0)), + Some(Led(17.0, 14.0, 0)), + Some(Led(18.0, 14.0, 0)), + Some(Led(19.0, 14.0, 0)), + Some(Led(20.0, 14.0, 0)), + Some(Led(21.0, 14.0, 0)), + Some(Led(22.0, 14.0, 0)), + Some(Led(23.0, 14.0, 0)), + Some(Led(24.0, 14.0, 0)), + Some(Led(25.0, 14.0, 0)), + Some(Led(26.0, 14.0, 0)), + Some(Led(27.0, 14.0, 0)), + Some(Led(28.0, 14.0, 0)), + Some(Led(29.0, 14.0, 0)), + Some(Led(30.0, 14.0, 0)), + Some(Led(31.0, 14.0, 0)), + Some(Led(32.0, 14.0, 0)), + Some(Led(4.5, 15.0, 0)), + Some(Led(5.5, 15.0, 0)), + Some(Led(6.5, 15.0, 0)), + Some(Led(7.5, 15.0, 0)), + Some(Led(8.5, 15.0, 0)), + Some(Led(9.5, 15.0, 0)), + Some(Led(10.5, 15.0, 0)), + Some(Led(11.5, 15.0, 0)), + Some(Led(12.5, 15.0, 0)), + Some(Led(13.5, 15.0, 0)), + Some(Led(14.5, 15.0, 0)), + Some(Led(15.5, 15.0, 0)), + Some(Led(16.5, 15.0, 0)), + Some(Led(17.5, 15.0, 0)), + Some(Led(18.5, 15.0, 0)), + Some(Led(19.5, 15.0, 0)), + Some(Led(20.5, 15.0, 0)), + Some(Led(21.5, 15.0, 0)), + Some(Led(22.5, 15.0, 0)), + Some(Led(23.5, 15.0, 0)), + Some(Led(24.5, 15.0, 0)), + Some(Led(25.5, 15.0, 0)), + Some(Led(26.5, 15.0, 0)), + Some(Led(27.5, 15.0, 0)), + Some(Led(28.5, 15.0, 0)), + Some(Led(29.5, 15.0, 0)), + Some(Led(30.5, 15.0, 0)), + Some(Led(31.5, 15.0, 0)), + None, + Some(Led(5.0, 16.0, 0)), + Some(Led(6.0, 16.0, 0)), + Some(Led(7.0, 16.0, 0)), + Some(Led(8.0, 16.0, 0)), + Some(Led(9.0, 16.0, 0)), + Some(Led(10.0, 16.0, 0)), + Some(Led(11.0, 16.0, 0)), + Some(Led(12.0, 16.0, 0)), + Some(Led(13.0, 16.0, 0)), + Some(Led(14.0, 16.0, 0)), + Some(Led(15.0, 16.0, 0)), + Some(Led(16.0, 16.0, 0)), + Some(Led(17.0, 16.0, 0)), + Some(Led(18.0, 16.0, 0)), + Some(Led(19.0, 16.0, 0)), + Some(Led(20.0, 16.0, 0)), + Some(Led(21.0, 16.0, 0)), + Some(Led(22.0, 16.0, 0)), + Some(Led(23.0, 16.0, 0)), + Some(Led(24.0, 16.0, 0)), + Some(Led(25.0, 16.0, 0)), + Some(Led(26.0, 16.0, 0)), + Some(Led(27.0, 16.0, 0)), + Some(Led(28.0, 16.0, 0)), + Some(Led(29.0, 16.0, 0)), + Some(Led(30.0, 16.0, 0)), + Some(Led(31.0, 16.0, 0)), + Some(Led(32.0, 16.0, 0)), + Some(Led(5.5, 17.0, 0)), + Some(Led(6.5, 17.0, 0)), + Some(Led(7.5, 17.0, 0)), + Some(Led(8.5, 17.0, 0)), + Some(Led(9.5, 17.0, 0)), + Some(Led(10.5, 17.0, 0)), + Some(Led(11.5, 17.0, 0)), + Some(Led(12.5, 17.0, 0)), + Some(Led(13.5, 17.0, 0)), + Some(Led(14.5, 17.0, 0)), + Some(Led(15.5, 17.0, 0)), + Some(Led(16.5, 17.0, 0)), + Some(Led(17.5, 17.0, 0)), + Some(Led(18.5, 17.0, 0)), + Some(Led(19.5, 17.0, 0)), + Some(Led(20.5, 17.0, 0)), + Some(Led(21.5, 17.0, 0)), + Some(Led(22.5, 17.0, 0)), + Some(Led(23.5, 17.0, 0)), + Some(Led(24.5, 17.0, 0)), + Some(Led(25.5, 17.0, 0)), + Some(Led(26.5, 17.0, 0)), + Some(Led(27.5, 17.0, 0)), + Some(Led(28.5, 17.0, 0)), + Some(Led(29.5, 17.0, 0)), + Some(Led(30.5, 17.0, 0)), + Some(Led(31.5, 17.0, 0)), + None, + Some(Led(6.0, 18.0, 0)), + Some(Led(7.0, 18.0, 0)), + Some(Led(8.0, 18.0, 0)), + Some(Led(9.0, 18.0, 0)), + Some(Led(10.0, 18.0, 0)), + Some(Led(11.0, 18.0, 0)), + Some(Led(12.0, 18.0, 0)), + Some(Led(13.0, 18.0, 0)), + Some(Led(14.0, 18.0, 0)), + Some(Led(15.0, 18.0, 0)), + Some(Led(16.0, 18.0, 0)), + Some(Led(17.0, 18.0, 0)), + Some(Led(18.0, 18.0, 0)), + Some(Led(19.0, 18.0, 0)), + Some(Led(20.0, 18.0, 0)), + Some(Led(21.0, 18.0, 0)), + Some(Led(22.0, 18.0, 0)), + Some(Led(23.0, 18.0, 0)), + Some(Led(24.0, 18.0, 0)), + Some(Led(25.0, 18.0, 0)), + Some(Led(26.0, 18.0, 0)), + Some(Led(27.0, 18.0, 0)), + Some(Led(28.0, 18.0, 0)), + Some(Led(29.0, 18.0, 0)), + Some(Led(30.0, 18.0, 0)), + Some(Led(31.0, 18.0, 0)), + Some(Led(32.0, 18.0, 0)), + Some(Led(6.5, 19.0, 0)), + Some(Led(7.5, 19.0, 0)), + Some(Led(8.5, 19.0, 0)), + Some(Led(9.5, 19.0, 0)), + Some(Led(10.5, 19.0, 0)), + Some(Led(11.5, 19.0, 0)), + Some(Led(12.5, 19.0, 0)), + Some(Led(13.5, 19.0, 0)), + Some(Led(14.5, 19.0, 0)), + Some(Led(15.5, 19.0, 0)), + Some(Led(16.5, 19.0, 0)), + Some(Led(17.5, 19.0, 0)), + Some(Led(18.5, 19.0, 0)), + Some(Led(19.5, 19.0, 0)), + Some(Led(20.5, 19.0, 0)), + Some(Led(21.5, 19.0, 0)), + Some(Led(22.5, 19.0, 0)), + Some(Led(23.5, 19.0, 0)), + Some(Led(24.5, 19.0, 0)), + Some(Led(25.5, 19.0, 0)), + Some(Led(26.5, 19.0, 0)), + Some(Led(27.5, 19.0, 0)), + Some(Led(28.5, 19.0, 0)), + Some(Led(29.5, 19.0, 0)), + Some(Led(30.5, 19.0, 0)), + Some(Led(31.5, 19.0, 0)), + None, + Some(Led(7.0, 20.0, 0)), + Some(Led(8.0, 20.0, 0)), + Some(Led(9.0, 20.0, 0)), + Some(Led(10.0, 20.0, 0)), + Some(Led(11.0, 20.0, 0)), + Some(Led(12.0, 20.0, 0)), + Some(Led(13.0, 20.0, 0)), + Some(Led(14.0, 20.0, 0)), + Some(Led(15.0, 20.0, 0)), + Some(Led(16.0, 20.0, 0)), + Some(Led(17.0, 20.0, 0)), + Some(Led(18.0, 20.0, 0)), + Some(Led(19.0, 20.0, 0)), + Some(Led(20.0, 20.0, 0)), + Some(Led(21.0, 20.0, 0)), + Some(Led(22.0, 20.0, 0)), + Some(Led(23.0, 20.0, 0)), + Some(Led(24.0, 20.0, 0)), + Some(Led(25.0, 20.0, 0)), + Some(Led(26.0, 20.0, 0)), + Some(Led(27.0, 20.0, 0)), + Some(Led(28.0, 20.0, 0)), + Some(Led(29.0, 20.0, 0)), + Some(Led(30.0, 20.0, 0)), + Some(Led(31.0, 20.0, 0)), + Some(Led(32.0, 20.0, 0)), + Some(Led(7.5, 21.0, 0)), + Some(Led(8.5, 21.0, 0)), + Some(Led(9.5, 21.0, 0)), + Some(Led(10.5, 21.0, 0)), + Some(Led(11.5, 21.0, 0)), + Some(Led(12.5, 21.0, 0)), + Some(Led(13.5, 21.0, 0)), + Some(Led(14.5, 21.0, 0)), + Some(Led(15.5, 21.0, 0)), + Some(Led(16.5, 21.0, 0)), + Some(Led(17.5, 21.0, 0)), + Some(Led(18.5, 21.0, 0)), + Some(Led(19.5, 21.0, 0)), + Some(Led(20.5, 21.0, 0)), + Some(Led(21.5, 21.0, 0)), + Some(Led(22.5, 21.0, 0)), + Some(Led(23.5, 21.0, 0)), + Some(Led(24.5, 21.0, 0)), + Some(Led(25.5, 21.0, 0)), + Some(Led(26.5, 21.0, 0)), + Some(Led(27.5, 21.0, 0)), + Some(Led(28.5, 21.0, 0)), + Some(Led(29.5, 21.0, 0)), + Some(Led(30.5, 21.0, 0)), + Some(Led(31.5, 21.0, 0)), + None, + Some(Led(8.0, 22.0, 0)), + Some(Led(9.0, 22.0, 0)), + Some(Led(10.0, 22.0, 0)), + Some(Led(11.0, 22.0, 0)), + Some(Led(12.0, 22.0, 0)), + Some(Led(13.0, 22.0, 0)), + Some(Led(14.0, 22.0, 0)), + Some(Led(15.0, 22.0, 0)), + Some(Led(16.0, 22.0, 0)), + Some(Led(17.0, 22.0, 0)), + Some(Led(18.0, 22.0, 0)), + Some(Led(19.0, 22.0, 0)), + Some(Led(20.0, 22.0, 0)), + Some(Led(21.0, 22.0, 0)), + Some(Led(22.0, 22.0, 0)), + Some(Led(23.0, 22.0, 0)), + Some(Led(24.0, 22.0, 0)), + Some(Led(25.0, 22.0, 0)), + Some(Led(26.0, 22.0, 0)), + Some(Led(27.0, 22.0, 0)), + Some(Led(28.0, 22.0, 0)), + Some(Led(29.0, 22.0, 0)), + Some(Led(30.0, 22.0, 0)), + Some(Led(31.0, 22.0, 0)), + Some(Led(32.0, 22.0, 0)), + Some(Led(8.5, 23.0, 0)), + Some(Led(9.5, 23.0, 0)), + Some(Led(10.5, 23.0, 0)), + Some(Led(11.5, 23.0, 0)), + Some(Led(12.5, 23.0, 0)), + Some(Led(13.5, 23.0, 0)), + Some(Led(14.5, 23.0, 0)), + Some(Led(15.5, 23.0, 0)), + Some(Led(16.5, 23.0, 0)), + Some(Led(17.5, 23.0, 0)), + Some(Led(18.5, 23.0, 0)), + Some(Led(19.5, 23.0, 0)), + Some(Led(20.5, 23.0, 0)), + Some(Led(21.5, 23.0, 0)), + Some(Led(22.5, 23.0, 0)), + Some(Led(23.5, 23.0, 0)), + Some(Led(24.5, 23.0, 0)), + Some(Led(25.5, 23.0, 0)), + Some(Led(26.5, 23.0, 0)), + Some(Led(27.5, 23.0, 0)), + Some(Led(28.5, 23.0, 0)), + Some(Led(29.5, 23.0, 0)), + Some(Led(30.5, 23.0, 0)), + Some(Led(31.5, 23.0, 0)), + None, + Some(Led(9.0, 24.0, 0)), + Some(Led(10.0, 24.0, 0)), + Some(Led(11.0, 24.0, 0)), + Some(Led(12.0, 24.0, 0)), + Some(Led(13.0, 24.0, 0)), + Some(Led(14.0, 24.0, 0)), + Some(Led(15.0, 24.0, 0)), + Some(Led(16.0, 24.0, 0)), + Some(Led(17.0, 24.0, 0)), + Some(Led(18.0, 24.0, 0)), + Some(Led(19.0, 24.0, 0)), + Some(Led(20.0, 24.0, 0)), + Some(Led(21.0, 24.0, 0)), + Some(Led(22.0, 24.0, 0)), + Some(Led(23.0, 24.0, 0)), + Some(Led(24.0, 24.0, 0)), + Some(Led(25.0, 24.0, 0)), + Some(Led(26.0, 24.0, 0)), + Some(Led(27.0, 24.0, 0)), + Some(Led(28.0, 24.0, 0)), + Some(Led(29.0, 24.0, 0)), + Some(Led(30.0, 24.0, 0)), + Some(Led(31.0, 24.0, 0)), + Some(Led(32.0, 24.0, 0)), + Some(Led(9.5, 25.0, 0)), + Some(Led(10.5, 25.0, 0)), + Some(Led(11.5, 25.0, 0)), + Some(Led(12.5, 25.0, 0)), + Some(Led(13.5, 25.0, 0)), + Some(Led(14.5, 25.0, 0)), + Some(Led(15.5, 25.0, 0)), + Some(Led(16.5, 25.0, 0)), + Some(Led(17.5, 25.0, 0)), + Some(Led(18.5, 25.0, 0)), + Some(Led(19.5, 25.0, 0)), + Some(Led(20.5, 25.0, 0)), + Some(Led(21.5, 25.0, 0)), + Some(Led(22.5, 25.0, 0)), + Some(Led(23.5, 25.0, 0)), + Some(Led(24.5, 25.0, 0)), + Some(Led(25.5, 25.0, 0)), + Some(Led(26.5, 25.0, 0)), + Some(Led(27.5, 25.0, 0)), + Some(Led(28.5, 25.0, 0)), + Some(Led(29.5, 25.0, 0)), + Some(Led(30.5, 25.0, 0)), + Some(Led(31.5, 25.0, 0)), + None, + Some(Led(10.0, 26.0, 0)), + Some(Led(11.0, 26.0, 0)), + Some(Led(12.0, 26.0, 0)), + Some(Led(13.0, 26.0, 0)), + Some(Led(14.0, 26.0, 0)), + Some(Led(15.0, 26.0, 0)), + Some(Led(16.0, 26.0, 0)), + Some(Led(17.0, 26.0, 0)), + Some(Led(18.0, 26.0, 0)), + Some(Led(19.0, 26.0, 0)), + Some(Led(20.0, 26.0, 0)), + Some(Led(21.0, 26.0, 0)), + Some(Led(22.0, 26.0, 0)), + Some(Led(23.0, 26.0, 0)), + Some(Led(24.0, 26.0, 0)), + Some(Led(25.0, 26.0, 0)), + Some(Led(26.0, 26.0, 0)), + Some(Led(27.0, 26.0, 0)), + Some(Led(28.0, 26.0, 0)), + Some(Led(29.0, 26.0, 0)), + Some(Led(30.0, 26.0, 0)), + Some(Led(31.0, 26.0, 0)), + Some(Led(32.0, 26.0, 0)), + Some(Led(10.5, 27.0, 0)), + Some(Led(11.5, 27.0, 0)), + Some(Led(12.5, 27.0, 0)), + Some(Led(13.5, 27.0, 0)), + Some(Led(14.5, 27.0, 0)), + Some(Led(15.5, 27.0, 0)), + Some(Led(16.5, 27.0, 0)), + Some(Led(17.5, 27.0, 0)), + Some(Led(18.5, 27.0, 0)), + Some(Led(19.5, 27.0, 0)), + Some(Led(20.5, 27.0, 0)), + Some(Led(21.5, 27.0, 0)), + Some(Led(22.5, 27.0, 0)), + Some(Led(23.5, 27.0, 0)), + Some(Led(24.5, 27.0, 0)), + Some(Led(25.5, 27.0, 0)), + Some(Led(26.5, 27.0, 0)), + Some(Led(27.5, 27.0, 0)), + Some(Led(28.5, 27.0, 0)), + Some(Led(29.5, 27.0, 0)), + Some(Led(30.5, 27.0, 0)), + Some(Led(31.5, 27.0, 0)), + None, + Some(Led(11.0, 28.0, 0)), + Some(Led(12.0, 28.0, 0)), + Some(Led(13.0, 28.0, 0)), + Some(Led(14.0, 28.0, 0)), + Some(Led(15.0, 28.0, 0)), + Some(Led(16.0, 28.0, 0)), + Some(Led(17.0, 28.0, 0)), + Some(Led(18.0, 28.0, 0)), + Some(Led(19.0, 28.0, 0)), + Some(Led(20.0, 28.0, 0)), + Some(Led(21.0, 28.0, 0)), + Some(Led(22.0, 28.0, 0)), + Some(Led(23.0, 28.0, 0)), + Some(Led(24.0, 28.0, 0)), + Some(Led(25.0, 28.0, 0)), + Some(Led(26.0, 28.0, 0)), + Some(Led(27.0, 28.0, 0)), + Some(Led(28.0, 28.0, 0)), + Some(Led(29.0, 28.0, 0)), + Some(Led(30.0, 28.0, 0)), + Some(Led(31.0, 28.0, 0)), + Some(Led(32.0, 28.0, 0)), + Some(Led(11.5, 29.0, 0)), + Some(Led(12.5, 29.0, 0)), + Some(Led(13.5, 29.0, 0)), + Some(Led(14.5, 29.0, 0)), + Some(Led(15.5, 29.0, 0)), + Some(Led(16.5, 29.0, 0)), + Some(Led(17.5, 29.0, 0)), + Some(Led(18.5, 29.0, 0)), + Some(Led(19.5, 29.0, 0)), + Some(Led(20.5, 29.0, 0)), + Some(Led(21.5, 29.0, 0)), + Some(Led(22.5, 29.0, 0)), + Some(Led(23.5, 29.0, 0)), + Some(Led(24.5, 29.0, 0)), + Some(Led(25.5, 29.0, 0)), + Some(Led(26.5, 29.0, 0)), + Some(Led(27.5, 29.0, 0)), + Some(Led(28.5, 29.0, 0)), + Some(Led(29.5, 29.0, 0)), + Some(Led(30.5, 29.0, 0)), + Some(Led(31.5, 29.0, 0)), + None, + Some(Led(12.0, 30.0, 0)), + Some(Led(13.0, 30.0, 0)), + Some(Led(14.0, 30.0, 0)), + Some(Led(15.0, 30.0, 0)), + Some(Led(16.0, 30.0, 0)), + Some(Led(17.0, 30.0, 0)), + Some(Led(18.0, 30.0, 0)), + Some(Led(19.0, 30.0, 0)), + Some(Led(20.0, 30.0, 0)), + Some(Led(21.0, 30.0, 0)), + Some(Led(22.0, 30.0, 0)), + Some(Led(23.0, 30.0, 0)), + Some(Led(24.0, 30.0, 0)), + Some(Led(25.0, 30.0, 0)), + Some(Led(26.0, 30.0, 0)), + Some(Led(27.0, 30.0, 0)), + Some(Led(28.0, 30.0, 0)), + Some(Led(29.0, 30.0, 0)), + Some(Led(30.0, 30.0, 0)), + Some(Led(31.0, 30.0, 0)), + Some(Led(32.0, 30.0, 0)), + Some(Led(12.5, 31.0, 0)), + Some(Led(13.5, 31.0, 0)), + Some(Led(14.5, 31.0, 0)), + Some(Led(15.5, 31.0, 0)), + Some(Led(16.5, 31.0, 0)), + Some(Led(17.5, 31.0, 0)), + Some(Led(18.5, 31.0, 0)), + Some(Led(19.5, 31.0, 0)), + Some(Led(20.5, 31.0, 0)), + Some(Led(21.5, 31.0, 0)), + Some(Led(22.5, 31.0, 0)), + Some(Led(23.5, 31.0, 0)), + Some(Led(24.5, 31.0, 0)), + Some(Led(25.5, 31.0, 0)), + Some(Led(26.5, 31.0, 0)), + Some(Led(27.5, 31.0, 0)), + Some(Led(28.5, 31.0, 0)), + Some(Led(29.5, 31.0, 0)), + Some(Led(30.5, 31.0, 0)), + Some(Led(31.5, 31.0, 0)), + None, + Some(Led(13.0, 32.0, 0)), + Some(Led(14.0, 32.0, 0)), + Some(Led(15.0, 32.0, 0)), + Some(Led(16.0, 32.0, 0)), + Some(Led(17.0, 32.0, 0)), + Some(Led(18.0, 32.0, 0)), + Some(Led(19.0, 32.0, 0)), + Some(Led(20.0, 32.0, 0)), + Some(Led(21.0, 32.0, 0)), + Some(Led(22.0, 32.0, 0)), + Some(Led(23.0, 32.0, 0)), + Some(Led(24.0, 32.0, 0)), + Some(Led(25.0, 32.0, 0)), + Some(Led(26.0, 32.0, 0)), + Some(Led(27.0, 32.0, 0)), + Some(Led(28.0, 32.0, 0)), + Some(Led(29.0, 32.0, 0)), + Some(Led(30.0, 32.0, 0)), + Some(Led(31.0, 32.0, 0)), + Some(Led(32.0, 32.0, 0)), + Some(Led(13.5, 33.0, 0)), + Some(Led(14.5, 33.0, 0)), + Some(Led(15.5, 33.0, 0)), + Some(Led(16.5, 33.0, 0)), + Some(Led(17.5, 33.0, 0)), + Some(Led(18.5, 33.0, 0)), + Some(Led(19.5, 33.0, 0)), + Some(Led(20.5, 33.0, 0)), + Some(Led(21.5, 33.0, 0)), + Some(Led(22.5, 33.0, 0)), + Some(Led(23.5, 33.0, 0)), + Some(Led(24.5, 33.0, 0)), + Some(Led(25.5, 33.0, 0)), + Some(Led(26.5, 33.0, 0)), + Some(Led(27.5, 33.0, 0)), + Some(Led(28.5, 33.0, 0)), + Some(Led(29.5, 33.0, 0)), + Some(Led(30.5, 33.0, 0)), + Some(Led(31.5, 33.0, 0)), + None, + Some(Led(14.0, 34.0, 0)), + Some(Led(15.0, 34.0, 0)), + Some(Led(16.0, 34.0, 0)), + Some(Led(17.0, 34.0, 0)), + Some(Led(18.0, 34.0, 0)), + Some(Led(19.0, 34.0, 0)), + Some(Led(20.0, 34.0, 0)), + Some(Led(21.0, 34.0, 0)), + Some(Led(22.0, 34.0, 0)), + Some(Led(23.0, 34.0, 0)), + Some(Led(24.0, 34.0, 0)), + Some(Led(25.0, 34.0, 0)), + Some(Led(26.0, 34.0, 0)), + Some(Led(27.0, 34.0, 0)), + Some(Led(28.0, 34.0, 0)), + Some(Led(29.0, 34.0, 0)), + Some(Led(30.0, 34.0, 0)), + Some(Led(31.0, 34.0, 0)), + Some(Led(32.0, 34.0, 0)), + Some(Led(14.5, 35.0, 0)), + Some(Led(15.5, 35.0, 0)), + Some(Led(16.5, 35.0, 0)), + Some(Led(17.5, 35.0, 0)), + Some(Led(18.5, 35.0, 0)), + Some(Led(19.5, 35.0, 0)), + Some(Led(20.5, 35.0, 0)), + Some(Led(21.5, 35.0, 0)), + Some(Led(22.5, 35.0, 0)), + Some(Led(23.5, 35.0, 0)), + Some(Led(24.5, 35.0, 0)), + Some(Led(25.5, 35.0, 0)), + Some(Led(26.5, 35.0, 0)), + Some(Led(27.5, 35.0, 0)), + Some(Led(28.5, 35.0, 0)), + Some(Led(29.5, 35.0, 0)), + Some(Led(30.5, 35.0, 0)), + Some(Led(31.5, 35.0, 0)), + None, + Some(Led(15.0, 36.0, 0)), + Some(Led(16.0, 36.0, 0)), + Some(Led(17.0, 36.0, 0)), + Some(Led(18.0, 36.0, 0)), + Some(Led(19.0, 36.0, 0)), + Some(Led(20.0, 36.0, 0)), + Some(Led(21.0, 36.0, 0)), + Some(Led(22.0, 36.0, 0)), + Some(Led(23.0, 36.0, 0)), + Some(Led(24.0, 36.0, 0)), + Some(Led(25.0, 36.0, 0)), + Some(Led(26.0, 36.0, 0)), + Some(Led(27.0, 36.0, 0)), + Some(Led(28.0, 36.0, 0)), + Some(Led(29.0, 36.0, 0)), + Some(Led(30.0, 36.0, 0)), + Some(Led(31.0, 36.0, 0)), + Some(Led(32.0, 36.0, 0)), + Some(Led(15.5, 37.0, 0)), + Some(Led(16.5, 37.0, 0)), + Some(Led(17.5, 37.0, 0)), + Some(Led(18.5, 37.0, 0)), + Some(Led(19.5, 37.0, 0)), + Some(Led(20.5, 37.0, 0)), + Some(Led(21.5, 37.0, 0)), + Some(Led(22.5, 37.0, 0)), + Some(Led(23.5, 37.0, 0)), + Some(Led(24.5, 37.0, 0)), + Some(Led(25.5, 37.0, 0)), + Some(Led(26.5, 37.0, 0)), + Some(Led(27.5, 37.0, 0)), + Some(Led(28.5, 37.0, 0)), + Some(Led(29.5, 37.0, 0)), + Some(Led(30.5, 37.0, 0)), + Some(Led(31.5, 37.0, 0)), + None, + Some(Led(16.0, 38.0, 0)), + Some(Led(17.0, 38.0, 0)), + Some(Led(18.0, 38.0, 0)), + Some(Led(19.0, 38.0, 0)), + Some(Led(20.0, 38.0, 0)), + Some(Led(21.0, 38.0, 0)), + Some(Led(22.0, 38.0, 0)), + Some(Led(23.0, 38.0, 0)), + Some(Led(24.0, 38.0, 0)), + Some(Led(25.0, 38.0, 0)), + Some(Led(26.0, 38.0, 0)), + Some(Led(27.0, 38.0, 0)), + Some(Led(28.0, 38.0, 0)), + Some(Led(29.0, 38.0, 0)), + Some(Led(30.0, 38.0, 0)), + Some(Led(31.0, 38.0, 0)), + Some(Led(32.0, 38.0, 0)), + Some(Led(16.5, 39.0, 0)), + Some(Led(17.5, 39.0, 0)), + Some(Led(18.5, 39.0, 0)), + Some(Led(19.5, 39.0, 0)), + Some(Led(20.5, 39.0, 0)), + Some(Led(21.5, 39.0, 0)), + Some(Led(22.5, 39.0, 0)), + Some(Led(23.5, 39.0, 0)), + Some(Led(24.5, 39.0, 0)), + Some(Led(25.5, 39.0, 0)), + Some(Led(26.5, 39.0, 0)), + Some(Led(27.5, 39.0, 0)), + Some(Led(28.5, 39.0, 0)), + Some(Led(29.5, 39.0, 0)), + Some(Led(30.5, 39.0, 0)), + Some(Led(31.5, 39.0, 0)), + None, + Some(Led(17.0, 40.0, 0)), + Some(Led(18.0, 40.0, 0)), + Some(Led(19.0, 40.0, 0)), + Some(Led(20.0, 40.0, 0)), + Some(Led(21.0, 40.0, 0)), + Some(Led(22.0, 40.0, 0)), + Some(Led(23.0, 40.0, 0)), + Some(Led(24.0, 40.0, 0)), + Some(Led(25.0, 40.0, 0)), + Some(Led(26.0, 40.0, 0)), + Some(Led(27.0, 40.0, 0)), + Some(Led(28.0, 40.0, 0)), + Some(Led(29.0, 40.0, 0)), + Some(Led(30.0, 40.0, 0)), + Some(Led(31.0, 40.0, 0)), + Some(Led(32.0, 40.0, 0)), + Some(Led(17.5, 41.0, 0)), + Some(Led(18.5, 41.0, 0)), + Some(Led(19.5, 41.0, 0)), + Some(Led(20.5, 41.0, 0)), + Some(Led(21.5, 41.0, 0)), + Some(Led(22.5, 41.0, 0)), + Some(Led(23.5, 41.0, 0)), + Some(Led(24.5, 41.0, 0)), + Some(Led(25.5, 41.0, 0)), + Some(Led(26.5, 41.0, 0)), + Some(Led(27.5, 41.0, 0)), + Some(Led(28.5, 41.0, 0)), + Some(Led(29.5, 41.0, 0)), + Some(Led(30.5, 41.0, 0)), + Some(Led(31.5, 41.0, 0)), + None, + Some(Led(18.0, 42.0, 0)), + Some(Led(19.0, 42.0, 0)), + Some(Led(20.0, 42.0, 0)), + Some(Led(21.0, 42.0, 0)), + Some(Led(22.0, 42.0, 0)), + Some(Led(23.0, 42.0, 0)), + Some(Led(24.0, 42.0, 0)), + Some(Led(25.0, 42.0, 0)), + Some(Led(26.0, 42.0, 0)), + Some(Led(27.0, 42.0, 0)), + Some(Led(28.0, 42.0, 0)), + Some(Led(29.0, 42.0, 0)), + Some(Led(30.0, 42.0, 0)), + Some(Led(31.0, 42.0, 0)), + Some(Led(32.0, 42.0, 0)), + Some(Led(18.5, 43.0, 0)), + Some(Led(19.5, 43.0, 0)), + Some(Led(20.5, 43.0, 0)), + Some(Led(21.5, 43.0, 0)), + Some(Led(22.5, 43.0, 0)), + Some(Led(23.5, 43.0, 0)), + Some(Led(24.5, 43.0, 0)), + Some(Led(25.5, 43.0, 0)), + Some(Led(26.5, 43.0, 0)), + Some(Led(27.5, 43.0, 0)), + Some(Led(28.5, 43.0, 0)), + Some(Led(29.5, 43.0, 0)), + Some(Led(30.5, 43.0, 0)), + Some(Led(31.5, 43.0, 0)), + None, + Some(Led(19.0, 44.0, 0)), + Some(Led(20.0, 44.0, 0)), + Some(Led(21.0, 44.0, 0)), + Some(Led(22.0, 44.0, 0)), + Some(Led(23.0, 44.0, 0)), + Some(Led(24.0, 44.0, 0)), + Some(Led(25.0, 44.0, 0)), + Some(Led(26.0, 44.0, 0)), + Some(Led(27.0, 44.0, 0)), + Some(Led(28.0, 44.0, 0)), + Some(Led(29.0, 44.0, 0)), + Some(Led(30.0, 44.0, 0)), + Some(Led(31.0, 44.0, 0)), + Some(Led(32.0, 44.0, 0)), + Some(Led(19.5, 45.0, 0)), + Some(Led(20.5, 45.0, 0)), + Some(Led(21.5, 45.0, 0)), + Some(Led(22.5, 45.0, 0)), + Some(Led(23.5, 45.0, 0)), + Some(Led(24.5, 45.0, 0)), + Some(Led(25.5, 45.0, 0)), + Some(Led(26.5, 45.0, 0)), + Some(Led(27.5, 45.0, 0)), + Some(Led(28.5, 45.0, 0)), + Some(Led(29.5, 45.0, 0)), + Some(Led(30.5, 45.0, 0)), + Some(Led(31.5, 45.0, 0)), + None, + Some(Led(20.0, 46.0, 0)), + Some(Led(21.0, 46.0, 0)), + Some(Led(22.0, 46.0, 0)), + Some(Led(23.0, 46.0, 0)), + Some(Led(24.0, 46.0, 0)), + Some(Led(25.0, 46.0, 0)), + Some(Led(26.0, 46.0, 0)), + Some(Led(27.0, 46.0, 0)), + Some(Led(28.0, 46.0, 0)), + Some(Led(29.0, 46.0, 0)), + Some(Led(30.0, 46.0, 0)), + Some(Led(31.0, 46.0, 0)), + Some(Led(32.0, 46.0, 0)), + Some(Led(20.5, 47.0, 0)), + Some(Led(21.5, 47.0, 0)), + Some(Led(22.5, 47.0, 0)), + Some(Led(23.5, 47.0, 0)), + Some(Led(24.5, 47.0, 0)), + Some(Led(25.5, 47.0, 0)), + Some(Led(26.5, 47.0, 0)), + Some(Led(27.5, 47.0, 0)), + Some(Led(28.5, 47.0, 0)), + Some(Led(29.5, 47.0, 0)), + Some(Led(30.5, 47.0, 0)), + Some(Led(31.5, 47.0, 0)), + None, + Some(Led(21.0, 48.0, 0)), + Some(Led(22.0, 48.0, 0)), + Some(Led(23.0, 48.0, 0)), + Some(Led(24.0, 48.0, 0)), + Some(Led(25.0, 48.0, 0)), + Some(Led(26.0, 48.0, 0)), + Some(Led(27.0, 48.0, 0)), + Some(Led(28.0, 48.0, 0)), + Some(Led(29.0, 48.0, 0)), + Some(Led(30.0, 48.0, 0)), + Some(Led(31.0, 48.0, 0)), + Some(Led(32.0, 48.0, 0)), + Some(Led(21.5, 49.0, 0)), + Some(Led(22.5, 49.0, 0)), + Some(Led(23.5, 49.0, 0)), + Some(Led(24.5, 49.0, 0)), + Some(Led(25.5, 49.0, 0)), + Some(Led(26.5, 49.0, 0)), + Some(Led(27.5, 49.0, 0)), + Some(Led(28.5, 49.0, 0)), + Some(Led(29.5, 49.0, 0)), + Some(Led(30.5, 49.0, 0)), + Some(Led(31.5, 49.0, 0)), + None, + Some(Led(22.0, 50.0, 0)), + Some(Led(23.0, 50.0, 0)), + Some(Led(24.0, 50.0, 0)), + Some(Led(25.0, 50.0, 0)), + Some(Led(26.0, 50.0, 0)), + Some(Led(27.0, 50.0, 0)), + Some(Led(28.0, 50.0, 0)), + Some(Led(29.0, 50.0, 0)), + Some(Led(30.0, 50.0, 0)), + Some(Led(31.0, 50.0, 0)), + Some(Led(32.0, 50.0, 0)), + Some(Led(22.5, 51.0, 0)), + Some(Led(23.5, 51.0, 0)), + Some(Led(24.5, 51.0, 0)), + Some(Led(25.5, 51.0, 0)), + Some(Led(26.5, 51.0, 0)), + Some(Led(27.5, 51.0, 0)), + Some(Led(28.5, 51.0, 0)), + Some(Led(29.5, 51.0, 0)), + Some(Led(30.5, 51.0, 0)), + Some(Led(31.5, 51.0, 0)), + None, + Some(Led(23.0, 52.0, 0)), + Some(Led(24.0, 52.0, 0)), + Some(Led(25.0, 52.0, 0)), + Some(Led(26.0, 52.0, 0)), + Some(Led(27.0, 52.0, 0)), + Some(Led(28.0, 52.0, 0)), + Some(Led(29.0, 52.0, 0)), + Some(Led(30.0, 52.0, 0)), + Some(Led(31.0, 52.0, 0)), + Some(Led(32.0, 52.0, 0)), + Some(Led(23.5, 53.0, 0)), + Some(Led(24.5, 53.0, 0)), + Some(Led(25.5, 53.0, 0)), + Some(Led(26.5, 53.0, 0)), + Some(Led(27.5, 53.0, 0)), + Some(Led(28.5, 53.0, 0)), + Some(Led(29.5, 53.0, 0)), + Some(Led(30.5, 53.0, 0)), + Some(Led(31.5, 53.0, 0)), + None, + Some(Led(24.0, 54.0, 0)), + Some(Led(25.0, 54.0, 0)), + Some(Led(26.0, 54.0, 0)), + Some(Led(27.0, 54.0, 0)), + Some(Led(28.0, 54.0, 0)), + Some(Led(29.0, 54.0, 0)), + Some(Led(30.0, 54.0, 0)), + Some(Led(31.0, 54.0, 0)), + Some(Led(32.0, 54.0, 0)), +]; + +#[cfg(test)] +mod tests { + use crate::anime_image::*; + + #[test] + fn led_positions() { + let leds = AnimeImage::generate(); + assert_eq!(leds[0], Some(Led(0.0, 0.0, 0))); + assert_eq!(leds[1], Some(Led(1.0, 0.0, 0))); + assert_eq!(leds[2], Some(Led(2.0, 0.0, 0))); + assert_eq!(leds[32], Some(Led(32.0, 0.0, 0))); + assert_eq!(leds[33], Some(Led(-0.5, 1.0, 0))); + assert_eq!(leds[65], Some(Led(31.5, 1.0, 0))); + assert_eq!(leds[66], None); + assert_eq!(leds[67], None); + assert_eq!(leds[68], Some(Led(0.0, 2.0, 0))); + assert_eq!(leds[100], Some(Led(32.0, 2.0, 0))); + assert_eq!(leds[101], Some(Led(-0.5, 3.0, 0))); + assert_eq!(leds[133], Some(Led(31.5, 3.0, 0))); + assert_eq!(leds[134], None); + assert_eq!(leds[135], None); + assert_eq!(leds[136], Some(Led(0.0, 4.0, 0))); + assert_eq!(leds[168], Some(Led(32.0, 4.0, 0))); + assert_eq!(leds[169], Some(Led(-0.5, 5.0, 0))); + assert_eq!(leds[201], Some(Led(31.5, 5.0, 0))); + assert_eq!(leds[202], None); + assert_eq!(leds[203], Some(Led(0.0, 6.0, 0))); + assert_eq!(leds[235], Some(Led(32.0, 6.0, 0))); + assert_eq!(leds[648], Some(Led(32.0, 20.0, 0))); // end + assert_eq!(leds[649], Some(Led(7.5, 21.0, 0))); // start + assert_eq!(leds[673], Some(Led(31.5, 21.0, 0))); // end + } + + #[test] + fn led_positions_const() { + let leds = AnimeImage::generate(); + assert_eq!(leds[1], LED_IMAGE_POSITIONS[1]); + assert_eq!(leds[34], LED_IMAGE_POSITIONS[34]); + assert_eq!(leds[69], LED_IMAGE_POSITIONS[69]); + assert_eq!(leds[137], LED_IMAGE_POSITIONS[137]); + assert_eq!(leds[169], LED_IMAGE_POSITIONS[169]); + assert_eq!(leds[170], LED_IMAGE_POSITIONS[170]); + assert_eq!(leds[236], LED_IMAGE_POSITIONS[236]); + assert_eq!(leds[649], LED_IMAGE_POSITIONS[649]); + assert_eq!(leds[674], LED_IMAGE_POSITIONS[674]); + } + + #[test] + fn row_starts() { + assert_eq!(AnimeImage::first_x(5), 0); + assert_eq!(AnimeImage::first_x(6), 0); + assert_eq!(AnimeImage::first_x(7), 1); + assert_eq!(AnimeImage::first_x(8), 1); + assert_eq!(AnimeImage::first_x(9), 2); + assert_eq!(AnimeImage::first_x(10), 2); + assert_eq!(AnimeImage::first_x(11), 3); + } + + #[test] + fn row_widths() { + assert_eq!(AnimeImage::width(5), 33); + assert_eq!(AnimeImage::width(6), 33); + assert_eq!(AnimeImage::width(7), 32); + assert_eq!(AnimeImage::width(8), 32); + assert_eq!(AnimeImage::width(9), 31); + assert_eq!(AnimeImage::width(10), 31); + assert_eq!(AnimeImage::width(11), 30); + assert_eq!(AnimeImage::width(12), 30); + assert_eq!(AnimeImage::width(13), 29); + assert_eq!(AnimeImage::width(14), 29); + assert_eq!(AnimeImage::width(15), 28); + assert_eq!(AnimeImage::width(16), 28); + assert_eq!(AnimeImage::width(17), 27); + assert_eq!(AnimeImage::width(18), 27); + } + + #[test] + fn row_pitch() { + assert_eq!(AnimeImage::pitch(5), 34); + assert_eq!(AnimeImage::pitch(6), 33); + assert_eq!(AnimeImage::pitch(7), 33); + assert_eq!(AnimeImage::pitch(8), 32); + assert_eq!(AnimeImage::pitch(9), 32); + assert_eq!(AnimeImage::pitch(10), 31); + assert_eq!(AnimeImage::pitch(11), 31); + assert_eq!(AnimeImage::pitch(12), 30); + assert_eq!(AnimeImage::pitch(13), 30); + assert_eq!(AnimeImage::pitch(14), 29); + } +} diff --git a/rog-anime/src/error.rs b/rog-anime/src/error.rs new file mode 100644 index 00000000..3e7c7ddc --- /dev/null +++ b/rog-anime/src/error.rs @@ -0,0 +1,37 @@ +use std::error::Error; +use std::fmt; +use png_pong::decode::Error as PngError; + +#[derive(Debug)] +pub enum AnimeError { + NoFrames, + Io(std::io::Error), + Png(PngError), + Format +} + +impl fmt::Display for AnimeError { + // This trait requires `fmt` with this exact signature. + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + AnimeError::NoFrames => write!(f, "No frames in PNG"), + AnimeError::Io(e) => write!(f, "Could not open: {}", e), + AnimeError::Png(e) => write!(f, "PNG error: {}", e), + AnimeError::Format => write!(f, "PNG file is not 8bit greyscale"), + } + } +} + +impl Error for AnimeError {} + +impl From for AnimeError { + fn from(err: std::io::Error) -> Self { + AnimeError::Io(err) + } +} + +impl From for AnimeError { + fn from(err: PngError) -> Self { + AnimeError::Png(err) + } +} \ No newline at end of file diff --git a/rog-anime/src/lib.rs b/rog-anime/src/lib.rs new file mode 100644 index 00000000..0d9a86a0 --- /dev/null +++ b/rog-anime/src/lib.rs @@ -0,0 +1,15 @@ +/// The main data conversion for transfering in shortform over dbus or other, +/// or writing directly to the USB device +mod anime_data; +pub use anime_data::*; + +/// Useful for specialised effects that required a grid of data +mod anime_grid; +pub use anime_grid::*; + +/// Transform a PNG image for displaying on AniMe matrix display +mod anime_image; +pub use anime_image::*; + +/// Base errors that are possible +pub mod error; \ No newline at end of file diff --git a/rog-dbus/Cargo.toml b/rog-dbus/Cargo.toml index fd1e3778..bab8ceb7 100644 --- a/rog-dbus/Cargo.toml +++ b/rog-dbus/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rog_dbus" -version = "3.1.0" +version = "3.2.0" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] @@ -11,6 +11,7 @@ edition = "2018" [dependencies] serde_json = "^1.0" +rog_anime = { path = "../rog-anime" } rog_types = { path = "../rog-types" } rog_fan_curve = { version = "^0.1", features = ["serde"] } zbus = "^1.8" diff --git a/rog-dbus/src/zbus_anime.rs b/rog-dbus/src/zbus_anime.rs index 209e6432..ed9746b8 100644 --- a/rog-dbus/src/zbus_anime.rs +++ b/rog-dbus/src/zbus_anime.rs @@ -19,7 +19,7 @@ //! //! …consequently `zbus-xmlgen` did not generate code for the above interfaces. -use rog_types::anime_matrix::{AniMeDataBuffer, AniMeImageBuffer}; +use rog_anime::AniMeDataBuffer; use zbus::{dbus_proxy, Connection, Result}; #[dbus_proxy( @@ -34,10 +34,7 @@ trait Daemon { fn set_on_off(&self, status: bool) -> zbus::Result<()>; /// WriteDirect method - fn write_direct(&self, input: &[u8]) -> zbus::Result<()>; - - /// WriteImage method - fn write_image(&self, input: &[Vec]) -> zbus::Result<()>; + fn write(&self, input: &[u8]) -> zbus::Result<()>; } pub struct AnimeProxy<'a>(DaemonProxy<'a>); @@ -63,12 +60,7 @@ impl<'a> AnimeProxy<'a> { } #[inline] - pub fn write_direct(&self, input: AniMeDataBuffer) -> Result<()> { - self.0.write_direct(input.get()) - } - - #[inline] - pub fn write_image(&self, input: AniMeImageBuffer) -> Result<()> { - self.0.write_image(input.get()) + pub fn write(&self, input: AniMeDataBuffer) -> Result<()> { + self.0.write(input.get()) } } diff --git a/rog-dbus/src/zbus_gfx.rs b/rog-dbus/src/zbus_gfx.rs index c0f726b9..a8263b42 100644 --- a/rog-dbus/src/zbus_gfx.rs +++ b/rog-dbus/src/zbus_gfx.rs @@ -21,7 +21,7 @@ use std::sync::{Arc, Mutex}; -use rog_types::gfx_vendors::{GfxRequiredUserAction, GfxVendors}; +use rog_types::gfx_vendors::{GfxPower, GfxRequiredUserAction, GfxVendors}; use zbus::{dbus_proxy, Connection, Result}; #[dbus_proxy( @@ -30,7 +30,7 @@ use zbus::{dbus_proxy, Connection, Result}; )] trait Daemon { /// Power method - fn power(&self) -> zbus::Result; + fn power(&self) -> zbus::Result; /// SetVendor method fn set_vendor(&self, vendor: &GfxVendors) -> zbus::Result; @@ -60,7 +60,7 @@ impl<'a> GfxProxy<'a> { } #[inline] - pub fn gfx_get_pwr(&self) -> Result { + pub fn gfx_get_pwr(&self) -> Result { self.0.power() } diff --git a/rog-types/Cargo.toml b/rog-types/Cargo.toml index f5a47edc..7c2241e5 100644 --- a/rog-types/Cargo.toml +++ b/rog-types/Cargo.toml @@ -11,8 +11,8 @@ edition = "2018" [dependencies] gumdrop = "^0.8" +rog_fan_curve = { version = "^0.1", features = ["serde"] } serde = "^1.0" serde_derive = "^1.0" -rog_fan_curve = { version = "^0.1", features = ["serde"] } zvariant = "^2.5" zvariant_derive = "^2.5" \ No newline at end of file diff --git a/rog-types/src/anime_matrix.rs b/rog-types/src/anime_matrix.rs deleted file mode 100644 index fa5c6ad2..00000000 --- a/rog-types/src/anime_matrix.rs +++ /dev/null @@ -1,291 +0,0 @@ -use serde_derive::{Deserialize, Serialize}; -use zvariant_derive::Type; - -pub const WIDTH: usize = 34; // Width is definitely 34 items -pub const HEIGHT: usize = 56; -pub type AniMePacketType = [[u8; 640]; 2]; -const BLOCK_START: usize = 7; -/// *Not* inclusive, the byte before this is the final for each "pane" -const BLOCK_END: usize = 634; -pub const PANE_LEN: usize = BLOCK_END - BLOCK_START; -/// The length of usable data -pub const FULL_PANE_LEN: usize = PANE_LEN * 2; - -pub const ANIME_PANE1_PREFIX: [u8; 7] = [0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02]; -pub const ANIME_PANE2_PREFIX: [u8; 7] = [0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02]; - -#[derive(Debug, Deserialize, Serialize, Type)] -pub struct AniMeDataBuffer(Vec); - -impl Default for AniMeDataBuffer { - fn default() -> Self { - Self::new() - } -} - -impl AniMeDataBuffer { - pub fn new() -> Self { - AniMeDataBuffer(vec![0u8; FULL_PANE_LEN]) - } - - pub fn get(&self) -> &[u8] { - &self.0 - } - - pub fn set(&mut self, input: [u8; FULL_PANE_LEN]) { - self.0 = input.to_vec(); - } -} - -impl From for AniMePacketType { - #[inline] - fn from(anime: AniMeDataBuffer) -> Self { - assert!(anime.0.len() == FULL_PANE_LEN); - let mut buffers = [[0; 640]; 2]; - for (idx, chunk) in anime.0.as_slice().chunks(PANE_LEN).enumerate() { - buffers[idx][BLOCK_START..BLOCK_END].copy_from_slice(chunk); - } - buffers - } -} - -/// Helper structure for writing images. -/// -/// See the examples for ways to write an image to `AniMeMatrix` format. -#[derive(Debug, Deserialize, Serialize, Type)] -pub struct AniMeImageBuffer(Vec>); - -impl Default for AniMeImageBuffer { - fn default() -> Self { - Self::new() - } -} - -impl AniMeImageBuffer { - pub fn new() -> Self { - AniMeImageBuffer(vec![vec![0u8; WIDTH]; HEIGHT]) - } - - pub fn get(&self) -> &Vec> { - &self.0 - } - - pub fn get_mut(&mut self) -> &mut Vec> { - &mut self.0 - } - - pub fn fill_with(&mut self, fill: u8) { - for row in self.0.iter_mut() { - for x in row.iter_mut() { - *x = fill; - } - } - } - - pub fn debug_print(&self) { - // this is the index from right. It is used to progressively shorten rows - let mut prog_row_len = WIDTH - 2; - - for (count, row) in self.0.iter().enumerate() { - // Write the top block of LEDs (first 7 rows) - if count < 6 { - if count % 2 != 0 { - print!(" "); - } else { - print!(""); - } - let tmp = if count == 0 || count == 1 || count == 3 || count == 5 { - row[1..].iter() - } else { - row.iter() - }; - for _ in tmp { - print!(" XY"); - } - - println!(); - } else { - // Switch to next block (looks like ) - if count % 2 != 0 { - // Row after 6 is only 1 less, then rows after 7 follow pattern - if count == 7 { - prog_row_len -= 1; - } else { - prog_row_len -= 2; - } - } else { - prog_row_len += 1; // if count 6, 0 - } - - let index = row.len() - prog_row_len; - - if count % 2 == 0 { - print!(" "); - } - for (i, _) in row.iter().enumerate() { - if i >= index { - print!(" XY"); - } else { - print!(" "); - } - } - println!(); - } - } - } -} - -impl From for AniMePacketType { - /// Do conversion from the nested Vec in AniMeMatrix to the two required - /// packets suitable for sending over USB - #[inline] - fn from(anime: AniMeImageBuffer) -> Self { - let mut buffers = [[0; 640]; 2]; - - let mut write_index = BLOCK_START; - let mut write_block = &mut buffers[0]; - let mut block1_done = false; - - // this is the index from right. It is used to progressively shorten rows - let mut prog_row_len = WIDTH - 2; - - for (count, row) in anime.0.iter().enumerate() { - // Write the top block of LEDs (first 7 rows) - if count < 6 { - for (i, x) in row.iter().enumerate() { - // Rows 0, 1, 3, 5 are short and misaligned - if count == 0 || count == 1 || count == 3 || count == 5 { - if i > 0 { - write_block[write_index - 1] = *x; - } - } else { - write_block[write_index] = *x; - } - write_index += 1; - } - } else { - // Switch to next block (looks like ) - if count % 2 != 0 { - // Row after 6 is only 1 less, then rows after 7 follow pattern - if count == 7 { - prog_row_len -= 1; - } else { - prog_row_len -= 2; - } - } else { - prog_row_len += 1; // if count 6, 0 - } - - let index = row.len() - prog_row_len; - for n in row.iter().skip(index) { - // Require a special case to catch the correct end-of-packet which is - // 6 bytes from the end - if write_index == BLOCK_END && !block1_done { - block1_done = true; - write_block = &mut buffers[1]; - write_index = BLOCK_START; - } - - write_block[write_index] = *n; - write_index += 1; - } - } - } - buffers - } -} - -#[cfg(test)] -mod tests { - use crate::anime_matrix::*; - - use super::AniMeDataBuffer; - - #[test] - fn check_from_data_buffer() { - let mut data = AniMeDataBuffer::new(); - data.set([42u8; FULL_PANE_LEN]); - - let out: AniMePacketType = data.into(); - } - - #[test] - fn check_data_alignment() { - let mut matrix = AniMeImageBuffer::new(); - { - let tmp = matrix.get_mut(); - for row in tmp.iter_mut() { - let idx = row.len() - 1; - row[idx] = 0xff; - } - } - - let matrix: AniMePacketType = AniMePacketType::from(matrix); - - // The bytes at the right of the initial AniMeMatrix should always end up aligned in the - // same place after conversion to data packets - - // Check against manually worked out right align - assert_eq!( - matrix[0].to_vec(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - ] - .to_vec() - ); - assert_eq!( - matrix[1].to_vec(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, - 0, 0, 0, 0 - ] - .to_vec() - ); - } -} diff --git a/rog-types/src/aura_perkey.rs b/rog-types/src/aura_perkey.rs index 82721643..6c4da418 100644 --- a/rog-types/src/aura_perkey.rs +++ b/rog-types/src/aura_perkey.rs @@ -59,7 +59,7 @@ impl KeyColourArray { Key::VolDown => (0, 15), Key::VolUp => (0, 18), Key::MicMute => (0, 21), - Key::ROG => (0, 24), + Key::Rog => (0, 24), // Key::Esc => (1, 24), Key::F1 => (1, 30), @@ -186,7 +186,7 @@ pub enum Key { VolUp, VolDown, MicMute, - ROG, + Rog, Esc, F1, F2, @@ -287,6 +287,7 @@ pub trait KeyLayout { fn get_rows(&self) -> &Vec<[Key; 17]>; } +#[allow(clippy::upper_case_acronyms)] pub struct GX502Layout(Vec<[Key; 17]>); impl KeyLayout for GX502Layout { @@ -304,7 +305,7 @@ impl Default for GX502Layout { Key::VolDown, Key::VolUp, Key::MicMute, - Key::ROG, + Key::Rog, Key::None, Key::None, Key::None, diff --git a/rog-types/src/cli_options.rs b/rog-types/src/cli_options.rs deleted file mode 100644 index c186becc..00000000 --- a/rog-types/src/cli_options.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::error::AuraError; -use gumdrop::Options; -use std::str::FromStr; - -#[derive(Copy, Clone, Debug)] -pub enum AniMeStatusValue { - On, - Off, -} -impl FromStr for AniMeStatusValue { - type Err = AuraError; - - fn from_str(s: &str) -> Result { - let s = s.to_lowercase(); - match s.as_str() { - "on" => Ok(AniMeStatusValue::On), - "off" => Ok(AniMeStatusValue::Off), - _ => { - print!("Invalid argument, must be one of: on, off"); - Err(AuraError::ParseAnime) - } - } - } -} -impl From for bool { - fn from(value: AniMeStatusValue) -> Self { - match value { - AniMeStatusValue::On => true, - AniMeStatusValue::Off => false, - } - } -} - -#[derive(Options)] -pub struct AniMeLeds { - #[options(help = "print help message")] - help: bool, - #[options( - no_long, - required, - short = "b", - meta = "", - help = "set all leds brightness value" - )] - led_brightness: u8, -} -impl AniMeLeds { - pub fn led_brightness(&self) -> u8 { - self.led_brightness - } -} - -#[derive(Options)] -pub enum AniMeActions { - #[options(help = "change all leds brightness")] - Leds(AniMeLeds), -} diff --git a/rog-types/src/error.rs b/rog-types/src/error.rs index 21556c22..153e1cdf 100644 --- a/rog-types/src/error.rs +++ b/rog-types/src/error.rs @@ -28,6 +28,7 @@ impl Error for AuraError {} #[derive(Debug)] pub enum GraphicsError { ParseVendor, + ParsePower, } impl fmt::Display for GraphicsError { @@ -35,8 +36,33 @@ impl fmt::Display for GraphicsError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { GraphicsError::ParseVendor => write!(f, "Could not parse vendor name"), + GraphicsError::ParsePower => write!(f, "Could not parse dGPU power status"), } } } impl Error for GraphicsError {} + +#[derive(Debug)] +pub enum AnimeError { + InvalidBitmap, + Io(std::io::Error), +} + +impl fmt::Display for AnimeError { + // This trait requires `fmt` with this exact signature. + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + AnimeError::InvalidBitmap => write!(f, "Bitmap is invalid"), + AnimeError::Io(e) => write!(f, "Could not open: {}", e), + } + } +} + +impl Error for AnimeError {} + +impl From for AnimeError { + fn from(err: std::io::Error) -> Self { + AnimeError::Io(err) + } +} diff --git a/rog-types/src/gfx_vendors.rs b/rog-types/src/gfx_vendors.rs index dad441d8..62a2b48c 100644 --- a/rog-types/src/gfx_vendors.rs +++ b/rog-types/src/gfx_vendors.rs @@ -3,6 +3,38 @@ use serde_derive::{Deserialize, Serialize}; use std::str::FromStr; use zvariant_derive::Type; +#[derive(Debug, Type, PartialEq, Copy, Clone, Deserialize, Serialize)] +pub enum GfxPower { + Active, + Suspended, + Off, + Unknown, +} + +impl FromStr for GfxPower { + type Err = GraphicsError; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().trim() { + "active" => Ok(GfxPower::Active), + "suspended" => Ok(GfxPower::Suspended), + "off" => Ok(GfxPower::Off), + _ => Ok(GfxPower::Unknown), + } + } +} + +impl From<&GfxPower> for &str { + fn from(gfx: &GfxPower) -> &'static str { + match gfx { + GfxPower::Active => "active", + GfxPower::Suspended => "suspended", + GfxPower::Off => "off", + GfxPower::Unknown => "unknown", + } + } +} + #[derive(Debug, Type, PartialEq, Copy, Clone, Deserialize, Serialize)] pub enum GfxVendors { Nvidia, diff --git a/rog-types/src/lib.rs b/rog-types/src/lib.rs index 3da40802..93dcf9a6 100644 --- a/rog-types/src/lib.rs +++ b/rog-types/src/lib.rs @@ -11,15 +11,9 @@ pub mod aura_modes; pub mod profile; -/// Contains mostly only what is required for parsing CLI options -pub mod cli_options; - /// Enables you to create fancy RGB effects pub mod aura_perkey; -/// Helper functions for the AniMe display -pub mod anime_matrix; - pub mod gfx_vendors; pub mod error; diff --git a/rog-types/src/profile.rs b/rog-types/src/profile.rs index a181c186..e6519847 100644 --- a/rog-types/src/profile.rs +++ b/rog-types/src/profile.rs @@ -13,7 +13,7 @@ pub struct Profile { } #[deprecated] -pub type CPUSettings = Profile; +pub type CpuSettings = Profile; impl Default for Profile { fn default() -> Self {