summaryrefslogtreecommitdiff
path: root/apps/plugins/clock/clock.c
diff options
context:
space:
mode:
authorKevin Ferrare <kevin@rockbox.org>2007-08-04 03:01:46 +0000
committerKevin Ferrare <kevin@rockbox.org>2007-08-04 03:01:46 +0000
commit93b2f9fd447b73fff736d71826880ef9ac64bd94 (patch)
tree1a4f54016c312738d66fb9dd2348ea0ef14f1255 /apps/plugins/clock/clock.c
parentffbbc60f38ddc8aeadc9cea1102077e22ca84a1a (diff)
downloadrockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.zip
rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.tar.gz
rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.tar.bz2
rockbox-93b2f9fd447b73fff736d71826880ef9ac64bd94.tar.xz
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
Diffstat (limited to 'apps/plugins/clock/clock.c')
-rw-r--r--apps/plugins/clock/clock.c199
1 files changed, 199 insertions, 0 deletions
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;
+}