redo r25569 so the screen is only cleared once instead of every update (which is...
[kugel-rb.git] / apps / plugins / test_scanrate.c
blob1aa9febf30bfda94ca1374427ead8ae0dbf44cf8
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2006 Jens Arnold
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "plugin.h"
24 #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
26 PLUGIN_HEADER
28 #if (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == ONDIO_PAD) \
29 || (CONFIG_KEYPAD == IRIVER_H100_PAD)
30 #define SCANRATE_DONE BUTTON_OFF
31 #define SCANRATE_FASTINC BUTTON_UP
32 #define SCANRATE_FASTDEC BUTTON_DOWN
33 #define SCANRATE_INC BUTTON_RIGHT
34 #define SCANRATE_DEC BUTTON_LEFT
36 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \
37 || (CONFIG_KEYPAD == MROBE100_PAD) \
38 || (CONFIG_KEYPAD == SANSA_CLIP_PAD)
39 #define SCANRATE_DONE BUTTON_POWER
40 #define SCANRATE_FASTINC BUTTON_UP
41 #define SCANRATE_FASTDEC BUTTON_DOWN
42 #define SCANRATE_INC BUTTON_RIGHT
43 #define SCANRATE_DEC BUTTON_LEFT
45 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
46 #define SCANRATE_DONE (BUTTON_HOME|BUTTON_REPEAT)
47 #define SCANRATE_FASTINC BUTTON_UP
48 #define SCANRATE_FASTDEC BUTTON_DOWN
49 #define SCANRATE_INC BUTTON_RIGHT
50 #define SCANRATE_DEC BUTTON_LEFT
52 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
53 #define SCANRATE_DONE BUTTON_RC_REC
54 #define SCANRATE_FASTINC BUTTON_RC_VOL_UP
55 #define SCANRATE_FASTDEC BUTTON_RC_VOL_DOWN
56 #define SCANRATE_INC BUTTON_RC_FF
57 #define SCANRATE_DEC BUTTON_RC_REW
59 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
60 || (CONFIG_KEYPAD == IPOD_1G2G_PAD)
61 #define SCANRATE_DONE BUTTON_MENU
62 #define SCANRATE_FASTINC BUTTON_SCROLL_FWD
63 #define SCANRATE_FASTDEC BUTTON_SCROLL_BACK
64 #define SCANRATE_INC BUTTON_RIGHT
65 #define SCANRATE_DEC BUTTON_LEFT
67 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
68 #define SCANRATE_DONE BUTTON_PLAY
69 #define SCANRATE_FASTINC BUTTON_FFWD
70 #define SCANRATE_FASTDEC BUTTON_REW
71 #define SCANRATE_INC BUTTON_UP
72 #define SCANRATE_DEC BUTTON_DOWN
74 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
75 #define SCANRATE_DONE BUTTON_PLAY
76 #define SCANRATE_FASTINC BUTTON_NEXT
77 #define SCANRATE_FASTDEC BUTTON_PREV
78 #define SCANRATE_INC BUTTON_VOL_UP
79 #define SCANRATE_DEC BUTTON_VOL_DOWN
81 #endif
83 /* Default refresh rates in 1/10 Hz */
84 #if defined ARCHOS_RECORDER || defined ARCHOS_FMRECORDER \
85 || defined ARCHOS_RECORDERV2 || defined ARCHOS_ONDIOFM \
86 || defined ARCHOS_ONDIOSP
87 #define DEFAULT_SCAN_RATE 670
88 #elif defined IAUDIO_M3
89 #define DEFAULT_SCAN_RATE 1500
90 #define HORIZ_SCAN /* LCD controller updates the panel sideways */
91 #define NEED_BOOST
92 #elif defined MPIO_HD200
93 #define DEFAULT_SCAN_RATE 1460
94 #define NEED_BOOST
95 #elif defined IAUDIO_M5
96 #define DEFAULT_SCAN_RATE 730
97 #elif defined IPOD_1G2G
98 #define DEFAULT_SCAN_RATE 960
99 #elif defined IPOD_MINI2G || defined IPOD_MINI \
100 || defined IPOD_3G || defined IPOD_4G
101 #define DEFAULT_SCAN_RATE 870
102 #elif defined IRIVER_H100_SERIES
103 #define DEFAULT_SCAN_RATE 700
104 #elif defined SANSA_CLIP
105 #define DEFAULT_SCAN_RATE 780
106 #elif defined SAMSUNG_YH920
107 #define DEFAULT_SCAN_RATE 700
108 #else
109 #define DEFAULT_SCAN_RATE 700
110 #warning Generic default scanrate
111 #endif
113 #ifdef HORIZ_SCAN
114 #define TEXT_X 0
115 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING
116 #define BUF_WIDTH ((LCD_WIDTH+7)/8)
117 #define BUF_HEIGHT (LCD_HEIGHT/4)
118 #define TEXT_Y BUF_HEIGHT
119 #else
120 #define BUF_WIDTH (LCD_WIDTH)
121 #define BUF_HEIGHT (LCD_HEIGHT/8/4)
122 #define TEXT_Y (BUF_HEIGHT*8)
123 #endif
124 #else /* !HORIZ_SCAN */
125 #define TEXT_Y 0
126 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING
127 #define BUF_WIDTH ((LCD_WIDTH+7)/8/4)
128 #define BUF_HEIGHT LCD_HEIGHT
129 #define TEXT_X (BUF_WIDTH*8)
130 #else
131 #define BUF_WIDTH (LCD_WIDTH/4)
132 #define BUF_HEIGHT (LCD_HEIGHT/8)
133 #define TEXT_X BUF_WIDTH
134 #endif
135 #endif /* !HORIZ_SCAN */
137 #if defined(CPU_PP) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
138 #define NEED_BOOST
139 #endif
141 static unsigned char bitbuffer[2][BUF_HEIGHT][BUF_WIDTH];
142 static int curbuf = 0;
143 static int scan_rate = DEFAULT_SCAN_RATE;
144 static bool need_refresh = false;
146 static void timer_isr(void)
148 rb->lcd_blit_mono(bitbuffer[curbuf][0], 0, 0, BUF_WIDTH, BUF_HEIGHT, BUF_WIDTH);
149 curbuf = (curbuf + 1) & 1;
150 if (need_refresh)
152 rb->lcd_update_rect(TEXT_X, TEXT_Y, LCD_WIDTH-TEXT_X, 8);
153 need_refresh = false;
157 int plugin_main(void)
159 unsigned char buf[32];
160 int button;
161 bool done = false;
162 bool change = true;
164 rb->lcd_setfont(FONT_SYSFIXED);
166 rb->lcd_putsxy(TEXT_X, TEXT_Y+12, "Adjust Frequ.");
167 rb->lcd_putsxy(TEXT_X, TEXT_Y+20, "so the block");
168 rb->lcd_putsxy(TEXT_X, TEXT_Y+28, "stops moving.");
169 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
170 || (CONFIG_KEYPAD == IPOD_1G2G_PAD)
171 rb->lcd_putsxy(TEXT_X, TEXT_Y+40, "Scroll: Coarse");
172 #else
173 rb->lcd_putsxy(TEXT_X, TEXT_Y+40, "U/D: Coarse");
174 #endif
175 rb->lcd_putsxy(TEXT_X, TEXT_Y+48, "L/R: Fine");
176 rb->lcd_update();
178 rb->memset(bitbuffer[0], 0, sizeof(bitbuffer[0]));
179 rb->memset(bitbuffer[1], 0xff, sizeof(bitbuffer[1]));
180 #ifdef NEED_BOOST
181 rb->cpu_boost(true);
182 #endif
183 /* The actual frequency is twice the displayed value */
184 rb->timer_register(1, NULL, TIMER_FREQ * 5 / scan_rate,
185 timer_isr IF_COP(, CPU));
187 while (!done)
189 if (change)
191 /* The actual frequency is twice the displayed value */
192 rb->timer_set_period(TIMER_FREQ * 5 / scan_rate);
193 rb->snprintf(buf, sizeof(buf), "f: %d.%d Hz", scan_rate / 10,
194 scan_rate % 10);
195 rb->lcd_putsxy(TEXT_X, TEXT_Y, buf);
196 need_refresh = true;
197 change = false;
199 button = rb->button_get(true);
200 switch (button)
202 case SCANRATE_FASTINC:
203 case SCANRATE_FASTINC|BUTTON_REPEAT:
204 scan_rate += 10;
205 change = true;
206 break;
208 case SCANRATE_FASTDEC:
209 case SCANRATE_FASTDEC|BUTTON_REPEAT:
210 scan_rate -= 10;
211 change = true;
212 break;
214 case SCANRATE_INC:
215 case SCANRATE_INC|BUTTON_REPEAT:
216 scan_rate++;
217 change = true;
218 break;
220 case SCANRATE_DEC:
221 case SCANRATE_DEC|BUTTON_REPEAT:
222 scan_rate--;
223 change = true;
224 break;
226 case SCANRATE_DONE:
227 done = true;
228 break;
231 rb->timer_unregister();
232 #ifdef NEED_BOOST
233 rb->cpu_boost(false);
234 #endif
236 rb->lcd_setfont(FONT_UI);
238 return PLUGIN_OK;
242 /* this is the plugin entry point */
243 enum plugin_status plugin_start(const void* parameter)
245 (void)parameter;
246 return plugin_main();
249 #endif