From 499e53f928850bc13ab644e6913b2e496602fc54 Mon Sep 17 00:00:00 2001 From: Andrei Gherzan Date: Wed, 21 Sep 2022 21:04:32 +0100 Subject: [PATCH 1/3] fan: Remove renundant and add extra interpolation test We have two tests for the case were temp is greater than both points so drop one of these tests. We also don't have any interpolation test for the case where temp is strictly between the points. This change adds one. Signed-off-by: Andrei Gherzan --- src/fan.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fan.rs b/src/fan.rs index 16957f38..7dc2c11b 100644 --- a/src/fan.rs +++ b/src/fan.rs @@ -339,8 +339,8 @@ mod tests { assert_eq!(fan_point.get_duty_between_points(next_point, 1500), None); assert_eq!(fan_point.get_duty_between_points(next_point, 2000), Some(3000)); + assert_eq!(fan_point.get_duty_between_points(next_point, 2500), Some(3250)); assert_eq!(fan_point.get_duty_between_points(next_point, 3000), Some(3500)); - assert_eq!(fan_point.get_duty_between_points(next_point, 3250), None); assert_eq!(fan_point.get_duty_between_points(next_point, 3500), None); } From 07dc1ba98bed1a60e7ceaa69f180dfa8e9092ab1 Mon Sep 17 00:00:00 2001 From: Andrei Gherzan Date: Wed, 21 Sep 2022 21:14:37 +0100 Subject: [PATCH 2/3] fan: Be numeric literals consistent even in tests Signed-off-by: Andrei Gherzan --- src/fan.rs | 88 +++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/fan.rs b/src/fan.rs index 7dc2c11b..e9006d04 100644 --- a/src/fan.rs +++ b/src/fan.rs @@ -337,11 +337,11 @@ mod tests { let fan_point = FanPoint::new(20_00, 30_00); let next_point = FanPoint::new(30_00, 35_00); - assert_eq!(fan_point.get_duty_between_points(next_point, 1500), None); - assert_eq!(fan_point.get_duty_between_points(next_point, 2000), Some(3000)); - assert_eq!(fan_point.get_duty_between_points(next_point, 2500), Some(3250)); - assert_eq!(fan_point.get_duty_between_points(next_point, 3000), Some(3500)); - assert_eq!(fan_point.get_duty_between_points(next_point, 3500), None); + assert_eq!(fan_point.get_duty_between_points(next_point, 15_00), None); + assert_eq!(fan_point.get_duty_between_points(next_point, 20_00), Some(30_00)); + assert_eq!(fan_point.get_duty_between_points(next_point, 25_00), Some(32_50)); + assert_eq!(fan_point.get_duty_between_points(next_point, 30_00), Some(35_00)); + assert_eq!(fan_point.get_duty_between_points(next_point, 35_00), None); } #[test] @@ -349,62 +349,62 @@ mod tests { let standard = FanCurve::standard(); assert_eq!(standard.get_duty(0), Some(0)); - assert_eq!(standard.get_duty(4499), Some(0)); - assert_eq!(standard.get_duty(4500), Some(3000)); - assert_eq!(standard.get_duty(5500), Some(3500)); - assert_eq!(standard.get_duty(6500), Some(4000)); - assert_eq!(standard.get_duty(7500), Some(5000)); - assert_eq!(standard.get_duty(7800), Some(6000)); - assert_eq!(standard.get_duty(8100), Some(7000)); - assert_eq!(standard.get_duty(8400), Some(8000)); - assert_eq!(standard.get_duty(8600), Some(9000)); - assert_eq!(standard.get_duty(8800), Some(10000)); - assert_eq!(standard.get_duty(10000), Some(10000)); + assert_eq!(standard.get_duty(44_99), Some(0)); + assert_eq!(standard.get_duty(45_00), Some(30_00)); + assert_eq!(standard.get_duty(55_00), Some(35_00)); + assert_eq!(standard.get_duty(65_00), Some(40_00)); + assert_eq!(standard.get_duty(75_00), Some(50_00)); + assert_eq!(standard.get_duty(78_00), Some(60_00)); + assert_eq!(standard.get_duty(81_00), Some(70_00)); + assert_eq!(standard.get_duty(84_00), Some(80_00)); + assert_eq!(standard.get_duty(86_00), Some(90_00)); + assert_eq!(standard.get_duty(88_00), Some(100_00)); + assert_eq!(standard.get_duty(100_00), Some(100_00)); } #[test] fn hedt_points() { let hedt = FanCurve::hedt(); - assert_eq!(hedt.get_duty(0), Some(3000)); - assert_eq!(hedt.get_duty(5000), Some(3500)); - assert_eq!(hedt.get_duty(6000), Some(4500)); - assert_eq!(hedt.get_duty(7000), Some(5500)); - assert_eq!(hedt.get_duty(7400), Some(6000)); - assert_eq!(hedt.get_duty(7600), Some(7000)); - assert_eq!(hedt.get_duty(7800), Some(8000)); - assert_eq!(hedt.get_duty(8100), Some(10000)); - assert_eq!(hedt.get_duty(10000), Some(10000)); + assert_eq!(hedt.get_duty(0), Some(30_00)); + assert_eq!(hedt.get_duty(50_00), Some(35_00)); + assert_eq!(hedt.get_duty(60_00), Some(45_00)); + assert_eq!(hedt.get_duty(70_00), Some(55_00)); + assert_eq!(hedt.get_duty(74_00), Some(60_00)); + assert_eq!(hedt.get_duty(76_00), Some(70_00)); + assert_eq!(hedt.get_duty(78_00), Some(80_00)); + assert_eq!(hedt.get_duty(81_00), Some(100_00)); + assert_eq!(hedt.get_duty(10_000), Some(100_00)); } #[test] fn threadripper2_points() { let threadripper2 = FanCurve::threadripper2(); - assert_eq!(threadripper2.get_duty(0), Some(3000)); - assert_eq!(threadripper2.get_duty(4000), Some(4000)); - assert_eq!(threadripper2.get_duty(4750), Some(5000)); - assert_eq!(threadripper2.get_duty(5500), Some(6500)); - assert_eq!(threadripper2.get_duty(6250), Some(8500)); - assert_eq!(threadripper2.get_duty(6625), Some(10000)); - assert_eq!(threadripper2.get_duty(10000), Some(10000)); + assert_eq!(threadripper2.get_duty(0), Some(30_00)); + assert_eq!(threadripper2.get_duty(40_00), Some(40_00)); + assert_eq!(threadripper2.get_duty(47_50), Some(50_00)); + assert_eq!(threadripper2.get_duty(55_00), Some(65_00)); + assert_eq!(threadripper2.get_duty(62_50), Some(85_00)); + assert_eq!(threadripper2.get_duty(66_25), Some(100_00)); + assert_eq!(threadripper2.get_duty(100_00), Some(100_00)); } #[test] fn xeon_points() { let xeon = FanCurve::xeon(); - assert_eq!(xeon.get_duty(0), Some(4000)); - assert_eq!(xeon.get_duty(5000), Some(4000)); - assert_eq!(xeon.get_duty(5500), Some(4500)); - assert_eq!(xeon.get_duty(6000), Some(5000)); - assert_eq!(xeon.get_duty(6500), Some(5500)); - assert_eq!(xeon.get_duty(7000), Some(6000)); - assert_eq!(xeon.get_duty(7200), Some(6500)); - assert_eq!(xeon.get_duty(7400), Some(8000)); - assert_eq!(xeon.get_duty(7600), Some(8500)); - assert_eq!(xeon.get_duty(7700), Some(9000)); - assert_eq!(xeon.get_duty(7800), Some(10000)); - assert_eq!(xeon.get_duty(10000), Some(10000)); + assert_eq!(xeon.get_duty(0), Some(40_00)); + assert_eq!(xeon.get_duty(50_00), Some(40_00)); + assert_eq!(xeon.get_duty(55_00), Some(45_00)); + assert_eq!(xeon.get_duty(60_00), Some(50_00)); + assert_eq!(xeon.get_duty(65_00), Some(55_00)); + assert_eq!(xeon.get_duty(70_00), Some(60_00)); + assert_eq!(xeon.get_duty(72_00), Some(65_00)); + assert_eq!(xeon.get_duty(74_00), Some(80_00)); + assert_eq!(xeon.get_duty(76_00), Some(85_00)); + assert_eq!(xeon.get_duty(77_00), Some(90_00)); + assert_eq!(xeon.get_duty(78_00), Some(100_00)); + assert_eq!(xeon.get_duty(100_00), Some(100_00)); } } From b611851447d2ac10aecc04ae6ffb72375586028a Mon Sep 17 00:00:00 2001 From: Andrei Gherzan Date: Wed, 21 Sep 2022 21:26:59 +0100 Subject: [PATCH 3/3] fan: Simplify and clarify the interpolation functions First of all, this clarifies what kind of interpolation is done in "interpolate_duties" by renaming it to "linear_interpolation_duty". This function mathematically handles the cases where the point to be fit is one of the boundaries so there is no need for extra logic of that in "get_duty_between_points". This change also includes some minor rewordings and formatting. Signed-off-by: Andrei Gherzan --- src/fan.rs | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/fan.rs b/src/fan.rs index e9006d04..1986fc65 100644 --- a/src/fan.rs +++ b/src/fan.rs @@ -177,29 +177,19 @@ pub struct FanPoint { impl FanPoint { pub fn new(temp: i16, duty: u16) -> Self { Self { temp, duty } } - /// Find the duty between two points and a given temperature, if the temperature - /// lies within this range. + /// Find the duty between two points and a given temperature if the temperature lies within + /// this range, otherwise, return None. fn get_duty_between_points(self, next: FanPoint, temp: i16) -> Option { - // If the temp matches the next point, return the next point duty - if temp == next.temp { - return Some(next.duty); - } - - // If the temp matches the previous point, return the previous point duty - if temp == self.temp { - return Some(self.duty); - } - - // If the temp is in between the previous and next points, interpolate the duty - if self.temp < temp && next.temp > temp { - return Some(self.interpolate_duties(next, temp)); + if self.temp <= temp && next.temp >= temp { + return Some(self.linear_interpolation_duty(next, temp)); } None } - /// Interpolates the current duty with that of the given next point and temperature. - fn interpolate_duties(self, next: FanPoint, temp: i16) -> u16 { + /// Construct the linear interpolation defined by two points (self and next), fit the point + /// defined by temp and return its duty. + fn linear_interpolation_duty(self, next: FanPoint, temp: i16) -> u16 { let dtemp = next.temp - self.temp; let dduty = next.duty - self.duty;