Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fca7d23a31 | |||
| 0122138b3b | |||
| 7b495e7587 | |||
| 970cf9ae59 | |||
| ad990c6ae1 | |||
| cd8cc013a4 | |||
| acf41c1783 | |||
| 03c9f06569 | |||
| 036a5018e0 | |||
| 81529b7374 | |||
| 2289af3ef6 | |||
| 633ffdf962 | |||
| cb88c9f0e2 | |||
| 8b77078a6f | |||
| 3d6d92ae7d | |||
| 55723b7b77 | |||
| 7796ba0603 | |||
| d3aababef5 | |||
| 4611c08085 | |||
| 0a008a653a | |||
| cd5daa17d0 | |||
| a0529e0efd | |||
| 3e0aeea6c6 | |||
| e2fb1d44b5 | |||
| 04543eeca0 | |||
| 68ee62fef1 | |||
| e523e4e9a2 | |||
| ea2d80cc44 | |||
| 40e00c4739 | |||
| cdc42193d1 | |||
| 3a18506510 | |||
| fa671e53d8 | |||
| 002dc8516d | |||
| 2a38f69cc4 | |||
| a14a37d0da | |||
| b105ff5180 | |||
| d202fcd97a | |||
| 15732ecd82 | |||
| 8508110ba0 | |||
| cafb64d57b | |||
| 7515eafc45 | |||
| b6c6f10bdf | |||
| 35352a8a7c | |||
| 0c3bebdeb9 | |||
| 1394c12967 | |||
| cbc1f6f5bb |
@@ -17,7 +17,7 @@ image: rust:latest
|
|||||||
- target/release/.cargo-lock
|
- target/release/.cargo-lock
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- apt-get update -qq && apt-get install -y -qq libudev-dev libgtk-3-dev grep llvm clang libclang-dev
|
- apt-get update -qq && apt-get install -y -qq libudev-dev libgtk-3-dev grep llvm clang libclang-dev libsdl2-dev libsdl2-gfx-dev
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- format
|
- format
|
||||||
@@ -52,7 +52,7 @@ test:
|
|||||||
<<: *rust_cache
|
<<: *rust_cache
|
||||||
script:
|
script:
|
||||||
- mkdir -p .git/hooks > /dev/null
|
- mkdir -p .git/hooks > /dev/null
|
||||||
- cargo test
|
- cargo test --all
|
||||||
|
|
||||||
release:
|
release:
|
||||||
only:
|
only:
|
||||||
@@ -62,7 +62,7 @@ release:
|
|||||||
- make && make vendor
|
- make && make vendor
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- vendor_asusctl_*.tar.xz
|
- vendor_asusctl*.tar.xz
|
||||||
- cargo-config
|
- cargo-config
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
@@ -75,10 +75,10 @@ pages:
|
|||||||
- rm -rf public
|
- rm -rf public
|
||||||
- mkdir public
|
- mkdir public
|
||||||
- cp -R target/doc/* public
|
- cp -R target/doc/* public
|
||||||
- cp misc/index.html public
|
- cp extra/index.html public
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- public
|
- public
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
GIT_SUBMODULE_STRATEGY: normal
|
GIT_SUBMODULE_STRATEGY: normal
|
||||||
|
|||||||
@@ -5,8 +5,37 @@ 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).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
## [v4.7.0-RC1]
|
||||||
|
### Added
|
||||||
|
- Support for FX507Z LED modes
|
||||||
|
- Support for GL503V LED modes
|
||||||
|
- Support for G733C LED modes
|
||||||
|
- Support for GV601VI LED modes
|
||||||
|
- Support for G634J LED modes (layout is in progress)
|
||||||
|
- Support the Rear Glow on some laptops
|
||||||
|
- Support M16 matrix display
|
||||||
|
- Custom images
|
||||||
|
- Pixel gifs
|
||||||
|
- Power options
|
||||||
|
- Builtin animations
|
||||||
|
- In-progress simulators for GA402, GU604 animatrix, optional build and takes a single arg
|
||||||
|
- Add `model_override` option to anime config, this is handy for forcing a model for "Unknown" anime, and for simulators
|
||||||
|
- Add `mini_led_mode` support to asusd and zbus crates (requires kernel patch https://lkml.org/lkml/2023/6/19/1264)
|
||||||
|
- Add `mini_led_mode` toggle to rog-control-center GUI, tray, notifications
|
||||||
|
### Changed
|
||||||
|
- Move FX506HC to FX506H in arua DB to catch full series of this range
|
||||||
|
- Move FX506LH to FX506L in arua DB to catch full series of this range
|
||||||
|
- Move G513I* to G513I in arua DB to catch full series of this range
|
||||||
|
- Remove notification handle tracking limit, fixes KDE issue with profile notif
|
||||||
|
- Rename daemon and daemon-user crates to asusd and asusd-user to not be confusing in workspace naming
|
||||||
|
- Prevent the multiple notifications from a profile change from occuring (too many functions with side effects!)
|
||||||
|
- Apply keyboard brightness when setting a mode
|
||||||
|
- Update GL503 led config
|
||||||
|
### BREAKING
|
||||||
|
- All Anime related DBUS methods/notifs are changed
|
||||||
|
|
||||||
## [v4.6.2]
|
## [v4.6.2]
|
||||||
- Fix rog-control-center not reopening if `startup_in_background` is set
|
- Fix rog-control-center not reopening if `startup_in_background` is set
|
||||||
|
|
||||||
## [v4.6.1]
|
## [v4.6.1]
|
||||||
### Added
|
### Added
|
||||||
@@ -633,4 +662,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- Fix small deadlock with awaits
|
- Fix small deadlock with awaits
|
||||||
|
|
||||||
## [1.0.0]
|
## [1.0.0]
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
members = ["asusctl", "config-traits", "daemon", "daemon-user", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center"]
|
members = ["asusctl", "asusd", "asusd-user", "config-traits", "rog-platform", "rog-dbus", "rog-anime", "rog-aura", "rog-profiles", "rog-control-center", "simulators"]
|
||||||
|
default-members = ["asusctl", "asusd", "asusd-user", "rog-control-center"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "4.6.2"
|
version = "4.7.0-RC1"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
async-trait = "^0.1"
|
async-trait = "^0.1"
|
||||||
@@ -11,7 +12,7 @@ concat-idents = "^1.1"
|
|||||||
dirs = "^4.0"
|
dirs = "^4.0"
|
||||||
smol = "^1.3"
|
smol = "^1.3"
|
||||||
|
|
||||||
zbus = "^3.6"
|
zbus = "~3.13.1"
|
||||||
logind-zbus = { version = "^3.1.0" } #, default-features = false, features = ["non_blocking"] }
|
logind-zbus = { version = "^3.1.0" } #, default-features = false, features = ["non_blocking"] }
|
||||||
|
|
||||||
serde = "^1.0"
|
serde = "^1.0"
|
||||||
|
|||||||
@@ -19,10 +19,15 @@ LEDCFG := aura_support.ron
|
|||||||
|
|
||||||
SRC := Cargo.toml Cargo.lock Makefile $(shell find -type f -wholename '**/src/*.rs')
|
SRC := Cargo.toml Cargo.lock Makefile $(shell find -type f -wholename '**/src/*.rs')
|
||||||
|
|
||||||
|
STRIP_BINARIES ?= 0
|
||||||
|
|
||||||
DEBUG ?= 0
|
DEBUG ?= 0
|
||||||
ifeq ($(DEBUG),0)
|
ifeq ($(DEBUG),0)
|
||||||
ARGS += --release
|
ARGS += --release
|
||||||
TARGET = release
|
TARGET = release
|
||||||
|
else
|
||||||
|
ARGS += --profile dev
|
||||||
|
TARGET = debug
|
||||||
endif
|
endif
|
||||||
|
|
||||||
VENDORED ?= 0
|
VENDORED ?= 0
|
||||||
@@ -39,11 +44,11 @@ distclean:
|
|||||||
rm -rf .cargo vendor vendor.tar.xz
|
rm -rf .cargo vendor vendor.tar.xz
|
||||||
|
|
||||||
install-program:
|
install-program:
|
||||||
$(INSTALL_PROGRAM) "./target/release/$(BIN_ROG)" "$(DESTDIR)$(bindir)/$(BIN_ROG)"
|
$(INSTALL_PROGRAM) "./target/$(TARGET)/$(BIN_ROG)" "$(DESTDIR)$(bindir)/$(BIN_ROG)"
|
||||||
|
|
||||||
$(INSTALL_PROGRAM) "./target/release/$(BIN_C)" "$(DESTDIR)$(bindir)/$(BIN_C)"
|
$(INSTALL_PROGRAM) "./target/$(TARGET)/$(BIN_C)" "$(DESTDIR)$(bindir)/$(BIN_C)"
|
||||||
$(INSTALL_PROGRAM) "./target/release/$(BIN_D)" "$(DESTDIR)$(bindir)/$(BIN_D)"
|
$(INSTALL_PROGRAM) "./target/$(TARGET)/$(BIN_D)" "$(DESTDIR)$(bindir)/$(BIN_D)"
|
||||||
$(INSTALL_PROGRAM) "./target/release/$(BIN_U)" "$(DESTDIR)$(bindir)/$(BIN_U)"
|
$(INSTALL_PROGRAM) "./target/$(TARGET)/$(BIN_U)" "$(DESTDIR)$(bindir)/$(BIN_U)"
|
||||||
|
|
||||||
install-data:
|
install-data:
|
||||||
$(INSTALL_DATA) "./rog-control-center/data/$(BIN_ROG).desktop" "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop"
|
$(INSTALL_DATA) "./rog-control-center/data/$(BIN_ROG).desktop" "$(DESTDIR)$(datarootdir)/applications/$(BIN_ROG).desktop"
|
||||||
@@ -116,9 +121,12 @@ ifeq ($(VENDORED),1)
|
|||||||
tar pxf vendor_asusctl_$(VERSION).tar.xz
|
tar pxf vendor_asusctl_$(VERSION).tar.xz
|
||||||
endif
|
endif
|
||||||
cargo build $(ARGS)
|
cargo build $(ARGS)
|
||||||
strip -s ./target/release/$(BIN_C)
|
ifneq ($(STRIP_BINARIES),0)
|
||||||
strip -s ./target/release/$(BIN_D)
|
strip -s ./target/$(TARGET)/$(BIN_C)
|
||||||
strip -s ./target/release/$(BIN_U)
|
strip -s ./target/$(TARGET)/$(BIN_D)
|
||||||
strip -s ./target/release/$(BIN_ROG)
|
strip -s ./target/$(TARGET)/$(BIN_U)
|
||||||
|
strip -s ./target/$(TARGET)/$(BIN_ROG)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all clean distclean install uninstall update build
|
.PHONY: all clean distclean install uninstall update build
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ a system-level daemon should.
|
|||||||
|
|
||||||
## Discord
|
## Discord
|
||||||
|
|
||||||
[Discord server link](https://discord.gg/4ZKGd7Un5t)
|
[Discord server link](https://discord.gg/WTHnqabm)
|
||||||
|
|
||||||
## SUPPORTED LAPTOPS
|
## SUPPORTED LAPTOPS
|
||||||
|
|
||||||
@@ -81,13 +81,13 @@ Requirements are rust >= 1.57 installed from rustup.io if the distro provided ve
|
|||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
**popos (unsuported):**
|
**popos (unsuported):**
|
||||||
|
|
||||||
sudo apt install cmake libclang-dev libudev-dev libgtk-3-dev libclang-dev libglib2.0-dev libatkmm-1.6-dev libpangomm-1.4-dev librust-gdk-pixbuf-dev
|
sudo apt install cmake libclang-dev libudev-dev libgtk-3-dev libclang-dev libglib2.0-dev libatkmm-1.6-dev libpangomm-1.4-dev librust-gdk-pixbuf-dev
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
source "$HOME/.cargo/env"
|
source "$HOME/.cargo/env"
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
|
|
||||||
**fedora:**
|
**fedora:**
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ rog_aura = { path = "../rog-aura" }
|
|||||||
rog_dbus = { path = "../rog-dbus" }
|
rog_dbus = { path = "../rog-dbus" }
|
||||||
rog_profiles = { path = "../rog-profiles" }
|
rog_profiles = { path = "../rog-profiles" }
|
||||||
rog_platform = { path = "../rog-platform" }
|
rog_platform = { path = "../rog-platform" }
|
||||||
daemon = { path = "../daemon" }
|
asusd = { path = "../asusd" }
|
||||||
|
|
||||||
gumdrop.workspace = true
|
gumdrop.workspace = true
|
||||||
toml.workspace = true
|
toml.workspace = true
|
||||||
|
|||||||
@@ -1,21 +1,24 @@
|
|||||||
use gumdrop::Options;
|
use gumdrop::Options;
|
||||||
|
use rog_anime::usb::{AnimAwake, AnimBooting, AnimShutdown, AnimSleeping, Brightness};
|
||||||
|
use rog_anime::AnimeType;
|
||||||
|
|
||||||
#[derive(Options)]
|
#[derive(Options)]
|
||||||
pub struct AnimeCommand {
|
pub struct AnimeCommand {
|
||||||
#[options(help = "print help message")]
|
#[options(help = "print help message")]
|
||||||
pub help: bool,
|
pub help: bool,
|
||||||
|
#[options(meta = "", help = "override the display type")]
|
||||||
|
pub override_type: Option<AnimeType>,
|
||||||
|
#[options(meta = "", help = "enable/disable the display")]
|
||||||
|
pub enable_display: Option<bool>,
|
||||||
|
#[options(meta = "", help = "enable/disable the builtin run/powersave animation")]
|
||||||
|
pub enable_powersave_anim: Option<bool>,
|
||||||
#[options(
|
#[options(
|
||||||
meta = "",
|
meta = "",
|
||||||
help = "enable/disable the panel LEDs (does not erase last image)"
|
help = "set global base brightness value <Off, Low, Med, High>"
|
||||||
)]
|
)]
|
||||||
pub enable: Option<bool>,
|
pub brightness: Option<Brightness>,
|
||||||
#[options(
|
#[options(meta = "", help = "set global (image) brightness value")]
|
||||||
meta = "",
|
pub image_brightness: Option<f32>,
|
||||||
help = "enable/disable system animations (boot/sleep/shutdown)"
|
|
||||||
)]
|
|
||||||
pub boot_enable: Option<bool>,
|
|
||||||
#[options(meta = "", help = "set global AniMe brightness value")]
|
|
||||||
pub brightness: Option<f32>,
|
|
||||||
#[options(help = "clear the display")]
|
#[options(help = "clear the display")]
|
||||||
pub clear: bool,
|
pub clear: bool,
|
||||||
#[options(command)]
|
#[options(command)]
|
||||||
@@ -32,6 +35,24 @@ pub enum AnimeActions {
|
|||||||
Gif(AnimeGif),
|
Gif(AnimeGif),
|
||||||
#[options(help = "display an animated diagonal/pixel-perfect GIF")]
|
#[options(help = "display an animated diagonal/pixel-perfect GIF")]
|
||||||
PixelGif(AnimeGifDiagonal),
|
PixelGif(AnimeGifDiagonal),
|
||||||
|
#[options(help = "change which builtin animations are shown")]
|
||||||
|
SetBuiltins(Builtins),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Options)]
|
||||||
|
pub struct Builtins {
|
||||||
|
#[options(help = "print help message")]
|
||||||
|
pub help: bool,
|
||||||
|
#[options(meta = "", help = " <GlitchConstruction, StaticEmergence>")]
|
||||||
|
pub boot: AnimBooting,
|
||||||
|
#[options(meta = "", help = "<BinaryBannerScroll, RogLogoGlitch>")]
|
||||||
|
pub awake: AnimAwake,
|
||||||
|
#[options(meta = "", help = "<BannerSwipe, Starfield>")]
|
||||||
|
pub sleep: AnimSleeping,
|
||||||
|
#[options(meta = "", help = "<GlitchOut, SeeYa>")]
|
||||||
|
pub shutdown: AnimShutdown,
|
||||||
|
#[options(meta = "", help = "set/apply the animations")]
|
||||||
|
pub set: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Options)]
|
#[derive(Options)]
|
||||||
|
|||||||
@@ -31,13 +31,19 @@ pub struct LedPowerCommand2 {
|
|||||||
#[derive(Options)]
|
#[derive(Options)]
|
||||||
pub enum SetAuraEnabled {
|
pub enum SetAuraEnabled {
|
||||||
/// Applies to both old and new models
|
/// Applies to both old and new models
|
||||||
#[options(help = "set <keyboard, logo, lightbar> to enabled while device is awake")]
|
#[options(help = "set <keyboard, logo, lightbar, rearglow> to enabled while device is awake")]
|
||||||
Awake(AuraEnabled),
|
Awake(AuraEnabled),
|
||||||
#[options(help = "set <keyboard, logo, lightbar> to enabled while the device is booting")]
|
#[options(
|
||||||
|
help = "set <keyboard, logo, lightbar, rearglow> to enabled while the device is booting"
|
||||||
|
)]
|
||||||
Boot(AuraEnabled),
|
Boot(AuraEnabled),
|
||||||
#[options(help = "set <keyboard, logo, lightbar> to animate while the device is suspended")]
|
#[options(
|
||||||
|
help = "set <keyboard, logo, lightbar, rearglow> to animate while the device is suspended"
|
||||||
|
)]
|
||||||
Sleep(AuraEnabled),
|
Sleep(AuraEnabled),
|
||||||
#[options(help = "set <keyboard, logo, lightbar> to animate while the device is shutdown")]
|
#[options(
|
||||||
|
help = "set <keyboard, logo, lightbar, rearglow> to animate while the device is shutdown"
|
||||||
|
)]
|
||||||
Shutdown(AuraEnabled),
|
Shutdown(AuraEnabled),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,7 +56,9 @@ pub struct AuraEnabled {
|
|||||||
#[options(meta = "", help = "<true/false>")]
|
#[options(meta = "", help = "<true/false>")]
|
||||||
pub logo: Option<bool>,
|
pub logo: Option<bool>,
|
||||||
#[options(meta = "", help = "<true/false>")]
|
#[options(meta = "", help = "<true/false>")]
|
||||||
pub lightbar: Option<bool>,
|
pub frontglow: Option<bool>,
|
||||||
|
#[options(meta = "", help = "<true/false>")]
|
||||||
|
pub rearglow: Option<bool>,
|
||||||
#[options(meta = "", help = "<true/false>")]
|
#[options(meta = "", help = "<true/false>")]
|
||||||
pub lid: Option<bool>,
|
pub lid: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use aura_cli::{LedPowerCommand1, LedPowerCommand2};
|
|||||||
use gumdrop::{Opt, Options};
|
use gumdrop::{Opt, Options};
|
||||||
use profiles_cli::{FanCurveCommand, ProfileCommand};
|
use profiles_cli::{FanCurveCommand, ProfileCommand};
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_anime_type;
|
||||||
use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, Vec2};
|
use rog_anime::{AnimTime, AnimeDataBuffer, AnimeDiagonal, AnimeGif, AnimeImage, AnimeType, Vec2};
|
||||||
use rog_aura::usb::{AuraDevRog1, AuraDevRog2, AuraDevTuf, AuraDevice, AuraPowerDev};
|
use rog_aura::usb::{AuraDevRog1, AuraDevRog2, AuraDevTuf, AuraDevice, AuraPowerDev};
|
||||||
use rog_aura::{self, AuraEffect};
|
use rog_aura::{self, AuraEffect};
|
||||||
use rog_dbus::RogDbusClientBlocking;
|
use rog_dbus::RogDbusClientBlocking;
|
||||||
@@ -36,69 +36,52 @@ fn main() {
|
|||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
panic!("source {}", err);
|
println!("Error: {}", err);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let (dbus, _) = RogDbusClientBlocking::new()
|
if let Ok((dbus, _)) = RogDbusClientBlocking::new().map_err(|e| {
|
||||||
.map_err(|e| {
|
print_error_help(&e, None);
|
||||||
print_error_help(&e, None);
|
}) {
|
||||||
panic!("Could not start dbus client");
|
if let Ok(supported) = dbus
|
||||||
})
|
.proxies()
|
||||||
.unwrap();
|
.supported()
|
||||||
|
.supported_functions()
|
||||||
|
.map_err(|e| {
|
||||||
|
print_error_help(&e, None);
|
||||||
|
})
|
||||||
|
{
|
||||||
|
if parsed.version {
|
||||||
|
println!("asusctl v{}", env!("CARGO_PKG_VERSION"));
|
||||||
|
println!();
|
||||||
|
print_info();
|
||||||
|
}
|
||||||
|
|
||||||
let supported = dbus
|
if let Err(err) = do_parsed(&parsed, &supported, &dbus) {
|
||||||
.proxies()
|
print_error_help(&*err, Some(&supported));
|
||||||
.supported()
|
}
|
||||||
.supported_functions()
|
}
|
||||||
.map_err(|e| {
|
|
||||||
print_error_help(&e, None);
|
|
||||||
panic!("Could not start dbus proxy");
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
if parsed.version {
|
|
||||||
print_versions();
|
|
||||||
println!();
|
|
||||||
print_laptop_info();
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Err(err) = do_parsed(&parsed, &supported, &dbus) {
|
|
||||||
print_error_help(&*err, Some(&supported));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_error_help(err: &dyn std::error::Error, supported: Option<&SupportedFunctions>) {
|
fn print_error_help(err: &dyn std::error::Error, supported: Option<&SupportedFunctions>) {
|
||||||
check_service("asusd");
|
check_service("asusd");
|
||||||
println!("\nError: {}\n", err);
|
println!("\nError: {}\n", err);
|
||||||
print_versions();
|
print_info();
|
||||||
println!();
|
|
||||||
print_laptop_info();
|
|
||||||
if let Some(supported) = supported {
|
if let Some(supported) = supported {
|
||||||
println!();
|
println!();
|
||||||
println!("Supported laptop functions:\n\n{}", supported);
|
println!("Supported laptop functions:\n\n{}", supported);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_versions() {
|
fn print_info() {
|
||||||
println!("App and daemon versions:");
|
|
||||||
println!(" asusctl v{}", env!("CARGO_PKG_VERSION"));
|
|
||||||
println!(" asusd v{}", daemon::VERSION);
|
|
||||||
println!("\nComponent crate versions:");
|
|
||||||
println!(" rog-anime v{}", rog_anime::VERSION);
|
|
||||||
println!(" rog-aura v{}", rog_aura::VERSION);
|
|
||||||
println!(" rog-dbus v{}", rog_dbus::VERSION);
|
|
||||||
println!(" rog-profiles v{}", rog_profiles::VERSION);
|
|
||||||
println!("rog-platform v{}", rog_platform::VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn print_laptop_info() {
|
|
||||||
let dmi = sysfs_class::DmiId::default();
|
let dmi = sysfs_class::DmiId::default();
|
||||||
let board_name = dmi.board_name().expect("Could not get board_name");
|
let board_name = dmi.board_name().expect("Could not get board_name");
|
||||||
let prod_family = dmi.product_family().expect("Could not get product_family");
|
let prod_family = dmi.product_family().expect("Could not get product_family");
|
||||||
|
println!("asusctl version: {}", env!("CARGO_PKG_VERSION"));
|
||||||
println!("Product family: {}", prod_family.trim());
|
println!(" Product family: {}", prod_family.trim());
|
||||||
println!("Board name: {}", board_name.trim());
|
println!(" Board name: {}", board_name.trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_service(name: &str) -> bool {
|
fn check_service(name: &str) -> bool {
|
||||||
@@ -223,9 +206,11 @@ fn handle_anime(
|
|||||||
cmd: &AnimeCommand,
|
cmd: &AnimeCommand,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
if (cmd.command.is_none()
|
if (cmd.command.is_none()
|
||||||
&& cmd.enable.is_none()
|
&& cmd.enable_display.is_none()
|
||||||
&& cmd.boot_enable.is_none()
|
&& cmd.enable_powersave_anim.is_none()
|
||||||
&& cmd.brightness.is_none())
|
&& cmd.brightness.is_none()
|
||||||
|
&& cmd.image_brightness.is_none()
|
||||||
|
&& !cmd.clear)
|
||||||
|| cmd.help
|
|| cmd.help
|
||||||
{
|
{
|
||||||
println!("Missing arg or command\n\n{}", cmd.self_usage());
|
println!("Missing arg or command\n\n{}", cmd.self_usage());
|
||||||
@@ -233,25 +218,34 @@ fn handle_anime(
|
|||||||
println!("\n{}", lst);
|
println!("\n{}", lst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(anime_turn) = cmd.enable {
|
if let Some(enable) = cmd.enable_display {
|
||||||
dbus.proxies().anime().set_on_off(anime_turn)?;
|
dbus.proxies().anime().set_enable_display(enable)?;
|
||||||
}
|
}
|
||||||
if let Some(anime_boot) = cmd.boot_enable {
|
if let Some(enable) = cmd.enable_powersave_anim {
|
||||||
dbus.proxies().anime().set_boot_on_off(anime_boot)?;
|
dbus.proxies().anime().set_builtins_enabled(enable)?;
|
||||||
}
|
}
|
||||||
if let Some(bright) = cmd.brightness {
|
if let Some(bright) = cmd.brightness {
|
||||||
verify_brightness(bright);
|
|
||||||
dbus.proxies().anime().set_brightness(bright)?;
|
dbus.proxies().anime().set_brightness(bright)?;
|
||||||
}
|
}
|
||||||
|
if let Some(bright) = cmd.image_brightness {
|
||||||
|
verify_brightness(bright);
|
||||||
|
dbus.proxies().anime().set_image_brightness(bright)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut anime_type = get_anime_type()?;
|
||||||
|
if let AnimeType::Unknown = anime_type {
|
||||||
|
if let Some(model) = cmd.override_type {
|
||||||
|
anime_type = model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if cmd.clear {
|
if cmd.clear {
|
||||||
let anime_type = get_anime_type()?;
|
let data = vec![255u8; anime_type.data_length()];
|
||||||
let data = vec![0u8; anime_type.data_length()];
|
|
||||||
let tmp = AnimeDataBuffer::from_vec(anime_type, data)?;
|
let tmp = AnimeDataBuffer::from_vec(anime_type, data)?;
|
||||||
dbus.proxies().anime().write(tmp)?;
|
dbus.proxies().anime().write(tmp)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(action) = cmd.command.as_ref() {
|
if let Some(action) = cmd.command.as_ref() {
|
||||||
let anime_type = get_anime_type()?;
|
|
||||||
match action {
|
match action {
|
||||||
AnimeActions::Image(image) => {
|
AnimeActions::Image(image) => {
|
||||||
if image.help_requested() || image.path.is_empty() {
|
if image.help_requested() || image.path.is_empty() {
|
||||||
@@ -362,6 +356,23 @@ fn handle_anime(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
AnimeActions::SetBuiltins(builtins) => {
|
||||||
|
if builtins.help_requested() || builtins.set.is_none() {
|
||||||
|
println!("\nAny unspecified args will be set to default (first shown var)\n");
|
||||||
|
println!("\n{}", builtins.self_usage());
|
||||||
|
if let Some(lst) = builtins.self_command_list() {
|
||||||
|
println!("\n{}", lst);
|
||||||
|
}
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
dbus.proxies().anime().set_builtin_animations(
|
||||||
|
builtins.boot,
|
||||||
|
builtins.awake,
|
||||||
|
builtins.sleep,
|
||||||
|
builtins.shutdown,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -596,26 +607,30 @@ fn handle_led_power2(
|
|||||||
aura_cli::SetAuraEnabled::Boot(arg) => {
|
aura_cli::SetAuraEnabled::Boot(arg) => {
|
||||||
check(arg.keyboard, AuraDevRog2::BootKeyb);
|
check(arg.keyboard, AuraDevRog2::BootKeyb);
|
||||||
check(arg.logo, AuraDevRog2::BootLogo);
|
check(arg.logo, AuraDevRog2::BootLogo);
|
||||||
check(arg.lightbar, AuraDevRog2::BootBar);
|
check(arg.frontglow, AuraDevRog2::BootBar);
|
||||||
|
check(arg.rearglow, AuraDevRog2::BootRearGlow);
|
||||||
check(arg.lid, AuraDevRog2::AwakeLid);
|
check(arg.lid, AuraDevRog2::AwakeLid);
|
||||||
}
|
}
|
||||||
aura_cli::SetAuraEnabled::Sleep(arg) => {
|
aura_cli::SetAuraEnabled::Sleep(arg) => {
|
||||||
check(arg.keyboard, AuraDevRog2::SleepKeyb);
|
check(arg.keyboard, AuraDevRog2::SleepKeyb);
|
||||||
check(arg.logo, AuraDevRog2::SleepLogo);
|
check(arg.logo, AuraDevRog2::SleepLogo);
|
||||||
check(arg.lightbar, AuraDevRog2::SleepBar);
|
check(arg.frontglow, AuraDevRog2::SleepBar);
|
||||||
|
check(arg.rearglow, AuraDevRog2::SleepRearGlow);
|
||||||
check(arg.lid, AuraDevRog2::SleepLid);
|
check(arg.lid, AuraDevRog2::SleepLid);
|
||||||
}
|
}
|
||||||
aura_cli::SetAuraEnabled::Awake(arg) => {
|
aura_cli::SetAuraEnabled::Awake(arg) => {
|
||||||
check(arg.keyboard, AuraDevRog2::AwakeKeyb);
|
check(arg.keyboard, AuraDevRog2::AwakeKeyb);
|
||||||
check(arg.logo, AuraDevRog2::AwakeLogo);
|
check(arg.logo, AuraDevRog2::AwakeLogo);
|
||||||
check(arg.lightbar, AuraDevRog2::AwakeBar);
|
check(arg.frontglow, AuraDevRog2::AwakeBar);
|
||||||
|
check(arg.rearglow, AuraDevRog2::AwakeRearGlow);
|
||||||
check(arg.lid, AuraDevRog2::AwakeLid);
|
check(arg.lid, AuraDevRog2::AwakeLid);
|
||||||
}
|
}
|
||||||
aura_cli::SetAuraEnabled::Shutdown(arg) => {
|
aura_cli::SetAuraEnabled::Shutdown(arg) => {
|
||||||
check(arg.keyboard, AuraDevRog2::ShutdownKeyb);
|
check(arg.keyboard, AuraDevRog2::ShutdownKeyb);
|
||||||
check(arg.logo, AuraDevRog2::ShutdownLogo);
|
check(arg.logo, AuraDevRog2::ShutdownLogo);
|
||||||
check(arg.lightbar, AuraDevRog2::ShutdownBar);
|
check(arg.frontglow, AuraDevRog2::ShutdownBar);
|
||||||
check(arg.lid, AuraDevRog2::ShutdownBar);
|
check(arg.rearglow, AuraDevRog2::ShutdownRearGlow);
|
||||||
|
check(arg.lid, AuraDevRog2::ShutdownLid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "daemon-user"
|
name = "asusd-user"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
version.workspace = true
|
version.workspace = true
|
||||||
authors = ["Luke D Jones <luke@ljones.dev>"]
|
authors = ["Luke D Jones <luke@ljones.dev>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Usermode daemon for user settings, anime, per-key lighting"
|
description = "Usermode daemon for user settings, anime, per-key lighting"
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "rog_user"
|
|
||||||
path = "src/lib.rs"
|
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "asusd-user"
|
name = "asusd-user"
|
||||||
path = "src/daemon.rs"
|
path = "src/daemon.rs"
|
||||||
@@ -360,13 +360,13 @@ impl CtrlAnime<'static> {
|
|||||||
pub fn set_state(&mut self, on: bool) -> zbus::fdo::Result<()> {
|
pub fn set_state(&mut self, on: bool) -> zbus::fdo::Result<()> {
|
||||||
// Operations here need to be in specific order
|
// Operations here need to be in specific order
|
||||||
if on {
|
if on {
|
||||||
self.client.proxies().anime().set_on_off(on).ok();
|
self.client.proxies().anime().set_enable_display(on).ok();
|
||||||
// Let the inner loop run
|
// Let the inner loop run
|
||||||
self.inner_early_return.store(false, Ordering::SeqCst);
|
self.inner_early_return.store(false, Ordering::SeqCst);
|
||||||
} else {
|
} else {
|
||||||
// Must make the inner run loop return early
|
// Must make the inner run loop return early
|
||||||
self.inner_early_return.store(true, Ordering::SeqCst);
|
self.inner_early_return.store(true, Ordering::SeqCst);
|
||||||
self.client.proxies().anime().set_on_off(on).ok();
|
self.client.proxies().anime().set_enable_display(on).ok();
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -3,14 +3,14 @@ use std::path::PathBuf;
|
|||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use asusd_user::config::*;
|
||||||
|
use asusd_user::ctrl_anime::{CtrlAnime, CtrlAnimeInner};
|
||||||
|
use asusd_user::DBUS_NAME;
|
||||||
use config_traits::{StdConfig, StdConfigLoad};
|
use config_traits::{StdConfig, StdConfigLoad};
|
||||||
use rog_anime::usb::get_anime_type;
|
use rog_anime::usb::get_anime_type;
|
||||||
use rog_aura::aura_detection::LaptopLedData;
|
use rog_aura::aura_detection::LaptopLedData;
|
||||||
use rog_aura::layouts::KeyLayout;
|
use rog_aura::layouts::KeyLayout;
|
||||||
use rog_dbus::RogDbusClientBlocking;
|
use rog_dbus::RogDbusClientBlocking;
|
||||||
use rog_user::config::*;
|
|
||||||
use rog_user::ctrl_anime::{CtrlAnime, CtrlAnimeInner};
|
|
||||||
use rog_user::DBUS_NAME;
|
|
||||||
use smol::Executor;
|
use smol::Executor;
|
||||||
use zbus::Connection;
|
use zbus::Connection;
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
.format(|buf, record| writeln!(buf, "{}: {}", record.level(), record.args()))
|
.format(|buf, record| writeln!(buf, "{}: {}", record.level(), record.args()))
|
||||||
.init();
|
.init();
|
||||||
|
|
||||||
println!(" user daemon v{}", rog_user::VERSION);
|
println!(" user daemon v{}", asusd_user::VERSION);
|
||||||
println!(" rog-anime v{}", rog_anime::VERSION);
|
println!(" rog-anime v{}", rog_anime::VERSION);
|
||||||
println!(" rog-dbus v{}", rog_dbus::VERSION);
|
println!(" rog-dbus v{}", rog_dbus::VERSION);
|
||||||
println!("rog-platform v{}", rog_platform::VERSION);
|
println!("rog-platform v{}", rog_platform::VERSION);
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "daemon"
|
name = "asusd"
|
||||||
license = "MPL-2.0"
|
license = "MPL-2.0"
|
||||||
version.workspace = true
|
version.workspace = true
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
@@ -9,10 +9,6 @@ homepage = "https://gitlab.com/asus-linux/asus-nb-ctrl"
|
|||||||
description = "A daemon app for ASUS GX502 and similar laptops to control missing features"
|
description = "A daemon app for ASUS GX502 and similar laptops to control missing features"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "daemon"
|
|
||||||
path = "src/lib.rs"
|
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "asusd"
|
name = "asusd"
|
||||||
path = "src/daemon.rs"
|
path = "src/daemon.rs"
|
||||||
@@ -8,6 +8,7 @@ pub struct Config {
|
|||||||
/// Save charge limit for restoring on boot
|
/// Save charge limit for restoring on boot
|
||||||
pub bat_charge_limit: u8,
|
pub bat_charge_limit: u8,
|
||||||
pub panel_od: bool,
|
pub panel_od: bool,
|
||||||
|
pub mini_led_mode: bool,
|
||||||
pub disable_nvidia_powerd_on_battery: bool,
|
pub disable_nvidia_powerd_on_battery: bool,
|
||||||
pub ac_command: String,
|
pub ac_command: String,
|
||||||
pub bat_command: String,
|
pub bat_command: String,
|
||||||
@@ -18,6 +19,7 @@ impl StdConfig for Config {
|
|||||||
Config {
|
Config {
|
||||||
bat_charge_limit: 100,
|
bat_charge_limit: 100,
|
||||||
panel_od: false,
|
panel_od: false,
|
||||||
|
mini_led_mode: false,
|
||||||
disable_nvidia_powerd_on_battery: true,
|
disable_nvidia_powerd_on_battery: true,
|
||||||
ac_command: String::new(),
|
ac_command: String::new(),
|
||||||
bat_command: String::new(),
|
bat_command: String::new(),
|
||||||
@@ -33,21 +35,24 @@ impl StdConfig for Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StdConfigLoad2<Config455, Config458> for Config {}
|
impl StdConfigLoad2<Config458, Config462> for Config {}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Default)]
|
#[derive(Deserialize, Serialize)]
|
||||||
#[serde(default)]
|
pub struct Config462 {
|
||||||
pub struct Config455 {
|
|
||||||
/// Save charge limit for restoring on boot
|
/// Save charge limit for restoring on boot
|
||||||
pub bat_charge_limit: u8,
|
pub bat_charge_limit: u8,
|
||||||
pub panel_od: bool,
|
pub panel_od: bool,
|
||||||
|
pub disable_nvidia_powerd_on_battery: bool,
|
||||||
|
pub ac_command: String,
|
||||||
|
pub bat_command: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Config455> for Config {
|
impl From<Config462> for Config {
|
||||||
fn from(c: Config455) -> Self {
|
fn from(c: Config462) -> Self {
|
||||||
Self {
|
Self {
|
||||||
bat_charge_limit: c.bat_charge_limit,
|
bat_charge_limit: c.bat_charge_limit,
|
||||||
panel_od: c.panel_od,
|
panel_od: c.panel_od,
|
||||||
|
mini_led_mode: false,
|
||||||
disable_nvidia_powerd_on_battery: true,
|
disable_nvidia_powerd_on_battery: true,
|
||||||
ac_command: String::new(),
|
ac_command: String::new(),
|
||||||
bat_command: String::new(),
|
bat_command: String::new(),
|
||||||
@@ -55,7 +60,7 @@ impl From<Config455> for Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Default)]
|
#[derive(Deserialize, Serialize)]
|
||||||
pub struct Config458 {
|
pub struct Config458 {
|
||||||
/// Save charge limit for restoring on boot
|
/// Save charge limit for restoring on boot
|
||||||
pub bat_charge_limit: u8,
|
pub bat_charge_limit: u8,
|
||||||
@@ -69,6 +74,7 @@ impl From<Config458> for Config {
|
|||||||
Self {
|
Self {
|
||||||
bat_charge_limit: c.bat_charge_limit,
|
bat_charge_limit: c.bat_charge_limit,
|
||||||
panel_od: c.panel_od,
|
panel_od: c.panel_od,
|
||||||
|
mini_led_mode: false,
|
||||||
disable_nvidia_powerd_on_battery: true,
|
disable_nvidia_powerd_on_battery: true,
|
||||||
ac_command: c.ac_command,
|
ac_command: c.ac_command,
|
||||||
bat_command: c.bat_command,
|
bat_command: c.bat_command,
|
||||||
@@ -2,78 +2,12 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use config_traits::{StdConfig, StdConfigLoad2};
|
use config_traits::{StdConfig, StdConfigLoad2};
|
||||||
use rog_anime::error::AnimeError;
|
use rog_anime::error::AnimeError;
|
||||||
use rog_anime::{ActionData, ActionLoader, AnimTime, AnimeType, Fade, Vec2};
|
use rog_anime::usb::Brightness;
|
||||||
|
use rog_anime::{ActionData, ActionLoader, AnimTime, Animations, AnimeType, Fade, Vec2};
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|
||||||
const CONFIG_FILE: &str = "anime.ron";
|
const CONFIG_FILE: &str = "anime.ron";
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
pub struct AnimeConfigV341 {
|
|
||||||
pub system: Option<ActionLoader>,
|
|
||||||
pub boot: Option<ActionLoader>,
|
|
||||||
pub suspend: Option<ActionLoader>,
|
|
||||||
pub shutdown: Option<ActionLoader>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<AnimeConfigV341> for AnimeConfig {
|
|
||||||
fn from(c: AnimeConfigV341) -> AnimeConfig {
|
|
||||||
AnimeConfig {
|
|
||||||
system: if let Some(ani) = c.system {
|
|
||||||
vec![ani]
|
|
||||||
} else {
|
|
||||||
vec![]
|
|
||||||
},
|
|
||||||
boot: if let Some(ani) = c.boot {
|
|
||||||
vec![ani]
|
|
||||||
} else {
|
|
||||||
vec![]
|
|
||||||
},
|
|
||||||
wake: if let Some(ani) = c.suspend {
|
|
||||||
vec![ani]
|
|
||||||
} else {
|
|
||||||
vec![]
|
|
||||||
},
|
|
||||||
shutdown: if let Some(ani) = c.shutdown.clone() {
|
|
||||||
vec![ani]
|
|
||||||
} else {
|
|
||||||
vec![]
|
|
||||||
},
|
|
||||||
sleep: if let Some(ani) = c.shutdown.clone() {
|
|
||||||
vec![ani]
|
|
||||||
} else {
|
|
||||||
vec![]
|
|
||||||
},
|
|
||||||
brightness: 1.0,
|
|
||||||
awake_enabled: true,
|
|
||||||
boot_anim_enabled: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
|
||||||
pub struct AnimeConfigV352 {
|
|
||||||
pub system: Vec<ActionLoader>,
|
|
||||||
pub boot: Vec<ActionLoader>,
|
|
||||||
pub wake: Vec<ActionLoader>,
|
|
||||||
pub shutdown: Vec<ActionLoader>,
|
|
||||||
pub brightness: f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<AnimeConfigV352> for AnimeConfig {
|
|
||||||
fn from(c: AnimeConfigV352) -> AnimeConfig {
|
|
||||||
AnimeConfig {
|
|
||||||
system: c.system,
|
|
||||||
boot: c.boot,
|
|
||||||
wake: c.wake,
|
|
||||||
sleep: c.shutdown.clone(),
|
|
||||||
shutdown: c.shutdown,
|
|
||||||
brightness: 1.0,
|
|
||||||
awake_enabled: true,
|
|
||||||
boot_anim_enabled: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize)]
|
#[derive(Deserialize, Serialize)]
|
||||||
pub struct AnimeConfigV460 {
|
pub struct AnimeConfigV460 {
|
||||||
pub system: Vec<ActionLoader>,
|
pub system: Vec<ActionLoader>,
|
||||||
@@ -92,9 +26,32 @@ impl From<AnimeConfigV460> for AnimeConfig {
|
|||||||
wake: c.wake,
|
wake: c.wake,
|
||||||
sleep: c.sleep,
|
sleep: c.sleep,
|
||||||
shutdown: c.shutdown,
|
shutdown: c.shutdown,
|
||||||
brightness: 1.0,
|
..Default::default()
|
||||||
awake_enabled: true,
|
}
|
||||||
boot_anim_enabled: true,
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
pub struct AnimeConfigV5 {
|
||||||
|
pub system: Vec<ActionLoader>,
|
||||||
|
pub boot: Vec<ActionLoader>,
|
||||||
|
pub wake: Vec<ActionLoader>,
|
||||||
|
pub sleep: Vec<ActionLoader>,
|
||||||
|
pub shutdown: Vec<ActionLoader>,
|
||||||
|
pub brightness: f32,
|
||||||
|
pub awake_enabled: bool,
|
||||||
|
pub boot_anim_enabled: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<AnimeConfigV5> for AnimeConfig {
|
||||||
|
fn from(c: AnimeConfigV5) -> AnimeConfig {
|
||||||
|
AnimeConfig {
|
||||||
|
system: c.system,
|
||||||
|
boot: c.boot,
|
||||||
|
wake: c.wake,
|
||||||
|
sleep: c.sleep,
|
||||||
|
shutdown: c.shutdown,
|
||||||
|
..Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,27 +107,33 @@ impl AnimeConfigCached {
|
|||||||
/// Config for base system actions for the anime display
|
/// Config for base system actions for the anime display
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
pub struct AnimeConfig {
|
pub struct AnimeConfig {
|
||||||
|
pub model_override: Option<AnimeType>,
|
||||||
pub system: Vec<ActionLoader>,
|
pub system: Vec<ActionLoader>,
|
||||||
pub boot: Vec<ActionLoader>,
|
pub boot: Vec<ActionLoader>,
|
||||||
pub wake: Vec<ActionLoader>,
|
pub wake: Vec<ActionLoader>,
|
||||||
pub sleep: Vec<ActionLoader>,
|
pub sleep: Vec<ActionLoader>,
|
||||||
pub shutdown: Vec<ActionLoader>,
|
pub shutdown: Vec<ActionLoader>,
|
||||||
pub brightness: f32,
|
pub brightness: f32,
|
||||||
pub awake_enabled: bool,
|
pub display_enabled: bool,
|
||||||
pub boot_anim_enabled: bool,
|
pub display_brightness: Brightness,
|
||||||
|
pub builtin_anims_enabled: bool,
|
||||||
|
pub builtin_anims: Animations,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for AnimeConfig {
|
impl Default for AnimeConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
AnimeConfig {
|
AnimeConfig {
|
||||||
|
model_override: None,
|
||||||
system: Vec::new(),
|
system: Vec::new(),
|
||||||
boot: Vec::new(),
|
boot: Vec::new(),
|
||||||
wake: Vec::new(),
|
wake: Vec::new(),
|
||||||
sleep: Vec::new(),
|
sleep: Vec::new(),
|
||||||
shutdown: Vec::new(),
|
shutdown: Vec::new(),
|
||||||
brightness: 1.0,
|
brightness: 1.0,
|
||||||
awake_enabled: true,
|
display_enabled: true,
|
||||||
boot_anim_enabled: true,
|
display_brightness: Brightness::Med,
|
||||||
|
builtin_anims_enabled: true,
|
||||||
|
builtin_anims: Animations::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,7 +152,7 @@ impl StdConfig for AnimeConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StdConfigLoad2<AnimeConfigV341, AnimeConfigV352> for AnimeConfig {}
|
impl StdConfigLoad2<AnimeConfigV460, AnimeConfigV5> for AnimeConfig {}
|
||||||
|
|
||||||
impl AnimeConfig {
|
impl AnimeConfig {
|
||||||
// fn clamp_config_brightness(mut config: &mut AnimeConfig) {
|
// fn clamp_config_brightness(mut config: &mut AnimeConfig) {
|
||||||
@@ -247,8 +210,7 @@ impl AnimeConfig {
|
|||||||
time: AnimTime::Infinite,
|
time: AnimTime::Infinite,
|
||||||
}],
|
}],
|
||||||
brightness: 1.0,
|
brightness: 1.0,
|
||||||
awake_enabled: true,
|
..Default::default()
|
||||||
boot_anim_enabled: true,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,6 @@ pub mod config;
|
|||||||
pub mod trait_impls;
|
pub mod trait_impls;
|
||||||
|
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::error::Error;
|
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
@@ -11,7 +10,7 @@ use std::thread::sleep;
|
|||||||
use ::zbus::export::futures_util::lock::Mutex;
|
use ::zbus::export::futures_util::lock::Mutex;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use rog_anime::error::AnimeError;
|
use rog_anime::error::AnimeError;
|
||||||
use rog_anime::usb::{get_anime_type, pkt_for_flush, pkts_for_init};
|
use rog_anime::usb::{get_anime_type, pkt_flush, pkt_set_enable_powersave_anim, pkts_for_init};
|
||||||
use rog_anime::{ActionData, AnimeDataBuffer, AnimePacketType, AnimeType};
|
use rog_anime::{ActionData, AnimeDataBuffer, AnimePacketType, AnimeType};
|
||||||
use rog_platform::hid_raw::HidRaw;
|
use rog_platform::hid_raw::HidRaw;
|
||||||
use rog_platform::supported::AnimeSupportedFunctions;
|
use rog_platform::supported::AnimeSupportedFunctions;
|
||||||
@@ -29,8 +28,29 @@ impl GetSupported for CtrlAnime {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Node {
|
||||||
|
Usb(USBRaw),
|
||||||
|
Hid(HidRaw),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Node {
|
||||||
|
pub fn write_bytes(&self, message: &[u8]) -> Result<(), RogError> {
|
||||||
|
// TODO: map and pass on errors
|
||||||
|
match self {
|
||||||
|
Node::Usb(u) => {
|
||||||
|
u.write_bytes(message).ok();
|
||||||
|
}
|
||||||
|
Node::Hid(h) => {
|
||||||
|
h.write_bytes(message).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct CtrlAnime {
|
pub struct CtrlAnime {
|
||||||
node: USBRaw,
|
// node: HidRaw,
|
||||||
|
node: Node,
|
||||||
anime_type: AnimeType,
|
anime_type: AnimeType,
|
||||||
cache: AnimeConfigCached,
|
cache: AnimeConfigCached,
|
||||||
config: AnimeConfig,
|
config: AnimeConfig,
|
||||||
@@ -42,11 +62,27 @@ pub struct CtrlAnime {
|
|||||||
|
|
||||||
impl CtrlAnime {
|
impl CtrlAnime {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new(config: AnimeConfig) -> Result<CtrlAnime, Box<dyn Error>> {
|
pub fn new(config: AnimeConfig) -> Result<CtrlAnime, RogError> {
|
||||||
let node = USBRaw::new(0x193b)?;
|
// let node = HidRaw::new("193b")?;
|
||||||
let anime_type = get_anime_type()?;
|
let usb = USBRaw::new(0x193b).ok();
|
||||||
|
let hid = HidRaw::new("193b").ok();
|
||||||
|
let node = if usb.is_some() {
|
||||||
|
unsafe { Node::Usb(usb.unwrap_unchecked()) }
|
||||||
|
} else if hid.is_some() {
|
||||||
|
unsafe { Node::Hid(hid.unwrap_unchecked()) }
|
||||||
|
} else {
|
||||||
|
return Err(RogError::Anime(AnimeError::NoDevice));
|
||||||
|
};
|
||||||
|
|
||||||
info!("Device has an AniMe Matrix display");
|
let mut anime_type = get_anime_type()?;
|
||||||
|
if let AnimeType::Unknown = anime_type {
|
||||||
|
if let Some(model) = config.model_override {
|
||||||
|
warn!("Overriding the Animatrix type as {model:?}");
|
||||||
|
anime_type = model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
info!("Device has an AniMe Matrix display: {anime_type:?}");
|
||||||
let mut cache = AnimeConfigCached::default();
|
let mut cache = AnimeConfigCached::default();
|
||||||
cache.init_from_config(&config, anime_type)?;
|
cache.init_from_config(&config, anime_type)?;
|
||||||
|
|
||||||
@@ -70,12 +106,21 @@ impl CtrlAnime {
|
|||||||
///
|
///
|
||||||
/// Because this also writes to the usb device, other write tries (display
|
/// Because this also writes to the usb device, other write tries (display
|
||||||
/// only) *must* get the mutex lock and set the `thread_exit` atomic.
|
/// only) *must* get the mutex lock and set the `thread_exit` atomic.
|
||||||
fn run_thread(inner: Arc<Mutex<CtrlAnime>>, actions: Vec<ActionData>, mut once: bool) {
|
async fn run_thread(inner: Arc<Mutex<CtrlAnime>>, actions: Vec<ActionData>, mut once: bool) {
|
||||||
if actions.is_empty() {
|
if actions.is_empty() {
|
||||||
warn!("AniMe system actions was empty");
|
warn!("AniMe system actions was empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(lock) = inner.try_lock() {
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_enable_powersave_anim(false))
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
|
||||||
// Loop rules:
|
// Loop rules:
|
||||||
// - Lock the mutex **only when required**. That is, the lock must be held for
|
// - Lock the mutex **only when required**. That is, the lock must be held for
|
||||||
// the shortest duration possible.
|
// the shortest duration possible.
|
||||||
@@ -209,7 +254,7 @@ impl CtrlAnime {
|
|||||||
for row in &data {
|
for row in &data {
|
||||||
self.node.write_bytes(row)?;
|
self.node.write_bytes(row)?;
|
||||||
}
|
}
|
||||||
self.node.write_bytes(&pkt_for_flush())?;
|
self.node.write_bytes(&pkt_flush())?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,299 @@
|
|||||||
|
use std::sync::atomic::Ordering;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use config_traits::StdConfig;
|
||||||
|
use log::warn;
|
||||||
|
use rog_anime::usb::{
|
||||||
|
pkt_set_brightness, pkt_set_builtin_animations, pkt_set_enable_display,
|
||||||
|
pkt_set_enable_powersave_anim, AnimAwake, AnimBooting, AnimShutdown, AnimSleeping, Brightness,
|
||||||
|
};
|
||||||
|
use rog_anime::{AnimeDataBuffer, DeviceState};
|
||||||
|
use zbus::export::futures_util::lock::Mutex;
|
||||||
|
use zbus::{dbus_interface, Connection, SignalContext};
|
||||||
|
|
||||||
|
use super::CtrlAnime;
|
||||||
|
use crate::error::RogError;
|
||||||
|
|
||||||
|
pub(super) const ZBUS_PATH: &str = "/org/asuslinux/Anime";
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct CtrlAnimeZbus(pub Arc<Mutex<CtrlAnime>>);
|
||||||
|
|
||||||
|
/// The struct with the main dbus methods requires this trait
|
||||||
|
#[async_trait]
|
||||||
|
impl crate::ZbusRun for CtrlAnimeZbus {
|
||||||
|
async fn add_to_server(self, server: &mut Connection) {
|
||||||
|
Self::add_to_server_helper(self, ZBUS_PATH, server).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// None of these calls can be guarnateed to succeed unless we loop until okay
|
||||||
|
// If the try_lock *does* succeed then any other thread trying to lock will not
|
||||||
|
// grab it until we finish.
|
||||||
|
#[dbus_interface(name = "org.asuslinux.Daemon")]
|
||||||
|
impl CtrlAnimeZbus {
|
||||||
|
/// Writes a data stream of length. Will force system thread to exit until
|
||||||
|
/// it is restarted
|
||||||
|
async fn write(&self, input: AnimeDataBuffer) -> zbus::fdo::Result<()> {
|
||||||
|
let lock = self.0.lock().await;
|
||||||
|
lock.thread_exit.store(true, Ordering::SeqCst);
|
||||||
|
lock.write_data_buffer(input).map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
err
|
||||||
|
})?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the global AniMe brightness
|
||||||
|
async fn set_image_brightness(&self, bright: f32) {
|
||||||
|
let mut lock = self.0.lock().await;
|
||||||
|
let mut bright = bright;
|
||||||
|
if bright < 0.0 {
|
||||||
|
bright = 0.0;
|
||||||
|
} else if bright > 1.0 {
|
||||||
|
bright = 1.0;
|
||||||
|
}
|
||||||
|
lock.config.brightness = bright;
|
||||||
|
lock.config.write();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set base brightness level
|
||||||
|
// TODO: enum for brightness
|
||||||
|
async fn set_brightness(
|
||||||
|
&self,
|
||||||
|
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
||||||
|
brightness: Brightness,
|
||||||
|
) {
|
||||||
|
let mut lock = self.0.lock().await;
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_brightness(brightness))
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
lock.config.display_brightness = brightness;
|
||||||
|
lock.config.write();
|
||||||
|
|
||||||
|
Self::notify_device_state(
|
||||||
|
&ctxt,
|
||||||
|
DeviceState {
|
||||||
|
display_enabled: lock.config.display_enabled,
|
||||||
|
display_brightness: lock.config.display_brightness,
|
||||||
|
builtin_anims_enabled: lock.config.builtin_anims_enabled,
|
||||||
|
builtin_anims: lock.config.builtin_anims,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Enable the builtin animations or not
|
||||||
|
async fn set_builtins_enabled(
|
||||||
|
&self,
|
||||||
|
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
||||||
|
enabled: bool,
|
||||||
|
) {
|
||||||
|
let mut lock = self.0.lock().await;
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_enable_powersave_anim(enabled))
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
lock.config.builtin_anims_enabled = enabled;
|
||||||
|
lock.config.write();
|
||||||
|
if enabled {
|
||||||
|
lock.thread_exit.store(true, Ordering::Release);
|
||||||
|
}
|
||||||
|
|
||||||
|
Self::notify_device_state(
|
||||||
|
&ctxt,
|
||||||
|
DeviceState {
|
||||||
|
display_enabled: lock.config.display_enabled,
|
||||||
|
display_brightness: lock.config.display_brightness,
|
||||||
|
builtin_anims_enabled: lock.config.builtin_anims_enabled,
|
||||||
|
builtin_anims: lock.config.builtin_anims,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set which builtin animation is used for each stage
|
||||||
|
async fn set_builtin_animations(
|
||||||
|
&self,
|
||||||
|
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
||||||
|
boot: AnimBooting,
|
||||||
|
awake: AnimAwake,
|
||||||
|
sleep: AnimSleeping,
|
||||||
|
shutdown: AnimShutdown,
|
||||||
|
) {
|
||||||
|
let mut lock = self.0.lock().await;
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_enable_powersave_anim(true))
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_builtin_animations(boot, awake, sleep, shutdown))
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
lock.config.builtin_anims.boot = boot;
|
||||||
|
lock.config.builtin_anims.sleep = sleep;
|
||||||
|
lock.config.builtin_anims.awake = awake;
|
||||||
|
lock.config.builtin_anims.shutdown = shutdown;
|
||||||
|
lock.config.write();
|
||||||
|
|
||||||
|
Self::notify_device_state(
|
||||||
|
&ctxt,
|
||||||
|
DeviceState {
|
||||||
|
display_enabled: lock.config.display_enabled,
|
||||||
|
display_brightness: lock.config.display_brightness,
|
||||||
|
builtin_anims_enabled: lock.config.builtin_anims_enabled,
|
||||||
|
builtin_anims: lock.config.builtin_anims,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set whether the AniMe is enabled at all
|
||||||
|
async fn set_enable_display(
|
||||||
|
&self,
|
||||||
|
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
||||||
|
enabled: bool,
|
||||||
|
) {
|
||||||
|
let mut lock = self.0.lock().await;
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_enable_display(enabled))
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("rog_anime::run_animation:callback {}", err);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
lock.config.display_enabled = enabled;
|
||||||
|
lock.config.write();
|
||||||
|
|
||||||
|
Self::notify_device_state(
|
||||||
|
&ctxt,
|
||||||
|
DeviceState {
|
||||||
|
display_enabled: lock.config.display_enabled,
|
||||||
|
display_brightness: lock.config.display_brightness,
|
||||||
|
builtin_anims_enabled: lock.config.builtin_anims_enabled,
|
||||||
|
builtin_anims: lock.config.builtin_anims,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The main loop is the base system set action if the user isn't running
|
||||||
|
/// the user daemon
|
||||||
|
async fn run_main_loop(&self, start: bool) {
|
||||||
|
if start {
|
||||||
|
let lock = self.0.lock().await;
|
||||||
|
lock.thread_exit.store(true, Ordering::SeqCst);
|
||||||
|
CtrlAnime::run_thread(self.0.clone(), lock.cache.system.clone(), false).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the device state as stored by asusd
|
||||||
|
// #[dbus_interface(property)]
|
||||||
|
async fn device_state(&self) -> DeviceState {
|
||||||
|
let lock = self.0.lock().await;
|
||||||
|
DeviceState {
|
||||||
|
display_enabled: lock.config.display_enabled,
|
||||||
|
display_brightness: lock.config.display_brightness,
|
||||||
|
builtin_anims_enabled: lock.config.builtin_anims_enabled,
|
||||||
|
builtin_anims: lock.config.builtin_anims,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Notify listeners of the status of AniMe LED power and factory
|
||||||
|
/// system-status animations
|
||||||
|
#[dbus_interface(signal)]
|
||||||
|
async fn notify_device_state(ctxt: &SignalContext<'_>, data: DeviceState) -> zbus::Result<()>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl crate::CtrlTask for CtrlAnimeZbus {
|
||||||
|
fn zbus_path() -> &'static str {
|
||||||
|
ZBUS_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn create_tasks(&self, _: SignalContext<'static>) -> Result<(), RogError> {
|
||||||
|
let inner1 = self.0.clone();
|
||||||
|
let inner2 = self.0.clone();
|
||||||
|
let inner3 = self.0.clone();
|
||||||
|
let inner4 = self.0.clone();
|
||||||
|
self.create_sys_event_tasks(
|
||||||
|
move || {
|
||||||
|
// on_sleep
|
||||||
|
let inner1 = inner1.clone();
|
||||||
|
async move {
|
||||||
|
let lock = inner1.lock().await;
|
||||||
|
CtrlAnime::run_thread(inner1.clone(), lock.cache.sleep.clone(), true).await;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
move || {
|
||||||
|
// on_wake
|
||||||
|
let inner2 = inner2.clone();
|
||||||
|
async move {
|
||||||
|
let lock = inner2.lock().await;
|
||||||
|
CtrlAnime::run_thread(inner2.clone(), lock.cache.wake.clone(), true).await;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
move || {
|
||||||
|
// on_shutdown
|
||||||
|
let inner3 = inner3.clone();
|
||||||
|
async move {
|
||||||
|
let lock = inner3.lock().await;
|
||||||
|
CtrlAnime::run_thread(inner3.clone(), lock.cache.shutdown.clone(), true).await;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
move || {
|
||||||
|
// on_boot
|
||||||
|
let inner4 = inner4.clone();
|
||||||
|
async move {
|
||||||
|
let lock = inner4.lock().await;
|
||||||
|
CtrlAnime::run_thread(inner4.clone(), lock.cache.boot.clone(), true).await;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl crate::Reloadable for CtrlAnimeZbus {
|
||||||
|
async fn reload(&mut self) -> Result<(), RogError> {
|
||||||
|
if let Some(lock) = self.0.try_lock() {
|
||||||
|
let anim = &lock.config.builtin_anims;
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_enable_display(lock.config.display_enabled))?;
|
||||||
|
lock.node.write_bytes(&pkt_set_enable_powersave_anim(
|
||||||
|
lock.config.builtin_anims_enabled,
|
||||||
|
))?;
|
||||||
|
lock.node.write_bytes(&pkt_set_builtin_animations(
|
||||||
|
anim.boot,
|
||||||
|
anim.awake,
|
||||||
|
anim.sleep,
|
||||||
|
anim.shutdown,
|
||||||
|
))?;
|
||||||
|
|
||||||
|
if lock.config.builtin_anims_enabled && !lock.cache.boot.is_empty() {
|
||||||
|
lock.node
|
||||||
|
.write_bytes(&pkt_set_enable_powersave_anim(false))
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
let action = lock.cache.boot.clone();
|
||||||
|
CtrlAnime::run_thread(self.0.clone(), action, true).await;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,9 +20,9 @@ pub enum AuraPowerConfig {
|
|||||||
|
|
||||||
impl AuraPowerConfig {
|
impl AuraPowerConfig {
|
||||||
/// Invalid for TUF laptops
|
/// Invalid for TUF laptops
|
||||||
pub fn to_bytes(control: &Self) -> [u8; 3] {
|
pub fn to_bytes(control: &Self) -> [u8; 4] {
|
||||||
match control {
|
match control {
|
||||||
AuraPowerConfig::AuraDevTuf(_) => [0, 0, 0],
|
AuraPowerConfig::AuraDevTuf(_) => [0, 0, 0, 0],
|
||||||
AuraPowerConfig::AuraDevRog1(c) => {
|
AuraPowerConfig::AuraDevRog1(c) => {
|
||||||
let c: Vec<AuraDevRog1> = c.iter().copied().collect();
|
let c: Vec<AuraDevRog1> = c.iter().copied().collect();
|
||||||
AuraDevRog1::to_bytes(&c)
|
AuraDevRog1::to_bytes(&c)
|
||||||
@@ -156,6 +156,10 @@ impl AuraConfig {
|
|||||||
AuraDevRog2::AwakeBar,
|
AuraDevRog2::AwakeBar,
|
||||||
AuraDevRog2::SleepBar,
|
AuraDevRog2::SleepBar,
|
||||||
AuraDevRog2::ShutdownBar,
|
AuraDevRog2::ShutdownBar,
|
||||||
|
AuraDevRog2::BootRearGlow,
|
||||||
|
AuraDevRog2::AwakeRearGlow,
|
||||||
|
AuraDevRog2::SleepRearGlow,
|
||||||
|
AuraDevRog2::ShutdownRearGlow,
|
||||||
]))
|
]))
|
||||||
} else if prod_id == AuraDevice::Tuf {
|
} else if prod_id == AuraDevice::Tuf {
|
||||||
AuraPowerConfig::AuraDevTuf(HashSet::from([
|
AuraPowerConfig::AuraDevTuf(HashSet::from([
|
||||||
@@ -200,7 +200,7 @@ impl CtrlKbdLed {
|
|||||||
}
|
}
|
||||||
} else if let LEDNode::Rog(hid_raw) = &self.led_node {
|
} else if let LEDNode::Rog(hid_raw) = &self.led_node {
|
||||||
let bytes = AuraPowerConfig::to_bytes(&self.config.enabled);
|
let bytes = AuraPowerConfig::to_bytes(&self.config.enabled);
|
||||||
let message = [0x5d, 0xbd, 0x01, bytes[0], bytes[1], bytes[2]];
|
let message = [0x5d, 0xbd, 0x01, bytes[0], bytes[1], bytes[2], bytes[3]];
|
||||||
|
|
||||||
hid_raw.write_bytes(&message)?;
|
hid_raw.write_bytes(&message)?;
|
||||||
hid_raw.write_bytes(&LED_SET)?;
|
hid_raw.write_bytes(&LED_SET)?;
|
||||||
@@ -225,7 +225,11 @@ impl CtrlKbdLed {
|
|||||||
self.write_mode(&effect)?;
|
self.write_mode(&effect)?;
|
||||||
self.config.read(); // refresh config if successful
|
self.config.read(); // refresh config if successful
|
||||||
self.config.set_builtin(effect);
|
self.config.set_builtin(effect);
|
||||||
|
if self.config.brightness == LedBrightness::Off {
|
||||||
|
self.config.brightness = LedBrightness::Med;
|
||||||
|
}
|
||||||
self.config.write();
|
self.config.write();
|
||||||
|
self.set_brightness(self.config.brightness)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +237,11 @@ impl CtrlKbdLed {
|
|||||||
/// write the raw factory mode packets - when doing this it is expected that
|
/// write the raw factory mode packets - when doing this it is expected that
|
||||||
/// only the first `Vec` (`effect[0]`) is valid.
|
/// only the first `Vec` (`effect[0]`) is valid.
|
||||||
pub fn write_effect_block(&mut self, effect: &UsbPackets) -> Result<(), RogError> {
|
pub fn write_effect_block(&mut self, effect: &UsbPackets) -> Result<(), RogError> {
|
||||||
|
if self.config.brightness == LedBrightness::Off {
|
||||||
|
self.config.brightness = LedBrightness::Med;
|
||||||
|
self.config.write();
|
||||||
|
}
|
||||||
|
|
||||||
let pkt_type = effect[0][1];
|
let pkt_type = effect[0][1];
|
||||||
const PER_KEY_TYPE: u8 = 0xbc;
|
const PER_KEY_TYPE: u8 = 0xbc;
|
||||||
|
|
||||||
@@ -78,6 +78,10 @@ impl CtrlKbdLedZbus {
|
|||||||
/// BootBar,
|
/// BootBar,
|
||||||
/// SleepBar,
|
/// SleepBar,
|
||||||
/// ShutdownBar,
|
/// ShutdownBar,
|
||||||
|
/// BootRearBar,
|
||||||
|
/// AwakeRearBar,
|
||||||
|
/// SleepRearBar,
|
||||||
|
/// ShutdownRearBar,
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
async fn set_leds_power(
|
async fn set_leds_power(
|
||||||
@@ -122,6 +126,11 @@ impl CtrlKbdLedZbus {
|
|||||||
e
|
e
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
ctrl.set_brightness(ctrl.config.brightness).map_err(|e| {
|
||||||
|
warn!("{}", e);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
|
||||||
if let Some(mode) = ctrl.config.builtins.get(&ctrl.config.current_mode) {
|
if let Some(mode) = ctrl.config.builtins.get(&ctrl.config.current_mode) {
|
||||||
Self::notify_led(&ctxt, mode.clone())
|
Self::notify_led(&ctxt, mode.clone())
|
||||||
.await
|
.await
|
||||||
@@ -298,11 +307,11 @@ impl CtrlTask for CtrlKbdLedZbus {
|
|||||||
|
|
||||||
let ctrl2 = self.0.clone();
|
let ctrl2 = self.0.clone();
|
||||||
let ctrl = self.0.lock().await;
|
let ctrl = self.0.lock().await;
|
||||||
let mut watch = ctrl.kd_brightness.monitor_brightness()?;
|
let watch = ctrl.kd_brightness.monitor_brightness()?;
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut buffer = [0; 32];
|
let mut buffer = [0; 32];
|
||||||
watch
|
watch
|
||||||
.event_stream(&mut buffer)
|
.into_event_stream(&mut buffer)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.for_each(|_| async {
|
.for_each(|_| async {
|
||||||
if let Some(lock) = ctrl2.try_lock() {
|
if let Some(lock) = ctrl2.try_lock() {
|
||||||
@@ -31,12 +31,14 @@ impl GetSupported for CtrlPlatform {
|
|||||||
|
|
||||||
fn get_supported() -> Self::A {
|
fn get_supported() -> Self::A {
|
||||||
let mut panel_overdrive = false;
|
let mut panel_overdrive = false;
|
||||||
|
let mut mini_led_mode = false;
|
||||||
let mut dgpu_disable = false;
|
let mut dgpu_disable = false;
|
||||||
let mut egpu_enable = false;
|
let mut egpu_enable = false;
|
||||||
let mut gpu_mux = false;
|
let mut gpu_mux = false;
|
||||||
|
|
||||||
if let Ok(platform) = AsusPlatform::new() {
|
if let Ok(platform) = AsusPlatform::new() {
|
||||||
panel_overdrive = platform.has_panel_od();
|
panel_overdrive = platform.has_panel_od();
|
||||||
|
mini_led_mode = platform.has_mini_led_mode();
|
||||||
dgpu_disable = platform.has_dgpu_disable();
|
dgpu_disable = platform.has_dgpu_disable();
|
||||||
egpu_enable = platform.has_egpu_enable();
|
egpu_enable = platform.has_egpu_enable();
|
||||||
gpu_mux = platform.has_gpu_mux_mode();
|
gpu_mux = platform.has_gpu_mux_mode();
|
||||||
@@ -46,6 +48,7 @@ impl GetSupported for CtrlPlatform {
|
|||||||
post_sound: Path::new(ASUS_POST_LOGO_SOUND).exists(),
|
post_sound: Path::new(ASUS_POST_LOGO_SOUND).exists(),
|
||||||
gpu_mux,
|
gpu_mux,
|
||||||
panel_overdrive,
|
panel_overdrive,
|
||||||
|
mini_led_mode,
|
||||||
dgpu_disable,
|
dgpu_disable,
|
||||||
egpu_enable,
|
egpu_enable,
|
||||||
}
|
}
|
||||||
@@ -214,25 +217,51 @@ impl CtrlPlatform {
|
|||||||
/// Get the `panel_od` value from platform. Updates the stored value in
|
/// Get the `panel_od` value from platform. Updates the stored value in
|
||||||
/// internal config also.
|
/// internal config also.
|
||||||
fn panel_od(&self) -> bool {
|
fn panel_od(&self) -> bool {
|
||||||
let od = self
|
self.platform
|
||||||
.platform
|
|
||||||
.get_panel_od()
|
.get_panel_od()
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("CtrlRogBios: get_panel_od {}", err);
|
warn!("CtrlRogBios: get_panel_od {}", err);
|
||||||
err
|
err
|
||||||
})
|
})
|
||||||
.unwrap_or(false);
|
.unwrap_or(false)
|
||||||
if let Some(mut lock) = self.config.try_lock() {
|
|
||||||
lock.panel_od = od;
|
|
||||||
lock.write();
|
|
||||||
}
|
|
||||||
od
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[dbus_interface(signal)]
|
#[dbus_interface(signal)]
|
||||||
async fn notify_panel_od(signal_ctxt: &SignalContext<'_>, overdrive: bool) -> zbus::Result<()> {
|
async fn notify_panel_od(signal_ctxt: &SignalContext<'_>, overdrive: bool) -> zbus::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn set_mini_led_mode(
|
||||||
|
&mut self,
|
||||||
|
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
||||||
|
on: bool,
|
||||||
|
) {
|
||||||
|
match self.platform.set_mini_led_mode(on) {
|
||||||
|
Ok(_) => {
|
||||||
|
if let Some(mut lock) = self.config.try_lock() {
|
||||||
|
lock.mini_led_mode = on;
|
||||||
|
lock.write();
|
||||||
|
}
|
||||||
|
Self::notify_mini_led_mode(&ctxt, on).await.ok();
|
||||||
|
}
|
||||||
|
Err(err) => warn!("CtrlRogBios: set_mini_led_mode {}", err),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the `panel_od` value from platform. Updates the stored value in
|
||||||
|
/// internal config also.
|
||||||
|
fn mini_led_mode(&self) -> bool {
|
||||||
|
self.platform
|
||||||
|
.get_mini_led_mode()
|
||||||
|
.map_err(|err| {
|
||||||
|
warn!("CtrlRogBios: get_mini_led_mode {}", err);
|
||||||
|
err
|
||||||
|
})
|
||||||
|
.unwrap_or(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[dbus_interface(signal)]
|
||||||
|
async fn notify_mini_led_mode(signal_ctxt: &SignalContext<'_>, on: bool) -> zbus::Result<()> {}
|
||||||
|
|
||||||
async fn set_dgpu_disable(
|
async fn set_dgpu_disable(
|
||||||
&mut self,
|
&mut self,
|
||||||
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
#[zbus(signal_context)] ctxt: SignalContext<'_>,
|
||||||
@@ -343,7 +372,7 @@ impl CtrlTask for CtrlPlatform {
|
|||||||
platform1
|
platform1
|
||||||
.set_panel_overdrive(lock.panel_od)
|
.set_panel_overdrive(lock.panel_od)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("CtrlCharge: set_limit {}", err);
|
warn!("CtrlCharge: panel_od {}", err);
|
||||||
err
|
err
|
||||||
})
|
})
|
||||||
.ok();
|
.ok();
|
||||||
@@ -360,7 +389,7 @@ impl CtrlTask for CtrlPlatform {
|
|||||||
platform2
|
platform2
|
||||||
.set_panel_overdrive(lock.panel_od)
|
.set_panel_overdrive(lock.panel_od)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
warn!("CtrlCharge: set_limit {}", err);
|
warn!("CtrlCharge: panel_od {}", err);
|
||||||
err
|
err
|
||||||
})
|
})
|
||||||
.ok();
|
.ok();
|
||||||
@@ -14,7 +14,7 @@ use zbus::{dbus_interface, Connection, SignalContext};
|
|||||||
|
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
use crate::error::RogError;
|
use crate::error::RogError;
|
||||||
use crate::{task_watch_item, CtrlTask, GetSupported};
|
use crate::{CtrlTask, GetSupported};
|
||||||
|
|
||||||
const ZBUS_PATH: &str = "/org/asuslinux/Power";
|
const ZBUS_PATH: &str = "/org/asuslinux/Power";
|
||||||
const NVIDIA_POWERD: &str = "nvidia-powerd.service";
|
const NVIDIA_POWERD: &str = "nvidia-powerd.service";
|
||||||
@@ -120,7 +120,7 @@ impl crate::Reloadable for CtrlPower {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl CtrlPower {
|
impl CtrlPower {
|
||||||
task_watch_item!(charge_control_end_threshold power);
|
// task_watch_item!(charge_control_end_threshold power);
|
||||||
|
|
||||||
pub fn new(config: Arc<Mutex<Config>>) -> Result<Self, RogError> {
|
pub fn new(config: Arc<Mutex<Config>>) -> Result<Self, RogError> {
|
||||||
Ok(CtrlPower {
|
Ok(CtrlPower {
|
||||||
@@ -211,8 +211,8 @@ impl CtrlTask for CtrlPower {
|
|||||||
.await;
|
.await;
|
||||||
|
|
||||||
let config = self.config.clone();
|
let config = self.config.clone();
|
||||||
self.watch_charge_control_end_threshold(signal_ctxt.clone())
|
// self.watch_charge_control_end_threshold(signal_ctxt.clone())
|
||||||
.await?;
|
// .await?;
|
||||||
|
|
||||||
let ctrl = self.clone();
|
let ctrl = self.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
@@ -101,7 +101,13 @@ impl CtrlPlatformProfile {
|
|||||||
// For each profile we need to switch to it before we
|
// For each profile we need to switch to it before we
|
||||||
// can read the existing values from hardware. The ACPI method used
|
// can read the existing values from hardware. The ACPI method used
|
||||||
// for this is what limits us.
|
// for this is what limits us.
|
||||||
controller.set_next_profile()?;
|
let next =
|
||||||
|
Profile::get_next_profile(controller.profile_config.active_profile);
|
||||||
|
Profile::set_profile(next)
|
||||||
|
.map_err(|e| warn!("{MOD_NAME}: set_profile, {}", e))
|
||||||
|
.ok();
|
||||||
|
controller.profile_config.active_profile = next;
|
||||||
|
|
||||||
// Make sure to set the baseline to default
|
// Make sure to set the baseline to default
|
||||||
controller.set_active_curve_to_defaults()?;
|
controller.set_active_curve_to_defaults()?;
|
||||||
let active = Profile::get_active_profile().unwrap_or(Profile::Balanced);
|
let active = Profile::get_active_profile().unwrap_or(Profile::Balanced);
|
||||||
@@ -141,28 +147,6 @@ impl CtrlPlatformProfile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Toggle to next profile in list. This will first read the config, switch,
|
|
||||||
/// then write out
|
|
||||||
pub(super) fn set_next_profile(&mut self) -> Result<(), RogError> {
|
|
||||||
// Read first just incase the user has modified the config before calling this
|
|
||||||
match self.profile_config.active_profile {
|
|
||||||
Profile::Balanced => {
|
|
||||||
Profile::set_profile(Profile::Performance)?;
|
|
||||||
self.profile_config.active_profile = Profile::Performance;
|
|
||||||
}
|
|
||||||
Profile::Performance => {
|
|
||||||
Profile::set_profile(Profile::Quiet)?;
|
|
||||||
self.profile_config.active_profile = Profile::Quiet;
|
|
||||||
}
|
|
||||||
Profile::Quiet => {
|
|
||||||
Profile::set_profile(Profile::Balanced)?;
|
|
||||||
self.profile_config.active_profile = Profile::Balanced;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.write_profile_curve_to_platform()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set the curve for the active profile active
|
/// Set the curve for the active profile active
|
||||||
pub(super) fn write_profile_curve_to_platform(&mut self) -> Result<(), RogError> {
|
pub(super) fn write_profile_curve_to_platform(&mut self) -> Result<(), RogError> {
|
||||||
if let Some(curves) = &mut self.fan_curves {
|
if let Some(curves) = &mut self.fan_curves {
|
||||||
@@ -40,8 +40,11 @@ impl ProfileZbus {
|
|||||||
/// If fan-curves are supported will also activate a fan curve for profile.
|
/// If fan-curves are supported will also activate a fan curve for profile.
|
||||||
async fn next_profile(&mut self, #[zbus(signal_context)] ctxt: SignalContext<'_>) {
|
async fn next_profile(&mut self, #[zbus(signal_context)] ctxt: SignalContext<'_>) {
|
||||||
let mut ctrl = self.0.lock().await;
|
let mut ctrl = self.0.lock().await;
|
||||||
ctrl.set_next_profile()
|
let next = Profile::get_next_profile(ctrl.profile_config.active_profile);
|
||||||
.unwrap_or_else(|err| warn!("{MOD_NAME}: {}", err));
|
Profile::set_profile(next)
|
||||||
|
.map_err(|e| warn!("{MOD_NAME}: set_profile, {}", e))
|
||||||
|
.ok();
|
||||||
|
ctrl.profile_config.active_profile = next;
|
||||||
ctrl.save_config();
|
ctrl.save_config();
|
||||||
|
|
||||||
Self::notify_profile(&ctxt, ctrl.profile_config.active_profile)
|
Self::notify_profile(&ctxt, ctrl.profile_config.active_profile)
|
||||||
@@ -207,7 +210,7 @@ impl CtrlTask for ProfileZbus {
|
|||||||
async fn create_tasks(&self, signal_ctxt: SignalContext<'static>) -> Result<(), RogError> {
|
async fn create_tasks(&self, signal_ctxt: SignalContext<'static>) -> Result<(), RogError> {
|
||||||
let ctrl = self.0.clone();
|
let ctrl = self.0.clone();
|
||||||
let sig_ctx = signal_ctxt.clone();
|
let sig_ctx = signal_ctxt.clone();
|
||||||
let mut watch = self
|
let watch = self
|
||||||
.0
|
.0
|
||||||
.lock()
|
.lock()
|
||||||
.await
|
.await
|
||||||
@@ -216,7 +219,7 @@ impl CtrlTask for ProfileZbus {
|
|||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut buffer = [0; 32];
|
let mut buffer = [0; 32];
|
||||||
if let Ok(stream) = watch.event_stream(&mut buffer) {
|
if let Ok(stream) = watch.into_event_stream(&mut buffer) {
|
||||||
stream
|
stream
|
||||||
.for_each(|_| async {
|
.for_each(|_| async {
|
||||||
let mut lock = ctrl.lock().await;
|
let mut lock = ctrl.lock().await;
|
||||||
@@ -236,10 +239,11 @@ impl CtrlTask for ProfileZbus {
|
|||||||
error!("Profile::set_profile() error: {e}");
|
error!("Profile::set_profile() error: {e}");
|
||||||
})
|
})
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
|
Self::notify_profile(&sig_ctx, lock.profile_config.active_profile)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
}
|
}
|
||||||
Self::notify_profile(&sig_ctx, lock.profile_config.active_profile)
|
|
||||||
.await
|
|
||||||
.ok();
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
@@ -247,11 +251,11 @@ impl CtrlTask for ProfileZbus {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let ctrl = self.0.clone();
|
let ctrl = self.0.clone();
|
||||||
let mut watch = self.0.lock().await.platform.monitor_platform_profile()?;
|
let watch = self.0.lock().await.platform.monitor_platform_profile()?;
|
||||||
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut buffer = [0; 32];
|
let mut buffer = [0; 32];
|
||||||
if let Ok(stream) = watch.event_stream(&mut buffer) {
|
if let Ok(stream) = watch.into_event_stream(&mut buffer) {
|
||||||
stream
|
stream
|
||||||
.for_each(|_| async {
|
.for_each(|_| async {
|
||||||
let mut lock = ctrl.lock().await;
|
let mut lock = ctrl.lock().await;
|
||||||
@@ -271,13 +275,14 @@ impl CtrlTask for ProfileZbus {
|
|||||||
error!("Profile::set_profile() error: {e}");
|
error!("Profile::set_profile() error: {e}");
|
||||||
})
|
})
|
||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
|
Self::notify_profile(
|
||||||
|
&signal_ctxt,
|
||||||
|
lock.profile_config.active_profile,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.ok();
|
||||||
}
|
}
|
||||||
Self::notify_profile(
|
|
||||||
&signal_ctxt,
|
|
||||||
lock.profile_config.active_profile,
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.ok();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -6,20 +6,20 @@ use std::time::Duration;
|
|||||||
|
|
||||||
use ::zbus::export::futures_util::lock::Mutex;
|
use ::zbus::export::futures_util::lock::Mutex;
|
||||||
use ::zbus::Connection;
|
use ::zbus::Connection;
|
||||||
|
use asusd::config::Config;
|
||||||
|
use asusd::ctrl_anime::config::AnimeConfig;
|
||||||
|
use asusd::ctrl_anime::trait_impls::CtrlAnimeZbus;
|
||||||
|
use asusd::ctrl_anime::CtrlAnime;
|
||||||
|
use asusd::ctrl_aura::controller::CtrlKbdLed;
|
||||||
|
use asusd::ctrl_aura::trait_impls::CtrlKbdLedZbus;
|
||||||
|
use asusd::ctrl_platform::CtrlPlatform;
|
||||||
|
use asusd::ctrl_power::CtrlPower;
|
||||||
|
use asusd::ctrl_profiles::config::ProfileConfig;
|
||||||
|
use asusd::ctrl_profiles::controller::CtrlPlatformProfile;
|
||||||
|
use asusd::ctrl_profiles::trait_impls::ProfileZbus;
|
||||||
|
use asusd::ctrl_supported::SupportedFunctions;
|
||||||
|
use asusd::{print_board_info, CtrlTask, GetSupported, Reloadable, ZbusRun};
|
||||||
use config_traits::{StdConfig, StdConfigLoad, StdConfigLoad2};
|
use config_traits::{StdConfig, StdConfigLoad, StdConfigLoad2};
|
||||||
use daemon::config::Config;
|
|
||||||
use daemon::ctrl_anime::config::AnimeConfig;
|
|
||||||
use daemon::ctrl_anime::trait_impls::CtrlAnimeZbus;
|
|
||||||
use daemon::ctrl_anime::CtrlAnime;
|
|
||||||
use daemon::ctrl_aura::controller::CtrlKbdLed;
|
|
||||||
use daemon::ctrl_aura::trait_impls::CtrlKbdLedZbus;
|
|
||||||
use daemon::ctrl_platform::CtrlPlatform;
|
|
||||||
use daemon::ctrl_power::CtrlPower;
|
|
||||||
use daemon::ctrl_profiles::config::ProfileConfig;
|
|
||||||
use daemon::ctrl_profiles::controller::CtrlPlatformProfile;
|
|
||||||
use daemon::ctrl_profiles::trait_impls::ProfileZbus;
|
|
||||||
use daemon::ctrl_supported::SupportedFunctions;
|
|
||||||
use daemon::{print_board_info, CtrlTask, GetSupported, Reloadable, ZbusRun};
|
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
use rog_aura::aura_detection::LaptopLedData;
|
use rog_aura::aura_detection::LaptopLedData;
|
||||||
use rog_dbus::DBUS_NAME;
|
use rog_dbus::DBUS_NAME;
|
||||||
@@ -50,7 +50,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
info!(" daemon v{}", daemon::VERSION);
|
info!(" daemon v{}", asusd::VERSION);
|
||||||
info!(" rog-anime v{}", rog_anime::VERSION);
|
info!(" rog-anime v{}", rog_anime::VERSION);
|
||||||
info!(" rog-aura v{}", rog_aura::VERSION);
|
info!(" rog-aura v{}", rog_aura::VERSION);
|
||||||
info!(" rog-dbus v{}", rog_dbus::VERSION);
|
info!(" rog-dbus v{}", rog_dbus::VERSION);
|
||||||
@@ -51,6 +51,7 @@ const CONFIG_PATH_BASE: &str = "/etc/asusd/";
|
|||||||
/// task_watch_item!(gpu_mux_mode platform);
|
/// task_watch_item!(gpu_mux_mode platform);
|
||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
|
/// // TODO: this is kind of useless if it can't trigger some action
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! task_watch_item {
|
macro_rules! task_watch_item {
|
||||||
($name:ident $self_inner:ident) => {
|
($name:ident $self_inner:ident) => {
|
||||||
@@ -64,10 +65,10 @@ macro_rules! task_watch_item {
|
|||||||
let ctrl = self.clone();
|
let ctrl = self.clone();
|
||||||
concat_idents::concat_idents!(watch_fn = monitor_, $name {
|
concat_idents::concat_idents!(watch_fn = monitor_, $name {
|
||||||
match self.$self_inner.watch_fn() {
|
match self.$self_inner.watch_fn() {
|
||||||
Ok(mut watch) => {
|
Ok(watch) => {
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut buffer = [0; 32];
|
let mut buffer = [0; 32];
|
||||||
watch.event_stream(&mut buffer).unwrap().for_each(|_| async {
|
watch.into_event_stream(&mut buffer).unwrap().for_each(|_| async {
|
||||||
let value = ctrl.$name();
|
let value = ctrl.$name();
|
||||||
concat_idents::concat_idents!(notif_fn = notify_, $name {
|
concat_idents::concat_idents!(notif_fn = notify_, $name {
|
||||||
Self::notif_fn(&signal_ctxt, value).await.ok();
|
Self::notif_fn(&signal_ctxt, value).await.ok();
|
||||||
@@ -1,212 +0,0 @@
|
|||||||
use std::sync::atomic::Ordering;
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use async_trait::async_trait;
|
|
||||||
use config_traits::StdConfig;
|
|
||||||
use log::warn;
|
|
||||||
use rog_anime::usb::{pkt_for_apply, pkt_for_set_boot, pkt_for_set_on};
|
|
||||||
use rog_anime::{AnimeDataBuffer, AnimePowerStates};
|
|
||||||
use zbus::export::futures_util::lock::Mutex;
|
|
||||||
use zbus::{dbus_interface, Connection, SignalContext};
|
|
||||||
|
|
||||||
use super::CtrlAnime;
|
|
||||||
use crate::error::RogError;
|
|
||||||
|
|
||||||
pub(super) const ZBUS_PATH: &str = "/org/asuslinux/Anime";
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub struct CtrlAnimeZbus(pub Arc<Mutex<CtrlAnime>>);
|
|
||||||
|
|
||||||
/// The struct with the main dbus methods requires this trait
|
|
||||||
#[async_trait]
|
|
||||||
impl crate::ZbusRun for CtrlAnimeZbus {
|
|
||||||
async fn add_to_server(self, server: &mut Connection) {
|
|
||||||
Self::add_to_server_helper(self, ZBUS_PATH, server).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// None of these calls can be guarnateed to succeed unless we loop until okay
|
|
||||||
// If the try_lock *does* succeed then any other thread trying to lock will not
|
|
||||||
// grab it until we finish.
|
|
||||||
#[dbus_interface(name = "org.asuslinux.Daemon")]
|
|
||||||
impl CtrlAnimeZbus {
|
|
||||||
/// Writes a data stream of length. Will force system thread to exit until
|
|
||||||
/// it is restarted
|
|
||||||
async fn write(&self, input: AnimeDataBuffer) -> zbus::fdo::Result<()> {
|
|
||||||
let lock = self.0.lock().await;
|
|
||||||
lock.thread_exit.store(true, Ordering::SeqCst);
|
|
||||||
lock.write_data_buffer(input).map_err(|err| {
|
|
||||||
warn!("rog_anime::run_animation:callback {}", err);
|
|
||||||
err
|
|
||||||
})?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set the global AniMe brightness
|
|
||||||
async fn set_brightness(&self, bright: f32) {
|
|
||||||
let mut lock = self.0.lock().await;
|
|
||||||
let mut bright = bright;
|
|
||||||
if bright < 0.0 {
|
|
||||||
bright = 0.0;
|
|
||||||
} else if bright > 1.0 {
|
|
||||||
bright = 1.0;
|
|
||||||
}
|
|
||||||
lock.config.brightness = bright;
|
|
||||||
lock.config.write();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set whether the AniMe is displaying images/data
|
|
||||||
async fn set_on_off(&self, #[zbus(signal_context)] ctxt: SignalContext<'_>, status: bool) {
|
|
||||||
let mut lock = self.0.lock().await;
|
|
||||||
lock.node
|
|
||||||
.write_bytes(&pkt_for_set_on(status))
|
|
||||||
.map_err(|err| {
|
|
||||||
warn!("rog_anime::run_animation:callback {}", err);
|
|
||||||
})
|
|
||||||
.ok();
|
|
||||||
lock.config.awake_enabled = status;
|
|
||||||
lock.config.write();
|
|
||||||
|
|
||||||
Self::notify_power_states(
|
|
||||||
&ctxt,
|
|
||||||
AnimePowerStates {
|
|
||||||
brightness: lock.config.brightness.floor() as u8,
|
|
||||||
enabled: lock.config.awake_enabled,
|
|
||||||
boot_anim_enabled: lock.config.boot_anim_enabled,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set whether the AniMe will show boot, suspend, or off animations
|
|
||||||
async fn set_boot_on_off(&self, #[zbus(signal_context)] ctxt: SignalContext<'_>, on: bool) {
|
|
||||||
let mut lock = self.0.lock().await;
|
|
||||||
lock.node
|
|
||||||
.write_bytes(&pkt_for_set_boot(on))
|
|
||||||
.map_err(|err| {
|
|
||||||
warn!("rog_anime::run_animation:callback {}", err);
|
|
||||||
})
|
|
||||||
.ok();
|
|
||||||
lock.node
|
|
||||||
.write_bytes(&pkt_for_apply())
|
|
||||||
.map_err(|err| {
|
|
||||||
warn!("rog_anime::run_animation:callback {}", err);
|
|
||||||
})
|
|
||||||
.ok();
|
|
||||||
lock.config.boot_anim_enabled = on;
|
|
||||||
lock.config.write();
|
|
||||||
|
|
||||||
Self::notify_power_states(
|
|
||||||
&ctxt,
|
|
||||||
AnimePowerStates {
|
|
||||||
brightness: lock.config.brightness.floor() as u8,
|
|
||||||
enabled: lock.config.awake_enabled,
|
|
||||||
boot_anim_enabled: lock.config.boot_anim_enabled,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The main loop is the base system set action if the user isn't running
|
|
||||||
/// the user daemon
|
|
||||||
async fn run_main_loop(&self, start: bool) {
|
|
||||||
if start {
|
|
||||||
let lock = self.0.lock().await;
|
|
||||||
lock.thread_exit.store(true, Ordering::SeqCst);
|
|
||||||
CtrlAnime::run_thread(self.0.clone(), lock.cache.system.clone(), false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get status of if the AniMe LEDs are on/displaying while system is awake
|
|
||||||
#[dbus_interface(property)]
|
|
||||||
async fn awake_enabled(&self) -> bool {
|
|
||||||
let lock = self.0.lock().await;
|
|
||||||
lock.config.awake_enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the status of if factory system-status animations are enabled
|
|
||||||
#[dbus_interface(property)]
|
|
||||||
async fn boot_enabled(&self) -> bool {
|
|
||||||
let lock = self.0.lock().await;
|
|
||||||
lock.config.boot_anim_enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Notify listeners of the status of AniMe LED power and factory
|
|
||||||
/// system-status animations
|
|
||||||
#[dbus_interface(signal)]
|
|
||||||
async fn notify_power_states(
|
|
||||||
ctxt: &SignalContext<'_>,
|
|
||||||
data: AnimePowerStates,
|
|
||||||
) -> zbus::Result<()>;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait]
|
|
||||||
impl crate::CtrlTask for CtrlAnimeZbus {
|
|
||||||
fn zbus_path() -> &'static str {
|
|
||||||
ZBUS_PATH
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn create_tasks(&self, _: SignalContext<'static>) -> Result<(), RogError> {
|
|
||||||
let inner1 = self.0.clone();
|
|
||||||
let inner2 = self.0.clone();
|
|
||||||
let inner3 = self.0.clone();
|
|
||||||
let inner4 = self.0.clone();
|
|
||||||
self.create_sys_event_tasks(
|
|
||||||
move || {
|
|
||||||
// on_sleep
|
|
||||||
let inner1 = inner1.clone();
|
|
||||||
async move {
|
|
||||||
let lock = inner1.lock().await;
|
|
||||||
CtrlAnime::run_thread(inner1.clone(), lock.cache.sleep.clone(), true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
move || {
|
|
||||||
// on_wake
|
|
||||||
let inner2 = inner2.clone();
|
|
||||||
async move {
|
|
||||||
let lock = inner2.lock().await;
|
|
||||||
CtrlAnime::run_thread(inner2.clone(), lock.cache.wake.clone(), true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
move || {
|
|
||||||
// on_shutdown
|
|
||||||
let inner3 = inner3.clone();
|
|
||||||
async move {
|
|
||||||
let lock = inner3.lock().await;
|
|
||||||
CtrlAnime::run_thread(inner3.clone(), lock.cache.shutdown.clone(), true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
move || {
|
|
||||||
// on_boot
|
|
||||||
let inner4 = inner4.clone();
|
|
||||||
async move {
|
|
||||||
let lock = inner4.lock().await;
|
|
||||||
CtrlAnime::run_thread(inner4.clone(), lock.cache.boot.clone(), true);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait]
|
|
||||||
impl crate::Reloadable for CtrlAnimeZbus {
|
|
||||||
async fn reload(&mut self) -> Result<(), RogError> {
|
|
||||||
if let Some(lock) = self.0.try_lock() {
|
|
||||||
lock.node
|
|
||||||
.write_bytes(&pkt_for_set_on(lock.config.awake_enabled))?;
|
|
||||||
lock.node.write_bytes(&pkt_for_apply())?;
|
|
||||||
lock.node
|
|
||||||
.write_bytes(&pkt_for_set_boot(lock.config.boot_anim_enabled))?;
|
|
||||||
lock.node.write_bytes(&pkt_for_apply())?;
|
|
||||||
|
|
||||||
let action = lock.cache.boot.clone();
|
|
||||||
CtrlAnime::run_thread(self.0.clone(), action, true);
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<script language="javascript" type="text/javascript">
|
||||||
|
<!--
|
||||||
|
window.setTimeout('window.location="room4doom/index.html"; ', 0);
|
||||||
|
// -->
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -17,6 +17,10 @@ default = ["dbus", "detect"]
|
|||||||
dbus = ["zbus"]
|
dbus = ["zbus"]
|
||||||
detect = ["sysfs-class"]
|
detect = ["sysfs-class"]
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "rog_anime"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
png_pong.workspace = true
|
png_pong.workspace = true
|
||||||
pix.workspace = true
|
pix.workspace = true
|
||||||
@@ -32,7 +36,5 @@ zbus = { workspace = true, optional = true }
|
|||||||
|
|
||||||
sysfs-class = { workspace = true, optional = true }
|
sysfs-class = { workspace = true, optional = true }
|
||||||
|
|
||||||
uhid-virt = "^0.0.6"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
cargo-husky.workspace = true
|
cargo-husky.workspace = true
|
||||||
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 313 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 229 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 150 KiB |
@@ -1,4 +1,5 @@
|
|||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
use std::str::FromStr;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
@@ -8,6 +9,7 @@ use serde_derive::{Deserialize, Serialize};
|
|||||||
use zbus::zvariant::Type;
|
use zbus::zvariant::Type;
|
||||||
|
|
||||||
use crate::error::{AnimeError, Result};
|
use crate::error::{AnimeError, Result};
|
||||||
|
use crate::usb::{AnimAwake, AnimBooting, AnimShutdown, AnimSleeping, Brightness};
|
||||||
use crate::{AnimTime, AnimeGif};
|
use crate::{AnimTime, AnimeGif};
|
||||||
|
|
||||||
/// The first 7 bytes of a USB packet are accounted for by `USB_PREFIX1` and
|
/// The first 7 bytes of a USB packet are accounted for by `USB_PREFIX1` and
|
||||||
@@ -19,18 +21,28 @@ const BLOCK_END: usize = 634;
|
|||||||
const PANE_LEN: usize = BLOCK_END - BLOCK_START;
|
const PANE_LEN: usize = BLOCK_END - BLOCK_START;
|
||||||
|
|
||||||
/// First packet is for GA401 + GA402
|
/// First packet is for GA401 + GA402
|
||||||
const USB_PREFIX1: [u8; 7] = [0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02];
|
pub const USB_PREFIX1: [u8; 7] = [0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02];
|
||||||
/// Second packet is for GA401 + GA402
|
/// Second packet is for GA401 + GA402
|
||||||
const USB_PREFIX2: [u8; 7] = [0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02];
|
pub const USB_PREFIX2: [u8; 7] = [0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02];
|
||||||
/// Third packet is for GA402 matrix
|
/// Third packet is for GA402 matrix
|
||||||
const USB_PREFIX3: [u8; 7] = [0x5e, 0xc0, 0x02, 0xe7, 0x04, 0x73, 0x02];
|
pub const USB_PREFIX3: [u8; 7] = [0x5e, 0xc0, 0x02, 0xe7, 0x04, 0x73, 0x02];
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
|
#[derive(Default, Deserialize, PartialEq, Eq, Clone, Copy, Serialize, Debug)]
|
||||||
|
pub struct Animations {
|
||||||
|
pub boot: AnimBooting,
|
||||||
|
pub awake: AnimAwake,
|
||||||
|
pub sleep: AnimSleeping,
|
||||||
|
pub shutdown: AnimShutdown,
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "dbus", derive(Type))]
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
#[derive(Debug, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
#[derive(Debug, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||||
pub struct AnimePowerStates {
|
pub struct DeviceState {
|
||||||
pub brightness: u8,
|
pub display_enabled: bool,
|
||||||
pub enabled: bool,
|
pub display_brightness: Brightness,
|
||||||
pub boot_anim_enabled: bool,
|
pub builtin_anims_enabled: bool,
|
||||||
|
pub builtin_anims: Animations,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "dbus", derive(Type))]
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
@@ -38,13 +50,29 @@ pub struct AnimePowerStates {
|
|||||||
pub enum AnimeType {
|
pub enum AnimeType {
|
||||||
GA401,
|
GA401,
|
||||||
GA402,
|
GA402,
|
||||||
|
GU604,
|
||||||
|
Unknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for AnimeType {
|
||||||
|
type Err = AnimeError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
|
||||||
|
Ok(match s {
|
||||||
|
"ga401" | "GA401" => Self::GA401,
|
||||||
|
"ga402" | "GA402" => Self::GA402,
|
||||||
|
"gu604" | "GU604" => Self::GU604,
|
||||||
|
_ => Self::Unknown,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AnimeType {
|
impl AnimeType {
|
||||||
/// The width of diagonal images
|
/// The width of diagonal images
|
||||||
pub fn width(&self) -> usize {
|
pub fn width(&self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
AnimeType::GA401 | AnimeType::GA402 => 74,
|
AnimeType::GU604 => 70,
|
||||||
|
_ => 74,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +80,8 @@ impl AnimeType {
|
|||||||
pub fn height(&self) -> usize {
|
pub fn height(&self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
AnimeType::GA401 => 36,
|
AnimeType::GA401 => 36,
|
||||||
AnimeType::GA402 => 39,
|
AnimeType::GU604 => 43,
|
||||||
|
_ => 39,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +89,8 @@ impl AnimeType {
|
|||||||
pub fn data_length(&self) -> usize {
|
pub fn data_length(&self) -> usize {
|
||||||
match self {
|
match self {
|
||||||
AnimeType::GA401 => PANE_LEN * 2,
|
AnimeType::GA401 => PANE_LEN * 2,
|
||||||
AnimeType::GA402 => PANE_LEN * 3,
|
AnimeType::GU604 => PANE_LEN * 3,
|
||||||
|
_ => PANE_LEN * 3,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,7 +141,7 @@ impl AnimeDataBuffer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The two packets to be written to USB
|
/// The packets to be written to USB
|
||||||
pub type AnimePacketType = Vec<[u8; 640]>;
|
pub type AnimePacketType = Vec<[u8; 640]>;
|
||||||
|
|
||||||
impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
||||||
@@ -124,7 +154,7 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
|||||||
|
|
||||||
let mut buffers = match anime.anime {
|
let mut buffers = match anime.anime {
|
||||||
AnimeType::GA401 => vec![[0; 640]; 2],
|
AnimeType::GA401 => vec![[0; 640]; 2],
|
||||||
AnimeType::GA402 => vec![[0; 640]; 3],
|
AnimeType::GA402 | AnimeType::GU604 | AnimeType::Unknown => vec![[0; 640]; 3],
|
||||||
};
|
};
|
||||||
|
|
||||||
for (idx, chunk) in anime.data.as_slice().chunks(PANE_LEN).enumerate() {
|
for (idx, chunk) in anime.data.as_slice().chunks(PANE_LEN).enumerate() {
|
||||||
@@ -133,7 +163,10 @@ impl TryFrom<AnimeDataBuffer> for AnimePacketType {
|
|||||||
buffers[0][..7].copy_from_slice(&USB_PREFIX1);
|
buffers[0][..7].copy_from_slice(&USB_PREFIX1);
|
||||||
buffers[1][..7].copy_from_slice(&USB_PREFIX2);
|
buffers[1][..7].copy_from_slice(&USB_PREFIX2);
|
||||||
|
|
||||||
if matches!(anime.anime, AnimeType::GA402) {
|
if matches!(
|
||||||
|
anime.anime,
|
||||||
|
AnimeType::GA402 | AnimeType::GU604 | AnimeType::Unknown
|
||||||
|
) {
|
||||||
buffers[2][..7].copy_from_slice(&USB_PREFIX3);
|
buffers[2][..7].copy_from_slice(&USB_PREFIX3);
|
||||||
}
|
}
|
||||||
Ok(buffers)
|
Ok(buffers)
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
//! This is full of crap code which is basically bruteforced
|
||||||
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@@ -138,7 +140,8 @@ impl AnimeDiagonal {
|
|||||||
pub fn into_data_buffer(&self, anime_type: AnimeType) -> Result<AnimeDataBuffer> {
|
pub fn into_data_buffer(&self, anime_type: AnimeType) -> Result<AnimeDataBuffer> {
|
||||||
match anime_type {
|
match anime_type {
|
||||||
AnimeType::GA401 => self.to_ga401_packets(),
|
AnimeType::GA401 => self.to_ga401_packets(),
|
||||||
AnimeType::GA402 => self.to_ga402_packets(),
|
AnimeType::GU604 => self.to_gu604_packets(),
|
||||||
|
_ => self.to_ga402_packets(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,388 +291,89 @@ impl AnimeDiagonal {
|
|||||||
|
|
||||||
AnimeDataBuffer::from_vec(crate::AnimeType::GA402, buf)
|
AnimeDataBuffer::from_vec(crate::AnimeType::GA402, buf)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
fn to_gu604_packets(&self) -> Result<AnimeDataBuffer> {
|
||||||
mod tests {
|
let mut buf = vec![0u8; AnimeType::GU604.data_length()];
|
||||||
use std::convert::TryFrom;
|
let mut start_index: usize = 0;
|
||||||
use std::path::PathBuf;
|
|
||||||
|
|
||||||
use crate::{AnimeDiagonal, AnimePacketType, AnimeType};
|
fn copy_slice(
|
||||||
|
buf: &mut [u8],
|
||||||
|
anime: &AnimeDiagonal,
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
start_index: &mut usize,
|
||||||
|
len: usize,
|
||||||
|
) {
|
||||||
|
buf[*start_index..*start_index + len].copy_from_slice(&anime.get_row(x, y, len));
|
||||||
|
*start_index += len;
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
let b = &mut buf;
|
||||||
fn ga401_diagonal_packet_check() {
|
let a = &self;
|
||||||
let pkt0_check = [
|
copy_slice(b, a, 0, 4, &mut start_index, 38);
|
||||||
0x5e, 0xc0, 0x2, 0x1, 0x0, 0x73, 0x2, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
copy_slice(b, a, 0, 3, &mut start_index, 39);
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
copy_slice(b, a, 1, 3, &mut start_index, 38);
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 1, 2, &mut start_index, 39);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 2, 2, &mut start_index, 38);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0,
|
copy_slice(b, a, 2, 1, &mut start_index, 39);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 3, 1, &mut start_index, 38);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 3, 0, &mut start_index, 39);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 4, 0, &mut start_index, 39);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0,
|
copy_slice(b, a, 5, 0, &mut start_index, 39);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 6, 0, &mut start_index, 38);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 7, 0, &mut start_index, 38);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 8, 0, &mut start_index, 37);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 9, 0, &mut start_index, 37);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 10, 0, &mut start_index, 36);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 11, 0, &mut start_index, 36);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 12, 0, &mut start_index, 35);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 13, 0, &mut start_index, 35);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 14, 0, &mut start_index, 34);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 15, 0, &mut start_index, 34);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 16, 0, &mut start_index, 33);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 17, 0, &mut start_index, 33);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 18, 0, &mut start_index, 32);
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 19, 0, &mut start_index, 32);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 20, 0, &mut start_index, 31);
|
||||||
0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 21, 0, &mut start_index, 31);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
|
copy_slice(b, a, 22, 0, &mut start_index, 30);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 23, 0, &mut start_index, 30);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 24, 0, &mut start_index, 29);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 25, 0, &mut start_index, 29);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 26, 0, &mut start_index, 28);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
|
copy_slice(b, a, 27, 0, &mut start_index, 28);
|
||||||
0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 28, 0, &mut start_index, 27);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 29, 0, &mut start_index, 27);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 30, 0, &mut start_index, 26);
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 31, 0, &mut start_index, 26);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
|
copy_slice(b, a, 32, 0, &mut start_index, 25);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 33, 0, &mut start_index, 25);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 34, 0, &mut start_index, 24);
|
||||||
0x0,
|
copy_slice(b, a, 35, 0, &mut start_index, 24);
|
||||||
];
|
copy_slice(b, a, 36, 0, &mut start_index, 23);
|
||||||
let pkt1_check = [
|
copy_slice(b, a, 37, 0, &mut start_index, 23);
|
||||||
0x5e, 0xc0, 0x2, 0x74, 0x2, 0x73, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 38, 0, &mut start_index, 22);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 39, 0, &mut start_index, 22);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 40, 0, &mut start_index, 21);
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 41, 0, &mut start_index, 21);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 42, 0, &mut start_index, 20);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 43, 0, &mut start_index, 20);
|
||||||
0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 44, 0, &mut start_index, 19);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 45, 0, &mut start_index, 19);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 46, 0, &mut start_index, 18);
|
||||||
0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 47, 0, &mut start_index, 18);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 48, 0, &mut start_index, 17);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0,
|
copy_slice(b, a, 49, 0, &mut start_index, 17);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 50, 0, &mut start_index, 16);
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 51, 0, &mut start_index, 16);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 52, 0, &mut start_index, 15);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 53, 0, &mut start_index, 15);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0,
|
copy_slice(b, a, 54, 0, &mut start_index, 14);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 55, 0, &mut start_index, 14);
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 56, 0, &mut start_index, 13);
|
||||||
0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 57, 0, &mut start_index, 13);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
copy_slice(b, a, 58, 0, &mut start_index, 12);
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
AnimeDataBuffer::from_vec(crate::AnimeType::GA402, buf)
|
||||||
path.push("test/ga401-diagonal.png");
|
|
||||||
|
|
||||||
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GA401).unwrap();
|
|
||||||
let data = matrix.into_data_buffer(crate::AnimeType::GA401).unwrap();
|
|
||||||
let pkt = AnimePacketType::try_from(data).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(pkt[0], pkt0_check);
|
|
||||||
assert_eq!(pkt[1], pkt1_check);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ga402_diagonal_packet_check() {
|
|
||||||
let pkt0_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0x1, 0x0, 0x73, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0,
|
|
||||||
];
|
|
||||||
let pkt1_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0x74, 0x2, 0x73, 0x2, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
let pkt2_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0xe7, 0x4, 0x73, 0x2, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
|
|
||||||
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
|
|
||||||
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
||||||
path.push("test/ga402-diagonal.png");
|
|
||||||
|
|
||||||
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GA402).unwrap();
|
|
||||||
let data = matrix.into_data_buffer(crate::AnimeType::GA402).unwrap();
|
|
||||||
let pkt = AnimePacketType::try_from(data).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(pkt[0], pkt0_check);
|
|
||||||
assert_eq!(pkt[1], pkt1_check);
|
|
||||||
assert_eq!(pkt[2], pkt2_check);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[ignore = "Needs the packets verified with capture"]
|
|
||||||
fn ga402_diagonal_fullbright_packet_check() {
|
|
||||||
let pkt0_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0x1, 0x0, 0x73, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x67, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
let pkt1_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0x74, 0x2, 0x73, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
let pkt2_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0xe7, 0x4, 0x73, 0x2, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
|
||||||
path.push("test/ga402-diagonal-fullbright.png");
|
|
||||||
|
|
||||||
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GA402).unwrap();
|
|
||||||
let data = matrix.into_data_buffer(crate::AnimeType::GA402).unwrap();
|
|
||||||
let pkt = AnimePacketType::try_from(data).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(pkt[0], pkt0_check);
|
|
||||||
assert_eq!(pkt[1], pkt1_check);
|
|
||||||
assert_eq!(pkt[2], pkt2_check);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,12 +24,14 @@ pub enum AnimeError {
|
|||||||
DataBufferLength,
|
DataBufferLength,
|
||||||
PixelGifWidth(usize),
|
PixelGifWidth(usize),
|
||||||
PixelGifHeight(usize),
|
PixelGifHeight(usize),
|
||||||
|
ParseError(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for AnimeError {
|
impl fmt::Display for AnimeError {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
match self {
|
match self {
|
||||||
|
AnimeError::ParseError(e) => write!(f, "Could not parse {e}"),
|
||||||
AnimeError::NoFrames => write!(f, "No frames in PNG"),
|
AnimeError::NoFrames => write!(f, "No frames in PNG"),
|
||||||
AnimeError::Io(e) => write!(f, "Could not open: {}", e),
|
AnimeError::Io(e) => write!(f, "Could not open: {}", e),
|
||||||
AnimeError::Png(e) => write!(f, "PNG error: {}", e),
|
AnimeError::Png(e) => write!(f, "PNG error: {}", e),
|
||||||
|
|||||||
@@ -110,13 +110,12 @@ impl AnimeGif {
|
|||||||
let file = File::open(file_name)?;
|
let file = File::open(file_name)?;
|
||||||
let mut decoder = decoder.read_info(file)?;
|
let mut decoder = decoder.read_info(file)?;
|
||||||
|
|
||||||
let mut frames = Vec::with_capacity(decoder.buffer_size());
|
let mut frames = Vec::default();
|
||||||
|
|
||||||
while let Some(frame) = decoder.read_next_frame()? {
|
while let Some(frame) = decoder.read_next_frame()? {
|
||||||
let wait = frame.delay * 10;
|
let wait = frame.delay * 10;
|
||||||
if matches!(frame.dispose, gif::DisposalMethod::Background) {
|
// if matches!(frame.dispose, gif::DisposalMethod::Background) {
|
||||||
frames = Vec::new();
|
// frames = Vec::new();
|
||||||
}
|
// }
|
||||||
for (y, row) in frame.buffer.chunks(frame.width as usize * 4).enumerate() {
|
for (y, row) in frame.buffer.chunks(frame.width as usize * 4).enumerate() {
|
||||||
for (x, px) in row.chunks(4).enumerate() {
|
for (x, px) in row.chunks(4).enumerate() {
|
||||||
if px[3] != 255 {
|
if px[3] != 255 {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ use crate::AnimeType;
|
|||||||
|
|
||||||
/// A single greyscale + alpha pixel in the image
|
/// A single greyscale + alpha pixel in the image
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub(crate) struct Pixel {
|
pub struct Pixel {
|
||||||
pub color: u32,
|
pub color: u32,
|
||||||
pub alpha: f32,
|
pub alpha: f32,
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,8 @@ pub struct AnimeImage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AnimeImage {
|
impl AnimeImage {
|
||||||
pub(crate) fn new(
|
/// Exposed only for tests. Please use `from_png()` instead.
|
||||||
|
pub fn new(
|
||||||
scale: Vec2,
|
scale: Vec2,
|
||||||
angle: f32,
|
angle: f32,
|
||||||
translation: Vec2,
|
translation: Vec2,
|
||||||
@@ -114,25 +115,29 @@ impl AnimeImage {
|
|||||||
///
|
///
|
||||||
/// For GA401 this is `26.8 / (33 + 0.5) = 0.8`
|
/// For GA401 this is `26.8 / (33 + 0.5) = 0.8`
|
||||||
/// For GA402 this is `27.4 / (35 + 0.5) = 0.77`
|
/// For GA402 this is `27.4 / (35 + 0.5) = 0.77`
|
||||||
|
/// For GA402 this is `30.9 / (39 + 0.5) = 0.77`
|
||||||
fn scale_x(anime_type: AnimeType) -> f32 {
|
fn scale_x(anime_type: AnimeType) -> f32 {
|
||||||
match anime_type {
|
match anime_type {
|
||||||
AnimeType::GA401 => 0.8,
|
AnimeType::GA401 => 0.8,
|
||||||
AnimeType::GA402 => 0.77,
|
AnimeType::GU604 => 0.78,
|
||||||
|
_ => 0.77,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Scale ratio in CM
|
/// Scale ratio in CM
|
||||||
///
|
///
|
||||||
/// This is worked out by measuring the physical height of the display from
|
/// This is worked out by measuring the physical height of the display from
|
||||||
/// pixel center to pixel center, then dividing by `<vertical LED
|
/// pixel center to pixel center, then dividing by 10 divided `<vertical
|
||||||
/// count> + 1.0`, where the LED count is first/longest row.
|
/// LED count> + 1.0`, where the LED count is first/longest row.
|
||||||
///
|
///
|
||||||
/// For GA401 this is `16.5 / (54.0 + 1.0) = 0.3`
|
/// For GA401 this is `16.5 / (54.0 + 1.0) = 0.3`
|
||||||
/// For GA402 this is `17.3 / (61.0) = 0.283`
|
/// For GA402 this is `17.3 / (61.0) = 0.283`
|
||||||
|
/// For GU604 this is `17.7 / (62.0 + 1) = 0.28`
|
||||||
fn scale_y(anime_type: AnimeType) -> f32 {
|
fn scale_y(anime_type: AnimeType) -> f32 {
|
||||||
match anime_type {
|
match anime_type {
|
||||||
AnimeType::GA401 => 0.3,
|
AnimeType::GA401 => 0.3,
|
||||||
AnimeType::GA402 => 0.283,
|
AnimeType::GU604 => 0.28,
|
||||||
|
_ => 0.283,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +170,15 @@ impl AnimeImage {
|
|||||||
}
|
}
|
||||||
(y + 1) / 2 - 3
|
(y + 1) / 2 - 3
|
||||||
}
|
}
|
||||||
AnimeType::GA402 => {
|
AnimeType::GU604 => {
|
||||||
|
// first 9 rows start at zero
|
||||||
|
if y <= 9 {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// and then their offset grows by one every two rows
|
||||||
|
(y - 9) / 2
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
// first 11 rows start at zero
|
// first 11 rows start at zero
|
||||||
if y <= 11 {
|
if y <= 11 {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -191,6 +204,7 @@ impl AnimeImage {
|
|||||||
/// \ |
|
/// \ |
|
||||||
/// ------+
|
/// ------+
|
||||||
/// ```
|
/// ```
|
||||||
|
// TODO: make this return only width, and move calcs to pitch
|
||||||
fn width(anime_type: AnimeType, y: u32) -> u32 {
|
fn width(anime_type: AnimeType, y: u32) -> u32 {
|
||||||
match anime_type {
|
match anime_type {
|
||||||
AnimeType::GA401 => {
|
AnimeType::GA401 => {
|
||||||
@@ -200,7 +214,13 @@ impl AnimeImage {
|
|||||||
}
|
}
|
||||||
36 - (y + 1) / 2
|
36 - (y + 1) / 2
|
||||||
}
|
}
|
||||||
AnimeType::GA402 => {
|
AnimeType::GU604 => {
|
||||||
|
if y <= 9 {
|
||||||
|
return 38 + y % 2;
|
||||||
|
}
|
||||||
|
38 - Self::first_x(anime_type, y) + y % 2
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
if y <= 11 {
|
if y <= 11 {
|
||||||
return 34;
|
return 34;
|
||||||
}
|
}
|
||||||
@@ -214,7 +234,9 @@ impl AnimeImage {
|
|||||||
match anime_type {
|
match anime_type {
|
||||||
// 33.0 = Longest row LED count (physical) plus half-pixel offset
|
// 33.0 = Longest row LED count (physical) plus half-pixel offset
|
||||||
AnimeType::GA401 => (33.0 + 0.5) * Self::scale_x(anime_type),
|
AnimeType::GA401 => (33.0 + 0.5) * Self::scale_x(anime_type),
|
||||||
AnimeType::GA402 => (35.0 + 0.5) * Self::scale_x(anime_type),
|
|
||||||
|
AnimeType::GU604 => (38.0 + 0.5) * Self::scale_x(anime_type),
|
||||||
|
_ => (35.0 + 0.5) * Self::scale_x(anime_type),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,7 +244,8 @@ impl AnimeImage {
|
|||||||
fn height(anime_type: AnimeType) -> u32 {
|
fn height(anime_type: AnimeType) -> u32 {
|
||||||
match anime_type {
|
match anime_type {
|
||||||
AnimeType::GA401 => 55,
|
AnimeType::GA401 => 55,
|
||||||
AnimeType::GA402 => 61,
|
AnimeType::GU604 => 62,
|
||||||
|
_ => 61,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,8 +254,9 @@ impl AnimeImage {
|
|||||||
match anime_type {
|
match anime_type {
|
||||||
// 54.0 = End column LED count (physical) plus one dead pixel
|
// 54.0 = End column LED count (physical) plus one dead pixel
|
||||||
AnimeType::GA401 => (54.0 + 1.0) * Self::scale_y(anime_type),
|
AnimeType::GA401 => (54.0 + 1.0) * Self::scale_y(anime_type),
|
||||||
|
AnimeType::GU604 => 62.0 * Self::scale_y(anime_type),
|
||||||
// GA402 may not have dead pixels and require only the physical LED count
|
// GA402 may not have dead pixels and require only the physical LED count
|
||||||
AnimeType::GA402 => 61.0 * Self::scale_y(anime_type),
|
_ => 61.0 * Self::scale_y(anime_type),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,8 +268,9 @@ impl AnimeImage {
|
|||||||
1 | 3 => 35, // Some rows are padded
|
1 | 3 => 35, // Some rows are padded
|
||||||
_ => 36 - y / 2,
|
_ => 36 - y / 2,
|
||||||
},
|
},
|
||||||
|
AnimeType::GU604 => AnimeImage::width(anime_type, y),
|
||||||
// GA402 does not have padding, equivalent to width
|
// GA402 does not have padding, equivalent to width
|
||||||
AnimeType::GA402 => AnimeImage::width(anime_type, y),
|
_ => AnimeImage::width(anime_type, y),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -319,7 +344,7 @@ impl AnimeImage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A helper for determining physical position alignment
|
/// A helper for determining physical position alignment
|
||||||
fn _edge_outline(&mut self) {
|
pub fn edge_outline(&mut self) {
|
||||||
// Janky shit here just to try help align images
|
// Janky shit here just to try help align images
|
||||||
let mut last_x = 0.0;
|
let mut last_x = 0.0;
|
||||||
let mut last_y = 0.0;
|
let mut last_y = 0.0;
|
||||||
@@ -609,149 +634,6 @@ mod tests {
|
|||||||
assert_eq!(AnimeImage::pitch(a, 14), 29);
|
assert_eq!(AnimeImage::pitch(a, 14), 29);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ga402_image_edge_packet_check() {
|
|
||||||
let pkt0_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0x1, 0x0, 0x73, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0,
|
|
||||||
];
|
|
||||||
let pkt1_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0x74, 0x2, 0x73, 0x2, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
let pkt2_check = [
|
|
||||||
0x5e, 0xc0, 0x2, 0xe7, 0x4, 0x73, 0x2, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
|
|
||||||
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
|
|
||||||
0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
|
||||||
];
|
|
||||||
|
|
||||||
let mut matrix = AnimeImage::new(
|
|
||||||
Vec2::new(1.0, 1.0),
|
|
||||||
0.0,
|
|
||||||
Vec2::default(),
|
|
||||||
0.0,
|
|
||||||
vec![Pixel::default(); 1000],
|
|
||||||
100,
|
|
||||||
AnimeType::GA402,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
matrix._edge_outline();
|
|
||||||
let data = AnimeDataBuffer::try_from(&matrix).unwrap();
|
|
||||||
let pkt = AnimePacketType::try_from(data).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(pkt[0], pkt0_check);
|
|
||||||
assert_eq!(pkt[1], pkt1_check);
|
|
||||||
assert_eq!(pkt[2], pkt2_check);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[ignore = "Just to inspect image packet"]
|
#[ignore = "Just to inspect image packet"]
|
||||||
fn ga402_image_packet_check() {
|
fn ga402_image_packet_check() {
|
||||||
|
|||||||
@@ -8,17 +8,136 @@
|
|||||||
//!
|
//!
|
||||||
//! Step 1 need to applied only on fresh system boot.
|
//! Step 1 need to applied only on fresh system boot.
|
||||||
|
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
#[cfg(feature = "dbus")]
|
||||||
|
use zbus::zvariant::Type;
|
||||||
|
|
||||||
use crate::error::AnimeError;
|
use crate::error::AnimeError;
|
||||||
use crate::AnimeType;
|
use crate::AnimeType;
|
||||||
|
|
||||||
const INIT_STR: [u8; 15] = [
|
|
||||||
0x5e, b'A', b'S', b'U', b'S', b' ', b'T', b'e', b'c', b'h', b'.', b'I', b'n', b'c', b'.',
|
|
||||||
];
|
|
||||||
const PACKET_SIZE: usize = 640;
|
const PACKET_SIZE: usize = 640;
|
||||||
const DEV_PAGE: u8 = 0x5e;
|
const DEV_PAGE: u8 = 0x5e;
|
||||||
pub const VENDOR_ID: u16 = 0x0b05;
|
pub const VENDOR_ID: u16 = 0x0b05;
|
||||||
pub const PROD_ID: u16 = 0x193b;
|
pub const PROD_ID: u16 = 0x193b;
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
|
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||||
|
/// Base LED brightness of the display
|
||||||
|
pub enum Brightness {
|
||||||
|
Off,
|
||||||
|
Low,
|
||||||
|
#[default]
|
||||||
|
Med,
|
||||||
|
High,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Brightness {
|
||||||
|
type Err = AnimeError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
Ok(match s {
|
||||||
|
"Off" | "off" => Brightness::Off,
|
||||||
|
"Low" | "low" => Brightness::Low,
|
||||||
|
"Med" | "med" => Brightness::Med,
|
||||||
|
"High" | "high" => Brightness::High,
|
||||||
|
_ => Brightness::Med,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u8> for Brightness {
|
||||||
|
fn from(v: u8) -> Brightness {
|
||||||
|
match v {
|
||||||
|
0 => Brightness::Off,
|
||||||
|
2 => Brightness::Low,
|
||||||
|
3 => Brightness::High,
|
||||||
|
_ => Brightness::Med,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
|
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||||
|
pub enum AnimBooting {
|
||||||
|
#[default]
|
||||||
|
GlitchConstruction,
|
||||||
|
StaticEmergence,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for AnimBooting {
|
||||||
|
type Err = AnimeError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"GlitchConstruction" => Ok(Self::GlitchConstruction),
|
||||||
|
"StaticEmergence" => Ok(Self::StaticEmergence),
|
||||||
|
_ => Err(AnimeError::ParseError(s.to_owned())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
|
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||||
|
pub enum AnimAwake {
|
||||||
|
#[default]
|
||||||
|
BinaryBannerScroll,
|
||||||
|
RogLogoGlitch,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for AnimAwake {
|
||||||
|
type Err = AnimeError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"BinaryBannerScroll" => Ok(Self::BinaryBannerScroll),
|
||||||
|
"RogLogoGlitch" => Ok(Self::RogLogoGlitch),
|
||||||
|
_ => Err(AnimeError::ParseError(s.to_owned())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
|
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||||
|
pub enum AnimSleeping {
|
||||||
|
#[default]
|
||||||
|
BannerSwipe,
|
||||||
|
Starfield,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for AnimSleeping {
|
||||||
|
type Err = AnimeError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"BannerSwipe" => Ok(Self::BannerSwipe),
|
||||||
|
"Starfield" => Ok(Self::Starfield),
|
||||||
|
_ => Err(AnimeError::ParseError(s.to_owned())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
|
#[derive(Debug, Default, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
|
||||||
|
pub enum AnimShutdown {
|
||||||
|
#[default]
|
||||||
|
GlitchOut,
|
||||||
|
SeeYa,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for AnimShutdown {
|
||||||
|
type Err = AnimeError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"GlitchOut" => Ok(Self::GlitchOut),
|
||||||
|
"SeeYa" => Ok(Self::SeeYa),
|
||||||
|
_ => Err(AnimeError::ParseError(s.to_owned())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// `get_anime_type` is very broad, matching on part of the laptop board name
|
/// `get_anime_type` is very broad, matching on part of the laptop board name
|
||||||
/// only. For this reason `find_node()` must be used also to verify if the USB
|
/// only. For this reason `find_node()` must be used also to verify if the USB
|
||||||
/// device is available.
|
/// device is available.
|
||||||
@@ -33,8 +152,11 @@ pub fn get_anime_type() -> Result<AnimeType, AnimeError> {
|
|||||||
return Ok(AnimeType::GA401);
|
return Ok(AnimeType::GA401);
|
||||||
} else if board_name.contains("GA402R") {
|
} else if board_name.contains("GA402R") {
|
||||||
return Ok(AnimeType::GA402);
|
return Ok(AnimeType::GA402);
|
||||||
|
} else if board_name.contains("GU604V") {
|
||||||
|
return Ok(AnimeType::GU604);
|
||||||
}
|
}
|
||||||
Err(AnimeError::UnsupportedDevice)
|
log::warn!("AniMe Matrix device found but not yet supported, will default to a GA402 layout");
|
||||||
|
Ok(AnimeType::Unknown)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the two device initialization packets. These are required for device
|
/// Get the two device initialization packets. These are required for device
|
||||||
@@ -44,12 +166,14 @@ pub const fn pkts_for_init() -> [[u8; PACKET_SIZE]; 2] {
|
|||||||
let mut packets = [[0; PACKET_SIZE]; 2];
|
let mut packets = [[0; PACKET_SIZE]; 2];
|
||||||
packets[0][0] = DEV_PAGE; // This is the USB page we're using throughout
|
packets[0][0] = DEV_PAGE; // This is the USB page we're using throughout
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
while count < INIT_STR.len() {
|
// TODO: memcpy or slice copy
|
||||||
packets[0][count] = INIT_STR[count];
|
let bytes = "ASUS Tech.Inc.".as_bytes();
|
||||||
|
while count < bytes.len() {
|
||||||
|
packets[0][count + 1] = bytes[count];
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
packets[1][0] = DEV_PAGE; // write it to be sure?
|
packets[1][0] = DEV_PAGE;
|
||||||
packets[1][1] = 0xc2;
|
packets[1][1] = 0xc2;
|
||||||
packets
|
packets
|
||||||
}
|
}
|
||||||
@@ -57,7 +181,7 @@ pub const fn pkts_for_init() -> [[u8; PACKET_SIZE]; 2] {
|
|||||||
/// Should be written to the device after writing the two main data packets that
|
/// Should be written to the device after writing the two main data packets that
|
||||||
/// make up the display data packet
|
/// make up the display data packet
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn pkt_for_flush() -> [u8; PACKET_SIZE] {
|
pub const fn pkt_flush() -> [u8; PACKET_SIZE] {
|
||||||
let mut pkt = [0; PACKET_SIZE];
|
let mut pkt = [0; PACKET_SIZE];
|
||||||
pkt[0] = DEV_PAGE;
|
pkt[0] = DEV_PAGE;
|
||||||
pkt[1] = 0xc0;
|
pkt[1] = 0xc0;
|
||||||
@@ -65,10 +189,21 @@ pub const fn pkt_for_flush() -> [u8; PACKET_SIZE] {
|
|||||||
pkt
|
pkt
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the packet required for setting the device to on, on boot. Requires
|
/// Packet for setting the brightness (0-3). Requires
|
||||||
/// `pkt_for_apply()` to be written after.
|
/// `pkt_for_apply()` to be written after.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn pkt_for_set_boot(status: bool) -> [u8; PACKET_SIZE] {
|
pub const fn pkt_set_brightness(brightness: Brightness) -> [u8; PACKET_SIZE] {
|
||||||
|
let mut pkt = [0; PACKET_SIZE];
|
||||||
|
pkt[0] = DEV_PAGE;
|
||||||
|
pkt[1] = 0xc0;
|
||||||
|
pkt[2] = 0x04;
|
||||||
|
pkt[3] = brightness as u8;
|
||||||
|
pkt
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Enable the display?
|
||||||
|
#[inline]
|
||||||
|
pub const fn pkt_set_enable_display(status: bool) -> [u8; PACKET_SIZE] {
|
||||||
let mut pkt = [0; PACKET_SIZE];
|
let mut pkt = [0; PACKET_SIZE];
|
||||||
pkt[0] = DEV_PAGE;
|
pkt[0] = DEV_PAGE;
|
||||||
pkt[1] = 0xc3;
|
pkt[1] = 0xc3;
|
||||||
@@ -77,25 +212,31 @@ pub const fn pkt_for_set_boot(status: bool) -> [u8; PACKET_SIZE] {
|
|||||||
pkt
|
pkt
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the packet required for setting the device to on. Requires
|
/// Enable builtin animations?
|
||||||
/// `pkt_for_apply()` to be written after.
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn pkt_for_set_on(on: bool) -> [u8; PACKET_SIZE] {
|
pub const fn pkt_set_enable_powersave_anim(status: bool) -> [u8; PACKET_SIZE] {
|
||||||
let mut pkt = [0; PACKET_SIZE];
|
|
||||||
pkt[0] = DEV_PAGE;
|
|
||||||
pkt[1] = 0xc0;
|
|
||||||
pkt[2] = 0x04;
|
|
||||||
pkt[3] = if on { 0x03 } else { 0x00 };
|
|
||||||
pkt
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Packet required to apply a device setting
|
|
||||||
#[inline]
|
|
||||||
pub const fn pkt_for_apply() -> [u8; PACKET_SIZE] {
|
|
||||||
let mut pkt = [0; PACKET_SIZE];
|
let mut pkt = [0; PACKET_SIZE];
|
||||||
pkt[0] = DEV_PAGE;
|
pkt[0] = DEV_PAGE;
|
||||||
pkt[1] = 0xc4;
|
pkt[1] = 0xc4;
|
||||||
pkt[2] = 0x01;
|
pkt[2] = 0x01;
|
||||||
pkt[3] = 0x80;
|
pkt[3] = if status { 0x00 } else { 0x80 };
|
||||||
|
pkt
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set which animations are shown for each stage
|
||||||
|
#[inline]
|
||||||
|
pub const fn pkt_set_builtin_animations(
|
||||||
|
boot: AnimBooting,
|
||||||
|
awake: AnimAwake,
|
||||||
|
sleep: AnimSleeping,
|
||||||
|
shutdown: AnimShutdown,
|
||||||
|
) -> [u8; PACKET_SIZE] {
|
||||||
|
let mut pkt = [0; PACKET_SIZE];
|
||||||
|
pkt[0] = DEV_PAGE;
|
||||||
|
pkt[1] = 0xc5;
|
||||||
|
pkt[2] = (awake as u8)
|
||||||
|
| ((sleep as u8) << 0x01)
|
||||||
|
| ((shutdown as u8) << 0x02)
|
||||||
|
| ((boot as u8) << 0x03);
|
||||||
pkt
|
pkt
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 981 B After Width: | Height: | Size: 981 B |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 189 B |
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 761 B |
@@ -0,0 +1,239 @@
|
|||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use rog_anime::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ga401_image_edge_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut matrix = AnimeImage::new(
|
||||||
|
Vec2::new(1.0, 1.0),
|
||||||
|
0.0,
|
||||||
|
Vec2::default(),
|
||||||
|
0.0,
|
||||||
|
vec![Pixel::default(); 1000],
|
||||||
|
100,
|
||||||
|
AnimeType::GA401,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
matrix.edge_outline();
|
||||||
|
let data = AnimeDataBuffer::try_from(&matrix).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
// print!("left: '[");
|
||||||
|
// for b in pkt[1] {
|
||||||
|
// print!("{b:#02x},");
|
||||||
|
// }
|
||||||
|
// print!("]'");
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ga401_diagonal_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x1, 0x00, 0x73, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
path.push("tests/data/ga401-diagonal.png");
|
||||||
|
|
||||||
|
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GA401).unwrap();
|
||||||
|
let data = matrix.into_data_buffer(AnimeType::GA401).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,491 @@
|
|||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use rog_anime::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ga402_image_edge_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x2, 0x1, 0x00, 0x73, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x2, 0x74, 0x2, 0x73, 0x2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt2_check = [
|
||||||
|
0x5e, 0xc0, 0x2, 0xe7, 0x4, 0x73, 0x2, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut matrix = AnimeImage::new(
|
||||||
|
Vec2::new(1.0, 1.0),
|
||||||
|
0.0,
|
||||||
|
Vec2::default(),
|
||||||
|
0.0,
|
||||||
|
vec![Pixel::default(); 1000],
|
||||||
|
100,
|
||||||
|
AnimeType::GA402,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
matrix.edge_outline();
|
||||||
|
let data = AnimeDataBuffer::try_from(&matrix).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
assert_eq!(pkt[2], pkt2_check);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ga402_diagonal_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x1, 0x00, 0x73, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt2_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0xe7, 0x04, 0x73, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
path.push("tests/data/ga402-diagonal.png");
|
||||||
|
|
||||||
|
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GA402).unwrap();
|
||||||
|
let data = matrix.into_data_buffer(AnimeType::GA402).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
assert_eq!(pkt[2], pkt2_check);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore = "Needs the packets verified with capture"]
|
||||||
|
fn ga402_diagonal_fullbright_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x1, 0x00, 0x73, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x67, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt2_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0xe7, 0x04, 0x73, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
path.push("tests/data/ga402-diagonal-fullbright.png");
|
||||||
|
|
||||||
|
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GA402).unwrap();
|
||||||
|
let data = matrix.into_data_buffer(AnimeType::GA402).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
assert_eq!(pkt[2], pkt2_check);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,331 @@
|
|||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use rog_anime::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gu604_image_edge_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt2_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0xe7, 0x04, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut matrix = AnimeImage::new(
|
||||||
|
Vec2::new(1.0, 1.0),
|
||||||
|
0.0,
|
||||||
|
Vec2::default(),
|
||||||
|
0.0,
|
||||||
|
vec![Pixel::default(); 1000],
|
||||||
|
100,
|
||||||
|
AnimeType::GU604,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
matrix.edge_outline();
|
||||||
|
let data = AnimeDataBuffer::try_from(&matrix).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
assert_eq!(pkt[2], pkt2_check);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gu604_diagonal_edge_packet_check() {
|
||||||
|
let pkt0_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt1_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
let pkt2_check = [
|
||||||
|
0x5e, 0xc0, 0x02, 0xe7, 0x04, 0x73, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
path.push("tests/data/gu604-diagonal.png");
|
||||||
|
|
||||||
|
let matrix = AnimeDiagonal::from_png(&path, None, 255.0, AnimeType::GU604).unwrap();
|
||||||
|
let data = matrix.into_data_buffer(AnimeType::GU604).unwrap();
|
||||||
|
let pkt = AnimePacketType::try_from(data).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(pkt[0], pkt0_check);
|
||||||
|
assert_eq!(pkt[1], pkt1_check);
|
||||||
|
assert_eq!(pkt[2], pkt2_check);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,14 +28,21 @@
|
|||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
board_name: "FX506HC",
|
board_name: "FX506H",
|
||||||
layout_name: "fa506i",
|
layout_name: "fa506i",
|
||||||
basic_modes: [Static, Breathe, Strobe, Pulse],
|
basic_modes: [Static, Breathe, Strobe, Pulse],
|
||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
board_name: "FX506LH",
|
board_name: "FX506L",
|
||||||
|
layout_name: "fa506i",
|
||||||
|
basic_modes: [Static, Breathe, Strobe, Pulse],
|
||||||
|
basic_zones: [],
|
||||||
|
advanced_type: None,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
board_name: "FX507Z",
|
||||||
layout_name: "fa506i",
|
layout_name: "fa506i",
|
||||||
basic_modes: [Static, Breathe, Strobe, Pulse],
|
basic_modes: [Static, Breathe, Strobe, Pulse],
|
||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
@@ -55,13 +62,6 @@
|
|||||||
basic_zones: [Key1, Key2, Key3, Key4],
|
basic_zones: [Key1, Key2, Key3, Key4],
|
||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
(
|
|
||||||
board_name: "G512LI",
|
|
||||||
layout_name: "gl503",
|
|
||||||
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
|
||||||
basic_zones: [],
|
|
||||||
advanced_type: None,
|
|
||||||
),
|
|
||||||
(
|
(
|
||||||
board_name: "G512LV",
|
board_name: "G512LV",
|
||||||
layout_name: "ga401q",
|
layout_name: "ga401q",
|
||||||
@@ -70,25 +70,11 @@
|
|||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
board_name: "G513IC",
|
board_name: "G513I",
|
||||||
layout_name: "g513i",
|
|
||||||
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
|
||||||
basic_zones: [],
|
|
||||||
advanced_type: Zoned([ZonedKbLeft, ZonedKbLeftMid, ZonedKbRightMid, ZonedKbRight, LightbarRight, LightbarRightCorner, LightbarRightBottom, LightbarLeftBottom, LightbarLeftCorner, LightbarLeft]),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
board_name: "G513IH",
|
|
||||||
layout_name: "g513i",
|
layout_name: "g513i",
|
||||||
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
||||||
basic_zones: [Key1, Key2, Key3, Key4],
|
basic_zones: [Key1, Key2, Key3, Key4],
|
||||||
advanced_type: None,
|
advanced_type: Zoned([ZonedKbLeft, ZonedKbLeftMid, ZonedKbRightMid, ZonedKbRight, LightbarRight, LightbarRightCorner, LightbarRightBottom, LightbarLeftBottom, LightbarLeftCorner, LightbarLeft]),
|
||||||
),
|
|
||||||
(
|
|
||||||
board_name: "G513IM",
|
|
||||||
layout_name: "g513i-per-key",
|
|
||||||
basic_modes: [Flash, Static, Breathe, Strobe, Rainbow],
|
|
||||||
basic_zones: [],
|
|
||||||
advanced_type: PerKey,
|
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
board_name: "G513QE",
|
board_name: "G513QE",
|
||||||
@@ -113,10 +99,10 @@
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
board_name: "G513QY",
|
board_name: "G513QY",
|
||||||
layout_name: "g513i",
|
layout_name: "g513i-per-key",
|
||||||
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
||||||
basic_zones: [Key1, Key2, Key3, Key4],
|
basic_zones: [Key1, Key2, Key3, Key4],
|
||||||
advanced_type: None,
|
advanced_type: PerKey,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
board_name: "G513RC",
|
board_name: "G513RC",
|
||||||
@@ -202,6 +188,13 @@
|
|||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: PerKey,
|
advanced_type: PerKey,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
board_name: "G634J",
|
||||||
|
layout_name: "g634j-per-key",
|
||||||
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
|
||||||
|
basic_zones: [],
|
||||||
|
advanced_type: PerKey,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
board_name: "G712LI",
|
board_name: "G712LI",
|
||||||
layout_name: "gl503",
|
layout_name: "gl503",
|
||||||
@@ -300,6 +293,13 @@
|
|||||||
basic_zones: [Key1, Key2, Key3, Key4],
|
basic_zones: [Key1, Key2, Key3, Key4],
|
||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
board_name: "G733C",
|
||||||
|
layout_name: "g513i-per-key",
|
||||||
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Star, Rain, Highlight, Laser, Ripple, Pulse, Comet, Flash],
|
||||||
|
basic_zones: [Logo, BarLeft, BarRight],
|
||||||
|
advanced_type: PerKey,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
board_name: "G733Q",
|
board_name: "G733Q",
|
||||||
layout_name: "gx502",
|
layout_name: "gx502",
|
||||||
@@ -349,6 +349,20 @@
|
|||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
board_name: "GL503",
|
||||||
|
layout_name: "gl503",
|
||||||
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
||||||
|
basic_zones: [Key1, Key2, Key3, Key4],
|
||||||
|
advanced_type: None,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
board_name: "GL503V",
|
||||||
|
layout_name: "gl503",
|
||||||
|
basic_modes: [Static, Breathe, Strobe, Rainbow, Pulse],
|
||||||
|
basic_zones: [Key1, Key2, Key3, Key4],
|
||||||
|
advanced_type: None,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
board_name: "GL504G",
|
board_name: "GL504G",
|
||||||
layout_name: "gl503",
|
layout_name: "gl503",
|
||||||
@@ -461,6 +475,13 @@
|
|||||||
basic_zones: [],
|
basic_zones: [],
|
||||||
advanced_type: None,
|
advanced_type: None,
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
board_name: "GV601VI",
|
||||||
|
layout_name: "ga401q",
|
||||||
|
basic_modes: [Static, Breathe, Pulse, Strobe],
|
||||||
|
basic_zones: [],
|
||||||
|
advanced_type: None,
|
||||||
|
),
|
||||||
(
|
(
|
||||||
board_name: "GV604V",
|
board_name: "GV604V",
|
||||||
layout_name: "ga401q",
|
layout_name: "ga401q",
|
||||||
|
|||||||
@@ -0,0 +1,366 @@
|
|||||||
|
(
|
||||||
|
locale: "US",
|
||||||
|
key_shapes: {
|
||||||
|
"regular": Led(
|
||||||
|
width: 1.0,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"regular_spacing": Blank(
|
||||||
|
width: 1.2,
|
||||||
|
height: 0.0,
|
||||||
|
),
|
||||||
|
"rog_row": Led(
|
||||||
|
width: 1.0,
|
||||||
|
height: 0.7,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.6,
|
||||||
|
),
|
||||||
|
"rog_row_blocking": Blank(
|
||||||
|
width: 1.2,
|
||||||
|
height: 0.0,
|
||||||
|
),
|
||||||
|
"func_space": Blank(
|
||||||
|
width: 0.6,
|
||||||
|
height: 0.0,
|
||||||
|
),
|
||||||
|
"backspace": Led(
|
||||||
|
width: 2.2,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"tab": Led(
|
||||||
|
width: 1.6,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"tab": Led(
|
||||||
|
width: 1.6,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"backslash": Led(
|
||||||
|
width: 1.6,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"capsplonk": Led(
|
||||||
|
width: 2.0,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"return": Led(
|
||||||
|
width: 2.4,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"lshift": Led(
|
||||||
|
width: 2.6,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"rshift": Led(
|
||||||
|
width: 3.0,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"lctrl": Led(
|
||||||
|
width: 1.4,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"spacebar": Led(
|
||||||
|
width: 5.8,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"rctrl": Led(
|
||||||
|
width: 1.2,
|
||||||
|
height: 1.0,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"up_arrow": Led(
|
||||||
|
width: 0.8,
|
||||||
|
height: 0.8,
|
||||||
|
pad_left: 1.1,
|
||||||
|
pad_right: 1.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"arrows_spacer": Blank(
|
||||||
|
width: 15.0,
|
||||||
|
height: 0.0,
|
||||||
|
),
|
||||||
|
"arrows": Led(
|
||||||
|
width: 0.8,
|
||||||
|
height: 0.8,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: -0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"row_end_spacing": Blank(
|
||||||
|
width: 0.4,
|
||||||
|
height: 0.0,
|
||||||
|
),
|
||||||
|
"lightbar_left": Led(
|
||||||
|
width: 0.4,
|
||||||
|
height: 3.0,
|
||||||
|
pad_left: -1.0,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: -2.7,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"lightbar_corner_left": Led(
|
||||||
|
width: 0.4,
|
||||||
|
height: 0.4,
|
||||||
|
pad_left: -0.5,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.5,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"lightbar_bottom": Led(
|
||||||
|
width: 10.1,
|
||||||
|
height: 0.4,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.5,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"lightbar_corner_right": Led(
|
||||||
|
width: 0.4,
|
||||||
|
height: 0.4,
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.5,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
"lightbar_right": Led(
|
||||||
|
width: 0.4,
|
||||||
|
height: 3.0,
|
||||||
|
pad_left: -0.5,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: -2.7,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
key_rows: [
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(Blocking, "rog_row_blocking"),
|
||||||
|
(Blocking, "rog_row_blocking"),
|
||||||
|
(VolDown, "rog_row"),
|
||||||
|
(VolUp, "rog_row"),
|
||||||
|
(MicMute, "rog_row"),
|
||||||
|
(RogFan, "rog_row"),
|
||||||
|
(RogApp, "rog_row"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(Esc, "regular"),
|
||||||
|
(Spacing, "regular_spacing"),
|
||||||
|
(F1, "regular"),
|
||||||
|
(F2, "regular"),
|
||||||
|
(F3, "regular"),
|
||||||
|
(F4, "regular"),
|
||||||
|
(Spacing, "func_space"),
|
||||||
|
(F5, "regular"),
|
||||||
|
(F6, "regular"),
|
||||||
|
(F7, "regular"),
|
||||||
|
(F8, "regular"),
|
||||||
|
(Spacing, "func_space"),
|
||||||
|
(F9, "regular"),
|
||||||
|
(F10, "regular"),
|
||||||
|
(F11, "regular"),
|
||||||
|
(F12, "regular"),
|
||||||
|
(Spacing, "row_end_spacing"),
|
||||||
|
(Del, "regular"), // Should be super/insert
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(Tilde, "regular"),
|
||||||
|
(N1, "regular"),
|
||||||
|
(N2, "regular"),
|
||||||
|
(N3, "regular"),
|
||||||
|
(N4, "regular"),
|
||||||
|
(N5, "regular"),
|
||||||
|
(N6, "regular"),
|
||||||
|
(N7, "regular"),
|
||||||
|
(N8, "regular"),
|
||||||
|
(N9, "regular"),
|
||||||
|
(N0, "regular"),
|
||||||
|
(Hyphen, "regular"),
|
||||||
|
(Equals, "regular"),
|
||||||
|
(Backspace, "backspace"),
|
||||||
|
(Spacing, "row_end_spacing"),
|
||||||
|
(MediaPlay, "regular"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(Tab, "tab"),
|
||||||
|
(Q, "regular"),
|
||||||
|
(W, "regular"),
|
||||||
|
(E, "regular"),
|
||||||
|
(R, "regular"),
|
||||||
|
(T, "regular"),
|
||||||
|
(Y, "regular"),
|
||||||
|
(U, "regular"),
|
||||||
|
(I, "regular"),
|
||||||
|
(O, "regular"),
|
||||||
|
(P, "regular"),
|
||||||
|
(LBracket, "regular"),
|
||||||
|
(RBracket, "regular"),
|
||||||
|
(BackSlash, "backslash"),
|
||||||
|
(Spacing, "row_end_spacing"),
|
||||||
|
(MediaStop, "regular"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(Caps, "capsplonk"),
|
||||||
|
(A, "regular"),
|
||||||
|
(S, "regular"),
|
||||||
|
(D, "regular"),
|
||||||
|
(F, "regular"),
|
||||||
|
(G, "regular"),
|
||||||
|
(H, "regular"),
|
||||||
|
(J, "regular"),
|
||||||
|
(K, "regular"),
|
||||||
|
(L, "regular"),
|
||||||
|
(SemiColon, "regular"),
|
||||||
|
(Quote, "regular"),
|
||||||
|
(Return, "return"),
|
||||||
|
(Spacing, "row_end_spacing"),
|
||||||
|
(MediaNext, "regular"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(LShift, "lshift"),
|
||||||
|
(Z, "regular"),
|
||||||
|
(X, "regular"),
|
||||||
|
(C, "regular"),
|
||||||
|
(V, "regular"),
|
||||||
|
(B, "regular"),
|
||||||
|
(N, "regular"),
|
||||||
|
(M, "regular"),
|
||||||
|
(Comma, "regular"),
|
||||||
|
(Period, "regular"),
|
||||||
|
(FwdSlash, "regular"),
|
||||||
|
(Rshift, "rshift"),
|
||||||
|
(Spacing, "row_end_spacing"),
|
||||||
|
(MediaPrev, "regular"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(LCtrl, "lctrl"),
|
||||||
|
(LFn, "regular"),
|
||||||
|
(Meta, "regular"),
|
||||||
|
(LAlt, "regular"),
|
||||||
|
(Spacebar, "spacebar"),
|
||||||
|
(RAlt, "regular"),
|
||||||
|
(PrtSc, "regular"),
|
||||||
|
(RCtrl, "rctrl"),
|
||||||
|
(Up, "up_arrow"),
|
||||||
|
(Spacing, "row_end_spacing"),
|
||||||
|
(PrtSc, "regular"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(Spacing, "arrows_spacer"),
|
||||||
|
(Left, "arrows"),
|
||||||
|
(Down, "arrows"),
|
||||||
|
(Right, "arrows"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
(
|
||||||
|
pad_left: 0.1,
|
||||||
|
pad_right: 0.1,
|
||||||
|
pad_top: 0.1,
|
||||||
|
pad_bottom: 0.1,
|
||||||
|
row: [
|
||||||
|
(LightbarLeft, "lightbar_left"),
|
||||||
|
(LightbarLeftCorner, "lightbar_corner_left"),
|
||||||
|
(LightbarLeftBottom, "lightbar_bottom"),
|
||||||
|
(LightbarRightBottom, "lightbar_bottom"),
|
||||||
|
(LightbarRightCorner, "lightbar_corner_right"),
|
||||||
|
(LightbarRight, "lightbar_right"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
@@ -84,14 +84,6 @@ impl EffectState for DoomFlicker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LightFlash {
|
|
||||||
pub count: i32,
|
|
||||||
pub max_light: i32,
|
|
||||||
pub min_light: i32,
|
|
||||||
pub max_time: i32,
|
|
||||||
pub min_time: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Deserialize, Serialize)]
|
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||||
pub struct DoomLightFlash {
|
pub struct DoomLightFlash {
|
||||||
led: LedCode,
|
led: LedCode,
|
||||||
|
|||||||
@@ -112,14 +112,17 @@ impl AuraDevTuf {
|
|||||||
/// Keybord and Lightbar regardless of if either are enabled (or Awake is
|
/// Keybord and Lightbar regardless of if either are enabled (or Awake is
|
||||||
/// enabled)
|
/// enabled)
|
||||||
///
|
///
|
||||||
/// | Byte 1 | Byte 2 | Byte 3 | function | hex |
|
/// | Byte 1 | Byte 2 | Byte 3 | Byte 4 | function | hex
|
||||||
/// |------------|------------|------------|----------|----------|
|
/// |
|
||||||
/// | 0000, 0000 | 0000, 0000 | 0000, 0010 | Awake | 00,00,02 |
|
/// |------------|------------|------------|------------|-----------|-------------|
|
||||||
/// | 0000, 1000 | 0000, 0000 | 0000, 0000 | Keyboard | 08,00,00 |
|
/// | 0000, 0000 | 0000, 0000 | 0000, 0010 | 0000, 0000 | Awake |
|
||||||
/// | 0000, 0100 | 0000, 0101 | 0000, 0000 | Lightbar | 04,05,00 |
|
/// 00,00,02,00 | | 0000, 1000 | 0000, 0000 | 0000, 0000 | 0000, 0000 | Keyboard
|
||||||
/// | 1100, 0011 | 0001, 0010 | 0000, 1001 | Boot/Sht | c3,12,09 |
|
/// | 08,00,00,00 | | 0000, 0100 | 0000, 0101 | 0000, 0000 | 0000, 0000 |
|
||||||
/// | 0011, 0000 | 0000, 1000 | 0000, 0100 | Sleep | 30,08,04 |
|
/// Lightbar | 04,05,00,00 | | 1100, 0011 | 0001, 0010 | 0000, 1001 | 0000,
|
||||||
/// | 1111, 1111 | 0001, 1111 | 0000, 1111 | all on | |
|
/// 0000 | Boot/Sht | c3,12,09,00 | | 0011, 0000 | 0000, 1000 | 0000, 0100 |
|
||||||
|
/// 0000, 0000 | Sleep | 30,08,04,00 | | 1111, 1111 | 0001, 1111 | 0000,
|
||||||
|
/// 1111 | 0000, 0000 | all on | | | 0000, 0000 | 0000, 0000 |
|
||||||
|
/// 0000, 0000 | 0000, 0010 | Rear Glow | 00,00,00,02 |
|
||||||
#[cfg_attr(feature = "dbus", derive(Type))]
|
#[cfg_attr(feature = "dbus", derive(Type))]
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord, Hash, Serialize, Deserialize)]
|
||||||
#[repr(u32)]
|
#[repr(u32)]
|
||||||
@@ -138,7 +141,7 @@ impl From<AuraDevRog1> for u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AuraDevRog1 {
|
impl AuraDevRog1 {
|
||||||
pub fn to_bytes(control: &[Self]) -> [u8; 3] {
|
pub fn to_bytes(control: &[Self]) -> [u8; 4] {
|
||||||
let mut a: u32 = 0;
|
let mut a: u32 = 0;
|
||||||
for n in control {
|
for n in control {
|
||||||
a |= *n as u32;
|
a |= *n as u32;
|
||||||
@@ -147,6 +150,7 @@ impl AuraDevRog1 {
|
|||||||
((a & 0xff0000) >> 16) as u8,
|
((a & 0xff0000) >> 16) as u8,
|
||||||
((a & 0xff00) >> 8) as u8,
|
((a & 0xff00) >> 8) as u8,
|
||||||
(a & 0xff) as u8,
|
(a & 0xff) as u8,
|
||||||
|
0x00,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,6 +221,10 @@ pub enum AuraDevRog2 {
|
|||||||
AwakeLid = 1 << (15 + 2),
|
AwakeLid = 1 << (15 + 2),
|
||||||
SleepLid = 1 << (15 + 3),
|
SleepLid = 1 << (15 + 3),
|
||||||
ShutdownLid = 1 << (15 + 4),
|
ShutdownLid = 1 << (15 + 4),
|
||||||
|
BootRearGlow = 1 << (23 + 1),
|
||||||
|
AwakeRearGlow = 1 << (23 + 2),
|
||||||
|
SleepRearGlow = 1 << (23 + 3),
|
||||||
|
ShutdownRearGlow = 1 << (23 + 4),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<AuraDevRog2> for u32 {
|
impl From<AuraDevRog2> for u32 {
|
||||||
@@ -226,7 +234,7 @@ impl From<AuraDevRog2> for u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AuraDevRog2 {
|
impl AuraDevRog2 {
|
||||||
pub fn to_bytes(control: &[Self]) -> [u8; 3] {
|
pub fn to_bytes(control: &[Self]) -> [u8; 4] {
|
||||||
let mut a: u32 = 0;
|
let mut a: u32 = 0;
|
||||||
for n in control {
|
for n in control {
|
||||||
a |= *n as u32;
|
a |= *n as u32;
|
||||||
@@ -235,6 +243,7 @@ impl AuraDevRog2 {
|
|||||||
(a & 0xff) as u8,
|
(a & 0xff) as u8,
|
||||||
((a & 0xff00) >> 8) as u8,
|
((a & 0xff00) >> 8) as u8,
|
||||||
((a & 0xff0000) >> 16) as u8,
|
((a & 0xff0000) >> 16) as u8,
|
||||||
|
((a & 0xff000000) >> 24) as u8,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,22 +278,22 @@ mod tests {
|
|||||||
let bytes = [AuraDevRog1::Keyboard, AuraDevRog1::Awake];
|
let bytes = [AuraDevRog1::Keyboard, AuraDevRog1::Awake];
|
||||||
let bytes = AuraDevRog1::to_bytes(&bytes);
|
let bytes = AuraDevRog1::to_bytes(&bytes);
|
||||||
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
||||||
assert_eq!(bytes, [0x08, 0x00, 0x02]);
|
assert_eq!(bytes, [0x08, 0x00, 0x02, 0x00]);
|
||||||
|
|
||||||
let bytes = [AuraDevRog1::Lightbar, AuraDevRog1::Awake];
|
let bytes = [AuraDevRog1::Lightbar, AuraDevRog1::Awake];
|
||||||
let bytes = AuraDevRog1::to_bytes(&bytes);
|
let bytes = AuraDevRog1::to_bytes(&bytes);
|
||||||
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
||||||
assert_eq!(bytes, [0x04, 0x05, 0x02]);
|
assert_eq!(bytes, [0x04, 0x05, 0x02, 0x00]);
|
||||||
|
|
||||||
let bytes = [AuraDevRog1::Sleep];
|
let bytes = [AuraDevRog1::Sleep];
|
||||||
let bytes = AuraDevRog1::to_bytes(&bytes);
|
let bytes = AuraDevRog1::to_bytes(&bytes);
|
||||||
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
||||||
assert_eq!(bytes, [0x30, 0x08, 0x04]);
|
assert_eq!(bytes, [0x30, 0x08, 0x04, 0x00]);
|
||||||
|
|
||||||
let bytes = [AuraDevRog1::Boot];
|
let bytes = [AuraDevRog1::Boot];
|
||||||
let bytes = AuraDevRog1::to_bytes(&bytes);
|
let bytes = AuraDevRog1::to_bytes(&bytes);
|
||||||
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
||||||
assert_eq!(bytes, [0xc3, 0x12, 0x09]);
|
assert_eq!(bytes, [0xc3, 0x12, 0x09, 0x00]);
|
||||||
|
|
||||||
let bytes = [
|
let bytes = [
|
||||||
AuraDevRog1::Keyboard,
|
AuraDevRog1::Keyboard,
|
||||||
@@ -296,7 +305,7 @@ mod tests {
|
|||||||
|
|
||||||
let bytes = AuraDevRog1::to_bytes(&bytes);
|
let bytes = AuraDevRog1::to_bytes(&bytes);
|
||||||
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
||||||
assert_eq!(bytes, [0xff, 0x1f, 0x000f]);
|
assert_eq!(bytes, [0xff, 0x1f, 0x000f, 0x00]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -442,5 +451,70 @@ mod tests {
|
|||||||
let bytes = AuraDevRog2::to_bytes(&byte3);
|
let bytes = AuraDevRog2::to_bytes(&byte3);
|
||||||
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
|
||||||
assert_eq!(bytes[2], 0x06);
|
assert_eq!(bytes[2], 0x06);
|
||||||
|
|
||||||
|
let byte4 = [
|
||||||
|
// AuraDev19b6::AwakeRearBar,
|
||||||
|
AuraDevRog2::BootRearGlow,
|
||||||
|
AuraDevRog2::SleepRearGlow,
|
||||||
|
AuraDevRog2::ShutdownRearGlow,
|
||||||
|
];
|
||||||
|
let bytes = AuraDevRog2::to_bytes(&byte4);
|
||||||
|
println!(
|
||||||
|
"{:08b}, {:08b}, {:08b}, {:08b}",
|
||||||
|
bytes[0], bytes[1], bytes[2], bytes[3]
|
||||||
|
);
|
||||||
|
assert_eq!(bytes[3], 0x0d);
|
||||||
|
|
||||||
|
let byte4 = [
|
||||||
|
AuraDevRog2::AwakeRearGlow,
|
||||||
|
AuraDevRog2::BootRearGlow,
|
||||||
|
// AuraDevRog2::SleepRearBar,
|
||||||
|
AuraDevRog2::ShutdownRearGlow,
|
||||||
|
];
|
||||||
|
let bytes = AuraDevRog2::to_bytes(&byte4);
|
||||||
|
println!(
|
||||||
|
"{:08b}, {:08b}, {:08b}, {:08b}",
|
||||||
|
bytes[0], bytes[1], bytes[2], bytes[3]
|
||||||
|
);
|
||||||
|
assert_eq!(bytes[3], 0x0b);
|
||||||
|
|
||||||
|
let byte4 = [
|
||||||
|
AuraDevRog2::AwakeRearGlow,
|
||||||
|
AuraDevRog2::BootRearGlow,
|
||||||
|
AuraDevRog2::SleepRearGlow,
|
||||||
|
// AuraDevRog2::ShutdownRearBar,
|
||||||
|
];
|
||||||
|
let bytes = AuraDevRog2::to_bytes(&byte4);
|
||||||
|
println!(
|
||||||
|
"{:08b}, {:08b}, {:08b}, {:08b}",
|
||||||
|
bytes[0], bytes[1], bytes[2], bytes[3]
|
||||||
|
);
|
||||||
|
assert_eq!(bytes[3], 0x07);
|
||||||
|
|
||||||
|
let byte4 = [
|
||||||
|
AuraDevRog2::AwakeRearGlow,
|
||||||
|
// AuraDevRog2::BootRearBar,
|
||||||
|
AuraDevRog2::SleepRearGlow,
|
||||||
|
// AuraDevRog2::ShutdownRearBar,
|
||||||
|
];
|
||||||
|
let bytes = AuraDevRog2::to_bytes(&byte4);
|
||||||
|
println!(
|
||||||
|
"{:08b}, {:08b}, {:08b}, {:08b}",
|
||||||
|
bytes[0], bytes[1], bytes[2], bytes[3]
|
||||||
|
);
|
||||||
|
assert_eq!(bytes[3], 0x06);
|
||||||
|
|
||||||
|
let byte4 = [
|
||||||
|
AuraDevRog2::AwakeRearGlow,
|
||||||
|
// AuraDevRog2::BootRearBar,
|
||||||
|
// AuraDevRog2::SleepRearBar,
|
||||||
|
// AuraDevRog2::ShutdownRearBar,
|
||||||
|
];
|
||||||
|
let bytes = AuraDevRog2::to_bytes(&byte4);
|
||||||
|
println!(
|
||||||
|
"{:08b}, {:08b}, {:08b}, {:08b}",
|
||||||
|
bytes[0], bytes[1], bytes[2], bytes[3]
|
||||||
|
);
|
||||||
|
assert_eq!(bytes[3], 0x02);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ eframe = { git = "https://github.com/emilk/egui", rev = "b8e798777de519de3a18787
|
|||||||
libappindicator = "0.8" # Tray icon
|
libappindicator = "0.8" # Tray icon
|
||||||
gtk = "0.16"
|
gtk = "0.16"
|
||||||
|
|
||||||
daemon = { path = "../daemon" }
|
asusd = { path = "../asusd" }
|
||||||
rog_anime = { path = "../rog-anime" }
|
rog_anime = { path = "../rog-anime" }
|
||||||
rog_dbus = { path = "../rog-dbus" }
|
rog_dbus = { path = "../rog-dbus" }
|
||||||
rog_aura = { path = "../rog-aura" }
|
rog_aura = { path = "../rog-aura" }
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
|||||||
pub fn print_versions() {
|
pub fn print_versions() {
|
||||||
println!("App and daemon versions:");
|
println!("App and daemon versions:");
|
||||||
println!(" rog-gui v{}", VERSION);
|
println!(" rog-gui v{}", VERSION);
|
||||||
println!(" asusd v{}", daemon::VERSION);
|
println!(" asusd v{}", asusd::VERSION);
|
||||||
println!("\nComponent crate versions:");
|
println!("\nComponent crate versions:");
|
||||||
println!(" rog-anime v{}", rog_anime::VERSION);
|
println!(" rog-anime v{}", rog_anime::VERSION);
|
||||||
println!(" rog-aura v{}", rog_aura::VERSION);
|
println!(" rog-aura v{}", rog_aura::VERSION);
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ use std::time::SystemTime;
|
|||||||
|
|
||||||
use egui::Vec2;
|
use egui::Vec2;
|
||||||
use log::error;
|
use log::error;
|
||||||
|
use rog_anime::usb::Brightness;
|
||||||
|
use rog_anime::Animations;
|
||||||
use rog_aura::layouts::KeyLayout;
|
use rog_aura::layouts::KeyLayout;
|
||||||
use rog_aura::usb::AuraPowerDev;
|
use rog_aura::usb::AuraPowerDev;
|
||||||
use rog_aura::{AuraEffect, AuraModeNum};
|
use rog_aura::{AuraEffect, AuraModeNum};
|
||||||
@@ -30,6 +32,7 @@ pub struct BiosState {
|
|||||||
pub post_sound: bool,
|
pub post_sound: bool,
|
||||||
pub dedicated_gfx: GpuMode,
|
pub dedicated_gfx: GpuMode,
|
||||||
pub panel_overdrive: bool,
|
pub panel_overdrive: bool,
|
||||||
|
pub mini_led_mode: bool,
|
||||||
pub dgpu_disable: bool,
|
pub dgpu_disable: bool,
|
||||||
pub egpu_enable: bool,
|
pub egpu_enable: bool,
|
||||||
}
|
}
|
||||||
@@ -52,6 +55,11 @@ impl BiosState {
|
|||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
},
|
},
|
||||||
|
mini_led_mode: if supported.rog_bios_ctrl.mini_led_mode {
|
||||||
|
dbus.proxies().rog_bios().mini_led_mode()?
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
},
|
||||||
// TODO: needs supergfx
|
// TODO: needs supergfx
|
||||||
dgpu_disable: supported.rog_bios_ctrl.dgpu_disable,
|
dgpu_disable: supported.rog_bios_ctrl.dgpu_disable,
|
||||||
egpu_enable: supported.rog_bios_ctrl.egpu_enable,
|
egpu_enable: supported.rog_bios_ctrl.egpu_enable,
|
||||||
@@ -194,29 +202,25 @@ impl AuraState {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Default)]
|
#[derive(Clone, Debug, Default)]
|
||||||
pub struct AnimeState {
|
pub struct AnimeState {
|
||||||
pub bright: u8,
|
pub display_enabled: bool,
|
||||||
pub boot: bool,
|
pub display_brightness: Brightness,
|
||||||
pub awake: bool,
|
pub builtin_anims_enabled: bool,
|
||||||
pub sleep: bool,
|
pub builtin_anims: Animations,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AnimeState {
|
impl AnimeState {
|
||||||
pub fn new(supported: &SupportedFunctions, dbus: &RogDbusClientBlocking<'_>) -> Result<Self> {
|
pub fn new(supported: &SupportedFunctions, dbus: &RogDbusClientBlocking<'_>) -> Result<Self> {
|
||||||
Ok(Self {
|
if supported.anime_ctrl.0 {
|
||||||
boot: if supported.anime_ctrl.0 {
|
let device_state = dbus.proxies().anime().device_state()?;
|
||||||
dbus.proxies().anime().boot_enabled()?
|
Ok(Self {
|
||||||
} else {
|
display_enabled: device_state.display_enabled,
|
||||||
false
|
display_brightness: device_state.display_brightness,
|
||||||
},
|
builtin_anims_enabled: device_state.builtin_anims_enabled,
|
||||||
awake: if supported.anime_ctrl.0 {
|
builtin_anims: device_state.builtin_anims,
|
||||||
dbus.proxies().anime().awake_enabled()?
|
})
|
||||||
} else {
|
} else {
|
||||||
false
|
Ok(Default::default())
|
||||||
},
|
}
|
||||||
// TODO:
|
|
||||||
sleep: false,
|
|
||||||
bright: 200,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -412,9 +416,7 @@ impl Default for SystemState {
|
|||||||
bios: BiosState {
|
bios: BiosState {
|
||||||
post_sound: Default::default(),
|
post_sound: Default::default(),
|
||||||
dedicated_gfx: GpuMode::NotSupported,
|
dedicated_gfx: GpuMode::NotSupported,
|
||||||
panel_overdrive: Default::default(),
|
..Default::default()
|
||||||
dgpu_disable: Default::default(),
|
|
||||||
egpu_enable: Default::default(),
|
|
||||||
},
|
},
|
||||||
aura: AuraState {
|
aura: AuraState {
|
||||||
current_mode: AuraModeNum::Static,
|
current_mode: AuraModeNum::Static,
|
||||||
@@ -424,27 +426,14 @@ impl Default for SystemState {
|
|||||||
x1866: vec![],
|
x1866: vec![],
|
||||||
x19b6: vec![],
|
x19b6: vec![],
|
||||||
},
|
},
|
||||||
bright: Default::default(),
|
..Default::default()
|
||||||
wave_red: Default::default(),
|
|
||||||
wave_green: Default::default(),
|
|
||||||
wave_blue: Default::default(),
|
|
||||||
},
|
|
||||||
anime: AnimeState {
|
|
||||||
bright: Default::default(),
|
|
||||||
boot: Default::default(),
|
|
||||||
awake: Default::default(),
|
|
||||||
sleep: Default::default(),
|
|
||||||
},
|
},
|
||||||
|
anime: AnimeState::default(),
|
||||||
profiles: ProfilesState {
|
profiles: ProfilesState {
|
||||||
list: Default::default(),
|
..Default::default()
|
||||||
current: Default::default(),
|
|
||||||
},
|
},
|
||||||
fan_curves: FanCurvesState {
|
fan_curves: FanCurvesState {
|
||||||
show_curve: Default::default(),
|
..Default::default()
|
||||||
show_graph: Default::default(),
|
|
||||||
enabled: Default::default(),
|
|
||||||
curves: Default::default(),
|
|
||||||
drag_delta: Default::default(),
|
|
||||||
},
|
},
|
||||||
gfx_state: GfxState {
|
gfx_state: GfxState {
|
||||||
has_supergfx: false,
|
has_supergfx: false,
|
||||||
|
|||||||
@@ -247,6 +247,21 @@ impl ROGTray {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn menu_add_mini_led_mode(&mut self, supported: &SupportedFunctions, on: bool) {
|
||||||
|
if supported.rog_bios_ctrl.mini_led_mode {
|
||||||
|
let bios = self.bios_proxy.clone();
|
||||||
|
self.add_check_menu_item("MiniLED mode", on, move |this| {
|
||||||
|
bios.set_mini_led_mode(this.is_active())
|
||||||
|
.map_err(|e| {
|
||||||
|
error!("ROGTray: set_mini_led_mode: {e}");
|
||||||
|
e
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
});
|
||||||
|
debug!("ROGTray: appended miniLED mode menu");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn menu_add_supergfx(&mut self, supported_gfx: &[GfxMode], current_mode: GfxMode) {
|
fn menu_add_supergfx(&mut self, supported_gfx: &[GfxMode], current_mode: GfxMode) {
|
||||||
if !self.gfx_proxy_is_active {
|
if !self.gfx_proxy_is_active {
|
||||||
trace!("menu_add_supergfx: gfx_proxy_is_active is false");
|
trace!("menu_add_supergfx: gfx_proxy_is_active is false");
|
||||||
@@ -386,11 +401,13 @@ impl ROGTray {
|
|||||||
current_gfx_mode: GfxMode,
|
current_gfx_mode: GfxMode,
|
||||||
charge_limit: u8,
|
charge_limit: u8,
|
||||||
panel_od: bool,
|
panel_od: bool,
|
||||||
|
mini_led: bool,
|
||||||
) {
|
) {
|
||||||
self.menu_clear();
|
self.menu_clear();
|
||||||
self.menu_add_base();
|
self.menu_add_base();
|
||||||
self.menu_add_charge_limit(supported, charge_limit);
|
self.menu_add_charge_limit(supported, charge_limit);
|
||||||
self.menu_add_panel_od(supported, panel_od);
|
self.menu_add_panel_od(supported, panel_od);
|
||||||
|
self.menu_add_mini_led_mode(supported, mini_led);
|
||||||
if self.gfx_proxy_is_active {
|
if self.gfx_proxy_is_active {
|
||||||
// Add a supergfxctl specific menu
|
// Add a supergfxctl specific menu
|
||||||
self.menu_add_supergfx(supported_gfx, current_gfx_mode);
|
self.menu_add_supergfx(supported_gfx, current_gfx_mode);
|
||||||
@@ -453,7 +470,14 @@ pub fn init_tray(
|
|||||||
Default::default()
|
Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
tray.rebuild_and_update(&supported, &supported_gfx, GfxMode::Hybrid, 100, false);
|
tray.rebuild_and_update(
|
||||||
|
&supported,
|
||||||
|
&supported_gfx,
|
||||||
|
GfxMode::Hybrid,
|
||||||
|
100,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
);
|
||||||
tray.set_icon(TRAY_APP_ICON);
|
tray.set_icon(TRAY_APP_ICON);
|
||||||
info!("Started ROGTray");
|
info!("Started ROGTray");
|
||||||
|
|
||||||
@@ -475,6 +499,7 @@ pub fn init_tray(
|
|||||||
current_gpu_mode,
|
current_gpu_mode,
|
||||||
lock.power_state.charge_limit,
|
lock.power_state.charge_limit,
|
||||||
lock.bios.panel_overdrive,
|
lock.bios.panel_overdrive,
|
||||||
|
lock.bios.mini_led_mode,
|
||||||
);
|
);
|
||||||
lock.tray_should_update = false;
|
lock.tray_should_update = false;
|
||||||
debug!("ROGTray: rebuilt menus due to state change");
|
debug!("ROGTray: rebuilt menus due to state change");
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
//! `update_and_notify` is responsible for both notifications *and* updating
|
//! `update_and_notify` is responsible for both notifications *and* updating
|
||||||
//! stored statuses about the system state. This is done through either direct,
|
//! stored statuses about the system state. This is done through either direct,
|
||||||
//! intoify, zbus notifications or similar methods.
|
//! intoify, zbus notifications or similar methods.
|
||||||
|
//!
|
||||||
|
//! This module very much functions like a stand-alone app on its own thread.
|
||||||
|
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
@@ -37,6 +39,7 @@ static mut POWER_BAT_CMD: Option<Command> = None;
|
|||||||
pub struct EnabledNotifications {
|
pub struct EnabledNotifications {
|
||||||
pub receive_notify_post_boot_sound: bool,
|
pub receive_notify_post_boot_sound: bool,
|
||||||
pub receive_notify_panel_od: bool,
|
pub receive_notify_panel_od: bool,
|
||||||
|
pub receive_notify_mini_led_mode: bool,
|
||||||
pub receive_notify_dgpu_disable: bool,
|
pub receive_notify_dgpu_disable: bool,
|
||||||
pub receive_notify_egpu_enable: bool,
|
pub receive_notify_egpu_enable: bool,
|
||||||
pub receive_notify_gpu_mux_mode: bool,
|
pub receive_notify_gpu_mux_mode: bool,
|
||||||
@@ -56,6 +59,7 @@ impl Default for EnabledNotifications {
|
|||||||
Self {
|
Self {
|
||||||
receive_notify_post_boot_sound: false,
|
receive_notify_post_boot_sound: false,
|
||||||
receive_notify_panel_od: true,
|
receive_notify_panel_od: true,
|
||||||
|
receive_notify_mini_led_mode: true,
|
||||||
receive_notify_dgpu_disable: true,
|
receive_notify_dgpu_disable: true,
|
||||||
receive_notify_egpu_enable: true,
|
receive_notify_egpu_enable: true,
|
||||||
receive_notify_gpu_mux_mode: true,
|
receive_notify_gpu_mux_mode: true,
|
||||||
@@ -77,17 +81,6 @@ impl EnabledNotifications {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! notify {
|
|
||||||
($notifier:expr, $last_notif:ident) => {
|
|
||||||
if let Some(notif) = $last_notif.take() {
|
|
||||||
notif.close();
|
|
||||||
}
|
|
||||||
if let Ok(x) = $notifier {
|
|
||||||
$last_notif.replace(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: drop the macro and use generics plus closure
|
// TODO: drop the macro and use generics plus closure
|
||||||
macro_rules! recv_notif {
|
macro_rules! recv_notif {
|
||||||
($proxy:ident,
|
($proxy:ident,
|
||||||
@@ -100,7 +93,6 @@ macro_rules! recv_notif {
|
|||||||
$msg:literal,
|
$msg:literal,
|
||||||
$notifier:ident) => {
|
$notifier:ident) => {
|
||||||
|
|
||||||
let last_notif = $last_notif.clone();
|
|
||||||
let notifs_enabled1 = $notif_enabled.clone();
|
let notifs_enabled1 = $notif_enabled.clone();
|
||||||
let page_states1 = $page_states.clone();
|
let page_states1 = $page_states.clone();
|
||||||
|
|
||||||
@@ -119,10 +111,8 @@ macro_rules! recv_notif {
|
|||||||
if let Ok(out) = e.args() {
|
if let Ok(out) = e.args() {
|
||||||
if let Ok(config) = notifs_enabled1.lock() {
|
if let Ok(config) = notifs_enabled1.lock() {
|
||||||
if config.all_enabled && config.$signal {
|
if config.all_enabled && config.$signal {
|
||||||
if let Ok(ref mut lock) = last_notif.lock() {
|
trace!("zbus signal {}", stringify!($signal));
|
||||||
trace!("zbus signal {} locked last_notif", stringify!($signal));
|
$notifier($msg, &out.$($out_arg)+()).ok();
|
||||||
notify!($notifier($msg, &out.$($out_arg)+()), lock);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Ok(mut lock) = page_states1.lock() {
|
if let Ok(mut lock) = page_states1.lock() {
|
||||||
@@ -130,21 +120,18 @@ macro_rules! recv_notif {
|
|||||||
lock.set_notified();
|
lock.set_notified();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sleep(Duration::from_millis(500)).await;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
type SharedHandle = Arc<Mutex<Option<NotificationHandle>>>;
|
|
||||||
|
|
||||||
pub fn start_notifications(
|
pub fn start_notifications(
|
||||||
config: &Config,
|
config: &Config,
|
||||||
page_states: &Arc<Mutex<SystemState>>,
|
page_states: &Arc<Mutex<SystemState>>,
|
||||||
enabled_notifications: &Arc<Mutex<EnabledNotifications>>,
|
enabled_notifications: &Arc<Mutex<EnabledNotifications>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let last_notification: SharedHandle = Arc::new(Mutex::new(None));
|
|
||||||
|
|
||||||
// Setup the AC/BAT commands that will run on poweer status change
|
// Setup the AC/BAT commands that will run on poweer status change
|
||||||
unsafe {
|
unsafe {
|
||||||
let prog: Vec<&str> = config.ac_command.split_whitespace().collect();
|
let prog: Vec<&str> = config.ac_command.split_whitespace().collect();
|
||||||
@@ -194,6 +181,18 @@ pub fn start_notifications(
|
|||||||
do_notification
|
do_notification
|
||||||
);
|
);
|
||||||
|
|
||||||
|
recv_notif!(
|
||||||
|
RogBiosProxy,
|
||||||
|
receive_notify_mini_led_mode,
|
||||||
|
last_notification,
|
||||||
|
enabled_notifications,
|
||||||
|
page_states,
|
||||||
|
(bios.mini_led_mode),
|
||||||
|
(on),
|
||||||
|
"MiniLED mode enabled:",
|
||||||
|
do_notification
|
||||||
|
);
|
||||||
|
|
||||||
recv_notif!(
|
recv_notif!(
|
||||||
RogBiosProxy,
|
RogBiosProxy,
|
||||||
receive_notify_dgpu_disable,
|
receive_notify_dgpu_disable,
|
||||||
@@ -286,7 +285,7 @@ pub fn start_notifications(
|
|||||||
e
|
e
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
if let Ok(p) = proxy.receive_power_states().await {
|
if let Ok(p) = proxy.receive_device_state().await {
|
||||||
info!("Started zbus signal thread: receive_power_states");
|
info!("Started zbus signal thread: receive_power_states");
|
||||||
p.for_each(|_| {
|
p.for_each(|_| {
|
||||||
if let Ok(_lock) = page_states1.lock() {
|
if let Ok(_lock) = page_states1.lock() {
|
||||||
@@ -299,7 +298,6 @@ pub fn start_notifications(
|
|||||||
});
|
});
|
||||||
|
|
||||||
let page_states1 = page_states.clone();
|
let page_states1 = page_states.clone();
|
||||||
let last_notification1 = last_notification.clone();
|
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let conn = zbus::Connection::system()
|
let conn = zbus::Connection::system()
|
||||||
.await
|
.await
|
||||||
@@ -332,11 +330,6 @@ pub fn start_notifications(
|
|||||||
lock.bios.dedicated_gfx = out.mode;
|
lock.bios.dedicated_gfx = out.mode;
|
||||||
lock.set_notified();
|
lock.set_notified();
|
||||||
}
|
}
|
||||||
if let Ok(ref mut lock) = last_notification1.lock() {
|
|
||||||
if let Some(notif) = lock.take() {
|
|
||||||
notif.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
do_mux_notification("Reboot required. BIOS GPU MUX mode set to", &out.mode)
|
do_mux_notification("Reboot required. BIOS GPU MUX mode set to", &out.mode)
|
||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
@@ -351,7 +344,6 @@ pub fn start_notifications(
|
|||||||
for dev in dev {
|
for dev in dev {
|
||||||
if dev.is_dgpu() {
|
if dev.is_dgpu() {
|
||||||
let notifs_enabled1 = enabled_notifications.clone();
|
let notifs_enabled1 = enabled_notifications.clone();
|
||||||
let last_notif = last_notification.clone();
|
|
||||||
let page_states1 = page_states.clone();
|
let page_states1 = page_states.clone();
|
||||||
// Plain old thread is perfectly fine since most of this is potentially blocking
|
// Plain old thread is perfectly fine since most of this is potentially blocking
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
@@ -363,15 +355,7 @@ pub fn start_notifications(
|
|||||||
if config.all_enabled && config.receive_notify_gfx_status {
|
if config.all_enabled && config.receive_notify_gfx_status {
|
||||||
// Required check because status cycles through
|
// Required check because status cycles through
|
||||||
// active/unknown/suspended
|
// active/unknown/suspended
|
||||||
if let Ok(ref mut lock) = last_notif.lock() {
|
do_gpu_status_notif("dGPU status changed:", &status).ok();
|
||||||
notify!(
|
|
||||||
do_gpu_status_notif(
|
|
||||||
"dGPU status changed:",
|
|
||||||
&status
|
|
||||||
),
|
|
||||||
lock
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Ok(mut lock) = page_states1.lock() {
|
if let Ok(mut lock) = page_states1.lock() {
|
||||||
@@ -478,7 +462,7 @@ where
|
|||||||
notif
|
notif
|
||||||
.summary(NOTIF_HEADER)
|
.summary(NOTIF_HEADER)
|
||||||
.body(&format!("{message} {data}"))
|
.body(&format!("{message} {data}"))
|
||||||
.timeout(2000)
|
.timeout(-1)
|
||||||
//.hint(Hint::Resident(true))
|
//.hint(Hint::Resident(true))
|
||||||
.hint(Hint::Category("device".into()));
|
.hint(Hint::Category("device".into()));
|
||||||
|
|
||||||
@@ -554,7 +538,7 @@ fn do_gfx_action_notif(message: &str, action: GfxUserAction, mode: GpuMode) -> R
|
|||||||
//.hint(Hint::Resident(true))
|
//.hint(Hint::Resident(true))
|
||||||
.hint(Hint::Category("device".into()))
|
.hint(Hint::Category("device".into()))
|
||||||
.urgency(Urgency::Critical)
|
.urgency(Urgency::Critical)
|
||||||
.timeout(3000)
|
.timeout(-1)
|
||||||
.icon("dialog-warning")
|
.icon("dialog-warning")
|
||||||
.hint(Hint::Transient(true));
|
.hint(Hint::Transient(true));
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use egui::{RichText, Ui};
|
use egui::{RichText, Ui};
|
||||||
|
use rog_anime::usb::Brightness;
|
||||||
use rog_platform::supported::SupportedFunctions;
|
use rog_platform::supported::SupportedFunctions;
|
||||||
|
|
||||||
use crate::system_state::SystemState;
|
use crate::system_state::SystemState;
|
||||||
@@ -7,42 +8,50 @@ pub fn anime_power_group(_supported: &SupportedFunctions, states: &mut SystemSta
|
|||||||
ui.heading("AniMe Matrix Settings");
|
ui.heading("AniMe Matrix Settings");
|
||||||
ui.label("Options are incomplete. Awake + Boot should work");
|
ui.label("Options are incomplete. Awake + Boot should work");
|
||||||
|
|
||||||
let mut changed = false;
|
let mut brightness = states.anime.display_brightness as u8;
|
||||||
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
let h = 16.0;
|
let h = 16.0;
|
||||||
ui.set_row_height(22.0);
|
ui.set_row_height(22.0);
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
ui.label(RichText::new("Brightness").size(h));
|
ui.label(RichText::new("Display brightness").size(h));
|
||||||
});
|
});
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
ui.label(RichText::new("Boot").size(h));
|
ui.label(RichText::new("Display enabled").size(h));
|
||||||
});
|
});
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
ui.label(RichText::new("Awake").size(h));
|
ui.label(RichText::new("Animations enabled").size(h));
|
||||||
});
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
ui.label(RichText::new("Sleep").size(h));
|
|
||||||
});
|
});
|
||||||
|
// ui.horizontal_wrapped(|ui| {
|
||||||
|
// ui.label(RichText::new("Sleep").size(h));
|
||||||
|
// });
|
||||||
});
|
});
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
ui.set_row_height(22.0);
|
ui.set_row_height(22.0);
|
||||||
|
ui.horizontal_wrapped(|ui| {
|
||||||
|
if ui.add(egui::Slider::new(&mut brightness, 0..=3)).changed() {
|
||||||
|
states
|
||||||
|
.asus_dbus
|
||||||
|
.proxies()
|
||||||
|
.anime()
|
||||||
|
.set_brightness(Brightness::from(brightness))
|
||||||
|
.map_err(|err| {
|
||||||
|
states.error = Some(err.to_string());
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
});
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
if ui
|
if ui
|
||||||
.add(egui::Slider::new(&mut states.anime.bright, 0..=254))
|
.checkbox(&mut states.anime.display_enabled, "Enable")
|
||||||
.changed()
|
.changed()
|
||||||
{
|
{
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ui.horizontal_wrapped(|ui| {
|
|
||||||
if ui.checkbox(&mut states.anime.boot, "Enable").changed() {
|
|
||||||
states
|
states
|
||||||
.asus_dbus
|
.asus_dbus
|
||||||
.proxies()
|
.proxies()
|
||||||
.anime()
|
.anime()
|
||||||
.set_boot_on_off(states.anime.boot)
|
.set_enable_display(states.anime.display_enabled)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
states.error = Some(err.to_string());
|
states.error = Some(err.to_string());
|
||||||
})
|
})
|
||||||
@@ -50,23 +59,26 @@ pub fn anime_power_group(_supported: &SupportedFunctions, states: &mut SystemSta
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
if ui.checkbox(&mut states.anime.awake, "Enable").changed() {
|
if ui
|
||||||
|
.checkbox(&mut states.anime.builtin_anims_enabled, "Enable")
|
||||||
|
.changed()
|
||||||
|
{
|
||||||
states
|
states
|
||||||
.asus_dbus
|
.asus_dbus
|
||||||
.proxies()
|
.proxies()
|
||||||
.anime()
|
.anime()
|
||||||
.set_on_off(states.anime.awake)
|
.set_builtins_enabled(states.anime.builtin_anims_enabled)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
states.error = Some(err.to_string());
|
states.error = Some(err.to_string());
|
||||||
})
|
})
|
||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ui.horizontal_wrapped(|ui| {
|
// ui.horizontal_wrapped(|ui| {
|
||||||
if ui.checkbox(&mut states.anime.sleep, "Enable").changed() {
|
// if ui.checkbox(&mut states.anime.sleep, "Enable").changed() {
|
||||||
changed = true;
|
// changed = true;
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,6 +76,12 @@ pub fn app_settings(config: &mut Config, states: &mut SystemState, ui: &mut Ui)
|
|||||||
"Enable panel overdrive notification",
|
"Enable panel overdrive notification",
|
||||||
)
|
)
|
||||||
.clicked()
|
.clicked()
|
||||||
|
|| ui
|
||||||
|
.checkbox(
|
||||||
|
&mut enabled_notifications.receive_notify_mini_led_mode,
|
||||||
|
"Enable MiniLED mode notification",
|
||||||
|
)
|
||||||
|
.clicked()
|
||||||
|| ui
|
|| ui
|
||||||
.checkbox(
|
.checkbox(
|
||||||
&mut enabled_notifications.receive_notify_post_boot_sound,
|
&mut enabled_notifications.receive_notify_post_boot_sound,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use egui::{RichText, Ui};
|
|||||||
use rog_aura::layouts::KeyLayout;
|
use rog_aura::layouts::KeyLayout;
|
||||||
use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Speed};
|
use rog_aura::{AuraEffect, AuraModeNum, AuraZone, Colour, Speed};
|
||||||
|
|
||||||
use crate::system_state::{AuraState, SystemState};
|
use crate::system_state::SystemState;
|
||||||
|
|
||||||
pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui: &mut Ui) {
|
pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui: &mut Ui) {
|
||||||
let mut changed = false;
|
let mut changed = false;
|
||||||
@@ -59,7 +59,7 @@ pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui:
|
|||||||
let mut zone_button = |a: AuraZone, ui: &mut Ui| {
|
let mut zone_button = |a: AuraZone, ui: &mut Ui| {
|
||||||
ui.selectable_value(&mut effect.zone, a, format!("{:?}", a));
|
ui.selectable_value(&mut effect.zone, a, format!("{:?}", a));
|
||||||
};
|
};
|
||||||
let mut speed_button = |a: Speed, ui: &mut Ui| {
|
let mut speed_button = |a: Speed, ui: &mut Ui| -> bool {
|
||||||
if ui
|
if ui
|
||||||
.selectable_value(&mut effect.speed, a, format!("{:?}", a))
|
.selectable_value(&mut effect.speed, a, format!("{:?}", a))
|
||||||
.clicked()
|
.clicked()
|
||||||
@@ -70,10 +70,13 @@ pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui:
|
|||||||
Speed::High => 10,
|
Speed::High => 10,
|
||||||
};
|
};
|
||||||
freq.store(val, Ordering::SeqCst);
|
freq.store(val, Ordering::SeqCst);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
false
|
||||||
};
|
};
|
||||||
let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| {
|
let mut dir_button = |a: rog_aura::Direction, ui: &mut Ui| -> bool {
|
||||||
ui.selectable_value(&mut effect.direction, a, format!("{:?}", a));
|
ui.selectable_value(&mut effect.direction, a, format!("{:?}", a))
|
||||||
|
.clicked()
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut c1: [u8; 3] = effect.colour1.into();
|
let mut c1: [u8; 3] = effect.colour1.into();
|
||||||
@@ -139,26 +142,37 @@ pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui:
|
|||||||
});
|
});
|
||||||
|
|
||||||
ui.add_enabled_ui(allowed.colour1, |ui| {
|
ui.add_enabled_ui(allowed.colour1, |ui| {
|
||||||
egui::color_picker::color_edit_button_srgb(ui, &mut c1)
|
if egui::color_picker::color_edit_button_srgb(ui, &mut c1).changed() {
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.add_enabled_ui(allowed.colour2, |ui| {
|
ui.add_enabled_ui(allowed.colour2, |ui| {
|
||||||
egui::color_picker::color_edit_button_srgb(ui, &mut c2)
|
if egui::color_picker::color_edit_button_srgb(ui, &mut c2).changed() {
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.add_enabled_ui(allowed.speed, |ui| {
|
ui.add_enabled_ui(allowed.speed, |ui| {
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
speed_button(Speed::Low, ui);
|
if speed_button(Speed::Low, ui)
|
||||||
speed_button(Speed::Med, ui);
|
|| speed_button(Speed::Med, ui)
|
||||||
speed_button(Speed::High, ui);
|
|| speed_button(Speed::High, ui)
|
||||||
|
{
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.add_enabled_ui(allowed.direction, |ui| {
|
ui.add_enabled_ui(allowed.direction, |ui| {
|
||||||
ui.horizontal_wrapped(|ui| {
|
ui.horizontal_wrapped(|ui| {
|
||||||
dir_button(rog_aura::Direction::Left, ui);
|
if dir_button(rog_aura::Direction::Left, ui)
|
||||||
dir_button(rog_aura::Direction::Down, ui);
|
|| dir_button(rog_aura::Direction::Down, ui)
|
||||||
dir_button(rog_aura::Direction::Right, ui);
|
|| dir_button(rog_aura::Direction::Right, ui)
|
||||||
dir_button(rog_aura::Direction::Up, ui);
|
|| dir_button(rog_aura::Direction::Up, ui)
|
||||||
|
{
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -170,16 +184,16 @@ pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui:
|
|||||||
|
|
||||||
ui.separator();
|
ui.separator();
|
||||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
||||||
if ui.add(egui::Button::new("Cancel")).clicked() {
|
// if ui.add(egui::Button::new("Cancel")).clicked() {
|
||||||
match AuraState::new(&aura_creation.keyboard_layout, &states.asus_dbus) {
|
// match AuraState::new(&aura_creation.keyboard_layout, &states.asus_dbus) {
|
||||||
Ok(a) => states.aura.modes = a.modes,
|
// Ok(a) => states.aura.modes = a.modes,
|
||||||
Err(e) => states.error = Some(e.to_string()),
|
// Err(e) => states.error = Some(e.to_string()),
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
if ui.add(egui::Button::new("Apply")).clicked() {
|
// if ui.add(egui::Button::new("Apply")).clicked() {
|
||||||
changed = true;
|
// changed = true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if aura_creation.layout_testing.is_some() {
|
if aura_creation.layout_testing.is_some() {
|
||||||
if ui.add(egui::Button::new("Next layout")).clicked() {
|
if ui.add(egui::Button::new("Next layout")).clicked() {
|
||||||
@@ -208,21 +222,6 @@ pub fn aura_modes_group(states: &mut SystemState, freq: &mut Arc<AtomicU8>, ui:
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// egui::TopBottomPanel::bottom("error_bar")
|
|
||||||
// .default_height(26.0)
|
|
||||||
// .show(ctx, |ui| {
|
|
||||||
// ui.with_layout(egui::Layout::right_to_left(egui::Align::TOP), |ui| {
|
|
||||||
// if ui.add(egui::Button::new("Cancel")).clicked() {
|
|
||||||
// let notif = states.aura.was_notified.clone();
|
|
||||||
// states.aura.modes = AuraState::new(notif, supported,
|
|
||||||
// dbus).modes; }
|
|
||||||
|
|
||||||
// if ui.add(egui::Button::new("Apply")).clicked() {
|
|
||||||
// changed = true;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
if changed {
|
if changed {
|
||||||
states.aura.current_mode = selected;
|
states.aura.current_mode = selected;
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ pub fn rog_bios_group(supported: &SupportedFunctions, states: &mut SystemState,
|
|||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
if supported.rog_bios_ctrl.post_sound
|
if supported.rog_bios_ctrl.panel_overdrive
|
||||||
&& ui
|
&& ui
|
||||||
.add(egui::Checkbox::new(
|
.add(egui::Checkbox::new(
|
||||||
&mut states.bios.panel_overdrive,
|
&mut states.bios.panel_overdrive,
|
||||||
@@ -93,6 +93,25 @@ pub fn rog_bios_group(supported: &SupportedFunctions, states: &mut SystemState,
|
|||||||
.ok();
|
.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if supported.rog_bios_ctrl.mini_led_mode
|
||||||
|
&& ui
|
||||||
|
.add(egui::Checkbox::new(
|
||||||
|
&mut states.bios.mini_led_mode,
|
||||||
|
"MiniLED backlight",
|
||||||
|
))
|
||||||
|
.changed()
|
||||||
|
{
|
||||||
|
states
|
||||||
|
.asus_dbus
|
||||||
|
.proxies()
|
||||||
|
.rog_bios()
|
||||||
|
.set_mini_led_mode(states.bios.mini_led_mode)
|
||||||
|
.map_err(|err| {
|
||||||
|
states.error = Some(err.to_string());
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
|
||||||
if supported.rog_bios_ctrl.gpu_mux {
|
if supported.rog_bios_ctrl.gpu_mux {
|
||||||
let mut changed = false;
|
let mut changed = false;
|
||||||
let mut dedicated_gfx = states.bios.dedicated_gfx;
|
let mut dedicated_gfx = states.bios.dedicated_gfx;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ description = "dbus interface methods for asusctl"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rog_anime = { path = "../rog-anime" }
|
rog_anime = { path = "../rog-anime", features = ["dbus"] }
|
||||||
rog_aura = { path = "../rog-aura" }
|
rog_aura = { path = "../rog-aura" }
|
||||||
rog_profiles = { path = "../rog-profiles" }
|
rog_profiles = { path = "../rog-profiles" }
|
||||||
rog_platform = { path = "../rog-platform" }
|
rog_platform = { path = "../rog-platform" }
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use rog_anime::{AnimeDataBuffer, AnimePowerStates};
|
use rog_anime::usb::{AnimAwake, AnimBooting, AnimShutdown, AnimSleeping, Brightness};
|
||||||
|
use rog_anime::{AnimeDataBuffer, DeviceState as AnimeDeviceState};
|
||||||
use zbus::dbus_proxy;
|
use zbus::dbus_proxy;
|
||||||
|
|
||||||
#[dbus_proxy(
|
#[dbus_proxy(
|
||||||
@@ -6,29 +7,36 @@ use zbus::dbus_proxy;
|
|||||||
default_path = "/org/asuslinux/Anime"
|
default_path = "/org/asuslinux/Anime"
|
||||||
)]
|
)]
|
||||||
trait Anime {
|
trait Anime {
|
||||||
/// Set whether the AniMe will show boot, suspend, or off animations
|
/// Set the global (image) brightness
|
||||||
fn set_boot_on_off(&self, status: bool) -> zbus::Result<()>;
|
fn set_image_brightness(&self, bright: f32) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// Set the global AniMe brightness
|
/// Set the global base brightness
|
||||||
fn set_brightness(&self, bright: f32) -> zbus::Result<()>;
|
fn set_brightness(&self, bright: Brightness) -> zbus::Result<()>;
|
||||||
|
|
||||||
|
/// Set whether the AniMe will show boot, suspend, or off animations
|
||||||
|
fn set_builtins_enabled(&self, enabled: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
|
/// Set which builtin animation is used for each stage
|
||||||
|
fn set_builtin_animations(
|
||||||
|
&self,
|
||||||
|
boot: AnimBooting,
|
||||||
|
awake: AnimAwake,
|
||||||
|
sleep: AnimSleeping,
|
||||||
|
shutdown: AnimShutdown,
|
||||||
|
) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// Set whether the AniMe is displaying images/data
|
/// Set whether the AniMe is displaying images/data
|
||||||
fn set_on_off(&self, status: bool) -> zbus::Result<()>;
|
fn set_enable_display(&self, status: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// Writes a data stream of length. Will force system thread to exit until
|
/// Writes a data stream of length. Will force system thread to exit until
|
||||||
/// it is restarted
|
/// it is restarted
|
||||||
fn write(&self, input: AnimeDataBuffer) -> zbus::Result<()>;
|
fn write(&self, input: AnimeDataBuffer) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// Get status of if the AniMe LEDs are on
|
// #[dbus_proxy(property)]
|
||||||
#[dbus_proxy(property)]
|
fn device_state(&self) -> zbus::Result<AnimeDeviceState>;
|
||||||
fn awake_enabled(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// Get the status of if factory system-status animations are enabled
|
|
||||||
#[dbus_proxy(property)]
|
|
||||||
fn boot_enabled(&self) -> zbus::Result<bool>;
|
|
||||||
|
|
||||||
/// Notify listeners of the status of AniMe LED power and factory
|
/// Notify listeners of the status of AniMe LED power and factory
|
||||||
/// system-status animations
|
/// system-status animations
|
||||||
#[dbus_proxy(signal)]
|
#[dbus_proxy(signal)]
|
||||||
fn power_states(&self, data: AnimePowerStates) -> zbus::Result<()>;
|
fn device_state(&self, data: AnimeDeviceState) -> zbus::Result<()>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ trait RogBios {
|
|||||||
/// PanelOd method
|
/// PanelOd method
|
||||||
fn panel_od(&self) -> zbus::Result<bool>;
|
fn panel_od(&self) -> zbus::Result<bool>;
|
||||||
|
|
||||||
|
/// MiniLedMode method
|
||||||
|
fn mini_led_mode(&self) -> zbus::Result<bool>;
|
||||||
|
|
||||||
/// PostBootSound method
|
/// PostBootSound method
|
||||||
fn post_boot_sound(&self) -> zbus::Result<i16>;
|
fn post_boot_sound(&self) -> zbus::Result<i16>;
|
||||||
|
|
||||||
@@ -55,6 +58,9 @@ trait RogBios {
|
|||||||
/// SetPanelOd method
|
/// SetPanelOd method
|
||||||
fn set_panel_od(&self, overdrive: bool) -> zbus::Result<()>;
|
fn set_panel_od(&self, overdrive: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
|
/// SetminiLedMode
|
||||||
|
fn set_mini_led_mode(&self, on: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// SetPostBootSound method
|
/// SetPostBootSound method
|
||||||
fn set_post_boot_sound(&self, on: bool) -> zbus::Result<()>;
|
fn set_post_boot_sound(&self, on: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
@@ -74,6 +80,10 @@ trait RogBios {
|
|||||||
#[dbus_proxy(signal)]
|
#[dbus_proxy(signal)]
|
||||||
fn notify_panel_od(&self, overdrive: bool) -> zbus::Result<()>;
|
fn notify_panel_od(&self, overdrive: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
|
/// NotifyMiniLedMode signal
|
||||||
|
#[dbus_proxy(signal)]
|
||||||
|
fn notify_mini_led_mode(&self, on: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// NotifyPostBootSound signal
|
/// NotifyPostBootSound signal
|
||||||
#[inline]
|
#[inline]
|
||||||
#[dbus_proxy(signal)]
|
#[dbus_proxy(signal)]
|
||||||
|
|||||||
@@ -34,11 +34,23 @@ impl HidRaw {
|
|||||||
if let Some(parent) = parent.attribute_value("idProduct") {
|
if let Some(parent) = parent.attribute_value("idProduct") {
|
||||||
if parent == id_product {
|
if parent == id_product {
|
||||||
if let Some(dev_node) = device.devnode() {
|
if let Some(dev_node) = device.devnode() {
|
||||||
info!("Using device at: {:?} for LED control", dev_node);
|
info!("Using device at: {:?} for hidraw control", dev_node);
|
||||||
return Ok(Self(dev_node.to_owned()));
|
return Ok(Self(dev_node.to_owned()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Try to see if there is a virtual device created with uhid for testing
|
||||||
|
let dev_path = device.devpath().to_string_lossy();
|
||||||
|
if dev_path.contains("virtual") && dev_path.contains(&id_product.to_uppercase()) {
|
||||||
|
if let Some(dev_node) = device.devnode() {
|
||||||
|
info!(
|
||||||
|
"Using device at: {:?} for <TODO: label control> control",
|
||||||
|
dev_node
|
||||||
|
);
|
||||||
|
return Ok(Self(dev_node.to_owned()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(PlatformError::MissingFunction(format!(
|
Err(PlatformError::MissingFunction(format!(
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ macro_rules! watch_attr {
|
|||||||
let mut path = self.$item.clone();
|
let mut path = self.$item.clone();
|
||||||
path.push($attr_name);
|
path.push($attr_name);
|
||||||
if let Some(path) = path.to_str() {
|
if let Some(path) = path.to_str() {
|
||||||
let mut inotify = inotify::Inotify::init()?;
|
let inotify = inotify::Inotify::init()?;
|
||||||
inotify.add_watch(path, inotify::WatchMask::CLOSE_WRITE)
|
inotify.watches().add(path, inotify::WatchMask::CLOSE_WRITE | inotify::WatchMask::MODIFY)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
if e.kind() == std::io::ErrorKind::NotFound {
|
if e.kind() == std::io::ErrorKind::NotFound {
|
||||||
PlatformError::AttrNotFound(format!("{}", $attr_name))
|
PlatformError::AttrNotFound(format!("{}", $attr_name))
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ impl AsusPlatform {
|
|||||||
|
|
||||||
attr_bool!("panel_od", path);
|
attr_bool!("panel_od", path);
|
||||||
|
|
||||||
|
attr_bool!("mini_led_mode", path);
|
||||||
|
|
||||||
attr_bool!("gpu_mux_mode", path);
|
attr_bool!("gpu_mux_mode", path);
|
||||||
|
|
||||||
// This is technically the same as `platform_profile` since both are tied
|
// This is technically the same as `platform_profile` since both are tied
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ pub struct RogBiosSupportedFunctions {
|
|||||||
pub panel_overdrive: bool,
|
pub panel_overdrive: bool,
|
||||||
pub dgpu_disable: bool,
|
pub dgpu_disable: bool,
|
||||||
pub egpu_enable: bool,
|
pub egpu_enable: bool,
|
||||||
|
pub mini_led_mode: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for SupportedFunctions {
|
impl fmt::Display for SupportedFunctions {
|
||||||
@@ -112,6 +113,7 @@ impl fmt::Display for RogBiosSupportedFunctions {
|
|||||||
writeln!(f, "ROG BIOS:")?;
|
writeln!(f, "ROG BIOS:")?;
|
||||||
writeln!(f, "\tPOST sound switch: {}", self.post_sound)?;
|
writeln!(f, "\tPOST sound switch: {}", self.post_sound)?;
|
||||||
writeln!(f, "\tPanel Overdrive: {}", self.panel_overdrive)?;
|
writeln!(f, "\tPanel Overdrive: {}", self.panel_overdrive)?;
|
||||||
|
writeln!(f, "\tMiniLED backlight: {}", self.mini_led_mode)?;
|
||||||
writeln!(f, "\tdGPU disable switch: {}", self.dgpu_disable)?;
|
writeln!(f, "\tdGPU disable switch: {}", self.dgpu_disable)?;
|
||||||
writeln!(f, "\teGPU enable switch: {}", self.egpu_enable)?;
|
writeln!(f, "\teGPU enable switch: {}", self.egpu_enable)?;
|
||||||
writeln!(f, "\tGPU MUX control: {}", self.gpu_mux)?;
|
writeln!(f, "\tGPU MUX control: {}", self.gpu_mux)?;
|
||||||
|
|||||||
@@ -71,6 +71,15 @@ impl Profile {
|
|||||||
_ => Self::Balanced,
|
_ => Self::Balanced,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_next_profile(current: Profile) -> Profile {
|
||||||
|
// Read first just incase the user has modified the config before calling this
|
||||||
|
match current {
|
||||||
|
Profile::Balanced => Profile::Performance,
|
||||||
|
Profile::Performance => Profile::Quiet,
|
||||||
|
Profile::Quiet => Profile::Balanced,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Profile {
|
impl Default for Profile {
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
[package]
|
||||||
|
name = "rog_simulators"
|
||||||
|
license = "MPL-2.0"
|
||||||
|
version.workspace = true
|
||||||
|
readme = "README.md"
|
||||||
|
authors = ["Luke <luke@ljones.dev>"]
|
||||||
|
repository = "https://gitlab.com/asus-linux/asus-nb-ctrl"
|
||||||
|
homepage = "https://gitlab.com/asus-linux/asus-nb-ctrl"
|
||||||
|
documentation = "https://docs.rs/rog-anime"
|
||||||
|
edition = "2021"
|
||||||
|
exclude = ["data"]
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "anime_sim"
|
||||||
|
path = "src/simulator.rs"
|
||||||
|
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
log.workspace = true
|
||||||
|
|
||||||
|
glam.workspace = true
|
||||||
|
|
||||||
|
uhid-virt = "^0.0.6"
|
||||||
|
|
||||||
|
rog_anime = { path = "../rog-anime", features = ["dbus"] }
|
||||||
|
|
||||||
|
[dependencies.sdl2]
|
||||||
|
version = "0.35"
|
||||||
|
default-features = false
|
||||||
|
features = ["gfx"]
|
||||||
@@ -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.
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
use super::Row;
|
||||||
|
|
||||||
|
pub const GA401: [Row; 63] = [
|
||||||
|
Row(0x01, 7, 32, 0),
|
||||||
|
Row(0x01, 7 + 34, 32, 0),
|
||||||
|
Row(0x01, 7 + 68, 32, 0),
|
||||||
|
Row(0x01, 7 + 102, 32, 0), // 34 len
|
||||||
|
Row(0x01, 7 + 136, 32, 0),
|
||||||
|
Row(0x01, 7 + 170, 34, 0),
|
||||||
|
Row(0x01, 7 + 204, 34, 0),
|
||||||
|
Row(0x01, 7 + 238, 34, 0),
|
||||||
|
Row(0x01, 7 + 272, 34, 0),
|
||||||
|
Row(0x01, 7 + 306, 34, 0),
|
||||||
|
Row(0x01, 7 + 340, 34, 0),
|
||||||
|
Row(0x01, 7 + 374, 34, 0),
|
||||||
|
Row(0x01, 7 + 408, 33, 1),
|
||||||
|
Row(0x01, 7 + 441, 33, 1),
|
||||||
|
Row(0x01, 7 + 474, 32, 2),
|
||||||
|
Row(0x01, 7 + 506, 32, 2),
|
||||||
|
Row(0x01, 7 + 538, 31, 3),
|
||||||
|
Row(0x01, 7 + 569, 31, 3),
|
||||||
|
Row(0x01, 7 + 600, 28, 4),
|
||||||
|
//
|
||||||
|
Row(0x74, 7 + 1, 3, 28 + 4), // adds to end of previous
|
||||||
|
Row(0x74, 7 + 3, 30, 4),
|
||||||
|
Row(0x74, 7 + 33, 29, 5),
|
||||||
|
Row(0x74, 7 + 62, 29, 5),
|
||||||
|
Row(0x74, 7 + 91, 28, 6),
|
||||||
|
Row(0x74, 7 + 119, 28, 6),
|
||||||
|
Row(0x74, 7 + 147, 27, 7),
|
||||||
|
Row(0x74, 7 + 174, 27, 7),
|
||||||
|
Row(0x74, 7 + 202, 26, 9),
|
||||||
|
Row(0x74, 7 + 228, 26, 9),
|
||||||
|
Row(0x74, 7 + 254, 25, 10),
|
||||||
|
Row(0x74, 7 + 278, 25, 9), // WEIRD OFFSET
|
||||||
|
Row(0x74, 7 + 303, 24, 10),
|
||||||
|
Row(0x74, 7 + 327, 24, 10),
|
||||||
|
Row(0x74, 7 + 351, 23, 11),
|
||||||
|
Row(0x74, 7 + 374, 23, 11),
|
||||||
|
Row(0x74, 7 + 397, 22, 12),
|
||||||
|
Row(0x74, 7 + 419, 22, 12),
|
||||||
|
Row(0x74, 7 + 441, 21, 13),
|
||||||
|
Row(0x74, 7 + 462, 21, 13),
|
||||||
|
Row(0x74, 7 + 483, 20, 14),
|
||||||
|
Row(0x74, 7 + 503, 20, 14),
|
||||||
|
Row(0x74, 7 + 523, 19, 15),
|
||||||
|
Row(0x74, 7 + 542, 19, 15),
|
||||||
|
Row(0x74, 7 + 561, 18, 16),
|
||||||
|
Row(0x74, 7 + 579, 18, 16),
|
||||||
|
Row(0x74, 7 + 597, 17, 17),
|
||||||
|
Row(0x74, 7 + 614, 13, 17),
|
||||||
|
//
|
||||||
|
Row(0xe7, 7 + 1, 4, 13 + 18), // adds to end of previous
|
||||||
|
Row(0xe7, 7 + 4, 16, 18),
|
||||||
|
Row(0xe7, 7 + 20, 16, 18),
|
||||||
|
Row(0xe7, 7 + 36, 15, 19),
|
||||||
|
Row(0xe7, 7 + 51, 15, 19),
|
||||||
|
Row(0xe7, 7 + 66, 14, 20),
|
||||||
|
Row(0xe7, 7 + 80, 12, 20), // too long? 14
|
||||||
|
Row(0xe7, 7 + 94, 13, 21),
|
||||||
|
Row(0xe7, 7 + 107, 13, 21),
|
||||||
|
Row(0xe7, 7 + 120, 12, 12), // Actual display end
|
||||||
|
Row(0xe7, 7 + 132, 12, 22),
|
||||||
|
Row(0xe7, 7 + 144, 11, 23),
|
||||||
|
Row(0xe7, 7 + 155, 11, 23),
|
||||||
|
Row(0xe7, 7 + 166, 10, 24),
|
||||||
|
Row(0xe7, 7 + 176, 10, 24),
|
||||||
|
Row(0xe7, 7 + 186, 9, 25),
|
||||||
|
];
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
use super::Row;
|
||||||
|
|
||||||
|
// 7 is included as start point
|
||||||
|
pub const GA402: [Row; 63] = [
|
||||||
|
Row(0x01, 7, 32, 0),
|
||||||
|
Row(0x01, 7 + 34, 32, 0),
|
||||||
|
Row(0x01, 7 + 68, 32, 0),
|
||||||
|
Row(0x01, 7 + 102, 32, 0), // 34 len
|
||||||
|
Row(0x01, 7 + 136, 32, 0),
|
||||||
|
Row(0x01, 7 + 170, 34, 0),
|
||||||
|
Row(0x01, 7 + 204, 34, 0),
|
||||||
|
Row(0x01, 7 + 238, 34, 0),
|
||||||
|
Row(0x01, 7 + 272, 34, 0),
|
||||||
|
Row(0x01, 7 + 306, 34, 0),
|
||||||
|
Row(0x01, 7 + 340, 34, 0),
|
||||||
|
Row(0x01, 7 + 374, 34, 0),
|
||||||
|
Row(0x01, 7 + 408, 33, 1),
|
||||||
|
Row(0x01, 7 + 441, 33, 1),
|
||||||
|
Row(0x01, 7 + 474, 32, 2),
|
||||||
|
Row(0x01, 7 + 506, 32, 2),
|
||||||
|
Row(0x01, 7 + 538, 31, 3),
|
||||||
|
Row(0x01, 7 + 569, 31, 3),
|
||||||
|
Row(0x01, 7 + 600, 28, 4),
|
||||||
|
//
|
||||||
|
Row(0x74, 7, 3, 28 + 3), // adds to end of previous
|
||||||
|
Row(0x74, 7 + 3, 30, 4),
|
||||||
|
Row(0x74, 7 + 33, 29, 5),
|
||||||
|
Row(0x74, 7 + 62, 29, 5),
|
||||||
|
Row(0x74, 7 + 91, 28, 6),
|
||||||
|
Row(0x74, 7 + 119, 28, 6),
|
||||||
|
Row(0x74, 7 + 147, 27, 7),
|
||||||
|
Row(0x74, 7 + 174, 27, 7),
|
||||||
|
Row(0x74, 7 + 202, 26, 9),
|
||||||
|
Row(0x74, 7 + 228, 26, 9),
|
||||||
|
Row(0x74, 7 + 254, 25, 10),
|
||||||
|
Row(0x74, 7 + 278, 25, 9), // WEIRD OFFSET
|
||||||
|
Row(0x74, 7 + 303, 24, 10),
|
||||||
|
Row(0x74, 7 + 327, 24, 10),
|
||||||
|
Row(0x74, 7 + 351, 23, 11),
|
||||||
|
Row(0x74, 7 + 374, 23, 11),
|
||||||
|
Row(0x74, 7 + 397, 22, 12),
|
||||||
|
Row(0x74, 7 + 419, 22, 12),
|
||||||
|
Row(0x74, 7 + 441, 21, 13),
|
||||||
|
Row(0x74, 7 + 462, 21, 13),
|
||||||
|
Row(0x74, 7 + 483, 20, 14),
|
||||||
|
Row(0x74, 7 + 503, 20, 14),
|
||||||
|
Row(0x74, 7 + 523, 19, 15),
|
||||||
|
Row(0x74, 7 + 542, 19, 15),
|
||||||
|
Row(0x74, 7 + 561, 18, 16),
|
||||||
|
Row(0x74, 7 + 579, 18, 16),
|
||||||
|
Row(0x74, 7 + 597, 17, 17),
|
||||||
|
Row(0x74, 7 + 614, 13, 17),
|
||||||
|
//
|
||||||
|
Row(0xe7, 7, 4, 13 + 17), // adds to end of previous
|
||||||
|
Row(0xe7, 7 + 4, 16, 18),
|
||||||
|
Row(0xe7, 7 + 20, 16, 18),
|
||||||
|
Row(0xe7, 7 + 36, 15, 19),
|
||||||
|
Row(0xe7, 7 + 51, 15, 19),
|
||||||
|
Row(0xe7, 7 + 66, 14, 20),
|
||||||
|
Row(0xe7, 7 + 80, 12, 20), // too long? 14
|
||||||
|
Row(0xe7, 7 + 94, 13, 21),
|
||||||
|
Row(0xe7, 7 + 107, 13, 21),
|
||||||
|
Row(0xe7, 7 + 120, 12, 12), // Actual display end
|
||||||
|
Row(0xe7, 7 + 132, 12, 22),
|
||||||
|
Row(0xe7, 7 + 144, 11, 23),
|
||||||
|
Row(0xe7, 7 + 155, 11, 23),
|
||||||
|
Row(0xe7, 7 + 166, 10, 24),
|
||||||
|
Row(0xe7, 7 + 176, 10, 24),
|
||||||
|
Row(0xe7, 7 + 186, 9, 25),
|
||||||
|
];
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
use super::Row;
|
||||||
|
|
||||||
|
pub const GU604: [Row; 64] = [
|
||||||
|
Row(0x01, 7, 37, 1),
|
||||||
|
Row(0x01, 7 + 38, 39, 0),
|
||||||
|
Row(0x01, 7 + 77, 38, 1),
|
||||||
|
Row(0x01, 7 + 115, 39, 0),
|
||||||
|
Row(0x01, 7 + 154, 38, 1),
|
||||||
|
Row(0x01, 7 + 192, 39, 0),
|
||||||
|
Row(0x01, 7 + 231, 38, 1),
|
||||||
|
Row(0x01, 7 + 269, 39, 0),
|
||||||
|
Row(0x01, 7 + 308, 38, 1),
|
||||||
|
Row(0x01, 7 + 346, 39, 0),
|
||||||
|
Row(0x01, 7 + 385, 38, 1),
|
||||||
|
Row(0x01, 7 + 423, 38, 1),
|
||||||
|
Row(0x01, 7 + 461, 37, 2),
|
||||||
|
Row(0x01, 7 + 498, 37, 2),
|
||||||
|
Row(0x01, 7 + 535, 36, 3),
|
||||||
|
Row(0x01, 7 + 571, 36, 3),
|
||||||
|
Row(0x01, 7 + 607, 21, 4), // needs join
|
||||||
|
//
|
||||||
|
Row(0x74, 7, 14, 24), // adds to end of previous
|
||||||
|
Row(0x74, 7 + 15, 35, 4),
|
||||||
|
Row(0x74, 7 + 50, 34, 5),
|
||||||
|
Row(0x74, 7 + 84, 34, 5),
|
||||||
|
Row(0x74, 7 + 118, 33, 6),
|
||||||
|
Row(0x74, 7 + 151, 33, 6),
|
||||||
|
Row(0x74, 7 + 184, 32, 7),
|
||||||
|
Row(0x74, 7 + 216, 32, 7),
|
||||||
|
Row(0x74, 7 + 248, 31, 8),
|
||||||
|
Row(0x74, 7 + 279, 31, 8),
|
||||||
|
Row(0x74, 7 + 310, 30, 9),
|
||||||
|
Row(0x74, 7 + 340, 30, 9),
|
||||||
|
Row(0x74, 7 + 370, 29, 10),
|
||||||
|
Row(0x74, 7 + 399, 29, 10),
|
||||||
|
Row(0x74, 7 + 428, 28, 11),
|
||||||
|
Row(0x74, 7 + 456, 28, 11),
|
||||||
|
Row(0x74, 7 + 484, 27, 12),
|
||||||
|
Row(0x74, 7 + 511, 27, 12),
|
||||||
|
Row(0x74, 7 + 538, 26, 13),
|
||||||
|
Row(0x74, 7 + 564, 26, 13),
|
||||||
|
Row(0x74, 7 + 590, 25, 14),
|
||||||
|
Row(0x74, 7 + 615, 12, 14), // needs join
|
||||||
|
//
|
||||||
|
Row(0xe7, 7, 12, 25), // adds to end of previous
|
||||||
|
Row(0xe7, 7 + 13, 24, 15),
|
||||||
|
Row(0xe7, 7 + 37, 24, 15),
|
||||||
|
Row(0xe7, 7 + 61, 23, 16),
|
||||||
|
Row(0xe7, 7 + 84, 23, 16),
|
||||||
|
Row(0xe7, 7 + 107, 22, 17),
|
||||||
|
Row(0xe7, 7 + 129, 22, 17),
|
||||||
|
Row(0xe7, 7 + 151, 21, 18),
|
||||||
|
Row(0xe7, 7 + 172, 21, 18),
|
||||||
|
Row(0xe7, 7 + 193, 20, 19),
|
||||||
|
Row(0xe7, 7 + 213, 20, 19),
|
||||||
|
Row(0xe7, 7 + 233, 19, 20),
|
||||||
|
Row(0xe7, 7 + 252, 19, 20),
|
||||||
|
Row(0xe7, 7 + 271, 18, 21),
|
||||||
|
Row(0xe7, 7 + 289, 18, 21),
|
||||||
|
Row(0xe7, 7 + 307, 17, 22),
|
||||||
|
Row(0xe7, 7 + 324, 17, 22),
|
||||||
|
Row(0xe7, 7 + 341, 16, 23),
|
||||||
|
Row(0xe7, 7 + 357, 16, 23),
|
||||||
|
Row(0xe7, 7 + 373, 15, 24),
|
||||||
|
Row(0xe7, 7 + 388, 15, 24),
|
||||||
|
Row(0xe7, 7 + 403, 14, 25),
|
||||||
|
Row(0xe7, 7 + 417, 14, 25),
|
||||||
|
Row(0xe7, 7 + 431, 13, 26),
|
||||||
|
Row(0xe7, 7 + 444, 13, 26),
|
||||||
|
];
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
use rog_anime::AnimeType;
|
||||||
|
|
||||||
|
use self::map_ga401::GA401;
|
||||||
|
use self::map_ga402::GA402;
|
||||||
|
use self::map_gu604::GU604;
|
||||||
|
|
||||||
|
mod map_ga401;
|
||||||
|
mod map_ga402;
|
||||||
|
mod map_gu604;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct Row(
|
||||||
|
/// The USB packet index, this is mapped to the 4th byte (idx = 3) and is
|
||||||
|
/// one of (in order of packets): 1. `0x01`
|
||||||
|
/// 2. `0x74`
|
||||||
|
/// 3. `0xe7`
|
||||||
|
pub u8,
|
||||||
|
/// Starting index in that packet
|
||||||
|
pub usize,
|
||||||
|
/// The length to read inclusive
|
||||||
|
pub usize,
|
||||||
|
/// Offset to the right by how many LEDs
|
||||||
|
pub i32,
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct LedShape {
|
||||||
|
/// Vertical offset from center for the top/bottom points
|
||||||
|
pub vertical: i32,
|
||||||
|
/// Horizontal offset from center for the top/bottom points
|
||||||
|
pub horizontal: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct AniMatrix {
|
||||||
|
rows: Vec<Row>,
|
||||||
|
led_shape: LedShape,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AniMatrix {
|
||||||
|
pub fn new(model: AnimeType) -> Self {
|
||||||
|
let led_shape = match model {
|
||||||
|
AnimeType::GA401 => LedShape {
|
||||||
|
vertical: 2,
|
||||||
|
horizontal: 5,
|
||||||
|
},
|
||||||
|
AnimeType::GA402 | AnimeType::Unknown => LedShape {
|
||||||
|
vertical: 2,
|
||||||
|
horizontal: 5,
|
||||||
|
},
|
||||||
|
AnimeType::GU604 => LedShape {
|
||||||
|
vertical: 2,
|
||||||
|
horizontal: 5,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// Do a hard mapping of each (derived from wireshardk captures)
|
||||||
|
let rows = match model {
|
||||||
|
AnimeType::GA401 => GA401.to_vec(),
|
||||||
|
AnimeType::GA402 | AnimeType::Unknown => GA402.to_vec(),
|
||||||
|
AnimeType::GU604 => GU604.to_vec(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Self { rows, led_shape }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn rows(&self) -> &[Row] {
|
||||||
|
&self.rows
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn led_shape(&self) -> LedShape {
|
||||||
|
self.led_shape
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,193 @@
|
|||||||
|
use std::env;
|
||||||
|
use std::error::Error;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use log::error;
|
||||||
|
use rog_anime::usb::{PROD_ID, VENDOR_ID};
|
||||||
|
use rog_anime::{AnimeType, USB_PREFIX2};
|
||||||
|
use sdl2::event::Event;
|
||||||
|
use sdl2::keyboard::Keycode;
|
||||||
|
use sdl2::pixels::Color;
|
||||||
|
use sdl2::rect::Rect;
|
||||||
|
use uhid_virt::{Bus, CreateParams, UHIDDevice};
|
||||||
|
|
||||||
|
mod animatrix;
|
||||||
|
use animatrix::*;
|
||||||
|
|
||||||
|
pub struct VirtAnimeMatrix {
|
||||||
|
device: UHIDDevice<std::fs::File>,
|
||||||
|
buffer: [u8; 640],
|
||||||
|
animatrix: AniMatrix,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VirtAnimeMatrix {
|
||||||
|
pub fn new(model: AnimeType) -> Self {
|
||||||
|
VirtAnimeMatrix {
|
||||||
|
buffer: [0; 640],
|
||||||
|
animatrix: AniMatrix::new(model),
|
||||||
|
device: UHIDDevice::create(CreateParams {
|
||||||
|
name: String::from("ROG_Virtual Anime Matrix"),
|
||||||
|
phys: String::from(""),
|
||||||
|
uniq: String::from(""),
|
||||||
|
bus: Bus::USB,
|
||||||
|
vendor: VENDOR_ID as u32,
|
||||||
|
product: PROD_ID as u32,
|
||||||
|
version: 0,
|
||||||
|
country: 0,
|
||||||
|
// This is a device which emits the usage code as a whole, rather than as bits
|
||||||
|
rd_data: [
|
||||||
|
0x06, 0x31, 0xff, // Usage Page (Vendor Defined 0xFF31)
|
||||||
|
0x09, 0x76, // Usage (0x76)
|
||||||
|
0xa1, 0x01, // Collection (Application)
|
||||||
|
0x85, 0x5a, // Report ID (90)
|
||||||
|
0x19, 0x00, // Usage Minimum (0x00)
|
||||||
|
0x2a, 0xff, 0x00, // Usage Maximum (0xFF)
|
||||||
|
0x15, 0x00, // Logical Minimum (0)
|
||||||
|
0x26, 0xff, 0x00, // Logical Maximum (255)
|
||||||
|
0x75, 0x08, // Report Size (8)
|
||||||
|
0x95, 0x05, // Report Count (5)
|
||||||
|
0x81,
|
||||||
|
0x00, /* Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null
|
||||||
|
* Position) */
|
||||||
|
0x19, 0x00, // Usage Minimum (0x00)
|
||||||
|
0x2a, 0xff, 0x00, // Usage Maximum (0xFF)
|
||||||
|
0x15, 0x00, // Logical Minimum (0)
|
||||||
|
0x26, 0xff, 0x00, // Logical Maximum (255)
|
||||||
|
0x75, 0x08, // Report Size (8)
|
||||||
|
0x95, 0x3f, // Report Count (63)
|
||||||
|
0xb1,
|
||||||
|
0x00, /* Feature (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null
|
||||||
|
* Position,Non-volatile) */
|
||||||
|
0xc0, // End Collection
|
||||||
|
0x06, 0x31, 0xff, // Usage Page (Vendor Defined 0xFF31)
|
||||||
|
0x09, 0x80, // Usage (0x80)
|
||||||
|
0xa1, 0x01, // Collection (Application)
|
||||||
|
0x85, 0x5e, // Report ID (94)
|
||||||
|
0x19, 0x00, // Usage Minimum (0x00)
|
||||||
|
0x2a, 0xff, 0x00, // Usage Maximum (0xFF)
|
||||||
|
0x15, 0x00, // Logical Minimum (0)
|
||||||
|
0x26, 0xff, 0x00, // Logical Maximum (255)
|
||||||
|
0x75, 0x08, // Report Size (8)
|
||||||
|
0x95, 0x05, // Report Count (5)
|
||||||
|
0x81,
|
||||||
|
0x00, /* Input (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null
|
||||||
|
* Position) */
|
||||||
|
0x19, 0x00, // Usage Minimum (0x00)
|
||||||
|
0x2a, 0xff, 0x00, // Usage Maximum (0xFF)
|
||||||
|
0x15, 0x00, // Logical Minimum (0)
|
||||||
|
0x26, 0xff, 0x00, // Logical Maximum (255)
|
||||||
|
0x96, 0x7f, 0x02, // Report Count (639)
|
||||||
|
0xb1,
|
||||||
|
0x00, /* Feature (Data,Array,Abs,No Wrap,Linear,Preferred State,No Null
|
||||||
|
* Position,Non-volatile) */
|
||||||
|
0xc0, /* End Collection */
|
||||||
|
|
||||||
|
/* 85 bytes */
|
||||||
|
]
|
||||||
|
.to_vec(),
|
||||||
|
})
|
||||||
|
.map_err(|err| error!("Could not create virtual device: {:?}", err))
|
||||||
|
.expect("Could not create virtual device"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /// A single on/off key press
|
||||||
|
// pub fn press(&mut self, input: [u8; 32]) {
|
||||||
|
// self.device.write(&input).unwrap();
|
||||||
|
// let mut reset = [0u8; 32];
|
||||||
|
// reset[0] = input[0];
|
||||||
|
// self.device.write(&reset).unwrap();
|
||||||
|
// }
|
||||||
|
|
||||||
|
pub fn read(&mut self) {
|
||||||
|
if let Ok(uhid_virt::OutputEvent::Output { data }) = self.device.read() {
|
||||||
|
for (i, b) in self.buffer.iter_mut().enumerate() {
|
||||||
|
*b = 0;
|
||||||
|
if let Some(n) = data.get(i) {
|
||||||
|
*b = *n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
if args.len() <= 1 {
|
||||||
|
println!("Must supply arg, one of <GA401, GA402, GU604>");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
let anime_type = AnimeType::from_str(&args[1])?;
|
||||||
|
|
||||||
|
let sdl_context = sdl2::init().unwrap();
|
||||||
|
let video_subsystem = sdl_context.video().unwrap();
|
||||||
|
|
||||||
|
let window = video_subsystem
|
||||||
|
.window("rust-sdl2 demo", 1260, 760)
|
||||||
|
.position_centered()
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let mut canvas = window.into_canvas().build().unwrap();
|
||||||
|
|
||||||
|
let mut dev = VirtAnimeMatrix::new(anime_type);
|
||||||
|
|
||||||
|
canvas.set_draw_color(Color::RGB(0, 0, 0));
|
||||||
|
canvas.clear();
|
||||||
|
let mut event_pump = sdl_context.event_pump().unwrap();
|
||||||
|
'running: loop {
|
||||||
|
dev.read(); // it's blocking, and damned hard to sync with arc/mutex
|
||||||
|
// let one = dev.buffer[0..7] != USB_PREFIX2;
|
||||||
|
let index = dev.buffer[3];
|
||||||
|
|
||||||
|
let w = dev.animatrix.led_shape().horizontal * 6;
|
||||||
|
let h = dev.animatrix.led_shape().vertical * 6;
|
||||||
|
let mut y_offset = 0;
|
||||||
|
for (y_count, row) in dev.animatrix.rows().iter().enumerate() {
|
||||||
|
if row.0 == index {
|
||||||
|
let start = row.1;
|
||||||
|
let end = start + row.2;
|
||||||
|
if row.1 < 10 && row.2 < 15 {
|
||||||
|
if index == 0x74 {
|
||||||
|
y_offset = 1;
|
||||||
|
} else if index == 0xe7 {
|
||||||
|
y_offset = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (x_count, b) in dev.buffer[start..=end].iter().enumerate() {
|
||||||
|
canvas.set_draw_color(Color::RGB(*b as u8, *b as u8, *b as u8));
|
||||||
|
|
||||||
|
let x: i32 = w + x_count as i32 * w
|
||||||
|
- if (y_count + y_offset as usize) % 2 != 0 {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
w / 2
|
||||||
|
}
|
||||||
|
+ row.3 * w;
|
||||||
|
let y = y_count as i32 * h - y_offset * h;
|
||||||
|
canvas
|
||||||
|
.fill_rect(Rect::new(x, y, w as u32, h as u32))
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for event in event_pump.poll_iter() {
|
||||||
|
match event {
|
||||||
|
Event::Quit { .. }
|
||||||
|
| Event::KeyDown {
|
||||||
|
keycode: Some(Keycode::Escape),
|
||||||
|
..
|
||||||
|
} => break 'running,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if dev.buffer[0..7] == USB_PREFIX2 {
|
||||||
|
canvas.present();
|
||||||
|
}
|
||||||
|
// ::std::thread::sleep(Duration::from_millis(50));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||