rockbox/apps/plugins/zxbox/zxbox.c
Daniel Stenberg 2acc0ac542 Updated our source code header to explicitly mention that we are GPL v2 or
later. We still need to hunt down snippets used that are not. 1324 modified
files...
http://www.rockbox.org/mail/archive/rockbox-dev-archive-2008-06/0060.shtml


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17847 a1c6a512-1295-4272-9138-f99709370657
2008-06-28 18:10:04 +00:00

272 lines
6.7 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (c) 2006 Anton Romanov
*
* 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 "zxconfig.h"
PLUGIN_HEADER
PLUGIN_IRAM_DECLARE
const struct plugin_api* rb;
#include "spkey_p.h"
spkeyboard kb_mkey;
bool exit_requested=false;
bool clear_kbd=0;
extern bool zxbox_menu(void);
/* DUMMIES ... to clean */
unsigned int scrmul=0;
int privatemap;
int use_shm = 0;
int small_screen,pause_on_iconify;
int vga_pause_bg;
#include "keymaps.h"
#include "zxvid_com.h"
#include "spmain.h"
#include "spperif.h"
struct zxbox_settings settings;
/* doesn't fit into .ibss */
unsigned char image_array [ HEIGHT * WIDTH ];
static int previous_state;
#ifdef USE_GREY
GREY_INFO_STRUCT_IRAM
static unsigned char *gbuf;
static size_t gbuf_size = 0;
#endif
long video_frames IBSS_ATTR = 0 ;
long start_time IBSS_ATTR = 0;
enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
{
PLUGIN_IRAM_INIT(api)
rb = api;
#if LCD_DEPTH > 1
rb->lcd_set_backdrop(NULL);
#endif
rb->splash(HZ, "Welcome to ZXBox");
sp_init();
#ifdef USE_GREY
/* get the remainder of the plugin buffer */
gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
#ifdef USE_BUFFERED_GREY
grey_init(rb, gbuf, gbuf_size, GREY_BUFFERED|GREY_ON_COP, LCD_WIDTH,
LCD_HEIGHT, NULL);
#else
grey_init(rb, gbuf, gbuf_size, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL);
#endif /* USE_BUFFERED_GREY */
/* switch on greyscale overlay */
grey_show(true);
#endif /* USE_GREY */
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(true);
#endif
start_time = *rb->current_tick;
#ifdef RB_PROFILE
rb->profile_thread();
#endif
start_spectemu(parameter);
#ifdef RB_PROFILE
rb->profstop();
#endif
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(false);
#endif
#ifdef USE_GREY
grey_show(false);
grey_release();
#endif
#if CONFIG_CODEC == SWCODEC && !defined SIMULATOR
rb->pcm_play_stop();
#endif
return PLUGIN_OK;
}
void init_spect_key(void)
{
clear_keystates();
init_basekeys();
}
void spkb_process_events( int evenframe )
{
if(evenframe){
int ki;
#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_1G2G_PAD)
if (rb->button_hold())
{
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(false);
#endif
exit_requested=1;
#ifdef USE_GREY
grey_show(false);
#endif
return;
}
#endif
int buttons = rb->button_status();
if ( buttons == previous_state )
return;
previous_state = buttons;
#if (CONFIG_KEYPAD != IPOD_4G_PAD) && (CONFIG_KEYPAD != IPOD_3G_PAD) && \
(CONFIG_KEYPAD != IPOD_1G2G_PAD)
if (buttons & ZX_MENU)
{
#if defined(HAVE_ADJUSTABLE_CPU_FREQ)
rb->cpu_boost(false);
#endif
exit_requested=1;
#ifdef USE_GREY
grey_show(false);
#endif
return;
}
#endif
spkb_state_changed = 1;
if (settings.kempston){
if ( buttons & ZX_RIGHT ){
ki = KS_TO_KEY(SK_KP_Right);
spkb_kbstate[ki].state = 1;
}
else if (buttons & ZX_LEFT){
ki = KS_TO_KEY(SK_KP_Left);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(SK_KP_Right);
spkb_kbstate[ki].state = 0;
ki = KS_TO_KEY(SK_KP_Left);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_UP ){
ki = KS_TO_KEY(SK_KP_Up);
spkb_kbstate[ki].state = 1;
}
else if (buttons & ZX_DOWN){
ki = KS_TO_KEY(SK_KP_Down);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(SK_KP_Up);
spkb_kbstate[ki].state = 0;
ki = KS_TO_KEY(SK_KP_Down);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_SELECT ){
ki = KS_TO_KEY(SK_KP_Insert);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(SK_KP_Insert);
spkb_kbstate[ki].state = 0;
}
}
else {
if ( buttons & ZX_RIGHT ){
ki = KS_TO_KEY(intkeys[3]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[3]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_LEFT ){
ki = KS_TO_KEY(intkeys[2]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[2]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_UP ){
ki = KS_TO_KEY(intkeys[0]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[0]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_DOWN ){
ki = KS_TO_KEY(intkeys[1]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[1]);
spkb_kbstate[ki].state = 0;
}
if ( buttons & ZX_SELECT ){
ki = KS_TO_KEY(intkeys[4]);
spkb_kbstate[ki].state = 1;
}
else{
ki = KS_TO_KEY(intkeys[4]);
spkb_kbstate[ki].state = 0;
}
}
process_keys();
}
}
void press_key(int c){
spkb_state_changed = 1;
int ki;
if ( c == 'E' )
ki = KS_TO_KEY(SK_KP_Enter);
else if (c == 'S' )
ki = KS_TO_KEY(SK_KP_Space);
else
ki = KS_TO_KEY(c);
spkb_kbstate[ki].state = 1;
process_keys();
}