1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2007 Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
31 #include "powermgmt.h"
34 #include "exported_menus.h"
41 #include "alarm_menu.h"
47 static int timedate_set(void)
49 /* Make a local copy of the time struct */
50 struct tm tm
= *get_time();
53 /* do some range checks */
54 /* This prevents problems with time/date setting after a power loss */
57 /* Macros to convert a 2-digit string to a decimal constant.
58 (YEAR), MONTH and DAY are set by the date command, which outputs
59 DAY as 00..31 and MONTH as 01..12. The leading zero would lead to
60 misinterpretation as an octal constant. */
61 #define S100(x) 1 ## x
62 #define C2DIG2DEC(x) (S100(x)-100)
67 tm
.tm_mday
= C2DIG2DEC(DAY
);
68 tm
.tm_mon
= C2DIG2DEC(MONTH
)-1;
70 tm
.tm_year
= YEAR
-1900;
73 result
= (int)set_time_screen(str(LANG_SET_TIME
), &tm
);
75 if(tm
.tm_year
!= -1) {
81 MENUITEM_FUNCTION(time_set
, 0, ID2P(LANG_SET_TIME
),
82 timedate_set
, NULL
, NULL
, Icon_NOICON
);
83 MENUITEM_SETTING(timeformat
, &global_settings
.timeformat
, NULL
);
86 extern const struct menu_item_ex sleep_timer_call
;
89 MENUITEM_FUNCTION(alarm_screen_call
, 0, ID2P(LANG_ALARM_MOD_ALARM_MENU
),
90 (menu_function
)alarm_screen
, NULL
, NULL
, Icon_NOICON
);
91 #if CONFIG_TUNER || defined(HAVE_RECORDING)
93 #if CONFIG_TUNER && !defined(HAVE_RECORDING)
94 /* This need only be shown if we dont have recording, because if we do
95 then always show the setting item, because there will always be at least
97 static int alarm_callback(int action
,const struct menu_item_ex
*this_item
)
102 case ACTION_REQUEST_MENUITEM
:
103 if (radio_hardware_present() == 0)
104 return ACTION_EXIT_MENUITEM
;
110 #define alarm_callback NULL
111 #endif /* CONFIG_TUNER && !HAVE_RECORDING */
112 /* have to do this manually because the setting screen
113 doesnt handle variable item count */
114 static int alarm_setting(void)
116 struct opt_items items
[ALARM_START_COUNT
];
118 items
[i
].string
= str(LANG_RESUME_PLAYBACK
);
119 items
[i
].voice_id
= LANG_RESUME_PLAYBACK
;
122 if (radio_hardware_present())
124 items
[i
].string
= str(LANG_FM_RADIO
);
125 items
[i
].voice_id
= LANG_FM_RADIO
;
129 #ifdef HAVE_RECORDING
130 items
[i
].string
= str(LANG_RECORDING
);
131 items
[i
].voice_id
= LANG_RECORDING
;
134 return set_option(str(LANG_ALARM_WAKEUP_SCREEN
),
135 &global_settings
.alarm_wake_up_screen
,
136 INT
, items
, i
, NULL
);
139 MENUITEM_FUNCTION(alarm_wake_up_screen
, 0, ID2P(LANG_ALARM_WAKEUP_SCREEN
),
140 alarm_setting
, NULL
, alarm_callback
, Icon_Menu_setting
);
141 #endif /* CONFIG_TUNER || defined(HAVE_RECORDING) */
143 #endif /* HAVE_RTC_ALARM */
144 static void talk_timedate(void)
146 struct tm
*tm
= get_time();
147 if (!global_settings
.talk_menu
)
149 talk_id(VOICE_CURRENT_TIME
, false);
153 talk_date(get_time(), true);
157 talk_id(LANG_UNKNOWN
, true);
161 static void draw_timedate(struct viewport
*vp
, struct screen
*display
)
163 struct tm
*tm
= get_time();
165 char time
[16], date
[16];
166 const char *t
= time
, *d
= date
;
169 display
->set_viewport(vp
);
170 display
->clear_viewport();
171 if (viewport_get_nb_lines(vp
) >= 4)
178 snprintf(time
, sizeof(time
), "%02d:%02d:%02d%s",
179 global_settings
.timeformat
== 0 ? tm
->tm_hour
:
180 ((tm
->tm_hour
+ 11) % 12) + 1,
183 global_settings
.timeformat
== 0 ? "" :
184 tm
->tm_hour
>11 ? " P" : " A");
185 snprintf(date
, sizeof(date
), "%s %d %d",
186 str(LANG_MONTH_JANUARY
+ tm
->tm_mon
),
193 d
= str(LANG_UNKNOWN
);
196 display
->puts(0, line
++, t
);
197 display
->puts(0, line
, d
);
199 display
->update_viewport();
200 display
->set_viewport(NULL
);
204 static struct viewport clock
[NB_SCREENS
], menu
[NB_SCREENS
];
205 static bool menu_was_pressed
;
206 static int time_menu_callback(int action
,
207 const struct menu_item_ex
*this_item
)
211 static int last_redraw
= 0;
214 if (TIME_BEFORE(last_redraw
+HZ
/2, current_tick
))
221 case ACTION_STD_CONTEXT
:
223 action
= ACTION_NONE
;
225 /* need to tell do_menu() to return, but then get time_screen()
226 to return 0! ACTION_STD_MENU will return GO_TO_PREVIOUS from here
227 so check do_menu()'s return val and menu_was_pressed */
228 case ACTION_STD_MENU
:
229 menu_was_pressed
= true;
234 last_redraw
= current_tick
;
236 draw_timedate(&clock
[i
], &screens
[i
]);
242 MAKE_MENU(time_menu
, ID2P(LANG_TIME_MENU
), time_menu_callback
, Icon_NOICON
,
243 &time_set
, &sleep_timer_call
,
244 #ifdef HAVE_RTC_ALARM
246 #if defined(HAVE_RECORDING) || CONFIG_TUNER
247 &alarm_wake_up_screen
,
252 int time_screen(void* ignored
)
255 int i
, nb_lines
, font_h
, ret
;
256 menu_was_pressed
= false;
260 viewport_set_defaults(&clock
[i
], i
);
261 #ifdef HAVE_BUTTONBAR
262 if (global_settings
.buttonbar
)
264 clock
[i
].height
-= BUTTONBAR_HEIGHT
;
267 nb_lines
= viewport_get_nb_lines(&clock
[i
]);
270 /* force time to be drawn centered */
271 clock
[i
].flags
|= VP_FLAG_ALIGN_CENTER
;
273 font_h
= font_get(clock
[i
].font
)->height
;
274 nb_lines
-= 2; /* at least 2 lines for menu */
278 clock
[i
].height
= nb_lines
*font_h
;
279 else /* disable the clock drawing */
281 menu
[i
].y
+= clock
[i
].height
;
282 menu
[i
].height
-= clock
[i
].height
;
283 draw_timedate(&clock
[i
], &screens
[i
]);
286 ret
= do_menu(&time_menu
, NULL
, menu
, false);
287 /* see comments above in the button callback */
288 if (!menu_was_pressed
&& ret
== GO_TO_PREVIOUS
)