diff options
| author | Markus Braun <markus.braun@krawel.de> | 2002-08-09 12:38:45 +0000 |
|---|---|---|
| committer | Markus Braun <markus.braun@krawel.de> | 2002-08-09 12:38:45 +0000 |
| commit | 3181f68eff2951029e56293e6003eff34c499584 (patch) | |
| tree | cf4f7f8641c894edfcd016b0447d7dfda27ea331 | |
| parent | e67db77d6a6a27861a10ac2ba8564e7f09486717 (diff) | |
| download | rockbox-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.c | 117 | ||||
| -rw-r--r-- | apps/settings.h | 1 | ||||
| -rw-r--r-- | apps/settings_menu.c | 45 |
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; |