librazer/
types.rs

1use crate::error::RazerError;
2use clap::ValueEnum;
3use serde::{Deserialize, Serialize};
4use strum_macros::{EnumIter, EnumString};
5
6/// Generates TryFrom<u8> implementation for enums with explicit discriminants.
7macro_rules! impl_try_from_u8 {
8    ($enum_type:ident { $($value:expr => $variant:ident),+ $(,)? }) => {
9        impl TryFrom<u8> for $enum_type {
10            type Error = RazerError;
11
12            fn try_from(value: u8) -> Result<Self, Self::Error> {
13                match value {
14                    $($value => Ok(Self::$variant),)+
15                    _ => Err(RazerError::InvalidValue {
16                        value,
17                        type_name: stringify!($enum_type),
18                    }),
19                }
20            }
21        }
22    };
23}
24
25#[derive(Clone, Copy)]
26pub enum Cluster {
27    Cpu = 0x01,
28    Gpu = 0x02,
29}
30
31#[derive(Clone, Copy)]
32pub enum FanZone {
33    Zone1 = 0x01,
34    Zone2 = 0x02,
35}
36
37impl FanZone {
38    /// Both fan zones for operations that affect all fans
39    pub const ALL: [FanZone; 2] = [FanZone::Zone1, FanZone::Zone2];
40}
41
42/// Thermal zones for performance mode operations
43#[derive(Clone, Copy)]
44pub enum ThermalZone {
45    Zone1 = 0x01,
46    Zone2 = 0x02,
47}
48
49impl ThermalZone {
50    /// Both thermal zones for operations that affect the entire thermal system
51    pub const ALL: [ThermalZone; 2] = [ThermalZone::Zone1, ThermalZone::Zone2];
52}
53
54#[derive(Clone, Copy, Debug, PartialEq, EnumIter, ValueEnum)]
55pub enum PerfMode {
56    Balanced = 0,
57    Silent = 5,
58    Custom = 4,
59}
60
61#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, EnumIter, ValueEnum)]
62pub enum MaxFanSpeedMode {
63    Enable = 2,
64    Disable = 0,
65}
66
67#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, EnumIter, ValueEnum)]
68pub enum FanMode {
69    Auto = 0,
70    Manual = 1,
71}
72
73#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, EnumIter, ValueEnum)]
74pub enum CpuBoost {
75    Low = 0,
76    Medium = 1,
77    High = 2,
78    Boost = 3,
79    Overclock = 4,
80}
81
82#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, EnumIter, ValueEnum)]
83pub enum GpuBoost {
84    Low = 0,
85    Medium = 1,
86    High = 2,
87}
88
89#[derive(
90    Clone, Copy, Debug, PartialEq, Serialize, Deserialize, EnumIter, EnumString, ValueEnum,
91)]
92pub enum LogoMode {
93    Off,
94    Breathing,
95    Static,
96}
97
98#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, EnumString, ValueEnum)]
99pub enum LightsAlwaysOn {
100    Enable = 0x03,
101    Disable = 0x00,
102}
103
104#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, ValueEnum)]
105pub enum BatteryCare {
106    Disable = 0x50,
107    Enable = 0xd0,
108}
109
110impl_try_from_u8!(GpuBoost { 0 => Low, 1 => Medium, 2 => High });
111impl_try_from_u8!(PerfMode { 0 => Balanced, 5 => Silent, 4 => Custom });
112impl_try_from_u8!(FanMode { 0 => Auto, 1 => Manual });
113impl_try_from_u8!(CpuBoost { 0 => Low, 1 => Medium, 2 => High, 3 => Boost, 4 => Overclock });
114impl_try_from_u8!(LightsAlwaysOn { 0 => Disable, 3 => Enable });
115impl_try_from_u8!(BatteryCare { 0x50 => Disable, 0xd0 => Enable });
116impl_try_from_u8!(MaxFanSpeedMode { 0x00 => Disable, 0x02 => Enable });
117
118#[cfg(test)]
119mod tests {
120    use super::*;
121
122    #[test]
123    fn test_perf_mode_try_from() {
124        assert_eq!(PerfMode::try_from(0).unwrap(), PerfMode::Balanced);
125        assert_eq!(PerfMode::try_from(5).unwrap(), PerfMode::Silent);
126        assert_eq!(PerfMode::try_from(4).unwrap(), PerfMode::Custom);
127        assert!(PerfMode::try_from(99).is_err());
128    }
129
130    #[test]
131    fn test_fan_mode_try_from() {
132        assert_eq!(FanMode::try_from(0).unwrap(), FanMode::Auto);
133        assert_eq!(FanMode::try_from(1).unwrap(), FanMode::Manual);
134        assert!(FanMode::try_from(2).is_err());
135    }
136
137    #[test]
138    fn test_cpu_boost_try_from() {
139        assert_eq!(CpuBoost::try_from(0).unwrap(), CpuBoost::Low);
140        assert_eq!(CpuBoost::try_from(1).unwrap(), CpuBoost::Medium);
141        assert_eq!(CpuBoost::try_from(2).unwrap(), CpuBoost::High);
142        assert_eq!(CpuBoost::try_from(3).unwrap(), CpuBoost::Boost);
143        assert_eq!(CpuBoost::try_from(4).unwrap(), CpuBoost::Overclock);
144        assert!(CpuBoost::try_from(5).is_err());
145    }
146
147    #[test]
148    fn test_gpu_boost_try_from() {
149        assert_eq!(GpuBoost::try_from(0).unwrap(), GpuBoost::Low);
150        assert_eq!(GpuBoost::try_from(1).unwrap(), GpuBoost::Medium);
151        assert_eq!(GpuBoost::try_from(2).unwrap(), GpuBoost::High);
152        assert!(GpuBoost::try_from(3).is_err());
153    }
154
155    #[test]
156    fn test_lights_always_on_try_from() {
157        assert_eq!(
158            LightsAlwaysOn::try_from(0).unwrap(),
159            LightsAlwaysOn::Disable
160        );
161        assert_eq!(LightsAlwaysOn::try_from(3).unwrap(), LightsAlwaysOn::Enable);
162        assert!(LightsAlwaysOn::try_from(1).is_err());
163    }
164
165    #[test]
166    fn test_battery_care_try_from() {
167        assert_eq!(BatteryCare::try_from(0x50).unwrap(), BatteryCare::Disable);
168        assert_eq!(BatteryCare::try_from(0xd0).unwrap(), BatteryCare::Enable);
169        assert!(BatteryCare::try_from(0x00).is_err());
170    }
171
172    #[test]
173    fn test_max_fan_speed_mode_try_from() {
174        assert_eq!(
175            MaxFanSpeedMode::try_from(0x00).unwrap(),
176            MaxFanSpeedMode::Disable
177        );
178        assert_eq!(
179            MaxFanSpeedMode::try_from(0x02).unwrap(),
180            MaxFanSpeedMode::Enable
181        );
182        assert!(MaxFanSpeedMode::try_from(0x01).is_err());
183    }
184}