aqc_embedded_doc
README. dm. aQsi Display Manager

Building documentation

Для создания документации сначала установите зависимости (doxygen, doxyqml and dot):

sudo apt install doxygen graphviz doxyqml

Затем создайте документацию:

doxygen ./Doxyfile

Документация будет создана в папке ./doc/html/. Чтобы открыть документацию, откройте файл ./doc/html/pages.html в браузере.

Зависимости

  • Qt 5.12.5
  • hwhelper

Logging Category

Используются категории:

Категория Класс Описание
default - Стандартная категория для сообщений без категории
qml - Стандартная категория для сообщений из qml
aqsi.dm.dm DisplayManager, AppStack Сообщения о действиях, связанные с управлением экрана и графическими приложениями
aqsi.dm.qctests QCTestsModel Сообщения во время прохождения тестов
aqsi.dm.manufacturing Manufacturing Сообщения при производстве (отправке результатов тестирования)
aqsi.dm.can_tester CanTester Сообщения от CanTester в режиме "DeviceIsFactoryTester"
aqsi.dm.rs485tester Rs485Tester Сообщения от Rs485Tester в режиме "DeviceIsFactoryTester"

Правила задаются из строки в параметре DmQtLoggingRules.

https://doc.qt.io/qt-5/qloggingcategory.html#logging-rules

Если в параметре будет пустая строка, то правила будут сброшены к стандартным. Если будет *=true, то будут показываться все сообщения, в том числе некоторые debug, скрытые по-умолчанию.

Описание поведения

Display Manager (DM) оперирует следующими понятиями:

Стек приложений - список из всех приложений, которые запрашивали показ, но еще не завершились. Дублируется в файловой системе, поэтому в случае перезапуска dm информация о том, что должно показываться на экране, останется. На экране отображаетсяя верхнее (последнее) приложение из стека. Если стек пустой, дм пытается показать дефолтное приложение (ждет его появления, в этот момент на экране "пожалуйста, подождите").

Дефолтное приложение - приложение, которое dm пытается показать по-умолчанию. Задается с помощью конфигурационного параметра DefaultAppService. Конфиг по-умолчанию лежит в /mnt/data/aqsi-config.json. Без этого параметра DM не будет работать.

В случае, если приложение крашнулось или завершилось без вызова RequestHide, DM отлавливает эту ситуацию, удаляет приложение из стека, и если оно было верхним, то показывает предыдущее.

Производство - процесс регистрации устройства на серверах aqsi, который проводится в сервисном меню. По завершению производства создается файл **/mnt/data/manufacturing_date**. Если этот файл присутствует в системе, то при старте DM сервисное меню не будет показано.

Display Manager DBus API

Service: org.aqsi.Dm
Object: /
Interface: org.aqsi.Dm

Methods:

bool RequestShow(string service)

service - DBus service name приложения, которое вызывает метод.

Когда клиентское приложение хочет себя показать на экране, оно должно вызвать этот метод, дождаться завершения, и в зависимости от результата либо показать себя, либо нет. Проще говоря, приложение спрашивает у dm таким образом разрешение на показ себя. Случаи, когда Dm может запретить показ:

  1. Если на экране находится сервисное меню. В таком случае он тем не менее у себя зарегистрирует этот вызов, и по закрытию сервисного меню отобразит последнее из приложений, запрашивавших вызов данного метода.
  2. Если приложение вызывает метод, но при этом уже содержится в стеке приложений. Dm не разрешает одному и тому же приложению быть отображенным на экране несколько раз.

bool RequestHide(string path)

Когда клиентское приложение хочет себя скрыть, оно должно вызвать этот метод, и скрыть себя, если разрешение получено. После этого dm покажет на экране предыдущее приложение в стеке. Dm может отказать в скрытии, если себя пытается скрыть дефолтное приложение.

void StartService(bool ask_pin)

Скрывает текущее приложение на экране и отображает сервисное меню. Параметр ask_pin сейчас ни на что на влияет, но в будущем в зависимости от него перед входом в меню будет показан экран ввода пин-кода.

void StopService()

Выходит из сервисного меню и показывает текущее верхнее приложение в стеке.

Чтобы приложение могло работать с dm, оно должно предоставить следующее API:

Application DBus API (на примере vend)

Service: org.aqsi.Vend
Object: /display
Interface: org.aqsi.Vend (такой же как Service)

Methods:

void SetVisible(bool val)

Если val - true, приложение отображается на экране. Иначе скрывается. По сути это обёртка над свойством visible коренного qml объекта в Qt.

Запуск сервисного меню из терминала

dbus-send --system --print-reply --dest=org.aqsi.Dm / org.aqsi.Dm.StartService boolean:false