RS232Decode.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. // // ******************************************************************
  2. // // /\ /| @File RS232Decode.cpp
  3. // // \ V/ @Brief
  4. // // | "") @Author lijinwen, ghz005@uni-trend.com.cn
  5. // // / | @Creation 2024-05-16
  6. // // / \\ @Modified 2024-05-16
  7. // // *(__\_\
  8. // // ******************************************************************
  9. #include "RS232Decode.h"
  10. #include "../BaseEnums/DataCheckEnums.h"
  11. #include "../BaseHelper/DataCheckHelper.h"
  12. #include "../BaseHelper/Logger.h"
  13. namespace Protocol
  14. {
  15. std::vector<RS232DecodeResultCell> decodeResultUnits;
  16. std::vector<RS232DecodeEventUnit> decodeEventUnitsStorage;
  17. std::vector<RS232DecodeEvent> decodeEvents;
  18. int32_t getStartIndex(const ProtocolRS232Options& options, TwoLevelEdgePulse*& node,
  19. double count,
  20. double& realCount,
  21. const int32_t startIndex,
  22. TwoLevelEdgePulseStatusType& startStatus)
  23. {
  24. startStatus = options.Polarity == Polarity::Pos
  25. ? TwoLevelEdgePulseStatusType::High
  26. : TwoLevelEdgePulseStatusType::Low;
  27. while (node != nullptr)
  28. {
  29. if (node->CurrentLevel != startStatus && node->StartIndex >= startIndex)
  30. {
  31. //计算该脉宽中,最大包括几个bit信息宽度
  32. const double bitCount = std::round(node->GetLength() / count);
  33. if (bitCount > 0 && bitCount < static_cast<int32_t>(options.DataBitWidth) + 4)
  34. {
  35. realCount = node->GetLength() / bitCount;
  36. }
  37. if (bitCount > 0) break;
  38. }
  39. node++;
  40. }
  41. return node == nullptr ? -1 : node->StartIndex;
  42. }
  43. bool pauseDataRS232(const ProtocolRS232Options& options, TwoLevelEdgePulse* edgePulses,
  44. const uint64_t edgePulseCount,
  45. const uint64_t waveformDataCount, const double sampleRate,
  46. RS232DecodeResult& decodeResult)
  47. {
  48. canceled = false;
  49. WriteLog(LogLevel::LevelDebug, " SignalType:%d, DataBitWidth:%d"
  50. , static_cast<int>(options.SignalType), static_cast<int>(options.DataBitWidth));
  51. if (canceled)
  52. {
  53. WriteLog(LogLevel::Level2, " ParsingData canceled.\n");
  54. return false;
  55. }
  56. //栈上 初始化内存
  57. std::vector<RS232Packet> rs232Packets;
  58. rs232Packets = {};
  59. decodeEvents = {};
  60. decodeResultUnits = {};
  61. auto decodeResultUnitsPtr = &decodeResultUnits;
  62. auto decodeEventsPtr = &decodeEvents;
  63. WriteLog(LogLevel::LevelDebug, " decodeResultUnitsPtr:0x%X\n", static_cast<void*>(decodeResultUnitsPtr));
  64. WriteLog(LogLevel::LevelDebug, " decodeEventsPtr:0x%X\n", static_cast<void*>(decodeEventsPtr));
  65. canceled = false;
  66. if (canceled)
  67. {
  68. WriteLog(LogLevel::Level2, " ParsingData canceled.\n");
  69. return false;
  70. }
  71. if (edgePulses == nullptr)
  72. {
  73. WriteLog(LogLevel::Level2, " EdgePulseDataPtr is nullptr\n");
  74. return false;
  75. }
  76. //if (edgePulseData.edgePulses.empty())
  77. if (waveformDataCount == 0)
  78. {
  79. std::cout << " DataCount is 0 or sampleRate error\n";
  80. WriteLog(LogLevel::Level2, " DataCount is 0 or sampleRate error\n");
  81. return false;
  82. }
  83. int32_t dataBitCount = 0;
  84. switch (options.DataBitWidth)
  85. {
  86. case RS232Enums::DataBitWidth::DataBitWidth_5Bit:
  87. dataBitCount = 5;
  88. break;
  89. case RS232Enums::DataBitWidth::DataBitWidth_6Bit:
  90. dataBitCount = 6;
  91. break;
  92. case RS232Enums::DataBitWidth::DataBitWidth_7Bit:
  93. dataBitCount = 7;
  94. break;
  95. case RS232Enums::DataBitWidth::DataBitWidth_8Bit:
  96. dataBitCount = 8;
  97. break;
  98. }
  99. uint64_t edgePulseIndex = 0;
  100. //每bit理论长度
  101. const double count = 1.0 / options.BaudRate * sampleRate;
  102. WriteLog(LogLevel::LevelDebug, " bit count:%f", count);
  103. //const double count = static_cast<double>(dataCount);
  104. //每bit实际长度
  105. double realCount = count;
  106. const int32_t stopBitCount = options.StopBit == RS232Enums::StopBit::StopBit_1bit
  107. ? 1
  108. : options.StopBit == RS232Enums::StopBit::StopBit_2bit
  109. ? 2
  110. : 1;
  111. WriteLog(LogLevel::LevelDebug, " realCount:%f", realCount);
  112. WriteLog(LogLevel::LevelDebug, " edgePulsePointer:0x%x", reinterpret_cast<void*>(edgePulses));
  113. //WriteLog(" edgePulsePointer:0x%x", edgePulses);
  114. WriteLog(LogLevel::LevelDebug, " edgePulse StartIndex:%d", edgePulses->StartIndex);
  115. WriteLog(LogLevel::LevelDebug, " edgePulse EndIndex:%d", edgePulses->EndIndex);
  116. WriteLog(LogLevel::LevelDebug, " edgePulseCount:%d", edgePulseCount);
  117. try
  118. {
  119. int32_t startIndex = 0;
  120. while (edgePulses != nullptr && edgePulseIndex < edgePulseCount)
  121. {
  122. if (count <= 2) break;
  123. TwoLevelEdgePulseStatusType levelState;
  124. //找到帧头 根据帧头得到实际bit宽度realCount 帧头起始位置startIndex 电平状态levelState
  125. int32_t packetStartIndex =
  126. getStartIndex(options, edgePulses, count, realCount, startIndex, levelState);
  127. //WriteLog(" GetStartIndex PacketStartIndex:%d\n", packetStartIndex);
  128. if (canceled)
  129. {
  130. WriteLog(LogLevel::Level2, " ParsingData canceled.\n");
  131. return false;
  132. }
  133. if (packetStartIndex == -1) break;
  134. //std::cout << " packetStartIndex:" << packetStartIndex << " ,realCount:" << realCount << "\n";
  135. //构造帧
  136. RS232Packet packet = {};
  137. packetStartIndex += static_cast<int32_t>(std::round(realCount / 2));
  138. if (edgePulses->StartIndex >= edgePulses->EndIndex || !CommonHelper::EnumIsDefined<
  139. TwoLevelEdgePulseStatusType>(static_cast<int>(edgePulses->CurrentLevel)))
  140. {
  141. std::ostringstream msg;
  142. msg << " =>178 loop break Index:" << packetStartIndex << " ,dataCount:" <<
  143. waveformDataCount << "\n";
  144. WriteLog(LogLevel::LevelDebug, msg.str().c_str());
  145. break;
  146. }
  147. if (packetStartIndex >= static_cast<int32_t>(waveformDataCount))
  148. {
  149. std::ostringstream msg;
  150. msg << " =>186 loop break Index:" << packetStartIndex << " ,dataCount:" <<
  151. waveformDataCount << "\n";
  152. WriteLog(LogLevel::LevelDebug, msg.str().c_str());
  153. break;
  154. }
  155. if (startIndex == static_cast<int32_t>(waveformDataCount)) break;
  156. packet.StartBit = levelState == TwoLevelEdgePulseStatusType::High;
  157. packet.StartIndex = packetStartIndex - static_cast<int32_t>(std::round(realCount / 2));
  158. packet.DataIndex = packetStartIndex + static_cast<int32_t>(std::round(realCount / 2));
  159. packet.PerBitLenght = realCount;
  160. WriteLog(LogLevel::LevelDebug, "=> Tst StartIndex:%d,dataBitCount:%d", packet.StartIndex, dataBitCount);
  161. for (int32_t dataBitIndex = 0; dataBitIndex < dataBitCount; dataBitIndex++)
  162. {
  163. if (canceled)
  164. {
  165. WriteLog(LogLevel::Level2, " ParsingData canceled.\n");
  166. return false;
  167. }
  168. packetStartIndex += static_cast<int32_t>(std::round(realCount));
  169. //std::cout << " P150 Test" << "\n";
  170. if (packetStartIndex >= static_cast<int32_t>(waveformDataCount))
  171. {
  172. startIndex = static_cast<int32_t>(waveformDataCount);
  173. WriteLog(LogLevel::LevelDebug, " =>%d break \n", __LINE__);
  174. break;
  175. }
  176. //std::cout << " P157 Test" << "\n";
  177. TwoLevelEdgePulseStatusType bitStatus;
  178. if (!getRS232Bit(edgePulses, packetStartIndex, bitStatus))
  179. {
  180. //gMutex.unlock(); // 执行完操作后手动释放锁
  181. return false;
  182. }
  183. //按位构造数据
  184. if (options.MSBOrLSB == MSBOrLSB::MSB)
  185. {
  186. packet.Data = static_cast<uint8_t>(packet.Data << 1);
  187. packet.Data |= bitStatus == TwoLevelEdgePulseStatusType::High ? 1 : 0;
  188. }
  189. else
  190. {
  191. packet.Data |= static_cast<uint8_t>((bitStatus ==
  192. TwoLevelEdgePulseStatusType::High
  193. ? 1
  194. : 0) << dataBitIndex);
  195. }
  196. WriteLog(LogLevel::LevelDebug, "Tst CurrentLevel:%d, bitStatus:%d", edgePulses->CurrentLevel, bitStatus);
  197. }
  198. //std::cout << " P177 Test" << "\n";
  199. if (startIndex == static_cast<int32_t>(waveformDataCount)) break;
  200. //校验位
  201. if (options.OddEvenCheckType != OddEvenCheck::None)
  202. {
  203. packetStartIndex += static_cast<int32_t>(std::round(realCount));
  204. if (packetStartIndex >= static_cast<int32_t>(waveformDataCount))
  205. {
  206. //startIndex = static_cast<int32_t>(bufferLength);
  207. rs232Packets.push_back(packet);
  208. WriteLog(LogLevel::LevelDebug, " =>%d break \n", __LINE__);
  209. break;
  210. }
  211. TwoLevelEdgePulseStatusType bitStatus;
  212. if (!getRS232Bit(edgePulses, packetStartIndex, bitStatus))
  213. {
  214. //gMutex.unlock(); // 执行完操作后手动释放锁
  215. return false;
  216. }
  217. packet.ParityFind = true;
  218. packet.ParityBit = bitStatus == TwoLevelEdgePulseStatusType::High;
  219. packet.ParityResult = DataCheckHelper::CheckDataByOddEven(
  220. packet.Data, dataBitCount, options.OddEvenCheckType);
  221. packet.ParityIndex = packet.DataIndex + static_cast<int32_t>(
  222. std::round(realCount * dataBitCount));
  223. }
  224. //std::cout << " P203 Test" << "\n";
  225. rs232Packets.push_back(packet);
  226. packetStartIndex += static_cast<int32_t>(realCount * stopBitCount);
  227. startIndex = packetStartIndex;
  228. edgePulseIndex++;
  229. }
  230. }
  231. catch (const char* ex)
  232. {
  233. WriteLog(LogLevel::LevelDebug, " ParsingData L%d catch :%s", __LINE__, ex);
  234. return false;
  235. }
  236. {
  237. std::ostringstream msg;
  238. msg << " edgePulseIndex:" << edgePulseIndex << ",";
  239. msg << " rs232Packets count:" << rs232Packets.size() << ",";
  240. msg << " get events && results";
  241. WriteLog(LogLevel::Level2, msg.str().c_str());
  242. }
  243. //get events && results
  244. //std::cout << " P218 Test rs232Packets Count:" << rs232Packets.size() << "\n";
  245. if (!rs232Packets.empty())
  246. {
  247. decodeEventUnitsStorage = {};
  248. //for (int64_t i = 0; i < static_cast<int64_t>(rs232Packets.size()); i++)
  249. for (auto packet : rs232Packets)
  250. {
  251. if (canceled)
  252. {
  253. WriteLog(LogLevel::Level2, " ParsingData canceled.\n");
  254. //gMutex.unlock(); // 执行完操作后手动释放锁
  255. return false;
  256. }
  257. RS232DecodeResultCell resultUnit;
  258. RS232DecodeEvent decodeEvent = {};
  259. auto eventPtr = &decodeEvent;
  260. RS232DecodeEventUnit eventStart;
  261. RS232DecodeEventUnit eventData;
  262. int64_t eventStartIndex = packet.StartIndex;
  263. int64_t oneBitLength = static_cast<int64_t>(packet.PerBitLenght);
  264. eventPtr->StartIndex = packet.StartIndex;
  265. eventStart.StartIndex = packet.StartIndex;
  266. eventStart.Length = oneBitLength;
  267. eventStartIndex += 1;
  268. eventStart.EventType = RS232Enums::RS232DecodeEventType::Start;
  269. eventData.StartIndex = eventStart.StartIndex;
  270. eventData.Length = oneBitLength * dataBitCount;
  271. eventData.Data = packet.Data;
  272. eventData.EventType = RS232Enums::RS232DecodeEventType::Data;
  273. eventStartIndex += 8;
  274. //std::cout << " P249 Test I:" << i << "\n";
  275. if (packet.ParityFind)
  276. {
  277. RS232DecodeEventUnit eventUints[3];
  278. eventUints[0] = eventStart;
  279. eventUints[1] = eventData;
  280. RS232DecodeEventUnit eventParity;
  281. //std::cout << " P253 Test I:" << i << "\n";
  282. eventParity.Data = packet.ParityResult ? 1 : 0;
  283. eventParity.StartIndex = eventStartIndex;
  284. eventParity.Length = oneBitLength;
  285. eventParity.EventType = RS232Enums::RS232DecodeEventType::Parity;
  286. eventPtr->ParityResult = packet.ParityResult ? 1 : 0;
  287. eventUints[2] = eventParity;
  288. //eventPtr->EventData = eventUints;
  289. eventStartIndex += 8;
  290. eventPtr->EventDataCount = 3;
  291. eventPtr->EndIndex = packet.StartIndex + oneBitLength * (dataBitCount + 1);
  292. // 将eventUints复制到decodeEventUnitsStorage中
  293. decodeEventUnitsStorage.insert(decodeEventUnitsStorage.end(), std::begin(eventUints),
  294. std::end(eventUints));
  295. //最后来赋值
  296. //decodeEvent.EventData = decodeEventUnitsStorage.data() + decodeEventUnitsStorage.size() - 3;
  297. }
  298. else
  299. {
  300. RS232DecodeEventUnit eventUints[2];
  301. eventUints[0] = eventStart;
  302. eventUints[1] = eventData;
  303. eventPtr->EventDataCount = 2;
  304. //eventPtr->EventData = eventUints;
  305. //std::cout << " P263 Test I:" << i << "\n";
  306. eventPtr->ParityResult = 0;
  307. eventPtr->EndIndex = packet.StartIndex + oneBitLength * (dataBitCount);
  308. // 将eventUints复制到decodeEventUnitsStorage中
  309. decodeEventUnitsStorage.insert(decodeEventUnitsStorage.end(), std::begin(eventUints),
  310. std::end(eventUints));
  311. //最后来赋值
  312. //decodeEvent.EventData = decodeEventUnitsStorage.data() + decodeEventUnitsStorage.size() - 2;
  313. }
  314. //std::cout << " P266 Test I:" << i << "\n";
  315. resultUnit.StartIndex = packet.StartIndex;
  316. //最后来赋值
  317. //resultUnit.Data = &packet.Data;
  318. WriteLog(LogLevel::LevelDebug, " Tst Data Ptr:0x%x , Data:%d", static_cast<void*>(resultUnit.Data),
  319. packet.Data);
  320. resultUnit.DataCount = 1;
  321. resultUnit.Length = eventStartIndex - packet.StartIndex;
  322. eventPtr->EventIndex = static_cast<int64_t>(decodeEventsPtr->size());
  323. decodeEvents.push_back(decodeEvent);
  324. decodeResultUnits.push_back(resultUnit);
  325. decodeResult.DecodeEventNeedUpdate = true;
  326. decodeResult.DecodeResultNeedUpdate = true;
  327. }
  328. }
  329. /////////////////////////// 指针赋值 /////////////////////////////////
  330. int64_t eventDataIndex = 0;
  331. for (int i = 0; i < decodeEvents.size(); i++) // NOLINT(modernize-loop-convert, clang-diagnostic-sign-compare)
  332. {
  333. decodeEvents[i].EventData = decodeEventUnitsStorage.data() + eventDataIndex;
  334. eventDataIndex += decodeEvents[i].EventDataCount;
  335. }
  336. for (int i = 0; i < decodeResultUnits.size(); i++) // NOLINT(clang-diagnostic-sign-compare)
  337. {
  338. int64_t startIndex = decodeResultUnits[i].StartIndex;
  339. for (int x = 0; i < rs232Packets.size(); x++) // NOLINT(clang-diagnostic-sign-compare)
  340. {
  341. if (rs232Packets[x].StartIndex == startIndex)
  342. {
  343. decodeResultUnits[i].Data = &(rs232Packets[x].Data);
  344. break;
  345. }
  346. }
  347. }
  348. decodeResult.DecodeEventsPtr = decodeEventsPtr->data();
  349. decodeResult.DecodeResultUnitsPtr = decodeResultUnitsPtr->data();
  350. decodeResult.DecodeEventCount = decodeEventsPtr->size();
  351. decodeResult.DecodeResultCount = decodeResultUnitsPtr->size();
  352. WriteLog(LogLevel::Level1, " Cpp ParsingData Done,return True \n\n");
  353. return true;
  354. }
  355. std::vector<const char*> getEventInfoTitles()
  356. {
  357. return eventInfoTitles;
  358. }
  359. bool getRS232Bit(TwoLevelEdgePulse*& edgePulse,
  360. int32_t targetIndex, TwoLevelEdgePulseStatusType& status)
  361. {
  362. status = TwoLevelEdgePulseStatusType::None;
  363. if (edgePulse == nullptr)
  364. {
  365. return false;
  366. }
  367. if (targetIndex <= 0 || edgePulse->StartIndex > targetIndex)
  368. {
  369. return false;
  370. }
  371. while (edgePulse != nullptr)
  372. {
  373. if (edgePulse->StartIndex <= targetIndex && edgePulse->EndIndex > targetIndex)
  374. {
  375. status = edgePulse->CurrentLevel;
  376. //test
  377. WriteLog(LogLevel::Level2, "StartIndex:%d , status:%d", edgePulse->StartIndex, status);
  378. return true;
  379. }
  380. edgePulse++;
  381. }
  382. return false;
  383. }
  384. bool quantizeParamsDecodeRS232(const QuantizeParams& quantizeParams, const ProtocolRS232Options& options,
  385. RS232DecodeResult& decodeResult)
  386. {
  387. canceled = false;
  388. //todo
  389. return false;
  390. }
  391. bool Parse_RS232(const ProtocolRS232Options& options,
  392. const EdgePulseDataTwoLevels& edgePulseData,
  393. RS232DecodeResult& decodeResult)
  394. {
  395. return pauseDataRS232(options, edgePulseData.GetDataAddrPtr(),
  396. edgePulseData.EdgePulsesCount,
  397. edgePulseData.WaveformDataCount, edgePulseData.SampleRate,
  398. decodeResult);
  399. }
  400. }