bt_6701_commands.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. /********************************* (C) РОТЕК ***********************************
  2. * @module bt_6701_commands
  3. * @file bt_6701_commands.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief bt_6701_commands
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "common_config.h"
  13. #include "stm32f4xx.h"
  14. #include "bt_6701_commands.h"
  15. #include "commands_api.h"
  16. #include "gpio.h"
  17. #include "buttons.h"
  18. #include "led.h"
  19. #include "netconf.h"
  20. #include "stm32f4x7_eth_bsp.h"
  21. #include "http_server.h"
  22. #include "rtc.h"
  23. #include "sntp_api.h"
  24. #include "d_inouts.h"
  25. #include "config_service.h"
  26. #include "usart.h"
  27. #include "spi_flash.h"
  28. #include "FreeRTOS.h"
  29. #include "task.h"
  30. #include "lwip/opt.h"
  31. #include "lwip/api.h"
  32. #include "lwip/sys.h"
  33. #ifdef PRINTF_STDLIB
  34. #include <stdio.h>
  35. #endif
  36. #ifdef PRINTF_CUSTOM
  37. #include "tinystdio.h"
  38. #endif
  39. #include <string.h>
  40. bool ntpResult = false;
  41. uint32_t SNTP_Time;
  42. extern uint8_t DefCounter;
  43. extern BUTTON_NO_FIX_t defButton;
  44. extern uint8_t SetCounter;
  45. extern BUTTON_NO_FIX_t setButton;
  46. /**
  47. * @brief Флаг ининциализации Eth интерфейса
  48. */
  49. extern unsigned char eth_ready_flag;
  50. // -------------------------------------------------------------------------- //
  51. // __weak функции
  52. /**
  53. * @brief
  54. */
  55. void TestProcessing(void)
  56. {
  57. vTaskDelay(200);
  58. }
  59. /**
  60. * @brief
  61. */
  62. void Test_U232(void)
  63. {
  64. // Отправляем символы в RS232
  65. for (uint16_t i = 0; i < 1023; i++)
  66. ups_putchar('A');
  67. vTaskDelay(10);
  68. for (uint16_t i = 0; i < 1023; i++)
  69. {
  70. if (ups_getchar(500) != 'A') {
  71. printf("U232 FAIL\r\n");
  72. TEST_SetTest(TEST_WAIT);
  73. return;
  74. }
  75. }
  76. printf("U232 OK\r\n");
  77. TEST_SetTest(TEST_WAIT);
  78. }
  79. #ifdef DALLAS_SENSOR_ENABLE
  80. void COM_TestOW(void)
  81. {
  82. uint8_t inputState;
  83. uint8_t start_state = 0;
  84. uint8_t end_state = 1;
  85. gpio_hw_config_pin(gpio_pins[WDATA1].port, gpio_pins[WDATA1].pin, GPIO_MODE_IN_CFG |
  86. GPIO_SPEED_HIGH_CFG);
  87. gpio_hw_config_pin(gpio_pins[WDATA2].port, gpio_pins[WDATA2].pin, GPIO_MODE_IN_CFG |
  88. GPIO_SPEED_HIGH_CFG);
  89. for (uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {
  90. vTaskDelay(100);
  91. gpio_set((DOUT1 + i), start_state);
  92. vTaskDelay(100);
  93. if (get_state_din_outs((WDATA1 + i)) != start_state) {
  94. printf("OW FAIL\r\n");
  95. TEST_SetTest(TEST_WAIT);
  96. return;
  97. }
  98. gpio_set((DOUT1 + i), end_state);
  99. vTaskDelay(100);
  100. if (get_state_din_outs((WDATA1 + i)) != end_state) {
  101. printf("OW FAIL\r\n");
  102. TEST_SetTest(TEST_WAIT);
  103. return;
  104. }
  105. }
  106. vTaskDelay(100);
  107. printf("OW OK\r\n");
  108. TEST_SetTest(TEST_WAIT);
  109. }
  110. #endif
  111. #ifdef DINS_ENABLE || DOUTS_ENABLE
  112. /**
  113. * @brief
  114. */
  115. void Test_DRY(void)
  116. {
  117. uint8_t inputState;
  118. uint8_t start_state = 0;
  119. uint8_t end_state = 1;
  120. #ifdef DOUTS_ENABLE
  121. #if defined RELAY_NC
  122. start_state = 0;
  123. end_state = 1;
  124. for (uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i ++) {
  125. set_state_douts((DOUT1 + i), 1);
  126. }
  127. #endif
  128. #ifdef RELAY_NO
  129. start_state = 1;
  130. end_state = 0;
  131. #endif
  132. for (uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i ++) {
  133. #ifdef HARDWARE_BT6703
  134. if(i == 2) { // функционал определяющий аппаратную часть контроллера BT-6703 (выпущено 120 шт. переделанных из BT-6702, различия в релейных выходах)
  135. break;
  136. }
  137. #endif
  138. vTaskDelay(100);
  139. inputState = get_state_din_outs(DIN1);
  140. set_state_douts((DOUT1 + i), start_state);
  141. vTaskDelay(100);
  142. if (get_state_din_outs(DIN1) == inputState) {
  143. #ifdef HARDWARE_BT6703
  144. if(i == 0) {
  145. set_state_douts((DOUT1 + 2), start_state);
  146. vTaskDelay(100);
  147. if (get_state_din_outs(DIN1) == inputState) {
  148. printf("DRY FAIL\r\n");
  149. TEST_SetTest(TEST_WAIT);
  150. return;
  151. }
  152. } else
  153. #endif
  154. {
  155. printf("DRY FAIL\r\n");
  156. TEST_SetTest(TEST_WAIT);
  157. return;
  158. }
  159. }
  160. set_state_douts((DOUT1 + i), end_state);
  161. vTaskDelay(100);
  162. if (get_state_din_outs(DIN1) != inputState) {
  163. #ifdef HARDWARE_BT6703
  164. if(i == 0) {
  165. set_state_douts((DOUT1 + 2), end_state);
  166. vTaskDelay(100);
  167. if (get_state_din_outs(DIN1) == inputState) {
  168. printf("DRY FAIL\r\n");
  169. TEST_SetTest(TEST_WAIT);
  170. return;
  171. }
  172. } else
  173. #endif
  174. {
  175. printf("DRY FAIL\r\n");
  176. TEST_SetTest(TEST_WAIT);
  177. return;
  178. }
  179. }
  180. }
  181. #else
  182. for (uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {
  183. vTaskDelay(100);
  184. gpio_set((DOUT1 + i), start_state);
  185. vTaskDelay(100);
  186. if (get_state_din_outs((DIN1 + i)) != start_state) {
  187. printf("DRY FAIL\r\n");
  188. TEST_SetTest(TEST_WAIT);
  189. return;
  190. }
  191. gpio_set((DOUT1 + i), end_state);
  192. vTaskDelay(100);
  193. if (get_state_din_outs((DIN1 + i)) != end_state) {
  194. printf("DRY FAIL\r\n");
  195. TEST_SetTest(TEST_WAIT);
  196. return;
  197. }
  198. }
  199. #endif
  200. vTaskDelay(100);
  201. printf("DRY OK\r\n");
  202. TEST_SetTest(TEST_WAIT);
  203. }
  204. #endif
  205. /**
  206. * @brief
  207. */
  208. void vTest_DEF(void *params)
  209. {
  210. static uint32_t timeout = 0;
  211. for (;;)
  212. {
  213. if (timeout++ > BUTTON_TIMEOUT) {
  214. timeout = 0;
  215. DefCounter = 0;
  216. #ifdef LED_INIT_ERR
  217. LED_Off(LED_INIT_ERR);
  218. #endif
  219. #ifdef LED_ALARM
  220. LED_Off(LED_ALARM);
  221. #endif
  222. #ifdef LED_RED_MINOR
  223. LED_Off(LED_RED_MINOR);
  224. #endif
  225. printf("DEF FAIL\r\n");
  226. TEST_SetTest(TEST_WAIT);
  227. ifTest_DEF = false;
  228. vTaskDelete(NULL);
  229. }
  230. BUTTON_NoFixHandler(&defButton);
  231. if (DefCounter == 3)
  232. {
  233. timeout = 0;
  234. DefCounter = 0;
  235. printf("DEF OK\r\n");
  236. /* Завершение теста T0 */
  237. /* Устанавливаем статус T0READY, сохраняем статус во флеш */
  238. COM_SetTestState(T0READY);
  239. TEST_SetTest(TEST_WAIT);
  240. ifTest_DEF = false;
  241. vTaskDelete(NULL);
  242. }
  243. vTaskDelay(10);
  244. }
  245. }
  246. /**
  247. * @brief
  248. */
  249. void vTest_SET(void *params)
  250. {
  251. static uint32_t timeout_set = 0;
  252. for (;;)
  253. {
  254. if (timeout_set++ > BUTTON_TIMEOUT) {
  255. timeout_set = 0;
  256. SetCounter = 0;
  257. #ifdef LED_INIT_OK
  258. LED_Off(LED_INIT_OK);
  259. #endif
  260. #ifdef LED_GREEN_MINOR
  261. LED_Off(LED_GREEN_MINOR);
  262. #endif
  263. printf("SET FAIL\r\n");
  264. TEST_SetTest(TEST_WAIT);
  265. ifTest_SET = false;
  266. vTaskDelete(NULL);
  267. }
  268. BUTTON_NoFixHandler(&setButton);
  269. if (SetCounter == 3)
  270. {
  271. timeout_set = 0;
  272. SetCounter = 0;
  273. printf("SET OK\r\n");
  274. /* Завершение теста T0 */
  275. /* Устанавливаем статус T0READY, сохраняем статус во флеш */
  276. COM_SetTestState(T0READY);
  277. TEST_SetTest(TEST_WAIT);
  278. ifTest_SET = false;
  279. vTaskDelete(NULL);
  280. }
  281. vTaskDelay(10);
  282. }
  283. }
  284. /**
  285. * @brief Тестирование RTC
  286. */
  287. void COM_TestRtc(void)
  288. {
  289. /* Пытаемся синхронизироваться с NTP сервером */
  290. SNTP_Enable(true);
  291. SNTP_Poll();
  292. vTaskDelay(1000);
  293. /* Синхронизация удалась */
  294. if (ntpResult) {
  295. printf("RTC OK\r\n");
  296. }
  297. else
  298. printf("RTC FAIL SYNC\r\n");
  299. TEST_SetTest(TEST_WAIT);
  300. }
  301. /**
  302. * @brief Тестирование SPIFLASH
  303. */
  304. void COM_TestSPIflash(void)
  305. {
  306. if (spi_flash_test()) {
  307. printf("SPIFLASH OK\r\n");
  308. }
  309. else
  310. printf("SPIFLASH FAIL SYNC\r\n");
  311. TEST_SetTest(TEST_WAIT);
  312. }
  313. /**
  314. * @brief
  315. */
  316. void Test_Ethernet(void)
  317. {
  318. static bool ethernetInit = false;
  319. int timeout = 100; /* 10 sec timeout */
  320. // if (ethernetInit == false)
  321. {
  322. if (eth_ready_flag == 0) {
  323. if(!ethernetInit){
  324. ethernetInit = true;
  325. ETH_BSP_Config();
  326. LwIP_Init();
  327. }
  328. else{
  329. init_get_ip_address_controller();
  330. }
  331. }
  332. /* Waiting ETH init */
  333. while ((eth_ready_flag == 0) && (timeout-- > 0)) {
  334. vTaskDelay(100);
  335. }
  336. if (eth_ready_flag == 0) {
  337. printf("ETH FAIL\r\n");
  338. }
  339. else {
  340. sys_thread_new("HTTP", vTaskTcpServer, NULL, 4*configMINIMAL_STACK_SIZE, tskIDLE_PRIORITY);
  341. ethernetInit = true;
  342. }
  343. }
  344. /* else {
  345. printf("ETH OK\r\n");
  346. }*/
  347. TEST_SetTest(TEST_WAIT);
  348. }
  349. /**
  350. * @brief
  351. */
  352. void Test_Serno(void)
  353. {
  354. macWaiting = true;
  355. macIsInstalled = false;
  356. // Устанавливаем статус тестирования "T1OK"
  357. COM_SetTestState(T0OK);
  358. // Отправляем udp пакет с информацией
  359. //COM_TestSerno();
  360. // Пауза. В это время должен прийти GET запрос с MAC адресом.
  361. //vTaskDelay(8000);
  362. //macWaiting = false;
  363. //if (!macIsInstalled)
  364. // printf("SERNO FAIL\r\n");
  365. for (uint8_t i = 0; i < 4; i++)
  366. {
  367. // Отправляем udp пакет с информацией
  368. COM_TestSerno();
  369. // Пауза. В это время должен прийти GET запрос с MAC адресом.
  370. vTaskDelay(8000);
  371. if (macIsInstalled)
  372. break;
  373. }
  374. if (!macIsInstalled)
  375. printf("SERNO FAIL\r\n");
  376. TEST_SetTest(TEST_WAIT);
  377. }
  378. // -------------------------------------------------------------------------- //
  379. /********************************* (C) РОТЕК **********************************/