/**
 * calib_model.c - 电容值到油水比例的标定模块
 *
 * 支持:
 * - 三阶多项式拟合 根据标定点做多项式拟合（如 y = a·x³ +b·x² + c·x + d），推导出油水百分比 y 与电容 x 的函数关系
 * - 电容变化非线性明显
 * - 6~8 个点足够
 */
#include "Callback.h"
#include "calib_model.h"
#include "FLASH.h"
#include "main.h"

CalibCoeffs_t g_coeffs;
// ========================
// 默认三阶多项式系数
// ========================
float g_coeff_a = -0.0000116595f;
float g_coeff_b = 0.0096538179f;
float g_coeff_c = -2.3291849577f;
float g_coeff_d = 181.7567479858f;

// ========================
// 设置系数
// ========================
void Set_Calib_Coeffs(float a, float b, float c, float d)
{
    g_coeff_a = a;
    g_coeff_b = b;
    g_coeff_c = c;
    g_coeff_d = d;
}

// ========================
// 估算百分比（带限幅）
// ========================
float Estimate_Percentage(float cap)
{
    float percent = g_coeff_a * cap * cap * cap
                  + g_coeff_b * cap * cap
                  + g_coeff_c * cap
                  + g_coeff_d;

    if (percent < 0.0f) percent = 0.0f;
    if (percent > 100.0f) percent = 100.0f;
    return percent;
}

// 启动时读取系数
void Init_CalibModel_FromFlash(void)
{
    Load_Calib_Coeffs_FromFlash(&g_coeffs);
    Set_Calib_Coeffs(g_coeffs.a, g_coeffs.b, g_coeffs.c, g_coeffs.d);
		
}

// 保存时调用
void Save_Current_Calib_ToFlash(void)
{
    g_coeffs.a = g_coeff_a;
    g_coeffs.b = g_coeff_b;
    g_coeffs.c = g_coeff_c;
    g_coeffs.d = g_coeff_d;
    Save_Calib_Coeffs_ToFlash(&g_coeffs);
}

void pack_CalibModel_a(void) //  float g_coeff_a --> uint32_t uint_coeff_a
{
    memcpy(&uint_coeff_a, &g_coeff_a, sizeof(float));  // float --> uint32_t
}
void pack_CalibModel_b(void) //  float g_coeff_b --> uint32_t uint_coeff_b  
{
    memcpy(&uint_coeff_b, &g_coeff_b, sizeof(float));  // float --> uint32_t
}
void pack_CalibModel_c(void) //  float g_coeff_c --> uint32_t uint_coeff_c  
{
    memcpy(&uint_coeff_c, &g_coeff_c, sizeof(float));  // float --> uint32_t
}
void pack_CalibModel_d(void) //  float g_coeff_d --> uint32_t uint_coeff_d  
{
    memcpy(&uint_coeff_d, &g_coeff_d, sizeof(float));  // float --> uint32_t
}
