/********************************* (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"
#if defined HARDWARE_BT6707 || HARDWARE_BT6709
#include "http_server.h"
#elif defined HARDWARE_BT6703
#include "my_ssl_server.h"
#endif
#include "parameters.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
  */
char *HTTP_GetParamsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
{
    char str[40];
    uint8_t len;

    (void)bufIn;
    (void)lenBufIn;
    (void)reqNum;

    memset(bufOut, 0, SEND_BUF_MAX_LEN);

    // Headers для поддержки saffari
    strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");

    // Параметры UPS

    GetInputVoltageStr(str, &len);
    strcat(bufOut, "{\"AC\":\"");
    strncat(bufOut, str, len);

    GetOutputVoltageStr(str, &len);
    strcat(bufOut, "\",\"DC\":\"");
    strncat(bufOut, str, len);

    GetInputFreqStr(str, &len);
    strcat(bufOut, "\",\"in_freq\":\"");
    strncat(bufOut, str, len);

    GetOutputFreqStr(str, &len);
    strcat(bufOut, "\",\"out_freq\":\"");
    strncat(bufOut, str, len);

    GetPowerStr(str, &len);
    strcat(bufOut, "\",\"pwr\":\"");
    strncat(bufOut, str, len);

    GetBatCapacityStr(str, &len);
    strcat(bufOut, "\",\"bat_rem_cap\":\"");
    strncat(bufOut, str, len);

    GetInternalTempStr(str, &len);
    strcat(bufOut, "\",\"inner_temp\":\"");
    strncat(bufOut, str, len);

    GetRuntimeStr(str, &len);
    strcat(bufOut, "\",\"bat_time_left\":\"");
    strncat(bufOut, str, len);

#ifdef HARDWARE_BT6709

    GetInputCurrentStr(str, &len);
    strcat(bufOut, "\",\"in_cur\":\"");
    strncat(bufOut, str, len);

    GetOutputCurrentStr(str, &len);
    strcat(bufOut, "\",\"out_cur\":\"");
    strncat(bufOut, str, len);

    GetVoltageAKBtStr(str, &len);
    strcat(bufOut, "\",\"bat_volt\":\"");
    strncat(bufOut, str, len);

    GetCapacityNominalAKBStr(str, &len);
    strcat(bufOut, "\",\"bat_cap\":\"");
    strncat(bufOut, str, len);

    GetDataNextChangeAKBStrRU(str, &len);
    strcat(bufOut, "\",\"bat_exp\":\"");
    strncat(bufOut, str, len);

#endif

#ifndef HARDWARE_BT6709

    GetDINStatusStr(str, &len, 0);
    strcat(bufOut, "\",\"di1\":\"");
    strncat(bufOut, str, len);

    GetDOUTStatusStr(str, &len, 0);
    strcat(bufOut, "\",\"ro1\":\"");
    strncat(bufOut, str, len);

    GetDOUTStatusStr(str, &len, 1);
    strcat(bufOut, "\",\"ro2\":\"");
    strncat(bufOut, str, len);

#if defined HARDWARE_BT6707
    GetDOUTStatusStr(str, &len, 2);
    strcat(bufOut, "\",\"ro3\":\"");
    strncat(bufOut, str, len);
#endif
#endif

    // Дополнительные параметры

    // Мониторинг
    // load_monitor (нагрузка, 0 - норма, 1 - fail)
    // temp_monitor (внутренняя температура, 0 - норма, 1 - fail)
    // connect_monitor (связь с UPSом, 0 - норма, 1 - fail)

    GetAlarmMonitorStr(str, &len);
    strcat(bufOut, "\",\"m_alarm\":\"");
    strncat(bufOut, str, len);

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

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

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

    *lenBufOut = strlen(bufOut);
    return bufOut;
}

/**
  * @brief  Возвращяет строку с настройками на второй странице
  * @retval None
  */
