Rename variables sectorbuf and verbose to avoid clashes in rbutil. Cleanup exports...
[Rockbox.git] / apps / plugins / test_scanrate.c
blob995e64a25752ac0cc47e768265b04f4bb0485843
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2006 Jens Arnold
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "plugin.h"
22 #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR)
24 PLUGIN_HEADER
26 #if (CONFIG_KEYPAD == RECORDER_PAD) || (CONFIG_KEYPAD == ONDIO_PAD) \
27 || (CONFIG_KEYPAD == IRIVER_H100_PAD)
28 #define SCANRATE_DONE BUTTON_OFF
29 #define SCANRATE_FASTINC BUTTON_UP
30 #define SCANRATE_FASTDEC BUTTON_DOWN
31 #define SCANRATE_INC BUTTON_RIGHT
32 #define SCANRATE_DEC BUTTON_LEFT
34 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) \
35 || (CONFIG_KEYPAD == MROBE100_PAD)
36 #define SCANRATE_DONE BUTTON_POWER
37 #define SCANRATE_FASTINC BUTTON_UP
38 #define SCANRATE_FASTDEC BUTTON_DOWN
39 #define SCANRATE_INC BUTTON_RIGHT
40 #define SCANRATE_DEC BUTTON_LEFT
42 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
43 #define SCANRATE_DONE BUTTON_RC_REC
44 #define SCANRATE_FASTINC BUTTON_RC_VOL_UP
45 #define SCANRATE_FASTDEC BUTTON_RC_VOL_DOWN
46 #define SCANRATE_INC BUTTON_RC_FF
47 #define SCANRATE_DEC BUTTON_RC_REW
49 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
50 || (CONFIG_KEYPAD == IPOD_1G2G_PAD)
51 #define SCANRATE_DONE BUTTON_MENU
52 #define SCANRATE_FASTINC BUTTON_SCROLL_FWD
53 #define SCANRATE_FASTDEC BUTTON_SCROLL_BACK
54 #define SCANRATE_INC BUTTON_RIGHT
55 #define SCANRATE_DEC BUTTON_LEFT
57 #endif
59 /* Default refresh rates in 1/10 Hz */
60 #if defined ARCHOS_RECORDER || defined ARCHOS_FMRECORDER \
61 || defined ARCHOS_RECORDERV2 || defined ARCHOS_ONDIOFM \
62 || defined ARCHOS_ONDIOSP
63 #define DEFAULT_SCAN_RATE 670
64 #elif defined IAUDIO_M3
65 #define DEFAULT_SCAN_RATE 1500
66 #define HORIZ_SCAN /* LCD controller updates the panel sideways */
67 #define NEED_BOOST
68 #elif defined IAUDIO_M5
69 #define DEFAULT_SCAN_RATE 730
70 #elif defined IPOD_1G2G
71 #define DEFAULT_SCAN_RATE 960
72 #elif defined IPOD_MINI2G || defined IPOD_MINI \
73 || defined IPOD_3G || defined IPOD_4G
74 #define DEFAULT_SCAN_RATE 870
75 #elif defined IRIVER_H100_SERIES
76 #define DEFAULT_SCAN_RATE 700
77 #else
78 #define DEFAULT_SCAN_RATE 700
79 #warning Generic default scanrate
80 #endif
82 #ifdef HORIZ_SCAN
83 #define TEXT_X 0
84 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING
85 #define BUF_WIDTH ((LCD_WIDTH+7)/8)
86 #define BUF_HEIGHT (LCD_HEIGHT/4)
87 #define TEXT_Y BUF_HEIGHT
88 #else
89 #define BUF_WIDTH (LCD_WIDTH)
90 #define BUF_HEIGHT (LCD_HEIGHT/8/4)
91 #define TEXT_Y (BUF_HEIGHT*8)
92 #endif
93 #else /* !HORIZ_SCAN */
94 #define TEXT_Y 0
95 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING
96 #define BUF_WIDTH ((LCD_WIDTH+7)/8/4)
97 #define BUF_HEIGHT LCD_HEIGHT
98 #define TEXT_X (BUF_WIDTH*8)
99 #else
100 #define BUF_WIDTH (LCD_WIDTH/4)
101 #define BUF_HEIGHT (LCD_HEIGHT/8)
102 #define TEXT_X BUF_WIDTH
103 #endif
104 #endif /* !HORIZ_SCAN */
106 #if defined(CPU_PP) && defined(HAVE_ADJUSTABLE_CPU_FREQ)
107 #define NEED_BOOST
108 #endif
110 static const struct plugin_api* rb;
111 static unsigned char bitbuffer[2][BUF_HEIGHT][BUF_WIDTH];
112 static int curbuf = 0;
113 static int scan_rate = DEFAULT_SCAN_RATE;
114 static bool need_refresh = false;
116 static void timer_isr(void)
118 rb->lcd_blit_mono(bitbuffer[curbuf][0], 0, 0, BUF_WIDTH, BUF_HEIGHT, BUF_WIDTH);
119 curbuf = (curbuf + 1) & 1;
120 if (need_refresh)
122 rb->lcd_update_rect(TEXT_X, TEXT_Y, LCD_WIDTH-TEXT_X, 8);
123 need_refresh = false;
127 int plugin_main(void)
129 unsigned char buf[32];
130 int button;
131 bool done = false;
132 bool change = true;
134 rb->lcd_setfont(FONT_SYSFIXED);
136 rb->lcd_putsxy(TEXT_X, TEXT_Y+12, "Adjust Frequ.");
137 rb->lcd_putsxy(TEXT_X, TEXT_Y+20, "so the block");
138 rb->lcd_putsxy(TEXT_X, TEXT_Y+28, "stops moving.");
139 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) \
140 || (CONFIG_KEYPAD == IPOD_1G2G_PAD)
141 rb->lcd_putsxy(TEXT_X, TEXT_Y+40, "Scroll: Coarse");
142 #else
143 rb->lcd_putsxy(TEXT_X, TEXT_Y+40, "U/D: Coarse");
144 #endif
145 rb->lcd_putsxy(TEXT_X, TEXT_Y+48, "L/R: Fine");
146 rb->lcd_update();
148 rb->memset(bitbuffer[0], 0, sizeof(bitbuffer[0]));
149 rb->memset(bitbuffer[1], 0xff, sizeof(bitbuffer[1]));
150 #ifdef NEED_BOOST
151 rb->cpu_boost(true);
152 #endif
153 /* The actual frequency is twice the displayed value */
154 rb->timer_register(1, NULL, TIMER_FREQ * 5 / scan_rate, 1,
155 timer_isr IF_COP(, CPU));
157 while (!done)
159 if (change)
161 /* The actual frequency is twice the displayed value */
162 rb->timer_set_period(TIMER_FREQ * 5 / scan_rate);
163 rb->snprintf(buf, sizeof(buf), "f: %d.%d Hz", scan_rate / 10,
164 scan_rate % 10);
165 rb->lcd_putsxy(TEXT_X, TEXT_Y, buf);
166 need_refresh = true;
167 change = false;
169 button = rb->button_get(true);
170 switch (button)
172 case SCANRATE_FASTINC:
173 case SCANRATE_FASTINC|BUTTON_REPEAT:
174 scan_rate += 10;
175 change = true;
176 break;
178 case SCANRATE_FASTDEC:
179 case SCANRATE_FASTDEC|BUTTON_REPEAT:
180 scan_rate -= 10;
181 change = true;
182 break;
184 case SCANRATE_INC:
185 case SCANRATE_INC|BUTTON_REPEAT:
186 scan_rate++;
187 change = true;
188 break;
190 case SCANRATE_DEC:
191 case SCANRATE_DEC|BUTTON_REPEAT:
192 scan_rate--;
193 change = true;
194 break;
196 case SCANRATE_DONE:
197 done = true;
198 break;
201 rb->timer_unregister();
202 #ifdef NEED_BOOST
203 rb->cpu_boost(false);
204 #endif
206 rb->lcd_setfont(FONT_UI);
208 return PLUGIN_OK;
212 /* this is the plugin entry point */
213 enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter)
215 (void)parameter;
216 rb = api;
217 return plugin_main();
220 #endif