#include "selfdrive/ui/qt/offroad/driverview.h" #include #include #include "selfdrive/ui/qt/util.h" DriverViewWindow::DriverViewWindow(QWidget* parent) : CameraWidget("camerad", VISION_STREAM_DRIVER, parent) { QObject::connect(this, &CameraWidget::clicked, this, &DriverViewWindow::done); QObject::connect(device(), &Device::interactiveTimeout, this, [this]() { if (isVisible()) { emit done(); } }); } void DriverViewWindow::showEvent(QShowEvent* event) { params.putBool("IsDriverViewEnabled", true); device()->resetInteractiveTimeout(60); CameraWidget::showEvent(event); } void DriverViewWindow::hideEvent(QHideEvent* event) { params.putBool("IsDriverViewEnabled", false); stopVipcThread(); CameraWidget::hideEvent(event); } void DriverViewWindow::paintGL() { CameraWidget::paintGL(); std::lock_guard lk(frame_lock); QPainter p(this); // startup msg if (frames.empty()) { p.setPen(Qt::white); p.setRenderHint(QPainter::TextAntialiasing); p.setFont(InterFont(100, QFont::Bold)); p.drawText(geometry(), Qt::AlignCenter, tr("camera starting")); return; } const auto &sm = *(uiState()->sm); cereal::DriverStateV2::Reader driver_state = sm["driverStateV2"].getDriverStateV2(); bool is_rhd = driver_state.getWheelOnRightProb() > 0.5; auto driver_data = is_rhd ? driver_state.getRightDriverData() : driver_state.getLeftDriverData(); bool face_detected = driver_data.getFaceProb() > 0.7; if (face_detected) { auto fxy_list = driver_data.getFacePosition(); auto std_list = driver_data.getFaceOrientationStd(); float face_x = fxy_list[0]; float face_y = fxy_list[1]; float face_std = std::max(std_list[0], std_list[1]); float alpha = 0.7; if (face_std > 0.15) { alpha = std::max(0.7 - (face_std-0.15)*3.5, 0.0); } const int box_size = 220; // use approx instead of distort_points int fbox_x = 1080.0 - 1714.0 * face_x; int fbox_y = -135.0 + (504.0 + std::abs(face_x)*112.0) + (1205.0 - std::abs(face_x)*724.0) * face_y; p.setPen(QPen(QColor(255, 255, 255, alpha * 255), 10)); p.drawRoundedRect(fbox_x - box_size / 2, fbox_y - box_size / 2, box_size, box_size, 35.0, 35.0); } driver_monitor.updateState(*uiState()); driver_monitor.draw(p, rect()); } mat4 DriverViewWindow::calcFrameMatrix() { const float driver_view_ratio = 2.0; const float yscale = stream_height * driver_view_ratio / stream_width; const float xscale = yscale * glHeight() / glWidth() * stream_width / stream_height; return mat4{{ xscale, 0.0, 0.0, 0.0, 0.0, yscale, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, }}; }