/********************************* (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 #endif #ifdef PRINTF_CUSTOM #include "tinystdio.h" #endif #include 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); #ifndef HARDWARE_BT6708 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); #if defined HARDWARE_BT6706 GetDOUTStatusStr(str, &len, 2); strcat(buf, "\",\"ro3\":\""); strncat(buf, str, len); #endif #endif // Дополнительные параметры // Мониторинг // 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); #ifndef HARDWARE_BT6708 /*Параметры реле и сухих контактов*/ 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); #if defined HARDWARE_BT6706 GetROTypeActStr(str, &len, 2); strcat(buf, "\",\"ro3\":\""); strncat(buf, str, len); #endif #endif /* 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); #if defined HARDWARE_BT6706 || HARDWARE_BT6708 GetTelnetPortStr(str, &len); strcat(buf, ",\"tn_port\":\""); strncat(buf, str, len); GetTelnetEnableStateStr(str, &len); strcat(buf, "\",\"tn_enabled\":"); strncat(buf, str, len); #endif #ifdef HARDWARE_BT6702 GetAuthEnableStateStr(str, &len); strcat(buf, ",\"swauth\":"); 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); #endif #ifdef HARDWARE_BT6708 /* 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(buf, white_list_js[i]); strncat(buf, str, len); } #endif /* Параметры даты и времени */ 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); GetUPSVoltCellMinStr(str, &len); strcat(buf, "\",\"ups_cell_min\":\""); strncat(buf, str, len); GetUPSVoltCellMaxStr(str, &len); strcat(buf, "\",\"ups_cell_max\":\""); strncat(buf, str, len); #if defined HARDWARE_BT6706 || HARDWARE_BT6708 GetVACAlarmHighRangeStr(str, &len); strcat(buf, "\",\"mainvolt_high\":\""); strncat(buf, str, len); GetVACAlarmLowRangeStr(str, &len); strcat(buf, "\",\"mainvolt_low\":\""); strncat(buf, str, len); GetVACAlarmHisteStr(str, &len); strcat(buf, "\",\"mainvolt_hist\":\""); strncat(buf, str, len); #endif GetTemperatureAlarmHighRangeStr(str, &len); strcat(buf, "\",\"temp_high\":\""); strncat(buf, str, len); GetTemperatureAlarmLowRangeStr(str, &len); strcat(buf, "\",\"temp_low\":\""); strncat(buf, str, len); GetTemperatureAlarmHisteStr(str, &len); strcat(buf, "\",\"temp_hist\":\""); strncat(buf, str, len); GetLoadAlarmHighRangeStr(str, &len); strcat(buf, "\",\"loadvolt_high\":\""); strncat(buf, str, len); GetLoadAlarmHisteStr(str, &len); strcat(buf, "\",\"loadvolt_hist\":\""); strncat(buf, str, len); /* Признак изменения сетевых настроек */ GetWebReinitFlag(str, &len); strcat(buf, "\",\"netsettings_changed\":\""); strncat(buf, str, len); strncat(buf, "\"}", 2); //printf(buf); } 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; } /** * @brief Возвращяет строку с информацией об устройстве * @retval None */ // TODO Согласовать максимальную длину строк void HTTP_GetInfo(char *buf) { char str[110]; char tmp_str[220]; 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); GetNameDeviceStr(str, &len); str[len] = 0; strcat(buf, "\",\"sysname\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if(ConvertStringForJSON(str, tmp_str, len)){ strncat(buf, tmp_str, strlen(tmp_str)); } else{ strncat(buf, str, len); } GetOwnerStr(str, &len); str[len] = 0; strcat(buf, "\",\"owner\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if(ConvertStringForJSON(str, tmp_str, len)){ strncat(buf, tmp_str, strlen(tmp_str)); } else{ strncat(buf, str, len); } GetLocationStr(str, &len); str[len] = 0; strcat(buf, "\",\"sysLocation\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if(ConvertStringForJSON(str, tmp_str, len)){ strncat(buf, tmp_str, strlen(tmp_str)); } else{ strncat(buf, str, len); } GetCommentsStr(str, &len); str[len] = 0; strcat(buf, "\",\"comment\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if(ConvertStringForJSON(str, tmp_str, len)){ strncat(buf, tmp_str, strlen(tmp_str)); } else{ strncat(buf, str, len); } GetUPSModelStr(str, &len); strcat(buf, "\",\"ups_model\":\""); strncat(buf, str, len); GetUPSSerialStr(str, &len); strcat(buf, "\",\"ups_sn\":\""); 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, name_login); vTaskDelay(500); SETTINGS_SetPartDefault(); SETTINGS_Save(); //taskEXIT_CRITICAL(); } /** * @brief Сохранение настроек */ void HTTP_SaveSettings(void) { // taskENTER_CRITICAL(); SETTINGS_Save(); #if defined HARDWARE_BT6706 || HARDWARE_BT6708 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 Перезагрузка контроллера */ void HTTP_Reboot(void) { /*vTaskDelay(1010); Reboot();*/ HTTP_StartResetTask(false); } /** * @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_BT6706 || HARDWARE_BT6708 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 **********************************/