modbus_params.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. #include "at32f403a_407.h"
  2. #include "modbus_params.h"
  3. #include "io.h"
  4. #include "uptime.h"
  5. #include "rtc.h"
  6. #include "input.h"
  7. #include "output.h"
  8. #include "log.h"
  9. #include "settings_api.h"
  10. #include "common_config.h"
  11. #include "swap.h"
  12. #include <string.h>
  13. mb_param_t mb_param[MB_PARAM_MAX];
  14. uint32_t rtc_sinhro;
  15. // Пароль для установки системных настроек
  16. uint16_t psw;
  17. bool psw_ok = false;
  18. uint8_t fw_version[8];
  19. uint16_t save_sys_cmd = 0; // Команда сохранения системных настроек
  20. uint16_t system_cmd = 0; // Команда управления контроллером
  21. uint64_t value_64 = 0;
  22. uint8_t value_8 = 0;
  23. uint8_t arch_channel = 0;
  24. void get_time(uint8_t* buf, uint8_t size);
  25. void get_din_mode(uint8_t* buf, uint8_t size);
  26. void get_log_entries_number(uint8_t* buf, uint8_t size);
  27. void get_arch_ch_1(uint8_t* buf, uint8_t size);
  28. void get_arch_ch_2(uint8_t* buf, uint8_t size);
  29. void get_arch_ch_3(uint8_t* buf, uint8_t size);
  30. void get_arch_ch_4(uint8_t* buf, uint8_t size);
  31. void get_arch_ch_5(uint8_t* buf, uint8_t size);
  32. void get_arch_ch_6(uint8_t* buf, uint8_t size);
  33. void get_arch_ch_7(uint8_t* buf, uint8_t size);
  34. void get_arch_ch_8(uint8_t* buf, uint8_t size);
  35. void (*get_ch_entries_number[8])(uint8_t* buf, uint8_t size) = {
  36. get_arch_ch_1, get_arch_ch_2, get_arch_ch_3, get_arch_ch_4,
  37. get_arch_ch_5, get_arch_ch_6, get_arch_ch_7, get_arch_ch_8,
  38. };
  39. void get_rtc(uint8_t* buf, uint8_t size);
  40. //
  41. void mb_init_params(void)
  42. {
  43. uint16_t index = 0;
  44. uint16_t addr = 0;
  45. mb_param[index].reg = 0x0100;
  46. mb_param[index].size = 1;
  47. mb_param[index].param = (uint8_t*)&input_state_bit; // Текущее состояние входов
  48. mb_param[index].set = NULL;
  49. mb_param[index].get = NULL;
  50. mb_param[index].check_handler = mb_check_dummy;
  51. index++;
  52. // Счетчики импульсов. Регистры 0x0102 - 0x0111
  53. addr = 0x0102;
  54. for (int i = 0; i < DI_NUMBER; i++)
  55. {
  56. mb_param[index].reg = addr;
  57. mb_param[index].size = 2;
  58. mb_param[index].param = (uint8_t*)&input_cnt[i]; // Счетчик ипульсов
  59. mb_param[index].set = NULL;
  60. mb_param[index].get = NULL;
  61. mb_param[index].check_handler = mb_check_dummy;
  62. addr += 2;
  63. index++;
  64. }
  65. // Режим работы входов
  66. mb_param[index].reg = 0x0120;
  67. mb_param[index].size = 1;
  68. mb_param[index].param = (uint8_t*)&settings.di_mode_bits;
  69. mb_param[index].set = mb_set_din_mode;
  70. mb_param[index].get = NULL;
  71. mb_param[index].check_handler = mb_check_dummy;
  72. index++;
  73. // Нормальное состояние входов
  74. mb_param[index].reg = 0x0122;
  75. mb_param[index].size = 1;
  76. mb_param[index].param = (uint8_t*)&settings.di_norm_state_bits;
  77. mb_param[index].set = NULL;
  78. mb_param[index].get = NULL;
  79. mb_param[index].check_handler = mb_check_dummy;
  80. index++;
  81. // Время антидребезга
  82. addr = 0x0124;
  83. for (int i = 0; i < DI_NUMBER; i++)
  84. {
  85. mb_param[index].reg = addr;
  86. mb_param[index].size = 1;
  87. mb_param[index].param = (uint8_t*)&settings.di_debounce[i];
  88. mb_param[index].set = NULL;
  89. mb_param[index].get = NULL;
  90. mb_param[index].check_handler = mb_check_dummy;
  91. addr++;
  92. index++;
  93. }
  94. // Текущее состояние датчиков нагрузки
  95. mb_param[index].reg = 0x0130;
  96. mb_param[index].size = 1;
  97. mb_param[index].param = (uint8_t*)&load_state_bit;
  98. mb_param[index].set = NULL;
  99. mb_param[index].get = NULL;
  100. mb_param[index].check_handler = mb_check_dummy;
  101. index++;
  102. // Слово достоверности датчиков нагрузки [1 - показания достоверны, 0 - нет]
  103. mb_param[index].reg = 0x0131;
  104. mb_param[index].size = 1;
  105. mb_param[index].param = (uint8_t*)&credibility_state_bit;
  106. mb_param[index].set = NULL;
  107. mb_param[index].get = NULL;
  108. mb_param[index].check_handler = mb_check_dummy;
  109. index++;
  110. // Текущее состояние выходов
  111. mb_param[index].reg = 0x0200;
  112. mb_param[index].size = 1;
  113. mb_param[index].param = (uint8_t*)&output_state_bit;
  114. mb_param[index].set = mb_set_do;
  115. mb_param[index].get = NULL;
  116. mb_param[index].check_handler = mb_check_dummy;
  117. index++;
  118. // Режим работы выходов
  119. mb_param[index].reg = 0x0202;
  120. mb_param[index].size = 1;
  121. mb_param[index].param = (uint8_t*)&output_mode_bit;
  122. mb_param[index].set = mb_set_do_mode;
  123. mb_param[index].get = NULL;
  124. mb_param[index].check_handler = mb_check_dummy;
  125. index++;
  126. // Состояние выходов в безопасном режиме
  127. mb_param[index].reg = 0x0203;
  128. mb_param[index].size = 1;
  129. mb_param[index].param = (uint8_t*)&settings.do_save_bits;
  130. mb_param[index].set = mb_set_do;
  131. mb_param[index].get = NULL;
  132. mb_param[index].check_handler = mb_check_dummy;
  133. index++;
  134. // Заполнение PWM. Регистры 0x0210 - 0x0217
  135. addr = 0x0210;
  136. for (int i = 0; i < DO_NUMBER; i++)
  137. {
  138. mb_param[index].reg = addr;
  139. mb_param[index].size = 1;
  140. mb_param[index].param = (uint8_t*)&output_pwm[i]; // Счетчик ипульсов
  141. mb_param[index].set = mb_set_do;
  142. mb_param[index].get = NULL;
  143. mb_param[index].check_handler = mb_check_dummy;
  144. addr++;
  145. index++;
  146. }
  147. // Заполнение PWM в безопасном режиме. Регистры 0x0220 - 0x0227
  148. addr = 0x0220;
  149. for (int i = 0; i < DO_NUMBER; i++)
  150. {
  151. mb_param[index].reg = addr;
  152. mb_param[index].size = 1;
  153. mb_param[index].param = (uint8_t*)&output_pwm_save[i]; // Счетчик ипульсов
  154. mb_param[index].set = mb_set_do;
  155. mb_param[index].get = NULL;
  156. mb_param[index].check_handler = mb_check_dummy;
  157. addr++;
  158. index++;
  159. }
  160. // Период PWM. Регистры 0x0220 - 0x0227
  161. addr = 0x0230;
  162. for (int i = 0; i < DO_NUMBER; i++)
  163. {
  164. mb_param[index].reg = addr;
  165. mb_param[index].size = 1;
  166. mb_param[index].param = (uint8_t*)&output_pwm_period[i]; // Счетчик ипульсов
  167. mb_param[index].set = mb_set_do;
  168. mb_param[index].get = NULL;
  169. mb_param[index].check_handler = mb_check_dummy;
  170. addr++;
  171. index++;
  172. }
  173. // Период PWM. Регистры 0x0220 - 0x0227
  174. addr = 0x0240;
  175. for (int i = 0; i < DO_NUMBER; i++)
  176. {
  177. mb_param[index].reg = addr;
  178. mb_param[index].size = 1;
  179. mb_param[index].param = (uint8_t*)&output_pwm_period_save[i]; // Счетчик ипульсов
  180. mb_param[index].set = mb_set_do;
  181. mb_param[index].get = NULL;
  182. mb_param[index].check_handler = mb_check_dummy;
  183. addr++;
  184. index++;
  185. }
  186. // ---------------------------------------------------------------------- //
  187. // Управление контроллером. Разные параметры.
  188. // ---------------------------------------------------------------------- //
  189. // Управление контроллером
  190. mb_param[index].reg = 0x0800;
  191. mb_param[index].size = 1;
  192. mb_param[index].param = (uint8_t*)&system_cmd; //
  193. mb_param[index].set = mb_control;
  194. mb_param[index].get = NULL;
  195. mb_param[index].check_handler = mb_check_dummy;
  196. index++;
  197. // uptime
  198. mb_param[index].reg = 0x0801;
  199. mb_param[index].size = 2;
  200. mb_param[index].param = (uint8_t*)&uptime; //
  201. mb_param[index].set = NULL;
  202. mb_param[index].get = NULL;
  203. mb_param[index].check_handler = mb_check_dummy;
  204. index++;
  205. // RTC
  206. mb_param[index].reg = 0x0803;
  207. mb_param[index].size = 4;
  208. mb_param[index].param = (uint8_t*)&value_64; //
  209. mb_param[index].set = mb_set_rtc;
  210. mb_param[index].get = get_rtc;
  211. mb_param[index].check_handler = mb_check_dummy;
  212. index++;
  213. // ---------------------------------------------------------------------- //
  214. // Журналы/рахивы
  215. // ---------------------------------------------------------------------- //
  216. // Емкость журнала (максимальная)
  217. mb_param[index].reg = 0x0900;
  218. mb_param[index].size = 1;
  219. mb_param[index].param = (uint8_t*)&log_entries_capacity; //
  220. mb_param[index].set = NULL;
  221. mb_param[index].get = NULL;
  222. mb_param[index].check_handler = mb_check_dummy;
  223. index++;
  224. // Текущее количество записей в журнале
  225. mb_param[index].reg = 0x0901;
  226. mb_param[index].size = 1;
  227. mb_param[index].param = NULL; //
  228. mb_param[index].set = NULL;
  229. mb_param[index].get = get_log_entries_number;
  230. mb_param[index].check_handler = mb_check_dummy;
  231. index++;
  232. // Емкость архива (максимальная)
  233. mb_param[index].reg = 0x0902;
  234. mb_param[index].size = 1;
  235. mb_param[index].param = (uint8_t*)&archive_entries_capacity; //
  236. mb_param[index].set = NULL;
  237. mb_param[index].get = NULL;
  238. mb_param[index].check_handler = mb_check_dummy;
  239. index++;
  240. // Текущее количество записей в архиве по каждому каналу
  241. addr = 0x0903;
  242. for (int i = 0; i < ARCH_CH_NUMBER; i++)
  243. {
  244. mb_param[index].reg = addr;
  245. mb_param[index].size = 1;
  246. mb_param[index].param = NULL;
  247. mb_param[index].set = NULL;
  248. mb_param[index].get = get_ch_entries_number[i];
  249. mb_param[index].check_handler = mb_check_dummy;
  250. addr++;
  251. index++;
  252. }
  253. // Период архива. Регистры 0x0904 - 0x090B
  254. addr = 0x090B;
  255. for (int i = 0; i < ARCH_CH_NUMBER; i++)
  256. {
  257. mb_param[index].reg = addr;
  258. mb_param[index].size = 1;
  259. mb_param[index].param = (uint8_t*)&settings.period_archive[i]; // Счетчик ипульсов
  260. mb_param[index].set = NULL;
  261. mb_param[index].get = NULL;
  262. mb_param[index].check_handler = mb_check_archiv_per;
  263. addr++;
  264. index++;
  265. }
  266. // ---------------------------------------------------------------------- //
  267. // Системные настройки
  268. // ---------------------------------------------------------------------- //
  269. // Код модели (только чтение). Определяется прошивкой.
  270. mb_param[index].reg = 0x0080;
  271. mb_param[index].size = 1;
  272. mb_param[index].param = (uint8_t*)&model_code; //
  273. mb_param[index].set = NULL;
  274. mb_param[index].get = NULL;
  275. mb_param[index].check_handler = mb_check_dummy;
  276. index++;
  277. // Дата производства Unix формат (чтение/запись по паролю)
  278. mb_param[index].reg = 0x0081;
  279. mb_param[index].size = 2;
  280. mb_param[index].param = (uint8_t*)&temp_sys_settings.prod_date; //
  281. mb_param[index].set = NULL;
  282. mb_param[index].get = NULL;
  283. mb_param[index].check_handler = mb_check_dummy;
  284. index++;
  285. // Серийный номер (чтение/запись по паролю).
  286. mb_param[index].reg = 0x0083;
  287. mb_param[index].size = 2;
  288. mb_param[index].param = (uint8_t*)&temp_sys_settings.sn; //
  289. mb_param[index].set = NULL;
  290. mb_param[index].get = NULL;
  291. mb_param[index].check_handler = mb_check_dummy;
  292. index++;
  293. // Версия ПО (только чтение).
  294. memcpy(&fw_version, FW_VERSION, 8);
  295. mb_param[index].reg = 0x0085;
  296. mb_param[index].size = 4;
  297. mb_param[index].param = (uint8_t*)&fw_version; //
  298. mb_param[index].set = NULL;
  299. mb_param[index].get = NULL;
  300. mb_param[index].check_handler = mb_check_dummy;
  301. index++;
  302. // Статус тестирования (чтение/запись по паролю).
  303. mb_param[index].reg = 0x0089;
  304. mb_param[index].size = 1;
  305. mb_param[index].param = (uint8_t*)&temp_sys_settings.test_state; //
  306. mb_param[index].set = NULL;
  307. mb_param[index].get = NULL;
  308. mb_param[index].check_handler = mb_check_dummy;
  309. index++;
  310. // Пароль
  311. mb_param[index].reg = 0x008A;
  312. mb_param[index].size = 1;
  313. mb_param[index].param = (uint8_t*)&psw; //
  314. mb_param[index].set = mb_password;
  315. mb_param[index].get = NULL;
  316. mb_param[index].check_handler = mb_check_dummy;
  317. index++;
  318. // Команда на сохранение системных настроек
  319. mb_param[index].reg = 0x008B;
  320. mb_param[index].size = 1;
  321. mb_param[index].param = (uint8_t*)&save_sys_cmd; //
  322. mb_param[index].set = mb_sys_settings_save;
  323. mb_param[index].get = NULL;
  324. mb_param[index].check_handler = mb_check_dummy;
  325. index++;
  326. }
  327. // Возвращает размер параметра в регистрах
  328. bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size)
  329. {
  330. for (uint16_t i = 0; i < MB_PARAM_MAX; i++)
  331. {
  332. if (mb_param[i].reg == reg)
  333. {
  334. *index = i;
  335. *size = mb_param[i].size;
  336. return true;
  337. }
  338. }
  339. return false;
  340. }
  341. //
  342. mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index)
  343. {
  344. uint8_t *ptr = mb_param[index].param;
  345. // Если параметр только для чтения
  346. if (mb_param[index].check_handler == NULL)
  347. return MB_NO_ACTION;
  348. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  349. {
  350. *ptr = buf[2*mb_param[index].size - 1 - i];
  351. ptr++;
  352. }
  353. /*
  354. if (mb_param[index].check_handler != NULL)
  355. mb_param[index].check_handler();
  356. */
  357. mb_param[index].check_handler();
  358. if (mb_param[index].set != NULL)
  359. return mb_param[index].set();
  360. else
  361. return MB_NO_ACTION;
  362. /*
  363. if (mb_param[index].f_activity)
  364. return mb_param[index].set_handler();
  365. else
  366. return MB_NO_ACTION;
  367. */
  368. }
  369. //
  370. void mb_get_param(uint8_t *buf, uint16_t index)
  371. {
  372. uint8_t *ptr;
  373. if (mb_param[index].get != NULL) {
  374. mb_param[index].get(buf, mb_param[index].size);
  375. return;
  376. }
  377. ptr = mb_param[index].param + 2*mb_param[index].size - 1;
  378. for (uint16_t i = 0; i < 2*mb_param[index].size; i++)
  379. {
  380. *buf = *ptr;
  381. buf++;
  382. ptr--;
  383. }
  384. }
  385. // -------------------------------------------------------------------------- //
  386. // Чтение параметров
  387. // -------------------------------------------------------------------------- //
  388. #if 0
  389. void get_time(uint8_t* buf, uint8_t size)
  390. {
  391. uint32_t rtc_unix = RTC_GetUnixTime();
  392. uint8_t *ptr = (uint8_t*)&rtc_unix + 2*size - 1;
  393. for (uint16_t i = 0; i < 2*size; i++)
  394. {
  395. *buf = *ptr;
  396. buf++;
  397. ptr--;
  398. }
  399. }
  400. #endif
  401. //
  402. void get_din_mode(uint8_t* buf, uint8_t size)
  403. {
  404. }
  405. //
  406. void get_log_entries_number(uint8_t* buf, uint8_t size)
  407. {
  408. static uint16_t capacity;
  409. capacity = swap_uint16(log_capacity());
  410. memcpy(buf, &capacity, 2);
  411. //buf = (uint8_t*)&capacity;
  412. }
  413. //
  414. void get_arch_ch_1(uint8_t* buf, uint8_t size)
  415. {
  416. static uint16_t capacity;
  417. capacity = swap_uint16(log_arch_capacity(0));
  418. memcpy(buf, &capacity, 2);
  419. }
  420. //
  421. void get_arch_ch_2(uint8_t* buf, uint8_t size)
  422. {
  423. static uint16_t capacity;
  424. capacity = swap_uint16(log_arch_capacity(1));
  425. memcpy(buf, &capacity, 2);
  426. }
  427. //
  428. void get_arch_ch_3(uint8_t* buf, uint8_t size)
  429. {
  430. static uint16_t capacity;
  431. capacity = swap_uint16(log_arch_capacity(2));
  432. memcpy(buf, &capacity, 2);
  433. }
  434. //
  435. void get_arch_ch_4(uint8_t* buf, uint8_t size)
  436. {
  437. static uint16_t capacity;
  438. capacity = swap_uint16(log_arch_capacity(3));
  439. memcpy(buf, &capacity, 2);
  440. }
  441. //
  442. void get_arch_ch_5(uint8_t* buf, uint8_t size)
  443. {
  444. static uint16_t capacity;
  445. capacity = swap_uint16(log_arch_capacity(4));
  446. memcpy(buf, &capacity, 2);
  447. }
  448. //
  449. void get_arch_ch_6(uint8_t* buf, uint8_t size)
  450. {
  451. static uint16_t capacity;
  452. capacity = swap_uint16(log_arch_capacity(5));
  453. memcpy(buf, &capacity, 2);
  454. }
  455. //
  456. void get_arch_ch_7(uint8_t* buf, uint8_t size)
  457. {
  458. static uint16_t capacity;
  459. capacity = swap_uint16(log_arch_capacity(6));
  460. memcpy(buf, &capacity, 2);
  461. }
  462. //
  463. void get_arch_ch_8(uint8_t* buf, uint8_t size)
  464. {
  465. static uint16_t capacity;
  466. capacity = swap_uint16(log_arch_capacity(7));
  467. memcpy(buf, &capacity, 2);
  468. }
  469. //
  470. void get_rtc(uint8_t* buf, uint8_t size)
  471. {
  472. uint64_t rtc = swap_uint64(rtc_get_ms());
  473. memcpy(buf, &rtc, 8);
  474. }
  475. // -------------------------------------------------------------------------- //
  476. // Установка параметров
  477. // -------------------------------------------------------------------------- //
  478. //
  479. mb_delay_action_t mb_set_din_mode(void)
  480. {
  481. in_set();
  482. return MB_NO_ACTION;
  483. }
  484. //
  485. mb_delay_action_t mb_set_do(void)
  486. {
  487. //do_set();
  488. do_set_common();
  489. return MB_NO_ACTION;
  490. }
  491. //
  492. mb_delay_action_t mb_set_do_mode(void)
  493. {
  494. do_set_mode();
  495. return MB_NO_ACTION;
  496. }
  497. //
  498. mb_delay_action_t mb_set_time(void)
  499. {
  500. TM_RTC_SetDataTimeUnix(rtc_sinhro);
  501. return MB_NO_ACTION;
  502. }
  503. //
  504. mb_delay_action_t mb_password(void)
  505. {
  506. if (psw != MB_PASSWORD)
  507. return MB_PAS_ERR;
  508. else {
  509. if (psw_ok == false) {
  510. psw_ok = true;
  511. return MB_PAS_OK;
  512. }
  513. else
  514. return MB_NO_ACTION;
  515. }
  516. }
  517. //
  518. mb_delay_action_t mb_sys_settings_save(void)
  519. {
  520. if (save_sys_cmd == 1)
  521. return MB_SAVE_SYS_SETTINGS;
  522. else
  523. return MB_NO_ACTION;
  524. }
  525. //
  526. mb_delay_action_t mb_control(void)
  527. {
  528. if (system_cmd == MB_COM_SETTINGS_SAVE)
  529. return MB_SAVE_SETTINGS;
  530. else if (system_cmd == MB_COM_LOG_CLEAR)
  531. return MB_LOG_CLEAR;
  532. else if ((system_cmd >= (uint8_t)MB_COM_ARCH_CLEAR_1) && (system_cmd <= (uint8_t)MB_COM_ARCH_CLEAR_8)) {
  533. arch_channel = system_cmd;
  534. return MB_ARCHIVE_CLEAR;
  535. }
  536. return MB_NO_ACTION;
  537. #if 0
  538. if (system_cmd == 1)
  539. return MB_SAVE_SETTINGS;
  540. else if (system_cmd == 2)
  541. return MB_DEF_SETTINGS;
  542. else if (system_cmd == 3)
  543. return MB_RESET;
  544. else if (system_cmd == 4)
  545. return MB_PART_DEF_SETTINGS;
  546. return MB_NO_ACTION;
  547. #endif
  548. }
  549. //
  550. mb_delay_action_t mb_set_rtc(void)
  551. {
  552. float delta;
  553. uint64_t now = rtc_get_ms();
  554. if (now >= value_64)
  555. delta = (float)(now - value_64);
  556. else
  557. delta = (float)(value_64 - now);
  558. rtc_set_in_ms((uint32_t)(value_64/1000));
  559. // -------------------------------------------------------------------------- //
  560. // EVENT. Перевод времени.
  561. log_add_entry(LOG_CLOCK_CHANGE, LOG_EVENT_STATE_OK, 0, delta);
  562. return MB_NO_ACTION;
  563. }
  564. // -------------------------------------------------------------------------- //
  565. // Проверка параметров //
  566. // -------------------------------------------------------------------------- //
  567. //
  568. void mb_check_dummy(void)
  569. {
  570. }
  571. //
  572. void mb_check_archiv_per(void)
  573. {
  574. for (uint8_t i = 0; i < ARCH_CH_NUMBER; i++)
  575. {
  576. if (settings.period_archive[i] > (uint16_t)MAX_ARCHIVE_PERIOD)
  577. settings.period_archive[i] = (uint16_t)MAX_ARCHIVE_PERIOD;
  578. }
  579. }