Skip to content

Commit d35976c

Browse files
committed
Add 12-hour time support
1 parent 735664d commit d35976c

File tree

2 files changed

+82
-6
lines changed

2 files changed

+82
-6
lines changed

applications/examples/example_date_time_input/scenes/example_date_time_input_scene_show_date_time.c

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,30 @@ static void example_date_time_input_scene_update_view(void* context) {
1313

1414
dialog_ex_set_header(dialog_ex, "The date and time are", 64, 0, AlignCenter, AlignTop);
1515

16-
char buffer[26] = {};
16+
uint8_t hour = app->date_time.hour;
17+
char label_hour[4] = "";
18+
if(furi_hal_rtc_get_locale_timeformat() == FuriHalRtcLocaleTimeFormat12h) {
19+
if(hour < 12) {
20+
snprintf(label_hour, sizeof(label_hour), " AM");
21+
} else {
22+
snprintf(label_hour, sizeof(label_hour), " PM");
23+
}
24+
hour %= 12;
25+
if(hour == 0) hour = 12;
26+
}
27+
28+
char buffer[29] = {};
1729
snprintf(
1830
buffer,
1931
sizeof(buffer),
20-
"%04d-%02d-%02d\n%02d:%02d:%02d",
32+
"%04d-%02d-%02d\n%02d:%02d:%02d%s",
2133
app->date_time.year,
2234
app->date_time.month,
2335
app->date_time.day,
24-
app->date_time.hour,
36+
hour,
2537
app->date_time.minute,
26-
app->date_time.second);
38+
app->date_time.second,
39+
label_hour);
2740
dialog_ex_set_text(dialog_ex, buffer, 64, 29, AlignCenter, AlignCenter);
2841

2942
dialog_ex_set_left_button_text(dialog_ex, "Date");

applications/services/gui/modules/date_time_input.c

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "date_time_input.h"
2+
#include "furi_hal_rtc.h"
23
#include <furi.h>
34
#include <assets_icons.h>
45

@@ -88,9 +89,31 @@ static inline void date_time_input_draw_block(
8889
}
8990
}
9091

91-
static void date_time_input_draw_time_callback(Canvas* canvas, DateTimeInputModel* model) {
92-
furi_check(model->datetime);
92+
static inline void date_time_input_draw_text(
93+
Canvas* canvas,
94+
int32_t x,
95+
int32_t y,
96+
size_t w,
97+
size_t h,
98+
Font font,
99+
EditState state,
100+
const char* text) {
101+
furi_assert(canvas);
102+
furi_assert(text);
93103

104+
canvas_set_color(canvas, ColorBlack);
105+
if(state != EditStateDisabled && state != EditStateNone) {
106+
canvas_set_color(canvas, ColorWhite);
107+
}
108+
109+
canvas_set_font(canvas, font);
110+
canvas_draw_str_aligned(canvas, x + w / 2, y + h / 2, AlignCenter, AlignCenter, text);
111+
if(state != EditStateNone) {
112+
canvas_set_color(canvas, ColorBlack);
113+
}
114+
}
115+
116+
static void date_time_input_draw_hour_24hr_callback(Canvas* canvas, DateTimeInputModel* model) {
94117
char buffer[64];
95118

96119
canvas_set_font(canvas, FontSecondary);
@@ -102,6 +125,46 @@ static void date_time_input_draw_time_callback(Canvas* canvas, DateTimeInputMode
102125
canvas, 30, ROW_1_Y, 28, ROW_1_H, FontBigNumbers, get_state(model, 1, 0, hour), buffer);
103126
canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7, 2, 2);
104127
canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7 - 6, 2, 2);
128+
}
129+
130+
static void date_time_input_draw_hour_12hr_callback(Canvas* canvas, DateTimeInputModel* model) {
131+
char buffer[64];
132+
133+
canvas_set_font(canvas, FontSecondary);
134+
canvas_draw_str(canvas, 0, ROW_1_Y - 2, " H H M M S S");
135+
canvas_set_font(canvas, FontPrimary);
136+
137+
uint8_t hour = model->datetime->hour % 12;
138+
// Show 12:00 instead of 00:00 for 12-hour time
139+
if(hour == 0) hour = 12;
140+
141+
// Placeholder XX since FontBigNumbers can't draw letters
142+
snprintf(buffer, sizeof(buffer), "%02u XX", hour);
143+
date_time_input_draw_block(
144+
canvas, 2, ROW_1_Y, 56, ROW_1_H, FontBigNumbers, get_state(model, 1, 0, hour), buffer);
145+
canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7, 2, 2);
146+
canvas_draw_box(canvas, 60, ROW_1_Y + ROW_1_H - 7 - 6, 2, 2);
147+
148+
if(model->datetime->hour < 12) {
149+
snprintf(buffer, sizeof(buffer), "AM");
150+
} else {
151+
snprintf(buffer, sizeof(buffer), "PM");
152+
}
153+
date_time_input_draw_text(
154+
canvas, 28, ROW_1_Y + 3, 28, ROW_1_H, FontPrimary, get_state(model, 1, 0, hour), buffer);
155+
}
156+
157+
static void date_time_input_draw_time_callback(Canvas* canvas, DateTimeInputModel* model) {
158+
furi_check(model->datetime);
159+
160+
char buffer[64];
161+
162+
// Draw hour depending on RTC time format
163+
if(furi_hal_rtc_get_locale_timeformat() == FuriHalRtcLocaleTimeFormat24h) {
164+
date_time_input_draw_hour_24hr_callback(canvas, model);
165+
} else {
166+
date_time_input_draw_hour_12hr_callback(canvas, model);
167+
}
105168

106169
snprintf(buffer, sizeof(buffer), "%02u", model->datetime->minute);
107170
date_time_input_draw_block(

0 commit comments

Comments
 (0)