diff options
Diffstat (limited to 'apps/alarm_menu.c')
| -rw-r--r-- | apps/alarm_menu.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/apps/alarm_menu.c b/apps/alarm_menu.c new file mode 100644 index 0000000..ba16743 --- /dev/null +++ b/apps/alarm_menu.c @@ -0,0 +1,154 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2003 Uwe Freese + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "config.h" +#include "options.h" + +#include "lcd.h" +#include "font.h" +#include "button.h" +#include "kernel.h" +#include "sprintf.h" +#include <string.h> +#include "settings.h" +#include "power.h" +#include "status.h" +#include "rtc.h" +#include <stdbool.h> + +#include "lang.h" +#include "power.h" +#include "alarm_menu.h" +#include "backlight.h" + +#ifdef HAVE_ALARM_MOD + +bool alarm_screen(void) +{ + /* get alarm time from RTC */ + + int h, m, hour, minute; + + rtc_get_alarm(&h, &m); + + m = m / 5 * 5; /* 5 min accuracy should be enough */ + + bool done=false; + char buf[32]; + + lcd_clear_display(); + lcd_puts(0,1, str(LANG_ALARM_MOD_KEYS)); + + while(!done) { + snprintf(buf, 32, str(LANG_ALARM_MOD_TIME), h, m); + lcd_puts(0,0, buf); + lcd_update(); + + switch(button_get(true)) { + case BUTTON_PLAY: + /* prevent that an alarm occurs in the shutdown procedure */ + /* accept alarms only if they are in 2 minutes or more */ + hour = rtc_read(0x03); + hour = ((hour & 0x30) >> 4) * 10 + (hour & 0x0f); + minute = rtc_read(0x02); + minute = ((minute & 0x70) >> 4) * 10 + (minute & 0x0f); + int togo = (m + h * 60 - minute - hour * 60 + 1440) % 1440; + if (togo > 1) { + lcd_clear_display(); + snprintf(buf, 32, str(LANG_ALARM_MOD_TIME_TO_GO), togo / 60, togo % 60); + lcd_puts(0,0, buf); + lcd_update(); + rtc_init(); + rtc_set_alarm(h,m); + /* in some cases enabling the alarm results in an activated AF flag */ + /* this should not happen, but it does */ + /* if you know why, tell me! */ + /* for now, we try again forever in this case */ + while (rtc_enable_alarm(true)) { /* error occured */ + sleep(HZ / 10); + rtc_init(); + rtc_set_alarm(h,m); + } + sleep(HZ); + lcd_puts(0,1,str(LANG_ALARM_MOD_SHUTDOWN)); + lcd_update(); + sleep(HZ); + power_off(); + } else { + lcd_clear_display(); + lcd_puts(0,0,str(LANG_ALARM_MOD_ERROR)); + lcd_update(); + sleep(HZ); + lcd_clear_display(); + lcd_puts(0,1,str(LANG_ALARM_MOD_KEYS)); + } + break; + + /* inc(m) */ + case BUTTON_RIGHT: + case BUTTON_RIGHT | BUTTON_REPEAT: + m += 5; + if (m == 60) { + h += 1; + m = 0; + } + if (h == 24) + h = 0; + break; + + /* dec(m) */ + case BUTTON_LEFT: + case BUTTON_LEFT | BUTTON_REPEAT: + m -= 5; + if (m == -5) { + h -= 1; + m = 55; + } + if (h == -1) + h = 23; + break; + +#ifdef HAVE_RECORDER_KEYPAD + /* inc(h) */ + case BUTTON_UP: + case BUTTON_UP | BUTTON_REPEAT: + h = (h+1) % 24; + break; + + /* dec(h) */ + case BUTTON_DOWN: + case BUTTON_DOWN | BUTTON_REPEAT: + h = (h+23) % 24; + break; +#endif + +#ifdef HAVE_RECORDER_KEYPAD + case BUTTON_OFF: +#else + case BUTTON_STOP: + case BUTTON_MENU: +#endif + done = true; + break; + } + } + + return false; +} + +#endif /* HAVE_ALARM_MOD */
\ No newline at end of file |