USBPacket.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. // // ******************************************************************
  2. // // /\ /| @File USBPacket.cpp
  3. // // \ V/ @Brief
  4. // // | "") @Author lijinwen, ghz005@uni-trend.com.cn
  5. // // / | @Creation 2024-1-3
  6. // // / \\ @Modified 2024-1-15
  7. // // *(__\_\
  8. // // ******************************************************************
  9. #include "USBPacket.h"
  10. #include "../BaseHelper/CommonHelper.h"
  11. namespace Protocol
  12. {
  13. USBPacket::USBPacket(): pid(0), lastNRBZDataBit(false), polarity(false), endPoint(0), crc5(0), isValid(false),
  14. isCRCChecked(false)
  15. {
  16. }
  17. USBPacket::USBPacket(Protocol::TwoLevelEdgePulse* pidNode, int32_t& leftOverSize, SYNC sync, bool polarity)
  18. {
  19. this->polarity = polarity;
  20. this->packetSYNC = sync;
  21. //this->pidType = nullptr;
  22. if (!GetPID(pidNode, leftOverSize))
  23. {
  24. return;
  25. }
  26. isValid = true;
  27. if (this->type == Enums::USBPacketType::NoDefine)
  28. {
  29. return;
  30. }
  31. DecodeFields(pidNode, leftOverSize, sync);
  32. }
  33. bool USBPacket::CheckNibblesInverse(uint8_t value)
  34. {
  35. uint8_t highNibble = static_cast<uint8_t>(value >> 4);
  36. uint8_t lowNibble = static_cast<uint8_t>(value & 0x0F);
  37. return highNibble == (~lowNibble & 0x0F);
  38. }
  39. bool USBPacket::GetPID(Protocol::TwoLevelEdgePulse* pidNode, int32_t& leftOverSize)
  40. {
  41. if (pidNode == nullptr || leftOverSize <= 0 || packetSYNC.SingleBitTimingLength <= 0)
  42. {
  43. return false;
  44. }
  45. lastNRBZDataBit = true;
  46. uint8_t data;
  47. if (!DecodeNextByte(pidNode, leftOverSize, data))
  48. {
  49. return false;
  50. }
  51. // if (pidNode != nullptr) {
  52. // pidEndIndex = pidNode.Parent().StartIndex();
  53. // }
  54. pid = data;
  55. if (CommonHelper::EnumIsDefined<Enums::TokenPackageType>(
  56. static_cast<int>(RealPID())))
  57. {
  58. type = Enums::USBPacketType::Token;
  59. }
  60. else if (CommonHelper::EnumIsDefined<Enums::DataPackageType>(
  61. static_cast<int>(RealPID())))
  62. {
  63. type = Enums::USBPacketType::Data;
  64. }
  65. else if (CommonHelper::EnumIsDefined<Enums::HandshakePackageType>(
  66. static_cast<int>(RealPID())))
  67. {
  68. type = Enums::USBPacketType::HandShake;
  69. }
  70. else if (CommonHelper::EnumIsDefined<Enums::SpecialPacketType>(
  71. static_cast<int>(RealPID())))
  72. {
  73. type = Enums::USBPacketType::Special;
  74. }
  75. else
  76. {
  77. return false;
  78. }
  79. return true;
  80. }
  81. bool USBPacket::DecodeNextByte(Protocol::TwoLevelEdgePulse* node, int32_t& leftOverSize, uint8_t& outData)
  82. {
  83. outData = 0;
  84. const bool highPolarityEdge = polarity;
  85. const double singleBitTimingLengthThreshold = packetSYNC.SingleBitTimingLength * 0.95;
  86. int gotbitCount = 0;
  87. std::vector<bool> nrzi_data(8, false);
  88. while (gotbitCount < 8)
  89. {
  90. if (node == nullptr || leftOverSize <= 0 || (*node).Edge == Protocol::Edge::None)
  91. {
  92. return false;
  93. }
  94. if ((*node).EndIndex - (*node).StartIndex >= singleBitTimingLengthThreshold)
  95. {
  96. const int bitsCount = static_cast<int>(((*node).EndIndex - (*node).StartIndex) /
  97. singleBitTimingLengthThreshold);
  98. const int lastGotbitCount = gotbitCount;
  99. for (int i = 0; i < bitsCount; i++)
  100. {
  101. if (lastGotbitCount + i >= 8)
  102. {
  103. continue;
  104. }
  105. nrzi_data[lastGotbitCount + i] = highPolarityEdge == ((*node).Edge ==
  106. Protocol::Edge::Rise);
  107. gotbitCount++;
  108. }
  109. }
  110. leftOverSize--;
  111. node++;
  112. }
  113. for (int i = 0; i < 8; i++)
  114. {
  115. if (lastNRBZDataBit != nrzi_data[i])
  116. {
  117. lastNRBZDataBit = nrzi_data[i];
  118. }
  119. else
  120. {
  121. outData |= (1 << i);
  122. }
  123. }
  124. return true;
  125. }
  126. void USBPacket::DecodeFields(Protocol::TwoLevelEdgePulse* node, int32_t& leftOverSize, const SYNC& sync)
  127. {
  128. if (leftOverSize <= 0)
  129. {
  130. return;
  131. }
  132. switch (type)
  133. {
  134. case Enums::USBPacketType::Token:
  135. DecodeFieldsByToken(node, leftOverSize, sync);
  136. break;
  137. case Enums::USBPacketType::Data:
  138. DecodeFieldsByData(node, leftOverSize, sync);
  139. break;
  140. case Enums::USBPacketType::HandShake:
  141. DecodeFieldsByHandShake(node, leftOverSize, sync);
  142. break;
  143. case Enums::USBPacketType::Special:
  144. DecodeFieldsBySpecial(node, leftOverSize, sync);
  145. break;
  146. default:
  147. break;
  148. }
  149. }
  150. void USBPacket::DecodeFieldsByToken(Protocol::TwoLevelEdgePulse* node, int32_t& leftOverSize, const SYNC& sync)
  151. {
  152. if (type == Enums::USBPacketType::NoDefine)
  153. {
  154. return;
  155. }
  156. //todo
  157. auto packageType = static_cast<
  158. Enums::TokenPackageType>(RealPID());
  159. switch (packageType)
  160. {
  161. case Enums::TokenPackageType::Out:
  162. break;
  163. case Enums::TokenPackageType::SOF:
  164. break;
  165. case Enums::TokenPackageType::IN:
  166. break;
  167. case Enums::TokenPackageType::SETUP:
  168. break;
  169. default:
  170. break;
  171. }
  172. }
  173. void USBPacket::DecodeFieldsByData(Protocol::TwoLevelEdgePulse* node, int32_t& leftOverSize, const SYNC sync)
  174. {
  175. if (type == Enums::USBPacketType::NoDefine)
  176. {
  177. return;
  178. }
  179. auto packageType = static_cast<Enums::DataPackageType>
  180. (RealPID());
  181. switch (packageType)
  182. {
  183. case Enums::DataPackageType::Data0:
  184. case Enums::DataPackageType::Data1:
  185. datas.clear();
  186. while (node != nullptr && (*node).StartIndex < sync.PacketEndIndex())
  187. {
  188. uint8_t data;
  189. DecodeNextByte(node, leftOverSize, data);
  190. datas.push_back(data);
  191. }
  192. break;
  193. case Enums::DataPackageType::Data2:
  194. break;
  195. case Enums::DataPackageType::MData:
  196. break;
  197. default:
  198. break;
  199. }
  200. }
  201. void USBPacket::DecodeFieldsByHandShake(Protocol::TwoLevelEdgePulse* node, int32_t& leftOverSize, SYNC sync)
  202. {
  203. //todo
  204. if (type != Enums::USBPacketType::HandShake)
  205. {
  206. return;
  207. }
  208. }
  209. void USBPacket::DecodeFieldsBySpecial(Protocol::TwoLevelEdgePulse* node, int32_t& leftOverSize, SYNC sync)
  210. {
  211. //todo
  212. if (type != Enums::USBPacketType::Special)
  213. {
  214. return;
  215. }
  216. }
  217. }