#include "EEPROM.h"
#include "stdio.h"
void Inf_AT24C02_Init(void)
{
    HAL_I2C_Init(&hi2c2);
}

void Inf_AT24C02_WriteByte(uint8_t innerAddr, uint8_t byte)
{
    HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);

    HAL_Delay(5);
    
}

uint8_t Inf_AT24C02_ReadByte(uint8_t innerAddr)
{
    uint8_t byte;
    HAL_I2C_Mem_Read(&hi2c2,ADDR+1,innerAddr,I2C_MEMADD_SIZE_8BIT,&byte,1,2000);
    return byte;
}
void Inf_AT24C02_WriteBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t len)
{
    HAL_I2C_Mem_Write(&hi2c2,ADDR,innerAddr,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);
    HAL_Delay(5);
}
void Inf_AT24C02_ReadBytes(uint8_t innerAddr, uint8_t *bytes, uint8_t len)
{
    HAL_I2C_Mem_Read(&hi2c2,ADDR+1,innerAddr,I2C_MEMADD_SIZE_8BIT,bytes,len,2000);

}

// 清空整个AT24C02 EEPROM (写入0xFF)
void Clear_EEPROM_All(void)
{
    uint16_t addr; // 使用 uint16_t 以防地址超过 255 (虽然AT24C02不会)
    uint8_t clear_data = 0xFF; // 定义要写入的值，通常用 0xFF

   // printf("开始清空整个 EEPROM...\r\n");

    // AT24C02 有 256 个字节地址 (0 到 255)
    for(addr = 0; addr < 256; addr++)
    {
        // 调用你驱动中的单字节写入函数
        Inf_AT24C02_WriteByte((uint8_t)addr, clear_data);

        // 你驱动中的 Inf_AT24C02_WriteByte 已经包含了 HAL_Delay(5)，
        // 所以这里不需要额外加延时，除非你需要更长的延时。

        // 可以选择性地加一个进度打印，但会拖慢速度
        // if ((addr + 1) % 32 == 0) { // 每写入32个字节打印一次
        //     printf("已清空 %d / 256 字节...\r\n", addr + 1);
        // }
    }

   // printf("EEPROM 清空完成。\r\n");
}


void Save_Float_To_EEPROM(uint8_t addr, float data)
{
    uint8_t bytes[4]; // 用于存储浮点数的字节数组
    memcpy(bytes,&data,sizeof(float));
    Inf_AT24C02_WriteBytes(addr,bytes,4);

}

float Read_Float_From_EEPROM(uint8_t addr)
{
    uint8_t bytes[4];
    float data;
    Inf_AT24C02_ReadBytes(addr,bytes,4);
    memcpy(&data,bytes,sizeof(float));
    return data;

}


void Save_Energy_To_EEPROM(float energy)
{
    // 保存能量值
    Save_Float_To_EEPROM(EEPROM_ENERGY_ADDR, energy); // 保存能量值到 EEPROM

    // 保存标志位
    Inf_AT24C02_WriteByte(EEPROM_ENERGY_FLAG, EEPROM_ENERGY_FLAG_VAL);
}


float Load_Energy_From_EEPROM(void)
{
    float energy = 0.0f; // 默认值
    uint8_t flag;
    flag = Inf_AT24C02_ReadByte(EEPROM_ENERGY_FLAG); // 读取标志位

    if(flag == EEPROM_ENERGY_FLAG_VAL)
    {
        energy=Read_Float_From_EEPROM(EEPROM_ENERGY_ADDR); // 读取能量值
    }
    else
    {
        energy=0.0f; // 未找到有效数据，返回默认值
        Save_Energy_To_EEPROM(energy); // 保存默认值到 EEPROM
    }
    return energy;
}
