commands_api.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. /********************************* (C) РОТЕК ***********************************
  2. * @module commands_api
  3. * @file commands_api.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief commands_api
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "stm32f4xx.h"
  13. #include "commands_api.h"
  14. #include "settings_api.h"
  15. #include "buttons.h"
  16. #include "led.h"
  17. #include "parameters.h"
  18. #include "bt_6701_settings.h"
  19. #include "bt_6701_commands.h"
  20. #include "netconf.h"
  21. #include "stm32f4x7_eth.h"
  22. #include "http_server.h"
  23. #include "config_service.h"
  24. #include "FreeRTOS.h"
  25. #include "task.h"
  26. #include "lwip/opt.h"
  27. #include "lwip/api.h"
  28. #include "lwip/sys.h"
  29. #ifdef PRINTF_STDLIB
  30. #include <stdio.h>
  31. #endif
  32. #ifdef PRINTF_CUSTOM
  33. #include "tinystdio.h"
  34. #endif
  35. #define UDP_PORT 49049
  36. TESTING_STATE_t TESTING_STATE = TEST_IDLE;
  37. static TEST_t testState = TEST_WAIT;
  38. bool ifTest_DEF = false;
  39. bool ifTest_SET = false;
  40. bool macWaiting = false;
  41. bool macIsInstalled = false;
  42. bool fUpdatable = false;
  43. bool fDefPressed = false;
  44. bool testEthernet = false;
  45. bool testRtc = false;
  46. bool testSerno = false;
  47. bool testT2Ready = false;
  48. bool testSet = false;
  49. #define MSG_LEN 300
  50. char msg[MSG_LEN];
  51. extern char STM_ID[33];
  52. uint8_t MAC[6];
  53. /**
  54. * @brief
  55. */
  56. void vTestCommands(void *params)
  57. {
  58. for (;;)
  59. {
  60. if (fUpdatable) {
  61. //COM_TestEthernet();
  62. Test_Ethernet();
  63. vTaskDelay(4000);
  64. /* Стартует таск для опроса кнопки DEF */
  65. //xTaskCreate(vBootloaderButton, "DEF_Bootloader", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  66. xTaskCreate(vTaskButtons, "DEF_Waiting", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  67. // xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  68. while (!fDefPressed) {}
  69. //sSettings.bootParams.loadMode = 1;
  70. SetLoadMode();
  71. COM_TestSerno();
  72. COM_SetTestState(T2READY);
  73. vTaskDelay(1000);
  74. NVIC_SystemReset();
  75. while (1) {};
  76. }
  77. switch (testState)
  78. {
  79. case TEST_WAIT :
  80. break;
  81. case TEST_U232F :
  82. Test_U232();
  83. break;
  84. case TEST_DRY :
  85. Test_DRY();
  86. break;
  87. case TEST_DEF :
  88. if (!ifTest_DEF) {
  89. ifTest_DEF = true;
  90. xTaskCreate(vTest_DEF, "DEF_Test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  91. }
  92. break;
  93. case TEST_SET :
  94. if (!ifTest_SET) {
  95. ifTest_SET = true;
  96. xTaskCreate(vTest_SET, "SET_Test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  97. }
  98. break;
  99. case TEST_RTC :
  100. COM_TestRtc();
  101. break;
  102. case TEST_SPIFLASH :
  103. COM_TestSPIflash();
  104. break;
  105. case TEST_ETHERNET :
  106. Test_Ethernet();
  107. break;
  108. case TEST_SERNO :
  109. Test_Serno();
  110. break;
  111. default :
  112. break;
  113. }
  114. vTaskDelay(200);
  115. //TestProcessing();
  116. }
  117. }
  118. /**
  119. * @brief
  120. */
  121. void TEST_SetTest(TEST_t state)
  122. {
  123. // Изменяем стейт только в том случае если контроллер находится в режиме ожидания
  124. if (testState == TEST_WAIT)
  125. testState = state;
  126. // На TEST_WAIT можно изменить всегда
  127. if (state == TEST_WAIT)
  128. testState = state;
  129. }
  130. /**
  131. * @brief Считать статут тестирования (T0, T1, etc)
  132. */
  133. void COM_ReadTestState(void)
  134. {
  135. if (strncmp(SETTINGS_GetTestState(), "T0READY", 5) == 0) {
  136. TESTING_STATE = T0READY;
  137. printf("T0READY\r\n");
  138. }
  139. else if (strncmp(SETTINGS_GetTestState(), "T0OK", 5) == 0)
  140. TESTING_STATE = T0OK;
  141. else if (strncmp(SETTINGS_GetTestState(), "T1OK", 5) == 0) {
  142. TESTING_STATE = T1OK;
  143. // TODO Если осуществлять поддержку старых версий UCN нужно учесть этот флаг
  144. fUpdatable = true;
  145. }
  146. else if (strncmp(SETTINGS_GetTestState(), "T2READY", 8) == 0) {
  147. TESTING_STATE = T2READY;
  148. }
  149. else
  150. TESTING_STATE = TEST_IDLE;
  151. }
  152. /**
  153. * @brief Сохранение Serno и отправка сообщения на сервер
  154. */
  155. void COM_TestSerno(void)
  156. {
  157. struct netconn *conn;
  158. struct netbuf *buf;
  159. char *data;
  160. err_t err;
  161. char str[20] = {0};
  162. uint8_t len;
  163. /* Сохраняем настройки чтобы перезаписать новый Serno */
  164. SETTINGS_Save();
  165. /* Отправляем сообщение на сервер по UDP */
  166. memset(msg, 0, MSG_LEN);
  167. conn = netconn_new( NETCONN_UDP );
  168. if (conn!= NULL)
  169. {
  170. err = netconn_bind(conn, IP_ADDR_ANY, UDP_PORT);
  171. if (err == ERR_OK)
  172. {
  173. netconn_connect(conn, IP_ADDR_BROADCAST, UDP_PORT);
  174. memset(str, 0, 20);
  175. GetModelStr(str, &len);
  176. //strcpy(msg, sSettings.sSnmp.sysName);
  177. strcpy(msg, str);
  178. strcat(msg, ";");
  179. memset(str, 0, 20);
  180. GetSerialNumberStr(str, &len);
  181. //strcat(msg, sSettings.sInfo.serialNumber);
  182. strcat(msg, str);
  183. strcat(msg, ";");
  184. /* empty column (format reqs)*/
  185. strcat(msg, ";");
  186. strcat(msg, VERSION_TEST);
  187. strcat(msg, ";");
  188. /* empty column (format reqs)*/
  189. strcat(msg, ";");
  190. /* empty column (format reqs)*/
  191. strcat(msg, ";");
  192. strcat(msg, STM_ID);
  193. strcat(msg, ";");
  194. /* empty column (format reqs)*/
  195. strcat(msg, ";");
  196. /* empty column (format reqs)*/
  197. strcat(msg, ";");
  198. if (TESTING_STATE == T0OK)
  199. strcat(msg, "T0OK");
  200. else if (TESTING_STATE == T1OK)
  201. strcat(msg, "T1OK");
  202. else if (TESTING_STATE == T0READY)
  203. strcat(msg, "T0READY");
  204. else if (TESTING_STATE == T2READY)
  205. strcat(msg, "T2READY");
  206. strcat(msg, ";");
  207. /* empty column (format reqs)*/
  208. strcat(msg, ";");
  209. buf = netbuf_new();
  210. data = netbuf_alloc(buf, strlen(msg));
  211. memcpy(data, msg, strlen(msg));
  212. netconn_send(conn, buf);
  213. netbuf_delete(buf);
  214. }
  215. else
  216. netconn_delete(conn);
  217. }
  218. }
  219. /**
  220. * @brief Устанавливает mac адрес исходя из unique id
  221. */
  222. void COM_SetMAC(void)
  223. {
  224. uint8_t octet1 = 0;
  225. uint8_t octet2 = 0;
  226. uint8_t octet3 = 0;
  227. for (uint8_t i = 0; i < 4; i++)
  228. {
  229. octet1 ^= STM_ID[i];
  230. octet2 ^= STM_ID[i + 4];
  231. octet3 ^= STM_ID[i + 8];
  232. }
  233. /* Восьмой бит первого октета должен быть равен 0 */
  234. MAC[0] = octet1 & 0xFE;
  235. MAC[1] = octet2;
  236. MAC[2] = octet3;
  237. MAC[3] = 0x00;
  238. MAC[4] = 0x00;
  239. MAC[5] = 0x00;
  240. }
  241. /**
  242. * @brief Установить статут тестирования (T0, T1, etc)
  243. */
  244. void COM_SetTestState(TESTING_STATE_t status)
  245. {
  246. switch (status)
  247. {
  248. case T0READY :
  249. //memset(sSettings.sFlags.testState, 0, 16);
  250. //strncpy(sSettings.sFlags.testState, "T0READY", 7);
  251. memset(SETTINGS_GetTestState(), 0, 16);
  252. strncpy(SETTINGS_GetTestState(), "T0READY", 7);
  253. TESTING_STATE = T0READY;
  254. break;
  255. case T0OK :
  256. //memset(sSettings.sFlags.testState, 0, 16);
  257. //strncpy(sSettings.sFlags.testState, "T0OK", 4);
  258. memset(SETTINGS_GetTestState(), 0, 16);
  259. strncpy(SETTINGS_GetTestState(), "T0OK", 4);
  260. TESTING_STATE = T0OK;
  261. break;
  262. case T1OK :
  263. //memset(sSettings.sFlags.testState, 0, 16);
  264. //strncpy(sSettings.sFlags.testState, "T1OK", 4);
  265. memset(SETTINGS_GetTestState(), 0, 16);
  266. strncpy(SETTINGS_GetTestState(), "T1OK", 4);
  267. TESTING_STATE = T1OK;
  268. break;
  269. case T2READY :
  270. //memset(sSettings.sFlags.testState, 0, 16);
  271. //strncpy(sSettings.sFlags.testState, "T2READY", 7);
  272. memset(SETTINGS_GetTestState(), 0, 16);
  273. strncpy(SETTINGS_GetTestState(), "T2READY", 7);
  274. TESTING_STATE = T2READY;
  275. break;
  276. }
  277. SETTINGS_Save();
  278. }
  279. /********************************* (C) РОТЕК **********************************/