/**
 * @file    is31fl3729.c
 * @brief   IS31FL3729 15x9 LED矩阵驱动实现
 */

#include "is31fl3729.h"
#include "fsl_lpi2c.h"
#include "app.h"

static LPI2C_Type *s_i2cBase;      // I2C外设基地址
static uint8_t s_i2cAddr;          // I2C从机地址

// 私有函数：I2C写寄存器
static int I2C_WriteReg(uint8_t reg, uint8_t value) {
    lpi2c_master_transfer_t transfer = {
        .slaveAddress = s_i2cAddr,
        .direction = kLPI2C_Write,
        .subaddress = reg,
        .subaddressSize = 1,
        .data = &value,
        .dataSize = 1,
        .flags = kLPI2C_TransferDefaultFlag
    };
    status_t status = LPI2C_MasterTransferBlocking(s_i2cBase, &transfer);
    
    if (status == kStatus_LPI2C_Nak) {
        // 从机未应答
        return IS31FL3729_ERR_NAK;
    } else if (status != kStatus_Success) {
        // 其他I2C错误（如仲裁丢失、总线错误）
        return IS31FL3729_ERR_I2C;
    }
    return IS31FL3729_OK;
}

// 初始化函数
int IS31FL3729_Init(const is31fl3729_config_t *config) {
    s_i2cBase = config->i2cBase;
    s_i2cAddr = config->i2cAddr;
    uint8_t i,reset_flag;

    // 1. 初始化I2C外设
    lpi2c_master_config_t masterConfig;
    LPI2C_MasterGetDefaultConfig(&masterConfig);
    masterConfig.baudRate_Hz = config->i2cClockFreq;
    LPI2C_MasterInit(s_i2cBase, &masterConfig, LPI2C_MASTER_CLOCK_FREQUENCY);
    
    // 3. 复位芯片（写入0xAE到复位寄存器） 一次复位可能失败
    for(i=0;i<5;i++)
    {
    reset_flag = I2C_WriteReg(IS31FL3729_REG_RESET, 0xAE);
    if ( reset_flag == 0) break; 
     SDK_DelayAtLeastUs(10000, CLOCK_GetFreq(kCLOCK_CpuClk)); // 等待10ms
    }
    
    if ( reset_flag != 0) return -1; 
    
    


    // 4. 配置工作模式：15x9矩阵（SWS=0000），启用输出
    uint8_t configVal = (0x00 << 4) | 0x01; // SWS=0000, SSD=1
    if (I2C_WriteReg(IS31FL3729_REG_CONFIG, configVal) != 0) {
        return -2; // 配置寄存器写入失败
    }

    SDK_DelayAtLeastUs(1000, CLOCK_GetFreq(kCLOCK_CpuClk)); // 等待1ms
    
    // 5. 设置全局电流和缩放寄存器（最大亮度）
    I2C_WriteReg(IS31FL3729_REG_GLOBAL_CUR, 0x40); // GCC=64（0b1000000）
    for (uint8_t i = 0; i < IS31FL3729_COLS; i++) {
       I2C_WriteReg(IS31FL3729_REG_SCALING + i, 0xFF); // 每个CSy缩放为255
    }
    
    SDK_DelayAtLeastUs(1000, CLOCK_GetFreq(kCLOCK_CpuClk)); // 等待1ms

//    I2C_WriteReg(IS31FL3729_REG_R_SEL, 0x33); // 

//    SDK_DelayAtLeastUs(1000, CLOCK_GetFreq(kCLOCK_CpuClk)); // 等待1ms
    
//    I2C_WriteReg(IS31FL3729_REG_FRE, 0x01);
    
//    SDK_DelayAtLeastUs(1000, CLOCK_GetFreq(kCLOCK_CpuClk)); // 等待1ms
    
    // 6. 初始化所有PWM值为0（关闭LED）
    for (uint16_t i = 0; i < IS31FL3729_ROWS * IS31FL3729_COLS; i++) {
        I2C_WriteReg(IS31FL3729_REG_PWM_BASE + i, 0);
    }

    SDK_DelayAtLeastUs(1000, CLOCK_GetFreq(kCLOCK_CpuClk)); // 等待1ms   
    
    return 0;
}

// 设置单个LED亮度（行：0~8，列：0~14）
int IS31FL3729_SetLED(uint8_t row, uint8_t col, uint8_t brightness) {
    if (row >= IS31FL3729_ROWS || col >= IS31FL3729_COLS) {
        return IS31FL3729_ERR_I2C;
    }
    uint16_t ledIndex = row * IS31FL3729_COLS + col;
    return I2C_WriteReg(IS31FL3729_REG_PWM_BASE + ledIndex, brightness);
}

// 启用输出（软件控制）
void IS31FL3729_EnableOutput(void) {
    I2C_WriteReg(IS31FL3729_REG_CONFIG, 0x01); // SSD=1
}

// 关闭输出（软件关机）
void IS31FL3729_DisableOutput(void) {
    I2C_WriteReg(IS31FL3729_REG_CONFIG, 0x00); // SSD=0
}