settings_api.c 36 KB

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