tr_queue_handler.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /*
  2. * tr_queue_handler.c
  3. *
  4. * Created on: 2025年8月22日
  5. * Author: 龙三郎
  6. */
  7. #include "tr_queue.h"
  8. #include <stdio.h>
  9. #include "device/console.h"
  10. #include "device/lwip.h"
  11. #include "algorithm/emg_util.h"
  12. #include "uartStdio.h"
  13. #include "usbhspecific.h"
  14. #include <stdlib.h>
  15. #include "tr_protocol.h"
  16. extern struct udp_pcb *upcb;
  17. void handleSign(unsigned char *s, unsigned short sl);
  18. void handleSign2(unsigned char *s, unsigned short sl);
  19. void handleGUI(unsigned char *s, unsigned short sl);
  20. /**
  21. * 数据转发业务处理,需要进行转发的数据在这个里面处理
  22. * params da 目的地址
  23. */
  24. void dataForwardedHandle(unsigned char *s, unsigned short sl, unsigned char da)
  25. {
  26. // printf("进入到数据转发!\r\n");
  27. if (da == F4_ADDRESS)
  28. {
  29. // 执行发送到F4的逻辑
  30. USBHSPECIFICWrite(s, sl);
  31. }
  32. else if (da == GUI_ADDRESS)
  33. {
  34. // 执行发送到GUI的逻辑
  35. lwip_udp_send_gui(s, sl);
  36. }
  37. else if (da == UART_ADDRESS)
  38. {
  39. // 执行发送到串口的逻辑
  40. UARTwrite((const char*) s, sl);
  41. }
  42. }
  43. /**
  44. * 不需要转发的数据。即其他模块发送给本模块的数据。
  45. * params sa 数据源地址
  46. * params type 数据类型
  47. */
  48. void dataNotForwardedHandle(unsigned char *s, unsigned short sl,
  49. unsigned char sa, unsigned char type)
  50. {
  51. // printf("进入到数据处理!\r\n");
  52. if (sa == F4_ADDRESS)
  53. {
  54. // 处理从F4发来的数据
  55. handleSign(s + 8, sl - 8);
  56. }
  57. else if (sa == GUI_ADDRESS)
  58. {
  59. // 处理从gui发来的数据
  60. handleGUI(s,sl);
  61. }
  62. else if (sa == UART_ADDRESS)
  63. {
  64. // 处理从uart发来的数据
  65. // ConsolePrintf("got it!!!\n");
  66. }
  67. // if(type == TYPE_DEFAULT)
  68. // {
  69. // // 执行自定义数据的逻辑
  70. // }
  71. // else if(type == TYPE_WAVEFORM)
  72. // {
  73. // // 执行波形数据的逻辑
  74. // }
  75. // else if(type == TYPE_COMMAND)
  76. // {
  77. // // 执行指令数据的逻辑
  78. // }
  79. }
  80. /**
  81. * 处理采集信号
  82. */
  83. #define COUNT_SIZE 75
  84. #define CHANNEL_COUNT 4 //采集通道总数
  85. void handleSign(unsigned char *s, unsigned short sl)
  86. {
  87. ConsolePuts("handle signal data from usb\n", -1);
  88. struct Frame
  89. {
  90. unsigned char sign;
  91. unsigned char d1[3];
  92. unsigned char d2[3];
  93. unsigned char d3[3];
  94. unsigned char d4[3];
  95. };
  96. short FRAME_LEN = sizeof(struct Frame);
  97. if (sl % FRAME_LEN > 0)
  98. {
  99. ConsolePuts("长度不匹配\n", -1);
  100. return;
  101. }
  102. int dataCount = sl / FRAME_LEN; //每个通道数据量, 每三个字节代表一个采集信号. 大端模式.
  103. float *const cd1 = malloc(sizeof(float) * dataCount);
  104. float *const cd2 = malloc(sizeof(float) * dataCount);
  105. float *const cd3 = malloc(sizeof(float) * dataCount);
  106. float *const cd4 = malloc(sizeof(float) * dataCount);
  107. static float fd1[COUNT_SIZE] = { 0.0 };
  108. static float fd2[COUNT_SIZE] = { 0.0 };
  109. static float fd3[COUNT_SIZE] = { 0.0 };
  110. static float fd4[COUNT_SIZE] = { 0.0 };
  111. static float fdgui[COUNT_SIZE * 4] = { 0.0 };
  112. const int FULL = 0x007fffff;
  113. const float FFULL = (float) FULL;
  114. int i = 0;
  115. static int scount = 0;
  116. for (i = 0; i < dataCount; i++)
  117. {
  118. struct Frame *fm = (struct Frame*) (s + FRAME_LEN * i);
  119. int origenData1 = fm->d1[0] << 24 | fm->d1[1] << 16 | fm->d1[2] << 8;
  120. *(cd1 + i) = ((float) (origenData1 >> 8) / FFULL) * 5000; //将采集数据转成mV
  121. int origenData2 = fm->d2[0] << 24 | fm->d2[1] << 16 | fm->d2[2] << 8;
  122. *(cd2 + i) = ((float) (origenData2 >> 8) / FFULL) * 5000; //将采集数据转成mV
  123. int origenData3 = fm->d3[0] << 24 | fm->d3[1] << 16 | fm->d3[2] << 8;
  124. *(cd3 + i) = ((float) (origenData3 >> 8) / FFULL) * 5000; //将采集数据转成mV
  125. int origenData4 = fm->d4[0] << 24 | fm->d4[1] << 16 | fm->d4[2] << 8;
  126. *(cd4 + i) = ((float) (origenData4 >> 8) / FFULL) * 5000; //将采集数据转成mV
  127. fd1[scount] = *(cd1 + i);
  128. fd2[scount] = *(cd2 + i);
  129. fd3[scount] = *(cd3 + i);
  130. fd4[scount] = *(cd4 + i);
  131. scount++;
  132. if (scount == COUNT_SIZE)
  133. {
  134. scount = 0;
  135. if (fm->sign & 0x01)
  136. {
  137. emg_denoised(cd1, COUNT_SIZE, 1000, fd1);
  138. }
  139. if (fm->sign & 0x02)
  140. {
  141. emg_denoised(cd2, COUNT_SIZE, 1000, fd2);
  142. }
  143. if (fm->sign & 0x04)
  144. {
  145. emg_denoised(cd3, COUNT_SIZE, 1000, fd3);
  146. }
  147. if (fm->sign & 0x08)
  148. {
  149. emg_denoised(cd4, COUNT_SIZE, 1000, fd4);
  150. }
  151. int m = 0;
  152. for(m = 0; m<COUNT_SIZE; m++)
  153. {
  154. fdgui[m*CHANNEL_COUNT] = fd1[m];
  155. fdgui[m*CHANNEL_COUNT+1] = fd2[m];
  156. fdgui[m*CHANNEL_COUNT+2] = fd3[m];
  157. fdgui[m*CHANNEL_COUNT+3] = fd4[m];
  158. }
  159. lwip_udp_send_gui_signal(fdgui, COUNT_SIZE*CHANNEL_COUNT, fm->sign);
  160. }
  161. }
  162. free(cd1);
  163. free(cd2);
  164. free(cd3);
  165. free(cd4);
  166. }
  167. void handleSign2(unsigned char *s, unsigned short sl)
  168. {
  169. ConsolePuts("===handle signal 2 data from usb\n", -1);
  170. struct Frame
  171. {
  172. unsigned char sign;
  173. unsigned char d1[3];
  174. unsigned char d2[3];
  175. unsigned char d3[3];
  176. unsigned char d4[3];
  177. };
  178. short FRAME_LEN = sizeof(struct Frame);
  179. if (sl % FRAME_LEN > 0)
  180. {
  181. ConsolePuts("长度不匹配\n", -1);
  182. return;
  183. }
  184. int dataCount = sl / FRAME_LEN; //每个通道数据量, 每三个字节代表一个采集信号. 大端模式.
  185. float *const cd1 = malloc(sizeof(float) * dataCount);
  186. float *const cd2 = malloc(sizeof(float) * dataCount);
  187. float *const cd3 = malloc(sizeof(float) * dataCount);
  188. float *const cd4 = malloc(sizeof(float) * dataCount);
  189. static float fd1[COUNT_SIZE] = { 0.0 };
  190. static float fd2[COUNT_SIZE] = { 0.0 };
  191. static float fd3[COUNT_SIZE] = { 0.0 };
  192. static float fd4[COUNT_SIZE] = { 0.0 };
  193. const int FULL = 0x007fffff;
  194. const float FFULL = (float) FULL;
  195. int i = 0;
  196. static int scount = 0;
  197. for (i = 0; i < dataCount; i++)
  198. {
  199. struct Frame *fm = (struct Frame*) (s + FRAME_LEN * i);
  200. int origenData1 = fm->d1[0] << 24 | fm->d1[1] << 16 | fm->d1[2] << 8;
  201. *(cd1 + i) = ((float) (origenData1 >> 8) / FFULL) * 5000; //将采集数据转成mV
  202. int origenData2 = fm->d2[0] << 24 | fm->d2[1] << 16 | fm->d2[2] << 8;
  203. *(cd2 + i) = ((float) (origenData2 >> 8) / FFULL) * 5000; //将采集数据转成mV
  204. int origenData3 = fm->d3[0] << 24 | fm->d3[1] << 16 | fm->d3[2] << 8;
  205. *(cd3 + i) = ((float) (origenData3 >> 8) / FFULL) * 5000; //将采集数据转成mV
  206. int origenData4 = fm->d4[0] << 24 | fm->d4[1] << 16 | fm->d4[2] << 8;
  207. *(cd4 + i) = ((float) (origenData4 >> 8) / FFULL) * 5000; //将采集数据转成mV
  208. fd1[scount] = *(cd1 + i);
  209. fd2[scount] = *(cd2 + i);
  210. fd3[scount] = *(cd3 + i);
  211. fd4[scount] = *(cd4 + i);
  212. scount++;
  213. if (scount == COUNT_SIZE)
  214. {
  215. scount = 0;
  216. if (fm->sign & 0x01)
  217. {
  218. emg_denoised(cd1, COUNT_SIZE, 1000, fd1);
  219. }
  220. if (fm->sign & 0x02)
  221. {
  222. emg_denoised(cd2, COUNT_SIZE, 1000, fd2);
  223. }
  224. if (fm->sign & 0x04)
  225. {
  226. emg_denoised(cd3, COUNT_SIZE, 1000, fd3);
  227. }
  228. if (fm->sign & 0x08)
  229. {
  230. emg_denoised(cd4, COUNT_SIZE, 1000, fd4);
  231. }
  232. const int STEP = 100;
  233. int pos = 0;
  234. int left = 0;
  235. do
  236. {
  237. int left = COUNT_SIZE - pos;
  238. if (left <= STEP)
  239. {
  240. lwip_udp_send_vofa4(cd1 + pos, cd2 + pos, cd3 + pos,
  241. cd4 + pos, left);
  242. }
  243. else
  244. {
  245. lwip_udp_send_vofa4(cd1 + pos, cd2 + pos, cd3 + pos,
  246. cd4 + pos, STEP);
  247. pos += STEP;
  248. }
  249. }
  250. while (left > STEP);
  251. }
  252. }
  253. free(cd1);
  254. free(cd2);
  255. free(cd3);
  256. free(cd4);
  257. }
  258. void handleGUI(unsigned char *s, unsigned short sl)
  259. {
  260. ConsolePuts("\n===handleGUI from gui\n", -1);
  261. ConsolePutsHexStr(s, sl);
  262. unsigned char check = 0;
  263. int a = ProtocolGetOption(s,sl,99,&check);
  264. if(a)
  265. {
  266. unsigned char udpAdd[8] = {0};
  267. trProtocol verPro;
  268. ProtocolInit(&verPro);
  269. ProtocolSetDestAddress(&verPro,3);
  270. ProtocolSetSourceAddress(&verPro,1);
  271. ProtocolSetType(&verPro,2);
  272. //ProtocolSetOption(&verPro,98,sizeof(udpAdd),udpAdd);
  273. ProtocolSetOptionChar(&verPro, 100, 1);
  274. ProtocolPackage(&verPro);
  275. ConsolePuts("\n===handleGUI to gui version\n", -1);
  276. ConsolePutsHexStr(verPro.message, verPro.length);
  277. lwip_tcp_send_gui(verPro.message,verPro.length);
  278. }
  279. }