diff options
Diffstat (limited to 'test/fan.c')
-rw-r--r-- | test/fan.c | 114 |
1 files changed, 113 insertions, 1 deletions
diff --git a/test/fan.c b/test/fan.c index d03aa0213c..99a3847257 100644 --- a/test/fan.c +++ b/test/fan.c @@ -105,9 +105,121 @@ static int test_fan(void) return EC_SUCCESS; } -void run_test(int argc, char **argv) +/* Provide a test driver to make test easier to read. */ +int temp_to_rpm(int temperature_c) +{ + const int temp_fan_off = C_TO_K(35); + const int temp_fan_max = C_TO_K(55); + const struct fan_step_1_1 fan_table[] = { + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(35), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(41), + .rpm = 2500 }, + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(37), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(43), + .rpm = 3200 }, + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(42), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(45), + .rpm = 3500 }, + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(44), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(47), + .rpm = 3900 }, + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(46), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(49), + .rpm = 4500 }, + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(48), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(52), + .rpm = 5100 }, + { .decreasing_temp_ratio_threshold = TEMP_TO_RATIO(51), + .increasing_temp_ratio_threshold = TEMP_TO_RATIO(55), + .rpm = 5400 }, + }; + const int num_fan_levels = ARRAY_SIZE(fan_table); + int temp_ratio = TEMP_TO_RATIO(temperature_c); + + int rpm = temp_ratio_to_rpm_hysteresis(fan_table, num_fan_levels, 0, + temp_ratio, NULL); + + fan_set_rpm_target(FAN_CH(0), rpm); + return rpm; +} + +static int test_temp_ratio_to_rpm_hysteresis(void) +{ + const int ZERO = 0; + /* set initial value to be different so that a log message appears */ + fan_set_rpm_target(FAN_CH(0), 5400); + /* initial turn-on behavior, ramp up. @ represents fan speed; + temp */ + TEST_ASSERT(temp_to_rpm(30) == ZERO); /* @+. . 40 . 50 .60 */ + TEST_ASSERT(temp_to_rpm(30) == ZERO); /* @+. . . . . . */ + TEST_ASSERT(temp_to_rpm(35) == ZERO); /* @ + . . . . */ + TEST_ASSERT(temp_to_rpm(37) == ZERO); /* @ . + . . . . */ + TEST_ASSERT(temp_to_rpm(39) == ZERO); /* @ . +. . . . */ + TEST_ASSERT(temp_to_rpm(40) == ZERO); /* @ . + . . . */ + TEST_ASSERT(temp_to_rpm(41) == 2500); /* @. .+ . . . */ + TEST_ASSERT(temp_to_rpm(36) == 2500); /* @.+ . . . . */ + TEST_ASSERT(temp_to_rpm(42) == 2500); /* @. . + . . . */ + TEST_ASSERT(temp_to_rpm(43) == 3200); /* @ . + . . . */ + TEST_ASSERT(temp_to_rpm(38) == 3200); /* @ + . . . . */ + TEST_ASSERT(temp_to_rpm(44) == 3200); /* @ . +. . . */ + TEST_ASSERT(temp_to_rpm(45) == 3500); /* .@ . + . . */ + TEST_ASSERT(temp_to_rpm(43) == 3500); /* .@ . + . . . */ + TEST_ASSERT(temp_to_rpm(46) == 3500); /* .@ . .+ . . */ + TEST_ASSERT(temp_to_rpm(47) == 3900); /* . @ . . + . . */ + TEST_ASSERT(temp_to_rpm(45) == 3900); /* . @ . + . . */ + TEST_ASSERT(temp_to_rpm(48) == 3900); /* . @ . . + . . */ + TEST_ASSERT(temp_to_rpm(49) == 4500); /* . @ . . +. . */ + TEST_ASSERT(temp_to_rpm(47) == 4500); /* . @ . . + . . */ + TEST_ASSERT(temp_to_rpm(51) == 4500); /* . @ . . .+ . */ + TEST_ASSERT(temp_to_rpm(52) == 5100); /* . @. . . + . */ + TEST_ASSERT(temp_to_rpm(49) == 5100); /* . @. . +. . */ + TEST_ASSERT(temp_to_rpm(54) == 5100); /* . @. . . +. */ + TEST_ASSERT(temp_to_rpm(55) == 5400); /* . @ . . + */ + TEST_ASSERT(temp_to_rpm(52) == 5400); /* . @ . . + . */ + TEST_ASSERT(temp_to_rpm(60) == 5400); /* . @ . 50 ..+ */ + /* cool-down */ + TEST_ASSERT(temp_to_rpm(55) == 5400); /* . @ . . + */ + TEST_ASSERT(temp_to_rpm(52) == 5400); /* . @ . . + . */ + TEST_ASSERT(temp_to_rpm(51) == 5100); /* . @. . .+ . */ + TEST_ASSERT(temp_to_rpm(54) == 5100); /* . @. . . +. */ + TEST_ASSERT(temp_to_rpm(49) == 5100); /* . @. . +. . */ + TEST_ASSERT(temp_to_rpm(48) == 4500); /* . @ . . + . . */ + TEST_ASSERT(temp_to_rpm(51) == 4500); /* . @ . . .+ . */ + TEST_ASSERT(temp_to_rpm(47) == 4500); /* . @ . . + . . */ + TEST_ASSERT(temp_to_rpm(46) == 3900); /* . @ . .+ . . */ + TEST_ASSERT(temp_to_rpm(48) == 3900); /* . @ . . + . . */ + TEST_ASSERT(temp_to_rpm(45) == 3900); /* . @ . + . . */ + TEST_ASSERT(temp_to_rpm(44) == 3500); /* .@ . +. . . */ + TEST_ASSERT(temp_to_rpm(46) == 3500); /* .@ . .+ . . */ + TEST_ASSERT(temp_to_rpm(43) == 3500); /* .@ . + . . . */ + TEST_ASSERT(temp_to_rpm(42) == 3200); /* @ . + . . . */ + TEST_ASSERT(temp_to_rpm(44) == 3200); /* @ . +. . . */ + TEST_ASSERT(temp_to_rpm(38) == 3200); /* @ + . . . . */ + TEST_ASSERT(temp_to_rpm(37) == 2500); /* @. + . . . . */ + TEST_ASSERT(temp_to_rpm(42) == 2500); /* @. . + . . . */ + TEST_ASSERT(temp_to_rpm(36) == 2500); /* @.+ . . . . */ + TEST_ASSERT(temp_to_rpm(35) == ZERO); /* @ + 40 . 50 . */ + /* warm up again */ + TEST_ASSERT(temp_to_rpm(38) == ZERO); /* @ . + . . . . */ + /* jumping */ + TEST_ASSERT(temp_to_rpm(46) == 3500); /* .@ . .+ . . */ + TEST_ASSERT(temp_to_rpm(36) == 2500); /* @.+ . . . . */ + TEST_ASSERT(temp_to_rpm(35) == ZERO); /* @ + . . . . */ + TEST_ASSERT(temp_to_rpm(37) == ZERO); /* @ . + . . . . */ + TEST_ASSERT(temp_to_rpm(46) == 3500); /* .@ . .+ . . */ + TEST_ASSERT(temp_to_rpm(54) == 5100); /* . @. . . +. */ + TEST_ASSERT(temp_to_rpm(55) == 5400); /* . @ . . + */ + TEST_ASSERT(temp_to_rpm(60) == 5400); /* . @ . . ..+ */ + TEST_ASSERT(temp_to_rpm(53) == 5400); /* . @ . . + . */ + TEST_ASSERT(temp_to_rpm(46) == 3900); /* . @ . .+ . . */ + TEST_ASSERT(temp_to_rpm(30) == ZERO); /* @+. . 40 . 50 . */ + + return EC_SUCCESS; +} + +void run_test(int argc, const char **argv) { RUN_TEST(test_fan); + RUN_TEST(test_temp_ratio_to_rpm_hysteresis); test_print_result(); } |