lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
UiBusClient.hpp File Reference

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"
Include dependency graph for UiBusClient.hpp:
This graph shows which files directly or indirectly include this file:

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()), должен лишь отличаться от адресов других клиентов на той же общей шине.

Detailed Description

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.