mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Test bmp display
This commit is contained in:
20
Cargo.lock
generated
20
Cargo.lock
generated
@@ -680,6 +680,8 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
"tinybmp",
|
||||||
|
"yansi-term",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -885,6 +887,15 @@ dependencies = [
|
|||||||
"lazy_static",
|
"lazy_static",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tinybmp"
|
||||||
|
version = "0.2.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "781e52493917138f60c3b98b95e39967eafd28d3c470d0d35ae020b47f011b5d"
|
||||||
|
dependencies = [
|
||||||
|
"nom",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "0.2.20"
|
version = "0.2.20"
|
||||||
@@ -1042,3 +1053,12 @@ checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yansi-term"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|||||||
@@ -15,3 +15,7 @@ dbus = { version = "^0.8.2" }
|
|||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
thiserror = "^1.0.15"
|
thiserror = "^1.0.15"
|
||||||
|
yansi-term = "0.1.2"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
tinybmp = "0.2.3"
|
||||||
@@ -1,34 +1,39 @@
|
|||||||
use rog_aura::{AniMeDbusWriter, AniMeMatrix, AniMePacketType};
|
use rog_aura::{AniMeDbusWriter, AniMeMatrix, AniMePacketType, HEIGHT, WIDTH};
|
||||||
|
use tinybmp::{Bmp, Pixel};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut writer = AniMeDbusWriter::new().unwrap();
|
let mut writer = AniMeDbusWriter::new().unwrap();
|
||||||
|
|
||||||
// loop {
|
let bmp = Bmp::from_slice(include_bytes!("test.bmp")).expect("Failed to parse BMP image");
|
||||||
// for brightness in 0xFE..0xFF {
|
let pixels: Vec<Pixel> = bmp.into_iter().collect();
|
||||||
// let mut matrix = AniMeMatrix::new();
|
//assert_eq!(pixels.len(), 56 * 56);
|
||||||
// matrix.fill_with(brightness);
|
|
||||||
|
|
||||||
// let mut matrix: AniMePacketType = AniMePacketType::from(matrix);
|
|
||||||
// // println!("{:?}", matrix[0].to_vec());
|
|
||||||
// // println!("{:?}", matrix[1].to_vec());
|
|
||||||
|
|
||||||
// writer.write_image(&mut matrix).unwrap();
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Try an outline, top and right
|
// Try an outline, top and right
|
||||||
let mut matrix = AniMeMatrix::new();
|
let mut matrix = AniMeMatrix::new();
|
||||||
{
|
|
||||||
let tmp = matrix.get_mut();
|
// Aligned left
|
||||||
for row in tmp.iter_mut() {
|
for px in pixels {
|
||||||
row[row.len() - 1] = 0xff;
|
if (px.x as usize) < WIDTH {
|
||||||
|
matrix.get_mut()[px.y as usize][px.x as usize] = px.color as u8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Throw an alignment border up
|
||||||
|
// {
|
||||||
|
// let tmp = matrix.get_mut();
|
||||||
|
// for x in tmp[0].iter_mut() {
|
||||||
|
// *x = 0xff;
|
||||||
|
// }
|
||||||
|
// for row in tmp.iter_mut() {
|
||||||
|
// row[row.len() - 1] = 0xff;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
matrix.debug_print();
|
||||||
|
|
||||||
let mut matrix: AniMePacketType = AniMePacketType::from(matrix);
|
let mut matrix: AniMePacketType = AniMePacketType::from(matrix);
|
||||||
println!("{:?}", matrix[0].to_vec());
|
// println!("{:?}", matrix[0].to_vec());
|
||||||
println!("{:?}", matrix[1].to_vec());
|
// println!("{:?}", matrix[1].to_vec());
|
||||||
|
|
||||||
writer.write_image(&mut matrix).unwrap();
|
writer.write_image(&mut matrix).unwrap();
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
aura/examples/rust.bmp
Normal file
BIN
aura/examples/rust.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.6 KiB |
BIN
aura/examples/test-skinny-45deg.bmp
Normal file
BIN
aura/examples/test-skinny-45deg.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
BIN
aura/examples/test.bmp
Normal file
BIN
aura/examples/test.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
@@ -4,6 +4,7 @@ pub type AniMeBufferType = [[u8; WIDTH]; HEIGHT];
|
|||||||
pub type AniMePacketType = [[u8; 640]; 2];
|
pub type AniMePacketType = [[u8; 640]; 2];
|
||||||
const BLOCK_START: usize = 7;
|
const BLOCK_START: usize = 7;
|
||||||
const BLOCK_END: usize = 634;
|
const BLOCK_END: usize = 634;
|
||||||
|
use yansi_term::Colour::RGB;
|
||||||
|
|
||||||
pub struct AniMeMatrix(AniMeBufferType);
|
pub struct AniMeMatrix(AniMeBufferType);
|
||||||
|
|
||||||
@@ -27,6 +28,60 @@ impl AniMeMatrix {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn debug_print(&self) {
|
||||||
|
// this is the index from right. It is used to progressively shorten rows
|
||||||
|
let mut prog_row_len = WIDTH - 2;
|
||||||
|
|
||||||
|
for (count, row) in self.0.iter().enumerate() {
|
||||||
|
// Write the top block of LEDs (first 7 rows)
|
||||||
|
if count < 6 {
|
||||||
|
if count % 2 != 0 {
|
||||||
|
print!(" ");
|
||||||
|
} else if count == 0 {
|
||||||
|
print!(" ");
|
||||||
|
} else {
|
||||||
|
print!(" ");
|
||||||
|
}
|
||||||
|
let tmp = if count == 0 || count == 1 || count == 3 || count == 5 {
|
||||||
|
row[1..].iter()
|
||||||
|
} else {
|
||||||
|
row.iter()
|
||||||
|
};
|
||||||
|
for x in tmp {
|
||||||
|
print!(" {}", RGB(*x, *x, *x).paint(&format!("{:#04X}", x)));
|
||||||
|
}
|
||||||
|
|
||||||
|
print!("\n");
|
||||||
|
} else {
|
||||||
|
// Switch to next block (looks like )
|
||||||
|
if count % 2 != 0 {
|
||||||
|
// Row after 6 is only 1 less, then rows after 7 follow pattern
|
||||||
|
if count == 7 {
|
||||||
|
prog_row_len -= 1;
|
||||||
|
} else {
|
||||||
|
prog_row_len -= 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
prog_row_len += 1; // if count 6, 0
|
||||||
|
}
|
||||||
|
|
||||||
|
let index = row.len() - prog_row_len;
|
||||||
|
|
||||||
|
if count % 2 == 0 {
|
||||||
|
print!(" ");
|
||||||
|
}
|
||||||
|
for (i, x) in row.iter().enumerate() {
|
||||||
|
if i >= index {
|
||||||
|
print!(" {}", RGB(*x, *x, *x).paint(&format!("{:#04X}", x)));
|
||||||
|
} else {
|
||||||
|
print!(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print!("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<AniMeMatrix> for AniMePacketType {
|
impl From<AniMeMatrix> for AniMePacketType {
|
||||||
@@ -39,32 +94,38 @@ impl From<AniMeMatrix> for AniMePacketType {
|
|||||||
let mut write_index = BLOCK_START;
|
let mut write_index = BLOCK_START;
|
||||||
let mut write_block = &mut buffers[0];
|
let mut write_block = &mut buffers[0];
|
||||||
let mut block1_done = false;
|
let mut block1_done = false;
|
||||||
let mut phys_row_len = WIDTH - 1; // not taking in to account starting at 0
|
|
||||||
|
// this is the index from right. It is used to progressively shorten rows
|
||||||
|
let mut prog_row_len = WIDTH - 2;
|
||||||
|
|
||||||
for (count, row) in anime.0.iter().enumerate() {
|
for (count, row) in anime.0.iter().enumerate() {
|
||||||
// Write the top block of LEDs (first 7 rows)
|
// Write the top block of LEDs (first 7 rows)
|
||||||
if count < 6 {
|
if count < 6 {
|
||||||
for x in row.iter() {
|
for (i, x) in row.iter().enumerate() {
|
||||||
write_block[write_index] = *x;
|
// Rows 0, 1, 3, 5 are short and misaligned
|
||||||
|
if count == 0 || count == 1 || count == 3 || count == 5 {
|
||||||
|
if i > 0 {
|
||||||
|
write_block[write_index - 1] = *x;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
write_block[write_index] = *x;
|
||||||
|
}
|
||||||
write_index += 1;
|
write_index += 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Two offsets to correct the below with
|
|
||||||
if count == 6 {
|
|
||||||
phys_row_len -= 1;
|
|
||||||
}
|
|
||||||
if count == 7 {
|
|
||||||
phys_row_len += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch to next block (looks like )
|
// Switch to next block (looks like )
|
||||||
if count % 2 != 0 {
|
if count % 2 != 0 {
|
||||||
phys_row_len -= 2; // if count 7, -= 1
|
// Row after 6 is only 1 less, then rows after 7 follow pattern
|
||||||
|
if count == 7 {
|
||||||
|
prog_row_len -= 1;
|
||||||
|
} else {
|
||||||
|
prog_row_len -= 2;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
phys_row_len += 1; // if count 6, 0
|
prog_row_len += 1; // if count 6, 0
|
||||||
}
|
}
|
||||||
|
|
||||||
let index = row.len() - phys_row_len;
|
let index = row.len() - prog_row_len;
|
||||||
for n in index..row.len() {
|
for n in index..row.len() {
|
||||||
// Require a special case to catch the correct end-of-packet which is
|
// Require a special case to catch the correct end-of-packet which is
|
||||||
// 6 bytes from the end
|
// 6 bytes from the end
|
||||||
@@ -83,3 +144,87 @@ impl From<AniMeMatrix> for AniMePacketType {
|
|||||||
buffers
|
buffers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::{AniMeMatrix, AniMePacketType};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_data_alignment() {
|
||||||
|
let mut matrix = AniMeMatrix::new();
|
||||||
|
{
|
||||||
|
let tmp = matrix.get_mut();
|
||||||
|
for row in tmp.iter_mut() {
|
||||||
|
row[row.len() - 1] = 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let matrix: AniMePacketType = AniMePacketType::from(matrix);
|
||||||
|
|
||||||
|
// The bytes at the right of the initial AniMeMatrix should always end up aligned in the
|
||||||
|
// same place after conversion to data packets
|
||||||
|
|
||||||
|
// Check against manually worked out right align
|
||||||
|
assert_eq!(
|
||||||
|
matrix[0].to_vec(),
|
||||||
|
[
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
]
|
||||||
|
.to_vec()
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
matrix[1].to_vec(),
|
||||||
|
[
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0,
|
||||||
|
0, 0, 0, 0
|
||||||
|
]
|
||||||
|
.to_vec()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user