SlideShare a Scribd company logo
Hexagonal
Architecture:
The Standard
for Qt
Embedded
HMIs
Burkhard Stubert
Good, Right and Successful Architectures
All architectures
Good architectures
Technically sound
Right architectures
Meeting stakeholder needs
Successful architectures
Delivering value
Hexagonal
Architecture
Start with de-facto standard
architecture and adapt it!
2021/07/08 (C) Burkhard Stubert 2
Ports-and-Adapters
Architecture
About the Importance of Architecture
2021/11/04 (C) Burkhard Stubert 3
2012
2021?
Architecture is like an iceberg. Only 1/10 is visible.
The Titanic disaster teaches us what happens
when we ignore the other 9/10.
Yours truly
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 4
Ports-And-Adapters Architecture: Idea
USB
CAN
RS232
UART
(W)LAN
HDMI
PC
Port
Adapters
• Standardised USB Port
• Many USB-to-X adapters
• Different companies can build
different adapters
2021/11/04 (C) Burkhard Stubert 5
Ports-And-Adapters Architecture: Pattern
• Port = Interface between BL
(inside) and Adapters (outside)
• Adapter = Uses or implements
Port
• 1 Port has N Adapters
• Port same for all adapters
• Code from inside must not leak
to outside and vice versa
• Inside: models, connections
• Outside: Qt SerialBus, SQL, IPC
2021/11/04 (C) Burkhard Stubert 6
Business Logic
(BL)
GuiPort
MachinePort
GUI Test
Machine Simulator Mock
CLI
Product Versions over Time
2021/11/04 (C) Burkhard Stubert 7
Business
Logic
GUI
Machine
CAN
Business
Logic
GUI
Machine
Ethernet
Business
Logic
GUI
Machine
(IPC)
Product v0 Product v1 Product v2
• OTA Updates
• Ethernet instead of CAN
• Remote diagnostic
and support
• Message processing
in separate process
Development and Test Versions
2021/11/04 (C) Burkhard Stubert 8
Business
Logic
GUI
Test
Machine
Mock
Development Testing GUI
in system context
Business
Logic
GUI
Machine
Simulator
Business
Logic
GUI
Mock
Machine
Mock
Testing Updates
in system context
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 9
Application Hexagon
Architecturally Significant Requirements
2021/11/04 (C) Burkhard Stubert 10
Engine
ECU
Machine
EngineTwin
BL
MainModel
GUI
MainView
Driver
CAN
Frame
Quantity
Object
Quantity 930 rpm
• Requirement
• GUI shows current engine speed.
• Constraints
• Neither GUI nor BL know that
Machine uses CAN
• BL provides C++ models for QML GUI
• GUI must not depend on Machine
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 11
Machine Port with Product Adapter (CAN)
2021/11/04 (C) Burkhard Stubert 12
In product_machine.h:
QCanBusDevice *m_canBus{QCanBus::instance()
->createDevice("socketcan", "can0")};
CanBusRouter m_router{m_canBus};
EngineTwin m_engine;
In product_machine.cpp:
ProductMachine::ProductMachine()
: Machine{}
{
QObject::connect(
&m_router, &CanBusRouter::newEngineQuantities,
&m_engine, &EngineTwin::updateQuantities);
In BusinessLogic:
Machine::engine()
Engine ECU
QCanBusDevice
CanBusRouter
EngineTwin
Business Logic
can0
Machine
SocketCAN frame
QCanBusFrame
Quantity
Quantity
Quantity
Machine Port with Simulator Adapter
2021/11/04 (C) Burkhard Stubert 13
In simulator_machine.h:
CanBusSimulator m_simulator;
MockCanBusDevice m_canBus;
CanBusRouter m_router{&m_canBus};
EngineTwin m_engine;
In simulator_machine.cpp:
SimulatorMachine::SimulatorMachine()
: Machine{}
{
QObject::connect(
&m_simulator, &CanBusSimulator::newIncomingFrames,
&m_canBus, &EngineTwin::appendIncomingFrames);
QObject::connect(
&m_router, &CanBusRouter::newEngineQuantities,
&m_engine, &EngineTwin::updateQuantities);
In BusinessLogic:
Machine::engine()
CanBusSimulator
MockCanBusDevice
CanBusRouter
EngineTwin
Business Logic
Machine
QCanBusFrame
QCanBusFrame
Quantity
Quantity
Quantity
Test Adapter
2021/11/04 (C) Burkhard Stubert 14
In Machine Test:
Machine::engine()
MockCanBusDevice
CanBusRouter
EngineTwin
Machine Test
Machine
QCanBusFrame
QCanBusFrame
Quantity
Quantity
Quantity
Product Adapter (MQTT)
In BusinessLogic:
Machine::engine()
Engine ECU
QNetworkInterface
MqttRouter
EngineTwin
Business Logic
eth0
Machine
MQTT frame
QMqttMessage
Quantity
Quantity
Quantity
Creating the Machine Component
2021/11/04 (C) Burkhard Stubert 15
In machine_creator.cpp:
Machine *createMachine(Machine::Configuration conf)
{
switch (conf) {
case Machine::Configuration::Product:
return new ProductMachine{};
case Machine::Configuration::Simulator:
return new SimulatorMachine{};
...
Use createMachine in main()
Running Adapter in Thread, Process, MCU
Business Logic
MachinePort
Qt CanBus
can0 can1
Business Logic
MachinePort
Qt CanBus
can0 can1
Thread
CAN0
Thread
CAN1
Qt Signal-Slot Conn.
Business Logic
MachinePort
CAN Bus
can0 can1
Thread
CAN0
Thread
CAN1
Qt Remote
Objects
Task
CAN0
Task
CAN1
RPMsg
Process
1
on
A53
Process
1
on
A53
Process
2
on
A53
Process
1
on
A53
2
Tasks
on
M4
2021/11/04 (C) Burkhard Stubert 16
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 17
Business Logic
2021/11/04 (C) Burkhard Stubert 18
In business_logic.h:
Q_PROPERTY(MainModel *mainModel READ mainModel CONSTANT)
BusinessLogic(std::shared_ptr<Machine> machine, ...
, m_machine{machine}
In business_logic.cpp:
MainModel *BusinessLogic::mainModel()
{
if (m_mainModel == nullptr) {
m_mainModel = new MainModel{this};
connect(m_machine->engine(), &EngineTwin::engineSpeed,
m_mainModel, &MainModel::setEngineSpeed);
}
return m_mainModel;
}
In MainView.qml:
BusinessLogic.mainModel
GUI
Business Logic
Machine
EngineTwin
MainModel
BusinessLogic available
as singleton in GUI
with models as properties
if (m_mainModel == nullptr) { m_mainModel = new MainModel{this}; connect(m_machine->engine(), &EngineTwin::engineSpeed, m_mainModel, &MainModel::setEngineSpeed); } return m_mainModel;
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 19
GUI with Product Adapter (QML GUI)
2021/11/04 (C) Burkhard Stubert 20
In MainView.qml:
import EmUse.Models
Pane
{
property MainModel model: BusinessLogic.mainModel
Text
{
text: Number(model.engineSpeed.value).toFixed(0)
}
Text
{
text: model.engineSpeed.unit
}
MainView
Business Logic
Machine
EngineTwin
MainModel
GUI Port with Test Adapter
2021/11/04 (C) Burkhard Stubert 21
void TestMainView::init()
{
m_machine = std::make_shared<Machine>(
createMachine(Machine::Configuration::Mock));
m_businessLogic = new BusinessLogic{m_machine};
m_model = m_businessLogic->mainModel();
}
void TestMainView::testEngineSpeed()
{
Quantity rpm{930.0, "rpm"};
emit m_machine->engine()->engineSpeed(rpm);
QCOMPARE(m_model->engineSpeed()->quantity(), rpm);
}
TestMainView
Business Logic
Machine
EngineTwin
MainModel
Testing GUI in system context
• with actual BusinessLogic
• with mocks for Machine objects
Mocks reused from unit tests of
Machine and EngineTwin
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 22
Composition Root main()
2021/11/04 (C) Burkhard Stubert 23
int main(int argc, char *argv[])
{
std::shared_ptr<Machine> machine{
createMachine(Machine::Configuration::Product);
};
std::shared_ptr<BusinessLogic> businessLogic{
new BusinessLogic{machine}
};
QQmlApplicationEngine appEngine;
appEngine.load(u"qrc:/main.qml"_qs);
return app.exec();
}
Agenda
• Ports-and-Adapters Architecture
• Significant Requirements
• Machine Component
• Business Logic
• GUI Component
• Creating the Hexagon
• Conclusion
2021/11/04 (C) Burkhard Stubert 24
Pros and Cons of Hexagonal Architecture
• High testability
• High modularity
• High modifiability
• High maintainability
2021/11/04 (C) Burkhard Stubert 25
Pros
• Additional complexity
Cons
Succesful architecture for Qt embedded HMIs:
Hexagonal Architecture
Resources
• Alistair Cockburn: Hexagonal Architecture. Original description of the
Hexagonal Architecture pattern.
• Juan Manuel Garrido de Paz: Ports and Adapters Pattern (Hexagonal
Architecture). Detailed explanation of the pattern.
• Burkhard Stubert: A Successful Architecture for Qt Embedded
Systems. My talk at QtDay Italy 2021.
• Burkhard Stubert: Source code for this talk.
2021/11/04 (C) Burkhard Stubert 26
🙏 Thank You 🙏
Mail: burkhard.stubert@embeddeduse.com
Web: https://embeddeduse.com
Newsletter: http://eepurl.com/gOMQoX

More Related Content

What's hot

SFO15-200: Linux kernel generic TEE driver
SFO15-200: Linux kernel generic TEE driverSFO15-200: Linux kernel generic TEE driver
SFO15-200: Linux kernel generic TEE driver
Linaro
 
HKG18-402 - Build secure key management services in OP-TEE
HKG18-402 - Build secure key management services in OP-TEEHKG18-402 - Build secure key management services in OP-TEE
HKG18-402 - Build secure key management services in OP-TEE
Linaro
 
Introduction Linux Device Drivers
Introduction Linux Device DriversIntroduction Linux Device Drivers
Introduction Linux Device Drivers
NEEVEE Technologies
 
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEEBKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
Linaro
 
HKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting ReviewHKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting Review
Linaro
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver
艾鍗科技
 
linux device driver
linux device driverlinux device driver
linux device driver
Rahul Batra
 
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
linuxlab_conf
 
Linux device drivers
Linux device driversLinux device drivers
Linux device drivers
Abhishek Sagar
 
LCA14: LCA14-502: The way to a generic TrustZone® solution
LCA14: LCA14-502: The way to a generic TrustZone® solutionLCA14: LCA14-502: The way to a generic TrustZone® solution
LCA14: LCA14-502: The way to a generic TrustZone® solution
Linaro
 
Introduction to char device driver
Introduction to char device driverIntroduction to char device driver
Introduction to char device driver
Vandana Salve
 
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
Linaro
 
Enabling Applications to Exploit SmartNICs and FPGAs
Enabling Applications to Exploit SmartNICs and FPGAsEnabling Applications to Exploit SmartNICs and FPGAs
Enabling Applications to Exploit SmartNICs and FPGAs
inside-BigData.com
 
Linux device drivers
Linux device drivers Linux device drivers
Develop Your Own Operating Systems using Cheap ARM Boards
Develop Your Own Operating Systems using Cheap ARM BoardsDevelop Your Own Operating Systems using Cheap ARM Boards
Develop Your Own Operating Systems using Cheap ARM Boards
National Cheng Kung University
 
Linux Device Tree
Linux Device TreeLinux Device Tree
Linux Device Tree
艾鍗科技
 
Introduction to Optee (26 may 2016)
Introduction to Optee (26 may 2016)Introduction to Optee (26 may 2016)
Introduction to Optee (26 may 2016)
Yannick Gicquel
 
Linux fundamental - Chap 12 Hardware Management
Linux fundamental - Chap 12 Hardware ManagementLinux fundamental - Chap 12 Hardware Management
Linux fundamental - Chap 12 Hardware Management
Kenny (netman)
 
U Boot or Universal Bootloader
U Boot or Universal BootloaderU Boot or Universal Bootloader
U Boot or Universal Bootloader
Satpal Parmar
 
Linux Ethernet device driver
Linux Ethernet device driverLinux Ethernet device driver
Linux Ethernet device driver
艾鍗科技
 

What's hot (20)

SFO15-200: Linux kernel generic TEE driver
SFO15-200: Linux kernel generic TEE driverSFO15-200: Linux kernel generic TEE driver
SFO15-200: Linux kernel generic TEE driver
 
HKG18-402 - Build secure key management services in OP-TEE
HKG18-402 - Build secure key management services in OP-TEEHKG18-402 - Build secure key management services in OP-TEE
HKG18-402 - Build secure key management services in OP-TEE
 
Introduction Linux Device Drivers
Introduction Linux Device DriversIntroduction Linux Device Drivers
Introduction Linux Device Drivers
 
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEEBKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
BKK16-110 A Gentle Introduction to Trusted Execution and OP-TEE
 
HKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting ReviewHKG15-311: OP-TEE for Beginners and Porting Review
HKG15-311: OP-TEE for Beginners and Porting Review
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver
 
linux device driver
linux device driverlinux device driver
linux device driver
 
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
Marco Cavallini - Yocto Project, an automatic generator of embedded Linux dis...
 
Linux device drivers
Linux device driversLinux device drivers
Linux device drivers
 
LCA14: LCA14-502: The way to a generic TrustZone® solution
LCA14: LCA14-502: The way to a generic TrustZone® solutionLCA14: LCA14-502: The way to a generic TrustZone® solution
LCA14: LCA14-502: The way to a generic TrustZone® solution
 
Introduction to char device driver
Introduction to char device driverIntroduction to char device driver
Introduction to char device driver
 
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
BKK16-201 Play Ready OPTEE Integration with Secure Video Path lhg-1
 
Enabling Applications to Exploit SmartNICs and FPGAs
Enabling Applications to Exploit SmartNICs and FPGAsEnabling Applications to Exploit SmartNICs and FPGAs
Enabling Applications to Exploit SmartNICs and FPGAs
 
Linux device drivers
Linux device drivers Linux device drivers
Linux device drivers
 
Develop Your Own Operating Systems using Cheap ARM Boards
Develop Your Own Operating Systems using Cheap ARM BoardsDevelop Your Own Operating Systems using Cheap ARM Boards
Develop Your Own Operating Systems using Cheap ARM Boards
 
Linux Device Tree
Linux Device TreeLinux Device Tree
Linux Device Tree
 
Introduction to Optee (26 may 2016)
Introduction to Optee (26 may 2016)Introduction to Optee (26 may 2016)
Introduction to Optee (26 may 2016)
 
Linux fundamental - Chap 12 Hardware Management
Linux fundamental - Chap 12 Hardware ManagementLinux fundamental - Chap 12 Hardware Management
Linux fundamental - Chap 12 Hardware Management
 
U Boot or Universal Bootloader
U Boot or Universal BootloaderU Boot or Universal Bootloader
U Boot or Universal Bootloader
 
Linux Ethernet device driver
Linux Ethernet device driverLinux Ethernet device driver
Linux Ethernet device driver
 

Similar to Hexagonal Architecture: The Standard for Qt Embedded Applications

Ports-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMIPorts-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMI
Burkhard Stubert
 
[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt
[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt
[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt
ICS
 
CURRICULUM VITAE_Balu
CURRICULUM VITAE_BaluCURRICULUM VITAE_Balu
CURRICULUM VITAE_Balubalakrishna H
 
UNIT 1.pdf
UNIT 1.pdfUNIT 1.pdf
UNIT 1.pdf
SenthilkumarKR5
 
UNIT 1.pptx
UNIT 1.pptxUNIT 1.pptx
UNIT 1.pptx
SenthilkumarKR5
 
CADISON world Issue-1-2013
CADISON world Issue-1-2013CADISON world Issue-1-2013
CADISON world Issue-1-2013
CADISON
 
Bikram Jeet (Achievements from 2006 - 2013)
Bikram Jeet (Achievements from 2006 - 2013)Bikram Jeet (Achievements from 2006 - 2013)
Bikram Jeet (Achievements from 2006 - 2013)
Bikram Jeet
 
Mechatronics engineer
Mechatronics engineerMechatronics engineer
Mechatronics engineer
Samuel Narcisse
 
Cadison world-issue-01-2013
Cadison world-issue-01-2013Cadison world-issue-01-2013
Cadison world-issue-01-2013CADISON
 
GPGPU using CUDA Thrust
GPGPU using CUDA ThrustGPGPU using CUDA Thrust
GPGPU using CUDA Thrust
Nicola Pezzotti
 
OpenMP-OpenACC-Offload-Cauldron2022-1.pdf
OpenMP-OpenACC-Offload-Cauldron2022-1.pdfOpenMP-OpenACC-Offload-Cauldron2022-1.pdf
OpenMP-OpenACC-Offload-Cauldron2022-1.pdf
ssuser866937
 
ECAD-MCAD Presentation 2011
ECAD-MCAD Presentation 2011ECAD-MCAD Presentation 2011
ECAD-MCAD Presentation 2011
Altium
 
A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...
A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...
A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...
Igalia
 
Basic Cmake for Qt Users
Basic Cmake for Qt UsersBasic Cmake for Qt Users
Basic Cmake for Qt Users
ICS
 
Modeling presentation
Modeling presentationModeling presentation
Modeling presentationAditya Dahal
 
Cad automation of electrical busbar
Cad automation of electrical busbarCad automation of electrical busbar
Cad automation of electrical busbar
Parthiban Kannan
 
Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...
Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...
Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...
Intland Software GmbH
 
Sprint 140
Sprint 140Sprint 140
Sprint 140
ManageIQ
 
Realize 2022 MINO 7 year of implementation v0.1.pptx
Realize 2022 MINO 7 year of implementation v0.1.pptxRealize 2022 MINO 7 year of implementation v0.1.pptx
Realize 2022 MINO 7 year of implementation v0.1.pptx
jakobkuhn
 

Similar to Hexagonal Architecture: The Standard for Qt Embedded Applications (20)

Ports-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMIPorts-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMI
 
[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt
[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt
[Webinar] QtSerialBus: Using Modbus and CAN bus with Qt
 
CURRICULUM VITAE_Balu
CURRICULUM VITAE_BaluCURRICULUM VITAE_Balu
CURRICULUM VITAE_Balu
 
UNIT 1.pdf
UNIT 1.pdfUNIT 1.pdf
UNIT 1.pdf
 
UNIT 1.pptx
UNIT 1.pptxUNIT 1.pptx
UNIT 1.pptx
 
CADISON world Issue-1-2013
CADISON world Issue-1-2013CADISON world Issue-1-2013
CADISON world Issue-1-2013
 
Bikram Jeet (Achievements from 2006 - 2013)
Bikram Jeet (Achievements from 2006 - 2013)Bikram Jeet (Achievements from 2006 - 2013)
Bikram Jeet (Achievements from 2006 - 2013)
 
Mechatronics engineer
Mechatronics engineerMechatronics engineer
Mechatronics engineer
 
Cadison world-issue-01-2013
Cadison world-issue-01-2013Cadison world-issue-01-2013
Cadison world-issue-01-2013
 
GPGPU using CUDA Thrust
GPGPU using CUDA ThrustGPGPU using CUDA Thrust
GPGPU using CUDA Thrust
 
OpenMP-OpenACC-Offload-Cauldron2022-1.pdf
OpenMP-OpenACC-Offload-Cauldron2022-1.pdfOpenMP-OpenACC-Offload-Cauldron2022-1.pdf
OpenMP-OpenACC-Offload-Cauldron2022-1.pdf
 
ECAD-MCAD Presentation 2011
ECAD-MCAD Presentation 2011ECAD-MCAD Presentation 2011
ECAD-MCAD Presentation 2011
 
A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...
A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...
A Browser for the Automotive: Introduction to WebKit for Wayland (Automotive ...
 
Basic Cmake for Qt Users
Basic Cmake for Qt UsersBasic Cmake for Qt Users
Basic Cmake for Qt Users
 
JAYACHANDRA RESUME
JAYACHANDRA RESUMEJAYACHANDRA RESUME
JAYACHANDRA RESUME
 
Modeling presentation
Modeling presentationModeling presentation
Modeling presentation
 
Cad automation of electrical busbar
Cad automation of electrical busbarCad automation of electrical busbar
Cad automation of electrical busbar
 
Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...
Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...
Bertrandt | Automotive Best Practice: How to Design, Review, Approve, and Eff...
 
Sprint 140
Sprint 140Sprint 140
Sprint 140
 
Realize 2022 MINO 7 year of implementation v0.1.pptx
Realize 2022 MINO 7 year of implementation v0.1.pptxRealize 2022 MINO 7 year of implementation v0.1.pptx
Realize 2022 MINO 7 year of implementation v0.1.pptx
 

Recently uploaded

Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
Globus
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 

Recently uploaded (20)

Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
GlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote sessionGlobusWorld 2024 Opening Keynote session
GlobusWorld 2024 Opening Keynote session
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 

Hexagonal Architecture: The Standard for Qt Embedded Applications

  • 2. Good, Right and Successful Architectures All architectures Good architectures Technically sound Right architectures Meeting stakeholder needs Successful architectures Delivering value Hexagonal Architecture Start with de-facto standard architecture and adapt it! 2021/07/08 (C) Burkhard Stubert 2 Ports-and-Adapters Architecture
  • 3. About the Importance of Architecture 2021/11/04 (C) Burkhard Stubert 3 2012 2021? Architecture is like an iceberg. Only 1/10 is visible. The Titanic disaster teaches us what happens when we ignore the other 9/10. Yours truly
  • 4. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 4
  • 5. Ports-And-Adapters Architecture: Idea USB CAN RS232 UART (W)LAN HDMI PC Port Adapters • Standardised USB Port • Many USB-to-X adapters • Different companies can build different adapters 2021/11/04 (C) Burkhard Stubert 5
  • 6. Ports-And-Adapters Architecture: Pattern • Port = Interface between BL (inside) and Adapters (outside) • Adapter = Uses or implements Port • 1 Port has N Adapters • Port same for all adapters • Code from inside must not leak to outside and vice versa • Inside: models, connections • Outside: Qt SerialBus, SQL, IPC 2021/11/04 (C) Burkhard Stubert 6 Business Logic (BL) GuiPort MachinePort GUI Test Machine Simulator Mock CLI
  • 7. Product Versions over Time 2021/11/04 (C) Burkhard Stubert 7 Business Logic GUI Machine CAN Business Logic GUI Machine Ethernet Business Logic GUI Machine (IPC) Product v0 Product v1 Product v2 • OTA Updates • Ethernet instead of CAN • Remote diagnostic and support • Message processing in separate process
  • 8. Development and Test Versions 2021/11/04 (C) Burkhard Stubert 8 Business Logic GUI Test Machine Mock Development Testing GUI in system context Business Logic GUI Machine Simulator Business Logic GUI Mock Machine Mock Testing Updates in system context
  • 9. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 9
  • 10. Application Hexagon Architecturally Significant Requirements 2021/11/04 (C) Burkhard Stubert 10 Engine ECU Machine EngineTwin BL MainModel GUI MainView Driver CAN Frame Quantity Object Quantity 930 rpm • Requirement • GUI shows current engine speed. • Constraints • Neither GUI nor BL know that Machine uses CAN • BL provides C++ models for QML GUI • GUI must not depend on Machine
  • 11. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 11
  • 12. Machine Port with Product Adapter (CAN) 2021/11/04 (C) Burkhard Stubert 12 In product_machine.h: QCanBusDevice *m_canBus{QCanBus::instance() ->createDevice("socketcan", "can0")}; CanBusRouter m_router{m_canBus}; EngineTwin m_engine; In product_machine.cpp: ProductMachine::ProductMachine() : Machine{} { QObject::connect( &m_router, &CanBusRouter::newEngineQuantities, &m_engine, &EngineTwin::updateQuantities); In BusinessLogic: Machine::engine() Engine ECU QCanBusDevice CanBusRouter EngineTwin Business Logic can0 Machine SocketCAN frame QCanBusFrame Quantity Quantity Quantity
  • 13. Machine Port with Simulator Adapter 2021/11/04 (C) Burkhard Stubert 13 In simulator_machine.h: CanBusSimulator m_simulator; MockCanBusDevice m_canBus; CanBusRouter m_router{&m_canBus}; EngineTwin m_engine; In simulator_machine.cpp: SimulatorMachine::SimulatorMachine() : Machine{} { QObject::connect( &m_simulator, &CanBusSimulator::newIncomingFrames, &m_canBus, &EngineTwin::appendIncomingFrames); QObject::connect( &m_router, &CanBusRouter::newEngineQuantities, &m_engine, &EngineTwin::updateQuantities); In BusinessLogic: Machine::engine() CanBusSimulator MockCanBusDevice CanBusRouter EngineTwin Business Logic Machine QCanBusFrame QCanBusFrame Quantity Quantity Quantity
  • 14. Test Adapter 2021/11/04 (C) Burkhard Stubert 14 In Machine Test: Machine::engine() MockCanBusDevice CanBusRouter EngineTwin Machine Test Machine QCanBusFrame QCanBusFrame Quantity Quantity Quantity Product Adapter (MQTT) In BusinessLogic: Machine::engine() Engine ECU QNetworkInterface MqttRouter EngineTwin Business Logic eth0 Machine MQTT frame QMqttMessage Quantity Quantity Quantity
  • 15. Creating the Machine Component 2021/11/04 (C) Burkhard Stubert 15 In machine_creator.cpp: Machine *createMachine(Machine::Configuration conf) { switch (conf) { case Machine::Configuration::Product: return new ProductMachine{}; case Machine::Configuration::Simulator: return new SimulatorMachine{}; ... Use createMachine in main()
  • 16. Running Adapter in Thread, Process, MCU Business Logic MachinePort Qt CanBus can0 can1 Business Logic MachinePort Qt CanBus can0 can1 Thread CAN0 Thread CAN1 Qt Signal-Slot Conn. Business Logic MachinePort CAN Bus can0 can1 Thread CAN0 Thread CAN1 Qt Remote Objects Task CAN0 Task CAN1 RPMsg Process 1 on A53 Process 1 on A53 Process 2 on A53 Process 1 on A53 2 Tasks on M4 2021/11/04 (C) Burkhard Stubert 16
  • 17. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 17
  • 18. Business Logic 2021/11/04 (C) Burkhard Stubert 18 In business_logic.h: Q_PROPERTY(MainModel *mainModel READ mainModel CONSTANT) BusinessLogic(std::shared_ptr<Machine> machine, ... , m_machine{machine} In business_logic.cpp: MainModel *BusinessLogic::mainModel() { if (m_mainModel == nullptr) { m_mainModel = new MainModel{this}; connect(m_machine->engine(), &EngineTwin::engineSpeed, m_mainModel, &MainModel::setEngineSpeed); } return m_mainModel; } In MainView.qml: BusinessLogic.mainModel GUI Business Logic Machine EngineTwin MainModel BusinessLogic available as singleton in GUI with models as properties if (m_mainModel == nullptr) { m_mainModel = new MainModel{this}; connect(m_machine->engine(), &EngineTwin::engineSpeed, m_mainModel, &MainModel::setEngineSpeed); } return m_mainModel;
  • 19. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 19
  • 20. GUI with Product Adapter (QML GUI) 2021/11/04 (C) Burkhard Stubert 20 In MainView.qml: import EmUse.Models Pane { property MainModel model: BusinessLogic.mainModel Text { text: Number(model.engineSpeed.value).toFixed(0) } Text { text: model.engineSpeed.unit } MainView Business Logic Machine EngineTwin MainModel
  • 21. GUI Port with Test Adapter 2021/11/04 (C) Burkhard Stubert 21 void TestMainView::init() { m_machine = std::make_shared<Machine>( createMachine(Machine::Configuration::Mock)); m_businessLogic = new BusinessLogic{m_machine}; m_model = m_businessLogic->mainModel(); } void TestMainView::testEngineSpeed() { Quantity rpm{930.0, "rpm"}; emit m_machine->engine()->engineSpeed(rpm); QCOMPARE(m_model->engineSpeed()->quantity(), rpm); } TestMainView Business Logic Machine EngineTwin MainModel Testing GUI in system context • with actual BusinessLogic • with mocks for Machine objects Mocks reused from unit tests of Machine and EngineTwin
  • 22. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 22
  • 23. Composition Root main() 2021/11/04 (C) Burkhard Stubert 23 int main(int argc, char *argv[]) { std::shared_ptr<Machine> machine{ createMachine(Machine::Configuration::Product); }; std::shared_ptr<BusinessLogic> businessLogic{ new BusinessLogic{machine} }; QQmlApplicationEngine appEngine; appEngine.load(u"qrc:/main.qml"_qs); return app.exec(); }
  • 24. Agenda • Ports-and-Adapters Architecture • Significant Requirements • Machine Component • Business Logic • GUI Component • Creating the Hexagon • Conclusion 2021/11/04 (C) Burkhard Stubert 24
  • 25. Pros and Cons of Hexagonal Architecture • High testability • High modularity • High modifiability • High maintainability 2021/11/04 (C) Burkhard Stubert 25 Pros • Additional complexity Cons Succesful architecture for Qt embedded HMIs: Hexagonal Architecture
  • 26. Resources • Alistair Cockburn: Hexagonal Architecture. Original description of the Hexagonal Architecture pattern. • Juan Manuel Garrido de Paz: Ports and Adapters Pattern (Hexagonal Architecture). Detailed explanation of the pattern. • Burkhard Stubert: A Successful Architecture for Qt Embedded Systems. My talk at QtDay Italy 2021. • Burkhard Stubert: Source code for this talk. 2021/11/04 (C) Burkhard Stubert 26
  • 27. 🙏 Thank You 🙏 Mail: burkhard.stubert@embeddeduse.com Web: https://embeddeduse.com Newsletter: http://eepurl.com/gOMQoX

Editor's Notes

  1. Fairbanks: “Presumptive architectures are usually successful.” Good = efficient Right = effective Successful = valuable
  2. Lets transfer the hardware idea into software
  3. The PC with its USB ports becomes the business logic with several APIs or ports If we unfold the adapter-BL-adapter paths of the hexagon, we get multiple instances of 3-layer architecture
  4. The rest of the application does not notice that different ways of communications are used with machine. Remote Diagnostic/Support is just a remote GUI. Remote diagnostic could be mirrored on-board (in the GUI).
  5. This single requirement drives the architecture. Abstraction increases from left to right.
  6. ProductMachine implements the Machine interface CanBusRouter - routes messages to correct ECU twins - decodes/encodes CAN frames to/from Quantities
  7. SimulatorMachine implements the Machine interface Can be used for playing back recorded CAN traces
  8. Use #ifdef’s to get non-product relevant code out the application binary.
  9. Motivation: Avoid GUI freezes & stuttering, avoid buffer overflows How and where CAN adapters run does not matter! MachineAPI is always the same!
  10. The dependency Machine is injected in the constructor. Remove dependency on Machine, if we create ALL models in advance (none on the fly). Performance penalty!
  11. If we start reimplementing parts of MainView.qml in the test, we are violating the model-view pattern!!! Create CLI in similar way!
  12. High testability: “built-in” system and component tests based on unit tests Everything else follows from this!!! High modularity: Different teams develop different components High modifiability: Change adapters without rest of system knowing. Follows open-closed principle High maintainability: Bugs are local to component.