Temporary fix of old keyboard+lightbar

This commit is contained in:
Luke D. Jones
2024-05-13 23:53:25 +12:00
parent f2f090a88f
commit a0368d4345
10 changed files with 480 additions and 287 deletions

View File

@@ -82,10 +82,16 @@ impl AuraPowerState {
if self.sleep {
a |= OldAuraPower::Sleep as u32;
}
if matches!(self.zone, PowerZones::Keyboard) {
if matches!(
self.zone,
PowerZones::Keyboard | PowerZones::KeyboardAndLightbar
) {
a |= OldAuraPower::Keyboard as u32;
}
if matches!(self.zone, PowerZones::Lightbar) {
if matches!(
self.zone,
PowerZones::Lightbar | PowerZones::KeyboardAndLightbar
) {
a |= OldAuraPower::Lightbar as u32;
}
vec![
@@ -128,7 +134,7 @@ impl AuraPowerState {
| (self.sleep as u32) << (23 + 3)
| (self.shutdown as u32) << (23 + 4)
}
PowerZones::None => 0,
PowerZones::None | PowerZones::KeyboardAndLightbar => 0,
}
}
}
@@ -189,9 +195,13 @@ impl LaptopAuraPower {
Self { states }
}
AuraDeviceType::LaptopPre2021 => {
// The older devices are tri-state if have lightbar:
// 1. Keyboard
// 2. Lightbar
// 3. KeyboardAndLightbar
if support_data.power_zones.contains(&PowerZones::Lightbar) {
Self {
states: vec![AuraPowerState::default_for(PowerZones::Lightbar)],
states: vec![AuraPowerState::default_for(PowerZones::KeyboardAndLightbar)],
}
} else {
Self {
@@ -209,12 +219,25 @@ impl LaptopAuraPower {
pub fn to_bytes(&self, aura_type: AuraDeviceType) -> Vec<u8> {
match aura_type {
AuraDeviceType::LaptopPost2021 => self.new_to_bytes(),
AuraDeviceType::LaptopPre2021 => self
.states
.first()
.cloned()
.unwrap_or_default()
.old_to_bytes(),
AuraDeviceType::LaptopPre2021 => {
if self.states.len() == 1 {
self.states
.first()
.cloned()
.unwrap_or_default()
.old_to_bytes()
} else {
let mut bytes: Vec<Vec<u8>> =
self.states.iter().map(|s| s.old_to_bytes()).collect();
let mut b = bytes.pop().unwrap();
for i in bytes {
for (i, n) in i.iter().enumerate() {
b[i] |= n;
}
}
b
}
}
AuraDeviceType::LaptopTuf => self
.states
.first()
@@ -225,7 +248,7 @@ impl LaptopAuraPower {
warn!("Trying to create bytes for an unknown device");
self.new_to_bytes()
}
AuraDeviceType::ScsiExtDisk => todo!(),
AuraDeviceType::ScsiExtDisk => todo!("scsi disk not implemented yet"),
}
}
}
@@ -274,76 +297,75 @@ mod test {
use crate::keyboard::{AuraPowerState, LaptopAuraPower};
use crate::{AuraDeviceType, PowerZones};
fn to_binary_string_post2021(power: &LaptopAuraPower) -> String {
let bytes = power.to_bytes(AuraDeviceType::LaptopPost2021);
format!(
"{:08b}, {:08b}, {:08b}, {:08b}",
bytes[0], bytes[1], bytes[2], bytes[3]
)
}
#[test]
fn check_0x1866_control_bytes() {
let state = AuraPowerState {
zone: PowerZones::Keyboard,
awake: true,
boot: false,
sleep: false,
shutdown: false,
let power = LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Keyboard,
boot: false,
awake: true,
sleep: false,
shutdown: false,
}],
};
let bytes = state.old_to_bytes();
let bytes = power.to_bytes(AuraDeviceType::LaptopPre2021);
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
assert_eq!(bytes, [0x08, 0x00, 0x02, 0x00]);
let state = AuraPowerState {
zone: PowerZones::Lightbar,
awake: true,
boot: false,
sleep: false,
shutdown: false,
let power = LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lightbar,
boot: false,
awake: true,
sleep: false,
shutdown: false,
}],
};
let bytes = state.old_to_bytes();
let bytes = power.to_bytes(AuraDeviceType::LaptopPre2021);
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
assert_eq!(bytes, [0x04, 0x05, 0x02, 0x00]);
let bytes = AuraPowerState {
zone: PowerZones::None,
awake: false,
boot: false,
sleep: true,
shutdown: false,
// let bytes = [
// OldAuraPower::Keyboard,
// OldAuraPower::Lightbar,
// OldAuraPower::Awake,
// OldAuraPower::Sleep,
// OldAuraPower::Boot,
// ];
let power = LaptopAuraPower {
states: vec![
AuraPowerState {
zone: PowerZones::Keyboard,
boot: true,
awake: true,
sleep: true,
shutdown: false,
},
AuraPowerState {
zone: PowerZones::Lightbar,
boot: true,
awake: true,
sleep: true,
shutdown: false,
},
],
};
let bytes = bytes.old_to_bytes();
let bytes = power.to_bytes(AuraDeviceType::LaptopPre2021);
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
assert_eq!(bytes, [0x30, 0x08, 0x04, 0x00]);
let bytes = AuraPowerState {
zone: PowerZones::None,
awake: false,
boot: true,
sleep: false,
shutdown: false,
};
let bytes = bytes.old_to_bytes();
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
assert_eq!(bytes, [0xc3, 0x12, 0x09, 0x00]);
let power = AuraPowerState {
zone: PowerZones::Keyboard,
awake: true,
boot: true,
sleep: true,
shutdown: false,
};
let bytes = power.old_to_bytes();
println!("{:08b}, {:08b}, {:08b}", bytes[0], bytes[1], bytes[2]);
assert_eq!(bytes, [251, 26, 15, 0]);
assert_eq!(bytes, [0xff, 0x1f, 0x000f, 0x00]);
}
#[test]
fn check_0x19b6_control_bytes_binary_rep() {
fn to_binary_string(power: &LaptopAuraPower) -> String {
let bytes = power.to_bytes(AuraDeviceType::LaptopPost2021);
format!(
"{:08b}, {:08b}, {:08b}, {:08b}",
bytes[0], bytes[1], bytes[2], bytes[3]
)
}
let boot_logo_ = to_binary_string(&LaptopAuraPower {
let boot_logo_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Logo,
boot: true,
@@ -352,7 +374,7 @@ mod test {
shutdown: false,
}],
});
let boot_keyb_ = to_binary_string(&LaptopAuraPower {
let boot_keyb_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Keyboard,
boot: true,
@@ -361,7 +383,7 @@ mod test {
shutdown: false,
}],
});
let sleep_logo = to_binary_string(&LaptopAuraPower {
let sleep_logo = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Logo,
boot: false,
@@ -370,7 +392,7 @@ mod test {
shutdown: false,
}],
});
let sleep_keyb = to_binary_string(&LaptopAuraPower {
let sleep_keyb = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Keyboard,
boot: false,
@@ -379,7 +401,7 @@ mod test {
shutdown: false,
}],
});
let awake_logo = to_binary_string(&LaptopAuraPower {
let awake_logo = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Logo,
boot: false,
@@ -388,7 +410,7 @@ mod test {
shutdown: false,
}],
});
let awake_keyb = to_binary_string(&LaptopAuraPower {
let awake_keyb = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Keyboard,
boot: false,
@@ -397,7 +419,7 @@ mod test {
shutdown: false,
}],
});
let shut_logo_ = to_binary_string(&LaptopAuraPower {
let shut_logo_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Logo,
boot: false,
@@ -406,7 +428,7 @@ mod test {
shutdown: true,
}],
});
let shut_keyb_ = to_binary_string(&LaptopAuraPower {
let shut_keyb_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Keyboard,
boot: false,
@@ -415,7 +437,7 @@ mod test {
shutdown: true,
}],
});
let boot_bar__ = to_binary_string(&LaptopAuraPower {
let boot_bar__ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lightbar,
boot: true,
@@ -424,7 +446,7 @@ mod test {
shutdown: false,
}],
});
let awake_bar_ = to_binary_string(&LaptopAuraPower {
let awake_bar_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lightbar,
boot: false,
@@ -433,7 +455,7 @@ mod test {
shutdown: false,
}],
});
let sleep_bar_ = to_binary_string(&LaptopAuraPower {
let sleep_bar_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lightbar,
boot: false,
@@ -442,7 +464,7 @@ mod test {
shutdown: false,
}],
});
let shut_bar__ = to_binary_string(&LaptopAuraPower {
let shut_bar__ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lightbar,
boot: false,
@@ -451,7 +473,7 @@ mod test {
shutdown: true,
}],
});
let boot_lid__ = to_binary_string(&LaptopAuraPower {
let boot_lid__ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lid,
boot: true,
@@ -460,7 +482,7 @@ mod test {
shutdown: false,
}],
});
let awake_lid_ = to_binary_string(&LaptopAuraPower {
let awake_lid_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lid,
boot: false,
@@ -469,7 +491,7 @@ mod test {
shutdown: false,
}],
});
let sleep_lid_ = to_binary_string(&LaptopAuraPower {
let sleep_lid_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lid,
boot: false,
@@ -478,7 +500,7 @@ mod test {
shutdown: false,
}],
});
let shut_lid__ = to_binary_string(&LaptopAuraPower {
let shut_lid__ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::Lid,
boot: false,
@@ -487,7 +509,7 @@ mod test {
shutdown: true,
}],
});
let boot_rear_ = to_binary_string(&LaptopAuraPower {
let boot_rear_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::RearGlow,
boot: true,
@@ -496,7 +518,7 @@ mod test {
shutdown: false,
}],
});
let awake_rear = to_binary_string(&LaptopAuraPower {
let awake_rear = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::RearGlow,
boot: false,
@@ -505,7 +527,7 @@ mod test {
shutdown: false,
}],
});
let sleep_rear = to_binary_string(&LaptopAuraPower {
let sleep_rear = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::RearGlow,
boot: false,
@@ -514,7 +536,7 @@ mod test {
shutdown: false,
}],
});
let shut_rear_ = to_binary_string(&LaptopAuraPower {
let shut_rear_ = to_binary_string_post2021(&LaptopAuraPower {
states: vec![AuraPowerState {
zone: PowerZones::RearGlow,
boot: false,
@@ -549,7 +571,7 @@ mod test {
assert_eq!(shut_rear_, "00000000, 00000000, 00000000, 00001000");
// All on
let byte1 = to_binary_string(&LaptopAuraPower {
let byte1 = to_binary_string_post2021(&LaptopAuraPower {
states: vec![
AuraPowerState {
zone: PowerZones::Keyboard,

View File

@@ -126,5 +126,7 @@ pub enum PowerZones {
Lid = 3,
/// The led strip on the rear of some laptops
RearGlow = 4,
/// Exists for the older 0x1866 models
KeyboardAndLightbar = 5,
None = 255,
}