/********************************* (C) РОТЕК ***********************************
 * @module  settings_api
 * @file    settings_api.h
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   settings_api
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */

/* Define to prevent recursive  ----------------------------------------------*/
#ifndef SETTINGS_API_H
#define SETTINGS_API_H

#include "stm32f4xx.h"
#include <stdbool.h>

/**
* @brief  Параметры обновления ПО
  */
typedef struct
{
  uint8_t loadMode; // 0 - основная прошивка, 1 - режим обновления ПО
  uint8_t bootTry;  // Признак 
  
} BOOT_PARAMS_t;

/**
  * @brief  Параметры сетевого подключения
  */
typedef struct
{
  char    ip[16];
  char    gate[16];
  char    mask[16];
  uint8_t dhcpEnable;  // 0 - DHCP отключен, 1 - включен
	
} WEB_PARAMS_t;

/**
  * @brief  Параметры SNMP
  */
typedef struct
{
  char sysDescr[160];
  char readCommunity[20];
  char writeCommunity[20];
  char sysContact[50];
  char sysName[20];
  char sysLocation[110];
  char managerIP[20];
  char managerIP2[20];
  char managerIP3[20];
  
} SNMP_t;

/**
  * @brief  Информация об устройстве
  */
typedef struct
{
  char  productionData[40];  // Дата производства
  char  mac[18];             // MAC адрес
  char  serialNumber[16];    // Серийный номер
  char  comments[110];       // Комментарии
  
} DEVICE_INFO_t; 

/**
  * @brief  Флаги, ключи и т.д.
  */
typedef struct
{
  bool netsettingsChanged;   // Признак изменения сетевых настроек пользователем
  char testState[16];        // Статус производственного тестирования
} FLAGS_t;
  
/**
  * @brief  Общая структура настроек
  */
typedef struct
{
  BOOT_PARAMS_t bootParams;
  WEB_PARAMS_t  sWebParams;
  WEB_PARAMS_t  sWebTempParams;
  DEVICE_INFO_t sInfo;
  uint32_t      CritSecCRC;
  //uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек

} SETTINGS_t;


/**
  * @brief
  * @retval
  */
uint32_t SETTINGS_GetCritSecCRC(void);
/**
  * @brief  Установить параметры обновления ПО по умолчанию
  */
void SETTINGS_SetBootParamsDef(void);

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

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

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

/**
  * @brief  Очистка сектора настроек
  */
void SETTINGS_EraseFlashSector(void);

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

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

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

/**
  * @brief  Установка настроек для отладки
  */
void SETTINGS_SetDefaultDebug(void);

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

/**
  * @brief  Загрузка структуры настроек из flesh
  */
void SETTINGS_Load(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  Преобразует mac адрес строкового формата в массив uint8_t
  * @param  mac - буфер для вывода mac адреса
  */
void SETTINGS_GetMac(uint8_t *mac);

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

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

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

#endif /* #ifndef SETTINGS_API_H */

/********************************* (C) РОТЕК **********************************/
