#include <temp_curve.h>

extern float temps[3] __xMR;
extern float temp_curve_points_x[3][3] __xMR;
extern float temp_curve_points_y[3][3] __xMR;
extern float temp_matrix[3][3] __xMR;

float __xMR compute_rpm(uint8_t fan_n)
{
        float sys_temp = (temps[0] * temp_matrix[fan_n][0]) +
                (temps[1] * temp_matrix[fan_n][1]) +
                (temps[2] * temp_matrix[fan_n][2]);

        if (sys_temp < temp_curve_points_x[fan_n][0])
                return temp_curve_points_y[fan_n][0];

        if (sys_temp < temp_curve_points_x[fan_n][1])
                return temp_curve_points_y[fan_n][0] +
                        (temp_curve_points_y[fan_n][1] - temp_curve_points_y[fan_n][0])*
                        (sys_temp - temp_curve_points_x[fan_n][0])/
                        (temp_curve_points_x[fan_n][1] - temp_curve_points_x[fan_n][0]);

        if (sys_temp < temp_curve_points_x[fan_n][2])
                return temp_curve_points_y[fan_n][1] +
                        (temp_curve_points_y[fan_n][2] - temp_curve_points_y[fan_n][1])*
                        (sys_temp - temp_curve_points_x[fan_n][1])/
                        (temp_curve_points_x[fan_n][2] - temp_curve_points_x[fan_n][1]);

        return temp_curve_points_y[fan_n][2];
}
