lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
LacteGuiTuning.h
Go to the documentation of this file.
1#pragma once
2
3// LacteGuiTuning.h
4//
5// Единый файл параметров GUI (тюнинг без изменения логики).
6//
7// Требования к использованию:
8// - Все размеры/цвета/тексты/пороги UI должны храниться здесь.
9// - В коде отрисовки (build_ui) не должно быть "магических чисел", кроме
10// алгоритмических констант (например, размер QR-матрицы).
11// - Параметры сгруппированы по разделам: типографика, окно, цвета, ритм,
12// геометрия колонок, QR-блок, тексты, ошибки.
13//
14// Важно:
15// - Параметры рамки окна (жёлтая рамка) менять нельзя.
16
17/*
18ИНФОГРАФИКА (экран как окно; фиксированная правая грань; 3 колонки одной ширины)
19Примечание: ровность рамки гарантируется в моноширинном шрифте редактора.
20
21+----------------------------------------------------------------------------+
22| ОКНО |
23| ФОН/СКРУГЛЕНИЕ: LACTE_GUI_WINDOW_BG_* / LACTE_GUI_WINDOW_ROUNDING |
24| ОТСТУПЫ ОКНА : LACTE_GUI_WINDOW_PADDING_X / LACTE_GUI_WINDOW_PADDING_Y |
25| РАМКА (НЕ МЕНЯТЬ): LACTE_GUI_WINDOW_BORDER_* +
26LACTE_GUI_WINDOW_BORDER_THICKNESS |
27+----------------------------------------------------------------------------+
28| Дверь молочной системы открыта |
29| ЗАГОЛОВОК: LACTE_GUI_TITLE_* (шрифт: LACTE_GUI_FONT_BIG_PX) |
30| ОШИБКА : LACTE_GUI_ERROR_* (шрифт: LACTE_GUI_FONT_NORMAL_PX) |
31| ПРОБЕЛ : LACTE_GUI_AFTER_HEADER_GAP_* |
32+----------------------------------------------------------------------------+
33| ЛЕВАЯ: статус/остаток | ЦЕНТР: вспенивание | ПРАВАЯ: QR/версии |
34| | | |
35| ВЕРХ ОТСТУП (все): LACTE_GUI_COL_TOP_PAD_* |
36| ВЫСОТЫ СТРОК : LACTE_GUI_LABEL_* / LACTE_GUI_VALUE_* |
37| ВЕРТ. РИТМ : LACTE_GUI_RHYTHM_* / LACTE_GUI_BLOCK_GAP_* |
38| ДОЛИ ШИРИНЫ : LACTE_GUI_COL_LEFT_RATIO / LACTE_GUI_COL_CENTER_RATIO |
39| РАЗДЕЛИТЕЛИ : ширина LACTE_GUI_SEPARATOR_WIDTH |
40| : inset MIN LACTE_GUI_SEPARATOR_INSET_MIN / MAX
41LACTE_GUI_SEPARATOR_INSET_MAX |
42+----------------------------------------------------------------------------+
43| ЦЕНТР (кнопки): высота LACTE_GUI_FOAM_BTN_H_* ширина LACTE_GUI_FOAM_BTN_W |
44| : отступ LACTE_GUI_FOAM_SIDE_PAD промежуток
45LACTE_GUI_FOAM_HEADER_GAP_* | | ПРАВО (QR) : размер LACTE_GUI_QR_SIZE_* мин.
46LACTE_GUI_QR_SIZE_ABS_MIN | | : отступ LACTE_GUI_QR_PAD_*
47скругление LACTE_GUI_QR_ROUNDING_*| | : пиксели
48LACTE_GUI_QR_DOT_ROUND_* футер LACTE_GUI_QR_* |
49+----------------------------------------------------------------------------+
50| ШРИФТЫ (пикс.): normal LACTE_GUI_FONT_NORMAL_PX / big LACTE_GUI_FONT_BIG_PX|
51| : small LACTE_GUI_FONT_SMALL_PX |
52+----------------------------------------------------------------------------+
53*/
54
55// Типографика (глобальные размеры шрифтов в пикселях, загружаются в TinyGui).
56#define LACTE_GUI_FONT_FALLBACK_H \
57 39.0f // Высота шрифта по умолчанию, если fonts/ctx.style.font не задан.
58#define LACTE_GUI_SMALL_FALLBACK_MIN \
59 6.0f // Минимальная высота small, если resources.fonts.small отсутствует.
60#define LACTE_GUI_SMALL_FALLBACK_MULT \
61 0.70f // Множитель small от normal, если resources.fonts.small отсутствует.
62
63// Окно (рамку менять нельзя, но остальные параметры окна можно).
64inline constexpr int LACTE_GUI_WINDOW_BG_R = 30; // Фон окна: красный канал.
65inline constexpr int LACTE_GUI_WINDOW_BG_G = 30; // Фон окна: зелёный канал.
66inline constexpr int LACTE_GUI_WINDOW_BG_B = 30; // Фон окна: синий канал.
67inline constexpr int LACTE_GUI_WINDOW_BG_A = 255; // Фон окна: альфа-канал.
68
69inline constexpr int LACTE_GUI_WINDOW_BORDER_R =
70 255; // Рамка окна (НЕ МЕНЯТЬ): красный канал.
71inline constexpr int LACTE_GUI_WINDOW_BORDER_G =
72 255; // Рамка окна (НЕ МЕНЯТЬ): зелёный канал.
73inline constexpr int LACTE_GUI_WINDOW_BORDER_B =
74 0; // Рамка окна (НЕ МЕНЯТЬ): синий канал.
75inline constexpr int LACTE_GUI_WINDOW_BORDER_A =
76 255; // Рамка окна (НЕ МЕНЯТЬ): альфа-канал.
77#define LACTE_GUI_WINDOW_BORDER_THICKNESS \
78 2.0f // Толщина рамки окна (НЕ МЕНЯТЬ).
79
80#define LACTE_GUI_WINDOW_ROUNDING 16.0f // Скругление углов окна.
81#define LACTE_GUI_WINDOW_PADDING_X 30.0f // Внутренний отступ окна по X.
82#define LACTE_GUI_WINDOW_PADDING_Y 40.0f // Внутренний отступ окна по Y.
83#define LACTE_GUI_WINDOW_SPACING_X 4.0f // Единый межвиджетный шаг по X.
84#define LACTE_GUI_WINDOW_SPACING_Y 4.0f // Единый межвиджетный шаг по Y.
85
86// Скругления элементов.
87#define LACTE_GUI_BUTTON_ROUNDING 12.0f // Скругление кнопок +/-.
88#define LACTE_GUI_PROGRESS_ROUNDING \
89 8.0f // Скругление прогрессов (если появятся).
90
91// Цвета интерфейса (под Apple-тёмную тему).
92inline constexpr int LACTE_GUI_TEXT_PRIMARY_R = 255;
93inline constexpr int LACTE_GUI_TEXT_PRIMARY_G = 255;
94inline constexpr int LACTE_GUI_TEXT_PRIMARY_B = 255;
95
96inline constexpr int LACTE_GUI_TEXT_SECONDARY_R = 140;
97inline constexpr int LACTE_GUI_TEXT_SECONDARY_G = 140;
98inline constexpr int LACTE_GUI_TEXT_SECONDARY_B = 140;
99
100inline constexpr int LACTE_GUI_GREEN_R = 48;
101inline constexpr int LACTE_GUI_GREEN_G = 209;
102inline constexpr int LACTE_GUI_GREEN_B = 88;
103
104inline constexpr int LACTE_GUI_RED_R = 255;
105inline constexpr int LACTE_GUI_RED_G = 69;
106inline constexpr int LACTE_GUI_RED_B = 58;
107
108inline constexpr int LACTE_GUI_BTN_NORMAL_R = 60;
109inline constexpr int LACTE_GUI_BTN_NORMAL_G = 60;
110inline constexpr int LACTE_GUI_BTN_NORMAL_B = 62;
111
112inline constexpr int LACTE_GUI_BTN_HOVER_R = 90;
113inline constexpr int LACTE_GUI_BTN_HOVER_G = 90;
114inline constexpr int LACTE_GUI_BTN_HOVER_B = 92;
115
116inline constexpr int LACTE_GUI_BTN_ACTIVE_R = 120;
117inline constexpr int LACTE_GUI_BTN_ACTIVE_G = 120;
118inline constexpr int LACTE_GUI_BTN_ACTIVE_B = 122;
119
120// Разделители колонок.
121inline constexpr int LACTE_GUI_SEPARATOR_R = 80;
122inline constexpr int LACTE_GUI_SEPARATOR_G = 80;
123inline constexpr int LACTE_GUI_SEPARATOR_B = 80;
124inline constexpr int LACTE_GUI_SEPARATOR_A = 120; // Прозрачность разделителя.
125#define LACTE_GUI_SEPARATOR_WIDTH 2.0f // Толщина вертикального разделителя.
126
127// Вертикальный ритм (расчёт от высоты normal-шрифта).
128#define LACTE_GUI_RHYTHM_MULT \
129 0.45f // Базовый ритм: множитель от normal->height.
130#define LACTE_GUI_RHYTHM_MIN 7.0f // Минимальный базовый ритм (пикс.).
131#define LACTE_GUI_RHYTHM_MAX 12.0f // Максимальный базовый ритм (пикс.).
132
133// Заголовок/ошибка (высоты строк как множители от шрифтов).
134#define LACTE_GUI_TITLE_MULT \
135 1.25f // Высота строки заголовка = big->height * MULT.
136#define LACTE_GUI_TITLE_MIN 48.0f // Минимальная высота заголовка (пикс.).
137#define LACTE_GUI_TITLE_MAX 48.0f // Максимальная высота заголовка (пикс.).
138
139#define LACTE_GUI_ERROR_MULT \
140 0.85f // Высота строки ошибки = normal->height * MULT.
141#define LACTE_GUI_ERROR_MIN \
142 12.0f // Минимальная высота ошибки/плейсхолдера (пикс.).
143#define LACTE_GUI_ERROR_MAX \
144 16.0f // Максимальная высота ошибки/плейсхолдера (пикс.).
145#define LACTE_GUI_ERROR_EMPTY_H \
146 14.0f // Высота пустой строки под заголовком, когда текст ошибки не
147 // выводится.
148
149#define LACTE_GUI_AFTER_HEADER_GAP_MULT \
150 0.35f // Отступ после шапки = rhythm * MULT.
151#define LACTE_GUI_AFTER_HEADER_GAP_MIN \
152 50.0f // Минимальный отступ после шапки (пикс.).
153#define LACTE_GUI_AFTER_HEADER_GAP_MAX \
154 50.0f // Максимальный отступ после шапки (пикс.).
155
156// Колонки/блоки (высоты строк внутри колонок).
157#define LACTE_GUI_LABEL_MULT 0.95f // Высота подписи = normal->height * MULT.
158#define LACTE_GUI_LABEL_MIN 16.0f // Минимальная высота подписи (пикс.).
159#define LACTE_GUI_LABEL_MAX 22.0f // Максимальная высота подписи (пикс.).
160
161#define LACTE_GUI_VALUE_MULT 1.05f // Высота значения = big->height * MULT.
162#define LACTE_GUI_VALUE_MIN 32.0f // Минимальная высота значения (пикс.).
163#define LACTE_GUI_VALUE_MAX 42.0f // Максимальная высота значения (пикс.).
164
165#define LACTE_GUI_BLOCK_GAP_MULT 0.90f // Отступ между блоками = rhythm * MULT.
166#define LACTE_GUI_BLOCK_GAP_MIN \
167 6.0f // Минимальный отступ между блоками (пикс.).
168#define LACTE_GUI_BLOCK_GAP_MAX \
169 12.0f // Максимальный отступ между блоками (пикс.).
170
171#define LACTE_GUI_COL_TOP_PAD_MULT \
172 0.50f // Верхний отступ внутри каждой колонки = normal->height * MULT.
173#define LACTE_GUI_COL_TOP_PAD_MIN \
174 20.0f // Минимальный верхний отступ колонки (пикс.).
175#define LACTE_GUI_COL_TOP_PAD_MAX \
176 20.0f // Максимальный верхний отступ колонки (пикс.).
177
178// Сдвиг блока "Годен до" вниз внутри левой колонки (для выравнивания низа с
179// правым футером).
180#define LACTE_GUI_EXPIRY_PUSH_MULT \
181 0.90f // Доп. отступ перед "Годен до" = rhythm * MULT.
182#define LACTE_GUI_EXPIRY_PUSH_MIN 0.0f // Минимальный доп. отступ (пикс.).
183#define LACTE_GUI_EXPIRY_PUSH_MAX 80.0f // Максимальный доп. отступ (пикс.).
184#define LACTE_GUI_EXPIRY_EXTRA_SHIFT_Y \
185 10.0f // Доп. точечный сдвиг блока "Годен до" вниз для выравнивания с футером
186 // справа.
187
188// Минимальная высота зоны колонок (чтобы верстка не схлопывалась на маленьких
189// окнах).
190#define LACTE_GUI_COL_MIN_H \
191 220.0f // Минимальная высота блока с 3 колонками (пикс.).
192
193// Инсеты разделителей по Y (задаются через ограничение значений для стабильного
194// вида).
195#define LACTE_GUI_SEPARATOR_INSET_MIN \
196 70.0f // Минимальный отступ разделителя сверху/снизу (пикс.).
197#define LACTE_GUI_SEPARATOR_INSET_MAX \
198 70.0f // Максимальный отступ разделителя сверху/снизу (пикс.).
199#define LACTE_GUI_SEPARATOR_RAISE_Y \
200 60.0f // Поднять разделители вверх (пикс.). Уменьшает верхний отступ, низ
201 // остаётся прежним.
202
203// Пропорции ширины колонок (в сумме с правой колонкой = 1.0).
204#define LACTE_GUI_COL_LEFT_RATIO 0.333f // Доля ширины левой колонки.
205#define LACTE_GUI_COL_CENTER_RATIO 0.333f // Доля ширины центральной колонки.
206
207// Центральный блок (вспенивание).
208#define LACTE_GUI_FOAM_BTN_H_MULT \
209 1.85f // Высота ряда кнопок = big->height * MULT.
210#define LACTE_GUI_FOAM_BTN_H_MIN \
211 80.0f // Минимальная высота ряда кнопок (пикс.).
212#define LACTE_GUI_FOAM_BTN_H_MAX \
213 80.0f // Максимальная высота ряда кнопок (пикс.).
214
215#define LACTE_GUI_FOAM_HEADER_GAP_MULT \
216 1.00f // Отступ под заголовком “Уровень вспенивания” = rhythm * MULT.
217#define LACTE_GUI_FOAM_HEADER_GAP_MIN \
218 10.0f // Минимальный отступ под заголовком (пикс.).
219#define LACTE_GUI_FOAM_HEADER_GAP_MAX \
220 16.0f // Максимальный отступ под заголовком (пикс.).
221
222// Геометрия кнопок в центральном блоке.
223#define LACTE_GUI_FOAM_SIDE_PAD \
224 10.0f // Боковой отступ внутри строки кнопок (пикс.).
225#define LACTE_GUI_FOAM_BTN_W 80.0f // Ширина кнопок +/- (пикс.).
226
227// QR-блок.
228#define LACTE_GUI_QR_SHIFT_X \
229 (-17.0f) // Смещение QR и подписи "help.lacte.ru" по X внутри правой колонки
230 // (вправо +, влево -).
231#define LACTE_GUI_QR_SIZE_MULT \
232 0.52345f // Размер QR = min(col_w_right, col_h) * MULT; уменьшен ещё на 5%.
233#define LACTE_GUI_QR_SIZE_MIN 118.0f // Минимальный размер QR (пикс.).
234#define LACTE_GUI_QR_SIZE_MAX 170.0f // Максимальный размер QR (пикс.).
235#define LACTE_GUI_QR_SIZE_ABS_MIN \
236 96.0f // Абсолютный нижний предел (если нужно влезть с футером).
237
238#define LACTE_GUI_QR_ROUNDING_MULT \
239 0.08f // Скругление белой подложки QR = qr_rect.w * MULT.
240#define LACTE_GUI_QR_ROUNDING_MIN 8.0f // Минимальное скругление QR (пикс.).
241#define LACTE_GUI_QR_ROUNDING_MAX 14.0f // Максимальное скругление QR (пикс.).
242
243#define LACTE_GUI_QR_PAD_MULT \
244 0.06f // Внутренний отступ QR (белая рамка) = qr_rect.w * MULT.
245#define LACTE_GUI_QR_PAD_MIN 6.0f // Минимальный внутренний отступ QR (пикс.).
246#define LACTE_GUI_QR_PAD_MAX \
247 10.0f // Максимальный внутренний отступ QR (пикс.).
248
249#define LACTE_GUI_QR_DOT_ROUND_DIV \
250 2.5f // Делитель для скругления “пикселей” QR: cell_size / DIV.
251#define LACTE_GUI_QR_DOT_ROUND_MIN \
252 1.0f // Минимальное скругление “пикселя” (пикс.).
253#define LACTE_GUI_QR_DOT_ROUND_MAX \
254 6.0f // Максимальное скругление “пикселя” (пикс.).
255
256// Подписи и футер под QR.
257#define LACTE_GUI_QR_GAP1_MULT 0.85f // Отступ под QR = rhythm * MULT.
258#define LACTE_GUI_QR_GAP1_MIN 6.0f // Минимальный отступ под QR (пикс.).
259#define LACTE_GUI_QR_GAP1_MAX 10.0f // Максимальный отступ под QR (пикс.).
260
261#define LACTE_GUI_QR_DOMAIN_MULT \
262 0.80f // Высота строки “help.lacte.ru” = normal->height * MULT.
263#define LACTE_GUI_QR_DOMAIN_MIN \
264 14.0f // Минимальная высота строки домена (пикс.).
265#define LACTE_GUI_QR_DOMAIN_MAX \
266 18.0f // Максимальная высота строки домена (пикс.).
267
268#define LACTE_GUI_QR_GAP2_MULT 0.70f // Отступ перед футером = rhythm * MULT.
269#define LACTE_GUI_QR_GAP2_MIN 5.0f // Минимальный отступ перед футером (пикс.).
270#define LACTE_GUI_QR_GAP2_MAX \
271 9.0f // Максимальный отступ перед футером (пикс.).
272
273#define LACTE_GUI_QR_FOOTER_LINE_MULT \
274 1.05f // Высота строки футера = small->height * MULT.
275#define LACTE_GUI_QR_FOOTER_LINE_MIN \
276 13.0f // Минимальная высота строки футера (пикс.).
277#define LACTE_GUI_QR_FOOTER_LINE_MAX \
278 18.0f // Максимальная высота строки футера (пикс.).
279#define LACTE_GUI_QR_FOOTER_PAD_X \
280 10.0f // Внутренний отступ слева/справа для строк футера под QR (пикс.).
281
282// Учёт межстрочного интервала Nuklear (сколько раз прибавлять row_gap).
283#define LACTE_GUI_QR_FOOTER_ROW_GAP_COUNT \
284 5.0f // Сколько раз прибавлять row_gap в зоне футера.
285#define LACTE_GUI_QR_BLOCK_ROW_GAP_COUNT \
286 2.0f // Сколько раз прибавлять row_gap как запас в зоне QR.
287#define LACTE_GUI_QR_FOOTER_LINES \
288 3.0f // Количество строк футера под QR (версия/прошивка/серийник).
289
290// Данные от платы (макросы доступа + описание).
291//
292// Демонстрационные сценарии для экрана (используются только при demo_mode_ =
293// true). Включение демо-режима через тюнинг-файл (без вызова set_demo_mode): 0
294// — демо выключен (используются реальные данные от сервиса/платы) 1 — демо
295// включён (на экран принудительно подставляется выбранный сценарий)
296#define LACTE_GUI_DEMO_MODE true
297
298// Выбор сценария: 1 или 2.
299inline constexpr int LACTE_GUI_DEMO_SCENARIO = 2;
300
301// Сценарий 1:
302// 1) Есть ошибка E04 (красным)
303// 2) Молоко 7% (красным)
304// 3) Дата меньше текущей (красным)
305#define LACTE_GUI_DEMO1_ONLINE_KNOWN true
306#define LACTE_GUI_DEMO1_ONLINE true
307inline constexpr int LACTE_GUI_DEMO1_ERROR_FLAGS = 4;
308inline constexpr int LACTE_GUI_DEMO1_REMAINING_PERCENT = 7;
309#define LACTE_GUI_DEMO1_EXPIRY_DATE "01.01.2025"
310
311// Сценарий 2:
312// 1) Ошибок нет
313// 2) Молоко 75%
314// 3) Дата в будущем (зелёная)
315#define LACTE_GUI_DEMO2_ONLINE_KNOWN true
316#define LACTE_GUI_DEMO2_ONLINE true
317inline constexpr int LACTE_GUI_DEMO2_REMAINING_PERCENT = 75;
318#define LACTE_GUI_DEMO2_EXPIRY_DATE "31.06.2026"
319
320// Макросы ниже позволяют заменить прямой доступ вида `board.xxx` на единый
321// слой, чтобы при необходимости можно было переопределить источник
322// данных/формат.
323//
324// Перечень данных, которые приложение может получать от платы (по текущему
325// коду):
326// - статус связи с платой (online) → в GUI: online_known/online.
327// - статус платы (info/BoardStatus) → в GUI: IDLE | CALIBRATION | ERROR | READY
328// | WORK.
329// - маска ошибок (errors): в GUI выводим одно число (сумма битов), чтобы
330// сервисный
331// инженер сверял по таблице. Низкий байт (0..7) — ошибки платы, высокий байт
332// (8..15) — ошибки сервиса (по нашему коду).
333// - версия платы (version) (сейчас не выводится на экране “дверь открыта”).
334// - UID платы (uid) (сейчас не выводится).
335// - номер RFID (rfid_num) (сейчас не выводится).
336// - серийный номер молока/картриджа (milk_sn) (сейчас не выводится на экране,
337// но доступен).
338// - дата производства (prod_date, uint32) → форматируется в строку.
339// - срок годности продукта (shelf_life, uint32) → используется для вычисления
340// expiry_date.
341// - ресурс/счётчик (usage_time/time_counter, сек.) → вычисляются
342// remaining_percent и remaining_hint.
343// - серийный номер контроллера платы (board_sn) (сейчас не выводится).
344// - серийный номер машины (machine_sn) (сейчас не выводится).
345// - счётчик напитков (milk_counter) (сейчас не выводится).
346//
347// Таблица параметров, которые плата отправляет сервису (по спецификации):
348// 0 MAGIC_WORD (2) Признак наличия информации (0xCCAA)
349// 1 LACTE_ID (2) Артикул продукта
350// 2 LACTE_SN (4) Уникальный серийный номер продукта
351// 3 RESERVED (2) Резерв
352// 4 PROD_VOLUME (2) Объём продукта (мл)
353// 5 PROD_DATE (4) Дата и время производства (Unix timestamp)
354// 6 PROD_SHELFLIFE (4) Срок годности продукта (секунды)
355// 7 USAGE_TIME (4) Срок годности после вскрытия (секунды)
356// 8 MCU_UID (12) Уникальный номер MCU (серийный номер платы)
357// 9 MACHINE_SN (4) Серийный номер устройства
358// 10 ACTIVATION_TIME (4) Дата и время первого использования молока
359// 11 MILK_COUNTER (4) Счётчик налива молока (раз)
360// 12 VOL_COUNTER (4) Счётчик налива молока (мл)
361// Примечание: в текущем коде этот параметр приходит как
362// proto::lacte::TimeCounter (RFIDDataPacketType::m_timeCounter), но по
363// смыслу используется как объём (мл).
364//
365// Данные, которые реально использует GUI сейчас (структура MilkDoorBoardInfo):
366// - online_known, online, expiry_date, remaining_percent, error_flags.
367#define LACTE_GUI_BOARD_ONLINE_KNOWN(b) ((b).online_known)
368#define LACTE_GUI_BOARD_ONLINE(b) ((b).online)
369#define LACTE_GUI_BOARD_EXPIRY_DATE(b) ((b).expiry_date)
370#define LACTE_GUI_BOARD_REMAINING_PERCENT(b) ((b).remaining_percent)
371#define LACTE_GUI_BOARD_ERROR_FLAGS(b) ((b).error_flags)
372
373// Тексты интерфейса (вынесены для ручной подстройки без правки кода).
374#define LACTE_GUI_TEXT_TITLE \
375 "Дверь молочной системы открыта" // Заголовок экрана.
376#define LACTE_GUI_TEXT_STATUS_LABEL "Статус:" // Подпись слева.
377#define LACTE_GUI_TEXT_REMAINING_LABEL "Остаток молока:" // Подпись слева.
378#define LACTE_GUI_TEXT_EXPIRY_LABEL "Годен до:" // Подпись слева.
379#define LACTE_GUI_TEXT_NO_ERRORS \
380 "Ошибок нет" // Текст статуса, если ошибок нет.
381#define LACTE_GUI_TEXT_ERROR_PREFIX "Ошибка " // Префикс статуса при ошибке.
382#define LACTE_GUI_TEXT_DASH "-" // Плейсхолдер для пустых значений.
383
384// Остаток молока.
386 10; // Порог (в процентах): меньше — красным с предупреждением.
387#define LACTE_GUI_REMAINING_WARN_PREFIX " " // Префикс для низкого остатка.
388
389// Число ошибки по умолчанию, если нет связи и ошибка не пришла числом (OFFLINE
390// флаг в старшем байте).
391inline constexpr int LACTE_GUI_DEFAULT_OFFLINE_ERROR_NUMBER = 256; // 1 << 8.
392
393// Ошибки (единое число):
394// - младший байт (0..7) — ошибки платы (битовая маска)
395// - старший байт (8..15) — ошибки сервиса (битовая маска, наши доп. проверки)
396#define LACTE_GUI_ERROR_FLAGS_SHIFT 8U
397
399 1 << 0; // Ошибка калибровки.
401 1 << 1; // Ошибка двигателя.
403 1 << 2; // Ошибка RFID.
405 1 << 3; // RFID: нет карты.
407 1 << 4; // RFID: плохая карта.
409 1 << 5; // Некорректное время.
411 1 << 6; // Срок годности продукта истёк.
413 1 << 7; // Ресурс после вскрытия истёк.
414
415#define LACTE_GUI_MAKE_ERROR_FLAGS(board_flags, service_flags) \
416 (static_cast<std::uint16_t>((board_flags) & 0xFFU) | \
417 static_cast<std::uint16_t>(((service_flags) & 0xFFU) \
418 << LACTE_GUI_ERROR_FLAGS_SHIFT))
constexpr int LACTE_GUI_TEXT_PRIMARY_R
constexpr int LACTE_GUI_BTN_HOVER_B
constexpr int LACTE_GUI_BTN_NORMAL_G
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_RFID_BAD_CARD
constexpr int LACTE_GUI_GREEN_B
constexpr int LACTE_GUI_GREEN_R
constexpr int LACTE_GUI_WINDOW_BORDER_R
constexpr int LACTE_GUI_REMAINING_LOW_THRESHOLD
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_SHELFLIFE_END
constexpr int LACTE_GUI_DEMO2_REMAINING_PERCENT
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_INVALID_TIME
constexpr int LACTE_GUI_WINDOW_BORDER_A
constexpr int LACTE_GUI_BTN_ACTIVE_G
constexpr int LACTE_GUI_DEMO1_ERROR_FLAGS
constexpr int LACTE_GUI_WINDOW_BG_B
constexpr int LACTE_GUI_BTN_ACTIVE_R
constexpr int LACTE_GUI_RED_G
constexpr int LACTE_GUI_RED_B
constexpr int LACTE_GUI_WINDOW_BG_R
constexpr int LACTE_GUI_DEFAULT_OFFLINE_ERROR_NUMBER
constexpr int LACTE_GUI_TEXT_SECONDARY_R
constexpr int LACTE_GUI_WINDOW_BORDER_B
constexpr int LACTE_GUI_BTN_HOVER_G
constexpr int LACTE_GUI_WINDOW_BORDER_G
constexpr int LACTE_GUI_BTN_ACTIVE_B
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_RFID_NO_CARD
constexpr int LACTE_GUI_GREEN_G
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_MOTOR_ERROR
constexpr int LACTE_GUI_BTN_NORMAL_R
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_CALIB_ERROR
constexpr int LACTE_GUI_SEPARATOR_A
constexpr int LACTE_GUI_SEPARATOR_R
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_RFID_ERROR
constexpr int LACTE_GUI_SEPARATOR_B
constexpr int LACTE_GUI_WINDOW_BG_A
constexpr int LACTE_GUI_BTN_NORMAL_B
constexpr int LACTE_GUI_RED_R
constexpr int LACTE_GUI_BTN_HOVER_R
constexpr int LACTE_GUI_DEMO_SCENARIO
constexpr int LACTE_GUI_TEXT_PRIMARY_B
constexpr int LACTE_GUI_SEPARATOR_G
constexpr int LACTE_GUI_TEXT_SECONDARY_G
constexpr int LACTE_GUI_BOARD_ERROR_FLAG_USAGE_END
constexpr int LACTE_GUI_DEMO1_REMAINING_PERCENT
constexpr int LACTE_GUI_WINDOW_BG_G
constexpr int LACTE_GUI_TEXT_SECONDARY_B
constexpr int LACTE_GUI_TEXT_PRIMARY_G