mirror of
https://gitlab.com/asus-linux/asusctl.git
synced 2026-02-06 00:15:04 +01:00
Further refinement
This commit is contained in:
@@ -4,7 +4,7 @@ use rog_dbus::AuraDbusClient;
|
|||||||
use std::{env::args, process::Command};
|
use std::{env::args, process::Command};
|
||||||
use yansi_term::Colour::Green;
|
use yansi_term::Colour::Green;
|
||||||
use yansi_term::Colour::Red;
|
use yansi_term::Colour::Red;
|
||||||
use rog_types::{cli_options::{AniMeActions, AniMeStatusValue, LedBrightness, SetAuraBuiltin}, profile::{ProfileCommand, ProfileEvent}};
|
use rog_types::{anime_matrix::{AniMeDataBuffer, FULL_PANE_LEN}, cli_options::{AniMeActions, AniMeStatusValue, LedBrightness, SetAuraBuiltin}, profile::{ProfileCommand, ProfileEvent}};
|
||||||
|
|
||||||
#[derive(Default, Options)]
|
#[derive(Default, Options)]
|
||||||
struct CLIStart {
|
struct CLIStart {
|
||||||
@@ -197,8 +197,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
if let Some(action) = cmd.command {
|
if let Some(action) = cmd.command {
|
||||||
match action {
|
match action {
|
||||||
AniMeActions::Leds(anime_leds) => {
|
AniMeActions::Leds(anime_leds) => {
|
||||||
let led_brightness = anime_leds.led_brightness();
|
let mut data = AniMeDataBuffer::new();
|
||||||
dbus.proxies().anime().set_brightness(led_brightness)?;
|
data.set([anime_leds.led_brightness(); FULL_PANE_LEN]);
|
||||||
|
dbus.proxies().anime().write_direct(data)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,13 @@ const APPLY: u8 = 0xc4;
|
|||||||
// The next byte can be 0x03 for "on" and 0x00 for "off"
|
// The next byte can be 0x03 for "on" and 0x00 for "off"
|
||||||
const ON_OFF: u8 = 0x04;
|
const ON_OFF: u8 = 0x04;
|
||||||
|
|
||||||
use rog_types::{anime_matrix::{ANIME_PANE1_PREFIX, ANIME_PANE2_PREFIX, AniMeDataBuffer, AniMeImageBuffer, AniMePacketType, PANE_LEN}, error::AuraError};
|
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
|
use rog_types::{
|
||||||
|
anime_matrix::{
|
||||||
|
AniMeDataBuffer, AniMeImageBuffer, AniMePacketType, ANIME_PANE1_PREFIX, ANIME_PANE2_PREFIX,
|
||||||
|
},
|
||||||
|
error::AuraError,
|
||||||
|
};
|
||||||
use rusb::{Device, DeviceHandle};
|
use rusb::{Device, DeviceHandle};
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
@@ -35,30 +40,21 @@ impl GetSupported for CtrlAnimeDisplay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum AnimatrixCommand {
|
|
||||||
Apply,
|
|
||||||
SetBoot(bool),
|
|
||||||
Write([u8; 640]),
|
|
||||||
WriteImage(AniMeImageBuffer),
|
|
||||||
//ReloadLast,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct CtrlAnimeDisplay {
|
pub struct CtrlAnimeDisplay {
|
||||||
handle: DeviceHandle<rusb::GlobalContext>,
|
handle: DeviceHandle<rusb::GlobalContext>,
|
||||||
initialised: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//AnimatrixWrite
|
//AnimatrixWrite
|
||||||
pub trait Dbus {
|
pub trait Dbus {
|
||||||
fn write_image(&mut self, input: AniMeImageBuffer);
|
/// Write an image 34x56 pixels. Each pixel is 0-255 greyscale.
|
||||||
|
fn write_image(&self, input: AniMeImageBuffer);
|
||||||
|
|
||||||
fn write_direct(&mut self, input: AniMeDataBuffer);
|
/// Write a direct stream of data
|
||||||
|
fn write_direct(&self, input: AniMeDataBuffer);
|
||||||
|
|
||||||
fn set_on_off(&mut self, status: bool);
|
fn set_on_off(&self, status: bool);
|
||||||
|
|
||||||
fn set_boot_on_off(&mut self, status: bool);
|
fn set_boot_on_off(&self, status: bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl crate::ZbusAdd for CtrlAnimeDisplay {
|
impl crate::ZbusAdd for CtrlAnimeDisplay {
|
||||||
@@ -75,17 +71,19 @@ impl crate::ZbusAdd for CtrlAnimeDisplay {
|
|||||||
|
|
||||||
#[dbus_interface(name = "org.asuslinux.Daemon")]
|
#[dbus_interface(name = "org.asuslinux.Daemon")]
|
||||||
impl Dbus for CtrlAnimeDisplay {
|
impl Dbus for CtrlAnimeDisplay {
|
||||||
fn write_image(&mut self, input: AniMeImageBuffer) {
|
/// Writes a 34x56 image
|
||||||
|
fn write_image(&self, input: AniMeImageBuffer) {
|
||||||
self.write_image_buffer(input)
|
self.write_image_buffer(input)
|
||||||
.map_or_else(|err| warn!("{}", err), |()| info!("Writing image to Anime"));
|
.map_or_else(|err| warn!("{}", err), |()| info!("Writing image to Anime"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_direct(&mut self, input: AniMeDataBuffer) {
|
/// Writes a data stream of length
|
||||||
|
fn write_direct(&self, input: AniMeDataBuffer) {
|
||||||
self.write_data_buffer(input)
|
self.write_data_buffer(input)
|
||||||
.map_or_else(|err| warn!("{}", err), |()| info!("Writing data to Anime"));
|
.map_or_else(|err| warn!("{}", err), |()| info!("Writing data to Anime"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_on_off(&mut self, status: bool) {
|
fn set_on_off(&self, status: bool) {
|
||||||
let mut buffer = [0u8; PACKET_SIZE];
|
let mut buffer = [0u8; PACKET_SIZE];
|
||||||
buffer[0] = DEV_PAGE;
|
buffer[0] = DEV_PAGE;
|
||||||
buffer[1] = WRITE;
|
buffer[1] = WRITE;
|
||||||
@@ -100,21 +98,23 @@ impl Dbus for CtrlAnimeDisplay {
|
|||||||
status_str = "off";
|
status_str = "off";
|
||||||
}
|
}
|
||||||
|
|
||||||
self.do_command(AnimatrixCommand::Write(buffer)).map_or_else(
|
self.write_bytes(&buffer).map_or_else(
|
||||||
|err| warn!("{}", err),
|
|err| warn!("{}", err),
|
||||||
|()| info!("Turning {} the AniMe", status_str),
|
|()| info!("Turning {} the AniMe", status_str),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_boot_on_off(&mut self, status: bool) {
|
fn set_boot_on_off(&self, status: bool) {
|
||||||
let status_str = if status { "on" } else { "off" };
|
let status_str = if status { "on" } else { "off" };
|
||||||
|
|
||||||
self.do_command(AnimatrixCommand::SetBoot(status))
|
self.do_set_boot(status).map_or_else(
|
||||||
.and_then(|()| self.do_command(AnimatrixCommand::Apply))
|
|err| warn!("{}", err),
|
||||||
.map_or_else(
|
|()| info!("Turning {} the AniMe at boot/shutdown", status_str),
|
||||||
|err| warn!("{}", err),
|
);
|
||||||
|()| info!("Turning {} the AniMe at boot/shutdown", status_str),
|
self.do_apply().map_or_else(
|
||||||
);
|
|err| warn!("{}", err),
|
||||||
|
|()| info!("Turning {} the AniMe at boot/shutdown", status_str),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,10 +138,12 @@ impl CtrlAnimeDisplay {
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
info!("Device has an AniMe Matrix display");
|
info!("Device has an AniMe Matrix display");
|
||||||
Ok(CtrlAnimeDisplay {
|
let ctrl = CtrlAnimeDisplay {
|
||||||
handle: device,
|
handle: device,
|
||||||
initialised: false,
|
};
|
||||||
})
|
ctrl.do_initialization()?;
|
||||||
|
|
||||||
|
Ok(ctrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -155,22 +157,6 @@ impl CtrlAnimeDisplay {
|
|||||||
Err(rusb::Error::NoDevice)
|
Err(rusb::Error::NoDevice)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn do_command(&mut self, command: AnimatrixCommand) -> Result<(), AuraError> {
|
|
||||||
if !self.initialised {
|
|
||||||
self.do_initialization()?
|
|
||||||
}
|
|
||||||
|
|
||||||
match command {
|
|
||||||
AnimatrixCommand::Apply => self.do_apply()?,
|
|
||||||
//AnimatrixCommand::Set => self.do_set_boot()?,
|
|
||||||
AnimatrixCommand::SetBoot(status) => self.do_set_boot(status)?,
|
|
||||||
AnimatrixCommand::Write(bytes) => self.write_bytes(&bytes)?,
|
|
||||||
AnimatrixCommand::WriteImage(effect) => self.write_image_buffer(effect)?,
|
|
||||||
//AnimatrixCommand::ReloadLast => self.reload_last_builtin(&config).await?,
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Should only be used if the bytes you are writing are verified correct
|
/// Should only be used if the bytes you are writing are verified correct
|
||||||
#[inline]
|
#[inline]
|
||||||
fn write_bytes(&self, message: &[u8]) -> Result<(), AuraError> {
|
fn write_bytes(&self, message: &[u8]) -> Result<(), AuraError> {
|
||||||
@@ -191,7 +177,7 @@ impl CtrlAnimeDisplay {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn write_data_buffer(&mut self, buffer: AniMeDataBuffer) -> Result<(), AuraError> {
|
fn write_data_buffer(&self, buffer: AniMeDataBuffer) -> Result<(), AuraError> {
|
||||||
let mut image = AniMePacketType::from(buffer);
|
let mut image = AniMePacketType::from(buffer);
|
||||||
image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX);
|
image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX);
|
||||||
image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX);
|
image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX);
|
||||||
@@ -205,7 +191,7 @@ impl CtrlAnimeDisplay {
|
|||||||
|
|
||||||
/// Write an Animatrix image
|
/// Write an Animatrix image
|
||||||
///
|
///
|
||||||
/// The expected input here is *two* Vectors, 640 bytes in length. The two vectors
|
/// The expected USB input here is *two* Vectors, 640 bytes in length. The two vectors
|
||||||
/// are each one half of the full image write.
|
/// are each one half of the full image write.
|
||||||
///
|
///
|
||||||
/// After each write a flush is written, it is assumed that this tells the device to
|
/// After each write a flush is written, it is assumed that this tells the device to
|
||||||
@@ -219,7 +205,7 @@ impl CtrlAnimeDisplay {
|
|||||||
///
|
///
|
||||||
/// Where led brightness is 0..255, low to high
|
/// Where led brightness is 0..255, low to high
|
||||||
#[inline]
|
#[inline]
|
||||||
fn write_image_buffer(&mut self, buffer: AniMeImageBuffer) -> Result<(), AuraError> {
|
fn write_image_buffer(&self, buffer: AniMeImageBuffer) -> Result<(), AuraError> {
|
||||||
let mut image = AniMePacketType::from(buffer);
|
let mut image = AniMePacketType::from(buffer);
|
||||||
image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX);
|
image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX);
|
||||||
image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX);
|
image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX);
|
||||||
@@ -232,7 +218,7 @@ impl CtrlAnimeDisplay {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn do_initialization(&mut self) -> Result<(), AuraError> {
|
fn do_initialization(&self) -> Result<(), AuraError> {
|
||||||
let mut init = [0; PACKET_SIZE];
|
let mut init = [0; PACKET_SIZE];
|
||||||
init[0] = DEV_PAGE; // This is the USB page we're using throughout
|
init[0] = DEV_PAGE; // This is the USB page we're using throughout
|
||||||
for (idx, byte) in INIT_STR.as_bytes().iter().enumerate() {
|
for (idx, byte) in INIT_STR.as_bytes().iter().enumerate() {
|
||||||
@@ -248,12 +234,11 @@ impl CtrlAnimeDisplay {
|
|||||||
init[1] = INIT;
|
init[1] = INIT;
|
||||||
|
|
||||||
self.write_bytes(&init)?;
|
self.write_bytes(&init)?;
|
||||||
self.initialised = true;
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn do_flush(&mut self) -> Result<(), AuraError> {
|
fn do_flush(&self) -> Result<(), AuraError> {
|
||||||
let mut flush = [0; PACKET_SIZE];
|
let mut flush = [0; PACKET_SIZE];
|
||||||
flush[0] = DEV_PAGE;
|
flush[0] = DEV_PAGE;
|
||||||
flush[1] = WRITE;
|
flush[1] = WRITE;
|
||||||
@@ -264,7 +249,7 @@ impl CtrlAnimeDisplay {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn do_set_boot(&mut self, status: bool) -> Result<(), AuraError> {
|
fn do_set_boot(&self, status: bool) -> Result<(), AuraError> {
|
||||||
let mut flush = [0; PACKET_SIZE];
|
let mut flush = [0; PACKET_SIZE];
|
||||||
flush[0] = DEV_PAGE;
|
flush[0] = DEV_PAGE;
|
||||||
flush[1] = SET;
|
flush[1] = SET;
|
||||||
@@ -276,7 +261,7 @@ impl CtrlAnimeDisplay {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn do_apply(&mut self) -> Result<(), AuraError> {
|
fn do_apply(&self) -> Result<(), AuraError> {
|
||||||
let mut flush = [0; PACKET_SIZE];
|
let mut flush = [0; PACKET_SIZE];
|
||||||
flush[0] = DEV_PAGE;
|
flush[0] = DEV_PAGE;
|
||||||
flush[1] = APPLY;
|
flush[1] = APPLY;
|
||||||
|
|||||||
@@ -19,25 +19,28 @@
|
|||||||
//!
|
//!
|
||||||
//! …consequently `zbus-xmlgen` did not generate code for the above interfaces.
|
//! …consequently `zbus-xmlgen` did not generate code for the above interfaces.
|
||||||
|
|
||||||
|
use rog_types::anime_matrix::{AniMeDataBuffer, AniMeImageBuffer};
|
||||||
use zbus::{dbus_proxy, Connection, Result};
|
use zbus::{dbus_proxy, Connection, Result};
|
||||||
|
|
||||||
use rog_types::anime_matrix::{AniMeImageBuffer, AniMePacketType, ANIME_PANE1_PREFIX, ANIME_PANE2_PREFIX};
|
|
||||||
|
|
||||||
#[dbus_proxy(
|
#[dbus_proxy(
|
||||||
interface = "org.asuslinux.Daemon",
|
interface = "org.asuslinux.Daemon",
|
||||||
default_path = "/org/asuslinux/Anime"
|
default_path = "/org/asuslinux/Anime"
|
||||||
)]
|
)]
|
||||||
trait Daemon {
|
trait Daemon {
|
||||||
/// SetAnime method
|
|
||||||
fn set_anime(&self, input: &[&[u8]]) -> zbus::Result<()>;
|
|
||||||
|
|
||||||
/// SetBootOnOff method
|
/// SetBootOnOff method
|
||||||
fn set_boot_on_off(&self, status: bool) -> zbus::Result<()>;
|
fn set_boot_on_off(&self, status: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
/// SetOnOff method
|
/// SetOnOff method
|
||||||
fn set_on_off(&self, status: bool) -> zbus::Result<()>;
|
fn set_on_off(&self, status: bool) -> zbus::Result<()>;
|
||||||
|
|
||||||
|
/// WriteDirect method
|
||||||
|
fn write_direct(&self, input: &[u8]) -> zbus::Result<()>;
|
||||||
|
|
||||||
|
/// WriteImage method
|
||||||
|
fn write_image(&self, input: &[Vec<u8>]) -> zbus::Result<()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub struct AnimeProxy<'a>(DaemonProxy<'a>);
|
pub struct AnimeProxy<'a>(DaemonProxy<'a>);
|
||||||
|
|
||||||
impl<'a> AnimeProxy<'a> {
|
impl<'a> AnimeProxy<'a> {
|
||||||
@@ -50,19 +53,6 @@ impl<'a> AnimeProxy<'a> {
|
|||||||
&self.0
|
&self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn set_brightness(&self, led_brightness: u8) -> Result<()> {
|
|
||||||
let mut anime_matrix = AniMeImageBuffer::new();
|
|
||||||
|
|
||||||
anime_matrix.fill_with(led_brightness);
|
|
||||||
|
|
||||||
let mut image = AniMePacketType::from(anime_matrix);
|
|
||||||
image[0][..7].copy_from_slice(&ANIME_PANE1_PREFIX);
|
|
||||||
image[1][..7].copy_from_slice(&ANIME_PANE2_PREFIX);
|
|
||||||
|
|
||||||
self.0.set_anime(&[&image[0], &image[1]])
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn toggle_boot_on(&self, on: bool) -> Result<()> {
|
pub fn toggle_boot_on(&self, on: bool) -> Result<()> {
|
||||||
self.0.set_boot_on_off(on)
|
self.0.set_boot_on_off(on)
|
||||||
@@ -72,4 +62,14 @@ impl<'a> AnimeProxy<'a> {
|
|||||||
pub fn toggle_on(&self, on: bool) -> Result<()> {
|
pub fn toggle_on(&self, on: bool) -> Result<()> {
|
||||||
self.0.set_on_off(on)
|
self.0.set_on_off(on)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn write_direct(&self, input: AniMeDataBuffer) -> Result<()> {
|
||||||
|
self.0.write_direct(input.get())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn write_image(&self, input: AniMeImageBuffer) -> Result<()> {
|
||||||
|
self.0.write_image(input.get())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,13 @@ use zvariant_derive::Type;
|
|||||||
|
|
||||||
pub const WIDTH: usize = 34; // Width is definitely 34 items
|
pub const WIDTH: usize = 34; // Width is definitely 34 items
|
||||||
pub const HEIGHT: usize = 56;
|
pub const HEIGHT: usize = 56;
|
||||||
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;
|
||||||
/// Not inclusive
|
/// *Not* inclusive, the byte before this is the final for each "pane"
|
||||||
const BLOCK_END: usize = 634;
|
const BLOCK_END: usize = 634;
|
||||||
pub const PANE_LEN: usize = BLOCK_END - BLOCK_START;
|
pub const PANE_LEN: usize = BLOCK_END - BLOCK_START;
|
||||||
|
/// The length of usable data
|
||||||
|
pub const FULL_PANE_LEN: usize = PANE_LEN * 2;
|
||||||
|
|
||||||
pub const ANIME_PANE1_PREFIX: [u8; 7] = [0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02];
|
pub const ANIME_PANE1_PREFIX: [u8; 7] = [0x5e, 0xc0, 0x02, 0x01, 0x00, 0x73, 0x02];
|
||||||
pub const ANIME_PANE2_PREFIX: [u8; 7] = [0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02];
|
pub const ANIME_PANE2_PREFIX: [u8; 7] = [0x5e, 0xc0, 0x02, 0x74, 0x02, 0x73, 0x02];
|
||||||
@@ -18,14 +19,14 @@ pub struct AniMeDataBuffer(Vec<u8>);
|
|||||||
|
|
||||||
impl AniMeDataBuffer {
|
impl AniMeDataBuffer {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
AniMeDataBuffer(vec![0u8; PANE_LEN])
|
AniMeDataBuffer(vec![0u8; FULL_PANE_LEN])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(&self) -> &[u8] {
|
pub fn get(&self) -> &[u8] {
|
||||||
&self.0
|
&self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set(&mut self, input: [u8; PANE_LEN]) {
|
pub fn set(&mut self, input: [u8; FULL_PANE_LEN]) {
|
||||||
self.0 = input.to_vec();
|
self.0 = input.to_vec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -33,7 +34,7 @@ impl AniMeDataBuffer {
|
|||||||
impl From<AniMeDataBuffer> for AniMePacketType {
|
impl From<AniMeDataBuffer> for AniMePacketType {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(anime: AniMeDataBuffer) -> Self {
|
fn from(anime: AniMeDataBuffer) -> Self {
|
||||||
assert!(anime.0.len() == PANE_LEN);
|
assert!(anime.0.len() == FULL_PANE_LEN);
|
||||||
let mut buffers = [[0; 640]; 2];
|
let mut buffers = [[0; 640]; 2];
|
||||||
for (idx, chunk) in anime.0.as_slice().chunks(PANE_LEN).enumerate() {
|
for (idx, chunk) in anime.0.as_slice().chunks(PANE_LEN).enumerate() {
|
||||||
buffers[idx][BLOCK_START..BLOCK_END].copy_from_slice(chunk);
|
buffers[idx][BLOCK_START..BLOCK_END].copy_from_slice(chunk);
|
||||||
@@ -197,7 +198,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn check_from_data_buffer() {
|
fn check_from_data_buffer() {
|
||||||
let mut data = AniMeDataBuffer::new();
|
let mut data = AniMeDataBuffer::new();
|
||||||
data.set([42u8; PANE_LEN]);
|
data.set([42u8; FULL_PANE_LEN]);
|
||||||
|
|
||||||
let out: AniMePacketType = data.into();
|
let out: AniMePacketType = data.into();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user