rockbox/apps/plugins/clock/clock.c
Thomas Martitz 20e9d56ba5 S#10387 - Rework pluginlib actions
It changes pluginlib actions to contain only a single and simple context (and
other one for remote directional buttons),
consisting of 7(9) buttons: up/down/left/right, select OR short select and long
select, exit and cancel (plus 2 for scrollwheel targets).
This ensures contexts don't clash with other contexts and simplifies them, at
the expense of reduced versatility. However, the versatility made it largely unusable
due to the great number of targets.
This should allow for using pluginlib actions safely for the most simple plugins (e.g. almost all demos).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26202 a1c6a512-1295-4272-9138-f99709370657
2010-05-20 17:41:28 +00:00

198 lines
6.3 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2007 Kévin Ferrare, graphic design 2003 Zakk Roberts
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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 "lib/pluginlib_actions.h"
#include "lib/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[]={
pla_main_ctx,
#ifdef HAVE_REMOTE_LCD
pla_remote_ctx,
#endif
};
#define PLA_ARRAY_COUNT sizeof(plugin_contexts)/sizeof(plugin_contexts[0])
#define ACTION_COUNTER_TOGGLE PLA_SELECT
#define ACTION_COUNTER_RESET PLA_SELECT_REPEAT
#define ACTION_MENU PLA_CANCEL
#define ACTION_MODE_NEXT PLA_RIGHT
#define ACTION_MODE_NEXT_REPEAT PLA_RIGHT_REPEAT
#define ACTION_MODE_PREV PLA_LEFT
#define ACTION_MODE_PREV_REPEAT PLA_LEFT_REPEAT
#define ACTION_SKIN_NEXT PLA_UP
#define ACTION_SKIN_NEXT_REPEAT PLA_UP_REPEAT
#define ACTION_SKIN_PREV PLA_DOWN
#define ACTION_SKIN_PREV_REPEAT PLA_DOWN_REPEAT
/**************************
* 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(const 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;
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
#endif
load_settings();
/* init xlcd functions */
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(HZ/10, plugin_contexts, PLA_ARRAY_COUNT);
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_REPEAT:
case ACTION_MODE_NEXT:
clock_settings.mode++;
if(clock_settings.mode >= NB_CLOCK_MODES)
clock_settings.mode = 0;
break;
case ACTION_MODE_PREV_REPEAT:
case ACTION_MODE_PREV:
clock_settings.mode--;
if(clock_settings.mode < 0)
clock_settings.mode = NB_CLOCK_MODES-1;
break;
case ACTION_SKIN_PREV_REPEAT:
case ACTION_SKIN_PREV:
clock_settings_skin_next(&clock_settings);
break;
case ACTION_SKIN_NEXT_REPEAT:
case ACTION_SKIN_NEXT:
clock_settings_skin_previous(&clock_settings);
break;
case ACTION_MENU:
clock_draw_restore_colors();
exit_clock=main_menu();
break;
default:
if(rb->default_event_handler_ex(button, cleanup, NULL)
== SYS_USB_CONNECTED)
return PLUGIN_USB_CONNECTED;
if(time.second != last_second){
last_second=time.second;
redraw=true;
}else
redraw=false;
break;
}
if(redraw){
clock_draw_set_colors();
FOR_NB_SCREENS(i)
clock_draw(rb->screens[i], &time, &counter);
redraw=false;
}
}
cleanup(NULL);
return PLUGIN_OK;
}