25
Octobre 2016 « Qt5 pour l'embarqué » Pierre-Jean TEXIER

Qt5 embedded

Embed Size (px)

Citation preview

Page 1: Qt5 embedded

Octobre 2016

« Qt5 pour l'embarqué »

Pierre-Jean TEXIER

Page 2: Qt5 embedded

2

Présentation

● Ingénieur Linux Embarqué (Amplitude Systèmes)

● Co-auteur « Yocto for Raspberry-Pi  »

● Co-Auteur Open Silicium

● « FOSS » enthusiast

Page 3: Qt5 embedded

3

Qt5 : Quesako ?!

– Prononcé : /kju t/ Cute et non pas QTː →

– Première version en 1996 (trolltech) Achat par Nokia en 2008 Qt5 en 2012 (Digia)→ →

– Pour créer des GUI mais pas que …

● Différentiation au fil des releases (port série, bus CAN, Network, …)

– Un ensemble de librairies et d'outils

● On parlera de framework !

– Cross Platform

Page 4: Qt5 embedded

4

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Page 5: Qt5 embedded

5

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Brique de base : le core !

Page 6: Qt5 embedded

6

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Brique IHM !

Page 7: Qt5 embedded

7

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Brique pour l'intégrationdes bases de données

Page 8: Qt5 embedded

8

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Brique d'abstraction pourla programmation réseau (UDP, TCP, ...)

Page 9: Qt5 embedded

9

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Brique pour la gestion dynamique et la customisation

d'interface

Page 10: Qt5 embedded

10

Qt5 : ArchitectureArchitecture Qt5

Essentials

Qt GUI

Add-ons

...

Qt Core

Qt ConcurrentQt D-Bus

Qt 3D

Qt NFC

Qt Serial Port

Qt Bluetooth

Qt SVG

Qt Location

Qt Serial Bus

Qt Multimedia Widgets

Qt Multimedia Qt QML Qt Quick

Qt Network

Qt Quick Controls

Qt SQL

...

Tools

Qt Designer

Qt Creator

...

Page 11: Qt5 embedded

11

Qt5 : Architecture

– Qt n'utilise pas d'autotools mais un outils « maison » qmake

● Il faut donc l'adapter pour du développement croisée

● Tout se passe dans le répertoire mkspecs :

– Raspberry-pi (1/2/3)– i.MX6 – i.MX7– Jetson TK1– ...

● Fichiers :

– qmake.conf– qplatformdefs.h 

Options du compilateur, backend graphique, ...

