/********************************* (C) ROTEK ***********************************
 * @module  web_params_api
 * @file    web_params_api.c
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   web_params_api
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */

#include "stm32f4xx.h"  
#include "web_params_api.h"
#include "parameters.h"
#include "trap_params.h"
#include "snmp_api.h"
#include "trap_api.h"
#include "settings_api.h"
#include "common_config.h"
#include "snmp.h"
#include "log.h"
#include "hal.h"

#include "FreeRTOS.h"
#include "task.h"

#ifdef PRINTF_STDLIB
#include <stdio.h>
#endif
#ifdef PRINTF_CUSTOM
#include "tinystdio.h"
#endif
#include <string.h>

typedef  void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;

/**
  * @brief  Возвращяет строку с настройками на первой странице
  * @retval None
  */
void HTTP_GetParamsPage1(char *buf)
{
  char str[40];
  uint8_t len;
  memset(buf, 0, 1000);
  
  // Headers для поддержки saffari 
  strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  
  // Параметры UPS
  
  GetInputVoltageStr(str, &len);
  strcat(buf, "{\"AC\":\"");
  strncat(buf, str, len);
  
  GetOutputVoltageStr(str, &len);
  strcat(buf, "\",\"DC\":\"");
  strncat(buf, str, len);
  
  GetInputFreqStr(str, &len);
  strcat(buf, "\",\"in_freq\":\"");
  strncat(buf, str, len);
  
  GetOutputFreqStr(str, &len);
  strcat(buf, "\",\"out_freq\":\"");
  strncat(buf, str, len);
  
  GetPowerStr(str, &len);
  strcat(buf, "\",\"pwr\":\"");
  strncat(buf, str, len);
  
  GetBatCapacityStr(str, &len);
  strcat(buf, "\",\"bat_cap\":\"");
  strncat(buf, str, len);
  
  GetInternalTempStr(str, &len);
  strcat(buf, "\",\"inner_temp\":\"");
  strncat(buf, str, len);
  
  GetRuntimeStr(str, &len);
  strcat(buf, "\",\"bat_time_left\":\"");
  strncat(buf, str, len);
  
  GetDINStatusStr(str, &len, 0);
  strcat(buf, "\",\"di1\":\"");
  strncat(buf, str, len);
  
  GetDOUTStatusStr(str, &len, 0);
  strcat(buf, "\",\"ro1\":\"");
  strncat(buf, str, len);
  
  GetDOUTStatusStr(str, &len, 1);
  strcat(buf, "\",\"ro2\":\"");
  strncat(buf, str, len);
  
  // Дополнительные параметры

    // Мониторинг
    // load_monitor (нагрузка, 0 - норма, 1 - fail)
    // temp_monitor (внутренняя температура, 0 - норма, 1 - fail)
    // connect_monitor (связь с UPSом, 0 - норма, 1 - fail)
  
  GetAlarmMonitorStr(str, &len);
  strcat(buf, "\",\"m_alarm\":\"");
  strncat(buf, str, len);

  GetAlarmStr(str, &len);
  strcat(buf, "\",\"u_alarm\":\"");
  strncat(buf, str, len);

  // Признак изменения сетевых настроек 
  GetWebReinitFlag(str, &len);
  strcat(buf, "\",\"netsettings_changed\":\"");
  strncat(buf, str, len);

  strncat(buf, "\"}", 2);
  
  //printf(buf);
}

/**
  * @brief  Возвращяет строку с настройками на второй странице
  * @retval None
  */
