/********************************* (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>
#include "d_inouts.h"
#include "common_config.h"
#include "lwip/opt.h"
#include "lwip/ip.h"

/* Предельные границы настроек */
#define MAX_VOLT_CELL_RANGE				3.0
#define MIN_VOLT_CELL_RANGE				0
#define MAX_VAC_MAX_RANGE				250
#define MAX_VAC_MIN_RANGE				220
#define MIN_VAC_MAX_RANGE				200
#define MIN_VAC_MIN_RANGE				110
#define HIST_VAC_MAX_RANGE				30
#define HIST_VAC_MIN_RANGE				10
#define MAX_TEMP_MAX_RANGE				80
#define MAX_TEMP_MIN_RANGE				40
#define MIN_TEMP_MAX_RANGE				0
#define MIN_TEMP_MIN_RANGE				-40
#define HIST_TEMP_MAX_RANGE				2
#define HIST_TEMP_MIN_RANGE				0.5
#define MAX_LOAD_MAX_RANGE				120
#define MAX_LOAD_MIN_RANGE				60
#define HIST_LOAD_MAX_RANGE				2
#define HIST_LOAD_MIN_RANGE				0.5
#define LIFETIME_MIN_RANGE				1
#define LIFETIME_MAX_RANGE				10
#define CAPACITY_MIN_RANGE        1
#define CAPACITY_MAX_RANGE        200
#define AKB_VOLTAGE_MIN_RANGE     12
#define AKB_VOLTAGE_MAX_RANGE     240
#define UPS_POWER_MIN_RANGE       400
#define UPS_POWER_MAX_RANGE       10000

/* Максимальная длинна логина и пароля для входа в Web */
#define MAX_WEB_LOGIN_LEN              11
#define MAX_WEB_PASSWD_LEN             11
#define MAX_WEB_COOKIE_LEN             16

/* Максимальная длинна строки параметра, передаваемого в Web */
#define MAX_WEB_PARAM_LEN              64

/* Max WEB users in the system/
 * First users are always ADMIN.
 * Others are USER */
#define MAX_WEB_USERS                 2

#define MAX_WHITE_LIST                5

/**
  * @brief  Уровни пользователей Web.
  */
typedef enum
{
    ALL_DEFAULT = 0,
    PART_DEFAULT_1,
    PART_DEFAULT_2,
    MAX_RESET_SETTINGS_TYPES
} reset_settings_type_t;

/**
* @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  Параметры сетевого подключения
  */
typedef struct
{
  char    ip_range[19];
  uint32_t ip;
  uint32_t mask;
} WHITE_LIST_t;

/**
  * @brief  Описание устройства системный параметр SNMP
  */
typedef struct
{
  char description[160];
  uint16_t len;
} SNMP_SYS_DESCR_t;

/**
  * @brief  Контактная информация системный параметр SNMP
  */
typedef struct
{
  char contact[50];
  uint16_t len;
} SNMP_SYS_CONTACT_t;

/**
  * @brief  Название устройства системный параметр SNMP
  */
typedef struct
{
  char name[20];
  uint16_t len;
} SNMP_SYS_NAME_t;

/**
  * @brief  Местоположение устройства системный параметр SNMP
  */
typedef struct
{
  char location[110];
  uint16_t len;
} SNMP_SYS_LOCATION_t;

/**
  * @brief  Параметры SNMP
  */
