tr_queue_handler.c 7.8 KB

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