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.c | 199 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 apps/plugins/clock/clock.c (limited to 'apps/plugins/clock/clock.c') diff --git a/apps/plugins/clock/clock.c b/apps/plugins/clock/clock.c new file mode 100644 index 0000000..46d167b --- /dev/null +++ b/apps/plugins/clock/clock.c @@ -0,0 +1,199 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: clock.c 14095 2007-07-31 10:53:53Z nls $ + * + * Copyright (C) 2007 Kévin Ferrare + * + * 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 "plugin.h" +#include "time.h" +#include "pluginlib_actions.h" +#include "xlcd.h" + +#include "clock.h" +#include "clock_counter.h" +#include "clock_draw.h" +#include "clock_menu.h" +#include "clock_settings.h" + +PLUGIN_HEADER + +/* Keymaps */ +const struct button_mapping* plugin_contexts[]={ + generic_actions, + generic_directions, +#if NB_SCREENS == 2 + remote_directions +#endif +}; +#define NB_ACTION_CONTEXTS sizeof(plugin_contexts)/sizeof(plugin_contexts[0]) +#define ACTION_COUNTER_TOGGLE PLA_FIRE +#define ACTION_COUNTER_RESET PLA_FIRE_REPEAT +#define ACTION_MENU PLA_MENU +#define ACTION_EXIT PLA_QUIT +#define ACTION_MODE_NEXT PLA_RIGHT +#define ACTION_MODE_PREV PLA_LEFT +#define ACTION_SKIN_NEXT PLA_UP +#define ACTION_SKIN_PREV PLA_DOWN + +extern struct plugin_api* rb; + +/************************** + * Cleanup on plugin return + *************************/ +void cleanup(void *parameter) +{ + (void)parameter; + clock_draw_restore_colors(); + if(clock_settings.general.save_settings == 1) + save_settings(); + + /* restore set backlight timeout */ + rb->backlight_set_timeout(rb->global_settings->backlight_timeout); +} + +/* puts the current time into the time struct */ +void clock_update_time( struct time* time){ + struct tm* current_time = rb->get_time(); + time->hour = current_time->tm_hour; + time->minute = current_time->tm_min; + time->second = current_time->tm_sec; + + /********************* + * Date info + *********************/ + time->year = current_time->tm_year + 1900; + time->day = current_time->tm_mday; + time->month = current_time->tm_mon + 1; + +} + +void format_date(char* buffer, struct time* time, enum date_format format){ + switch(format){ + case JAPANESE: + rb->snprintf(buffer, 20, "%04d/%02d/%02d", + time->year, time->month, time->day); + break; + case EUROPEAN: + rb->snprintf(buffer, 20, "%02d/%02d/%04d", + time->day, time->month, time->year); + break; + case ENGLISH: + rb->snprintf(buffer, 20, "%02d/%02d/%04d", + time->month, time->day, time->year); + break; + case NONE: + default: + break; + } +} + +/********************************************************************** + * Plugin starts here + **********************************************************************/ +enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ + int button; + int last_second = -1; + bool redraw=true; + int i; + struct time time; + struct counter counter; + bool exit_clock = false; + (void)parameter; + rb = api; + +#if LCD_DEPTH > 1 + rb->lcd_set_backdrop(NULL); +#endif + + load_settings(); + + /* init xlcd functions */ + xlcd_init(rb); + counter_init(&counter); + clock_draw_set_colors(); + + while(!exit_clock){ + clock_update_time(&time); + + if(!clock_settings.general.idle_poweroff) + rb->reset_poweroff_timer(); + + /************************* + * Scan for button presses + ************************/ + button = pluginlib_getaction(rb, HZ/10, plugin_contexts, NB_ACTION_CONTEXTS); + redraw=true;/* we'll set it to false afterwards if there was no action */ + switch (button){ + case ACTION_COUNTER_TOGGLE: /* start/stop counter */ + if(clock_settings.general.show_counter) + counter_toggle(&counter); + break; + + case ACTION_COUNTER_RESET: /* reset counter */ + if(clock_settings.general.show_counter) + counter_reset(&counter); + break; + + case ACTION_MODE_NEXT: + clock_settings.mode++; + if(clock_settings.mode >= NB_CLOCK_MODES) + clock_settings.mode = 0; + break; + + case ACTION_MODE_PREV: + clock_settings.mode--; + if(clock_settings.mode < 0) + clock_settings.mode = NB_CLOCK_MODES-1; + break; + case ACTION_SKIN_PREV: + clock_settings_skin_next(&clock_settings); + break; + case ACTION_SKIN_NEXT: + clock_settings_skin_previous(&clock_settings); + break; + case ACTION_MENU: + clock_draw_restore_colors(); + exit_clock=main_menu(); + break; + + case ACTION_EXIT: + /*clock_draw_restore_colors(); + exit_clock=main_menu();*/ + exit_clock=true; + break; + + default: + redraw=false; + if(rb->default_event_handler_ex(button, cleanup, NULL) + == SYS_USB_CONNECTED) + return PLUGIN_USB_CONNECTED; + break; + } + if(time.second != last_second){ + last_second=time.second; + redraw=true; + } + if(redraw){ + clock_draw_set_colors(); + FOR_NB_SCREENS(i) + clock_draw(rb->screens[i], &time, &counter); + redraw=false; + } + } + + cleanup(NULL); + return PLUGIN_OK; +} -- cgit v1.1