settings_api.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. #include "at32f403a_407.h"
  2. #include "settings_api.h"
  3. #include "sys_api.h"
  4. #include "FreeRTOS.h"
  5. #include "task.h"
  6. #include "queue.h"
  7. #include "semphr.h"
  8. #include "common_config.h"
  9. #include "common.h"
  10. #include "at32_uid.h"
  11. #include "hash.h"
  12. #include <math.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. SemaphoreHandle_t flash_mutex;
  17. // Флаг подтверждения новых сетевых параметров пользователем
  18. bool fConfirmWebParams = false;
  19. // Системные настройки
  20. sys_settings_t sys_settings;
  21. // Общая структура настроек
  22. settings_t settings;
  23. //
  24. void init_settings(void)
  25. {
  26. flash_mutex = xSemaphoreCreateMutex();
  27. }
  28. // Загрузка структуры настроек из flesh
  29. void settings_load(settings_t *settings)
  30. {
  31. uint32_t loadCRC; // CRC из flash
  32. uint32_t newCRC; // CRC загруженной структуры настроек
  33. bool need_default = false;
  34. settings_read_from_flash((uint8_t*)settings, sizeof(settings_t));
  35. // Считываем CRC из флеш памяти
  36. loadCRC = (*(uint32_t*)CRC_ADDRESS);
  37. // Рассчитываем CRC для структуры настроек
  38. newCRC = settings_get_crc(settings);
  39. // Если CRC не совпадают нужно прошивать дефолтные настройки
  40. if (loadCRC != newCRC) {
  41. need_default = true;
  42. }
  43. // CRC совпала, проверяем контрольное слово если слово не совпадает
  44. // то это значит, что поплыла структура нстроек, прошиваем дефолт
  45. else if (settings->control_word != SETTINGS_CONTROL_WORD)
  46. {
  47. need_default = true;
  48. }
  49. // CRC и контрольное слово совпали, проверяем номер версии настроек.
  50. // Если версия в настройках и прошивке не совпадают
  51. // (при обновлении изменили структуру настроек), прошиваем дефолт
  52. else if (settings->settings_version != SETTINGS_VERSION)
  53. {
  54. need_default = true;
  55. }
  56. // Прошиваем дефолтные настройки если нужно
  57. if (need_default)
  58. {
  59. settings_set_all_default();
  60. settings_save(settings);
  61. }
  62. #if 1
  63. //SETTINGS_Print();
  64. #endif
  65. }
  66. //
  67. void settings_read_from_flash(uint8_t *data, uint32_t size)
  68. {
  69. uint32_t baseAddress = SETTINGS_SECTOR;
  70. for (uint32_t i = 0; i < size; i++)
  71. *data++ = (*(uint32_t*)baseAddress++);;
  72. }
  73. //
  74. uint32_t settings_get_crc(settings_t *settings)
  75. {
  76. crc_data_reset();
  77. return crc_block_calculate((uint32_t*)settings, sizeof(settings_t)/4 - 1);
  78. }
  79. //
  80. uint32_t settings_get_crit_sec_crc(settings_t *settings)
  81. {
  82. crc_data_reset();
  83. uint32_t critsec_len = (uint32_t)((uint8_t *)(&settings->critical_section_crc) - (uint8_t *)settings) / 4;
  84. return crc_block_calculate((uint32_t *)settings, critsec_len);
  85. }
  86. // Сброс всех настроек в значения по умолчанию
  87. void settings_set_all_default(void)
  88. {
  89. settings_set_modbus_def(&settings.com_settings.mb_port);
  90. #if 0
  91. SETTINGS_SetWebParamsDef();
  92. SETTINGS_SetTempWebParamsDef();
  93. SETTINGS_SetInfoDef();
  94. SETTINGS_SetGSMDef();
  95. SETTINGS_SetFlagsDef();
  96. SETTINGS_SetEthternetSwitchDef();
  97. SETTINGS_SetSntpDef();
  98. SETTINGS_SetServerParamsDef();
  99. SETTINGS_SetProxyParamsDef();
  100. SETTINGS_SetPortGwDef();
  101. SETTINGS_SetPSDDef();
  102. SETTINGS_SetServiceDef();
  103. sSettings.settVer = SETTINGS_VERSION;
  104. sSettings.CritSecCRC = settings_get_crit_sec_crc();
  105. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  106. #endif
  107. }
  108. // -------------------------------------------------------------------------- //
  109. // Настройки по умолчанию
  110. //
  111. void settings_set_modbus_def(uint16_t *mb_port)
  112. {
  113. modbus_t mb_settings;
  114. mb_settings.baud = BRD_115200;
  115. mb_settings.parity = NO_PAR;
  116. mb_settings.databits = DATABITS_8;
  117. mb_settings.stopbits = STOP_1;
  118. settings_conv_modbus_def(&mb_settings, mb_port);
  119. }
  120. //
  121. void settings_conv_modbus_def(modbus_t *mb_settings, uint16_t *mb_port)
  122. {
  123. uint16_t param = 0;
  124. // Количестро стоп бит (0-1 биты)
  125. if (mb_settings->stopbits == STOP_1)
  126. param = 0x00;
  127. else if (mb_settings->stopbits == STOP_2)
  128. param = 0x02;
  129. // Длина слова (2ой бит)
  130. param |= 0x00 << 2;
  131. // Контроль четности (3-4 биты)
  132. if (mb_settings->parity == NO_PAR)
  133. param |= 0x00 << 3;
  134. else if (mb_settings->parity == EVEN_PAR)
  135. param |= 0x02 << 3;
  136. else if (mb_settings->parity == ODD_PAR)
  137. param |= 0x03 << 3;
  138. // Скорость (5 - 7 биты)
  139. switch (mb_settings->baud)
  140. {
  141. case BRD_2400 :
  142. param |= 0x00 << 5;
  143. break;
  144. case BRD_4800 :
  145. param |= 0x01 << 5;
  146. break;
  147. case BRD_9600 :
  148. param |= 0x02 << 5;
  149. break;
  150. case BRD_19200 :
  151. param |= 0x03 << 5;
  152. break;
  153. case BRD_38400 :
  154. param |= 0x04 << 5;
  155. break;
  156. case BRD_57600 :
  157. param |= 0x05 << 5;
  158. break;
  159. case BRD_115200 :
  160. param |= 0x06 << 5;
  161. break;
  162. default : break;
  163. }
  164. *mb_port = param;
  165. }
  166. // -------------------------------------------------------------------------- //
  167. // Запись структуры настроек во flash
  168. void settings_save(settings_t *settings)
  169. {
  170. xSemaphoreTake(flash_mutex, portMAX_DELAY);
  171. settings->critical_section_crc = settings_get_crit_sec_crc(settings);
  172. settings_write_to_flash((uint8_t*)settings, sizeof(settings_t));
  173. xSemaphoreGive(flash_mutex);
  174. }
  175. //
  176. void settings_write_to_flash(uint8_t *data, uint32_t size)
  177. {
  178. uint32_t baseAddress = SETTINGS_SECTOR;
  179. uint32_t checkCrc = 0;
  180. uint32_t crc = settings_get_crc(&settings);
  181. flash_status_type status;
  182. for (uint8_t i = 0; i < 3; i++)
  183. {
  184. #if 0
  185. flash_unlock();
  186. SETTINGS_EraseFlashSector();
  187. for (uint32_t i = 0; i < size; i++)
  188. if ((status = flash_byte_program(baseAddress++, *data++)) != FLASH_OPERATE_DONE) {
  189. SDBG printf("FLASH_ProgramByte error: status = %d\r\n", status);
  190. break;
  191. }
  192. if ((status = flash_word_program((uint32_t)CRC_ADDRESS, crc)) != FLASH_OPERATE_DONE) {
  193. SDBG printf("FLASH_ProgramWord error: status = %d\r\n", status);
  194. }
  195. flash_lock();
  196. /* Считываем что записали */
  197. SETTINGS_ReadFromFlash((uint8_t*)&sSettings, sizeof(sSettings));
  198. checkCrc = SETTINGS_GetCRC();
  199. /* Проверяем CRC того что было записано */
  200. if (checkCrc == crc)
  201. break;
  202. #endif
  203. }
  204. }
  205. #if 0
  206. // Установить параметры сетевого подключения по умолчанию
  207. void SETTINGS_SetWebParamsDef(void)
  208. {
  209. strcpy(sSettings.sWebParams.ip, "192.168.10.254");
  210. strcpy(sSettings.sWebParams.gate, "192.168.10.1");
  211. strcpy(sSettings.sWebParams.mask, "255.255.255.0");
  212. strcpy(sSettings.sWebParams.dns1, "8.8.8.8");
  213. strcpy(sSettings.sWebParams.dns2, "8.8.4.4");
  214. sSettings.sWebParams.dhcpEnable = 1;
  215. }
  216. // Установить временные параметры сетевого подключения по умолчанию
  217. void SETTINGS_SetTempWebParamsDef(void)
  218. {
  219. strcpy(sSettings.sWebTempParams.ip, "192.168.10.254");
  220. strcpy(sSettings.sWebTempParams.gate, "192.168.10.1");
  221. strcpy(sSettings.sWebTempParams.mask, "255.255.255.0");
  222. strcpy(sSettings.sWebTempParams.dns1, "8.8.8.8");
  223. strcpy(sSettings.sWebTempParams.dns2, "8.8.4.4");
  224. sSettings.sWebTempParams.dhcpEnable = 1;
  225. }
  226. // Установить Информацию об устройстве по умолчанию
  227. void SETTINGS_SetInfoDef(void)
  228. {
  229. #if 0
  230. sys_settings_t *sSys = NULL;
  231. sSys = pvPortMalloc(sizeof(*sSys));
  232. if (sSys)
  233. {
  234. SYS_Load(sSys);
  235. strcpy(sSettings.sInfo.mac, sSys->mac);
  236. strcpy(sSettings.sInfo.serialNumber, sSys->serial);
  237. strcpy(sSettings.sInfo.productionData, sSys->proddate);
  238. strcpy(sSettings.sFlags.testState, sSys->testState);
  239. vPortFree(sSys);
  240. }
  241. else
  242. {
  243. strcpy(sSettings.sInfo.productionData, "00.00.00 00:00");
  244. strcpy(sSettings.sInfo.mac, DEVICE_MAC);
  245. strcpy(sSettings.sInfo.serialNumber, DEVICE_SERIAL);
  246. memset(sSettings.sFlags.testState, 0, 16);
  247. }
  248. sSettings.sInfo.id = 0;
  249. strcpy(sSettings.sInfo.location, "");
  250. strcpy(sSettings.sInfo.owner, "");
  251. strcpy(sSettings.sInfo.comments, "");
  252. strcpy(sSettings.sInfo.incharge, "");
  253. #endif
  254. }
  255. /**
  256. * @brief Установить флаги по умолчанию
  257. */
  258. void SETTINGS_SetFlagsDef(void)
  259. {
  260. sSettings.sFlags.netsettingsChanged = false;
  261. }
  262. /**
  263. * @brief Установить параметры сетевого подключения по умолчанию
  264. */
  265. void SETTINGS_SetEthternetSwitchDef(void)
  266. {
  267. sSettings.sEthernet.Enabled = true;
  268. sSettings.sEthernet.prior = 1;
  269. strcpy(sSettings.sEthernet.ip_test, "10.254.0.33");
  270. }
  271. /**
  272. * @brief Установить параметры GSM подключения по умолчанию
  273. */
  274. void SETTINGS_SetGSMDef(void)
  275. {
  276. for(uint8_t i = 0; i < NUM_GSM; i++)
  277. {
  278. sSettings.sGSM[i].Enabled = true;
  279. sSettings.sGSM[i].prior = 0;
  280. sSettings.sGSM[i].type_profile = USER;
  281. strcpy(sSettings.sGSM[i].ip_test, "10.254.0.33");
  282. strcpy(sSettings.sGSM[i].APNaddr, "MDUDPTN");
  283. strcpy(sSettings.sGSM[i].APNlogin, "");
  284. strcpy(sSettings.sGSM[i].APNpass, "");
  285. strcpy(sSettings.sGSM[i].msisdn, "");
  286. sSettings.sGSM[i].timeout = 30;
  287. sSettings.sGSM[i].period_test = 100;
  288. sSettings.sGSM[i].num_bad_connect = 3;
  289. sSettings.sGSM[i].modem_mode = AUTOMATIC;
  290. }
  291. sSettings.sGSM[0].prior = 3;
  292. sSettings.sGSM[1].prior = 2;
  293. }
  294. /**
  295. * @brief Установить параметры SNTP по умолчанию
  296. */
  297. void SETTINGS_SetSntpDef(void)
  298. {
  299. sSettings.sSNTP.sntpEnable = true;
  300. strcpy(sSettings.sSNTP.ip1, "10.254.0.50");
  301. strcpy(sSettings.sSNTP.ip2, "10.254.0.50");
  302. sSettings.sSNTP.timeZone = 3.0;
  303. strcpy(sSettings.sSNTP.data, "none");
  304. }
  305. /**
  306. * @brief Установить параметры подключения к серверу по умолчанию
  307. */
  308. void SETTINGS_SetServerParamsDef(void)
  309. {
  310. strcpy(sSettings.sServer.ip, "10.254.0.69");
  311. sSettings.sServer.port = 1884;
  312. sSettings.sServer.serverEnable = true;
  313. sSettings.sServer.controlConnect = true;
  314. }
  315. /**
  316. * @brief Установить параметры PROXY по умолчанию
  317. */
  318. void SETTINGS_SetProxyParamsDef(void)
  319. {
  320. strcpy(sSettings.sProxy.ip, "79.135.245.84");
  321. sSettings.sProxy.port = 55679;
  322. sSettings.sProxy.local_port = 0;
  323. }
  324. /**
  325. * @brief Установить значение настроек прозрачного порта по умолчанию
  326. */
  327. void SETTINGS_SetPortGwDef(void)
  328. {
  329. for(uint8_t i = 0; i < NUM_PORTGW; i ++)
  330. {
  331. sSettings.sPortGw[i].enableDispatch = false; // Параллельная диспетчеризация (Вкл./Выкл.)
  332. sSettings.sPortGw[i].type_port = ACCOUNT_METER; // Тип порта (Модем / Прибор учета)
  333. sSettings.sPortGw[i].connect_port = 2; // Связанный порт (#1-#3)
  334. strcpy(sSettings.sPortGw[i].description, ""); // Описание
  335. sSettings.sPortGw[i].enabled = true; // Вкл/Откл
  336. sSettings.sPortGw[i].transtype = GW_TCP; // Тип транспорта (TCP/UDP)
  337. sSettings.sPortGw[i].mode = GW_SERVER; // Режим: Клиент/Сервер
  338. strcpy(sSettings.sPortGw[i].ip, "192.168.1.2"); // IP-адрес сервера (для клиента)
  339. sSettings.sPortGw[i].port = 1001; // Порт
  340. sSettings.sPortGw[i].rs_mode = RS_485_1; // Режим (RS-232/RS-485)
  341. sSettings.sPortGw[i].uart_set.baud = BRD_9600; // Скорость порта
  342. sSettings.sPortGw[i].uart_set.parity = NO_PAR; // Четность
  343. sSettings.sPortGw[i].uart_set.databits = DATABITS_8; // Число бит данных
  344. sSettings.sPortGw[i].uart_set.stopbits = STOP_1; // Число стоп-бит
  345. }
  346. sSettings.sPortGw[0].rs_mode = RS_232_1;
  347. sSettings.sPortGw[0].port = 1001;
  348. sSettings.sPortGw[0].connect_port = 1;
  349. sSettings.sPortGw[1].rs_mode = RS_485_1;
  350. sSettings.sPortGw[1].port = 1002;
  351. sSettings.sPortGw[1].connect_port = 2;
  352. sSettings.sPortGw[1].enabled = false;
  353. sSettings.sPortGw[2].rs_mode = RS_232_2;
  354. sSettings.sPortGw[2].port = 1003;
  355. sSettings.sPortGw[2].connect_port = 0;
  356. sSettings.sPortGw[2].enabled = false;
  357. }
  358. /**
  359. * @brief Установить значение системы параллельной диспетчеризации по умолчанию
  360. */
  361. void SETTINGS_SetPSDDef(void)
  362. {
  363. sSettings.sPSD.enabled = false;
  364. sSettings.sPSD.mux_mode = PSD_MODE_7;
  365. sSettings.sPSD.rs_mode = RS_232_1;
  366. sSettings.sPSD.web_port = 0;
  367. sSettings.sPSD.assd_timeout = 120;
  368. }
  369. /**
  370. * @brief Установить значение пароля по умолчанию
  371. */
  372. void SETTINGS_SetServiceDef(void)
  373. {
  374. sSettings.sAuth[0].level = ADMIN;
  375. strcpy(sSettings.sAuth[0].login, "user");
  376. //"b26b1868 705a3f0a a82cbd79 7cd58b4e" uchetmo
  377. *(uint32_t *)sSettings.sAuth[0].hash = 0x68186bb2;
  378. *(uint32_t *)(sSettings.sAuth[0].hash + 4) = 0x0a3f5a70;
  379. *(uint32_t *)(sSettings.sAuth[0].hash + 8) = 0x79bd2ca8;
  380. *(uint32_t *)(sSettings.sAuth[0].hash + 12) = 0x4e8bd57c;
  381. }
  382. /**
  383. * @brief Сброс всех настроек в значения по умолчанию кроме сетевых настроек
  384. */
  385. void SETTINGS_SetPartDefault(void)
  386. {
  387. SETTINGS_SetFlagsDef();
  388. SETTINGS_SetEthternetSwitchDef();
  389. SETTINGS_SetWebParamsDef();
  390. SETTINGS_SetTempWebParamsDef();
  391. SETTINGS_SetGSMDef();
  392. SETTINGS_SetSntpDef();
  393. SETTINGS_SetServerParamsDef();
  394. SETTINGS_SetProxyParamsDef();
  395. SETTINGS_SetPortGwDef();
  396. SETTINGS_SetPSDDef();
  397. sSettings.settVer = SETTINGS_VERSION;
  398. sSettings.CritSecCRC = settings_get_crit_sec_crc();
  399. sSettings.controlWorld = SETTINGS_CONTROL_WORD;
  400. }
  401. #endif
  402. #if 0
  403. /**
  404. * @brief
  405. */
  406. /**
  407. * @brief Очистка сектора настроек
  408. * @retval
  409. */
  410. void SETTINGS_EraseFlashSector(void)
  411. {
  412. flash_status_type status;
  413. if ((status = flash_sector_erase(SETTINGS_SECTOR)) != FLASH_OPERATE_DONE) {
  414. SDBG printf("SETTINGS_EraseFlashSector error: status = %d/r/n", status);
  415. }
  416. }
  417. /**
  418. * @brief Сброс флага boottry в регистре RTC
  419. */
  420. void SETTINGS_ResetBootTry(void)
  421. {
  422. uint8_t bootTry = (uint8_t)bpr_data_read(BPR_DATA2);
  423. #if 0
  424. if (bootTry > 0 )
  425. {
  426. bootTry = 0;
  427. bpr_data_write(BPR_DATA2, 0);
  428. // Check FW update flag
  429. if (bpr_data_read(BPR_DATA3)) {
  430. log_add_record(UPDATED_FW, 0);
  431. // Clear FW update flag
  432. bpr_data_write(BPR_DATA3, 0);
  433. }
  434. }
  435. #endif
  436. }
  437. /**
  438. * @brief Преобразует mac адрес строкового формата в массив uint8_t
  439. * @param mac - буфер для вывода mac адреса
  440. */
  441. void SETTINGS_GetMac(uint8_t *mac)
  442. {
  443. char dummy[2];
  444. char *macPtr = sSettings.sInfo.mac;
  445. for (uint8_t i = 0; i < 6; i++)
  446. {
  447. strncpy(dummy, macPtr+i*3, 2);
  448. mac[i] = (uint8_t)strtol(dummy, NULL, 16);
  449. }
  450. }
  451. /**
  452. * @brief Установить дату производства
  453. */
  454. void SETTINGS_SetProDate(char *proDate, uint8_t len)
  455. {
  456. #if 0
  457. sys_settings_t *sSys = NULL;
  458. sSys = pvPortMalloc(sizeof(*sys_settings_t));
  459. if (sSys)
  460. {
  461. SYS_Load(sSys);
  462. strcpy(sSys->proddate, proDate);
  463. sys_save(sSys);
  464. memset(sSettings.sInfo.productionData, 0, 40);
  465. memcpy(sSettings.sInfo.productionData, proDate, len);
  466. vPortFree(sSys);
  467. //SETTINGS_Save();
  468. }
  469. #endif
  470. }
  471. /**
  472. * @brief Установить серийный номер
  473. */
  474. void SETTINGS_SetSerialNumber(char *sn, uint8_t len)
  475. {
  476. #if 0
  477. sys_settings_t *sSys = NULL;
  478. sSys = pvPortMalloc(sizeof(*sSys));
  479. if (sSys)
  480. {
  481. SYS_Load(sSys);
  482. strcpy(sSys->serial, sn);
  483. sys_save(sSys);
  484. memset(sSettings.sInfo.serialNumber, 0, 16);
  485. memcpy(sSettings.sInfo.serialNumber, sn, len);
  486. vPortFree(sSys);
  487. //SETTINGS_Save();
  488. }
  489. #endif
  490. }
  491. /**
  492. * @brief Установить MAC
  493. */
  494. void SysSETTINGS_SetMAC(char *mac, uint8_t len)
  495. {
  496. #if 0
  497. sys_settings_t *sSys = NULL;
  498. sSys = pvPortMalloc(sizeof(*sSys));
  499. if (sSys)
  500. {
  501. SYS_Load(sSys);
  502. strcpy(sSys->mac, mac);
  503. sys_save(sSys);
  504. memset(sSettings.sInfo.mac, 0, 18);
  505. memcpy(sSettings.sInfo.mac, mac, len);
  506. vPortFree(sSys);
  507. //SETTINGS_Save();
  508. }
  509. #endif
  510. }
  511. /**
  512. * @brief Установить статус тестирования
  513. */
  514. void SETTINGS_StatusTest(char *status, uint8_t len)
  515. {
  516. #if 0
  517. SYS_t *sSys = NULL;
  518. sSys = pvPortMalloc(sizeof(*sSys));
  519. if (sSys)
  520. {
  521. SYS_Load(sSys);
  522. strcpy(sSys->testState, status);
  523. sys_save(sSys);
  524. memset(sSettings.sFlags.testState, 0, 16);
  525. memcpy(sSettings.sFlags.testState, status, len);
  526. vPortFree(sSys);
  527. SETTINGS_Save();
  528. }
  529. #endif
  530. }
  531. /**
  532. * @brief Установить статус тестирования "T2OK"
  533. */
  534. void SETTINGS_SetT2OK(void)
  535. {
  536. #if 0
  537. SYS_t *sSys = NULL;
  538. sSys = pvPortMalloc(sizeof(*sSys));
  539. if (sSys)
  540. {
  541. SYS_Load(sSys);
  542. //SETTINGS_SetEthternetSwitchDef(); // TODO временное решение
  543. memset(sSettings.sFlags.testState, 0, 16);
  544. memcpy(sSettings.sFlags.testState, "T2OK", 4);
  545. strcpy(sSys->testState, sSettings.sFlags.testState);
  546. sys_save(sSys);
  547. vPortFree(sSys);
  548. SETTINGS_Save();
  549. }
  550. #endif
  551. }
  552. /**
  553. * @brief Сбросить статус тестирования "T2OK"
  554. */
  555. void SETTINGS_ResetT2OK(void)
  556. {
  557. #if 0
  558. SYS_t *sSys = NULL;
  559. sSys = pvPortMalloc(sizeof(*sSys));
  560. if (sSys)
  561. {
  562. SYS_Load(sSys);
  563. SETTINGS_SetEthternetSwitchDef(); // TODO временное решение
  564. memset(sSettings.sFlags.testState, 0, 16);
  565. strcpy(sSys->testState, sSettings.sFlags.testState);
  566. sys_save(sSys);
  567. vPortFree(sSys);
  568. SETTINGS_Save();
  569. }
  570. #endif
  571. }
  572. /**
  573. * @brief Устанавливает mac адрес исходя из unique id
  574. */
  575. void COM_SetTestMAC(void)
  576. {
  577. uint8_t octet1 = 0;
  578. uint8_t octet2 = 0;
  579. uint8_t octet3 = 0;
  580. uint8_t octet4 = 0;
  581. uint8_t octet5 = 0;
  582. char AT_ID_HEX[12];
  583. uint8_t hash[16];
  584. GetAT32IDInt(AT_ID_HEX);
  585. md5hash(hash, (unsigned char*)AT_ID_HEX, sizeof(AT_ID_HEX));
  586. octet1 = hash[0];
  587. octet2 = hash[1];
  588. octet3 = hash[2];
  589. octet4 = hash[3];
  590. octet5 = hash[4];
  591. /* Устанавливаем MAC, но не сохраняем */
  592. //snprintf(sSettings.sInfo.mac, MAC_LEN, "%02X-%02X-%02X-%02X-%02X-00", octet1 & 0xFE, octet2, octet3, octet4, octet5);
  593. }
  594. /**
  595. * @brief Включить DHCP
  596. */
  597. void SETTINGS_SetDHCPOn(void)
  598. {
  599. sSettings.sWebTempParams.dhcpEnable = 1;
  600. }
  601. //
  602. void SETTINGS_Print(void)
  603. {
  604. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  605. printf(" Общие настройки для bootloader и FW");
  606. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n\n");
  607. printf("Сетевые настройки:\r\n");
  608. printf("\tIP: ");
  609. printf("%s\r\n", sSettings.sWebParams.ip);
  610. printf("\tGate: ");
  611. printf("%s\r\n", sSettings.sWebParams.gate);
  612. printf("\tMask: ");
  613. printf("%s\r\n", sSettings.sWebParams.mask);
  614. printf("\tDNS1: ");
  615. printf("%s\r\n", sSettings.sWebParams.dns1);
  616. printf("\tDNS2: ");
  617. printf("%s\r\n", sSettings.sWebParams.dns2);
  618. if (sSettings.sWebParams.dhcpEnable)
  619. printf("\tDHCP: On\r\n");
  620. else
  621. printf("\tDHCP: Off\r\n");
  622. // -------------------------------------------------------------------------- //
  623. printf("\r\nИнформация об устройстве:\r\n");
  624. printf("\tID: ");
  625. printf("%u\r\n", sSettings.sInfo.id);
  626. printf("\tДата производства: ");
  627. printf("%s\r\n", sSettings.sInfo.productionData);
  628. printf("\tMAC: ");
  629. printf("%s\r\n", sSettings.sInfo.mac);
  630. printf("\tСерийный номер: ");
  631. printf("%s\r\n", sSettings.sInfo.serialNumber);
  632. printf("\tВладелец: ");
  633. printf("%s\r\n", sSettings.sInfo.owner);
  634. printf("\tАдрес: ");
  635. printf("%s\r\n", sSettings.sInfo.location);
  636. printf("\tКомментарии: ");
  637. printf("%s\r\n", sSettings.sInfo.comments);
  638. printf("\tОтветственное лицо: ");
  639. printf("%s\r\n", sSettings.sInfo.incharge);
  640. // -------------------------------------------------------------------------- //
  641. for (uint8_t i = 0; i < NUM_GSM; i++)
  642. {
  643. printf("\r\nНастройки GSM модема:\r\n");
  644. printf("Профиль GSM %u:\r\n", i + 1);
  645. if (sSettings.sGSM[i].Enabled)
  646. printf("\tChannel: On\r\n");
  647. else
  648. printf("\tChannel: Off\r\n");
  649. printf("\tПриоритет: %u\r\n", sSettings.sGSM[i].prior);
  650. switch (sSettings.sGSM[i].type_profile)
  651. {
  652. case BEELINE :
  653. printf("\tТип профиля: BEELINE\r\n");
  654. break;
  655. case MTS :
  656. printf("\tТип профиля: MTS\r\n");
  657. break;
  658. case MEGAFON :
  659. printf("\tТип профиля: MEGAFON\r\n");
  660. break;
  661. case TELE2 :
  662. printf("\tТип профиля: TELE2\r\n");
  663. break;
  664. case USER :
  665. printf("\tТип профиля: USER\r\n");
  666. break;
  667. }
  668. printf("\tAPN: %s\r\n", sSettings.sGSM[i].APNaddr);
  669. printf("\tAPN логин: %s\r\n", sSettings.sGSM[i].APNlogin);
  670. printf("\tAPN пароль: %s\r\n", sSettings.sGSM[i].APNpass);
  671. printf("\tIP для проверки связи: %s\r\n", sSettings.sGSM[i].ip_test);
  672. printf("\tНомер SIM карты: %s\r\n", sSettings.sGSM[i].msisdn);
  673. printf("\tТаймаут ожидания ответа: %u, с\r\n", sSettings.sGSM[i].timeout);
  674. printf("\tВремя проверки каналов связи: %u\r\n", sSettings.sGSM[i].period_test);
  675. printf("\tКоличество неудачных попыток: %u\r\n", sSettings.sGSM[i].num_bad_connect);
  676. printf("\tРежим работы GSM модема: ");
  677. switch (sSettings.sGSM[i].modem_mode)
  678. {
  679. case AUTOMATIC :
  680. printf("Automatic\r\n");
  681. break;
  682. case GSM_3G :
  683. printf("GSM + 3G\r\n");
  684. break;
  685. case LTE :
  686. printf("LTE only\r\n");
  687. break;
  688. case WCDMA :
  689. printf("3G only\r\n");
  690. break;
  691. case GSM :
  692. printf("GSM only\r\n");
  693. break;
  694. }
  695. }
  696. // -------------------------------------------------------------------------- //
  697. printf("\r\nCRC критической секции: %X\r\n", sSettings.CritSecCRC);
  698. // -------------------------------------------------------------------------- //
  699. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  700. printf(" Секция настрок для FW");
  701. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n\n");
  702. // -------------------------------------------------------------------------- //
  703. printf("\r\nФлаги:\r\n");
  704. printf("\tИзменение сетевых настроек: %u\r\n", sSettings.sFlags.netsettingsChanged);
  705. printf("\tСтатус тестирования: %s\r\n", sSettings.sFlags.testState);
  706. // -------------------------------------------------------------------------- //
  707. printf("\r\nEthernet канал:\r\n");
  708. if (sSettings.sEthernet.Enabled)
  709. printf("\tКанал: вкл\r\n");
  710. else
  711. printf("\tКанал: выкл\r\n");
  712. printf("\tПриоритет: %u\r\n", sSettings.sEthernet.prior);
  713. printf("\tIP для проверки связи: %s\r\n", sSettings.sEthernet.ip_test);
  714. // -------------------------------------------------------------------------- //
  715. printf("\r\nСервер:\r\n");
  716. if (sSettings.sServer.serverEnable)
  717. printf("\tСервер: вкл\r\n");
  718. else
  719. printf("\tСервер: выкл\r\n");
  720. printf("\tIP: %s\r\n", sSettings.sServer.ip);
  721. printf("\tPort: %u\r\n", sSettings.sServer.port);
  722. if (sSettings.sServer.controlConnect)
  723. printf("\tКонтроль соединения: вкл\r\n");
  724. else
  725. printf("\tКонтроль соединения: выкл\r\n");
  726. // -------------------------------------------------------------------------- //
  727. printf("\r\nProxy:\r\n");
  728. printf("\tIP: %s\r\n", sSettings.sProxy.ip);
  729. printf("\tPort: %u\r\n", sSettings.sProxy.port);
  730. printf("\tLocal port: %u\r\n", sSettings.sProxy.local_port);
  731. // -------------------------------------------------------------------------- //
  732. for (uint8_t i = 0; i < MAX_WEB_USERS; i++)
  733. {
  734. printf("\r\nНастройки аутентификации пользователя %u:\r\n", i + 1);
  735. switch (sSettings.sAuth[i].level)
  736. {
  737. case FACTORY :
  738. printf("\tУровень пользователя: FACTORY\r\n");
  739. break;
  740. case ADMIN :
  741. printf("\tУровень пользователя: ADMIN\r\n");
  742. break;
  743. }
  744. printf("\tlogin: %s\r\n", sSettings.sAuth[i].login);
  745. printf("\thash: %X\r\n", sSettings.sAuth[i].hash);
  746. }
  747. // -------------------------------------------------------------------------- //
  748. for (uint8_t i = 0; i < NUM_PORTGW; i++)
  749. {
  750. printf("\r\nНастройки прозрачного порта %u:\r\n", i + 1);
  751. if (sSettings.sPortGw[i].enableDispatch)
  752. printf("\tПараллельная диспетчеризация: вкл\r\n");
  753. else
  754. printf("\tПараллельная диспетчеризация: выкл\r\n");
  755. if (sSettings.sPortGw[i].enabled)
  756. printf("\tПрозрачный порт: вкл\r\n");
  757. else
  758. printf("\tПрозрачный порт: выкл\r\n");
  759. switch (sSettings.sPortGw[i].type_port)
  760. {
  761. case MODEM :
  762. printf("\tТип порта: Модем\r\n");
  763. break;
  764. case ACCOUNT_METER :
  765. printf("\tТип порта: Прибор учета\r\n");
  766. break;
  767. }
  768. printf("\tСвязанный порт %u:\r\n", sSettings.sPortGw[i].connect_port);
  769. printf("\tОписание: %s\r\n", sSettings.sPortGw[i].description);
  770. switch (sSettings.sPortGw[i].transtype)
  771. {
  772. case GW_UDP :
  773. printf("\tТип транспорта: UDP\r\n");
  774. break;
  775. case GW_TCP :
  776. printf("\tТип транспорта: TCP\r\n");
  777. break;
  778. }
  779. switch (sSettings.sPortGw[i].mode)
  780. {
  781. case GW_SERVER :
  782. printf("\tРежим: сервер\r\n");
  783. break;
  784. case GW_CLIENT :
  785. printf("\tРежим: клиент\r\n");
  786. break;
  787. }
  788. printf("\tIP сервера (режим клиента): %s\r\n", sSettings.sPortGw[i].ip);
  789. printf("\tПорт: %u\r\n", sSettings.sPortGw[i].port);
  790. switch (sSettings.sPortGw[i].rs_mode)
  791. {
  792. case RS_232_1 :
  793. printf("\tРежим (RS-232/RS-485): RS_232_1\r\n");
  794. break;
  795. case RS_232_2 :
  796. printf("\tРежим (RS-232/RS-485): RS_232_2\r\n");
  797. break;
  798. case RS_232_3 :
  799. printf("\tРежим (RS-232/RS-485): RS_232_3\r\n");
  800. break;
  801. case RS_485_1 :
  802. printf("\tРежим (RS-232/RS-485): RS_485_1\r\n");
  803. break;
  804. case RS_485_2 :
  805. printf("\tРежим (RS-232/RS-485): RS_485_2\r\n");
  806. break;
  807. }
  808. switch (sSettings.sPortGw[i].uart_set.baud)
  809. {
  810. case BRD_1200 :
  811. printf("\tBaudrate: 1200\r\n");
  812. break;
  813. case BRD_2400 :
  814. printf("\tBaudrate: 2400\r\n");
  815. break;
  816. case BRD_4800 :
  817. printf("\tBaudrate: 4800\r\n");
  818. break;
  819. case BRD_9600 :
  820. printf("\tBaudrate: 9600\r\n");
  821. break;
  822. case BRD_19200 :
  823. printf("\tBaudrate: 19200\r\n");
  824. break;
  825. case BRD_38400 :
  826. printf("\tBaudrate: 38400\r\n");
  827. break;
  828. case BRD_57600 :
  829. printf("\tBaudrate: 57600\r\n");
  830. break;
  831. case BRD_115200 :
  832. printf("\tBaudrate: 115200\r\n");
  833. break;
  834. case BRD_230400 :
  835. printf("\tBaudrate: 230400\r\n");
  836. break;
  837. case BRD_460800 :
  838. printf("\tBaudrate: 460800\r\n");
  839. break;
  840. }
  841. switch (sSettings.sPortGw[i].uart_set.databits)
  842. {
  843. case DATABITS_7 :
  844. printf("\tData bits: 7\r\n");
  845. break;
  846. case DATABITS_8 :
  847. printf("\tData bits: 8\r\n");
  848. break;
  849. }
  850. switch (sSettings.sPortGw[i].uart_set.stopbits)
  851. {
  852. case STOP_0_5 :
  853. printf("\tStop bits: 0_5\r\n");
  854. break;
  855. case STOP_1 :
  856. printf("\tStop bits: 1\r\n");
  857. break;
  858. case STOP_1_5 :
  859. printf("\tStop bits: 1_5\r\n");
  860. break;
  861. case STOP_2 :
  862. printf("\tStop bits: 2\r\n");
  863. break;
  864. }
  865. }
  866. // -------------------------------------------------------------------------- //
  867. printf("\r\nПротокол SNTP:\r\n");
  868. if (sSettings.sSNTP.sntpEnable)
  869. printf("\tSNTP: вкл\r\n");
  870. else
  871. printf("\tSNTP: выкл\r\n");
  872. printf("\tСервер 1 IP: %s\r\n", sSettings.sSNTP.ip1);
  873. printf("\tСервер 2 IP: %s\r\n", sSettings.sSNTP.ip2);
  874. printf("\tДата последней синхронизации: %s\r\n", sSettings.sSNTP.data);
  875. printf("\tЧасовой пояс (utc): %f\r\n", sSettings.sSNTP.timeZone);
  876. // -------------------------------------------------------------------------- //
  877. printf("\r\nПараллельная диспетчеризация:\r\n");
  878. if (sSettings.sPSD.enabled)
  879. printf("\tДиспечеризация: вкл\r\n");
  880. else
  881. printf("\tДиспечеризация: выкл\r\n");
  882. switch (sSettings.sPSD.mux_mode)
  883. {
  884. case PSD_MODE_1 :
  885. printf("\tРежим (управление мультиплексором): MODE_1 - RS232#1 <-> RS232#2, USART6 <-> RS232#3\r\n");
  886. break;
  887. case PSD_MODE_2 :
  888. printf("\tРежим (управление мультиплексором): MODE_2 - RS485#1 <-> RS232#2, USART6 <-> RS232#3\r\n");
  889. break;
  890. case PSD_MODE_3 :
  891. printf("\tРежим (управление мультиплексором): MODE_3 - RS232#1 <-> RS485#2, USART6 <-> RS232#3\r\n");
  892. break;
  893. case PSD_MODE_4 :
  894. printf("\tРежим (управление мультиплексором): MODE_4 - RS485#1 <-> RS485#2, USART6 <-> RS232#3\r\n");
  895. break;
  896. case PSD_MODE_5 :
  897. printf("\tРежим (управление мультиплексором): MODE_5 - RS232#1 <-> RS232#3\r\n");
  898. break;
  899. case PSD_MODE_6 :
  900. printf("\tРежим (управление мультиплексором): MODE_6 - RS485#1 <-> RS232#3\r\n");
  901. break;
  902. case PSD_MODE_7 :
  903. 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");
  904. break;
  905. }
  906. switch (sSettings.sPSD.rs_mode)
  907. {
  908. case RS_232_1 :
  909. printf("\tРежим (RS-232/RS-485): RS_232_1\r\n");
  910. break;
  911. case RS_232_2 :
  912. printf("\tРежим (RS-232/RS-485): RS_232_2\r\n");
  913. break;
  914. case RS_232_3 :
  915. printf("\tРежим (RS-232/RS-485): RS_232_3\r\n");
  916. break;
  917. case RS_485_1 :
  918. printf("\tРежим (RS-232/RS-485): RS_485_1\r\n");
  919. break;
  920. case RS_485_2 :
  921. printf("\tРежим (RS-232/RS-485): RS_485_2\r\n");
  922. break;
  923. }
  924. printf("\tНомер прозрачного порта: %u\r\n", sSettings.sPSD.web_port);
  925. printf("\tТаймаут: %u, сек\r\n", sSettings.sPSD.assd_timeout);
  926. // -------------------------------------------------------------------------- //
  927. printf("\r\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
  928. printf("\tКонтрольное слово: %u\r\n", sSettings.controlWorld);
  929. printf("\tCRC: %X\r\n", *(uint32_t*)CRC_ADDRESS);
  930. }
  931. #endif