1use crate::error::RazerError;
2use clap::ValueEnum;
3use serde::{Deserialize, Serialize};
4use strum_macros::{EnumIter, EnumString};
5
6macro_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 pub const ALL: [FanZone; 2] = [FanZone::Zone1, FanZone::Zone2];
40}
41
42#[derive(Clone, Copy)]
44pub enum ThermalZone {
45 Zone1 = 0x01,
46 Zone2 = 0x02,
47}
48
49impl ThermalZone {
50 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}