summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Braun <markus.braun@krawel.de>2002-08-09 12:38:45 +0000
committerMarkus Braun <markus.braun@krawel.de>2002-08-09 12:38:45 +0000
commit3181f68eff2951029e56293e6003eff34c499584 (patch)
treecf4f7f8641c894edfcd016b0447d7dfda27ea331
parente67db77d6a6a27861a10ac2ba8564e7f09486717 (diff)
downloadrockbox-3181f68eff2951029e56293e6003eff34c499584.zip
rockbox-3181f68eff2951029e56293e6003eff34c499584.tar.gz
rockbox-3181f68eff2951029e56293e6003eff34c499584.tar.bz2
rockbox-3181f68eff2951029e56293e6003eff34c499584.tar.xz
Added a time/date setting
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1645 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/settings.c117
-rw-r--r--apps/settings.h1
-rw-r--r--apps/settings_menu.c45
3 files changed, 163 insertions, 0 deletions
diff --git a/apps/settings.c b/apps/settings.c
index cda65aa..826d87a 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -549,3 +549,120 @@ void set_option(char* string, int* variable, char* options[], int numoptions )
}
lcd_stop_scroll();
}
+
+#ifdef HAVE_RTC
+#define INDEX_X 0
+#define INDEX_Y 1
+char *dayname[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
+char cursor[][2]={{9, 1}, {12, 1}, {15, 1}, {9, 2}, {12, 2}, {15, 2}};
+char daysinmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
+
+void set_time(char* string, int timedate[])
+{
+ bool done = false;
+ int button;
+ int min=0,steps=0;
+ int cursorpos=0;
+ int lastcursorpos=!cursorpos;
+ unsigned char buffer[19];
+ int realyear;
+ int julianday;
+ int i;
+
+ lcd_clear_display();
+ lcd_puts_scroll(0,0,string);
+
+ while ( !done ) {
+ /* calculate the number of days in febuary */
+ realyear=timedate[5]+2000;
+ if((realyear%4==0 && !(realyear%100 == 0)) || realyear%400 == 0) /* for february depends on year */
+ daysinmonth[1]=29;
+ else
+ daysinmonth[1]=28;
+
+ /* fix day if month or year changed */
+ timedate[3]=timedate[3]<daysinmonth[timedate[4]-1]?timedate[3]:daysinmonth[timedate[4]-1];
+
+ /* calculate day of week */
+ julianday=0;
+ for(i=0;i<timedate[4]-1;i++) {
+ julianday+=daysinmonth[i];
+ }
+ julianday+=timedate[3];
+ timedate[6]=(realyear+julianday+(realyear-1)/4-(realyear-1)/100+(realyear-1)/400+7-1)%7;
+
+ snprintf(buffer, sizeof(buffer), "Time %02d:%02d:%02d",
+ timedate[0],
+ timedate[1],
+ timedate[2]);
+ lcd_puts(0,1,buffer);
+
+ snprintf(buffer, sizeof(buffer), "Date %s %02d.%02d.%02d",
+ dayname[timedate[6]],
+ timedate[3],
+ timedate[4],
+ timedate[5]);
+ lcd_puts(0,2,buffer);
+ lcd_invertrect(cursor[cursorpos][INDEX_X]*6,cursor[cursorpos][INDEX_Y]*8,12,8);
+ lcd_puts(0,4,"ON to set");
+ lcd_puts(0,5,"OFF to revert");
+ lcd_update();
+
+ /* calculate the minimum and maximum for the number under cursor */
+ if(cursorpos!=lastcursorpos) {
+ lastcursorpos=cursorpos;
+ switch(cursorpos) {
+ case 0: /* hour */
+ min=0;
+ steps=24;
+ break;
+ case 1: /* minute */
+ case 2: /* second */
+ min=0;
+ steps=60;
+ break;
+ case 3: /* day */
+ min=1;
+ steps=daysinmonth[timedate[4]-1];
+ break;
+ case 4: /* month */
+ min=1;
+ steps=12;
+ break;
+ case 5: /* year */
+ min=0;
+ steps=100;
+ break;
+ }
+ }
+
+ button = button_get(true);
+ switch ( button ) {
+ case BUTTON_LEFT:
+ cursorpos=(cursorpos+6-1)%6;
+ break;
+ case BUTTON_RIGHT:
+ cursorpos=(cursorpos+6+1)%6;
+ break;
+ case BUTTON_UP:
+ timedate[cursorpos]=(timedate[cursorpos]+steps-min+1)%steps+min;
+ if(timedate[cursorpos] == 0) timedate[cursorpos]+=min;
+ break;
+ case BUTTON_DOWN:
+ timedate[cursorpos]=(timedate[cursorpos]+steps-min-1)%steps+min;
+ if(timedate[cursorpos] == 0) timedate[cursorpos]+=min;
+ break;
+ case BUTTON_ON:
+ done=true;
+ if (timedate[6] == 0) timedate[6]=7; /* rtc needs 1 .. 7 */
+ break;
+ case BUTTON_OFF:
+ done=true;
+ timedate[0]=-1;
+ break;
+ default:
+ break;
+ }
+ }
+}
+#endif
diff --git a/apps/settings.h b/apps/settings.h
index e66bf8f..a223e49 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -86,6 +86,7 @@ void set_int(char* string,
int step,
int min,
int max );
+void set_time(char* string, int timedate[]);
/* global settings */
extern struct user_settings global_settings;
diff --git a/apps/settings_menu.c b/apps/settings_menu.c
index 7ab1b04..948f1eb 100644
--- a/apps/settings_menu.c
+++ b/apps/settings_menu.c
@@ -33,6 +33,7 @@
#include "backlight.h"
#include "playlist.h" /* for playlist_shuffle */
#include "powermgmt.h"
+#include "rtc.h"
static void shuffle(void)
{
@@ -83,6 +84,47 @@ static void statusbar(void)
}
#endif
+#ifdef HAVE_RTC
+static void timedate_set(void)
+{
+ int timedate[7]; /* hour,minute,second,day,month,year,dayofweek */
+
+
+ timedate[0] = rtc_read(0x03); /* hour */
+ timedate[1] = rtc_read(0x02); /* minute */
+ timedate[2] = rtc_read(0x01); /* second */
+ timedate[3] = rtc_read(0x05); /* day */
+ timedate[4] = rtc_read(0x06); /* month */
+ timedate[5] = rtc_read(0x07); /* year */
+ /* day of week not read, calculated */
+ timedate[0] = ((timedate[0] & 0x70) >> 4) * 10 + (timedate[0] & 0x0f); /* hour */
+ timedate[1] = ((timedate[1] & 0xf0) >> 4) * 10 + (timedate[1] & 0x0f); /* minute */
+ timedate[2] = ((timedate[2] & 0x30) >> 4) * 10 + (timedate[2] & 0x0f); /* second */
+ timedate[3] = ((timedate[3] & 0x30) >> 4) * 10 + (timedate[3] & 0x0f); /* day */
+ timedate[4] = ((timedate[4] & 0x30) >> 4) * 10 + (timedate[4] & 0x0f); /* month */
+ timedate[5] = ((timedate[5] & 0x30) >> 4) * 10 + (timedate[5] & 0x0f); /* year */
+
+ set_time("[Set time/date]",timedate);
+
+ if(timedate[0] != -1) {
+ timedate[0] = ((timedate[0]/10) << 4 | timedate[0]%10) & 0x3f; /* hour */
+ timedate[1] = ((timedate[1]/10) << 4 | timedate[1]%10) & 0x7f; /* minute */
+ timedate[2] = ((timedate[2]/10) << 4 | timedate[2]%10) & 0x7f; /* second */
+ timedate[3] = ((timedate[3]/10) << 4 | timedate[3]%10) & 0x3f; /* day */
+ timedate[4] = ((timedate[4]/10) << 4 | timedate[4]%10) & 0x1f; /* month */
+ timedate[5] = ((timedate[5]/10) << 4 | timedate[5]%10) & 0xff; /* year */
+ rtc_write(0x03, timedate[0] | (rtc_read(0x03) & 0xc0)); /* hour */
+ rtc_write(0x02, timedate[1] | (rtc_read(0x02) & 0x80)); /* minute */
+ rtc_write(0x01, timedate[2] | (rtc_read(0x01) & 0x80)); /* second */
+ rtc_write(0x05, timedate[3] | (rtc_read(0x05) & 0xc0)); /* day */
+ rtc_write(0x06, timedate[4] | (rtc_read(0x06) & 0xe0)); /* month */
+ rtc_write(0x07, timedate[5]); /* year */
+ rtc_write(0x04, timedate[6] | (rtc_read(0x04) & 0x07)); /* dayofweek */
+ rtc_write(0x00, 0x00); /* 0.1 + 0.01 seconds */
+ }
+}
+#endif
+
void settings_menu(void)
{
int m;
@@ -99,6 +141,9 @@ void settings_menu(void)
#ifdef HAVE_LCD_BITMAP
{ "Status bar", statusbar },
#endif
+#ifdef HAVE_RTC
+ { "Time/Date", timedate_set },
+#endif
};
bool old_shuffle = global_settings.playlist_shuffle;