Skip to content

Commit ec593e6

Browse files
committed
Merge remote-tracking branch 'OFW/astra/3934-alarm-improvements' into dev
2 parents 0a92497 + 00e64e8 commit ec593e6

File tree

6 files changed

+92
-3
lines changed

6 files changed

+92
-3
lines changed

applications/services/gui/gui.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ static void gui_redraw(Gui* gui) {
249249

250250
canvas_reset(gui->canvas);
251251

252-
if(gui->lockdown) {
252+
if(gui_is_lockdown(gui)) {
253253
gui_redraw_desktop(gui);
254254
bool need_attention =
255255
(gui_view_port_find_enabled(gui->layers[GuiLayerWindow]) != 0 ||
@@ -299,7 +299,7 @@ static void gui_input(Gui* gui, InputEvent* input_event) {
299299

300300
ViewPort* view_port = NULL;
301301

302-
if(gui->lockdown) {
302+
if(gui_is_lockdown(gui)) {
303303
view_port = gui_view_port_find_enabled(gui->layers[GuiLayerDesktop]);
304304
} else {
305305
view_port = gui_view_port_find_enabled(gui->layers[GuiLayerFullscreen]);
@@ -495,6 +495,23 @@ void gui_set_lockdown(Gui* gui, bool lockdown) {
495495
gui_update(gui);
496496
}
497497

498+
void gui_set_lockdown_inhibit(Gui* gui, bool inhibit) {
499+
furi_check(gui);
500+
501+
gui_lock(gui);
502+
gui->lockdown_inhibit = inhibit;
503+
gui_unlock(gui);
504+
505+
// Request redraw
506+
gui_update(gui);
507+
}
508+
509+
bool gui_is_lockdown(const Gui* gui) {
510+
furi_check(gui);
511+
512+
return gui->lockdown && !gui->lockdown_inhibit;
513+
}
514+
498515
Canvas* gui_direct_draw_acquire(Gui* gui) {
499516
furi_check(gui);
500517

applications/services/gui/gui.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,23 @@ size_t gui_get_framebuffer_size(const Gui* gui);
110110
*/
111111
void gui_set_lockdown(Gui* gui, bool lockdown);
112112

113+
/** Inhibit lockdown mode
114+
*
115+
* Lockdown mode can be inhibited by calling this function with inhibit set to true.
116+
* This is used to show information even when flipper is locked.
117+
*
118+
* @param gui Gui instance
119+
* @param inhibit true to inhibit lockdown mode
120+
*/
121+
void gui_set_lockdown_inhibit(Gui* gui, bool inhibit);
122+
123+
/** Check if Gui is in lockdown mode
124+
*
125+
* @param gui Gui instance
126+
* @return bool true if Gui is in lockdown mode
127+
*/
128+
bool gui_is_lockdown(const Gui* gui);
129+
113130
/** Acquire Direct Draw lock and get Canvas instance
114131
*
115132
* This method return Canvas instance for use in monopoly mode. Direct draw lock

applications/services/gui/gui_i.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct Gui {
5151

5252
// Layers and Canvas
5353
bool lockdown;
54+
bool lockdown_inhibit;
5455
bool direct_draw;
5556
ViewPortArray_t layers[GuiLayerMAX];
5657
Canvas* canvas;

applications/settings/clock_settings/clock_settings_alarm.c

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@
1111

1212
#define TAG "ClockSettingsAlarm"
1313

14+
#define SNOOZE_MINUTES 9
15+
#define TIMEOUT_MINUTES 10
16+
1417
typedef struct {
1518
DateTime now;
19+
DateTime snooze_until;
20+
DateTime alarm_start;
1621
IconAnimation* icon;
22+
23+
bool is_snooze;
1724
} ClockSettingsAlramModel;
1825

1926
const NotificationSequence sequence_alarm = {
@@ -47,12 +54,15 @@ static void clock_settings_alarm_draw_callback(Canvas* canvas, void* ctx) {
4754
ClockSettingsAlramModel* model = ctx;
4855
char buffer[64] = {};
4956

57+
// Clock icon
5058
canvas_draw_icon_animation(canvas, 5, 6, model->icon);
5159

60+
// Time
5261
canvas_set_font(canvas, FontBigNumbers);
5362
snprintf(buffer, sizeof(buffer), "%02u:%02u", model->now.hour, model->now.minute);
5463
canvas_draw_str(canvas, 58, 32, buffer);
5564

65+
// Date
5666
canvas_set_font(canvas, FontPrimary);
5767
snprintf(
5868
buffer,
@@ -62,6 +72,11 @@ static void clock_settings_alarm_draw_callback(Canvas* canvas, void* ctx) {
6272
model->now.month,
6373
model->now.year);
6474
canvas_draw_str(canvas, 60, 44, buffer);
75+
76+
// Press Back to snooze
77+
canvas_set_font(canvas, FontPrimary);
78+
canvas_draw_icon_ex(canvas, 5, 50, &I_back_btn_10x8, 0);
79+
canvas_draw_str_aligned(canvas, 20, 50, AlignLeft, AlignTop, "Snooze");
6580
}
6681

6782
static void clock_settings_alarm_input_callback(InputEvent* input_event, void* ctx) {
@@ -81,8 +96,10 @@ int32_t clock_settings_alarm(void* p) {
8196

8297
// View Model
8398
ClockSettingsAlramModel model;
99+
model.is_snooze = false;
84100

85101
furi_hal_rtc_get_datetime(&model.now);
102+
furi_hal_rtc_get_alarm(&model.alarm_start);
86103
model.icon = icon_animation_alloc(&A_Alarm_47x39);
87104

88105
// Alloc message queue
@@ -95,6 +112,7 @@ int32_t clock_settings_alarm(void* p) {
95112

96113
// Register view port in GUI
97114
Gui* gui = furi_record_open(RECORD_GUI);
115+
gui_set_lockdown_inhibit(gui, true);
98116
gui_add_view_port(gui, view_port, GuiLayerFullscreen);
99117

100118
NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION);
@@ -110,12 +128,43 @@ int32_t clock_settings_alarm(void* p) {
110128
while(running) {
111129
if(furi_message_queue_get(event_queue, &event, 2000) == FuriStatusOk) {
112130
if(event.type == InputTypePress) {
113-
running = false;
131+
// Snooze
132+
if(event.key == InputKeyBack) {
133+
furi_hal_rtc_get_datetime(&model.snooze_until);
134+
model.snooze_until.minute += SNOOZE_MINUTES;
135+
model.snooze_until.hour += model.snooze_until.minute / 60;
136+
model.snooze_until.minute %= 60;
137+
model.snooze_until.hour %= 24;
138+
139+
model.is_snooze = true;
140+
model.alarm_start = model.snooze_until; // For correct timeout behavior
141+
view_port_enabled_set(view_port, false);
142+
gui_set_lockdown_inhibit(gui, false);
143+
} else {
144+
running = false;
145+
}
146+
}
147+
} else if(model.is_snooze) {
148+
furi_hal_rtc_get_datetime(&model.now);
149+
if(datetime_datetime_to_timestamp(&model.now) >=
150+
datetime_datetime_to_timestamp(&model.snooze_until)) {
151+
view_port_enabled_set(view_port, true);
152+
gui_set_lockdown_inhibit(gui, true);
153+
154+
model.is_snooze = false;
114155
}
115156
} else {
116157
notification_message(notification, &sequence_alarm);
117158
furi_hal_rtc_get_datetime(&model.now);
118159
view_port_update(view_port);
160+
161+
// Stop the alarm if it has been ringing for more than TIMEOUT_MINUTES
162+
if((model.now.hour == model.alarm_start.hour &&
163+
model.now.minute >= model.alarm_start.minute + TIMEOUT_MINUTES) ||
164+
(model.now.hour == (model.alarm_start.hour + 1) % 24 &&
165+
model.now.minute < (model.alarm_start.minute + TIMEOUT_MINUTES) % 60)) {
166+
running = false;
167+
}
119168
}
120169
}
121170

@@ -125,6 +174,7 @@ int32_t clock_settings_alarm(void* p) {
125174
furi_record_close(RECORD_NOTIFICATION);
126175

127176
view_port_enabled_set(view_port, false);
177+
gui_set_lockdown_inhibit(gui, false);
128178
gui_remove_view_port(gui, view_port);
129179
view_port_free(view_port);
130180
furi_message_queue_free(event_queue);

targets/f18/api_symbols.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,9 +1741,11 @@ Function,+,gui_add_view_port,void,"Gui*, ViewPort*, GuiLayer"
17411741
Function,+,gui_direct_draw_acquire,Canvas*,Gui*
17421742
Function,+,gui_direct_draw_release,void,Gui*
17431743
Function,+,gui_get_framebuffer_size,size_t,const Gui*
1744+
Function,+,gui_is_lockdown,_Bool,const Gui*
17441745
Function,+,gui_remove_framebuffer_callback,void,"Gui*, GuiCanvasCommitCallback, void*"
17451746
Function,+,gui_remove_view_port,void,"Gui*, ViewPort*"
17461747
Function,+,gui_set_lockdown,void,"Gui*, _Bool"
1748+
Function,+,gui_set_lockdown_inhibit,void,"Gui*, _Bool"
17471749
Function,-,gui_view_port_send_to_back,void,"Gui*, ViewPort*"
17481750
Function,+,gui_view_port_send_to_front,void,"Gui*, ViewPort*"
17491751
Function,-,hci_send_req,int,"hci_request*, uint8_t"

targets/f7/api_symbols.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2007,9 +2007,11 @@ Function,+,gui_add_view_port,void,"Gui*, ViewPort*, GuiLayer"
20072007
Function,+,gui_direct_draw_acquire,Canvas*,Gui*
20082008
Function,+,gui_direct_draw_release,void,Gui*
20092009
Function,+,gui_get_framebuffer_size,size_t,const Gui*
2010+
Function,+,gui_is_lockdown,_Bool,const Gui*
20102011
Function,+,gui_remove_framebuffer_callback,void,"Gui*, GuiCanvasCommitCallback, void*"
20112012
Function,+,gui_remove_view_port,void,"Gui*, ViewPort*"
20122013
Function,+,gui_set_lockdown,void,"Gui*, _Bool"
2014+
Function,+,gui_set_lockdown_inhibit,void,"Gui*, _Bool"
20132015
Function,-,gui_view_port_send_to_back,void,"Gui*, ViewPort*"
20142016
Function,+,gui_view_port_send_to_front,void,"Gui*, ViewPort*"
20152017
Function,-,hci_send_req,int,"hci_request*, uint8_t"

0 commit comments

Comments
 (0)