char *HTTP_GetSettingsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
{
    char str[30];
    uint8_t len;

    memset(bufOut, 0, SEND_BUF_MAX_LEN);

    (void)bufIn;
    (void)lenBufIn;
    (void)reqNum;

    /* Headers для поддержки saffari */
    strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");

    /* SNMP */
    GetReadCommunity(str, &len);
    strcat(bufOut, "{\"read_community\":\"");
    strncat(bufOut, str, len);

    GetWriteCommunity(str, &len);
    strcat(bufOut, "\",\"write_community\":\"");
    strncat(bufOut, str, len);

    GetManagerIp(str, &len);
    strcat(bufOut, "\",\"managerIP\":\"");
    strncat(bufOut, str, len);

    GetManagerIp2(str, &len);
    strcat(bufOut, "\",\"managerIP2\":\"");
    strncat(bufOut, str, len);

    GetManagerIp3(str, &len);
    strcat(bufOut, "\",\"managerIP3\":\"");
    strncat(bufOut, str, len);

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

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

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

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

    GetROTypeActStr(str, &len, 1);
    strcat(bufOut, "\",\"ro2\":\"");
    strncat(bufOut, str, len);

#if defined HARDWARE_BT6707
    GetROTypeActStr(str, &len, 2);
    strcat(bufOut, "\",\"ro3\":\"");
    strncat(bufOut, str, len);
#endif
#endif

    /* WEB */
    GetIpStr(str, &len);
    strcat(bufOut, "\",\"ipaddr\":\"");
    strncat(bufOut, str, len);

    GetGatewayStr(str, &len);
    strcat(bufOut, "\",\"gw\":\"");
    strncat(bufOut, str, len);

    GetMaskStr(str, &len);
    strcat(bufOut, "\",\"mask\":\"");
    strncat(bufOut, str, len);

    GetDhcpStateStr(str, &len);
    strcat(bufOut, "\",\"dhcp\":");
    strncat(bufOut, str, len);

#if defined HARDWARE_BT6707 || HARDWARE_BT6709
    GetTelnetPortStr(str, &len);
    strcat(bufOut, ",\"tn_port\":\"");
    strncat(bufOut, str, len);

    GetTelnetEnableStateStr(str, &len);
    strcat(bufOut, "\",\"tn_enabled\":");
    strncat(bufOut, str, len);
#endif

#ifdef HARDWARE_BT6703
    GetAuthEnableStateStr(str, &len);
    strcat(bufOut, ",\"swauth\":");
    strncat(bufOut, str, len);

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

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

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

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

    GetRDSEnableStateStr(str, &len);
    strcat(bufOut, "\",\"rs_enabled\":");
    strncat(bufOut, str, len);
#endif

#ifdef HARDWARE_BT6709
    /* White list */
    const char *white_list_js[] = {
        ",\"wtl_ip1\":\"",
        "\",\"wtl_ip2\":\"",
        "\",\"wtl_ip3\":\"",
        "\",\"wtl_ip4\":\"",
        "\",\"wtl_ip5\":\"",
    };
    for (uint8_t i = 0; i < MAX_WHITE_LIST; i++) {
        GetWhiteListSTR(str, &len, i);
        strcat(bufOut, white_list_js[i]);
        strncat(bufOut, str, len);
    }

    strcat(bufOut, "\"");
#endif

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

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

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

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

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

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

    GetSntpLastDataStr(str, &len);
    strcat(bufOut, "\",\"lastsynctime\":\"");
    strncat(bufOut, str, len);

    GetUPSVoltCellMinStr(str, &len);
    strcat(bufOut, "\",\"ups_cell_min\":\"");
    strncat(bufOut, str, len);

    GetUPSVoltCellMaxStr(str, &len);
    strcat(bufOut, "\",\"ups_cell_max\":\"");
    strncat(bufOut, str, len);

#ifdef HARDWARE_BT6709
    GetDataSetAKBStr(str, &len);
    strcat(bufOut, "\",\"bat_prod\":\"");
    strncat(bufOut, str, len);

    GetLifeTimeAKBStr(str, &len);
    strcat(bufOut, "\",\"bat_exp\":\"");
    strncat(bufOut, str, len);

    GetCapacityNominalAKBStr(str, &len);
    strcat(bufOut, "\",\"bat_cap\":\"");
    strncat(bufOut, str, len);

    GetVoltageAKBNominalStr(str, &len);
    strcat(bufOut, "\",\"bat_charge\":\"");
    strncat(bufOut, str, len);

    GetUPSPowerStr(str, &len);
    strcat(bufOut, "\",\"ups_max_power\":\"");
    strncat(bufOut, str, len);
#endif

#if defined HARDWARE_BT6707 || HARDWARE_BT6709
    GetVACAlarmHighRangeStr(str, &len);
    strcat(bufOut, "\",\"mainvolt_high\":\"");
    strncat(bufOut, str, len);

    GetVACAlarmLowRangeStr(str, &len);
    strcat(bufOut, "\",\"mainvolt_low\":\"");
    strncat(bufOut, str, len);

    GetVACAlarmHisteStr(str, &len);
    strcat(bufOut, "\",\"mainvolt_hist\":\"");
    strncat(bufOut, str, len);
#endif
    GetTemperatureAlarmHighRangeStr(str, &len);
    strcat(bufOut, "\",\"temp_high\":\"");
    strncat(bufOut, str, len);

    GetTemperatureAlarmLowRangeStr(str, &len);
    strcat(bufOut, "\",\"temp_low\":\"");
    strncat(bufOut, str, len);

    GetTemperatureAlarmHisteStr(str, &len);
    strcat(bufOut, "\",\"temp_hist\":\"");
    strncat(bufOut, str, len);

    GetLoadAlarmHighRangeStr(str, &len);
    strcat(bufOut, "\",\"loadvolt_high\":\"");
    strncat(bufOut, str, len);

    GetLoadAlarmHisteStr(str, &len);
    strcat(bufOut, "\",\"loadvolt_hist\":\"");
    strncat(bufOut, str, len);

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

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

    *lenBufOut = strlen(bufOut);
    return bufOut;
}

