The driver terminal of Krone’s BiG X 480/580 forage harvester uses dials, info fields, quick-access buttons and status buttons to show about 30+ pieces of information on its home screen. The driver can change some of the information directly on the home screen. The terminal receives up to 250 signals per second from the “machine” over 4 CAN buses. Some of the signals are received up to 100 times per second. Nevertheless, the needles of the dials and the digital numbers must change smoothly.
Moreover, the driver can fine-tune 1000+ parameters of 30 control units. He can perform on-board diagnostics and calibrate parts of the machine. He can dynamically change between languages, measurement units, and day and night mode. The terminal can “count” the harvested area, diesel consumption or the usage hours of the cutting drum or front attachment.
Burkhard was the lead developer for building the driver terminal of Krone’s BiG X 480/580 forage harvester. He worked together with two developers from Krone and an independent UI designer. It took the team 21 months from the first UI design to the product release. A first prototype was ready for a maize harvest after less than three months. The GUI parts of the driver terminal were developed with QML and the non-GUI parts with Qt/C++.
Burkhard will share his first-hand experience from this project and will explain how the team solved some typical challenges of such a project.
(1) The team used a multi-threaded architecture to cope with the load of up to 1000 messages per second from the machine. The communication between the threads is done exclusively with Qt’s signals and slots. Special considerations are needed for singletons.
2) The team faced some QML performance problems. For example, the standard implementation of a screen stack from QtQuick components would require the graphics power of a 4K TV. Or, over-generalised QML delegates, which make unused parts invisible, can render the scrolling of a ListView unusable.
(3) Selecting the right touchscreen display, which is used on a 500 horse-power harvester with “good vibrations” under bright daylight and at night, is quite tricky.
(4) The project started with Qt 4.8 on an Intel-Atom system with Windows XP and without OpenGL acceleration. It then moved to an ARM Cortex-A8 CPU with OpenGL acceleration. It was finally released with Qt 5.1.
(5) The ultimate challenge was to develop the driver terminal with three developers and one UI designer in less than two years. A first prototype had to be available for the maize harvest after three months. Problems found during the 6-weeks window of a harvest season had to be fixed basically over night.
See http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/
onClicked pushes different input dialogs on the page stack depending on the type of pValue (e.g., selection from list, number, time, date). The model will be a different one as well but derived from same base class InputDialogModel.
Note: It is not possible to register EnumListModel* with QVariant (similar to QObject*), because registered types must be copyable. EnumListModel is not copyable as it is derived from QObject. The registration of QObject* with QVariant is done in some internal implementation, which is not an option for us.