lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
lacte_gui.h
Go to the documentation of this file.
1#pragma once
2#ifdef __linux__
3#include <functional>
4#include <optional>
5
6#include "TinyGui.hpp"
7
8using namespace tinygui;
9
10struct MilkDoorBoardInfo {
11 // online = текущее состояние связи
12 bool online{true};
13
14 // Дата "годен до" в формате "дд.мм.гггг" (локальное время).
15 // Если пустая строка, GUI показывает плейсхолдер.
16 std::string expiry_date;
17
18 // Остаток в процентах (0..100). Если не рассчитан — std::nullopt.
19 std::optional<uint64_t> remaining_percent{std::nullopt};
20
21 // Единое 16-битное поле ошибок.
22 // Низший байт: маска ошибок платы.
23 // Старший байт: маска ошибок сервиса (доп. проверки).
24 std::optional<std::uint16_t> error_flags{std::nullopt};
25
26 // Версия приложения (сервиса).
27 // Передаётся уже как строка (например, "1.0.0").
28 std::string app_version;
29
30 // Версия прошивки молочной системы.
31 // Если связи нет — строка должна быть пустой или "—" (GUI нормализует).
32 std::string fw_version;
33
34 // Серийный номер молочной системы.
35 // Если связи нет — строка должна быть пустой или "—" (GUI нормализует).
36 std::string milk_system_sn;
37
38 auto operator==(const MilkDoorBoardInfo& other) const -> bool {
39 return online == other.online && expiry_date == other.expiry_date &&
40 remaining_percent == other.remaining_percent &&
41 error_flags == other.error_flags &&
42 app_version == other.app_version && fw_version == other.fw_version &&
43 milk_system_sn == other.milk_system_sn;
44 }
45};
46
47// Уровень аэрации по умолчанию (в процентах), показываемый до получения
48// реального значения.
49inline constexpr int K_DEMO_WINDOW_DEFAULT_LEVEL = 50;
50
51class DemoWindow : public INkWindow {
52 public:
53 explicit DemoWindow(const Rect& bounds) : m_bounds_(bounds) {}
54
55 void build_ui(nk_context& ctx, const GuiResources& resources) override;
56 [[nodiscard]] auto get_level() const -> int { return this->m_level_; }
57 void set_param_get_lambda(std::function<MilkDoorBoardInfo()>&& func) {
58 m_param_func_ = std::move(func);
59 }
60
61 auto has_new_data() -> bool override {
62 if (m_param_func_) {
63 m_new_info_ = m_param_func_();
64 }
65 const bool is_new =
66 !(m_new_info_ == m_board_info_) || m_old_level_ != m_level_;
67 if (is_new) {
68 std::swap(m_board_info_, m_new_info_);
69 m_old_level_ = m_level_;
70 }
71
72 return is_new;
73 }
74
75 void set_level(const int val) { this->m_level_ = val; }
76
77 private:
78 Rect m_bounds_;
79 std::function<MilkDoorBoardInfo()> m_param_func_;
80 MilkDoorBoardInfo m_board_info_{};
81 MilkDoorBoardInfo m_new_info_{};
82 int m_level_{K_DEMO_WINDOW_DEFAULT_LEVEL};
83 int m_old_level_{K_DEMO_WINDOW_DEFAULT_LEVEL};
84};
85#endif