You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ValidProcess.cpp 8.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "ValidProcess.h"
  2. ValidProcess::ValidProcess(QObject* parent) : IProcess(parent)
  3. {}
  4. ValidProcess::~ValidProcess()
  5. {
  6. if (m_pConstBuffer) {
  7. delete m_pConstBuffer;
  8. m_pConstBuffer = nullptr;
  9. }
  10. m_file.write(m_fileArray);
  11. m_file.flush();
  12. m_file.close();
  13. }
  14. void ValidProcess::init(Frame* frame, map<unsigned int, IProcess*>& mapUIntProcess)
  15. {
  16. m_pFrame = frame;
  17. m_mapUIntProcess = mapUIntProcess;
  18. m_pConstBuffer = new ConstBuffer(DataBufferLength, false, false, m_pFrame->m_uiFrameLen);
  19. createDataPath("Valid");
  20. }
  21. void ValidProcess::run()
  22. {
  23. unsigned char* m_ReadBuffer = new unsigned char[m_pFrame->m_uiFrameLen];
  24. unsigned short usReadLen;
  25. m_uiDataSize = 0;
  26. m_uiIndex = 0;
  27. m_bNeedWork = true;
  28. while (m_bNeedWork) {
  29. usReadLen = m_pConstBuffer->read(m_ReadBuffer, m_pFrame->m_uiFrameLen);
  30. if (usReadLen <= 0) {
  31. QThread::usleep(1);
  32. continue;
  33. }
  34. m_byteArray.append((char*)m_ReadBuffer, (int)m_pFrame->m_uiFrameLen);
  35. m_uiDataSize = m_byteArray.size();
  36. m_uiIndex = 0;
  37. // 副帧类型
  38. if (m_pFrame->m_usSubFrameType == 1) { // 无副帧
  39. while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) {
  40. if (m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex]
  41. && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + 1]) {
  42. if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前
  43. m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen,
  44. m_pFrame->m_uiFrameLen);
  45. frameExtract();
  46. m_uiIndex += m_pFrame->m_uiFrameLen;
  47. } else if (m_pFrame->m_usHeadAddr == 2) { // 帧头在每行最后
  48. if (m_pFrame->m_usBeforeHeadLen <= m_uiIndex) { // 说明第一个子帧满足
  49. m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen,
  50. m_pFrame->m_uiFrameLen);
  51. frameExtract();
  52. m_uiIndex -= m_pFrame->m_usBeforeHeadLen;
  53. m_uiIndex += m_pFrame->m_uiFrameLen;
  54. } else {
  55. ++m_uiIndex;
  56. }
  57. }
  58. } else {
  59. ++m_uiIndex;
  60. }
  61. }
  62. m_byteArray.remove(0, m_uiIndex);
  63. m_uiDataSize = 0;
  64. m_uiIndex = 0;
  65. } else if (m_pFrame->m_usSubFrameType == 2) { // 反码副帧
  66. while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) {
  67. if (m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex]
  68. && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + 1]
  69. && m_pFrame->m_subHeadArray[0]
  70. == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn]
  71. && m_pFrame->m_subHeadArray[1]
  72. == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn
  73. + 1]) {
  74. if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前
  75. m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen,
  76. m_pFrame->m_uiFrameLen);
  77. frameExtract();
  78. m_uiIndex += m_pFrame->m_uiFrameLen;
  79. } else if (m_pFrame->m_usHeadAddr == 2) { // 帧头在每行最后
  80. if (m_pFrame->m_usBeforeHeadLen <= m_uiIndex) { // 说明第一个子帧满足
  81. m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen,
  82. m_pFrame->m_uiFrameLen);
  83. frameExtract();
  84. m_uiIndex -= m_pFrame->m_usBeforeHeadLen;
  85. m_uiIndex += m_pFrame->m_uiFrameLen;
  86. } else {
  87. ++m_uiIndex;
  88. }
  89. }
  90. } else {
  91. ++m_uiIndex;
  92. }
  93. }
  94. m_byteArray.remove(0, m_uiIndex);
  95. m_uiDataSize = 0;
  96. m_uiIndex = 0;
  97. } else if (m_pFrame->m_usSubFrameType == 3) { // ID副帧
  98. while (m_uiIndex + m_pFrame->m_uiFrameLen <= m_uiDataSize) {
  99. if (m_pFrame->m_headArray[0] == m_byteArray[m_uiIndex]
  100. && m_pFrame->m_headArray[1] == m_byteArray[m_uiIndex + 1]
  101. && m_pFrame->m_headArray[0]
  102. == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn]
  103. && m_pFrame->m_headArray[1]
  104. == m_byteArray[m_uiIndex + m_pFrame->m_uiFrameLen - m_pFrame->m_uiColumn
  105. + 1]) {
  106. QByteArray startId = QByteArray::number(m_pFrame->m_usIdStart, 16); // 第一个Id号
  107. QByteArray endId = QByteArray::number(m_pFrame->m_usIdEnd, 16); // 最后一个Id号
  108. if (m_pFrame->m_usHeadAddr == 1) { // 帧头在每行最前
  109. if (startId[0] == m_byteArray[m_uiIndex + m_pFrame->m_usIdAddr]
  110. && endId[0]
  111. == m_byteArray[m_uiIndex + m_pFrame->m_usIdAddr
  112. + m_pFrame->m_uiFrameLen
  113. - m_pFrame->m_uiColumn]) {
  114. m_validArray = m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen,
  115. m_pFrame->m_uiFrameLen);
  116. frameExtract();
  117. m_uiIndex += m_pFrame->m_uiFrameLen;
  118. }
  119. } else if (m_pFrame->m_usHeadAddr == 2) {
  120. if (m_pFrame->m_usBeforeHeadLen <= m_uiIndex) { // 说明第一个子帧满足
  121. if (startId[0]
  122. == m_byteArray[m_uiIndex - m_pFrame->m_usBeforeHeadLen
  123. + m_pFrame->m_usIdAddr]
  124. && endId[0]
  125. == m_byteArray[m_uiIndex - m_pFrame->m_usBeforeHeadLen
  126. + m_pFrame->m_usIdAddr
  127. + m_pFrame->m_uiFrameLen
  128. - m_pFrame->m_uiColumn]) {
  129. m_validArray =
  130. m_byteArray.mid(m_uiIndex - m_pFrame->m_usBeforeHeadLen,
  131. m_pFrame->m_uiFrameLen);
  132. frameExtract();
  133. m_uiIndex -= m_pFrame->m_usBeforeHeadLen;
  134. m_uiIndex += m_pFrame->m_uiFrameLen;
  135. } else {
  136. ++m_uiIndex;
  137. }
  138. }
  139. }
  140. } else {
  141. ++m_uiIndex;
  142. }
  143. }
  144. m_byteArray.remove(0, m_uiIndex);
  145. m_uiDataSize = 0;
  146. m_uiIndex = 0;
  147. }
  148. }
  149. m_uiDataSize = 0;
  150. m_uiIndex = 0;
  151. m_byteArray.clear();
  152. m_validArray.clear();
  153. }
  154. void ValidProcess::frameExtract()
  155. {
  156. for (auto process : m_mapUIntProcess) {
  157. if (process.second) {
  158. if (process.second->getProcessModel() == 3) { // 图像
  159. VideoProcess* pVideoProcess = (VideoProcess*)process.second;
  160. if (pVideoProcess->getVideoPlayStatus() == false) {
  161. continue;
  162. }
  163. }
  164. process.second->getConstBuffer()->write((unsigned char*)m_validArray.data(),
  165. (unsigned short)m_validArray.size());
  166. }
  167. }
  168. m_fileArray.append(m_validArray);
  169. m_validArray.clear();
  170. if (DataAchiveBuffer <= m_fileArray.size()) {
  171. m_file.write(m_fileArray);
  172. m_file.flush();
  173. m_fileArray.clear();
  174. }
  175. }