tr_queue_handler.c 8.4 KB

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