| /*************************************************************************** |
| * __________ __ ___. |
| * 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 */ |