Fix red
[Rockbox.git] / apps / alarm_menu.c
blob391558a34e42462943d044f650f994e6f6e8c766
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2003 Uwe Freese
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
19 #include "config.h"
21 #ifdef HAVE_RTC_ALARM
23 #include <stdbool.h>
25 #include "lcd.h"
26 #include "action.h"
27 #include "kernel.h"
28 #include "sprintf.h"
29 #include <string.h>
30 #include "settings.h"
31 #include "power.h"
32 #include "icons.h"
33 #include "rtc.h"
34 #include "misc.h"
35 #include "screens.h"
36 #include"talk.h"
37 #include "lang.h"
38 #include "power.h"
39 #include "alarm_menu.h"
40 #include "backlight.h"
41 #include "splash.h"
42 #include "statusbar.h"
43 #include "textarea.h"
45 static void speak_time(int hours, int minutes, bool speak_hours)
47 if (global_settings.talk_menu){
48 if(speak_hours) {
49 talk_value(hours, UNIT_HOUR, false);
50 talk_value(minutes, UNIT_MIN, true);
51 } else {
52 talk_value(minutes, UNIT_MIN, false);
57 bool alarm_screen(void)
59 int h, m;
60 bool done=false;
61 char buf[32];
62 struct tm *tm;
63 int togo;
64 int button;
65 int i;
66 bool update = true;
67 bool hour_wrapped = false;
69 rtc_get_alarm(&h, &m);
71 /* After a battery change the RTC values are out of range */
72 if (m > 60 || h > 24) {
73 m = 0;
74 h = 12;
75 } else {
76 m = m / 5 * 5; /* 5 min accuracy should be enough */
79 while(!done) {
80 if(update)
82 FOR_NB_SCREENS(i)
84 screens[i].setmargins(0, 0);
85 gui_textarea_clear(&screens[i]);
86 screens[i].puts(0, 3, str(LANG_ALARM_MOD_KEYS));
88 /* Talk when entering the wakeup screen */
89 if (global_settings.talk_menu)
91 talk_value(h, UNIT_HOUR, true);
92 talk_value(m, UNIT_MIN, true);
94 update = false;
97 snprintf(buf, 32, str(LANG_ALARM_MOD_TIME), h, m);
98 FOR_NB_SCREENS(i)
100 screens[i].puts(0, 1, buf);
101 gui_textarea_update(&screens[i]);
103 button = get_action(CONTEXT_SETTINGS,HZ);
105 switch(button) {
106 case ACTION_STD_OK:
107 /* prevent that an alarm occurs in the shutdown procedure */
108 /* accept alarms only if they are in 2 minutes or more */
109 tm = get_time();
110 togo = (m + h * 60 - tm->tm_min - tm->tm_hour * 60 + 1440) % 1440;
112 if (togo > 1) {
113 rtc_init();
114 rtc_set_alarm(h,m);
115 rtc_enable_alarm(true);
116 if (global_settings.talk_menu)
118 talk_id(LANG_ALARM_MOD_TIME_TO_GO, true);
119 talk_value(togo / 60, UNIT_HOUR, true);
120 talk_value(togo % 60, UNIT_MIN, true);
121 talk_force_enqueue_next();
123 gui_syncsplash(HZ*2, str(LANG_ALARM_MOD_TIME_TO_GO),
124 togo / 60, togo % 60);
125 done = true;
126 } else {
127 gui_syncsplash(HZ, ID2P(LANG_ALARM_MOD_ERROR));
128 update = true;
130 break;
132 /* inc(m) */
133 case ACTION_SETTINGS_INC:
134 case ACTION_SETTINGS_INCREPEAT:
135 m += 5;
136 if (m == 60) {
137 h += 1;
138 m = 0;
139 hour_wrapped = true;
141 if (h == 24)
142 h = 0;
144 speak_time(h, m, hour_wrapped);
145 break;
147 /* dec(m) */
148 case ACTION_SETTINGS_DEC:
149 case ACTION_SETTINGS_DECREPEAT:
150 m -= 5;
151 if (m == -5) {
152 h -= 1;
153 m = 55;
154 hour_wrapped = true;
156 if (h == -1)
157 h = 23;
159 speak_time(h, m, hour_wrapped);
160 break;
162 /* inc(h) */
163 case ACTION_STD_NEXT:
164 case ACTION_STD_NEXTREPEAT:
165 h = (h+1) % 24;
167 if (global_settings.talk_menu)
168 talk_value(h, UNIT_HOUR, false);
169 break;
171 /* dec(h) */
172 case ACTION_STD_PREV:
173 case ACTION_STD_PREVREPEAT:
174 h = (h+23) % 24;
176 if (global_settings.talk_menu)
177 talk_value(h, UNIT_HOUR, false);
178 break;
180 case ACTION_STD_CANCEL:
181 rtc_enable_alarm(false);
182 gui_syncsplash(HZ*2, ID2P(LANG_ALARM_MOD_DISABLE));
183 done = true;
184 break;
186 case ACTION_NONE:
187 gui_syncstatusbar_draw(&statusbars, false);
188 hour_wrapped = false;
189 break;
191 default:
192 if(default_event_handler(button) == SYS_USB_CONNECTED)
194 rtc_enable_alarm(false);
195 return true;
197 break;
200 return false;
203 #endif /* HAVE_RTC_ALARM */