42#include <SubscribeOwned.hpp>
93 std::scoped_lock lock(m_mutex_);
111 std::scoped_lock lock(m_mutex_);
112 m_aeration_ = clamped;
114 if (m_set_aeration_) {
115 m_set_aeration_(clamped);
121 std::scoped_lock lock(m_mutex_);
122 m_last_snapshot_ = snapshot;
124 if (m_apply_snapshot_) {
125 m_apply_snapshot_(snapshot);
131 std::scoped_lock lock(m_mutex_);
137 std::scoped_lock lock(m_mutex_);
144 std::scoped_lock lock(m_mutex_);
145 return m_last_snapshot_;
152 mutable std::mutex m_mutex_;
153 bool m_enabled_{
false};
155 std::optional<BoardSnapshot> m_last_snapshot_;
192 static auto create(insitech::bus::IHub&
bus,
const uint32_t address,
193 const std::string& name,
194 const std::string& binary =
"lacteApp")
195 -> std::shared_ptr<UiBusClient> {
196 auto self = std::shared_ptr<UiBusClient>(
new UiBusClient(
197 address, proto::bus::make_identity(name, binary, 1,
"lacte"),
198 bus.make_client_bindings(address)));
199 bus.register_local_client(address, self);
206 "Model-pushed command enabling/disabling the UI");
208 "Model-pushed full board snapshot");
245 insitech::bus_utils::subscribe_owned_typed<UiCommand>(
250 "Model-pushed command enabling/disabling this UI");
251 insitech::bus_utils::subscribe_owned_typed<BoardSnapshotEvent>(
257 "Model-pushed full board snapshot");
268 if (
const auto reply = request<HealthRequest, StatusReply>({}, timeout);
269 !reply || !reply->ok) {
270 runtime.set_enabled(
false);
279 const std::chrono::milliseconds timeout) ->
bool {
280 const auto reply = request<ParamSetRequest, StatusReply>(
281 {std::move(param), value}, timeout);
282 return reply && reply->ok;
286 auto get_param(std::string param,
const std::chrono::milliseconds timeout)
287 -> std::optional<int> {
289 request<ParamGetRequest, ParamGetReply>({std::move(param)}, timeout);
290 if (!reply || !reply->ok) {
298 -> std::optional<BoardSnapshot> {
299 auto reply = request<SnapshotRequest, SnapshotReply>({}, timeout);
300 if (!reply || !reply->ok) {
303 return reply->snapshot;
311 -> std::optional<RfidData> {
312 auto reply = request<RfidDataRequest, RfidDataReply>({}, timeout);
313 if (!reply || !reply->ok) {
322 const std::chrono::milliseconds timeout) ->
bool {
324 request<TestBoardOnlineRequest, StatusReply>({online}, timeout);
325 return reply && reply->ok;
333 UiBusClient(
const uint32_t address,
const proto::bus::NodeIdentity& identity,
335 : LocalClient(address, identity, std::move(bindings)) {}
Типы wire-формата, которыми обмениваются по шине lacte: BoardSnapshot (доменное значение) и типы сооб...
ModelBusClient: собственный клиент Model на шине lacte - создаётся и принадлежит самому Model (см.
Серверный контракт: реализуйте эти методы, и ModelBusClient::ServeModel() будет их обслуживать.
virtual auto health() -> bool=0
Здоров ли бэкенд/диспенсер.
virtual auto get_snapshot() -> BoardSnapshot=0
Формирует текущий снапшот устройства.
void disable_ui()
Публикует команду выключения для UI.
UiBusClient(const UiBusClient &)=delete
auto operator=(const UiBusClient &) -> UiBusClient &=delete
void set_ui_enabled(const bool enabled)
Публикует команду включения/выключения для UI.
auto set_test_board_online(const bool online, const std::chrono::milliseconds timeout) -> bool
Запрашивает у бэкенда переключить онлайн-состояние виртуальной тестовой платы (только для тестировани...
auto check_health(UiRuntime &runtime, const std::chrono::milliseconds timeout) -> bool
Выполняет блокирующую проверку состояния (health check) бэкенда.
void publish_snapshot(ModelBusHandler &handler)
Публикует текущий снапшот устройства для UI.
void enable_ui(ModelBusHandler &handler)
Публикует команду включения для UI, если только бэкенд не нездоров (тогда выключает).
static auto create(insitech::bus::IHub &bus, const uint32_t address, const std::string &name, const std::string &binary="lacteApp") -> std::shared_ptr< UiBusClient >
Создаёт UiBusClient по адресу address на bus и регистрирует его там одним вызовом - см.
auto get_snapshot(const std::chrono::milliseconds timeout) -> std::optional< BoardSnapshot >
Запрашивает у бэкенда полный снапшот устройства.
auto set_param(std::string param, const int value, const std::chrono::milliseconds timeout) -> bool
Запрашивает у бэкенда установить именованный параметр в новое значение.
auto get_rfid_data(const std::chrono::milliseconds timeout) -> std::optional< RfidData >
Запрашивает у бэкенда сырые данные текущей подключённой RFID-карты (см.
void subscribe_runtime(const std::shared_ptr< UiRuntime > &runtime)
Подписывает runtime на два push-топика от бэкенда.
auto get_param(std::string param, const std::chrono::milliseconds timeout) -> std::optional< int >
Запрашивает текущее значение именованного параметра бэкенда.
UI-состояние, управляемое push-сообщениями от бэкенда (см.
void apply_snapshot(const BoardSnapshot &snapshot)
std::function< void(bool)> SetEnabledCallback
auto aeration() const -> int
Сообщает текущее удерживаемое значение aeration.
void set_enabled(const bool enabled)
std::function< void(int)> SetAerationCallback
static constexpr int K_MAX_AERATION_PERCENT
auto enabled() const -> bool
Сообщает текущее состояние enabled этого UI.
UiRuntime(SetEnabledCallback set_enabled, SetAerationCallback set_aeration, ApplySnapshotCallback apply_snapshot={})
auto last_snapshot() const -> std::optional< BoardSnapshot >
Возвращает последний снапшот, переданный в ApplySnapshot(), если он есть.
std::function< void(const BoardSnapshot &)> ApplySnapshotCallback
void set_aeration(const int value)
constexpr uint32_t K_UI_BUS_ADDRESS
Предпочтительный адрес клиента UI (НЕ собственный own_address_ общей шины, который LacteApp выбирает ...
Push backend -> UI: сериализованный снапшот платы.
static constexpr auto K_TOPIC
Моментальный снимок состояния диспенсера/платы, которым обмениваются бэкенд и UI (как запрос/ответ сн...
int aeration
Текущий уровень аэрации (в процентах).
Push backend -> UI: команда enable/disable.
static constexpr auto K_TOPIC