EmlaLockSafe
SetTimerView.h
Go to the documentation of this file.
1
5#pragma once
6
7#include "LockState.h"
8#include "ViewStore.h"
9
10#include <DialogYesNoBack.h>
11#include <MenuView.h>
12#include <RotaryEncoder.h>
13#include <ViewBase.h>
14
15namespace views {
19class SetTimerView : public lcd::ViewBase {
20protected:
24 RotaryEncoder* encoder;
25
26protected:
30 const int numberOfColumns;
31
32protected:
36 const int numberOfRows;
37
38protected:
42 uint8_t numberOfDays;
43
44protected:
49
50protected:
55
56protected:
64 uint8_t editIndex;
65
66public:
75 SetTimerView(LiquidCrystal_PCF8574* display, RotaryEncoder* encoder, const int& numberOfColumns, const int& numberOfRows)
76 : lcd::ViewBase(display, "SetTimerView")
80
81public:
85 SetTimerView(const SetTimerView& other) = delete;
86
87public:
91 SetTimerView(SetTimerView&& other) noexcept = delete;
92
93protected:
97 virtual void activate() {
98 display->clear();
99
100 // reset the values
101 numberOfDays = 0;
102 numberOfHours = 0;
103 numberOfMinutes = 0;
104 editIndex = 0;
105
106 // redraw everything
107 tick(true);
108 }
109
110public:
116 virtual void tick(const bool& forceRedraw) {
117 bool redraw = forceRedraw;
118
119 // handle the encoder
120 handleEncoderRotation(redraw);
121 if (!handleEncoderClick(redraw)) {
122 return;
123 }
124
125 // redraw the timer settings
126 if (redraw) {
127 display->setCursor(0, 0);
128 display->print("Set Lock Timer:");
129
130 display->setCursor(0, 1);
131 display->printf("%s%d%cdays ", (editIndex == 0 ? ">" : ""), numberOfDays, (editIndex == 0 ? '<' : ' '));
132 display->setCursor(0, 2);
133 char buf[25];
134 sprintf(buf,
135 "%s%d%chours %s%d%cminutes ",
136 (editIndex == 1 ? ">" : ""),
138 (editIndex == 1 ? '<' : ' '),
139 (editIndex == 2 ? ">" : ""),
141 (editIndex == 2 ? '<' : ' '));
142 buf[20] = '\0';
143 display->print(buf);
144 }
145
146 // redraw end-time
147 time_t setTime = time(NULL) + ((((time_t)numberOfDays) * 24 + ((time_t)numberOfHours)) * 60 + ((time_t)numberOfMinutes)) * 60;
148 static time_t lastDisplayedTime = 0;
149 if (redraw || (setTime != lastDisplayedTime)) {
150 tm tmBuf;
151 char buf[21];
152 strftime(buf, 20, "(%d.%m.%Y %R)", localtime_r(&setTime, &tmBuf));
153 display->setCursor(0, 3);
154 display->print(buf);
155
156 lastDisplayedTime = setTime;
157 }
158 }
159
160protected:
166 void handleEncoderRotation(bool& redraw) {
167 // read the state of the encoder
168 auto direction = encoder->getDirection();
169
170 // increase the selected value?
171 if (direction == RotaryEncoder::Direction::CLOCKWISE) {
172 switch (editIndex) {
173 case 0:
174 numberOfDays++;
175 break;
176 case 1:
178 if (numberOfHours == 24) {
179 numberOfHours = 0;
180 }
181 break;
182 case 2:
184 if (numberOfMinutes == 60) {
185 numberOfMinutes = 0;
186 }
187 break;
188 }
189 redraw = true; // redraw required
190 }
191
192 // decrease the selected value?
193 if (direction == RotaryEncoder::Direction::COUNTERCLOCKWISE) {
194 switch (editIndex) {
195 case 0:
196 numberOfDays--;
197 break;
198 case 1:
199 if (numberOfHours == 0) {
200 numberOfHours = 24;
201 }
203 break;
204 case 2:
205 if (numberOfMinutes == 0) {
206 numberOfMinutes = 60;
207 }
209 break;
210 }
211 redraw = true; // redraw required
212 }
213 }
214
215protected:
223 bool handleEncoderClick(bool& redraw) {
224 // was the button pressed?
225 if (encoder->getNewClick()) {
226 // select the next value
227 editIndex++;
228 redraw = true; // redraw required
229
230 // check if all 3 values were updated
231 if (editIndex == 3) {
232 // generate the dialog message for the are you sure question:
233 time_t endDate = time(NULL) +
234 ((((time_t)numberOfDays) * 24 + ((time_t)numberOfHours)) * 60 + ((time_t)numberOfMinutes)) * 60;
235 tm tmBuf;
236 char buf[61];
237 strftime(buf, 61, "Are you sure to lock\nuntil\n%d.%m.%Y %R?", localtime_r(&endDate, &tmBuf));
238
239 // display dialog
240 switch (lcd::DialogYesNoBack(display, encoder, buf, numberOfColumns, numberOfRows)
241 .showModal(lcd::DialogYesNoBack::DialogResult::no)) {
242 case lcd::DialogYesNoBack::DialogResult::yes:
245
246 return false; // immediately skip tick
247 case lcd::DialogYesNoBack::DialogResult::no:
248 return true;
249 case lcd::DialogYesNoBack::DialogResult::back:
250 // go back to menu
251 activatePreviousView();
252 return false;
253 }
254 }
255 }
256 return true;
257 }
258};
259} // namespace views
static void setCachedEndDate(const time_t &cachedEndDate)
Set the Cached End Date.
Definition: LockState.h:403
View used to set a manual timer without EmlaLock in the background.
Definition: SetTimerView.h:19
SetTimerView(const SetTimerView &other)=delete
Copy constructor - not available.
const int numberOfColumns
Number of display-columns.
Definition: SetTimerView.h:30
virtual void activate()
called as soon as the view becomes active
Definition: SetTimerView.h:97
uint8_t numberOfMinutes
current selection of the number of minutes
Definition: SetTimerView.h:54
SetTimerView(LiquidCrystal_PCF8574 *display, RotaryEncoder *encoder, const int &numberOfColumns, const int &numberOfRows)
Construct the new set timer view.
Definition: SetTimerView.h:75
const int numberOfRows
Number of display-rows.
Definition: SetTimerView.h:36
uint8_t numberOfHours
current selection of the number of hours
Definition: SetTimerView.h:48
void handleEncoderRotation(bool &redraw)
handles if the encoder was rotated
Definition: SetTimerView.h:166
RotaryEncoder * encoder
pointer to the encoder instance
Definition: SetTimerView.h:24
bool handleEncoderClick(bool &redraw)
handles if the encoder was rotated
Definition: SetTimerView.h:223
virtual void tick(const bool &forceRedraw)
called during the loop function
Definition: SetTimerView.h:116
SetTimerView(SetTimerView &&other) noexcept=delete
Move constructor - not available.
uint8_t numberOfDays
current selection of the number of days
Definition: SetTimerView.h:42
uint8_t editIndex
selection what field can be changed:
Definition: SetTimerView.h:64
static bool activateView(const ViewId &id)
activates the view described by the id
Definition: ViewStore.h:98
@ SelectDisplayTimePassed
Definition: ViewStore.h:34
views::ConfigurationServerView configurationServerView & display
Definition: main.cpp:57
Definition: ConfigurationServerView.h:10