#ifndef EEPROM_EMUL_H
#define EEPROM_EMUL_H

#include "stm32f1xx_hal.h"

// Адреса для эмуляции EEPROM (последние страницы Flash)
#define EEPROM_START_ADDRESS    0x0800F000  // Последний килобайт Flash
#define EEPROM_PAGE_SIZE        1024        // Размер страницы STM32F103
#define EEPROM_SIZE             1024        // Общий размер EEPROM

// Максимальное количество переменных
#define EEPROM_MAX_VARIABLES    64

// Статусы операций
typedef enum {
    EEPROM_OK      = 0,
    EEPROM_ERROR   = 1,
    EEPROM_INVALID = 2,
    EEPROM_FULL    = 3
} EEPROM_Status;

// Структура элемента данных
#pragma pack(push, 1)
typedef struct {
    uint16_t address;    // Адрес переменной (0-EEPROM_MAX_VARIABLES)
    uint16_t data;       // Данные
    uint32_t timestamp;  // Временная метка
} EEPROM_Item;
#pragma pack(pop)

typedef struct {
    uint8_t data[EEPROM_SIZE]; // Массив для хранения данных
    uint16_t head;             // Указатель на место записи
    uint16_t tail;             // Указатель на место чтения
} RingBuffer_t;


// Инициализация EEPROM
EEPROM_Status EEPROM_Init(void);

// Чтение данных
EEPROM_Status EEPROM_Read(uint16_t virt_address, uint16_t* data);

// Запись данных
EEPROM_Status EEPROM_Write(uint16_t virt_address, uint16_t data);

// Массовая запись
EEPROM_Status EEPROM_WriteMultiple(uint16_t virt_address, uint8_t* data, uint16_t size);

// Получение информации о EEPROM
void EEPROM_GetInfo(uint32_t* used, uint32_t* total);

// Полное форматирование
EEPROM_Status EEPROM_Format(void);

#endif