void HTTP_GetSettings(char *buf)
{
  char str[30];
  uint8_t len;
   
  /* Headers для поддержки saffari */
  strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  
  /* SNMP */
  GetReadCommunity(str, &len);  
  strcat(buf, "{\"read_community\":\"");
  strncat(buf, str, len);	
  
  GetWriteCommunity(str, &len);  
  strcat(buf, "\",\"write_community\":\"");
  strncat(buf, str, len);
  
  GetManagerIp(str, &len);  
  strcat(buf, "\",\"managerIP\":\"");
  strncat(buf, str, len);
  
  GetManagerIp2(str, &len);  
  strcat(buf, "\",\"managerIP2\":\"");
  strncat(buf, str, len);
  
  GetManagerIp3(str, &len);  
  strcat(buf, "\",\"managerIP3\":\"");
  strncat(buf, str, len);

  GetManagerIp4(str, &len);
  strcat(buf, "\",\"managerIP4\":\"");
  strncat(buf, str, len);

  GetManagerIp5(str, &len);
  strcat(buf, "\",\"managerIP5\":\"");
  strncat(buf, str, len);

  /*Параметры реле и сухих контактов*/
  GetDINTypeActStr(str, &len, 0);
  strcat(buf, "\",\"di1\":\"");
  strncat(buf, str, len);

  GetROTypeActStr(str, &len, 0);
  strcat(buf, "\",\"ro1\":\"");
  strncat(buf, str, len);

  GetROTypeActStr(str, &len, 1);
  strcat(buf, "\",\"ro2\":\"");
  strncat(buf, str, len);
	
  /* WEB */
  GetIpStr(str, &len);  
  strcat(buf, "\",\"ipaddr\":\"");
  strncat(buf, str, len);
  
  GetGatewayStr(str, &len);  
  strcat(buf, "\",\"gw\":\"");
  strncat(buf, str, len);
  
  GetMaskStr(str, &len);  
  strcat(buf, "\",\"mask\":\"");
  strncat(buf, str, len);
  
  GetDhcpStateStr(str, &len);  
  strcat(buf, "\",\"dhcp\":");
  strncat(buf, str, len);

  GetAuthEnableStateStr(str, &len);
  strcat(buf, ",\"auth\":");
  strncat(buf, str, len);

  /* RADIUS */
  GetRDSIpStr(str, &len);
  strcat(buf, ",\"rs_server\":\"");
  strncat(buf, str, len);

  GetRDSPortStr(str, &len);
  strcat(buf, "\",\"rs_port\":\"");
  strncat(buf, str, len);

  GetRDSPasswordkStr(str, &len);
  strcat(buf, "\",\"rs_pwd\":\"");
  strncat(buf, str, len);

  GetRDSKeyAccesstStr(str, &len);
  strcat(buf, "\",\"rs_key\":\"");
  strncat(buf, str, len);

  GetRDSEnableStateStr(str, &len);
  strcat(buf, "\",\"rs_enabled\":");
  strncat(buf, str, len);

  /* Параметры даты и времени */
  GetDateStr(str, &len);
  strcat(buf, ",\"date\":\"");
  strncat(buf, str, len);

  GetTimeStr(str, &len);
  strcat(buf, "\",\"time\":\"");
  strncat(buf, str, len);

  /* Параметры SNTP */
  GetSntpStateStr(str, &len);
  strcat(buf, "\",\"ntp\":\"");
  strncat(buf, str, len);

  GetSntpServerIpStr(str, &len);
  strcat(buf, "\",\"ntpservip\":\"");
  strncat(buf, str, len);

  GetSntpTimeZoneStr(str, &len);
  strcat(buf, "\",\"utc\":\"");
  strncat(buf, str, len);

  GetUnixTimeStr(str, &len);
   strcat(buf, "\",\"utm\":\"");
   strncat(buf, str, len);

  GetSntpLastDataStr(str, &len);
  strcat(buf, "\",\"lastsynctime\":\"");
  strncat(buf, str, len);
 
  /* Признак изменения сетевых настроек */ 
  GetWebReinitFlag(str, &len);
  strcat(buf, "\",\"netsettings_changed\":\"");
  strncat(buf, str, len);
  
  strncat(buf, "\"}", 2);
  
  //printf(buf);
}

/**
  * @brief  Возвращяет строку с информацией об устройстве
  * @retval None
  */
// TODO Согласовать максимальную длину строк
void HTTP_GetInfo(char *buf)
{
  char str[40];
  uint8_t len;
  
  /* Headers для поддержки saffari */
  strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  
  GetWorkTimeStr(str, &len);  
  strcat(buf, "{\"uptime\":\"");
  strncat(buf, str, len);	
  
  GetModelStr(str, &len);  
  strcat(buf, "\",\"model\":\"");
  strncat(buf, str, len);
  
  GetProductionDataStr(str, &len);  
  strcat(buf, "\",\"prodate\":\"");
  strncat(buf, str, len);
  
  GetVersionStr(str, &len);  
  strcat(buf, "\",\"fwversion\":\"");
  strncat(buf, str, len);
  
  GetMacStr(str, &len);  
  strcat(buf, "\",\"macaddr\":\"");
  strncat(buf, str, len);
  
  GetSerialNumberStr(str, &len);  
  strcat(buf, "\",\"serno\":\"");
  strncat(buf, str, len);
  
  GetOwnerStr(str, &len);  
  strcat(buf, "\",\"owner\":\"");
  strncat(buf, str, len);
  
  GetLocationStr(str, &len);  
  strcat(buf, "\",\"sysLocation\":\"");
  strncat(buf, str, len);
  
  GetCommentsStr(str, &len);  
  strcat(buf, "\",\"comment\":\"");
  strncat(buf, str, len);

  GetUPSModelStr(str, &len);
  strcat(buf, "\",\"ups_model\":\"");
  strncat(buf, str, len);

  GetUPSVersionStr(str, &len);
  strcat(buf, "\",\"ups_fwversion\":\"");
  strncat(buf, str, len);
 
  /* Признак изменения сетевых настроек */ 
  GetWebReinitFlag(str, &len);
  strcat(buf, "\",\"netsettings_changed\":\"");
  strncat(buf, str, len);
  
  strncat(buf, "\"}", 2);
  
}

