|
lacteApp
C++17 service for Lacte hardware
|
UiBusClient: собственный клиент UI на шине lacte - создаётся и принадлежит самому UiApp (см. More...
#include <Bus.hpp>#include <SubscribeOwned.hpp>#include <algorithm>#include <chrono>#include <cstdint>#include <functional>#include <memory>#include <mutex>#include <optional>#include <string>#include <utility>#include "bus/Envelopes.hpp"#include "bus/ModelBusClient.hpp"Go to the source code of this file.
Classes | |
| class | lacte::bus::UiRuntime |
| UI-состояние, управляемое push-сообщениями от бэкенда (см. More... | |
| class | lacte::bus::UiBusClient |
Namespaces | |
| namespace | lacte |
| namespace | lacte::bus |
Variables | |
| constexpr uint32_t | lacte::bus::K_UI_BUS_ADDRESS = 2 |
| Предпочтительный адрес клиента UI (НЕ собственный own_address_ общей шины, который LacteApp выбирает отдельно) - не обязан быть уникальным в рамках всего приложения (insitech::bus::Hub разрешает конфликты в set_interfaces()), должен лишь отличаться от адресов других клиентов на той же общей шине. | |
UiBusClient: собственный клиент UI на шине lacte - создаётся и принадлежит самому UiApp (см.
UiApp::ConnectBus()), а не передаётся ему LacteApp. LacteApp строит только ОДНУ общую шину insitech::bus::Hub<RX,TX> (см. AppContext::bus) - каждый участник (UI, Model - см. ModelBusClient.hpp, БД - см. Libraries/sqlite/sqlite.hpp's ConnectExternalClient()) строит на ней СВОЙ СОБСТВЕННЫЙ клиент и реализует на нём свои подписки/публикации, вместо того чтобы один общий класс клиента разом знал протокол всех участников.
UiBusClient ЯВЛЯЕТСЯ (is-a) insitech::bus::LocalClient (см. protolib's protocols/bus/Bus.hpp) - его типизированные Publish<Msg>/Subscribe<Msg>/Serve<Req,Reply>/Request<Req,Reply> приходят напрямую из базового класса. Что добавляется сверху - это ВСЯ UI-половина проводного протокола, в обоих направлениях: приём push-сообщений от бэкенда (SubscribeRuntime()) и отправка блокирующих запросов UI (CheckHealth()/SetParam()/GetParam()/GetSnapshot()/ SetTestBoardOnline()) - общих для каждого конкретного UI (ConsoleUi, FramebufferUi), которые все просто вызывают их напрямую на UiApp::Hub() - а также отправка команд/снапшотов В UI (SetUiEnabled()/EnableUi()/DisableUi()/PublishSnapshot()), которые Model вызывает на втором экземпляре UiBusClient, который держит исключительно для этого (см. Model::ConnectBus()). Всё это - знание UI-протокола, поэтому оно живёт здесь независимо от того, какая сторона его вызывает - ModelBusClient нуждается лишь в IHub& и голом факте, что где-то существует клиент UI, но никогда - в собственном проводном формате UI.
Строится через статическую фабрику Create(), а не через публичный конструктор: регистрация подкласса LocalClient на его хостовой шине (см. insitech::bus::IHub::register_local_client()) требует, чтобы объект уже был обёрнут в собственный владеющий shared_ptr, которого ещё не существует внутри тела конструктора - Create() выполняет оба шага в правильном порядке, точно так же как IHub::Connect() делает это для простого, неунаследованного LocalClient.
Definition in file UiBusClient.hpp.