lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
ModelBusClient.hpp
Go to the documentation of this file.
1
33#pragma once
34
35#include <Bus.hpp>
36#include <cstdint>
37#include <functional>
38#include <memory>
39#include <optional>
40#include <string>
41#include <utility>
42
43#include "bus/Envelopes.hpp"
44
45namespace lacte::bus {
46// ---------------------------------------------------------------------------
47// ModelBusHandler: серверный доменный контракт. Реализуйте эти методы, и
48// ModelBusClient::ServeModel() будет отвечать на них через шину.
49// ---------------------------------------------------------------------------
50
65 public:
66 virtual ~ModelBusHandler() = default;
67
69 virtual auto health() -> bool = 0;
70
72 virtual auto get_param(const std::string& name) -> std::optional<int> = 0;
73
75 virtual auto set_param(const std::string& name, int value) -> bool = 0;
76
78 virtual auto get_snapshot() -> BoardSnapshot = 0;
79
84 virtual auto get_rfid_data() -> RfidData = 0;
85};
86
95 public:
96 std::function<bool()> health_fn;
97 std::function<std::optional<int>(std::string)> get_param_fn;
98 std::function<bool(std::string, int)> set_param_fn;
100 std::function<RfidData()> get_rfid_data_fn;
101
102 auto health() -> bool override { return health_fn ? health_fn() : true; }
103
104 auto get_param(const std::string& name) -> std::optional<int> override {
105 return get_param_fn ? get_param_fn(name) : std::nullopt;
106 }
107
108 auto set_param(const std::string& name, const int value) -> bool override {
109 return set_param_fn ? set_param_fn(name, value) : false;
110 }
111
112 auto get_snapshot() -> BoardSnapshot override {
114 }
115
116 auto get_rfid_data() -> RfidData override {
118 }
119};
120
126inline constexpr uint32_t K_MODEL_BUS_ADDRESS = 1;
127
128// ---------------------------------------------------------------------------
129// ModelBusClient: см. doc-комментарий файла выше.
130// ---------------------------------------------------------------------------
131
132class ModelBusClient : public insitech::bus::LocalClient {
133 public:
155 static auto create(insitech::bus::IHub& bus, const uint32_t address,
156 const std::string& name,
157 const std::string& binary = "lacteApp")
158 -> std::shared_ptr<ModelBusClient> {
159 auto self = std::shared_ptr<ModelBusClient>(new ModelBusClient(
160 address, proto::bus::make_identity(name, binary, 1, "lacte"),
161 bus.make_client_bindings(address)));
162 bus.register_local_client(address, self);
163 return self;
164 }
165
167 auto operator=(const ModelBusClient&) -> ModelBusClient& = delete;
168
174 serve<HealthRequest, StatusReply>(
175 [&handler](const HealthRequest&) -> StatusReply {
176 return StatusReply{handler.health()};
177 },
178 "Model health check");
179
180 serve<ParamGetRequest, ParamGetReply>(
181 [&handler](const ParamGetRequest& request) -> ParamGetReply {
182 const auto value = handler.get_param(request.param);
183 if (!value) {
184 return ParamGetReply{false, "not-found", request.param, 0};
185 }
186 return ParamGetReply{true, "", request.param, *value};
187 },
188 "Reads one board parameter's current value",
189 {proto::bus::TopicParam{"param", "param name", true}});
190
191 serve<ParamSetRequest, StatusReply>(
192 [&handler](const ParamSetRequest& request) -> StatusReply {
193 return StatusReply{handler.set_param(request.param, request.value),
194 ""};
195 },
196 "Sets one board parameter's value",
197 {proto::bus::TopicParam{"param", "param name", true},
198 proto::bus::TopicParam{"value", "value", true}});
199
200 serve<SnapshotRequest, SnapshotReply>(
201 [&handler](const SnapshotRequest&) -> SnapshotReply {
202 return SnapshotReply{true, "", handler.get_snapshot()};
203 },
204 "Returns the Model's current full board snapshot");
205
206 serve<RfidDataRequest, RfidDataReply>(
207 [&handler](const RfidDataRequest&) -> RfidDataReply {
208 return RfidDataReply{true, "", handler.get_rfid_data()};
209 },
210 "Returns the currently-attached RFID card's raw data");
211
212 // TestBoardOnlineRequest::K_TOPIC здесь НЕ обслуживается - см.
213 // собственный doc-комментарий ModelBusHandler. Вне режима --virtual
214 // этот топик вообще никем не обслуживается, так что
215 // ConsoleUi::SetTestBoardOnline() просто получает тайм-аут - тот же
216 // результат "недоступно", что и раньше, только через тайм-аут, а не
217 // мгновенный ответ.
218 }
219
220 private:
221 // Приватный: только Create() может сконструировать экземпляр, так что
222 // нигде не может оказаться ModelBusClient, который никогда не был
223 // зарегистрирован на своей шине (см. doc-комментарий Create()) - обычный
224 // публичный конструктор не смог бы это гарантировать.
225 ModelBusClient(const uint32_t address,
226 const proto::bus::NodeIdentity& identity, Bindings bindings)
227 : LocalClient(address, identity, std::move(bindings)) {}
228};
229} // namespace lacte::bus
Типы wire-формата, которыми обмениваются по шине lacte: BoardSnapshot (доменное значение) и типы сооб...
ModelBusHandler, реализованный через пользовательские колбэки.
auto health() -> bool override
Здоров ли бэкенд/диспенсер.
auto set_param(const std::string &name, const int value) -> bool override
Записывает именованный параметр; возвращает, удалась ли запись.
std::function< BoardSnapshot()> get_snapshot_fn
auto get_rfid_data() -> RfidData override
Формирует сырые данные текущей приложенной RFID-карты (см.
std::function< bool(std::string, int)> set_param_fn
auto get_param(const std::string &name) -> std::optional< int > override
Читает именованный параметр; nullopt, если параметр неизвестен.
std::function< std::optional< int >(std::string)> get_param_fn
std::function< RfidData()> get_rfid_data_fn
auto get_snapshot() -> BoardSnapshot override
Формирует текущий снапшот устройства.
ModelBusClient(const ModelBusClient &)=delete
auto operator=(const ModelBusClient &) -> ModelBusClient &=delete
void serve_model(ModelBusHandler &handler)
Анонсирует и обслуживает все запросные топики из handler.
static auto create(insitech::bus::IHub &bus, const uint32_t address, const std::string &name, const std::string &binary="lacteApp") -> std::shared_ptr< ModelBusClient >
Создаёт ModelBusClient по адресу address на bus и регистрирует его там одним вызовом - см.
Серверный контракт: реализуйте эти методы, и ModelBusClient::ServeModel() будет их обслуживать.
virtual auto get_param(const std::string &name) -> std::optional< int >=0
Читает именованный параметр; nullopt, если параметр неизвестен.
virtual ~ModelBusHandler()=default
virtual auto health() -> bool=0
Здоров ли бэкенд/диспенсер.
virtual auto set_param(const std::string &name, int value) -> bool=0
Записывает именованный параметр; возвращает, удалась ли запись.
virtual auto get_rfid_data() -> RfidData=0
Формирует сырые данные текущей приложенной RFID-карты (см.
virtual auto get_snapshot() -> BoardSnapshot=0
Формирует текущий снапшот устройства.
constexpr uint32_t K_MODEL_BUS_ADDRESS
Предпочтительный адрес клиента Model (НЕ собственный own_address_ общей шины, который LacteApp выбира...
Моментальный снимок состояния диспенсера/платы, которым обмениваются бэкенд и UI (как запрос/ответ сн...
Definition Envelopes.hpp:73
Запрос UI -> backend: жив ли бэкенд и здоров ли он? Без payload.
Ответ на ParamGetRequest: значение запрошенного параметра.
Запрос UI -> backend: прочитать именованный параметр бэкенда.
Запрос UI -> backend: записать именованный параметр бэкенда.
СЫРЫЕ поля, считанные с текущей подключённой RFID-карты/молочной системы - ДЕРЖАТСЯ ОТДЕЛЬНО от Board...
Ответ на RfidDataRequest: сырые данные RFID-карты.
Запрос UI -> backend: получить сырые данные текущей подключённой RFID-карты по требованию (почему это...
Ответ на SnapshotRequest: полный снапшот состояния устройства.
Запрос UI -> backend: получить полный снапшот устройства по требованию.
Универсальный ответ ok/error, переиспользуемый каждым запросом ниже, которому больше нечего сообщить ...