made clock app live
don't love it, going to undo
This commit is contained in:
parent
f868b37a31
commit
677e113c4e
1 changed files with 92 additions and 30 deletions
120
src/clock/main.c
120
src/clock/main.c
|
|
@ -10,6 +10,18 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "api.h"
|
#include "api.h"
|
||||||
|
|
||||||
|
#define TICK_CLOCK 1 // behaves erratically, especially
|
||||||
|
|
||||||
|
enum {
|
||||||
|
CURSOR_YEAR,
|
||||||
|
CURSOR_MONTH,
|
||||||
|
CURSOR_DAY,
|
||||||
|
CURSOR_HOUR,
|
||||||
|
CURSOR_MINUTE,
|
||||||
|
CURSOR_SECOND,
|
||||||
|
CURSOR_AMPM,
|
||||||
|
};
|
||||||
|
|
||||||
int main(int argc , char* argv[]) {
|
int main(int argc , char* argv[]) {
|
||||||
SDL_Surface* screen = GFX_init();
|
SDL_Surface* screen = GFX_init();
|
||||||
|
|
||||||
|
|
@ -23,9 +35,11 @@ int main(int argc , char* argv[]) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
#define DIGIT_WIDTH 20
|
#define DIGIT_WIDTH 20
|
||||||
#define DIGIT_HEIGHT 32
|
#define DIGIT_HEIGHT 32
|
||||||
|
#define CHAR_SLASH 10
|
||||||
|
#define CHAR_COLON 11
|
||||||
while (c = chars[i]) {
|
while (c = chars[i]) {
|
||||||
digit = TTF_RenderUTF8_Blended(font.large, c, COLOR_WHITE);
|
digit = TTF_RenderUTF8_Blended(font.large, c, COLOR_WHITE);
|
||||||
int y = i==11 ? -3 : 0; // : sits too low naturally
|
int y = i==CHAR_COLON ? -3 : 0; // : sits too low naturally
|
||||||
SDL_BlitSurface(digit, NULL, digits, &(SDL_Rect){ (i * DIGIT_WIDTH) + (DIGIT_WIDTH - digit->w)/2, y + (DIGIT_HEIGHT - digit->h)/2});
|
SDL_BlitSurface(digit, NULL, digits, &(SDL_Rect){ (i * DIGIT_WIDTH) + (DIGIT_WIDTH - digit->w)/2, y + (DIGIT_HEIGHT - digit->h)/2});
|
||||||
SDL_FreeSurface(digit);
|
SDL_FreeSurface(digit);
|
||||||
i += 1;
|
i += 1;
|
||||||
|
|
@ -46,11 +60,31 @@ int main(int argc , char* argv[]) {
|
||||||
int32_t hour_selected = tm.tm_hour;
|
int32_t hour_selected = tm.tm_hour;
|
||||||
int32_t minute_selected = tm.tm_min;
|
int32_t minute_selected = tm.tm_min;
|
||||||
int32_t seconds_selected = tm.tm_sec;
|
int32_t seconds_selected = tm.tm_sec;
|
||||||
int am_selected = hour_selected < 12;
|
int32_t am_selected = tm.tm_hour < 12;
|
||||||
|
|
||||||
|
#ifdef TICK_CLOCK
|
||||||
|
void syncTime(void) {
|
||||||
|
int32_t day_diff = day_selected - tm.tm_mday;
|
||||||
|
int32_t month_diff = month_selected - (tm.tm_mon + 1);
|
||||||
|
int32_t year_diff = year_selected - (tm.tm_year + 1900);
|
||||||
|
int32_t hour_diff = hour_selected - tm.tm_hour;
|
||||||
|
int32_t minute_diff = minute_selected - tm.tm_min;
|
||||||
|
int32_t seconds_diff = seconds_selected - tm.tm_sec;
|
||||||
|
int32_t am_diff = am_selected == (tm.tm_hour < 12);
|
||||||
|
|
||||||
|
t = time(NULL);
|
||||||
|
tm = *localtime(&t);
|
||||||
|
|
||||||
|
day_selected = day_diff + tm.tm_mday;
|
||||||
|
month_selected = month_diff + (tm.tm_mon + 1);
|
||||||
|
year_selected = year_diff + (tm.tm_year + 1900);
|
||||||
|
hour_selected = hour_diff + tm.tm_hour;
|
||||||
|
minute_selected = minute_diff + tm.tm_min;
|
||||||
|
seconds_selected = seconds_diff + tm.tm_sec;
|
||||||
|
am_selected = am_diff + (tm.tm_hour < 12);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#define kSlash 10
|
|
||||||
#define kColon 11
|
|
||||||
#define kBar 12
|
|
||||||
int blit(int i, int x, int y) {
|
int blit(int i, int x, int y) {
|
||||||
SDL_BlitSurface(digits, &(SDL_Rect){i*20,0,20,32}, screen, &(SDL_Rect){x,y});
|
SDL_BlitSurface(digits, &(SDL_Rect){i*20,0,20,32}, screen, &(SDL_Rect){x,y});
|
||||||
return x + 20;
|
return x + 20;
|
||||||
|
|
@ -79,6 +113,10 @@ int main(int argc , char* argv[]) {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
void validate(void) {
|
void validate(void) {
|
||||||
|
#ifdef TICK_CLOCK
|
||||||
|
syncTime();
|
||||||
|
#endif
|
||||||
|
|
||||||
// leap year
|
// leap year
|
||||||
uint32_t february_days = 28;
|
uint32_t february_days = 28;
|
||||||
if ( ((year_selected % 4 == 0) && (year_selected % 100 != 0)) || (year_selected % 400 == 0)) february_days = 29;
|
if ( ((year_selected % 4 == 0) && (year_selected % 100 != 0)) || (year_selected % 400 == 0)) february_days = 29;
|
||||||
|
|
@ -122,6 +160,9 @@ int main(int argc , char* argv[]) {
|
||||||
|
|
||||||
int option_count = 7;
|
int option_count = 7;
|
||||||
|
|
||||||
|
#ifdef TICK_CLOCK
|
||||||
|
unsigned long second_start = SDL_GetTicks();
|
||||||
|
#endif
|
||||||
int dirty = 1;
|
int dirty = 1;
|
||||||
while(!quit) {
|
while(!quit) {
|
||||||
unsigned long frame_start = SDL_GetTicks();
|
unsigned long frame_start = SDL_GetTicks();
|
||||||
|
|
@ -131,64 +172,77 @@ int main(int argc , char* argv[]) {
|
||||||
if (PAD_justRepeated(BTN_UP)) {
|
if (PAD_justRepeated(BTN_UP)) {
|
||||||
dirty = 1;
|
dirty = 1;
|
||||||
switch(select_cursor) {
|
switch(select_cursor) {
|
||||||
case 0:
|
case CURSOR_YEAR:
|
||||||
year_selected++;
|
year_selected++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case CURSOR_MONTH:
|
||||||
month_selected++;
|
month_selected++;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case CURSOR_DAY:
|
||||||
day_selected++;
|
day_selected++;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case CURSOR_HOUR:
|
||||||
hour_selected++;
|
hour_selected++;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case CURSOR_MINUTE:
|
||||||
minute_selected++;
|
minute_selected++;
|
||||||
break;
|
break;
|
||||||
case 5:
|
#ifndef TICK_CLOCK
|
||||||
|
case CURSOR_SECOND:
|
||||||
seconds_selected++;
|
seconds_selected++;
|
||||||
break;
|
break;
|
||||||
case 6:
|
#endif
|
||||||
|
case CURSOR_AMPM:
|
||||||
hour_selected += 12;
|
hour_selected += 12;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (PAD_justRepeated(BTN_DOWN)) {
|
else if (PAD_justRepeated(BTN_DOWN)) {
|
||||||
dirty = 1;
|
dirty = 1;
|
||||||
switch(select_cursor) {
|
switch(select_cursor) {
|
||||||
case 0:
|
case CURSOR_YEAR:
|
||||||
year_selected--;
|
year_selected--;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case CURSOR_MONTH:
|
||||||
month_selected--;
|
month_selected--;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case CURSOR_DAY:
|
||||||
day_selected--;
|
day_selected--;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case CURSOR_HOUR:
|
||||||
hour_selected--;
|
hour_selected--;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case CURSOR_MINUTE:
|
||||||
minute_selected--;
|
minute_selected--;
|
||||||
break;
|
break;
|
||||||
case 5:
|
#ifndef TICK_CLOCK
|
||||||
|
case CURSOR_SECOND:
|
||||||
seconds_selected--;
|
seconds_selected--;
|
||||||
break;
|
break;
|
||||||
case 6:
|
#endif
|
||||||
|
case CURSOR_AMPM:
|
||||||
hour_selected -= 12;
|
hour_selected -= 12;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (PAD_justRepeated(BTN_LEFT)) {
|
else if (PAD_justRepeated(BTN_LEFT)) {
|
||||||
dirty = 1;
|
dirty = 1;
|
||||||
select_cursor--;
|
select_cursor--;
|
||||||
if (select_cursor < 0) select_cursor += option_count;
|
if (select_cursor < 0) select_cursor += option_count;
|
||||||
|
#ifdef TICK_CLOCK
|
||||||
|
if (select_cursor==CURSOR_SECOND) select_cursor--;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (PAD_justRepeated(BTN_RIGHT)) {
|
else if (PAD_justRepeated(BTN_RIGHT)) {
|
||||||
dirty = 1;
|
dirty = 1;
|
||||||
select_cursor++;
|
select_cursor++;
|
||||||
|
#ifdef TICK_CLOCK
|
||||||
|
if (select_cursor==CURSOR_SECOND) select_cursor++;
|
||||||
|
#endif
|
||||||
if (select_cursor >= option_count) select_cursor -= option_count;
|
if (select_cursor >= option_count) select_cursor -= option_count;
|
||||||
}
|
}
|
||||||
else if (PAD_justPressed(BTN_A)) {
|
else if (PAD_justPressed(BTN_A)) {
|
||||||
|
|
@ -201,10 +255,18 @@ int main(int argc , char* argv[]) {
|
||||||
else if (PAD_justPressed(BTN_SELECT)) {
|
else if (PAD_justPressed(BTN_SELECT)) {
|
||||||
dirty = 1;
|
dirty = 1;
|
||||||
show_24hour = !show_24hour;
|
show_24hour = !show_24hour;
|
||||||
option_count = show_24hour ? 6 : 7;
|
option_count = (show_24hour ? CURSOR_SECOND : CURSOR_AMPM) + 1;
|
||||||
if (select_cursor >= option_count) select_cursor -= option_count;
|
if (select_cursor >= option_count) select_cursor -= option_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TICK_CLOCK
|
||||||
|
unsigned long now = SDL_GetTicks();
|
||||||
|
if (now-second_start>=1000) {
|
||||||
|
dirty = 1;
|
||||||
|
second_start = now;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
dirty = 0;
|
dirty = 0;
|
||||||
|
|
||||||
|
|
@ -220,9 +282,9 @@ int main(int argc , char* argv[]) {
|
||||||
int y = 185;
|
int y = 185;
|
||||||
|
|
||||||
x = blitNumber(year_selected, x,y);
|
x = blitNumber(year_selected, x,y);
|
||||||
x = blit(kSlash, x,y);
|
x = blit(CHAR_SLASH, x,y);
|
||||||
x = blitNumber(month_selected, x,y);
|
x = blitNumber(month_selected, x,y);
|
||||||
x = blit(kSlash, x,y);
|
x = blit(CHAR_SLASH, x,y);
|
||||||
x = blitNumber(day_selected, x,y);
|
x = blitNumber(day_selected, x,y);
|
||||||
x += 20; // space
|
x += 20; // space
|
||||||
|
|
||||||
|
|
@ -231,7 +293,7 @@ int main(int argc , char* argv[]) {
|
||||||
x = blitNumber(hour_selected, x,y);
|
x = blitNumber(hour_selected, x,y);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// if (select_cursor==3) blitNumber(hour_selected, x,233);
|
// if (select_cursor==CURSOR_HOUR) blitNumber(hour_selected, x,233);
|
||||||
|
|
||||||
// 12 hour
|
// 12 hour
|
||||||
int hour = hour_selected;
|
int hour = hour_selected;
|
||||||
|
|
@ -239,16 +301,16 @@ int main(int argc , char* argv[]) {
|
||||||
else if (hour>12) hour -= 12;
|
else if (hour>12) hour -= 12;
|
||||||
x = blitNumber(hour, x,y);
|
x = blitNumber(hour, x,y);
|
||||||
}
|
}
|
||||||
x = blit(kColon, x,y);
|
x = blit(CHAR_COLON, x,y);
|
||||||
x = blitNumber(minute_selected, x,y);
|
x = blitNumber(minute_selected, x,y);
|
||||||
x = blit(kColon, x,y);
|
x = blit(CHAR_COLON, x,y);
|
||||||
x = blitNumber(seconds_selected, x,y);
|
x = blitNumber(seconds_selected, x,y);
|
||||||
|
|
||||||
int ampm_w;
|
int ampm_w;
|
||||||
if (!show_24hour) {
|
if (!show_24hour) {
|
||||||
x += 20; // space
|
x += 20; // space
|
||||||
SDL_Surface* text = TTF_RenderUTF8_Blended(font.large, am_selected ? "AM" : "PM", COLOR_WHITE);
|
SDL_Surface* text = TTF_RenderUTF8_Blended(font.large, am_selected ? "AM" : "PM", COLOR_WHITE);
|
||||||
ampm_w = text->w;
|
ampm_w = text->w + 4;
|
||||||
SDL_BlitSurface(text, NULL, screen, &(SDL_Rect){x,y-6});
|
SDL_BlitSurface(text, NULL, screen, &(SDL_Rect){x,y-6});
|
||||||
SDL_FreeSurface(text);
|
SDL_FreeSurface(text);
|
||||||
}
|
}
|
||||||
|
|
@ -256,11 +318,11 @@ int main(int argc , char* argv[]) {
|
||||||
// cursor
|
// cursor
|
||||||
x = show_24hour ? 130 : 90;
|
x = show_24hour ? 130 : 90;
|
||||||
y = 222;
|
y = 222;
|
||||||
if (select_cursor>0) {
|
if (select_cursor!=CURSOR_YEAR) {
|
||||||
x += 100; // YYYY/
|
x += 100; // YYYY/
|
||||||
x += (select_cursor - 1) * 60;
|
x += (select_cursor - 1) * 60;
|
||||||
}
|
}
|
||||||
blitBar(x,y, (select_cursor==0 ? 80 : (select_cursor==6 ? ampm_w : 40)));
|
blitBar(x,y, (select_cursor==CURSOR_YEAR ? 80 : (select_cursor==CURSOR_AMPM ? ampm_w : 40)));
|
||||||
|
|
||||||
GFX_flip(screen);
|
GFX_flip(screen);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue