/**
 * @file lut.h
 * @brief 查找表数据结构 + CW→RGBWC 插值算法（算法一）
 *
 * 算法来源：HTML JavaScript runCalc() / interp() 函数，整数定点移植
 * 精度规则：比例系数放大 FIXED_SCALE(10000) 倍计算，最终 clamp 到 [0,255]
 */

#ifndef LUT_H
#define LUT_H

#include <stdint.h>
#include "hc32f003_config.h"

/* =========================================================
 * 数据结构
 * ========================================================= */

/** 查找表单个节点（7字节） */
typedef struct {
    uint8_t w1;  /* 暖白输入阈值 (0-255)，按降序存储 */
    uint8_t c1;  /* 冷白输入阈值 (0-255) */
    uint8_t r;   /* R 补光输出 */
    uint8_t g;   /* G 补光输出 */
    uint8_t b;   /* B 补光输出 */
    uint8_t w;   /* W 补光输出 */
    uint8_t c;   /* C 补光输出（此产品恒为 0） */
} LutPoint_t;

/** 完整查找表（2层 × 20点 + CRC32） */
typedef struct {
    LutPoint_t layer[LUT_LAYER_COUNT][LUT_POINTS_PER_LAYER];
    uint32_t   crc;   /* CRC32 校验，覆盖 layer 数组 */
} LutTable_t;

/** 5 路输出结果 */
typedef struct {
    uint8_t r;
    uint8_t g;
    uint8_t b;
    uint8_t w;
    uint8_t c;
} RgbwcOut_t;

/* =========================================================
 * 全局查找表实例（可被 flash_store 更新）
 * ========================================================= */
extern LutTable_t g_lut;

/* =========================================================
 * 函数声明
 * ========================================================= */

/**
 * @brief 初始化查找表为内置默认值
 */
void LUT_LoadDefault(void);

/**
 * @brief 算法一：根据 CW 输入计算 RGBWC 补光输出
 *
 * 移植自 HTML runCalc(inputW, inputC) 函数
 *
 * @param inputW  暖白 PWM 占空比 (0-255)
 * @param inputC  冷白 PWM 占空比 (0-255)
 * @param out     输出结果指针
 */
void LUT_CalcCW(uint8_t inputW, uint8_t inputC, RgbwcOut_t *out);

#endif /* LUT_H */
