From 1c369a90096fee30116b14eed610f7ecb0514fe1 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 25 Feb 2021 01:03:37 -0800 Subject: [PATCH] Qt on NEOS (#20153) * qt on neos * cleanup * check arch * fix pc * fix mac * base libs Co-authored-by: Comma Device --- SConstruct | 15 ++++++++-- selfdrive/manager.py | 2 +- selfdrive/ui/SConscript | 40 ++++++++++++++------------ selfdrive/ui/qt/offroad/onboarding.cc | 10 ++++--- selfdrive/ui/qt/offroad/onboarding.hpp | 12 ++++++-- selfdrive/ui/qt/offroad/settings.cc | 7 +++++ selfdrive/ui/qt/offroad/settings.hpp | 2 -- selfdrive/ui/qt/qt_window.hpp | 1 - selfdrive/ui/sidebar.cc | 2 +- selfdrive/ui/ui | 11 +++++-- selfdrive/ui/ui.hpp | 2 +- 11 files changed, 70 insertions(+), 34 deletions(-) diff --git a/SConstruct b/SConstruct index 4330052df..a353e2c2d 100644 --- a/SConstruct +++ b/SConstruct @@ -264,10 +264,12 @@ Export('envCython') # Qt build environment qt_env = None -if arch in ["x86_64", "Darwin", "larch64"]: +if arch in ["x86_64", "Darwin", "larch64", "aarch64"]: qt_env = env.Clone() - qt_modules = ["Widgets", "Gui", "Core", "DBus", "Multimedia", "Network", "Concurrent", "WebEngine", "WebEngineWidgets"] + qt_modules = ["Widgets", "Gui", "Core", "Network", "Concurrent", "Multimedia"] + if arch != "aarch64": + qt_modules += ["DBus", "WebEngine", "WebEngineWidgets"] qt_libs = [] if arch == "Darwin": @@ -279,6 +281,15 @@ if arch in ["x86_64", "Darwin", "larch64"]: qt_dirs += [f"{QT_BASE}include/Qt{m}" for m in qt_modules] qt_env["LINKFLAGS"] += ["-F" + QT_BASE + "lib"] qt_env["FRAMEWORKS"] += [f"Qt{m}" for m in qt_modules] + ["OpenGL"] + elif arch == "aarch64": + qt_env['QTDIR'] = "/system/comma/usr" + qt_dirs = [ + f"/system/comma/usr/include/qt", + ] + qt_dirs += [f"/system/comma/usr/include/qt/Qt{m}" for m in qt_modules] + + qt_libs = [f"Qt5{m}" for m in qt_modules] + qt_libs += ['EGL', 'GLESv3', 'c++_shared'] else: qt_env['QTDIR'] = "/usr" qt_dirs = [ diff --git a/selfdrive/manager.py b/selfdrive/manager.py index 1e3d9d688..63b6fddeb 100755 --- a/selfdrive/manager.py +++ b/selfdrive/manager.py @@ -445,7 +445,7 @@ def manager_thread(): start_managed_process(p) # start offroad - if EON: + if EON and "QT" not in os.environ: pm_apply_packages('enable') start_offroad() diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 0dd5d56ec..e16ac716b 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -2,13 +2,16 @@ import os Import('env', 'qt_env', 'arch', 'common', 'messaging', 'gpucommon', 'visionipc', 'cereal', 'transformations') - src = ['ui.cc', 'paint.cc', 'sidebar.cc', '#phonelibs/nanovg/nanovg.c'] -libs = [gpucommon, common, 'zmq', 'capnp', 'kj', 'm', 'OpenCL', cereal, messaging, visionipc, transformations] +libs = [gpucommon, common, 'zmq', 'capnp', 'kj', 'm', 'OpenCL', cereal, + messaging, visionipc, transformations] -if qt_env is None: - libs += ['EGL', 'GLESv3', 'gnustl_shared', 'log', 'utils', 'gui', 'hardware', - 'ui', 'CB', 'gsl', 'adreno_utils', 'OpenSLES', 'cutils', 'uuid', 'OpenCL'] +if arch == 'aarch64': + libs += ['log', 'utils', 'gui', 'ui', 'CB', 'gsl', 'adreno_utils', + 'cutils', 'uuid'] + +if arch == 'aarch64' and "QT" not in os.environ: + libs += ['EGL', 'GLESv3', 'gnustl_shared', 'hardware', 'OpenSLES', 'cutils', 'uuid', 'ssl', 'crypto'] linkflags = ['-Wl,-rpath=/system/lib64,-rpath=/system/comma/usr/lib'] src += ["android/ui.cc", "android/sl_sound.cc"] @@ -16,26 +19,27 @@ if qt_env is None: LINKFLAGS=linkflags, LIBS=libs) else: - qt_libs = qt_env["LIBS"] + libs + ["pthread", "ssl", "crypto"] - - widgets = qt_env.Library("qt_widgets", - ["qt/qt_sound.cc", "qt/widgets/keyboard.cc", "qt/widgets/input_field.cc", "qt/widgets/drive_stats.cc", "qt/widgets/ssh_keys.cc", - "qt/offroad/networking.cc", "qt/offroad/wifiManager.cc", "qt/widgets/toggle.cc", "qt/widgets/offroad_alerts.cc", "qt/widgets/setup.cc"], - LIBS=qt_libs) - qt_libs.append(widgets) - - + qt_base_libs = qt_env["LIBS"] + libs + ["pthread", "ssl", "crypto"] if arch == "Darwin": - # fix OpenCL - del qt_libs[qt_libs.index('OpenCL')] + del qt_base_libs[qt_base_libs.index('OpenCL')] qt_env['FRAMEWORKS'] += ['OpenCL'] + widgets_src = ["qt/widgets/input_field.cc", "qt/widgets/drive_stats.cc", + "qt/widgets/ssh_keys.cc", "qt/widgets/toggle.cc", "qt/qt_sound.cc", + "qt/widgets/offroad_alerts.cc", "qt/widgets/setup.cc", "qt/widgets/keyboard.cc"] + + if arch != 'aarch64': + widgets_src += ["qt/offroad/networking.cc", "qt/offroad/wifiManager.cc"] + + widgets = qt_env.Library("qt_widgets", widgets_src, LIBS=qt_base_libs) + qt_libs = qt_base_libs + [widgets] + qt_src = ["qt/ui.cc", "qt/window.cc", "qt/home.cc", "qt/api.cc", "qt/offroad/settings.cc", "qt/offroad/onboarding.cc", "#phonelibs/qrcode/QrCode.cc"] + src qt_env.Program("_ui", qt_src, LIBS=qt_libs) # spinner and text window - qt_env.Program("qt/text", ["qt/text.cc"], LIBS=qt_libs) - qt_env.Program("qt/spinner", ["qt/spinner.cc"], LIBS=qt_libs) + qt_env.Program("qt/text", ["qt/text.cc"], LIBS=qt_base_libs) + qt_env.Program("qt/spinner", ["qt/spinner.cc"], LIBS=qt_base_libs) # build setup, factory resetter, and installer if "BUILD_SETUP" in os.environ: diff --git a/selfdrive/ui/qt/offroad/onboarding.cc b/selfdrive/ui/qt/offroad/onboarding.cc index 00d48520d..b80fed2d1 100644 --- a/selfdrive/ui/qt/offroad/onboarding.cc +++ b/selfdrive/ui/qt/offroad/onboarding.cc @@ -4,8 +4,6 @@ #include #include #include -#include -#include #include "common/params.h" #include "onboarding.hpp" @@ -76,12 +74,16 @@ QWidget* OnboardingWindow::terms_screen() { QVBoxLayout *main_layout = new QVBoxLayout; main_layout->setContentsMargins(40, 0, 40, 0); +#ifndef QCOM view = new QWebEngineView(this); view->settings()->setAttribute(QWebEngineSettings::ShowScrollBars, false); QString html = QString::fromStdString(util::read_file("../assets/offroad/tc.html")); view->setHtml(html); main_layout->addWidget(view); + QObject::connect(view->page(), SIGNAL(scrollPositionChanged(QPointF)), this, SLOT(scrollPositionChanged(QPointF))); +#endif + QHBoxLayout* buttons = new QHBoxLayout; buttons->addWidget(new QPushButton("Decline")); buttons->addSpacing(50); @@ -93,8 +95,6 @@ QWidget* OnboardingWindow::terms_screen() { updateActiveScreen(); }); - QObject::connect(view->page(), SIGNAL(scrollPositionChanged(QPointF)), this, SLOT(scrollPositionChanged(QPointF))); - QWidget* w = layout2Widget(buttons); w->setFixedHeight(200); main_layout->addWidget(w); @@ -167,8 +167,10 @@ OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) { } void OnboardingWindow::scrollPositionChanged(QPointF position){ +#ifndef QCOM if (position.y() > view->page()->contentsSize().height() - 1000){ accept_btn->setEnabled(true); accept_btn->setText("Accept"); } +#endif } diff --git a/selfdrive/ui/qt/offroad/onboarding.hpp b/selfdrive/ui/qt/offroad/onboarding.hpp index f427cf79c..c872af986 100644 --- a/selfdrive/ui/qt/offroad/onboarding.hpp +++ b/selfdrive/ui/qt/offroad/onboarding.hpp @@ -6,7 +6,12 @@ #include #include #include + +#ifndef QCOM +#include #include +#include +#endif class TrainingGuide : public QFrame { @@ -21,7 +26,7 @@ protected: private: int currentIndex = 0; QStackedLayout* slayout; - //Vector of bounding boxes for the next step. (minx, maxx, miny, maxy) + // Vector of bounding boxes for the a given training guide step. (minx, maxx, miny, maxy) QVector> boundingBox {{250, 930, 750, 900}, {280, 1280, 650, 950}, {330, 1130, 590, 900}, {910, 1580, 500, 1000}, {1180, 1300, 630, 720}, {290, 1050, 590, 960}, {1090, 1240, 550, 660}, {1050, 1580, 250, 900}, {320, 1130, 670, 1020}, {1010, 1580, 410, 750}, {1040, 1500, 230, 1030}, {300, 1190, 590, 920}, {1050, 1310, 170, 870}, {950, 1530, 460, 770}, {190, 970, 750, 970}}; @@ -40,9 +45,12 @@ private: std::string current_training_version; QWidget * terms_screen(); QWidget * training_screen(); - QWebEngineView* view; QPushButton* accept_btn; +#ifndef QCOM + QWebEngineView* view; +#endif + signals: void onboardingDone(); diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 49b22e1c9..e00d97e7b 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -10,7 +10,10 @@ #include #include +#ifndef QCOM #include "networking.hpp" +#endif + #include "settings.hpp" #include "widgets/toggle.hpp" #include "widgets/offroad_alerts.hpp" @@ -224,7 +227,11 @@ QWidget * developer_panel() { } QWidget * network_panel(QWidget * parent) { +#ifdef QCOM + QWidget *w = new QWidget; +#else Networking *w = new Networking(parent); +#endif return w; } diff --git a/selfdrive/ui/qt/offroad/settings.hpp b/selfdrive/ui/qt/offroad/settings.hpp index e10a2652c..81ba92b1a 100644 --- a/selfdrive/ui/qt/offroad/settings.hpp +++ b/selfdrive/ui/qt/offroad/settings.hpp @@ -7,8 +7,6 @@ #include #include -#include "networking.hpp" - // *** settings widgets *** class ParamsToggle : public QFrame { diff --git a/selfdrive/ui/qt/qt_window.hpp b/selfdrive/ui/qt/qt_window.hpp index f7d36af8d..2e02ec30c 100644 --- a/selfdrive/ui/qt/qt_window.hpp +++ b/selfdrive/ui/qt/qt_window.hpp @@ -1,7 +1,6 @@ #include #include -#include #include #ifdef QCOM2 diff --git a/selfdrive/ui/sidebar.cc b/selfdrive/ui/sidebar.cc index 0d05dade0..6e936342b 100644 --- a/selfdrive/ui/sidebar.cc +++ b/selfdrive/ui/sidebar.cc @@ -7,7 +7,7 @@ #include "sidebar.hpp" static void draw_background(UIState *s) { -#ifdef QCOM +#ifndef QT_GUI_LIB const NVGcolor color = COLOR_BLACK_ALPHA(85); #else const NVGcolor color = nvgRGBA(0x39, 0x39, 0x39, 0xff); diff --git a/selfdrive/ui/ui b/selfdrive/ui/ui index d212c92da..d30f91584 100755 --- a/selfdrive/ui/ui +++ b/selfdrive/ui/ui @@ -1,4 +1,11 @@ #!/bin/sh -export LD_LIBRARY_PATH="/system/lib64:$LD_LIBRARY_PATH" -exec ./_ui +export LD_LIBRARY_PATH="/system/lib64:$LD_LIBRARY_PATH" + +if [ -f /EON ]; then + export QT_QPA_EGLFS_HIDECURSOR=1 + export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event1:rotate=270 + export QT_QPA_FONTDIR=../assets/fonts +fi + +exec ./_ui diff --git a/selfdrive/ui/ui.hpp b/selfdrive/ui/ui.hpp index f184ffc5d..0050b55b2 100644 --- a/selfdrive/ui/ui.hpp +++ b/selfdrive/ui/ui.hpp @@ -74,7 +74,7 @@ typedef enum UIStatus { } UIStatus; static std::map bg_colors = { -#ifdef QCOM +#ifndef QT_GUI_LIB {STATUS_OFFROAD, nvgRGBA(0x07, 0x23, 0x39, 0xf1)}, #else {STATUS_OFFROAD, nvgRGBA(0x0, 0x0, 0x0, 0xff)},