diff --git a/SConstruct b/SConstruct index ec76448235..9d1d730517 100644 --- a/SConstruct +++ b/SConstruct @@ -165,7 +165,6 @@ env = Environment( "-g", "-fPIC", "-O2", - "-Wunused", "-Werror", "-Wshadow", "-Wno-unknown-warning-option", diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index add57062f2..83184ef598 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -103,6 +103,7 @@ CameraViewWidget::CameraViewWidget(std::string stream_name, VisionStreamType typ setAttribute(Qt::WA_OpaquePaintEvent); connect(this, &CameraViewWidget::vipcThreadConnected, this, &CameraViewWidget::vipcConnected, Qt::BlockingQueuedConnection); connect(this, &CameraViewWidget::vipcThreadFrameReceived, this, &CameraViewWidget::vipcFrameReceived); + QObject::connect(uiState(), &UIState::uiUpdate, this, &CameraViewWidget::updateCameraFrame); } CameraViewWidget::~CameraViewWidget() { @@ -164,12 +165,28 @@ void CameraViewWidget::initializeGL() { void CameraViewWidget::showEvent(QShowEvent *event) { latest_frame = nullptr; - if (!vipc_thread) { - vipc_thread = new QThread(); - connect(vipc_thread, &QThread::started, [=]() { vipcThread(); }); - connect(vipc_thread, &QThread::finished, vipc_thread, &QObject::deleteLater); - vipc_thread->start(); + + if (!vipc_client) { + vipc_client.reset(new VisionIpcClient(stream_name, stream_type, false)); + } + + while (!vipc_client->connected) { + if (!vipc_client->connect(false)) { + QThread::msleep(100); + continue; + } +// emit vipcThreadConnected(vipc_client.get()); +// emit vipcThreadConnected(); + vipcConnected(vipc_client.get()); +// break; } + +// if (!vipc_client) { +// vipc_thread = new QThread(); +// connect(vipc_thread, &QThread::started, [=]() { vipcThread(); }); +// connect(vipc_thread, &QThread::finished, vipc_thread, &QObject::deleteLater); +// vipc_thread->start(); +// } } void CameraViewWidget::hideEvent(QHideEvent *event) { @@ -247,11 +264,13 @@ void CameraViewWidget::paintGL() { glActiveTexture(GL_TEXTURE0); } -void CameraViewWidget::vipcConnected(VisionIpcClient *vipc_client) { +void CameraViewWidget::vipcConnected(VisionIpcClient *_vipc_client) { makeCurrent(); latest_frame = nullptr; - stream_width = vipc_client->buffers[0].width; - stream_height = vipc_client->buffers[0].height; + stream_width = _vipc_client->buffers[0].width; + stream_height = _vipc_client->buffers[0].height; + qDebug() << "vipcConnected"; +// vipc_client.reset(_vipc_client); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); for (int i = 0; i < 3; ++i) { @@ -269,17 +288,74 @@ void CameraViewWidget::vipcConnected(VisionIpcClient *vipc_client) { updateFrameMat(width(), height()); } -void CameraViewWidget::vipcFrameReceived(VisionBuf *buf) { +void CameraViewWidget::vipcFrameReceived() { latest_frame = buf; update(); } +void CameraViewWidget::updateCameraFrame() { + if (!vipc_client) { + qDebug() << "vipc_client not initialized"; + return; + } + + UIState *s = uiState(); + +// if (!vipc_client) { +// vipc_client.reset(new VisionIpcClient(stream_name, stream_type, false)); +// } +// +// if (!vipc_client->connected) { +// if (vipc_client->connect(false)) { +// qDebug() << "CONNECTED"; +// vipcConnected(); +//// emit vipcThreadConnected(); +// qDebug() << "CONNECTED2"; +// } +// } + + qDebug() << "Frame ready!"; + + + bool recv_one = (meta_main.frame_id - (*s->sm)["modelV2"].getModelV2().getFrameId()) > 5; + while (meta_main.frame_id < (*s->sm)["modelV2"].getModelV2().getFrameId() || recv_one) { + recv_one = false; + qDebug() << "Getting buf"; + buf = vipc_client->recv(&meta_main, 1000); + qDebug() << "After buf"; + if (buf == nullptr) { + qDebug() << "nullptr!"; + break; + } + } + + if (buf != nullptr) { +// emit vipcThreadFrameReceived(buf); + latest_frame = buf; + update(); + qDebug() << "update()"; + } + qDebug() << "camerad:" << meta_main.frame_id << "modeld:" << (*s->sm)["modelV2"].getModelV2().getFrameId(); + +// // Wait until camera frame id is behind modelV2, then update once +// while (meta_main.frame_id >= (*s->sm)["modelV2"].getModelV2().getFrameId()) { +// qDebug() << "Sleeping"; +// QThread::msleep(5); +// if ((meta_main.frame_id - (*s->sm)["modelV2"].getModelV2().getFrameId()) > 40) { +// break; +// } +// }; +// +// if ((buf = vipc_client->recv(&meta_main, 1000))) { +// qDebug() << "emitting"; +// emit vipcThreadFrameReceived(buf); +// } +// qDebug() << "camerad:" << meta_main.frame_id << "modeld:" << (*s->sm)["modelV2"].getModelV2().getFrameId(); +} + void CameraViewWidget::vipcThread() { VisionStreamType cur_stream_type = stream_type; - std::unique_ptr vipc_client; - VisionIpcBufExtra meta_main = {0}; - VisionBuf *buf; - UIState *s = uiState(); +// std::unique_ptr _vipc_client; while (!QThread::currentThread()->isInterruptionRequested()) { if (!vipc_client || cur_stream_type != stream_type) { @@ -293,21 +369,46 @@ void CameraViewWidget::vipcThread() { continue; } emit vipcThreadConnected(vipc_client.get()); +// emit vipcThreadConnected(); + break; } - - // Wait until camera frame id is behind modelV2, then update once - while (meta_main.frame_id >= (*s->sm)["modelV2"].getModelV2().getFrameId()) { - qDebug() << "Sleeping"; - QThread::msleep(5); - if ((meta_main.frame_id - (*s->sm)["modelV2"].getModelV2().getFrameId()) > 40) { - break; - } - }; - - if ((buf = vipc_client->recv(&meta_main, 1000))) { - qDebug() << "emitting"; - emit vipcThreadFrameReceived(buf); - } - qDebug() << "camerad:" << meta_main.frame_id << "modeld:" << (*s->sm)["modelV2"].getModelV2().getFrameId(); } } + +//void CameraViewWidget::vipcThread() { +// VisionStreamType cur_stream_type = stream_type; +// std::unique_ptr vipc_client; +// VisionIpcBufExtra meta_main = {0}; +// VisionBuf *buf; +// UIState *s = uiState(); +// +// while (!QThread::currentThread()->isInterruptionRequested()) { +// if (!vipc_client || cur_stream_type != stream_type) { +// cur_stream_type = stream_type; +// vipc_client.reset(new VisionIpcClient(stream_name, cur_stream_type, false)); +// } +// +// if (!vipc_client->connected) { +// if (!vipc_client->connect(false)) { +// QThread::msleep(100); +// continue; +// } +// emit vipcThreadConnected(vipc_client.get()); +// } +// +// // Wait until camera frame id is behind modelV2, then update once +// while (meta_main.frame_id >= (*s->sm)["modelV2"].getModelV2().getFrameId()) { +// qDebug() << "Sleeping"; +// QThread::msleep(5); +// if ((meta_main.frame_id - (*s->sm)["modelV2"].getModelV2().getFrameId()) > 40) { +// break; +// } +// }; +// +// if ((buf = vipc_client->recv(&meta_main, 1000))) { +// qDebug() << "emitting"; +// emit vipcThreadFrameReceived(buf); +// } +// qDebug() << "camerad:" << meta_main.frame_id << "modeld:" << (*s->sm)["modelV2"].getModelV2().getFrameId(); +// } +//} diff --git a/selfdrive/ui/qt/widgets/cameraview.h b/selfdrive/ui/qt/widgets/cameraview.h index 1f19ea157b..692150a938 100644 --- a/selfdrive/ui/qt/widgets/cameraview.h +++ b/selfdrive/ui/qt/widgets/cameraview.h @@ -23,7 +23,7 @@ public: signals: void clicked(); void vipcThreadConnected(VisionIpcClient *); - void vipcThreadFrameReceived(VisionBuf *); + void vipcThreadFrameReceived(); protected: void paintGL() override; @@ -34,6 +34,11 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override { emit clicked(); } virtual void updateFrameMat(int w, int h); void vipcThread(); + void updateCameraFrame(); + + QSharedPointer vipc_client; + VisionIpcBufExtra meta_main = {0}; + VisionBuf *buf; struct WaitFence { WaitFence() { sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); } @@ -61,5 +66,5 @@ protected: protected slots: void vipcConnected(VisionIpcClient *vipc_client); - void vipcFrameReceived(VisionBuf *vipc_client); + void vipcFrameReceived(); };