|
@@ -0,0 +1,1083 @@
|
|
|
+#include "at32f403a_407.h"
|
|
|
+#include "settings_api.h"
|
|
|
+#include "FreeRTOS.h"
|
|
|
+#include "task.h"
|
|
|
+#include "queue.h"
|
|
|
+#include "semphr.h"
|
|
|
+#include "common_config.h"
|
|
|
+#include "common.h"
|
|
|
+#include "at32_uid.h"
|
|
|
+#include "hash.h"
|
|
|
+//#include "log.h"
|
|
|
+
|
|
|
+#include <math.h>
|
|
|
+#include <string.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#ifdef PRINTF_STDLIB
|
|
|
+#include <stdio.h>
|
|
|
+#endif
|
|
|
+#ifdef PRINTF_CUSTOM
|
|
|
+#include "tinystdio.h"
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+SemaphoreHandle_t flash_mutex;
|
|
|
+
|
|
|
+
|
|
|
+// Флаг подтверждения новых сетевых параметров пользователем
|
|
|
+bool fConfirmWebParams = false;
|
|
|
+
|
|
|
+// Системные настройки
|
|
|
+SYS_t sSys;
|
|
|
+
|
|
|
+// Общая структура настроек
|
|
|
+SETTINGS_t sSettings;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// Установить параметры сетевого подключения по умолчанию
|
|
|
+void SETTINGS_SetWebParamsDef(void)
|
|
|
+{
|
|
|
+ strcpy(sSettings.sWebParams.ip, "192.168.10.254");
|
|
|
+ strcpy(sSettings.sWebParams.gate, "192.168.10.1");
|
|
|
+ strcpy(sSettings.sWebParams.mask, "255.255.255.0");
|
|
|
+ strcpy(sSettings.sWebParams.dns1, "8.8.8.8");
|
|
|
+ strcpy(sSettings.sWebParams.dns2, "8.8.4.4");
|
|
|
+ sSettings.sWebParams.dhcpEnable = 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// Установить временные параметры сетевого подключения по умолчанию
|
|
|
+void SETTINGS_SetTempWebParamsDef(void)
|
|
|
+{
|
|
|
+ strcpy(sSettings.sWebTempParams.ip, "192.168.10.254");
|
|
|
+ strcpy(sSettings.sWebTempParams.gate, "192.168.10.1");
|
|
|
+ strcpy(sSettings.sWebTempParams.mask, "255.255.255.0");
|
|
|
+ strcpy(sSettings.sWebTempParams.dns1, "8.8.8.8");
|
|
|
+ strcpy(sSettings.sWebTempParams.dns2, "8.8.4.4");
|
|
|
+ sSettings.sWebTempParams.dhcpEnable = 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// Установить Информацию об устройстве по умолчанию
|
|
|
+void SETTINGS_SetInfoDef(void)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+ strcpy(sSettings.sInfo.mac, sSys->mac);
|
|
|
+ strcpy(sSettings.sInfo.serialNumber, sSys->serial);
|
|
|
+ strcpy(sSettings.sInfo.productionData, sSys->proddate);
|
|
|
+ strcpy(sSettings.sFlags.testState, sSys->testState);
|
|
|
+ vPortFree(sSys);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(sSettings.sInfo.productionData, "00.00.00 00:00");
|
|
|
+ strcpy(sSettings.sInfo.mac, DEVICE_MAC);
|
|
|
+ strcpy(sSettings.sInfo.serialNumber, DEVICE_SERIAL);
|
|
|
+ memset(sSettings.sFlags.testState, 0, 16);
|
|
|
+ }
|
|
|
+
|
|
|
+ sSettings.sInfo.id = 0;
|
|
|
+ strcpy(sSettings.sInfo.location, "");
|
|
|
+ strcpy(sSettings.sInfo.owner, "");
|
|
|
+ strcpy(sSettings.sInfo.comments, "");
|
|
|
+ strcpy(sSettings.sInfo.incharge, "");
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить флаги по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetFlagsDef(void)
|
|
|
+{
|
|
|
+ sSettings.sFlags.netsettingsChanged = false;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить параметры сетевого подключения по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetEthternetSwitchDef(void)
|
|
|
+{
|
|
|
+ sSettings.sEthernet.Enabled = true;
|
|
|
+ sSettings.sEthernet.prior = 1;
|
|
|
+ strcpy(sSettings.sEthernet.ip_test, "10.254.0.33");
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить параметры GSM подключения по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetGSMDef(void)
|
|
|
+{
|
|
|
+ for(uint8_t i = 0; i < NUM_GSM; i++)
|
|
|
+ {
|
|
|
+ sSettings.sGSM[i].Enabled = true;
|
|
|
+ sSettings.sGSM[i].prior = 0;
|
|
|
+ sSettings.sGSM[i].type_profile = USER;
|
|
|
+ strcpy(sSettings.sGSM[i].ip_test, "10.254.0.33");
|
|
|
+ strcpy(sSettings.sGSM[i].APNaddr, "MDUDPTN");
|
|
|
+ strcpy(sSettings.sGSM[i].APNlogin, "");
|
|
|
+ strcpy(sSettings.sGSM[i].APNpass, "");
|
|
|
+ strcpy(sSettings.sGSM[i].msisdn, "");
|
|
|
+ sSettings.sGSM[i].timeout = 30;
|
|
|
+ sSettings.sGSM[i].period_test = 100;
|
|
|
+ sSettings.sGSM[i].num_bad_connect = 3;
|
|
|
+ sSettings.sGSM[i].modem_mode = AUTOMATIC;
|
|
|
+ }
|
|
|
+ sSettings.sGSM[0].prior = 3;
|
|
|
+ sSettings.sGSM[1].prior = 2;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить параметры SNTP по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetSntpDef(void)
|
|
|
+{
|
|
|
+ sSettings.sSNTP.sntpEnable = true;
|
|
|
+ strcpy(sSettings.sSNTP.ip1, "10.254.0.50");
|
|
|
+ strcpy(sSettings.sSNTP.ip2, "10.254.0.50");
|
|
|
+ sSettings.sSNTP.timeZone = 3.0;
|
|
|
+ strcpy(sSettings.sSNTP.data, "none");
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить параметры подключения к серверу по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetServerParamsDef(void)
|
|
|
+{
|
|
|
+ strcpy(sSettings.sServer.ip, "10.254.0.69");
|
|
|
+ sSettings.sServer.port = 1884;
|
|
|
+ sSettings.sServer.serverEnable = true;
|
|
|
+ sSettings.sServer.controlConnect = true;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить параметры PROXY по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetProxyParamsDef(void)
|
|
|
+{
|
|
|
+ strcpy(sSettings.sProxy.ip, "79.135.245.84");
|
|
|
+ sSettings.sProxy.port = 55679;
|
|
|
+ sSettings.sProxy.local_port = 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить значение настроек прозрачного порта по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetPortGwDef(void)
|
|
|
+{
|
|
|
+ for(uint8_t i = 0; i < NUM_PORTGW; i ++)
|
|
|
+ {
|
|
|
+ sSettings.sPortGw[i].enableDispatch = false; // Параллельная диспетчеризация (Вкл./Выкл.)
|
|
|
+ sSettings.sPortGw[i].type_port = ACCOUNT_METER; // Тип порта (Модем / Прибор учета)
|
|
|
+ sSettings.sPortGw[i].connect_port = 2; // Связанный порт (#1-#3)
|
|
|
+ strcpy(sSettings.sPortGw[i].description, ""); // Описание
|
|
|
+ sSettings.sPortGw[i].enabled = true; // Вкл/Откл
|
|
|
+ sSettings.sPortGw[i].transtype = GW_TCP; // Тип транспорта (TCP/UDP)
|
|
|
+ sSettings.sPortGw[i].mode = GW_SERVER; // Режим: Клиент/Сервер
|
|
|
+ strcpy(sSettings.sPortGw[i].ip, "192.168.1.2"); // IP-адрес сервера (для клиента)
|
|
|
+ sSettings.sPortGw[i].port = 1001; // Порт
|
|
|
+ sSettings.sPortGw[i].rs_mode = RS_485_1; // Режим (RS-232/RS-485)
|
|
|
+ sSettings.sPortGw[i].uart_set.baud = BRD_9600; // Скорость порта
|
|
|
+ sSettings.sPortGw[i].uart_set.parity = NO_PAR; // Четность
|
|
|
+ sSettings.sPortGw[i].uart_set.databits = DATABITS_8; // Число бит данных
|
|
|
+ sSettings.sPortGw[i].uart_set.stopbits = STOP_1; // Число стоп-бит
|
|
|
+ }
|
|
|
+
|
|
|
+ sSettings.sPortGw[0].rs_mode = RS_232_1;
|
|
|
+ sSettings.sPortGw[0].port = 1001;
|
|
|
+ sSettings.sPortGw[0].connect_port = 1;
|
|
|
+
|
|
|
+ sSettings.sPortGw[1].rs_mode = RS_485_1;
|
|
|
+ sSettings.sPortGw[1].port = 1002;
|
|
|
+ sSettings.sPortGw[1].connect_port = 2;
|
|
|
+ sSettings.sPortGw[1].enabled = false;
|
|
|
+
|
|
|
+ sSettings.sPortGw[2].rs_mode = RS_232_2;
|
|
|
+ sSettings.sPortGw[2].port = 1003;
|
|
|
+ sSettings.sPortGw[2].connect_port = 0;
|
|
|
+ sSettings.sPortGw[2].enabled = false;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить значение системы параллельной диспетчеризации по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetPSDDef(void)
|
|
|
+{
|
|
|
+ sSettings.sPSD.enabled = false;
|
|
|
+ sSettings.sPSD.mux_mode = PSD_MODE_7;
|
|
|
+ sSettings.sPSD.rs_mode = RS_232_1;
|
|
|
+ sSettings.sPSD.web_port = 0;
|
|
|
+ sSettings.sPSD.assd_timeout = 120;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить значение пароля по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetServiceDef(void)
|
|
|
+{
|
|
|
+ sSettings.sAuth[0].level = ADMIN;
|
|
|
+ strcpy(sSettings.sAuth[0].login, "user");
|
|
|
+ //"b26b1868 705a3f0a a82cbd79 7cd58b4e" uchetmo
|
|
|
+ *(uint32_t *)sSettings.sAuth[0].hash = 0x68186bb2;
|
|
|
+ *(uint32_t *)(sSettings.sAuth[0].hash + 4) = 0x0a3f5a70;
|
|
|
+ *(uint32_t *)(sSettings.sAuth[0].hash + 8) = 0x79bd2ca8;
|
|
|
+ *(uint32_t *)(sSettings.sAuth[0].hash + 12) = 0x4e8bd57c;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
|
|
|
+ */
|
|
|
+void SETTINGS_SetPartDefault(void)
|
|
|
+{
|
|
|
+ SETTINGS_SetFlagsDef();
|
|
|
+
|
|
|
+ SETTINGS_SetEthternetSwitchDef();
|
|
|
+ SETTINGS_SetWebParamsDef();
|
|
|
+ SETTINGS_SetTempWebParamsDef();
|
|
|
+ SETTINGS_SetGSMDef();
|
|
|
+ SETTINGS_SetSntpDef();
|
|
|
+ SETTINGS_SetServerParamsDef();
|
|
|
+ SETTINGS_SetProxyParamsDef();
|
|
|
+ SETTINGS_SetPortGwDef();
|
|
|
+ SETTINGS_SetPSDDef();
|
|
|
+
|
|
|
+ sSettings.settVer = SETTINGS_VERSION;
|
|
|
+
|
|
|
+ sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
|
|
|
+
|
|
|
+ sSettings.controlWorld = SETTINGS_CONTROL_WORD;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Сброс всех настроек в значения по умолчанию
|
|
|
+ */
|
|
|
+void SETTINGS_SetAllDefault(void)
|
|
|
+{
|
|
|
+ SETTINGS_SetWebParamsDef();
|
|
|
+ SETTINGS_SetTempWebParamsDef();
|
|
|
+ SETTINGS_SetInfoDef();
|
|
|
+ SETTINGS_SetGSMDef();
|
|
|
+ SETTINGS_SetFlagsDef();
|
|
|
+
|
|
|
+ SETTINGS_SetEthternetSwitchDef();
|
|
|
+ SETTINGS_SetSntpDef();
|
|
|
+ SETTINGS_SetServerParamsDef();
|
|
|
+ SETTINGS_SetProxyParamsDef();
|
|
|
+ SETTINGS_SetPortGwDef();
|
|
|
+ SETTINGS_SetPSDDef();
|
|
|
+ SETTINGS_SetServiceDef();
|
|
|
+
|
|
|
+ sSettings.settVer = SETTINGS_VERSION;
|
|
|
+
|
|
|
+ sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
|
|
|
+
|
|
|
+ sSettings.controlWorld = SETTINGS_CONTROL_WORD;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Запись структуры настроек во flesh
|
|
|
+ */
|
|
|
+void SETTINGS_Save(void)
|
|
|
+{
|
|
|
+ xSemaphoreTake(flash_mutex, portMAX_DELAY);
|
|
|
+ // Calc critical section CRC and store to the settings structure
|
|
|
+ sSettings.CritSecCRC = SETTINGS_GetCritSecCRC();
|
|
|
+
|
|
|
+ SETTINGS_WriteToFlash((uint8_t*)&sSettings, sizeof(sSettings));
|
|
|
+ xSemaphoreGive(flash_mutex);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Загрузка структуры настроек из flesh
|
|
|
+ */
|
|
|
+void SETTINGS_Load(void)
|
|
|
+{
|
|
|
+ uint32_t loadCRC; // CRC из flash
|
|
|
+ uint32_t newCRC; // CRC загруженной структуры настроек
|
|
|
+ bool need_default = false;
|
|
|
+
|
|
|
+ WEB_PARAMS_t sWebParamsBackup;
|
|
|
+
|
|
|
+ SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
|
|
|
+
|
|
|
+ // Считываем CRC из флеш памяти
|
|
|
+ loadCRC = (*(uint32_t*)CRC_ADDRESS);
|
|
|
+
|
|
|
+ // Рассчитываем CRC для структуры настроек
|
|
|
+ newCRC = SETTINGS_GetCRC();
|
|
|
+
|
|
|
+ // Если CRC не совпадают нужно прошивать дефолтные настройки
|
|
|
+ if (loadCRC != newCRC) {
|
|
|
+ need_default = true;
|
|
|
+ }
|
|
|
+ // CRC совпала, проверяем контрольное слово если слово не совпадает
|
|
|
+ // то это значит, что поплыла структура нстроек, прошиваем дефолт
|
|
|
+ else if (sSettings.controlWorld != SETTINGS_CONTROL_WORD)
|
|
|
+ {
|
|
|
+ need_default = true;
|
|
|
+ }
|
|
|
+ // CRC и контрольное слово совпали, проверяем номер версии настроек.
|
|
|
+ // Если версия в настройках и прошивке не совпадают
|
|
|
+ // (при обновлении изменили структуру настроек), прошиваем дефолт
|
|
|
+ else if (sSettings.settVer != SETTINGS_VERSION)
|
|
|
+ {
|
|
|
+ need_default = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Прошиваем дефолтные настройки если нужно
|
|
|
+ if (need_default)
|
|
|
+ {
|
|
|
+ // Бэкапим сетевые параметры загрузчика
|
|
|
+ memcpy(&sWebParamsBackup, &sSettings.sWebParams, sizeof(sWebParamsBackup));
|
|
|
+
|
|
|
+ loadCRC = sSettings.CritSecCRC;
|
|
|
+ newCRC = SETTINGS_GetCritSecCRC();
|
|
|
+ SETTINGS_SetAllDefault();
|
|
|
+ if (loadCRC == newCRC) {
|
|
|
+ // Применяем сетевые параметры загрузчика
|
|
|
+ memcpy(&sSettings.sWebParams, &sWebParamsBackup, sizeof(sSettings.sWebParams));
|
|
|
+ }
|
|
|
+
|
|
|
+ SETTINGS_Save();
|
|
|
+ }
|
|
|
+
|
|
|
+ SDBG SETTINGS_Print();
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief
|
|
|
+ */
|
|
|
+void SETTINGS_WriteToFlash(uint8_t *data, uint32_t size)
|
|
|
+{
|
|
|
+ uint32_t baseAddress = SETTINGS_SECTOR;
|
|
|
+ uint32_t checkCrc = 0;
|
|
|
+ uint32_t crc = SETTINGS_GetCRC();
|
|
|
+ flash_status_type status;
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < 3; i++)
|
|
|
+ {
|
|
|
+ flash_unlock();
|
|
|
+
|
|
|
+ SETTINGS_EraseFlashSector();
|
|
|
+
|
|
|
+ for (uint32_t i = 0; i < size; i++)
|
|
|
+ if ((status = flash_byte_program(baseAddress++, *data++)) != FLASH_OPERATE_DONE) {
|
|
|
+ SDBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((status = flash_word_program((uint32_t)CRC_ADDRESS, crc)) != FLASH_OPERATE_DONE) {
|
|
|
+ SDBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
|
|
|
+ }
|
|
|
+
|
|
|
+ flash_lock();
|
|
|
+
|
|
|
+ /* Считываем что записали */
|
|
|
+ SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
|
|
|
+
|
|
|
+ checkCrc = SETTINGS_GetCRC();
|
|
|
+
|
|
|
+ /* Проверяем CRC того что было записано */
|
|
|
+ if (checkCrc == crc)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief
|
|
|
+ */
|
|
|
+void SETTINGS_ReadFromFlash(uint8_t *data, uint32_t size)
|
|
|
+{
|
|
|
+ uint32_t baseAddress = SETTINGS_SECTOR;
|
|
|
+
|
|
|
+ for (uint32_t i = 0; i < size; i++)
|
|
|
+ *data++ = (*(uint32_t*)baseAddress++);;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Очистка сектора настроек
|
|
|
+ * @retval
|
|
|
+ */
|
|
|
+void SETTINGS_EraseFlashSector(void)
|
|
|
+{
|
|
|
+ flash_status_type status;
|
|
|
+
|
|
|
+ if ((status = flash_sector_erase(SETTINGS_SECTOR)) != FLASH_OPERATE_DONE) {
|
|
|
+ SDBG printf("SETTINGS_EraseFlashSector error: status = %d/r/n", status);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief
|
|
|
+ * @retval
|
|
|
+ */
|
|
|
+uint32_t SETTINGS_GetCRC(void)
|
|
|
+{
|
|
|
+ crc_data_reset();
|
|
|
+ return crc_block_calculate((uint32_t*)&sSettings, sizeof(sSettings)/4 - 1);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief
|
|
|
+ * @retval
|
|
|
+ */
|
|
|
+uint32_t SETTINGS_GetCritSecCRC(void)
|
|
|
+{
|
|
|
+ crc_data_reset();
|
|
|
+ uint32_t critsec_len = (uint32_t)((uint8_t *)(&sSettings.CritSecCRC) - (uint8_t *)&sSettings) / 4;
|
|
|
+ return crc_block_calculate((uint32_t *)&sSettings, critsec_len);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Сброс флага boottry в регистре RTC
|
|
|
+ */
|
|
|
+void SETTINGS_ResetBootTry(void)
|
|
|
+{
|
|
|
+ uint8_t bootTry = (uint8_t)bpr_data_read(BPR_DATA2);
|
|
|
+
|
|
|
+ if (bootTry > 0 )
|
|
|
+ {
|
|
|
+ bootTry = 0;
|
|
|
+ bpr_data_write(BPR_DATA2, 0);
|
|
|
+
|
|
|
+ // Check FW update flag
|
|
|
+ if (bpr_data_read(BPR_DATA3)) {
|
|
|
+ log_add_record(UPDATED_FW, 0);
|
|
|
+ // Clear FW update flag
|
|
|
+ bpr_data_write(BPR_DATA3, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Преобразует mac адрес строкового формата в массив uint8_t
|
|
|
+ * @param mac - буфер для вывода mac адреса
|
|
|
+ */
|
|
|
+void SETTINGS_GetMac(uint8_t *mac)
|
|
|
+{
|
|
|
+ char dummy[2];
|
|
|
+ char *macPtr = sSettings.sInfo.mac;
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < 6; i++)
|
|
|
+ {
|
|
|
+ strncpy(dummy, macPtr+i*3, 2);
|
|
|
+ mac[i] = (uint8_t)strtol(dummy, NULL, 16);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить дату производства
|
|
|
+ */
|
|
|
+void SETTINGS_SetProDate(char *proDate, uint8_t len)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+ strcpy(sSys->proddate, proDate);
|
|
|
+ SYS_Save(sSys);
|
|
|
+ memset(sSettings.sInfo.productionData, 0, 40);
|
|
|
+ memcpy(sSettings.sInfo.productionData, proDate, len);
|
|
|
+ vPortFree(sSys);
|
|
|
+ //SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить серийный номер
|
|
|
+ */
|
|
|
+void SETTINGS_SetSerialNumber(char *sn, uint8_t len)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+ strcpy(sSys->serial, sn);
|
|
|
+ SYS_Save(sSys);
|
|
|
+ memset(sSettings.sInfo.serialNumber, 0, 16);
|
|
|
+ memcpy(sSettings.sInfo.serialNumber, sn, len);
|
|
|
+ vPortFree(sSys);
|
|
|
+ //SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить MAC
|
|
|
+ */
|
|
|
+void SysSETTINGS_SetMAC(char *mac, uint8_t len)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+ strcpy(sSys->mac, mac);
|
|
|
+ SYS_Save(sSys);
|
|
|
+ memset(sSettings.sInfo.mac, 0, 18);
|
|
|
+ memcpy(sSettings.sInfo.mac, mac, len);
|
|
|
+ vPortFree(sSys);
|
|
|
+ //SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить статус тестирования
|
|
|
+ */
|
|
|
+void SETTINGS_StatusTest(char *status, uint8_t len)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+ strcpy(sSys->testState, status);
|
|
|
+ SYS_Save(sSys);
|
|
|
+ memset(sSettings.sFlags.testState, 0, 16);
|
|
|
+ memcpy(sSettings.sFlags.testState, status, len);
|
|
|
+ vPortFree(sSys);
|
|
|
+ SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Установить статус тестирования "T2OK"
|
|
|
+ */
|
|
|
+void SETTINGS_SetT2OK(void)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+
|
|
|
+ //SETTINGS_SetEthternetSwitchDef(); // TODO временное решение
|
|
|
+
|
|
|
+ memset(sSettings.sFlags.testState, 0, 16);
|
|
|
+ memcpy(sSettings.sFlags.testState, "T2OK", 4);
|
|
|
+ strcpy(sSys->testState, sSettings.sFlags.testState);
|
|
|
+ SYS_Save(sSys);
|
|
|
+ vPortFree(sSys);
|
|
|
+ SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Сбросить статус тестирования "T2OK"
|
|
|
+ */
|
|
|
+void SETTINGS_ResetT2OK(void)
|
|
|
+{
|
|
|
+ SYS_t *sSys = NULL;
|
|
|
+
|
|
|
+ sSys = pvPortMalloc(sizeof(*sSys));
|
|
|
+ if (sSys)
|
|
|
+ {
|
|
|
+ SYS_Load(sSys);
|
|
|
+
|
|
|
+ SETTINGS_SetEthternetSwitchDef(); // TODO временное решение
|
|
|
+
|
|
|
+ memset(sSettings.sFlags.testState, 0, 16);
|
|
|
+ strcpy(sSys->testState, sSettings.sFlags.testState);
|
|
|
+ SYS_Save(sSys);
|
|
|
+ vPortFree(sSys);
|
|
|
+ SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Устанавливает mac адрес исходя из unique id
|
|
|
+ */
|
|
|
+void COM_SetTestMAC(void)
|
|
|
+{
|
|
|
+ uint8_t octet1 = 0;
|
|
|
+ uint8_t octet2 = 0;
|
|
|
+ uint8_t octet3 = 0;
|
|
|
+ uint8_t octet4 = 0;
|
|
|
+ uint8_t octet5 = 0;
|
|
|
+
|
|
|
+ char AT_ID_HEX[12];
|
|
|
+ uint8_t hash[16];
|
|
|
+
|
|
|
+ GetAT32IDInt(AT_ID_HEX);
|
|
|
+
|
|
|
+ md5hash(hash, (unsigned char*)AT_ID_HEX, sizeof(AT_ID_HEX));
|
|
|
+
|
|
|
+ octet1 = hash[0];
|
|
|
+ octet2 = hash[1];
|
|
|
+ octet3 = hash[2];
|
|
|
+ octet4 = hash[3];
|
|
|
+ octet5 = hash[4];
|
|
|
+ /* Устанавливаем MAC, но не сохраняем */
|
|
|
+ snprintf(sSettings.sInfo.mac, MAC_LEN, "%02X-%02X-%02X-%02X-%02X-00", octet1 & 0xFE, octet2, octet3, octet4, octet5);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Включить DHCP
|
|
|
+ */
|
|
|
+void SETTINGS_SetDHCPOn(void)
|
|
|
+{
|
|
|
+ sSettings.sWebTempParams.dhcpEnable = 1;
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void init_settings(void)
|
|
|
+{
|
|
|
+ flash_mutex = xSemaphoreCreateMutex();
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+bool SETTINGS_Check_9b(void)
|
|
|
+{
|
|
|
+ for (uint8_t i = 0; i < NUM_PORTGW; i++) {
|
|
|
+ if (sSettings.sPortGw[i].uart_set.databits == DATABITS_9) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void SETTINGS_Replace_9b(void)
|
|
|
+{
|
|
|
+ bool ret = false;
|
|
|
+ for (uint8_t i = 0; i < NUM_PORTGW; i++) {
|
|
|
+ if (sSettings.sPortGw[i].uart_set.databits == DATABITS_9) {
|
|
|
+ sSettings.sPortGw[i].uart_set.databits = DATABITS_8;
|
|
|
+ ret = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ret) {
|
|
|
+ SETTINGS_Save();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//
|
|
|
+void SETTINGS_Print(void)
|
|
|
+{
|
|
|
+ printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
|
|
|
+ printf(" Общие настройки для bootloader и FW");
|
|
|
+ printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n\n");
|
|
|
+
|
|
|
+ printf("Сетевые настройки:\r\n");
|
|
|
+
|
|
|
+ printf("\tIP: ");
|
|
|
+ printf("%s\r\n", sSettings.sWebParams.ip);
|
|
|
+
|
|
|
+ printf("\tGate: ");
|
|
|
+ printf("%s\r\n", sSettings.sWebParams.gate);
|
|
|
+
|
|
|
+ printf("\tMask: ");
|
|
|
+ printf("%s\r\n", sSettings.sWebParams.mask);
|
|
|
+
|
|
|
+ printf("\tDNS1: ");
|
|
|
+ printf("%s\r\n", sSettings.sWebParams.dns1);
|
|
|
+
|
|
|
+ printf("\tDNS2: ");
|
|
|
+ printf("%s\r\n", sSettings.sWebParams.dns2);
|
|
|
+
|
|
|
+ if (sSettings.sWebParams.dhcpEnable)
|
|
|
+ printf("\tDHCP: On\r\n");
|
|
|
+ else
|
|
|
+ printf("\tDHCP: Off\r\n");
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nИнформация об устройстве:\r\n");
|
|
|
+
|
|
|
+ printf("\tID: ");
|
|
|
+ printf("%u\r\n", sSettings.sInfo.id);
|
|
|
+
|
|
|
+ printf("\tДата производства: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.productionData);
|
|
|
+
|
|
|
+ printf("\tMAC: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.mac);
|
|
|
+
|
|
|
+ printf("\tСерийный номер: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.serialNumber);
|
|
|
+
|
|
|
+ printf("\tВладелец: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.owner);
|
|
|
+
|
|
|
+ printf("\tАдрес: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.location);
|
|
|
+
|
|
|
+ printf("\tКомментарии: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.comments);
|
|
|
+
|
|
|
+ printf("\tОтветственное лицо: ");
|
|
|
+ printf("%s\r\n", sSettings.sInfo.incharge);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < NUM_GSM; i++)
|
|
|
+ {
|
|
|
+ printf("\r\nНастройки GSM модема:\r\n");
|
|
|
+ printf("Профиль GSM %u:\r\n", i + 1);
|
|
|
+
|
|
|
+ if (sSettings.sGSM[i].Enabled)
|
|
|
+ printf("\tChannel: On\r\n");
|
|
|
+ else
|
|
|
+ printf("\tChannel: Off\r\n");
|
|
|
+
|
|
|
+ printf("\tПриоритет: %u\r\n", sSettings.sGSM[i].prior);
|
|
|
+
|
|
|
+ switch (sSettings.sGSM[i].type_profile)
|
|
|
+ {
|
|
|
+ case BEELINE :
|
|
|
+ printf("\tТип профиля: BEELINE\r\n");
|
|
|
+ break;
|
|
|
+ case MTS :
|
|
|
+ printf("\tТип профиля: MTS\r\n");
|
|
|
+ break;
|
|
|
+ case MEGAFON :
|
|
|
+ printf("\tТип профиля: MEGAFON\r\n");
|
|
|
+ break;
|
|
|
+ case TELE2 :
|
|
|
+ printf("\tТип профиля: TELE2\r\n");
|
|
|
+ break;
|
|
|
+ case USER :
|
|
|
+ printf("\tТип профиля: USER\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\tAPN: %s\r\n", sSettings.sGSM[i].APNaddr);
|
|
|
+ printf("\tAPN логин: %s\r\n", sSettings.sGSM[i].APNlogin);
|
|
|
+ printf("\tAPN пароль: %s\r\n", sSettings.sGSM[i].APNpass);
|
|
|
+ printf("\tIP для проверки связи: %s\r\n", sSettings.sGSM[i].ip_test);
|
|
|
+ printf("\tНомер SIM карты: %s\r\n", sSettings.sGSM[i].msisdn);
|
|
|
+ printf("\tТаймаут ожидания ответа: %u, с\r\n", sSettings.sGSM[i].timeout);
|
|
|
+ printf("\tВремя проверки каналов связи: %u\r\n", sSettings.sGSM[i].period_test);
|
|
|
+ printf("\tКоличество неудачных попыток: %u\r\n", sSettings.sGSM[i].num_bad_connect);
|
|
|
+ printf("\tРежим работы GSM модема: ");
|
|
|
+
|
|
|
+ switch (sSettings.sGSM[i].modem_mode)
|
|
|
+ {
|
|
|
+ case AUTOMATIC :
|
|
|
+ printf("Automatic\r\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case GSM_3G :
|
|
|
+ printf("GSM + 3G\r\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case LTE :
|
|
|
+ printf("LTE only\r\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WCDMA :
|
|
|
+ printf("3G only\r\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case GSM :
|
|
|
+ printf("GSM only\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nCRC критической секции: %X\r\n", sSettings.CritSecCRC);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
|
|
|
+ printf(" Секция настрок для FW");
|
|
|
+ printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n\n");
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nФлаги:\r\n");
|
|
|
+
|
|
|
+ printf("\tИзменение сетевых настроек: %u\r\n", sSettings.sFlags.netsettingsChanged);
|
|
|
+ printf("\tСтатус тестирования: %s\r\n", sSettings.sFlags.testState);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nEthernet канал:\r\n");
|
|
|
+
|
|
|
+ if (sSettings.sEthernet.Enabled)
|
|
|
+ printf("\tКанал: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tКанал: выкл\r\n");
|
|
|
+
|
|
|
+ printf("\tПриоритет: %u\r\n", sSettings.sEthernet.prior);
|
|
|
+ printf("\tIP для проверки связи: %s\r\n", sSettings.sEthernet.ip_test);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nСервер:\r\n");
|
|
|
+
|
|
|
+ if (sSettings.sServer.serverEnable)
|
|
|
+ printf("\tСервер: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tСервер: выкл\r\n");
|
|
|
+
|
|
|
+ printf("\tIP: %s\r\n", sSettings.sServer.ip);
|
|
|
+ printf("\tPort: %u\r\n", sSettings.sServer.port);
|
|
|
+
|
|
|
+ if (sSettings.sServer.controlConnect)
|
|
|
+ printf("\tКонтроль соединения: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tКонтроль соединения: выкл\r\n");
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nProxy:\r\n");
|
|
|
+
|
|
|
+ printf("\tIP: %s\r\n", sSettings.sProxy.ip);
|
|
|
+ printf("\tPort: %u\r\n", sSettings.sProxy.port);
|
|
|
+ printf("\tLocal port: %u\r\n", sSettings.sProxy.local_port);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < MAX_WEB_USERS; i++)
|
|
|
+ {
|
|
|
+ printf("\r\nНастройки аутентификации пользователя %u:\r\n", i + 1);
|
|
|
+
|
|
|
+ switch (sSettings.sAuth[i].level)
|
|
|
+ {
|
|
|
+ case FACTORY :
|
|
|
+ printf("\tУровень пользователя: FACTORY\r\n");
|
|
|
+ break;
|
|
|
+ case ADMIN :
|
|
|
+ printf("\tУровень пользователя: ADMIN\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\tlogin: %s\r\n", sSettings.sAuth[i].login);
|
|
|
+ printf("\thash: %X\r\n", sSettings.sAuth[i].hash);
|
|
|
+ }
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < NUM_PORTGW; i++)
|
|
|
+ {
|
|
|
+ printf("\r\nНастройки прозрачного порта %u:\r\n", i + 1);
|
|
|
+
|
|
|
+ if (sSettings.sPortGw[i].enableDispatch)
|
|
|
+ printf("\tПараллельная диспетчеризация: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tПараллельная диспетчеризация: выкл\r\n");
|
|
|
+
|
|
|
+ if (sSettings.sPortGw[i].enabled)
|
|
|
+ printf("\tПрозрачный порт: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tПрозрачный порт: выкл\r\n");
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].type_port)
|
|
|
+ {
|
|
|
+ case MODEM :
|
|
|
+ printf("\tТип порта: Модем\r\n");
|
|
|
+ break;
|
|
|
+ case ACCOUNT_METER :
|
|
|
+ printf("\tТип порта: Прибор учета\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\tСвязанный порт %u:\r\n", sSettings.sPortGw[i].connect_port);
|
|
|
+ printf("\tОписание: %s\r\n", sSettings.sPortGw[i].description);
|
|
|
+
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].transtype)
|
|
|
+ {
|
|
|
+ case GW_UDP :
|
|
|
+ printf("\tТип транспорта: UDP\r\n");
|
|
|
+ break;
|
|
|
+ case GW_TCP :
|
|
|
+ printf("\tТип транспорта: TCP\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].mode)
|
|
|
+ {
|
|
|
+ case GW_SERVER :
|
|
|
+ printf("\tРежим: сервер\r\n");
|
|
|
+ break;
|
|
|
+ case GW_CLIENT :
|
|
|
+ printf("\tРежим: клиент\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\tIP сервера (режим клиента): %s\r\n", sSettings.sPortGw[i].ip);
|
|
|
+ printf("\tПорт: %u\r\n", sSettings.sPortGw[i].port);
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].rs_mode)
|
|
|
+ {
|
|
|
+ case RS_232_1 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_232_1\r\n");
|
|
|
+ break;
|
|
|
+ case RS_232_2 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_232_2\r\n");
|
|
|
+ break;
|
|
|
+ case RS_232_3 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_232_3\r\n");
|
|
|
+ break;
|
|
|
+ case RS_485_1 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_485_1\r\n");
|
|
|
+ break;
|
|
|
+ case RS_485_2 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_485_2\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].uart_set.baud)
|
|
|
+ {
|
|
|
+ case BRD_1200 :
|
|
|
+ printf("\tBaudrate: 1200\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_2400 :
|
|
|
+ printf("\tBaudrate: 2400\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_4800 :
|
|
|
+ printf("\tBaudrate: 4800\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_9600 :
|
|
|
+ printf("\tBaudrate: 9600\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_19200 :
|
|
|
+ printf("\tBaudrate: 19200\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_38400 :
|
|
|
+ printf("\tBaudrate: 38400\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_57600 :
|
|
|
+ printf("\tBaudrate: 57600\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_115200 :
|
|
|
+ printf("\tBaudrate: 115200\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_230400 :
|
|
|
+ printf("\tBaudrate: 230400\r\n");
|
|
|
+ break;
|
|
|
+ case BRD_460800 :
|
|
|
+ printf("\tBaudrate: 460800\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].uart_set.databits)
|
|
|
+ {
|
|
|
+ case DATABITS_7 :
|
|
|
+ printf("\tData bits: 7\r\n");
|
|
|
+ break;
|
|
|
+ case DATABITS_8 :
|
|
|
+ printf("\tData bits: 8\r\n");
|
|
|
+ break;
|
|
|
+ case DATABITS_9 :
|
|
|
+ printf("\tData bits: 9\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (sSettings.sPortGw[i].uart_set.stopbits)
|
|
|
+ {
|
|
|
+ case STOP_0_5 :
|
|
|
+ printf("\tStop bits: 0_5\r\n");
|
|
|
+ break;
|
|
|
+ case STOP_1 :
|
|
|
+ printf("\tStop bits: 1\r\n");
|
|
|
+ break;
|
|
|
+ case STOP_1_5 :
|
|
|
+ printf("\tStop bits: 1_5\r\n");
|
|
|
+ break;
|
|
|
+ case STOP_2 :
|
|
|
+ printf("\tStop bits: 2\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nПротокол SNTP:\r\n");
|
|
|
+
|
|
|
+ if (sSettings.sSNTP.sntpEnable)
|
|
|
+ printf("\tSNTP: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tSNTP: выкл\r\n");
|
|
|
+
|
|
|
+ printf("\tСервер 1 IP: %s\r\n", sSettings.sSNTP.ip1);
|
|
|
+ printf("\tСервер 2 IP: %s\r\n", sSettings.sSNTP.ip2);
|
|
|
+ printf("\tДата последней синхронизации: %s\r\n", sSettings.sSNTP.data);
|
|
|
+ printf("\tЧасовой пояс (utc): %f\r\n", sSettings.sSNTP.timeZone);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\nПараллельная диспетчеризация:\r\n");
|
|
|
+
|
|
|
+ if (sSettings.sPSD.enabled)
|
|
|
+ printf("\tДиспечеризация: вкл\r\n");
|
|
|
+ else
|
|
|
+ printf("\tДиспечеризация: выкл\r\n");
|
|
|
+
|
|
|
+ switch (sSettings.sPSD.mux_mode)
|
|
|
+ {
|
|
|
+ case PSD_MODE_1 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_1 - RS232#1 <-> RS232#2, USART6 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+ case PSD_MODE_2 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_2 - RS485#1 <-> RS232#2, USART6 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+ case PSD_MODE_3 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_3 - RS232#1 <-> RS485#2, USART6 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+ case PSD_MODE_4 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_4 - RS485#1 <-> RS485#2, USART6 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+ case PSD_MODE_5 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_5 - RS232#1 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+ case PSD_MODE_6 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_6 - RS485#1 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+ case PSD_MODE_7 :
|
|
|
+ printf("\tРежим (управление мультиплексором): MODE_7 - USART1 <-> RS485#1, \r\n\t\tUSART3 <-> RS485#2, USART4 <-> RS232#1, \r\n\t\tUSART5 <-> RS232#2, USART6 <-> RS232#3\r\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (sSettings.sPSD.rs_mode)
|
|
|
+ {
|
|
|
+ case RS_232_1 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_232_1\r\n");
|
|
|
+ break;
|
|
|
+ case RS_232_2 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_232_2\r\n");
|
|
|
+ break;
|
|
|
+ case RS_232_3 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_232_3\r\n");
|
|
|
+ break;
|
|
|
+ case RS_485_1 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_485_1\r\n");
|
|
|
+ break;
|
|
|
+ case RS_485_2 :
|
|
|
+ printf("\tРежим (RS-232/RS-485): RS_485_2\r\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("\tНомер прозрачного порта: %u\r\n", sSettings.sPSD.web_port);
|
|
|
+ printf("\tТаймаут: %u, сек\r\n", sSettings.sPSD.assd_timeout);
|
|
|
+
|
|
|
+// -------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+ printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
|
|
|
+
|
|
|
+ printf("\tКонтрольное слово: %u\r\n", sSettings.controlWorld);
|
|
|
+ printf("\tCRC: %X\r\n", *(uint32_t*)CRC_ADDRESS);
|
|
|
+}
|
|
|
+
|
|
|
+/********************************* (C) ROTEK **********************************/
|