#ifndef SETTINGS_API_H
#define SETTINGS_API_H

#include "at32f403a_407.h"
#include <stdbool.h>
#include "usart.h"
#include "sys_api.h"
#include "mb.h"
#include "mbport.h"


#define MODEL_LEN           16


// ------------------------------------------------------------------- //
//					 		Modbus
// ------------------------------------------------------------------- //

// Modbus 
typedef struct
{
	rate_t     baud;		// Скорость порта 
	parity_t   parity;		// Четность 
	databits_t databits;	// Число бит данных
	stopbits_t stopbits;	// Число стоп-бит  

} modbus_t;


// Общая структура настроек для IAP и FW
typedef struct
{
    uint16_t    mb_port;    // Настройки порта для modbus
    //char model[MODEL_LEN];  // Модель
      
} com_settings_t;


// Полная структура настроек
typedef struct
{
    com_settings_t  com_settings;
    uint32_t        critical_section_crc;
    
} settings_t;

//
typedef enum 
{
	MB_BOOT_ERR_NO            = 0x01,
    
    MB_BOOT_ERR_WRONG_CONTENT = 0x02,
    MB_BOOT_ERR_WRONG_FW_SIZE = 0x03,
	MB_BOOT_ERR_WRONG_KEY     = 0x04,
	MB_BOOT_FLASH_ERR         = 0x05,
    MB_BOOT_WRONG_PACK_INDEX  = 0x06, 
    MB_BOOT_ERR_WRONG_FW_CRC  = 0x07,

} mb_err_code_t ;


// Загрузка структуры настроек из flesh
void settings_load(settings_t *settings);

//
void init_settings(void);

//
void settings_read_from_flash(uint8_t *data, uint32_t size);

//
uint32_t settings_get_crc(settings_t *settings);

//
uint32_t settings_get_crit_sec_crc(settings_t *settings);

// Сброс всех настроек в значения по умолчанию
void settings_set_all_default(void);


// -------------------------------------------------------------------------- //
// Настройки по умолчанию

//
void settings_set_modbus_def(uint16_t *mb_port);

//
void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port);

// Установка параметров Modbus
void settings_set_modbus_params(uint16_t mb_port);

// -------------------------------------------------------------------------- //

// Запись структуры настроек во flash
void settings_save(settings_t *settings);

//
void settings_write_to_flash(uint8_t *data, uint32_t size);

// Очистка сектора настроек
void settings_erase_flash_sector(void);

//
uint32_t settings_get_mb_baud(modbus_t *mb_settings);

//
eMBParity settings_get_mb_par(modbus_t *mb_settings);

// Системные настройки
extern sys_settings_t sys_settings;

//
extern settings_t settings;

//
extern modbus_t mb_port_settings;

#endif /* #ifndef SETTINGS_API_H */