uint8_t ConvertStringForJSON(char *inStr, char *paramValue, uint8_t inLen)
{
    int  len = 0, len2 = 0;
    char *strPtr = 0;
    uint8_t i = 0;

    while (i < inLen) {

        strPtr = strstr(inStr, "\"");

        if (strPtr != 0) {
            len = strPtr - inStr;
            if (len != 0) {
                strncat(paramValue, inStr, len);
            }
            strncat(paramValue, "\\", 1);
            strncat(paramValue, &inStr[len], 1);
            inStr = inStr + len + 1;
            i = i + len + 1;
        } else {
            if (paramValue != 0) {
                len2 = inLen - i;
                strncat(paramValue, inStr, len2);
                return 1;
            } else {
                return 0;
            }
        }
    }
    if (inLen == 0) {
        return 0;
    }
    return 1;
}

#ifdef HARDWARE_BT6709
/**
  * @brief  Возвращяет строку с настройками уведомлений (есть/нет отправка)
  * @retval None
  */
char *HTTP_GetTrapAccess(char *params, uint16_t len_params, char *buf, uint16_t *len_out)
{
    char str[64];
    uint8_t len, i, first_item = 1;
    char value[20];

    (void)len_params;

    ClearParamString(params);
    memset(value, 0, 20);
    memset(str, 0, 64);

    /* Headers для поддержки saffari */
    strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");

    /* Формирование списка уведомлений */
    strcat(buf, "{\"params\":[");

    for (i = 1; i < ALL_TRAPS; i++) {
        if (first_item) {
            first_item = 0;
        } else {
            strcat(buf, ",");
        }

        sprintf(str, "%d", i);
        len = strlen(str);
        strcat(buf, "{\"name\":\"");
        strncat(buf, str, len);

        GetTrapLongNameStr(str, &len, i);
        strcat(buf, "\",\"label\":\"");
        strncat(buf, str, len);

        GetNotificationTrapsStateStr(str, &len, i);
        strcat(buf, "\",\"snmp\":\"");
        strncat(buf, str, len);

        strcat(buf, "\"}");
    }
    strcat(buf, "]");

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

    *len_out = strlen(buf);
    return buf;
}
#endif

/**
  * @brief  Возвращяет строку с информацией об устройстве
  * @retval None
  */
