mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-04 04:52:09 +08:00
cabana: fix seeking issue (#28346)
* fix seekto * rename loadThumbnail to parseQLog old-commit-hash: e853af2ca6c84352b9cd7a17f9dae9a77f5cb3c1
This commit is contained in:
+15
-10
@@ -157,26 +157,31 @@ Slider::Slider(QWidget *parent) : thumbnail_label(parent), QSlider(Qt::Horizonta
|
||||
update();
|
||||
});
|
||||
timer->start(2000);
|
||||
thumnail_future = QtConcurrent::run(this, &Slider::loadThumbnails);
|
||||
QObject::connect(can, &AbstractStream::eventsMerged, [this]() {
|
||||
if (!qlog_future) {
|
||||
qlog_future = std::make_unique<QFuture<void>>(QtConcurrent::run(this, &Slider::parseQLog));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Slider::~Slider() {
|
||||
abort_load_thumbnail = true;
|
||||
thumnail_future.waitForFinished();
|
||||
abort_parse_qlog = true;
|
||||
if (qlog_future) {
|
||||
qlog_future->waitForFinished();
|
||||
}
|
||||
}
|
||||
|
||||
void Slider::loadThumbnails() {
|
||||
void Slider::parseQLog() {
|
||||
const auto &segments = can->route()->segments();
|
||||
double max_time = 0;
|
||||
for (auto it = segments.rbegin(); it != segments.rend() && !abort_load_thumbnail; ++it) {
|
||||
for (auto it = segments.rbegin(); it != segments.rend() && !abort_parse_qlog; ++it) {
|
||||
LogReader log;
|
||||
std::string qlog = it->second.qlog.toStdString();
|
||||
if (!qlog.empty() && log.load(qlog, &abort_load_thumbnail, {cereal::Event::Which::THUMBNAIL, cereal::Event::Which::CONTROLS_STATE}, true, 0, 3)) {
|
||||
if (max_time == 0 && !log.events.empty()) {
|
||||
max_time = (*(log.events.rbegin()))->mono_time / 1e9 - can->routeStartTime();
|
||||
if (!qlog.empty() && log.load(qlog, &abort_parse_qlog, {cereal::Event::Which::THUMBNAIL, cereal::Event::Which::CONTROLS_STATE}, true, 0, 3)) {
|
||||
if (it == segments.rbegin() && !log.events.empty()) {
|
||||
double max_time = (*(log.events.rbegin()))->mono_time / 1e9 - can->routeStartTime();
|
||||
emit updateMaximumTime(max_time);
|
||||
}
|
||||
for (auto ev = log.events.cbegin(); ev != log.events.cend() && !abort_load_thumbnail; ++ev) {
|
||||
for (auto ev = log.events.cbegin(); ev != log.events.cend() && !abort_parse_qlog; ++ev) {
|
||||
if ((*ev)->which == cereal::Event::Which::THUMBNAIL) {
|
||||
auto thumb = (*ev)->event.getThumbnail();
|
||||
auto data = thumb.getThumbnail();
|
||||
|
||||
@@ -44,16 +44,16 @@ private:
|
||||
bool event(QEvent *event) override;
|
||||
void sliderChange(QAbstractSlider::SliderChange change) override;
|
||||
void paintEvent(QPaintEvent *ev) override;
|
||||
void loadThumbnails();
|
||||
void parseQLog();
|
||||
|
||||
double max_sec = 0;
|
||||
int slider_x = -1;
|
||||
std::vector<std::tuple<int, int, TimelineType>> timeline;
|
||||
std::mutex thumbnail_lock;
|
||||
std::atomic<bool> abort_load_thumbnail = false;
|
||||
std::atomic<bool> abort_parse_qlog = false;
|
||||
QMap<uint64_t, QPixmap> thumbnails;
|
||||
std::map<uint64_t, AlertInfo> alerts;
|
||||
QFuture<void> thumnail_future;
|
||||
std::unique_ptr<QFuture<void>> qlog_future;
|
||||
InfoLabel thumbnail_label;
|
||||
friend class VideoWidget;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user