#ifndef SETTINGS_API_H
#define SETTINGS_API_H

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



// Изменить версию если поменялась структура настроек
#define SETTINGS_VERSION   0x01



// ------------------------------------------------------------------- //
//					 		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
    
} com_settings_t;



// Полная структура настроек
typedef struct
{
    com_settings_t  com_settings;
    uint32_t        critical_section_crc;
/* WARNING! До поля CritSecCRC включительно структура настроек должна быть
* идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
* Контроль целостности настроек внутри IAP выполняется только для критической секции,
* т.к. контроль целостности всей структуры не имеет смысла
* (структура настроек всегда будет отличаться внутри основного ПО).
* В случае повреждения критического сектора, загружаются параметры по умолчанию. */    
    uint16_t        settings_version;   // Версия структуры настроек 
    uint32_t        control_word;       // Слово для контроля целостности структуры настроек
} settings_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);

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

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

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

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


#if 0

// Общая структура настроек
typedef struct
{
    //uint32_t    
  WEB_PARAMS_t  sWebParams;
  WEB_PARAMS_t  sWebTempParams;
  DEVICE_INFO_t sInfo;
  uint32_t      CritSecCRC;
/* WARNING! До поля CritSecCRC включительно структура настроек должна быть
* идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
* Контроль целостности настроек внутри IAP выполняется только для критической секции,
* т.к. контроль целостности всей структуры не имеет смысла
* (структура настроек всегда будет отличаться внутри основного ПО).
* В случае повреждения критического сектора, загружаются параметры по умолчанию. */
  GSM_t         sGSM[NUM_GSM]; 
  FLAGS_t       sFlags;
  ETHERNET_t    sEthernet;      //настройка подключения Ethernet 
  SERVER_t      sServer;
  PROXY_t       sProxy;
  AUTH_t        sAuth[MAX_WEB_USERS];
  PORTGW_t      sPortGw[NUM_PORTGW];        // Настройки прозрачного порта
  SNTP_t        sSNTP;   
  PSD_t         sPSD;   
  uint16_t      settVer;       // Версия структуры настроек 
  uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек
} SETTINGS_t;

/**
  * @brief  Общая структура настроек
  */


/**
  * @brief
  * @retval
  */
uint32_t SETTINGS_GetCritSecCRC(void);

/**
  * @brief  Установить параметры сетевого подключения по умолчанию
  */
void SETTINGS_SetWebParamsDef(void);

/**
  * @brief  Установить временные параметры сетевого подключения по умолчанию
  */
void SETTINGS_SetTempWebParamsDef(void);

/**
  * @brief  Установить Информацию об устройстве по умолчанию
  */
void SETTINGS_SetInfoDef(void);

/**
  * @brief  Установить параметры сетевого подключения по умолчанию
  */
void SETTINGS_SetEthternetSwitchDef(void);

/**
  * @brief  Установить параметры GSM подключения по умолчанию
  */
void SETTINGS_SetGSMDef(void);

/**
  * @brief  Установить параметры SNTP по умолчанию
  */
void SETTINGS_SetSntpDef(void);

/**
  * @brief  Установить параметры подключения к серверу по умолчанию
  */
void SETTINGS_SetServerParamsDef(void);

/**
  * @brief  Установить параметры PROXY по умолчанию
  */
void SETTINGS_SetProxyParamsDef(void);

/**
  * @brief  Установить значение пароля по умолчанию
  */
void SETTINGS_SetServiceDef(void);

/**
  * @brief  Установить значение настроек прозрачного порта по умолчанию
  */
void SETTINGS_SetPortGwDef(void);

/**
  * @brief  Установить значение системы параллельной диспетчеризации по умолчанию
  */
void SETTINGS_SetPDSDef(void);

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

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

/**
  * @brief  Запись структуры настроек во flesh
  */
void SETTINGS_Save(void);


/**
  * @brief  
  */
void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size);

/**
  * @brief  
  */
void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size);

/**
  * @brief  
  */
uint32_t SETTINGS_GetCRC(void);

/**
  * @brief  Сброс флага boottry и сохранение структуры настроек
  */
void SETTINGS_ResetBootTry(void);

/**
  * @brief  Преобразует mac адрес строкового формата в массив uint8_t
  * @param  mac - буфер для вывода mac адреса
  */
void SETTINGS_GetMac(uint8_t *mac);

/**
  * @brief  Установить дату производства
  */
void SETTINGS_SetProDate(char *proDate, uint8_t len);

/**
  * @brief  Установить серийный номер
  */
void SETTINGS_SetSerialNumber(char *sn, uint8_t len);

/**
  * @brief  Установить MAC
  */
void SysSETTINGS_SetMAC(char *mac, uint8_t len);

/**
  * @brief  Установить статус тестирования
  */
void SETTINGS_StatusTest(char *status, uint8_t len);

/**
  * @brief  Установить статус тестирования "T2OK"
  */
void SETTINGS_SetT2OK(void);

/**
  * @brief  Сбросить статус тестирования "T2OK"
  */
void SETTINGS_ResetT2OK(void);

/**
  * @brief  Устанавливает mac адрес исходя из unique id
  */
void COM_SetTestMAC(void);

/**
  * @brief  Включить DHCP
  */
void SETTINGS_SetDHCPOn(void);


//
void SETTINGS_Print(void);
#endif

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

//
extern settings_t settings;


#endif /* #ifndef SETTINGS_API_H */