void HTTP_GetHistoryPage(char* buf, uint32_t pageNumber)
{
  char str[16];
  uint16_t len;

  strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");

  strcat(buf, "{\"page\": [");
  History_GetPage(buf, pageNumber);
  len = strlen(buf);
  buf +=len-1;
  *buf = 0;
  buf -=len-1;

  /* Количество страниц */
  memset(str, 0, 16);
  sprintf(str, "%i", History_GetPageCount());
  strcat(buf, "],\"pages\":\"");
  strcat(buf, str);

  /* Часовой пояс */
  GetSntpTimeZoneStr(str, (uint8_t*)&len);
  strcat(buf, "\",\"utc\":\"");
  strncat(buf, str, len);

  GetUnixTimeStr(str, (uint8_t*)&len);
  strcat(buf, "\",\"utm\":\"");
  strncat(buf, str, len);

  strcat(buf, "\"}");

  //printf(buf);
}

void HTTP_GetUpsHistoryPage(char* buf, uint32_t pageNumber)
{
  char str[16];
  uint16_t len;

  strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");

  strcat(buf, "{\"page\": [");
  LOG_GetPage(buf, pageNumber);
  len = strlen(buf);
  buf +=len-1;
  *buf = 0;
  buf -=len-1;

  /* Количество страниц */
  memset(str, 0, 16);
  sprintf(str, "%i", LOG_GetPageCount());
  strcat(buf, "],\"pages\":\"");
  strcat(buf, str);

  /* Часовой пояс */
  GetSntpTimeZoneStr(str, (uint8_t*)&len);
  strcat(buf, "\",\"utc\":\"");
  strncat(buf, str, len);

  GetUnixTimeStr(str, (uint8_t*)&len);
  strcat(buf, "\",\"utm\":\"");
  strncat(buf, str, len);

  strcat(buf, "\"}");

  //printf(buf);
}

/**
  * @brief  Возвращает uptime, freq, dutycicle
  */
void HTTP_GetProgonParams(char *buf)
{
  char str[20];
  u32_t tick;  
  
  strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
    
  strcat(buf, "{\"uptime\":\"");
  snmp_get_sysuptime(&tick);
  tick = tick/100;
  memset(str, 0, 20);
  sprintf(str, "%d", tick);
  strncat(buf, str, strlen(str));

  strncat(buf, "\"}", 2);
}





/**
  * @brief  Сброс настроек (всё кроме сетевых параметров)
  */
void HTTP_ResetSettings(void)
{
  //taskENTER_CRITICAL();

  SNMP_SendUserTrap(DEVICE_RESTORED);
  log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");
  vTaskDelay(500);
  SETTINGS_SetPartDefault();
  SETTINGS_Save();
	  
  //taskEXIT_CRITICAL();
}

/**
  * @brief  Сохранение настроек
  */
void HTTP_SaveSettings(void)
{
//  taskENTER_CRITICAL();
  
  SETTINGS_Save();
  
  log_event_data(LOG_SETTING_SAVE, "Администратор");

//  taskEXIT_CRITICAL();

}

/**
  * @brief  Перезагрузка контроллера
  */
void HTTP_Reboot(void)
{
  vTaskDelay(1010);
  Reboot();
}

/**
  * @brief  Запускает задачу ресета контроллера
  * @param fBootMode:
  *        true - перед перезагрузкой будет установлен флаг входа в режим 
  *        bootloader и перезаписаны настройки
  *
  *        false - обычная перезагрузка 
  */
void HTTP_StartResetTask(bool fBootMode)
{
  static bool temp;
 
  temp = fBootMode;
  xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE, 
			  (void*)&temp, tskIDLE_PRIORITY, NULL);
}

/**
  * @brief  
  */
void vTaskReboot(void * pvParameters)
{
  bool mode = false;  // тип перезагрузки (нужно ли устанавливать флаг bootloader)
  
  for (;;)
  {
	mode = *(bool*)pvParameters;
	
	if (mode)
	{
	  SNMP_SendUserTrap(FW_VERSION_UPDATE);
	  log_event_data(LOG_UPDATE_SOFT, "Администратор");
	  SetLoadMode();
	  HTTP_SaveSettings();
      vTaskDelay(2000);
      /* Блокируем управление ключем на тау секунд*/
      //IO_KeyBlockOn();
      vTaskDelay(1010);
      Reboot();
	}  
	else
	{
	  vTaskDelay(1000);
      /* Блокируем управление ключем на тау секунд*/
      //IO_KeyBlockOn();
      vTaskDelay(1010);
      Reboot();
	}
  }	
}

/********************************* (C) ROTEK **********************************/