typedef struct
{
  SNMP_SYS_DESCR_t sysDesc;
  char readCommunity[20];
  char writeCommunity[20];
  SNMP_SYS_CONTACT_t sysContact;
  SNMP_SYS_NAME_t sysName;
  SNMP_SYS_LOCATION_t sysLocation;
  char managerIP[20];
  char managerIP2[20];
  char managerIP3[20];
  char managerIP4[20];
  char managerIP5[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  Уровни пользователей Web.
  */
typedef enum
{
    ADMIN = 0,
    USER,
    MAX_USER_LEVELS
} user_level_t;

/**
  * @brief  Настройки аутентификации.
  */
typedef struct
{
    user_level_t level;
    char login[MAX_WEB_LOGIN_LEN];
    char password[MAX_WEB_PASSWD_LEN];
} AUTH_t;

/**
  * @brief  Параметры SNTP
  */
typedef struct
{
  bool  sntpEnable;  // Вкл/выкл
  char  ip[16];      // Адрес SNTP сервера
  char  data[30];    // Дата последней синхронизации
  float timeZone;    // Часовой пояс
} SNTP_t;

/**
  * @brief  Типы источников срабатывания реле
  */
typedef enum
{
#ifdef RELAY_AC_PRESENT
	AC_PRESENT = 1,
#endif
#ifdef RELAY_DC_PRESENT
	DC_PRESENT,
#endif
#ifdef RELAY_ALARM_AKB
	ALARM_AKB,
#endif
#ifdef RELAY_CHARGE_AKB
	CHARGE_AKB,
#endif
#ifdef RELAY_OFF_AKB
	OFF_AKB,
#endif
#ifdef TYPE_CRITICAL_ALARM_MONITOR
	CRITICAL = 1,
	NON_CRITICAL,
#endif
	SNMP_SET,
  RO_MAX_SOURCE
} ro_type_source_t;

/**
  * @brief  Типы источников срабатывания реле
  */
typedef enum
{
    DI_DISCONN = 0,
    DI_CONN,
    DI_MAX_ACT
} din_type_act_t;

/**
  * @brief  Настройки сухих контактов.
  */
typedef struct
{
    char name[21];
    din_type_act_t din_type_act;
} DIN_Settings_t;

/**
  * @brief  Настройки диапазона уровней Аварий.
  */
typedef struct
{
    float high;
    float low;
    float hyst;
} ALARM_LEVEL_RANGE_t;

/**
  * @brief  Настройки Аварий.
  */
typedef struct
{
    ALARM_LEVEL_RANGE_t load_range;
#ifdef VAC_IN_MONITOR
    ALARM_LEVEL_RANGE_t ac_input_range;
#endif
    ALARM_LEVEL_RANGE_t ac_output_range;
    ALARM_LEVEL_RANGE_t Temprature_range;
#ifndef HARDWARE_BT6709
    ALARM_LEVEL_RANGE_t Temprature_cabinet_range;
#endif
} ALARM_MNGR_t;

typedef enum{
	ups_kestar,
	ups_voltronic,
  ups_offline,

	type_ups_max
} typeUPSEnums_t;

typedef enum{
	ups_1_0_power,
	ups_1_5_power,
	ups_2_0_power,
	ups_3_0_power,
	ups_6_0_power,
	ups_10_0_power,

	ups_power_num_max
} upsPowerEnums_t;

/**
  * @brief  Настройки ИБП.
  */
typedef struct
{
	float Ucellmin;
	float Ucellmax;
  float Uakb;
  float ups_power;
  uint32_t life_time;
  uint32_t set_data;
  uint32_t common_capacity;
	uint8_t type_ups;
  uint32_t serial;
} UPS_Setting_t;

typedef struct {
	ip_addr_t server_ip;
	u16_t server_port;
	char remote_path[100];
#define SETTINGS_FIELD_MAX_LEN 100
	char user[30];
	char pass[30];
} FTP_Update_t;

typedef struct {
	bool enabled;
	ip_addr_t server_ip;
	u16_t server_port;
} Syslog_Settings_t;

/**
  * @brief  Настройки реле.
  */ 
typedef struct
{
	ro_type_source_t ro_type_source;
} RELAY_Settings_t;

/**
  * @brief  Параметры RADIUS
  */
typedef struct
{
  bool Auth_enable;
  char    ServerIP[16];
  char    rds_password[17];
  bool RDSEnable;  // 0 - отключен, 1 - включен
  uint32_t port;
  uint32_t key_access;
} RADIUS_t;

/**
  * @brief  Параметры Telnet
  */
typedef struct
{
  bool TelnetEnable;  // 0 - отключен, 1 - включен
  uint32_t port;

} TELNET_t;

/**
  * @brief  Параметры SSH
  */
typedef struct
{
  bool SSHEnable;  // 0 - отключен, 1 - включен
  uint32_t port;
} SSH_t;

/**
  * @brief  Типы транспорта прозрачного порта
  */
typedef enum
{
    GW_UDP = 0,
    GW_TCP,
    MAX_TRANS_TYPES
} gwtrans_t;

/**
  * @brief  Режим прозрачного порта
  */
typedef enum
{
    GW_SERVER = 0,
    GW_CLIENT,
    MAX_MODE_TYPES
} gwmode_t;

/**
  * @brief  Четность прозрачного порта
  */
typedef enum
{
    GW_NO_PAR = 0,
    GW_ODD_PAR,
    GW_EVEN_PAR,
    MAX_PARITY_TYPES
} gwparity_t;

/**
  * @brief Настройки прозрачного порта
  */
typedef struct
{
    bool enabled;           /* Вкл/Откл */
    gwtrans_t transtype;    /* Тип транспорта */
    gwmode_t mode;          /* Режим: Клиент/Сервер */
    char ip[16];            /* IP-адрес сервера (для клиента) */
    uint16_t port;          /* Порт */
    uint32_t baud;          /* Скорость порта */
    gwparity_t parity;      /* Четность */
    uint8_t databits;       /* Число бит данных */
    uint8_t stopbits;       /* Число стоп-бит */
    uint8_t timeout;        /* Таймаут ответа от устройства */
    uint16_t quota;         /* Максимальное время занятия порта */
} PORTGW_t;

/**
  * @brief  Место измерения датчика температуры
  */
typedef enum
{
    TS_NONE = 0,
    TS_CABINET,
    TS_AKB
} ts_location_type_t;

/**
  * @brief  Параметры контроля температуры
  */
typedef struct
{
    ts_location_type_t type_sensor; //размещение датчика температуры 
} TEMP_COTROL_t;

/**
  * @brief  Общая структура настроек
  */
typedef struct
{
  BOOT_PARAMS_t bootParams;
  WEB_PARAMS_t  sWebParams;
  WEB_PARAMS_t  sWebTempParams;
  DEVICE_INFO_t sInfo;
  uint32_t      CritSecCRC;
/* WARNING! До поля CritSecCRC включительно структура настроек должна быть
* идентичной между бутлоадером и основным ПО и не должна изменяться при обновлении ПО.
* Контроль целостности настроек внутри IAP выполняется только для критической секции,
* т.к. контроль целостности всей структуры не имеет смысла
* (структура настроек всегда будет отличаться внутри основного ПО).
* В случае повреждения критического сектора, загружаются параметры по умолчанию. */
  FLAGS_t  sFlags;
#define XSETTING(type, name, setter, type_reset) type name;
	SETTINGS_TABLE
#undef XSETTING
  uint32_t      controlWorld;  // Слово для контроля целостности структуры настроек
  
} SETTINGS_t;

extern SETTINGS_t sSettings;

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

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

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

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

/**
  * @brief  Настройки ИБП по умолчанию
  */
void SETTINGS_SetUPSSettingsDef(void);

/**
  * @brief  Настройки серийного номера ИБП по умолчанию
  */
void SETTINGS_SetUPSSerialSettingsDef(void);

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

/**
  * @brief  Установить наcтройки менеджера Аварий по умолчанию
  */
void SETTINGS_SetAlarmManagerDef(void);

/**
  * @brief  Установить флаги по умолчанию
  */
void SETTINGS_SetFlagsDef(void);

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

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

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

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

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

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

/**
  * @brief  Установить параметры Telnet
  */
void SETTINGS_SetTelnetDef(void);

/**
  * @brief  Установить параметры SSH
  */
void SETTINGS_SetSSHDef(void);

/**
  * @brief  Установить параметры списка доверительных хостов
  */
void SETTINGS_SetWhiteListDef(void);

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

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

void SETTINGS_SetFTPUpdateDef(void);

void SETTINGS_SetSyslogDef(void);

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

/**
  * @brief  Очистка сектора настроек
  */
void SETTINGS_EraseFlashSector(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  Сброс флага 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  Установить статус тестирования "T2OK"
  */
void SETTINGS_SetT2OK(void);

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

void init_settings(void);

#endif /* #ifndef SETTINGS_API_H */

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