#pragma once #include #include #include #include #include #include "cereal/visionipc/visionipc_client.h" #include "selfdrive/common/visionimg.h" #include "selfdrive/ui/ui.h" class CameraViewWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: using QOpenGLWidget::QOpenGLWidget; explicit CameraViewWidget(std::string stream_name, VisionStreamType stream_type, bool zoom, QWidget* parent = nullptr); ~CameraViewWidget(); void setStreamType(VisionStreamType type) { stream_type = type; } void setBackgroundColor(const QColor &color) { bg = color; } signals: void clicked(); void vipcThreadConnected(VisionIpcClient *); void vipcThreadFrameReceived(VisionBuf *); protected: void paintGL() override; void initializeGL() override; void resizeGL(int w, int h) override { updateFrameMat(w, h); } void showEvent(QShowEvent *event) override; void hideEvent(QHideEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override { emit clicked(); } void updateFrameMat(int w, int h); void vipcThread(); bool zoomed_view; std::atomic latest_texture_id = -1; GLuint frame_vao, frame_vbo, frame_ibo; mat4 frame_mat; std::unique_ptr texture[UI_BUF_COUNT]; std::unique_ptr program; QColor bg = QColor("#000000"); std::string stream_name; int stream_width = 0; int stream_height = 0; std::atomic stream_type; QThread *vipc_thread = nullptr; protected slots: void vipcConnected(VisionIpcClient *vipc_client); };