From 93b2f9fd447b73fff736d71826880ef9ac64bd94 Mon Sep 17 00:00:00 2001 From: Kevin Ferrare Date: Sat, 4 Aug 2007 03:01:46 +0000 Subject: Rewrote the clock plugin in a cleaner and more modular way so that it can scale on remote screens. Use left-right keys to change the type of clock displayed (analogic, digital, binary) and up/downto change the look of the clock git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14174 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/clock/clock_settings.c | 200 ++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 apps/plugins/clock/clock_settings.c (limited to 'apps/plugins/clock/clock_settings.c') diff --git a/apps/plugins/clock/clock_settings.c b/apps/plugins/clock/clock_settings.c new file mode 100644 index 0000000000..9bd7c90d3b --- /dev/null +++ b/apps/plugins/clock/clock_settings.c @@ -0,0 +1,200 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: jackpot.c 14034 2007-07-28 05:42:55Z kevin $ + * + * Copyright (C) 2007 Copyright Kévin Ferrare based on Zakk Roberts's work + * + * 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 "clock.h" +#include "clock_bitmaps.h" +#include "clock_draw.h" +#include "clock_settings.h" +#include "picture.h" + +static int max_skin[]={ + [ANALOG]=2, + [BINARY]=3, + [DIGITAL]=2, +}; + +enum message{ + MESSAGE_LOADING, + MESSAGE_LOADED, + MESSAGE_ERRLOAD, + MESSAGE_SAVING, + MESSAGE_SAVED, + MESSAGE_ERRSAVE +}; + +enum settings_file_status{ + LOADED, ERRLOAD, + SAVED, ERRSAVE +}; + +struct clock_settings clock_settings; + +void clock_settings_reset(struct clock_settings* settings){ + settings->mode = ANALOG; + int i; + for(i=0;iskin[i]=0; + } + settings->general.hour_format = H12; + settings->general.date_format = EUROPEAN; + settings->general.show_counter = true; + settings->general.save_settings = true; + settings->general.idle_poweroff=true; + settings->general.backlight = ROCKBOX_SETTING; + + settings->analog.show_date = false; + settings->analog.show_seconds = true; + settings->analog.show_border = true; + + settings->digital.show_seconds = true; + settings->digital.blinkcolon = false; + apply_backlight_setting(settings->general.backlight); +} + +void apply_backlight_setting(int backlight_setting) +{ + if(backlight_setting == ALWAS_OFF) + rb->backlight_set_timeout(0); + else if(backlight_setting == ROCKBOX_SETTING) + rb->backlight_set_timeout(rb->global_settings->backlight_timeout); + else if(backlight_setting == ALWAYS_ON) + rb->backlight_set_timeout(1); +} + +void clock_settings_skin_next(struct clock_settings* settings){ + settings->skin[settings->mode]++; + if(settings->skin[settings->mode]>=max_skin[settings->mode]) + settings->skin[settings->mode]=0; +} + +void clock_settings_skin_previous(struct clock_settings* settings){ + settings->skin[settings->mode]--; + if(settings->skin[settings->mode]<0) + settings->skin[settings->mode]=max_skin[settings->mode]-1; +} + +enum settings_file_status clock_settings_load(struct clock_settings* settings, + char* filename){ + int fd = rb->open(filename, O_RDONLY); + if(fd >= 0){ /* does file exist? */ + /* basic consistency check */ + if(rb->filesize(fd) == sizeof(*settings)){ + rb->read(fd, settings, sizeof(*settings)); + rb->close(fd); + apply_backlight_setting(settings->general.backlight); + return(LOADED); + } + } + /* Initializes the settings with default values at least */ + clock_settings_reset(settings); + return(ERRLOAD); +} + +enum settings_file_status clock_settings_save(struct clock_settings* settings, + char* filename){ + int fd = rb->creat(filename); + if(fd >= 0){ /* does file exist? */ + rb->write (fd, settings, sizeof(*settings)); + rb->close(fd); + return(SAVED); + } + return(ERRSAVE); +} + +void draw_logo(struct screen* display){ +#ifdef HAVE_LCD_COLOR + if(display->is_color){ + display->set_foreground(LCD_BLACK); + display->set_background(LCD_RGBPACK(180,200,230)); + } +#endif + + const struct picture* logo = &(logos[display->screen_type]); + display->clear_display(); + picture_draw(display, logo, 0, 0); +} + +void draw_message(struct screen* display, int msg, int y){ + const struct picture* message = &(messages[display->screen_type]); + display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); + display->fillrect(0, display->height-message->height, + display->width, message->height); + display->set_drawmode(DRMODE_SOLID); + vertical_picture_draw_sprite(display, message, msg, + 0, display->height-(message->height*y)); +} + +void load_settings(void){ + int i; + struct screen* display; + FOR_NB_SCREENS(i){ + display=rb->screens[i]; + display->clear_display(); + draw_logo(display); + draw_message(display, MESSAGE_LOADING, 1); + display->update(); + } + + enum settings_file_status load_status= + clock_settings_load(&clock_settings, settings_filename); + + FOR_NB_SCREENS(i){ + display=rb->screens[i]; + if(load_status==LOADED) + draw_message(display, MESSAGE_LOADED, 1); + else + draw_message(display, MESSAGE_ERRLOAD, 1); + display->update(); + } +#ifndef SIMULATOR + rb->ata_sleep(); +#endif + rb->sleep(HZ); +} + +void save_settings(void){ + int i; + struct screen* display; + FOR_NB_SCREENS(i){ + display=rb->screens[i]; + display->clear_display(); + draw_logo(display); + + draw_message(display, MESSAGE_SAVING, 1); + + display->update(); + } + enum settings_file_status load_status= + clock_settings_save(&clock_settings, settings_filename); + + FOR_NB_SCREENS(i){ + display=rb->screens[i]; + + if(load_status==SAVED) + draw_message(display, MESSAGE_SAVED, 1); + else + draw_message(display, MESSAGE_ERRSAVE, 1); + display->update(); + } + rb->sleep(HZ); +} + +void save_settings_wo_gui(void){ + clock_settings_save(&clock_settings, settings_filename); +} -- cgit v1.2.3