usb_decoder.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // // ******************************************************************
  2. // // /\ /| @File Usb_decoder.h
  3. // // \ V/ @Brief
  4. // // | "") @Author lijinwen, ghz005@uni-trend.com.cn
  5. // // / | @Creation 2024-05-17
  6. // // / \\ @Modified 2024-06-24
  7. // // *(__\_\
  8. // // ******************************************************************
  9. #pragma once
  10. #include <iostream>
  11. #include <future>
  12. #include <chrono>
  13. #include <thread>
  14. #include <cmath>
  15. #include "../edge_pulse_data.h"
  16. #include "../edge_pulse.h"
  17. #include "../protocol_decode_base.h"
  18. #include "SYNC.h"
  19. #include "protocol_Usb_enums.h"
  20. #include "Usb_decode_options.h"
  21. #include "Usb_decode_result.h"
  22. #include "Usb_packet.h"
  23. #include "../BaseHelper//common_helper.h"
  24. namespace Protocol
  25. {
  26. class UsbDecoder
  27. {
  28. public:
  29. UsbDecoder() : is_cancel_ptr_(nullptr), usb_speed_(), is_auto_clk_(false), usb_diff_signal_real_edges_count_(0),
  30. wave_max_time_index_len_(0)
  31. {
  32. difference_eop_index_ = {};
  33. result_cells_ = {};
  34. result_events_ = {};
  35. usb_packets_ = {};
  36. sign_edge_pulse_ = {};
  37. }
  38. static std::vector<std::string> EventInfoTitles();
  39. bool DecodeUsb(const UsbDecodeOptions& option, const EdgePulseDataTwoLevels& edge_pulses_dp,
  40. const EdgePulseDataTwoLevels& edge_pulses_dm, UsbDecodeResult& result);
  41. ~UsbDecoder()
  42. {
  43. }
  44. private:
  45. bool* is_cancel_ptr_;
  46. UsbEnums::UsbSpeed usb_speed_;
  47. bool is_auto_clk_;
  48. std::vector<UsbDecodeResultCell> result_cells_;
  49. std::vector<UsbDecodeEvent> result_events_;
  50. std::vector<UsbPacket> usb_packets_;
  51. std::vector<int32_t> difference_eop_index_;
  52. std::vector<TwoLevelEdgePulse> sign_edge_pulse_;
  53. //Usb差分信号非对齐位置
  54. std::vector<int32_t> usb_diff_unaligned_frames_index_;
  55. //差分信号可用长度
  56. int32_t usb_diff_signal_real_edges_count_;
  57. //传入波形最大时域长度
  58. int32_t wave_max_time_index_len_;
  59. //同步帧长度
  60. int32_t sync_bit_len_ = USB_USB_SYNC_BIT_MAX_LEN;
  61. bool ParseDiffSignalData(std::vector<TwoLevelEdgePulse> edge_pulses_dp,
  62. std::vector<TwoLevelEdgePulse> edge_pulses_dm)
  63. {
  64. //找出非对称边沿
  65. //todo add differenceEopIndexs
  66. //temp
  67. sign_edge_pulse_ = std::move(edge_pulses_dp);
  68. return true;
  69. }
  70. bool CheckTimeDifferenceWithinThreshold(const double* array, int32_t size, int32_t avg_span,
  71. double threshold = USB_TIME_DIFFERENCE_THRESHOLD);
  72. bool CheckTimeDifferenceWithinThreshold(const double* array, int32_t size,
  73. double threshold = USB_TIME_DIFFERENCE_THRESHOLD);
  74. //bool GetPolarty(TwoLevelEdgePulse* node, double set_bit_time_span, int& last_valid_data_index);
  75. bool GetPolarty(TwoLevelEdgePulse* node, double set_bit_time_span);
  76. static void ClearEdgeArray(Edge* edges, int32_t size);
  77. static bool CheckSyncEdges(Edge start_edge, const Edge* edges);
  78. //检查同步域在时域间隔
  79. bool CheckSyncSpans(const TwoLevelEdgePulse* node, int32_t count,
  80. int32_t& avg_spans);
  81. bool CheckSyncSpansByArray(const int32_t* start_indexs, int32_t count, int32_t& avg_span);
  82. // bool FindAllSyncs(TwoLevelEdgePulse* node, std::vector<SYNC>& all_sync
  83. // , double set_bit_time_span, bool force_normal_speed, bool polarity = false);
  84. bool FindAllSyncs(TwoLevelEdgePulse* node, std::vector<Sync>& all_sync
  85. , double set_bit_time_span, bool polarity, int32_t& last_valid_data_index);
  86. // static bool FindAllSyncs(Protocol::TwoLevelEdgePulse* node, int32_t left_over_size,
  87. // std::vector<SYNC>& all_sync, bool polarity = false);
  88. bool FindPackets(int32_t& left_over_size,
  89. std::vector<UsbPacket>& all_packet, double set_bit_time_span);
  90. bool CheckOptions(UsbDecodeOptions option, const std::vector<TwoLevelEdgePulse>& edge_pulses_dp,
  91. const std::vector<TwoLevelEdgePulse>& edge_pulses_dm, double& set_bit_time_span);
  92. bool ParseSingleData(double set_bit_time_span, bool auto_clock);
  93. };
  94. }