lacteApp
C++17 service for Lacte hardware
Loading...
Searching...
No Matches
board_flags_events.hpp
Go to the documentation of this file.
1#pragma once
2#include <vector>
3
5
29
80
86 public:
94 [[nodiscard]] auto diff(const BoardFlags& fresh,
95 BoardPacketTypes current_status)
96 -> std::vector<BoardFlagsEvent> {
97 std::vector<BoardFlagsEvent> events;
98 if (!m_has_previous_) {
99 m_has_previous_ = true;
100 m_previous_ = fresh;
101 return events;
102 }
103
104 // байт 10 (cond.cpp:1484-1526)
105 if (fresh.m_door != m_previous_.m_door) {
106 events.push_back(fresh.m_door ? BoardFlagsEvent::DOOR_OPEN
108 }
109 if (fresh.m_innerWaterBunker != m_previous_.m_innerWaterBunker) {
110 events.push_back(fresh.m_innerWaterBunker
113 }
114 if (fresh.m_brewingUnit != m_previous_.m_brewingUnit) {
115 events.push_back(fresh.m_brewingUnit ? BoardFlagsEvent::BREWING_UNIT_UNSET
117 }
118
119 // байт 11 (cond.cpp:1531-1614)
120 if (fresh.m_bunkerForBulkMissing != m_previous_.m_bunkerForBulkMissing) {
121 events.push_back(fresh.m_bunkerForBulkMissing
124 }
125 // emptyLeft/RightCoffeBunker - ЕДИНСТВЕННЫЕ два сигнала во всём этом
126 // классе, которые старый парсер не просто "не эмитит", пока
127 // current_status == WORK, а буквально ЗАМОРАЖИВАЕТ (не даёт их
128 // собственному "предыдущему" значению обновиться, пока идёт WORK -
129 // cond.cpp:1549, 1580-1584) - иначе первое же сравнение СРАЗУ после
130 // выхода из WORK сравнивало бы не с состоянием ДО WORK, а с
131 // произвольным шумом, накопившимся во время него. Реализовано ниже:
132 // m_previous_ для этих двух бит специально не трогается, пока
133 // current_status == WORK (см. конец функции).
134 if (current_status != BoardPacketTypes::WORK) {
135 if (fresh.m_emptyLeftCoffeBunker != m_previous_.m_emptyLeftCoffeBunker) {
136 events.push_back(fresh.m_emptyLeftCoffeBunker
139 }
140 if (fresh.m_emptyRightCoffeBunker !=
141 m_previous_.m_emptyRightCoffeBunker) {
142 events.push_back(fresh.m_emptyRightCoffeBunker
145 }
146 }
147 if (fresh.m_leftBunkerCoffeeMissing !=
148 m_previous_.m_leftBunkerCoffeeMissing) {
149 events.push_back(fresh.m_leftBunkerCoffeeMissing
152 }
153 if (fresh.m_rightBunkerCoffeeOrBothMissing !=
154 m_previous_.m_rightBunkerCoffeeOrBothMissing) {
155 events.push_back(fresh.m_rightBunkerCoffeeOrBothMissing
158 }
159
160 // байт 12 (cond.cpp:1616-1646)
161 if (fresh.m_emptyLeftBulkBunker != m_previous_.m_emptyLeftBulkBunker) {
162 events.push_back(fresh.m_emptyLeftBulkBunker
165 }
166 if (fresh.m_emptyRightBulkBunker != m_previous_.m_emptyRightBulkBunker) {
167 events.push_back(fresh.m_emptyRightBulkBunker
170 }
171
172 // байт 13 (cond.cpp:1648-1678)
173 if (fresh.m_systemLackOfWater != m_previous_.m_systemLackOfWater) {
174 events.push_back(fresh.m_systemLackOfWater
177 }
178 if (fresh.m_systemOverPressure != m_previous_.m_systemOverPressure) {
179 events.push_back(fresh.m_systemOverPressure
182 }
183
184 // байт 15 (cond.cpp:1680-1710)
185 if (fresh.m_boilerTooLow != m_previous_.m_boilerTooLow) {
186 events.push_back(fresh.m_boilerTooLow
189 }
190 if (fresh.m_steamBoilTooLow != m_previous_.m_steamBoilTooLow) {
191 events.push_back(fresh.m_steamBoilTooLow
194 }
195
196 // байты 14+17 (cond.cpp:1712-1753) - milkMissing/selfDiagnosisBrewingUnit
197 // читаются ДВАЖДЫ (одноимённая пара в каждом байте) и объединяются
198 // через OR ПЕРЕД сравнением - независимо друг от друга их читать
199 // нельзя, старый парсер тоже сравнивает только объединённое значение.
200 const bool old_milk_missing =
201 m_previous_.m_milkMissing || m_previous_.m_milkMissing2;
202 const bool new_milk_missing = fresh.m_milkMissing || fresh.m_milkMissing2;
203 if (old_milk_missing != new_milk_missing) {
204 events.push_back(new_milk_missing ? BoardFlagsEvent::MILK_EMPTY
206 }
207 const bool old_needs_diagnosis = m_previous_.m_selfDiagnosisBrewingUnit ||
208 m_previous_.m_selfDiagnosisBrewingUnit2;
209 const bool new_needs_diagnosis =
210 fresh.m_selfDiagnosisBrewingUnit || fresh.m_selfDiagnosisBrewingUnit2;
211 if (old_needs_diagnosis != new_needs_diagnosis) {
212 events.push_back(new_needs_diagnosis
215 }
216
217 // байт 18 (cond.cpp:1755-1815)
218 if (fresh.m_heatingWaterBoilerTimeToLong !=
219 m_previous_.m_heatingWaterBoilerTimeToLong) {
220 events.push_back(fresh.m_heatingWaterBoilerTimeToLong
223 }
224 if (fresh.m_heatingSteamBoilerTimeToLong !=
225 m_previous_.m_heatingSteamBoilerTimeToLong) {
226 events.push_back(fresh.m_heatingSteamBoilerTimeToLong
229 }
230 if (fresh.m_hotSteamBoilSensError != m_previous_.m_hotSteamBoilSensError) {
231 events.push_back(fresh.m_hotSteamBoilSensError
234 }
235 if (fresh.m_hotWaterBoilSensError != m_previous_.m_hotWaterBoilSensError) {
236 events.push_back(fresh.m_hotWaterBoilSensError
239 }
240
241 // байт 19 (cond.cpp:1817-1877)
242 if (fresh.m_brewingMechError != m_previous_.m_brewingMechError) {
243 events.push_back(fresh.m_brewingMechError
246 }
247 if (fresh.m_waterSupplyError != m_previous_.m_waterSupplyError) {
248 events.push_back(fresh.m_waterSupplyError
251 }
252 if (fresh.m_rightCoffeeGrindError != m_previous_.m_rightCoffeeGrindError) {
253 events.push_back(fresh.m_rightCoffeeGrindError
256 }
257 if (fresh.m_leftCoffeeGrindError != m_previous_.m_leftCoffeeGrindError) {
258 events.push_back(fresh.m_leftCoffeeGrindError
261 }
262
263 BoardFlags next_previous = fresh;
264 if (current_status == BoardPacketTypes::WORK) {
265 // См. doc-комментарий emptyLeft/RightCoffeBunker выше - заморозка,
266 // а не просто пропуск события.
267 next_previous.m_emptyLeftCoffeBunker = m_previous_.m_emptyLeftCoffeBunker;
268 next_previous.m_emptyRightCoffeBunker =
269 m_previous_.m_emptyRightCoffeBunker;
270 }
271 m_previous_ = next_previous;
272 return events;
273 }
274
275 private:
276 BoardFlags m_previous_{};
277 bool m_has_previous_{false};
278};
279
280} // namespace proto::back_board_proto
Прототип полей протокола задней (back) платы: типы пакетов, статусные флаги BoardFlags/StatusFieldDat...
Хранит предыдущий BoardFlags и превращает КАЖДЫЙ diff() вызов в список событий для всех битов,...
auto diff(const BoardFlags &fresh, BoardPacketTypes current_status) -> std::vector< BoardFlagsEvent >
define IND_BYTE_LENGTH_PACKET (uint8_t)1U* define IND_BYTE_MAIN_STATUS (uint8_t)2U* define IND_BYTE_S...