Définition de la plateforme (#include,

#define)

Automatise la génération de Makefile (*.pro)

Page 12: Qt5 embedded

12

Qt5 : les +● L'aspect affichage (QWS → QPA) : Plus de notion de Client/Serveur Couche d'abstraction plus au niveau (+ de plate-→

formes) 

– Depuis Qt5 → QPA = devices/OS abstraction (meilleure gestion des plateformes et systèmes de fenêtrage)

– L'affichage en lui-même linuxFB (quand pas de GPU), EGLFS, Wayland, ...→

● Exemple :

$ ./my­qt5­app ­platform linuxfb (par défaut : /dev/fb0)

$ ./my­qt5­app ­platform linuxfb:fb=/dev/fb2

ou encore

$ ./my­qt5­app ­platform eglfs

Page 13: Qt5 embedded

13

Qt5 : les +

L'aspect event (souris, clavier, tactile)

– Plugin Input

● evdev Au travers du pilote noyau : → /dev/input/event*

Helpers : – libinput, (alternative au plugin evdev de Qt)

– tslib, pour du résistif par exemple● Calibration via l'utilitaire ts_calibrate● Fichier de calibration dans /etc pointercal→

– evedevtouch (pour le multi-touch)

Page 14: Qt5 embedded

14

Qt5 : les +

● Exemple :

$ ./my­qt5­app ­platform linuxfb ­plugin evedevtouch

● Pour EGLFS (sans libinput)

– Exemple : QT_QPA_PLATFORM=eglfs– On passera par les variables d'env :

● QT_QPA_EVDEV_MOUSE_PARAMETERS,● QT_QPA_EVDEV_KEYBOARD_PARAMETERS,● QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS

– Exemple  :

QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0

● Pour logger les « event » :

export QT_LOGGING_RULES=qt.qpa.*=true

Page 15: Qt5 embedded

15

Qt5 : Compilation de Qt 1/2● Les besoins :

– Une « cross-toolchain » => ct-ng, Linaro, Build-system, ...

– un sysroot => Le root filesystem

● Choix de la cible :

$ ls ­l <qt­sources>/qtbase/mkspecs/devices/

● Prenons l'exemple pour linux­imx6­g++

● L'étape du « configure » => mais aucun rapport avec les Autotools !

$ ./configure ­v ­release \

­device linux­imx6­g++ \

­device­option CROSS_COMPILE=<toolchain­path> \

­sysroot <rootfs­path> \

­prefix <install­path>

Page 16: Qt5 embedded

16

Qt5 : Compilation de Qt 2/2Configure summary

Building on:   linux­g++ (x86_64, CPU features: mmx sse sse2)

Building for:  devices/linux­imx6­g++ (arm, CPU features: neon)

QPA backends: 

  ...

    EGLFS ................ yes

      EGLFS i.MX6 ........ yes

      EGLFS i.MX6 Wayland. no

      EGLFS EGLDevice .... no

      ...

      EGLFS Raspberry Pi . no

    LinuxFB .............. yes

   ...

● Et pour compiler !!!! Il suffit de lancer la commande de compilation→

– $ make ­j(nb processors)

– $ make install

Page 17: Qt5 embedded

17

Qt5 : QtCreator

● Création du Kit (Outils > Options > Compiler et Exécuter)

Page 18: Qt5 embedded

18

Qt5 : QtCreator

● Périphérique de déploiement : « permet de déployer le binaire sur la cible » (sftp)

● Dans le .pro :

target.path= /usr/bin

INSTALLS += target

● Test de communication

Where ?

Page 19: Qt5 embedded

19

Qt5 : Build System

● Buildroot

– $ make freescale_imx6qsabresd_defconfig

– $ make xconfig

– Notion de firmware

Page 20: Qt5 embedded

20

Qt5 : Build System

● Yocto/Open Embedded– Intégration de la meta­qt5 (fichier bblayers.conf)

→ https://github.com/meta-qt5/meta-qt5

– Pour générer une toochain générique :

$ bitbake meta­toolchain­qt5

● Aura pour effet de générer un sdk relogeable (32 bits ou 64 bits)

– On pourra intégrer les éléments à l'image de cette manière :

IMAGE_INSTALL += "\

qtbase qtconnectivity \

"

Page 21: Qt5 embedded

21

Démo 1 : présentation

● WaRP7 en mode AP (Access point) :

– Dnsmasq pour l'attribution des IP

– Hostapd pour la configuration du point d'accès (ssid=warp7 / passphrase=iotonwarp7)

QHostAddress::Broadcast

Page 22: Qt5 embedded

22

Démo 1 : fichier .pro

QT += core network

QT -= gui

TEMPLATE = app

TARGET = WaRP7_Broadcast

CONFIG += console

SOURCES += main.cpp\

CWaRP7Broadcast.cpp

HEADERS += \

CWaRP7Broadcast.h

target.path= /usr/bin

INSTALLS += target

Nos module

GUI ?!

Makefile pour application

La cible, notre binaire !

Chemin d'installation sur la cible

Fichiers du projet

Page 23: Qt5 embedded

23

Démo 2

● Pour intégrer le module buletooth

QT += core bluetooth

Page 24: Qt5 embedded

24

Conclusion

● https://github.com/texierp/meetup_linux-embedded_bdx/tree/master/18-Octobre/Qt5

Page 25: Qt5 embedded

25

Questions ?

Contact : [email protected]