#include "stm32c0xx_hal.h"
#include <inttypes.h>
#include <stdbool.h>

/**
 * @file    eeprom_emulation.h
 * @brief   Einfache EEPROM-Emulation für STM32C031 (Double-Word Schreibzugriff)
 * @note    Nutzt die HAL-Library für Flash-Operationen.
 */

#ifndef EEPROM_EMULATION_H
#define EEPROM_EMULATION_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stm32c0xx_hal.h"
#include <stddef.h>

/* --- KONFIGURATION --- */

/** * @brief Flash-Adresse für die Emulation.
 * Für STM32C031 mit 32KB Flash ist 0x08007800 der Start der letzten Page (Page 15).
 * WICHTIG: Sicherstellen, dass der Programmcode diese Adresse nicht erreicht!
 */

#define MY_EEPROM_FLASH_ADDR   ((uint32_t)0x08007800)


/** @brief Die entsprechende Page-Nummer zur Adresse (für das Löschen benötigt) */
#define MY_EEPROM_PAGE         15

#define FLASH_PAGE_SIZE_C0     2048        // 2 KB Page Size für STM32C0

#define FIRST_START_ID			2

/* --- FUNKTIONEN --- */

/**
 * @brief Liest eine Datenstruktur direkt aus dem Flash-Speicher.
 * * @param data_ptr Zeiger auf die Ziel-Struktur im RAM (z.B. &myConfig).
 * @param size     Größe der Struktur in Bytes (sizeof(myConfig)).
 */
void EEPROM_Read(void* data_ptr, size_t size);

/**
 * @brief Speichert eine Datenstruktur im Flash-Speicher.
 * * Diese Funktion prüft zuerst, ob sich die Daten im Vergleich zum Flash 
 * geändert haben. Falls ja, wird die gesamte Flash-Page gelöscht und 
 * die Struktur neu geschrieben (Double-Word Alignment wird automatisch gehandhabt).
 * * @param data_ptr Zeiger auf die zu speichernde Struktur im RAM.
 * @param size     Größe der Struktur in Bytes.
 * @return HAL_StatusTypeDef HAL_OK bei Erfolg, ansonsten Fehlercode.
 */
HAL_StatusTypeDef EEPROM_Write(void* data_ptr, size_t size);



void EEPROM_WriteDefaults(void);
void EEPROM_ReadDeviceParameter(void);
uint16_t EEPROM_ReadFirstStart(void);
void EEPROM_StoreConfig(bool writeSN);

typedef struct __attribute__((packed))
{
	uint32_t sn;
	uint32_t baudrate;															// 8-9	Die Modbus Baudrate (default 19200 Bit/s). Gltig im Bereich von 50 Bit/s bis 1000 000 Bit/s
	uint16_t parityMode;														// 10	UART Parity Mode (default EVEN) mgliche Werte 0=EVEN, 1=ODD, 2=NONE
	uint16_t stopBit;															// 11	UART Stop Bit Reserviert, Aktuell automatisch selektiert nach Modbus standart Bei Parity EVEN oder ODD 1, bei NONE werden 2 stopbits genutzt
	uint16_t slave_address;														// 12	Modbus Slave Adresse (default 1) mgliche Werte von 1 bis 247
	uint16_t first_start_id;

} flash_device_parameter_t ;



#ifdef __cplusplus
}
#endif

#endif /* EEPROM_EMULATION_H */