/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2006 Jens Arnold * * 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" #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR) PLUGIN_HEADER #if (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == ONDIO_PAD) \ || (CONFIG_KEYPAD == IRIVER_H100_PAD) #define SCANRATE_DONE BUTTON_OFF #define SCANRATE_FASTINC BUTTON_UP #define SCANRATE_FASTDEC BUTTON_DOWN #define SCANRATE_INC BUTTON_RIGHT #define SCANRATE_DEC BUTTON_LEFT #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \ || (CONFIG_KEYPAD == MROBE100_PAD) #define SCANRATE_DONE BUTTON_POWER #define SCANRATE_FASTINC BUTTON_UP #define SCANRATE_FASTDEC BUTTON_DOWN #define SCANRATE_INC BUTTON_RIGHT #define SCANRATE_DEC BUTTON_LEFT #elif CONFIG_KEYPAD == IAUDIO_M3_PAD #define SCANRATE_DONE BUTTON_RC_REC #define SCANRATE_FASTINC BUTTON_RC_VOL_UP #define SCANRATE_FASTDEC BUTTON_RC_VOL_DOWN #define SCANRATE_INC BUTTON_RC_FF #define SCANRATE_DEC BUTTON_RC_REW #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \ || (CONFIG_KEYPAD == IPOD_1G2G_PAD) #define SCANRATE_DONE BUTTON_MENU #define SCANRATE_FASTINC BUTTON_SCROLL_FWD #define SCANRATE_FASTDEC BUTTON_SCROLL_BACK #define SCANRATE_INC BUTTON_RIGHT #define SCANRATE_DEC BUTTON_LEFT #endif /* Default refresh rates in 1/10 Hz */ #if defined ARCHOS_RECORDER || defined ARCHOS_FMRECORDER \ || defined ARCHOS_RECORDERV2 || defined ARCHOS_ONDIOFM \ || defined ARCHOS_ONDIOSP #define DEFAULT_SCAN_RATE 670 #elif defined IAUDIO_M3 #define DEFAULT_SCAN_RATE 1500 #define HORIZ_SCAN /* LCD controller updates the panel sideways */ #define NEED_BOOST #elif defined IAUDIO_M5 #define DEFAULT_SCAN_RATE 730 #elif defined IPOD_1G2G #define DEFAULT_SCAN_RATE 960 #elif defined IPOD_MINI2G || defined IPOD_MINI \ || defined IPOD_3G || defined IPOD_4G #define DEFAULT_SCAN_RATE 870 #elif defined IRIVER_H100_SERIES #define DEFAULT_SCAN_RATE 700 #else #define DEFAULT_SCAN_RATE 700 #warning Generic default scanrate #endif #ifdef HORIZ_SCAN #define TEXT_X 0 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING #define BUF_WIDTH ((LCD_WIDTH+7)/8) #define BUF_HEIGHT (LCD_HEIGHT/4) #define TEXT_Y BUF_HEIGHT #else #define BUF_WIDTH (LCD_WIDTH) #define BUF_HEIGHT (LCD_HEIGHT/8/4) #define TEXT_Y (BUF_HEIGHT*8) #endif #else /* !HORIZ_SCAN */ #define TEXT_Y 0 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING #define BUF_WIDTH ((LCD_WIDTH+7)/8/4) #define BUF_HEIGHT LCD_HEIGHT #define TEXT_X (BUF_WIDTH*8) #else #define BUF_WIDTH (LCD_WIDTH/4) #define BUF_HEIGHT (LCD_HEIGHT/8) #define TEXT_X BUF_WIDTH #endif #endif /* !HORIZ_SCAN */ #if defined(CPU_PP) && defined(HAVE_ADJUSTABLE_CPU_FREQ) #define NEED_BOOST #endif static const struct plugin_api* rb; static unsigned char bitbuffer[2][BUF_HEIGHT][BUF_WIDTH]; static int curbuf = 0; static int scan_rate = DEFAULT_SCAN_RATE; static bool need_refresh = false; static void timer_isr(void) { rb->lcd_blit_mono(bitbuffer[curbuf][0], 0, 0, BUF_WIDTH, BUF_HEIGHT, BUF_WIDTH); curbuf = (curbuf + 1) & 1; if (need_refresh) { rb->lcd_update_rect(TEXT_X, TEXT_Y, LCD_WIDTH-TEXT_X, 8); need_refresh = false; } } int plugin_main(void) { unsigned char buf[32]; int button; bool done = false; bool change = true; rb->lcd_setfont(FONT_SYSFIXED); rb->lcd_putsxy(TEXT_X, TEXT_Y+12, "Adjust Frequ."); rb->lcd_putsxy(TEXT_X, TEXT_Y+20, "so the block"); rb->lcd_putsxy(TEXT_X, TEXT_Y+28, "stops moving."); #if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \ || (CONFIG_KEYPAD == IPOD_1G2G_PAD) rb->lcd_putsxy(TEXT_X, TEXT_Y+40, "Scroll: Coarse"); #else rb->lcd_putsxy(TEXT_X, TEXT_Y+40, "U/D: Coarse"); #endif rb->lcd_putsxy(TEXT_X, TEXT_Y+48, "L/R: Fine"); rb->lcd_update(); rb->memset(bitbuffer[0], 0, sizeof(bitbuffer[0])); rb->memset(bitbuffer[1], 0xff, sizeof(bitbuffer[1])); #ifdef NEED_BOOST rb->cpu_boost(true); #endif /* The actual frequency is twice the displayed value */ rb->timer_register(1, NULL, TIMER_FREQ * 5 / scan_rate, 1, timer_isr IF_COP(, CPU)); while (!done) { if (change) { /* The actual frequency is twice the displayed value */ rb->timer_set_period(TIMER_FREQ * 5 / scan_rate); rb->snprintf(buf, sizeof(buf), "f: %d.%d Hz", scan_rate / 10, scan_rate % 10); rb->lcd_putsxy(TEXT_X, TEXT_Y, buf); need_refresh = true; change = false; } button = rb->button_get(true); switch (button) { case SCANRATE_FASTINC: case SCANRATE_FASTINC|BUTTON_REPEAT: scan_rate += 10; change = true; break; case SCANRATE_FASTDEC: case SCANRATE_FASTDEC|BUTTON_REPEAT: scan_rate -= 10; change = true; break; case SCANRATE_INC: case SCANRATE_INC|BUTTON_REPEAT: scan_rate++; change = true; break; case SCANRATE_DEC: case SCANRATE_DEC|BUTTON_REPEAT: scan_rate--; change = true; break; case SCANRATE_DONE: done = true; break; } } rb->timer_unregister(); #ifdef NEED_BOOST rb->cpu_boost(false); #endif rb->lcd_setfont(FONT_UI); return PLUGIN_OK; } /* this is the plugin entry point */ enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter) { (void)parameter; rb = api; return plugin_main(); } #endif