// TODO Согласовать максимальную длину строк
char *HTTP_GetInfo(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
{
    char str[110];
    char tmp_str[220];
    uint8_t len;
    char tempStr[30];
    strncpy(tempStr, bufIn, 30);

    (void)lenBufIn;
    (void)reqNum;

    /* В запросе нет параметров, нужно формировать JSON ответ */
    if (strpbrk(tempStr, "?") == 0) {
        memset(bufOut, 0, SEND_BUF_MAX_LEN);
        /* Headers для поддержки saffari */
        strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");

        GetWorkTimeStr(str, &len);
        strcat(bufOut, "{\"uptime\":\"");
        strncat(bufOut, str, len);

        GetModelStr(str, &len);
        strcat(bufOut, "\",\"model\":\"");
        strncat(bufOut, str, len);

        GetProductionDataStr(str, &len);
        strcat(bufOut, "\",\"prodate\":\"");
        strncat(bufOut, str, len);

        GetVersionStr(str, &len);
        strcat(bufOut, "\",\"fwversion\":\"");
        strncat(bufOut, str, len);

        GetMacStr(str, &len);
        strcat(bufOut, "\",\"macaddr\":\"");
        strncat(bufOut, str, len);

        GetSerialNumberStr(str, &len);
        strcat(bufOut, "\",\"serno\":\"");
        strncat(bufOut, str, len);

        GetNameDeviceStr(str, &len);
        str[len] = 0;
        strcat(bufOut, "\",\"sysname\":\"");
        memset(tmp_str, 0, sizeof(tmp_str));
        if (ConvertStringForJSON(str, tmp_str, len)) {
            strncat(bufOut, tmp_str, strlen(tmp_str));
        } else {
            strncat(bufOut, str, len);
        }

        GetOwnerStr(str, &len);
        str[len] = 0;
        strcat(bufOut, "\",\"owner\":\"");
        memset(tmp_str, 0, sizeof(tmp_str));
        if (ConvertStringForJSON(str, tmp_str, len)) {
            strncat(bufOut, tmp_str, strlen(tmp_str));
        } else {
            strncat(bufOut, str, len);
        }

        GetLocationStr(str, &len);
        str[len] = 0;
        strcat(bufOut, "\",\"sysLocation\":\"");
        memset(tmp_str, 0, sizeof(tmp_str));
        if (ConvertStringForJSON(str, tmp_str, len)) {
            strncat(bufOut, tmp_str, strlen(tmp_str));
        } else {
            strncat(bufOut, str, len);
        }

        GetCommentsStr(str, &len);
        str[len] = 0;
        strcat(bufOut, "\",\"comment\":\"");
        memset(tmp_str, 0, sizeof(tmp_str));
        if (ConvertStringForJSON(str, tmp_str, len)) {
            strncat(bufOut, tmp_str, strlen(tmp_str));
        } else {
            strncat(bufOut, str, len);
        }

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

        GetUPSSerialStr(str, &len);
        strcat(bufOut, "\",\"ups_sn\":\"");
        strncat(bufOut, str, len);

        GetUPSVersionStr(str, &len);
        strcat(bufOut, "\",\"ups_fwversion\":\"");
        strncat(bufOut, str, len);

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

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

        *lenBufOut = strlen(bufOut);
        return bufOut;
    }
    *lenBufOut = 0;
    return NULL;
}

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, name_login);
    vTaskDelay(500);
    SETTINGS_SetPartDefault();
    SETTINGS_Save();

    //taskEXIT_CRITICAL();
}

/**
  * @brief  Сохранение настроек
  */
void HTTP_SaveSettings(void)
{
    //  taskENTER_CRITICAL();

    SETTINGS_Save();

#if defined HARDWARE_BT6707 || HARDWARE_BT6709
    if (telnet_act) {
        log_event_data(LOG_SETTING_SAVE, name_login_telnet);
    } else
#endif
        log_event_data(LOG_SETTING_SAVE, name_login);

    //  taskEXIT_CRITICAL();

}

/**
  * @brief  Перезагрузка контроллера
  */
char *HTTP_Reboot(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
{
    (void)bufIn;
    (void)lenBufIn;
    (void)reqNum;

    strcpy(bufOut, "HTTP/1.1 200 OK\r\n");
    *lenBufOut = strlen(bufOut);

    /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
     * отправить ответ серверу об успешном выполнении команды */
    HTTP_StartResetTask(false);

    return bufOut;
}

/**
  * @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);
#if defined HARDWARE_BT6707 || HARDWARE_BT6709
            if (telnet_act) {
                log_event_data(LOG_UPDATE_SOFT, name_login_telnet);
            } else
#endif
                log_event_data(LOG_UPDATE_SOFT, name_login);
            SetLoadMode();
            HTTP_SaveSettings();
            vTaskDelay(2000);
            /* Блокируем управление ключем на тау секунд*/
            //IO_KeyBlockOn();
            vTaskDelay(1010);
            Reboot();
        } else {
            vTaskDelay(1000);
            /* Блокируем управление ключем на тау секунд*/
            //IO_KeyBlockOn();
            vTaskDelay(1010);
            Reboot();
        }
    }
}

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