settings_api.c 34 KB

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