route.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #pragma once
  2. #include <map>
  3. #include <memory>
  4. #include <string>
  5. #include <vector>
  6. #include <QDateTime>
  7. #include <QFutureSynchronizer>
  8. #include "tools/replay/framereader.h"
  9. #include "tools/replay/logreader.h"
  10. #include "tools/replay/util.h"
  11. enum class RouteLoadError {
  12. None,
  13. AccessDenied,
  14. NetworkError,
  15. FileNotFound,
  16. UnknownError
  17. };
  18. struct RouteIdentifier {
  19. QString dongle_id;
  20. QString timestamp;
  21. int begin_segment = 0;
  22. int end_segment = -1;
  23. QString str;
  24. };
  25. struct SegmentFile {
  26. QString rlog;
  27. QString qlog;
  28. QString road_cam;
  29. QString driver_cam;
  30. QString wide_road_cam;
  31. QString qcamera;
  32. };
  33. class Route {
  34. public:
  35. Route(const QString &route, const QString &data_dir = {});
  36. bool load();
  37. RouteLoadError lastError() const { return err_; }
  38. inline const QString &name() const { return route_.str; }
  39. inline const QDateTime datetime() const { return date_time_; }
  40. inline const QString &dir() const { return data_dir_; }
  41. inline const RouteIdentifier &identifier() const { return route_; }
  42. inline const std::map<int, SegmentFile> &segments() const { return segments_; }
  43. inline const SegmentFile &at(int n) { return segments_.at(n); }
  44. static RouteIdentifier parseRoute(const QString &str);
  45. protected:
  46. bool loadFromLocal();
  47. bool loadFromServer(int retries = 3);
  48. bool loadFromJson(const QString &json);
  49. void addFileToSegment(int seg_num, const QString &file);
  50. RouteIdentifier route_ = {};
  51. QString data_dir_;
  52. std::map<int, SegmentFile> segments_;
  53. QDateTime date_time_;
  54. RouteLoadError err_ = RouteLoadError::None;
  55. };
  56. class Segment : public QObject {
  57. Q_OBJECT
  58. public:
  59. Segment(int n, const SegmentFile &files, uint32_t flags, const std::vector<bool> &filters = {});
  60. ~Segment();
  61. inline bool isLoaded() const { return !loading_ && !abort_; }
  62. const int seg_num = 0;
  63. std::unique_ptr<LogReader> log;
  64. std::unique_ptr<FrameReader> frames[MAX_CAMERAS] = {};
  65. signals:
  66. void loadFinished(bool success);
  67. protected:
  68. void loadFile(int id, const std::string file);
  69. std::atomic<bool> abort_ = false;
  70. std::atomic<int> loading_ = 0;
  71. QFutureSynchronizer<void> synchronizer_;
  72. uint32_t flags;
  73. std::vector<bool> filters_;
  74. };