blob: d8f440c25cf31bd1de4eaa2dd39d947ce7655cb1 [file] [log] [blame]
Robert Hak84a6ba22002-06-24 21:39:48 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 Robert Hak
11 *
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.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include "config.h"
21
22#include <stdio.h>
23#include <stdbool.h>
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +000024#include <string.h>
Justin Heinerb5025a82002-08-31 04:58:35 +000025
Robert Hak84a6ba22002-06-24 21:39:48 +000026#include "lcd.h"
27#include "menu.h"
28#include "mpeg.h"
Linus Nielsen Feltzing8a237a82005-04-04 12:06:29 +000029#include "audio.h"
Robert Hak84a6ba22002-06-24 21:39:48 +000030#include "button.h"
31#include "kernel.h"
Björn Stenbergc4d8d972003-02-14 09:44:34 +000032#include "thread.h"
Robert Hak84a6ba22002-06-24 21:39:48 +000033#include "sprintf.h"
Robert Hak84a6ba22002-06-24 21:39:48 +000034#include "settings.h"
35#include "settings_menu.h"
36#include "backlight.h"
Robert Hakea8a4cf2002-10-14 09:12:52 +000037#include "playlist.h" /* for playlist_shuffle */
Daniel Stenberg053d9042002-08-22 15:47:30 +000038#include "fat.h" /* For dotfile settings */
Björn Stenbergfe375a02004-01-14 14:42:31 +000039#include "sleeptimer.h"
Heikki Hannikainen6eb42542002-08-06 10:52:51 +000040#include "powermgmt.h"
Markus Braun3181f682002-08-09 12:38:45 +000041#include "rtc.h"
Björn Stenberg457b8a02002-08-26 13:21:14 +000042#include "ata.h"
Björn Stenbergde5477c2003-09-29 21:26:53 +000043#include "tree.h"
Robert Hak8f4c5042002-10-14 11:55:20 +000044#include "screens.h"
Jörg Hohensohnfa97f162004-03-19 22:15:53 +000045#include "talk.h"
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +000046#include "timefuncs.h"
Linus Nielsen Feltzingade5d7b2004-07-26 16:06:59 +000047#include "misc.h"
Daniel Stenbergf7c3ffa2002-09-27 10:18:48 +000048#ifdef HAVE_LCD_BITMAP
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +000049#include "peakmeter.h"
Daniel Stenbergf7c3ffa2002-09-27 10:18:48 +000050#endif
Björn Stenberg505eca72002-09-18 14:08:05 +000051#include "lang.h"
Jörg Hohensohn593cc002004-09-28 22:13:26 +000052#if CONFIG_HWCODEC == MAS3507D
Linus Nielsen Feltzing54a7e202003-11-04 00:18:19 +000053void dac_line_in(bool enable);
Linus Nielsen Feltzingc22b4112003-11-03 23:36:36 +000054#endif
Björn Stenbergfe375a02004-01-14 14:42:31 +000055#ifdef HAVE_ALARM_MOD
56#include "alarm_menu.h"
57#endif
Robert Hak84a6ba22002-06-24 21:39:48 +000058
Christian Gmeiner7c1879b2005-04-15 12:08:49 +000059#ifdef HAVE_REMOTE_LCD
60#include "lcd-remote.h"
61#endif
62
Linus Nielsen Feltzing6271b2b2005-06-09 09:47:00 +000063#if CONFIG_HWCODEC == MASNONE
64#include "pcm_playback.h"
65#endif
66
Jens Arnoldccfa4cd2004-10-10 01:25:32 +000067#ifdef HAVE_CHARGING
Björn Stenbergb1c429e2003-10-17 14:49:00 +000068static bool car_adapter_mode(void)
69{
70 return set_bool_options( str(LANG_CAR_ADAPTER_MODE),
71 &global_settings.car_adapter_mode,
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +000072 STR(LANG_SET_BOOL_YES),
73 STR(LANG_SET_BOOL_NO),
Linus Nielsen Feltzing3d217812005-04-06 11:12:22 +000074 NULL);
Björn Stenbergb1c429e2003-10-17 14:49:00 +000075}
Jens Arnoldccfa4cd2004-10-10 01:25:32 +000076#endif
Björn Stenbergb1c429e2003-10-17 14:49:00 +000077
Björn Stenbergb1b8bd42002-09-24 17:22:12 +000078static bool contrast(void)
Linus Nielsen Feltzing638184f2002-08-13 11:10:11 +000079{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +000080 return set_int( str(LANG_CONTRAST), "", UNIT_INT,
81 &global_settings.contrast,
Linus Nielsen Feltzing9fb2d342003-06-25 23:24:47 +000082 lcd_set_contrast, 1, MIN_CONTRAST_SETTING,
83 MAX_CONTRAST_SETTING );
Linus Nielsen Feltzing638184f2002-08-13 11:10:11 +000084}
85
Christian Gmeiner7c1879b2005-04-15 12:08:49 +000086#ifdef HAVE_REMOTE_LCD
87static bool remote_contrast(void)
88{
89 return set_int( str(LANG_CONTRAST), "", UNIT_INT,
90 &global_settings.remote_contrast,
91 lcd_remote_set_contrast, 1, MIN_CONTRAST_SETTING,
92 MAX_CONTRAST_SETTING );
93}
94
95static bool remote_invert(void)
96{
97 bool rc = set_bool_options(str(LANG_INVERT),
98 &global_settings.remote_invert,
99 STR(LANG_INVERT_LCD_INVERSE),
100 STR(LANG_INVERT_LCD_NORMAL),
101 lcd_remote_set_invert_display);
102 return rc;
103}
Jens Arnoldbd1bb5f2005-06-17 21:43:00 +0000104
105static bool remote_flip_display(void)
106{
107 bool rc = set_bool( str(LANG_FLIP_DISPLAY),
108 &global_settings.remote_flip_display);
109
110 lcd_remote_set_flip(global_settings.remote_flip_display);
111 lcd_remote_update();
112
113 return rc;
114}
Christian Gmeiner7c1879b2005-04-15 12:08:49 +0000115#endif
116
Jörg Hohensohnfee86172004-12-18 10:29:47 +0000117#ifdef CONFIG_BACKLIGHT
Björn Stenberg8d4471d2003-04-24 08:27:11 +0000118static bool caption_backlight(void)
119{
120 bool rc = set_bool( str(LANG_CAPTION_BACKLIGHT),
121 &global_settings.caption_backlight);
122
123 return rc;
124}
Jens Arnolda1a08d02004-10-09 19:56:27 +0000125#endif
Björn Stenberg8d4471d2003-04-24 08:27:11 +0000126
Björn Stenbergd1a6fa12003-06-05 09:38:26 +0000127/**
128 * Menu to set icon visibility
129 */
130static bool show_icons(void)
131{
132 return set_bool( str(LANG_SHOW_ICONS), &global_settings.show_icons );
133}
134
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000135#ifdef HAVE_LCD_BITMAP
Robert Hakda407262002-10-26 05:46:53 +0000136
Björn Stenbergd1a6fa12003-06-05 09:38:26 +0000137 /**
138 * Menu to set LCD Mode (normal/inverse)
139 */
Björn Stenbergb1079202003-02-27 14:22:30 +0000140static bool invert(void)
141{
Björn Stenberg233b7f32003-04-24 13:13:16 +0000142 bool rc = set_bool_options(str(LANG_INVERT),
143 &global_settings.invert,
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000144 STR(LANG_INVERT_LCD_INVERSE),
145 STR(LANG_INVERT_LCD_NORMAL),
Björn Stenberg26712d52003-06-05 11:11:10 +0000146 lcd_set_invert_display);
Björn Stenberg233b7f32003-04-24 13:13:16 +0000147 return rc;
Björn Stenbergb1079202003-02-27 14:22:30 +0000148}
149
Björn Stenbergd1a6fa12003-06-05 09:38:26 +0000150/**
151 * Menu to set Line Selector Type (Pointer/Bar)
152 */
Linus Nielsen Feltzinge43b78a2003-04-16 00:12:31 +0000153static bool invert_cursor(void)
154{
Björn Stenberg233b7f32003-04-24 13:13:16 +0000155 return set_bool_options(str(LANG_INVERT_CURSOR),
156 &global_settings.invert_cursor,
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000157 STR(LANG_INVERT_CURSOR_BAR),
158 STR(LANG_INVERT_CURSOR_POINTER),
Björn Stenberg26712d52003-06-05 11:11:10 +0000159 NULL);
Linus Nielsen Feltzinge43b78a2003-04-16 00:12:31 +0000160}
161
Robert Hakda407262002-10-26 05:46:53 +0000162/**
Jörg Hohensohna5e1d062003-12-20 10:00:37 +0000163 * Menu to turn the display+buttons by 180 degrees
164 */
165static bool flip_display(void)
166{
167 bool rc = set_bool( str(LANG_FLIP_DISPLAY),
168 &global_settings.flip_display);
169
170 button_set_flip(global_settings.flip_display);
171 lcd_set_flip(global_settings.flip_display);
172
173 return rc;
174}
175
176/**
Robert Hakda407262002-10-26 05:46:53 +0000177 * Menu to configure the battery display on status bar
178 */
Jens Arnold9d42e2b2005-01-30 13:48:44 +0000179static bool battery_display(void)
Robert Hakda407262002-10-26 05:46:53 +0000180{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000181 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000182 { STR(LANG_DISPLAY_GRAPHIC) },
183 { STR(LANG_DISPLAY_NUMERIC) }
184 };
Robert Hakda407262002-10-26 05:46:53 +0000185 return set_option( str(LANG_BATTERY_DISPLAY),
Jens Arnold9d42e2b2005-01-30 13:48:44 +0000186 &global_settings.battery_display, INT, names, 2, NULL);
Robert Hakda407262002-10-26 05:46:53 +0000187}
188
189/**
190 * Menu to configure the volume display on status bar
191 */
192static bool volume_type(void)
193{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000194 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000195 { STR(LANG_DISPLAY_GRAPHIC) },
196 { STR(LANG_DISPLAY_NUMERIC) }
197 };
Robert Hakda407262002-10-26 05:46:53 +0000198 return set_option( str(LANG_VOLUME_DISPLAY), &global_settings.volume_type,
Björn Stenberg26712d52003-06-05 11:11:10 +0000199 INT, names, 2, NULL);
Robert Hakda407262002-10-26 05:46:53 +0000200}
201
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000202#ifdef PM_DEBUG
203static bool peak_meter_fps_menu(void) {
204 bool retval = false;
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000205 retval = set_int( "Refresh rate", "/s", UNIT_PER_SEC,
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000206 &peak_meter_fps,
207 NULL, 1, 5, 40);
208 return retval;
209}
210#endif /* PM_DEBUG */
211
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000212/**
213 * Menu to set the hold time of normal peaks.
214 */
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000215static bool peak_meter_hold(void) {
216 bool retval = false;
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000217 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000218 { STR(LANG_OFF) },
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000219 { "200 ms " , TALK_ID(200, UNIT_MS) },
220 { "300 ms " , TALK_ID(300, UNIT_MS) },
221 { "500 ms " , TALK_ID(500, UNIT_MS) },
222 { "1 s" , TALK_ID(1, UNIT_SEC) },
223 { "2 s" , TALK_ID(2, UNIT_SEC) },
224 { "3 s" , TALK_ID(3, UNIT_SEC) },
225 { "4 s" , TALK_ID(4, UNIT_SEC) },
226 { "5 s" , TALK_ID(5, UNIT_SEC) },
227 { "6 s" , TALK_ID(6, UNIT_SEC) },
228 { "7 s" , TALK_ID(7, UNIT_SEC) },
229 { "8 s" , TALK_ID(8, UNIT_SEC) },
230 { "9 s" , TALK_ID(9, UNIT_SEC) },
231 { "10 s" , TALK_ID(10, UNIT_SEC) },
232 { "15 s" , TALK_ID(15, UNIT_SEC) },
233 { "20 s" , TALK_ID(20, UNIT_SEC) },
234 { "30 s" , TALK_ID(30, UNIT_SEC) },
235 { "1 min" , TALK_ID(1, UNIT_MIN) }
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000236 };
Björn Stenberg26712d52003-06-05 11:11:10 +0000237 retval = set_option( str(LANG_PM_PEAK_HOLD),
238 &global_settings.peak_meter_hold, INT, names,
239 18, NULL);
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000240
241 peak_meter_init_times(global_settings.peak_meter_release,
242 global_settings.peak_meter_hold,
243 global_settings.peak_meter_clip_hold);
244
245 return retval;
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000246}
247
248/**
249 * Menu to set the hold time of clips.
250 */
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000251static bool peak_meter_clip_hold(void) {
252 bool retval = false;
253
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000254 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000255 { STR(LANG_PM_ETERNAL) },
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000256 { "1s " , TALK_ID(1, UNIT_SEC) },
257 { "2s " , TALK_ID(2, UNIT_SEC) },
258 { "3s " , TALK_ID(3, UNIT_SEC) },
259 { "4s " , TALK_ID(4, UNIT_SEC) },
260 { "5s " , TALK_ID(5, UNIT_SEC) },
261 { "6s " , TALK_ID(6, UNIT_SEC) },
262 { "7s " , TALK_ID(7, UNIT_SEC) },
263 { "8s " , TALK_ID(8, UNIT_SEC) },
264 { "9s " , TALK_ID(9, UNIT_SEC) },
265 { "10s" , TALK_ID(10, UNIT_SEC) },
266 { "15s" , TALK_ID(15, UNIT_SEC) },
267 { "20s" , TALK_ID(20, UNIT_SEC) },
268 { "25s" , TALK_ID(25, UNIT_SEC) },
269 { "30s" , TALK_ID(30, UNIT_SEC) },
270 { "45s" , TALK_ID(45, UNIT_SEC) },
271 { "60s" , TALK_ID(60, UNIT_SEC) },
272 { "90s" , TALK_ID(90, UNIT_SEC) },
273 { "2min" , TALK_ID(2, UNIT_MIN) },
274 { "3min" , TALK_ID(3, UNIT_MIN) },
275 { "5min" , TALK_ID(5, UNIT_MIN) },
276 { "10min" , TALK_ID(10, UNIT_MIN) },
277 { "20min" , TALK_ID(20, UNIT_MIN) },
278 { "45min" , TALK_ID(45, UNIT_MIN) },
279 { "90min" , TALK_ID(90, UNIT_MIN) }
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000280 };
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000281 retval = set_option( str(LANG_PM_CLIP_HOLD),
Björn Stenberg26712d52003-06-05 11:11:10 +0000282 &global_settings.peak_meter_clip_hold, INT, names,
283 25, peak_meter_set_clip_hold);
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000284
285 peak_meter_init_times(global_settings.peak_meter_release,
286 global_settings.peak_meter_hold,
287 global_settings.peak_meter_clip_hold);
288
289 return retval;
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000290}
291
292/**
293 * Menu to set the release time of the peak meter.
294 */
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000295static bool peak_meter_release(void) {
296 bool retval = false;
297
298 /* The range of peak_meter_release is restricted so that it
299 fits into a 7 bit number. The 8th bit is used for storing
300 something else in the rtc ram.
301 Also, the max value is 0x7e, since the RTC value 0xff is reserved */
Jens Arnold359ef772004-11-19 01:13:33 +0000302 retval = set_int( str(LANG_PM_RELEASE), str(LANG_PM_UNITS_PER_READ),
303 LANG_PM_UNITS_PER_READ,
304 &global_settings.peak_meter_release,
305 NULL, 1, 1, 0x7e);
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000306
307 peak_meter_init_times(global_settings.peak_meter_release,
308 global_settings.peak_meter_hold,
309 global_settings.peak_meter_clip_hold);
310
311 return retval;
312}
313
314/**
315 * Menu to select wether the scale of the meter
316 * displays dBfs of linear values.
317 */
318static bool peak_meter_scale(void) {
319 bool retval = false;
320 bool use_dbfs = global_settings.peak_meter_dbfs;
321 retval = set_bool_options(str(LANG_PM_SCALE),
322 &use_dbfs,
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000323 STR(LANG_PM_DBFS), STR(LANG_PM_LINEAR),
Björn Stenberg26712d52003-06-05 11:11:10 +0000324 NULL);
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000325
326 /* has the user really changed the scale? */
327 if (use_dbfs != global_settings.peak_meter_dbfs) {
328
329 /* store the change */
330 global_settings.peak_meter_dbfs = use_dbfs;
331 peak_meter_set_use_dbfs(use_dbfs);
332
333 /* If the user changed the scale mode the meaning of
334 peak_meter_min (peak_meter_max) has changed. Thus we have
335 to convert the values stored in global_settings. */
336 if (use_dbfs) {
337
338 /* we only store -dBfs */
339 global_settings.peak_meter_min = -peak_meter_get_min() / 100;
340 global_settings.peak_meter_max = -peak_meter_get_max() / 100;
341 } else {
342 int max;
343
344 /* linear percent */
345 global_settings.peak_meter_min = peak_meter_get_min();
346
347 /* converting dBfs -> percent results in a precision loss.
348 I assume that the user doesn't bother that conversion
349 dBfs <-> percent isn't symmetrical for odd values but that
350 he wants 0 dBfs == 100%. Thus I 'correct' the percent value
351 resulting from dBfs -> percent manually here */
352 max = peak_meter_get_max();
353 global_settings.peak_meter_max = max < 99 ? max : 100;
354 }
355 settings_apply_pm_range();
356 }
357 return retval;
358}
359
360/**
361 * Adjust the min value of the value range that
362 * the peak meter shall visualize.
363 */
364static bool peak_meter_min(void) {
365 bool retval = false;
366 if (global_settings.peak_meter_dbfs) {
367
368 /* for dBfs scale */
369 int range_max = -global_settings.peak_meter_max;
370 int min = -global_settings.peak_meter_min;
371
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000372 retval = set_int(str(LANG_PM_MIN), str(LANG_PM_DBFS), UNIT_DB,
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000373 &min, NULL, 1, -89, range_max);
374
375 global_settings.peak_meter_min = - min;
376 }
377
378 /* for linear scale */
379 else {
380 int min = global_settings.peak_meter_min;
381
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000382 retval = set_int(str(LANG_PM_MIN), "%", UNIT_PERCENT,
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000383 &min, NULL,
384 1, 0, global_settings.peak_meter_max - 1);
385
386 global_settings.peak_meter_min = (unsigned char)min;
387 }
388
389 settings_apply_pm_range();
390 return retval;
391}
392
393
394/**
395 * Adjust the max value of the value range that
396 * the peak meter shall visualize.
397 */
398static bool peak_meter_max(void) {
399 bool retval = false;
400 if (global_settings.peak_meter_dbfs) {
401
402 /* for dBfs scale */
403 int range_min = -global_settings.peak_meter_min;
404 int max = -global_settings.peak_meter_max;;
405
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000406 retval = set_int(str(LANG_PM_MAX), str(LANG_PM_DBFS), UNIT_DB,
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000407 &max, NULL, 1, range_min, 0);
408
409 global_settings.peak_meter_max = - max;
410
411 }
412
413 /* for linear scale */
414 else {
415 int max = global_settings.peak_meter_max;
416
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000417 retval = set_int(str(LANG_PM_MAX), "%", UNIT_PERCENT,
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000418 &max, NULL,
419 1, global_settings.peak_meter_min + 1, 100);
420
421 global_settings.peak_meter_max = (unsigned char)max;
422 }
423
424 settings_apply_pm_range();
425 return retval;
426}
427
428/**
429 * Menu to select wether the meter is in
430 * precision or in energy saver mode
431 */
432static bool peak_meter_performance(void) {
433 bool retval = false;
434 retval = set_bool_options(str(LANG_PM_PERFORMANCE),
435 &global_settings.peak_meter_performance,
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000436 STR(LANG_PM_HIGH_PERFORMANCE), STR(LANG_PM_ENERGY_SAVER),
Björn Stenberg26712d52003-06-05 11:11:10 +0000437 NULL);
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000438
439 if (global_settings.peak_meter_performance) {
440 peak_meter_fps = 25;
441 } else {
442 peak_meter_fps = 20;
443 }
444 return retval;
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000445}
446
447/**
448 * Menu to configure the peak meter
449 */
450static bool peak_meter_menu(void)
451{
452 int m;
453 bool result;
454
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000455 static const struct menu_item items[] = {
456 { ID2P(LANG_PM_RELEASE) , peak_meter_release },
457 { ID2P(LANG_PM_PEAK_HOLD), peak_meter_hold },
458 { ID2P(LANG_PM_CLIP_HOLD), peak_meter_clip_hold },
459 { ID2P(LANG_PM_PERFORMANCE), peak_meter_performance },
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000460#ifdef PM_DEBUG
Jörg Hohensohn4f36ea82004-03-14 21:33:53 +0000461 { "Refresh rate" , -1 , peak_meter_fps_menu },
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000462#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000463 { ID2P(LANG_PM_SCALE) , peak_meter_scale },
464 { ID2P(LANG_PM_MIN) , peak_meter_min },
465 { ID2P(LANG_PM_MAX) , peak_meter_max },
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000466 };
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +0000467
468 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
469 NULL, NULL, NULL );
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000470 result = menu_run(m);
471 menu_exit(m);
472 return result;
473}
Linus Nielsen Feltzingfd0cc3b2002-10-29 12:09:15 +0000474#endif /* HAVE_LCD_BITMAP */
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +0000475
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000476static bool shuffle(void)
Robert Hak84a6ba22002-06-24 21:39:48 +0000477{
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000478 return set_bool( str(LANG_SHUFFLE), &global_settings.playlist_shuffle );
Björn Stenberg60b356e2002-06-27 01:08:11 +0000479}
Björn Stenberga6d0abb2002-10-04 08:48:20 +0000480
481static bool repeat_mode(void)
482{
483 bool result;
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000484 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000485 { STR(LANG_OFF) },
486 { STR(LANG_REPEAT_ALL) },
487 { STR(LANG_REPEAT_ONE) }
488 };
Björn Stenberga6d0abb2002-10-04 08:48:20 +0000489 int old_repeat = global_settings.repeat_mode;
490
491 result = set_option( str(LANG_REPEAT), &global_settings.repeat_mode,
Björn Stenberg26712d52003-06-05 11:11:10 +0000492 INT, names, 3, NULL );
Björn Stenberga6d0abb2002-10-04 08:48:20 +0000493
494 if (old_repeat != global_settings.repeat_mode)
Linus Nielsen Feltzing8a237a82005-04-04 12:06:29 +0000495 audio_flush_and_reload_tracks();
Björn Stenberga6d0abb2002-10-04 08:48:20 +0000496
497 return result;
498}
Robert Hak84a6ba22002-06-24 21:39:48 +0000499
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000500static bool play_selected(void)
Linus Nielsen Feltzing25316c52002-09-18 10:13:09 +0000501{
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000502 return set_bool( str(LANG_PLAY_SELECTED), &global_settings.play_selected );
Linus Nielsen Feltzing25316c52002-09-18 10:13:09 +0000503}
504
Björn Stenberga7dcf912002-09-24 19:12:09 +0000505static bool dir_filter(void)
Björn Stenberg60b356e2002-06-27 01:08:11 +0000506{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000507 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000508 { STR(LANG_FILTER_ALL) },
509 { STR(LANG_FILTER_SUPPORTED) },
510 { STR(LANG_FILTER_MUSIC) },
Björn Stenbergfc53fd72005-01-17 11:37:36 +0000511 { STR(LANG_FILTER_PLAYLIST) },
512 { STR(LANG_FILTER_ID3DB) }
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000513 };
Björn Stenberg26712d52003-06-05 11:11:10 +0000514 return set_option( str(LANG_FILTER), &global_settings.dirfilter, INT,
Björn Stenbergfc53fd72005-01-17 11:37:36 +0000515 names, 5, NULL );
Robert Hak84a6ba22002-06-24 21:39:48 +0000516}
517
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000518static bool sort_case(void)
Linus Nielsen Feltzingc132c482002-07-22 16:39:17 +0000519{
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000520 return set_bool( str(LANG_SORT_CASE), &global_settings.sort_case );
Linus Nielsen Feltzingc132c482002-07-22 16:39:17 +0000521}
522
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000523static bool sort_file(void)
524{
Jörg Hohensohnd79b1f52004-06-23 07:28:35 +0000525 int oldval = global_settings.sort_file;
526 bool ret;
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000527 static const struct opt_items names[] = {
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000528 { STR(LANG_SORT_ALPHA) },
529 { STR(LANG_SORT_DATE) },
530 { STR(LANG_SORT_DATE_REVERSE) },
531 { STR(LANG_SORT_TYPE) }
532 };
Jörg Hohensohnd79b1f52004-06-23 07:28:35 +0000533 ret = set_option( str(LANG_SORT_FILE), &global_settings.sort_file, INT,
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000534 names, 4, NULL );
Jörg Hohensohnd79b1f52004-06-23 07:28:35 +0000535 if (global_settings.sort_file != oldval)
536 reload_directory(); /* force reload if this has changed */
537 return ret;
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000538}
539
540static bool sort_dir(void)
541{
Jörg Hohensohnd79b1f52004-06-23 07:28:35 +0000542 int oldval = global_settings.sort_dir;
543 bool ret;
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000544 static const struct opt_items names[] = {
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000545 { STR(LANG_SORT_ALPHA) },
546 { STR(LANG_SORT_DATE) },
547 { STR(LANG_SORT_DATE_REVERSE) }
548 };
Jörg Hohensohnd79b1f52004-06-23 07:28:35 +0000549 ret = set_option( str(LANG_SORT_DIR), &global_settings.sort_dir, INT,
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000550 names, 3, NULL );
Jörg Hohensohnd79b1f52004-06-23 07:28:35 +0000551 if (global_settings.sort_dir != oldval)
552 reload_directory(); /* force reload if this has changed */
553 return ret;
Jörg Hohensohn5c8a2f52004-06-22 09:16:44 +0000554}
555
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000556static bool resume(void)
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000557{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000558 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000559 { STR(LANG_SET_BOOL_NO) },
560 { STR(LANG_RESUME_SETTING_ASK) },
561 { STR(LANG_RESUME_SETTING_ASK_ONCE) },
562 { STR(LANG_SET_BOOL_YES) }
563 };
Björn Stenberg26712d52003-06-05 11:11:10 +0000564 return set_option( str(LANG_RESUME), &global_settings.resume, INT,
Robert Hakc88751f2002-10-16 07:25:33 +0000565 names, 4, NULL );
Björn Stenberg6224cdb2002-08-16 14:41:47 +0000566}
567
Björn Stenberga108ec22004-01-14 00:13:04 +0000568static bool autocreatebookmark(void)
569{
Henrik Backee7353562004-04-19 17:51:47 +0000570 bool retval = false;
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000571 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000572 { STR(LANG_SET_BOOL_NO) },
573 { STR(LANG_SET_BOOL_YES) },
574 { STR(LANG_RESUME_SETTING_ASK) },
575 { STR(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES) },
576 { STR(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK) }
577 };
Henrik Backee7353562004-04-19 17:51:47 +0000578
579 retval = set_option( str(LANG_BOOKMARK_SETTINGS_AUTOCREATE),
Björn Stenberga108ec22004-01-14 00:13:04 +0000580 &global_settings.autocreatebookmark, INT,
581 names, 5, NULL );
Henrik Backee7353562004-04-19 17:51:47 +0000582 if(global_settings.autocreatebookmark == BOOKMARK_RECENT_ONLY_YES ||
583 global_settings.autocreatebookmark == BOOKMARK_RECENT_ONLY_ASK)
584 {
585 if(global_settings.usemrb == BOOKMARK_NO)
586 global_settings.usemrb = BOOKMARK_YES;
587
588 }
589 return retval;
Björn Stenberga108ec22004-01-14 00:13:04 +0000590}
591
592static bool autoloadbookmark(void)
593{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000594 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000595 { STR(LANG_SET_BOOL_NO) },
596 { STR(LANG_SET_BOOL_YES) },
597 { STR(LANG_RESUME_SETTING_ASK) }
598 };
Björn Stenberga108ec22004-01-14 00:13:04 +0000599 return set_option( str(LANG_BOOKMARK_SETTINGS_AUTOLOAD),
600 &global_settings.autoloadbookmark, INT,
601 names, 3, NULL );
602}
603
604static bool useMRB(void)
605{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000606 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000607 { STR(LANG_SET_BOOL_NO) },
608 { STR(LANG_SET_BOOL_YES) },
609 { STR(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY) }
610 };
Björn Stenberga108ec22004-01-14 00:13:04 +0000611 return set_option( str(LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS),
612 &global_settings.usemrb, INT,
613 names, 3, NULL );
614}
Jens Arnolda1a08d02004-10-09 19:56:27 +0000615
Jörg Hohensohnfee86172004-12-18 10:29:47 +0000616#ifdef CONFIG_BACKLIGHT
617#ifdef HAVE_CHARGING
Daniel Stenbergb95fe1a2002-10-01 10:59:36 +0000618static bool backlight_on_when_charging(void)
619{
620 bool result = set_bool(str(LANG_BACKLIGHT_ON_WHEN_CHARGING),
621 &global_settings.backlight_on_when_charging);
622 backlight_set_on_when_charging(global_settings.backlight_on_when_charging);
623 return result;
624}
Jörg Hohensohnfee86172004-12-18 10:29:47 +0000625#endif
Daniel Stenbergb95fe1a2002-10-01 10:59:36 +0000626
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000627static bool backlight_timer(void)
Robert Hak84a6ba22002-06-24 21:39:48 +0000628{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000629 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000630 { STR(LANG_OFF) },
631 { STR(LANG_ON) },
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000632 { "1s ", TALK_ID(1, UNIT_SEC) },
633 { "2s ", TALK_ID(2, UNIT_SEC) },
634 { "3s ", TALK_ID(3, UNIT_SEC) },
635 { "4s ", TALK_ID(4, UNIT_SEC) },
636 { "5s ", TALK_ID(5, UNIT_SEC) },
637 { "6s ", TALK_ID(6, UNIT_SEC) },
638 { "7s ", TALK_ID(7, UNIT_SEC) },
639 { "8s ", TALK_ID(8, UNIT_SEC) },
640 { "9s ", TALK_ID(9, UNIT_SEC) },
641 { "10s", TALK_ID(10, UNIT_SEC) },
642 { "15s", TALK_ID(15, UNIT_SEC) },
643 { "20s", TALK_ID(20, UNIT_SEC) },
644 { "25s", TALK_ID(25, UNIT_SEC) },
645 { "30s", TALK_ID(30, UNIT_SEC) },
646 { "45s", TALK_ID(45, UNIT_SEC) },
647 { "60s", TALK_ID(60, UNIT_SEC) },
648 { "90s", TALK_ID(90, UNIT_SEC) }
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000649 };
Daniel Stenbergb95fe1a2002-10-01 10:59:36 +0000650 return set_option(str(LANG_BACKLIGHT), &global_settings.backlight_timeout,
Björn Stenberg26712d52003-06-05 11:11:10 +0000651 INT, names, 19, backlight_set_timeout );
Robert Hak84a6ba22002-06-24 21:39:48 +0000652}
Jörg Hohensohnfee86172004-12-18 10:29:47 +0000653#endif /* CONFIG_BACKLIGHT */
Robert Hak84a6ba22002-06-24 21:39:48 +0000654
Christian Gmeiner7477c092005-05-30 00:00:22 +0000655#ifdef HAVE_REMOTE_LCD
656
657static bool remote_backlight_timer(void)
658{
659 static const struct opt_items names[] = {
660 { STR(LANG_OFF) },
661 { STR(LANG_ON) },
662 { "1s ", TALK_ID(1, UNIT_SEC) },
663 { "2s ", TALK_ID(2, UNIT_SEC) },
664 { "3s ", TALK_ID(3, UNIT_SEC) },
665 { "4s ", TALK_ID(4, UNIT_SEC) },
666 { "5s ", TALK_ID(5, UNIT_SEC) },
667 { "6s ", TALK_ID(6, UNIT_SEC) },
668 { "7s ", TALK_ID(7, UNIT_SEC) },
669 { "8s ", TALK_ID(8, UNIT_SEC) },
670 { "9s ", TALK_ID(9, UNIT_SEC) },
671 { "10s", TALK_ID(10, UNIT_SEC) },
672 { "15s", TALK_ID(15, UNIT_SEC) },
673 { "20s", TALK_ID(20, UNIT_SEC) },
674 { "25s", TALK_ID(25, UNIT_SEC) },
675 { "30s", TALK_ID(30, UNIT_SEC) },
676 { "45s", TALK_ID(45, UNIT_SEC) },
677 { "60s", TALK_ID(60, UNIT_SEC) },
678 { "90s", TALK_ID(90, UNIT_SEC) }
679 };
680 return set_option(str(LANG_BACKLIGHT), &global_settings.remote_backlight_timeout,
Christian Gmeinerca980522005-05-30 00:45:46 +0000681 INT, names, 19, remote_backlight_set_timeout );
Christian Gmeiner7477c092005-05-30 00:00:22 +0000682}
683
684#endif /* HAVE_REMOTE_LCD */
685
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000686static bool poweroff_idle_timer(void)
Linus Nielsen Feltzing083a6db2002-09-23 11:42:48 +0000687{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000688 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000689 { STR(LANG_OFF) },
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000690 { "1m ", TALK_ID(1, UNIT_MIN) },
691 { "2m ", TALK_ID(2, UNIT_MIN) },
692 { "3m ", TALK_ID(3, UNIT_MIN) },
693 { "4m ", TALK_ID(4, UNIT_MIN) },
694 { "5m ", TALK_ID(5, UNIT_MIN) },
695 { "6m ", TALK_ID(6, UNIT_MIN) },
696 { "7m ", TALK_ID(7, UNIT_MIN) },
697 { "8m ", TALK_ID(8, UNIT_MIN) },
698 { "9m ", TALK_ID(9, UNIT_MIN) },
699 { "10m", TALK_ID(10, UNIT_MIN) },
700 { "15m", TALK_ID(15, UNIT_MIN) },
701 { "30m", TALK_ID(30, UNIT_MIN) },
702 { "45m", TALK_ID(45, UNIT_MIN) },
703 { "60m", TALK_ID(60, UNIT_MIN) }
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000704 };
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000705 return set_option(str(LANG_POWEROFF_IDLE), &global_settings.poweroff,
Björn Stenberg26712d52003-06-05 11:11:10 +0000706 INT, names, 15, set_poweroff_timeout);
Linus Nielsen Feltzing083a6db2002-09-23 11:42:48 +0000707}
708
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000709static bool scroll_speed(void)
Robert Hak84a6ba22002-06-24 21:39:48 +0000710{
Jens Arnold566eae22004-10-15 20:30:29 +0000711 return set_int(str(LANG_SCROLL), "", UNIT_INT,
712 &global_settings.scroll_speed,
713 &lcd_scroll_speed, 1, 0, 15 );
Robert Hak048fa132002-12-12 17:20:37 +0000714}
715
716
717static bool scroll_delay(void)
718{
719 int dummy = global_settings.scroll_delay * (HZ/10);
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000720 int rc = set_int(str(LANG_SCROLL_DELAY), "ms", UNIT_MS,
721 &dummy,
Robert Hak89d8f762002-12-12 20:34:30 +0000722 &lcd_scroll_delay, 100, 0, 2500 );
Robert Hak048fa132002-12-12 17:20:37 +0000723 global_settings.scroll_delay = dummy / (HZ/10);
724 return rc;
Robert Hak84a6ba22002-06-24 21:39:48 +0000725}
726
Björn Stenberga2e98c12002-12-12 15:20:37 +0000727#ifdef HAVE_LCD_BITMAP
728static bool scroll_step(void)
729{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000730 return set_int(str(LANG_SCROLL_STEP_EXAMPLE), "pixels", UNIT_PIXEL,
Björn Stenberga2e98c12002-12-12 15:20:37 +0000731 &global_settings.scroll_step,
732 &lcd_scroll_step, 1, 1, LCD_WIDTH );
733}
Mats Lidellc65dadf2003-01-14 10:48:01 +0000734#endif
Björn Stenberga2e98c12002-12-12 15:20:37 +0000735
Björn Stenberga2e98c12002-12-12 15:20:37 +0000736static bool bidir_limit(void)
737{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000738 return set_int(str(LANG_BIDIR_SCROLL), "%", UNIT_PERCENT,
739 &global_settings.bidir_limit,
Björn Stenberga2e98c12002-12-12 15:20:37 +0000740 &lcd_bidir_scroll, 25, 0, 200 );
741}
Björn Stenberga2e98c12002-12-12 15:20:37 +0000742
Kjell Ericson53f156a2003-05-22 06:42:14 +0000743#ifdef HAVE_LCD_CHARCELLS
744static bool jump_scroll(void)
745{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000746 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000747 { STR(LANG_OFF) },
748 { STR(LANG_ONE_TIME) },
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000749 { "2", TALK_ID(2, UNIT_INT) },
750 { "3", TALK_ID(3, UNIT_INT) },
751 { "4", TALK_ID(4, UNIT_INT) },
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000752 { STR(LANG_ALWAYS) }
753 };
Kjell Ericson6143eeb2003-05-27 12:54:11 +0000754 bool ret;
755 ret=set_option(str(LANG_JUMP_SCROLL), &global_settings.jump_scroll,
Björn Stenberg26712d52003-06-05 11:11:10 +0000756 INT, names, 6, lcd_jump_scroll);
Kjell Ericson6143eeb2003-05-27 12:54:11 +0000757 return ret;
758}
759static bool jump_scroll_delay(void)
760{
761 int dummy = global_settings.jump_scroll_delay * (HZ/10);
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000762 int rc = set_int(str(LANG_JUMP_SCROLL_DELAY), "ms", UNIT_MS,
763 &dummy,
Kjell Ericson6143eeb2003-05-27 12:54:11 +0000764 &lcd_jump_scroll_delay, 100, 0, 2500 );
765 global_settings.jump_scroll_delay = dummy / (HZ/10);
766 return rc;
Kjell Ericson53f156a2003-05-22 06:42:14 +0000767}
768#endif
769
Uwe Freese0bf70e62002-12-16 22:58:48 +0000770#ifndef SIMULATOR
Uwe Freese4cff0302002-12-15 18:12:00 +0000771/**
772 * Menu to set the battery capacity
773 */
Uwe Freese0bf70e62002-12-16 22:58:48 +0000774static bool battery_capacity(void)
775{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000776 return set_int(str(LANG_BATTERY_CAPACITY), "mAh", UNIT_MAH,
777 &global_settings.battery_capacity,
Jens Arnoldfe324562004-10-10 10:28:21 +0000778 &set_battery_capacity, 50, BATTERY_CAPACITY_MIN,
779 BATTERY_CAPACITY_MAX );
Uwe Freese4cff0302002-12-15 18:12:00 +0000780}
Jens Arnold91846a12005-01-30 16:25:46 +0000781
782#if BATTERY_TYPES_COUNT > 1
783static bool battery_type(void)
784{
785 static const struct opt_items names[] = {
786 { STR(LANG_BATTERY_TYPE_ALKALINE) },
787 { STR(LANG_BATTERY_TYPE_NIMH) }
788 };
789
790 return set_option(str(LANG_BATTERY_TYPE), &global_settings.battery_type,
791 INT, names, 2, set_battery_type);
792}
793#endif
Uwe Freese0bf70e62002-12-16 22:58:48 +0000794#endif
Uwe Freese4cff0302002-12-15 18:12:00 +0000795
Björn Stenbergfe375a02004-01-14 14:42:31 +0000796#ifdef HAVE_RTC
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000797static bool timedate_set(void)
Markus Braun3181f682002-08-09 12:38:45 +0000798{
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +0000799 struct tm tm;
800 int timedate[8];
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000801 bool result;
Markus Braun3181f682002-08-09 12:38:45 +0000802
Markus Braun3181f682002-08-09 12:38:45 +0000803 timedate[0] = rtc_read(0x03); /* hour */
804 timedate[1] = rtc_read(0x02); /* minute */
805 timedate[2] = rtc_read(0x01); /* second */
Markus Braun2012acf2002-08-09 13:50:58 +0000806 timedate[3] = rtc_read(0x07); /* year */
Markus Braun3181f682002-08-09 12:38:45 +0000807 timedate[4] = rtc_read(0x06); /* month */
Markus Braun2012acf2002-08-09 13:50:58 +0000808 timedate[5] = rtc_read(0x05); /* day */
Markus Braun44ee2ab2003-05-27 14:28:08 +0000809
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +0000810 /* Make a local copy of the time struct */
811 memcpy(&tm, get_time(), sizeof(struct tm));
Markus Braun44ee2ab2003-05-27 14:28:08 +0000812
813 /* do some range checks */
814 /* This prevents problems with time/date setting after a power loss */
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +0000815 if (!valid_time(&tm))
Markus Braun44ee2ab2003-05-27 14:28:08 +0000816 {
817 /* hour */
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +0000818 tm.tm_hour = 0;
819 tm.tm_min = 0;
820 tm.tm_sec = 0;
821 tm.tm_mday = 1;
822 tm.tm_mon = 0;
823 tm.tm_wday = 1;
824 tm.tm_year = 100;
Markus Braun44ee2ab2003-05-27 14:28:08 +0000825 }
Markus Braun3181f682002-08-09 12:38:45 +0000826
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +0000827 result = set_time_screen(str(LANG_TIME), &tm);
Markus Braun3181f682002-08-09 12:38:45 +0000828
Linus Nielsen Feltzing7ddf0d62004-04-20 10:23:57 +0000829 if(tm.tm_year != -1) {
830 set_time(&tm);
Markus Braun3181f682002-08-09 12:38:45 +0000831 }
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000832 return result;
Markus Braun3181f682002-08-09 12:38:45 +0000833}
Markus Braun22a7a2d2002-10-14 12:50:20 +0000834
835static bool timeformat_set(void)
836{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000837 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000838 { STR(LANG_24_HOUR_CLOCK) },
839 { STR(LANG_12_HOUR_CLOCK) }
840 };
Björn Stenberg26712d52003-06-05 11:11:10 +0000841 return set_option(str(LANG_TIMEFORMAT), &global_settings.timeformat,
842 INT, names, 2, NULL);
Markus Braun22a7a2d2002-10-14 12:50:20 +0000843}
Markus Braun3181f682002-08-09 12:38:45 +0000844#endif
845
Jens Arnolddd937dc2004-10-09 22:04:47 +0000846#ifndef HAVE_MMC
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000847static bool spindown(void)
Björn Stenberg457b8a02002-08-26 13:21:14 +0000848{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000849 return set_int(str(LANG_SPINDOWN), "s", UNIT_SEC,
850 &global_settings.disk_spindown,
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000851 ata_spindown, 1, 3, 254 );
Björn Stenberg05704972002-08-14 19:23:34 +0000852}
853
Daniel Stenberg39c54742002-11-29 07:05:46 +0000854#ifdef HAVE_ATA_POWER_OFF
Björn Stenberg2b77b4f2002-11-28 22:46:19 +0000855static bool poweroff(void)
856{
857 bool rc = set_bool(str(LANG_POWEROFF), &global_settings.disk_poweroff);
858 ata_poweroff(global_settings.disk_poweroff);
859 return rc;
860}
Jens Arnolddd937dc2004-10-09 22:04:47 +0000861#endif /* HAVE_ATA_POWEROFF */
862#endif /* !HAVE_MMC */
863
864#if CONFIG_HWCODEC == MAS3507D
865static bool line_in(void)
866{
867 bool rc = set_bool(str(LANG_LINE_IN), &global_settings.line_in);
868 dac_line_in(global_settings.line_in);
869 return rc;
870}
Daniel Stenberg39c54742002-11-29 07:05:46 +0000871#endif
Björn Stenberg2b77b4f2002-11-28 22:46:19 +0000872
Linus Nielsen Feltzing20d031f2003-05-09 16:01:21 +0000873static bool max_files_in_dir(void)
874{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000875 return set_int(str(LANG_MAX_FILES_IN_DIR), "", UNIT_INT,
Linus Nielsen Feltzing20d031f2003-05-09 16:01:21 +0000876 &global_settings.max_files_in_dir,
877 NULL, 50, 50, 10000 );
878}
879
880static bool max_files_in_playlist(void)
881{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000882 return set_int(str(LANG_MAX_FILES_IN_PLAYLIST), "", UNIT_INT,
Linus Nielsen Feltzing20d031f2003-05-09 16:01:21 +0000883 &global_settings.max_files_in_playlist,
Linus Nielsen Feltzing2ce9ba52003-05-09 21:59:04 +0000884 NULL, 1000, 1000, 20000 );
Linus Nielsen Feltzing20d031f2003-05-09 16:01:21 +0000885}
886
Linus Nielsen Feltzingb8ff5f82002-12-05 13:09:51 +0000887static bool buffer_margin(void)
888{
Jörg Hohensohnbeec2e92004-03-20 16:49:58 +0000889 return set_int(str(LANG_MP3BUFFER_MARGIN), "s", UNIT_SEC,
Linus Nielsen Feltzingb8ff5f82002-12-05 13:09:51 +0000890 &global_settings.buffer_margin,
Linus Nielsen Feltzing8a237a82005-04-04 12:06:29 +0000891 audio_set_buffer_margin, 1, 0, 7 );
Linus Nielsen Feltzingb8ff5f82002-12-05 13:09:51 +0000892}
893
Linus Nielsen Feltzing20d031f2003-05-09 16:01:21 +0000894static bool ff_rewind_min_step(void)
Eric Linenberg7eb27112002-09-04 03:38:37 +0000895{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000896 static const struct opt_items names[] = {
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000897 { "1s", TALK_ID(1, UNIT_SEC) },
898 { "2s", TALK_ID(2, UNIT_SEC) },
899 { "3s", TALK_ID(3, UNIT_SEC) },
900 { "4s", TALK_ID(4, UNIT_SEC) },
901 { "5s", TALK_ID(5, UNIT_SEC) },
902 { "6s", TALK_ID(6, UNIT_SEC) },
903 { "8s", TALK_ID(8, UNIT_SEC) },
904 { "10s", TALK_ID(10, UNIT_SEC) },
905 { "15s", TALK_ID(15, UNIT_SEC) },
906 { "20s", TALK_ID(20, UNIT_SEC) },
907 { "25s", TALK_ID(25, UNIT_SEC) },
908 { "30s", TALK_ID(30, UNIT_SEC) },
909 { "45s", TALK_ID(45, UNIT_SEC) },
910 { "60s", TALK_ID(60, UNIT_SEC) }
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000911 };
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000912 return set_option(str(LANG_FFRW_STEP), &global_settings.ff_rewind_min_step,
Björn Stenberg26712d52003-06-05 11:11:10 +0000913 INT, names, 14, NULL );
Eric Linenberg7eb27112002-09-04 03:38:37 +0000914}
915
Björn Stenberge2628d92003-02-14 15:54:52 +0000916static bool set_fade_on_stop(void)
917{
918 return set_bool( str(LANG_FADE_ON_STOP), &global_settings.fade_on_stop );
919}
920
921
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000922static bool ff_rewind_accel(void)
Justin Heiner8097ee62002-08-29 05:41:35 +0000923{
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +0000924 static const struct opt_items names[] = {
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000925 { STR(LANG_OFF) },
Jörg Hohensohnfa97f162004-03-19 22:15:53 +0000926 { "2x/1s", TALK_ID(1, UNIT_SEC) },
927 { "2x/2s", TALK_ID(2, UNIT_SEC) },
928 { "2x/3s", TALK_ID(3, UNIT_SEC) },
929 { "2x/4s", TALK_ID(4, UNIT_SEC) },
930 { "2x/5s", TALK_ID(5, UNIT_SEC) },
931 { "2x/6s", TALK_ID(6, UNIT_SEC) },
932 { "2x/7s", TALK_ID(7, UNIT_SEC) },
933 { "2x/8s", TALK_ID(8, UNIT_SEC) },
934 { "2x/9s", TALK_ID(9, UNIT_SEC) },
935 { "2x/10s", TALK_ID(10, UNIT_SEC) },
936 { "2x/11s", TALK_ID(11, UNIT_SEC) },
937 { "2x/12s", TALK_ID(12, UNIT_SEC) },
938 { "2x/13s", TALK_ID(13, UNIT_SEC) },
939 { "2x/14s", TALK_ID(14, UNIT_SEC) },
940 { "2x/15s", TALK_ID(15, UNIT_SEC) }
Jörg Hohensohn42ffbf92004-03-15 08:27:51 +0000941 };
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000942 return set_option(str(LANG_FFRW_ACCEL), &global_settings.ff_rewind_accel,
Björn Stenberg26712d52003-06-05 11:11:10 +0000943 INT, names, 16, NULL );
Justin Heiner8097ee62002-08-29 05:41:35 +0000944}
Eric Linenberg65240762002-08-28 19:34:07 +0000945
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000946static bool browse_current(void)
Eric Linenbergecca1232002-09-09 14:25:39 +0000947{
Björn Stenbergb1b8bd42002-09-24 17:22:12 +0000948 return set_bool( str(LANG_FOLLOW), &global_settings.browse_current );
Eric Linenbergecca1232002-09-09 14:25:39 +0000949}
950
Björn Stenbergde5477c2003-09-29 21:26:53 +0000951static bool custom_wps_browse(void)
952{
953 return rockbox_browse(ROCKBOX_DIR, SHOW_WPS);
954}
955
956static bool custom_cfg_browse(void)
957{
958 return rockbox_browse(ROCKBOX_DIR, SHOW_CFG);
959}
960
961static bool language_browse(void)
962{
Jens Arnold3badc7d2005-01-17 23:55:55 +0000963 return rockbox_browse(ROCKBOX_DIR LANG_DIR, SHOW_LNG);
Björn Stenbergde5477c2003-09-29 21:26:53 +0000964}
965
Jörg Hohensohn3aa99e12004-03-27 00:11:01 +0000966static bool voice_menus(void)
967{
968 bool ret;
969 bool temp = global_settings.talk_menu;
970 /* work on a temp variable first, avoid "life" disabling */
971 ret = set_bool( str(LANG_VOICE_MENU), &temp );
972 global_settings.talk_menu = temp;
973 return ret;
974}
975
Jörg Hohensohnd4844202004-10-06 21:37:46 +0000976/* this is used 2 times below, so it saves memory to put it in global scope */
977static const struct opt_items voice_names[] = {
978 { STR(LANG_OFF) },
979 { STR(LANG_VOICE_NUMBER) },
980 { STR(LANG_VOICE_SPELL) },
981 { STR(LANG_VOICE_DIR_HOVER) }
982};
983
Jörg Hohensohn3aa99e12004-03-27 00:11:01 +0000984static bool voice_dirs(void)
985{
Jörg Hohensohn3aa99e12004-03-27 00:11:01 +0000986 return set_option( str(LANG_VOICE_DIR),
Jörg Hohensohnd4844202004-10-06 21:37:46 +0000987 &global_settings.talk_dir, INT, voice_names, 4, NULL);
Jörg Hohensohn3aa99e12004-03-27 00:11:01 +0000988}
989
990static bool voice_files(void)
991{
Jörg Hohensohn40ae63b2004-10-21 18:34:48 +0000992 int oldval = global_settings.talk_file;
993 bool ret;
994 ret = set_option( str(LANG_VOICE_FILE),
Jörg Hohensohnd4844202004-10-06 21:37:46 +0000995 &global_settings.talk_file, INT, voice_names, 4, NULL);
Jörg Hohensohn40ae63b2004-10-21 18:34:48 +0000996 if (oldval != 3 && global_settings.talk_file == 3)
997 { /* force reload if newly talking thumbnails,
998 because the clip presence is cached only if enabled */
999 reload_directory();
1000 }
1001 return ret;
Jörg Hohensohn3aa99e12004-03-27 00:11:01 +00001002}
1003
1004static bool voice_menu(void)
1005{
1006 int m;
1007 bool result;
1008
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001009 static const struct menu_item items[] = {
1010 { ID2P(LANG_VOICE_MENU), voice_menus },
1011 { ID2P(LANG_VOICE_DIR), voice_dirs },
1012 { ID2P(LANG_VOICE_FILE), voice_files }
Jörg Hohensohn3aa99e12004-03-27 00:11:01 +00001013 };
1014
1015 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1016 NULL, NULL, NULL);
1017 result = menu_run(m);
1018 menu_exit(m);
1019 return result;
1020}
1021
Björn Stenbergfe375a02004-01-14 14:42:31 +00001022#ifdef HAVE_LCD_BITMAP
Björn Stenbergde5477c2003-09-29 21:26:53 +00001023static bool font_browse(void)
1024{
Daniel Stenberg0f689582004-01-08 12:40:25 +00001025 return rockbox_browse(ROCKBOX_DIR FONT_DIR, SHOW_FONT);
Björn Stenbergde5477c2003-09-29 21:26:53 +00001026}
Björn Stenbergde5477c2003-09-29 21:26:53 +00001027
Jörg Hohensohn459abc22003-04-21 12:39:36 +00001028static bool scroll_bar(void)
1029{
1030 return set_bool( str(LANG_SCROLL_BAR), &global_settings.scrollbar );
1031}
1032
1033static bool status_bar(void)
1034{
1035 return set_bool( str(LANG_STATUS_BAR), &global_settings.statusbar );
1036}
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001037
Jens Arnold1f0908d2004-10-09 20:54:15 +00001038#if CONFIG_KEYPAD == RECORDER_PAD
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001039static bool button_bar(void)
1040{
1041 return set_bool( str(LANG_BUTTON_BAR), &global_settings.buttonbar );
1042}
Jens Arnold1f0908d2004-10-09 20:54:15 +00001043#endif /* CONFIG_KEYPAD == RECORDER_PAD */
1044#endif /* HAVE_LCD_BITMAP */
Jörg Hohensohn459abc22003-04-21 12:39:36 +00001045
Björn Stenbergfe375a02004-01-14 14:42:31 +00001046static bool ff_rewind_settings_menu(void)
1047{
1048 int m;
1049 bool result;
1050
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001051 static const struct menu_item items[] = {
1052 { ID2P(LANG_FFRW_STEP), ff_rewind_min_step },
1053 { ID2P(LANG_FFRW_ACCEL), ff_rewind_accel },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001054 };
1055
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001056 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1057 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001058 result = menu_run(m);
1059 menu_exit(m);
1060
1061 return result;
1062}
1063
Linus Nielsen Feltzing4cdcbb92004-07-27 19:20:51 +00001064static bool id3_order(void)
1065{
1066 return set_bool_options( str(LANG_ID3_ORDER),
1067 &global_settings.id3_v1_first,
1068 STR(LANG_ID3_V1_FIRST),
1069 STR(LANG_ID3_V2_FIRST),
1070 mpeg_id3_options);
1071}
1072
Linus Nielsen Feltzing6271b2b2005-06-09 09:47:00 +00001073#if CONFIG_HWCODEC == MASNONE
1074static bool crossfade(void)
1075{
1076 bool rc = set_bool( str(LANG_CROSSFADE), &global_settings.crossfade );
1077#ifndef SIMULATOR
1078 pcm_crossfade_enable(global_settings.crossfade);
1079#endif
1080 return rc;
1081}
1082#endif
1083
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001084static bool playback_settings_menu(void)
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001085{
1086 int m;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001087 bool result;
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001088
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001089 static const struct menu_item items[] = {
1090 { ID2P(LANG_SHUFFLE), shuffle },
1091 { ID2P(LANG_REPEAT), repeat_mode },
1092 { ID2P(LANG_PLAY_SELECTED), play_selected },
1093 { ID2P(LANG_RESUME), resume },
1094 { ID2P(LANG_WIND_MENU), ff_rewind_settings_menu },
1095 { ID2P(LANG_MP3BUFFER_MARGIN), buffer_margin },
1096 { ID2P(LANG_FADE_ON_STOP), set_fade_on_stop },
Linus Nielsen Feltzing6271b2b2005-06-09 09:47:00 +00001097#if CONFIG_HWCODEC == MASNONE
1098 { ID2P(LANG_CROSSFADE), crossfade },
1099#endif
Linus Nielsen Feltzing4cdcbb92004-07-27 19:20:51 +00001100 { ID2P(LANG_ID3_ORDER), id3_order },
Robert Hak84a6ba22002-06-24 21:39:48 +00001101 };
Björn Stenberg505eca72002-09-18 14:08:05 +00001102
Daniel Stenberg360ae3e2002-08-02 13:20:03 +00001103 bool old_shuffle = global_settings.playlist_shuffle;
Björn Stenbergfe375a02004-01-14 14:42:31 +00001104
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001105 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1106 NULL, NULL, NULL);
Daniel Stenbergb2850762002-08-23 12:32:52 +00001107 result = menu_run(m);
Robert Hak84a6ba22002-06-24 21:39:48 +00001108 menu_exit(m);
Daniel Stenberg360ae3e2002-08-02 13:20:03 +00001109
Jens Arnoldd6587f92005-05-01 19:13:47 +00001110 if ((old_shuffle != global_settings.playlist_shuffle)
1111 && (audio_status() & AUDIO_STATUS_PLAY))
Daniel Stenberg360ae3e2002-08-02 13:20:03 +00001112 {
1113 if (global_settings.playlist_shuffle)
1114 {
Hardeep Sidhu107ebc52004-01-26 17:05:21 +00001115 playlist_randomise(NULL, current_tick, true);
Daniel Stenberg360ae3e2002-08-02 13:20:03 +00001116 }
1117 else
1118 {
Hardeep Sidhu107ebc52004-01-26 17:05:21 +00001119 playlist_sort(NULL, true);
Daniel Stenberg360ae3e2002-08-02 13:20:03 +00001120 }
1121 }
Daniel Stenbergb2850762002-08-23 12:32:52 +00001122 return result;
Robert Hak84a6ba22002-06-24 21:39:48 +00001123}
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001124
Björn Stenberga108ec22004-01-14 00:13:04 +00001125static bool bookmark_settings_menu(void)
1126{
1127 int m;
1128 bool result;
1129
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001130 static const struct menu_item items[] = {
1131 { ID2P(LANG_BOOKMARK_SETTINGS_AUTOCREATE), autocreatebookmark},
1132 { ID2P(LANG_BOOKMARK_SETTINGS_AUTOLOAD), autoloadbookmark},
1133 { ID2P(LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS), useMRB},
Björn Stenberga108ec22004-01-14 00:13:04 +00001134 };
1135
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001136 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1137 NULL, NULL, NULL);
Björn Stenberga108ec22004-01-14 00:13:04 +00001138 result = menu_run(m);
1139 menu_exit(m);
1140
1141 return result;
1142}
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001143static bool reset_settings(void)
Justin Heiner2f9b54b2002-09-06 07:00:20 +00001144{
Robert Hakea8a4cf2002-10-14 09:12:52 +00001145 bool done=false;
1146 int line;
Linus Nielsen Feltzingade5d7b2004-07-26 16:06:59 +00001147 int button;
Robert Hakea8a4cf2002-10-14 09:12:52 +00001148
1149 lcd_clear_display();
1150
1151#ifdef HAVE_LCD_CHARCELLS
1152 line = 0;
1153#else
1154 line = 1;
1155 lcd_puts(0,0,str(LANG_RESET_ASK_RECORDER));
1156#endif
1157 lcd_puts(0,line,str(LANG_RESET_CONFIRM));
1158 lcd_puts(0,line+1,str(LANG_RESET_CANCEL));
1159
1160 lcd_update();
Robert Hakea8a4cf2002-10-14 09:12:52 +00001161
1162 while(!done) {
Linus Nielsen Feltzingade5d7b2004-07-26 16:06:59 +00001163 button = button_get(true);
1164 switch(button) {
Björn Stenberg6c33c512004-09-19 21:58:37 +00001165 case SETTINGS_OK:
1166 settings_reset();
1167 settings_apply();
1168 lcd_clear_display();
1169 lcd_puts(0,1,str(LANG_RESET_DONE_CLEAR));
1170 done = true;
1171 break;
Robert Hakea8a4cf2002-10-14 09:12:52 +00001172
Björn Stenberg6c33c512004-09-19 21:58:37 +00001173 case SETTINGS_CANCEL:
1174 lcd_clear_display();
1175 lcd_puts(0,1,str(LANG_RESET_DONE_CANCEL));
1176 done = true;
1177 break;
Robert Hakea8a4cf2002-10-14 09:12:52 +00001178
Björn Stenberg6c33c512004-09-19 21:58:37 +00001179 default:
1180 if(default_event_handler(button) == SYS_USB_CONNECTED)
1181 return true;
Robert Hakea8a4cf2002-10-14 09:12:52 +00001182 }
Justin Heiner2f9b54b2002-09-06 07:00:20 +00001183 }
Robert Hakea8a4cf2002-10-14 09:12:52 +00001184
1185 lcd_puts(0,0,str(LANG_RESET_DONE_SETTING));
1186 lcd_update();
1187 sleep(HZ);
1188 return false;
Justin Heiner2f9b54b2002-09-06 07:00:20 +00001189}
1190
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001191static bool fileview_settings_menu(void)
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001192{
1193 int m;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001194 bool result;
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001195
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001196 static const struct menu_item items[] = {
1197 { ID2P(LANG_SORT_CASE), sort_case },
1198 { ID2P(LANG_SORT_DIR), sort_dir },
1199 { ID2P(LANG_SORT_FILE), sort_file },
1200 { ID2P(LANG_FILTER), dir_filter },
1201 { ID2P(LANG_FOLLOW), browse_current },
1202 { ID2P(LANG_SHOW_ICONS), show_icons },
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001203 };
1204
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001205 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1206 NULL, NULL, NULL);
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001207 result = menu_run(m);
1208 menu_exit(m);
1209 return result;
1210}
1211
Robert Hak65002e82002-12-12 16:56:19 +00001212
1213static bool scroll_settings_menu(void)
1214{
1215 int m;
1216 bool result;
1217
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001218 static const struct menu_item items[] = {
1219 { ID2P(LANG_SCROLL_SPEED), scroll_speed },
1220 { ID2P(LANG_SCROLL_DELAY), scroll_delay },
Robert Hak65002e82002-12-12 16:56:19 +00001221#ifdef HAVE_LCD_BITMAP
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001222 { ID2P(LANG_SCROLL_STEP), scroll_step },
Robert Hak65002e82002-12-12 16:56:19 +00001223#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001224 { ID2P(LANG_BIDIR_SCROLL), bidir_limit },
Kjell Ericson53f156a2003-05-22 06:42:14 +00001225#ifdef HAVE_LCD_CHARCELLS
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001226 { ID2P(LANG_JUMP_SCROLL), jump_scroll },
1227 { ID2P(LANG_JUMP_SCROLL_DELAY), jump_scroll_delay },
Kjell Ericson53f156a2003-05-22 06:42:14 +00001228#endif
Robert Hak65002e82002-12-12 16:56:19 +00001229 };
1230
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001231 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1232 NULL, NULL, NULL);
Robert Hak65002e82002-12-12 16:56:19 +00001233 result = menu_run(m);
1234 menu_exit(m);
1235 return result;
1236}
1237
Björn Stenbergfe375a02004-01-14 14:42:31 +00001238static bool lcd_settings_menu(void)
1239{
1240 int m;
1241 bool result;
1242
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001243 static const struct menu_item items[] = {
Jörg Hohensohnfee86172004-12-18 10:29:47 +00001244#ifdef CONFIG_BACKLIGHT
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001245 { ID2P(LANG_BACKLIGHT), backlight_timer },
Jörg Hohensohnfee86172004-12-18 10:29:47 +00001246#ifdef HAVE_CHARGING
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001247 { ID2P(LANG_BACKLIGHT_ON_WHEN_CHARGING), backlight_on_when_charging },
Jens Arnolda1a08d02004-10-09 19:56:27 +00001248#endif
Jörg Hohensohnfee86172004-12-18 10:29:47 +00001249 { ID2P(LANG_CAPTION_BACKLIGHT), caption_backlight },
1250#endif /* CONFIG_BACKLIGHT */
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001251 { ID2P(LANG_CONTRAST), contrast },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001252#ifdef HAVE_LCD_BITMAP
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001253 { ID2P(LANG_INVERT), invert },
1254 { ID2P(LANG_FLIP_DISPLAY), flip_display },
1255 { ID2P(LANG_INVERT_CURSOR), invert_cursor },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001256#endif
1257 };
1258
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001259 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1260 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001261 result = menu_run(m);
1262 menu_exit(m);
1263 return result;
1264}
1265
Christian Gmeiner7c1879b2005-04-15 12:08:49 +00001266#ifdef HAVE_REMOTE_LCD
1267static bool lcd_remote_settings_menu(void)
1268{
1269 int m;
1270 bool result;
1271
1272 static const struct menu_item items[] = {
Christian Gmeiner7477c092005-05-30 00:00:22 +00001273 { ID2P(LANG_BACKLIGHT), remote_backlight_timer },
Christian Gmeiner7c1879b2005-04-15 12:08:49 +00001274 { ID2P(LANG_CONTRAST), remote_contrast },
1275 { ID2P(LANG_INVERT), remote_invert },
Jens Arnoldbd1bb5f2005-06-17 21:43:00 +00001276 { ID2P(LANG_FLIP_DISPLAY), remote_flip_display },
1277/* { ID2P(LANG_INVERT_CURSOR), invert_cursor },*/
Christian Gmeiner7c1879b2005-04-15 12:08:49 +00001278 };
1279
1280 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1281 NULL, NULL, NULL);
1282 result = menu_run(m);
1283 menu_exit(m);
1284 return result;
1285}
1286#endif
1287
Björn Stenbergfe375a02004-01-14 14:42:31 +00001288#ifdef HAVE_LCD_BITMAP
1289static bool bars_settings_menu(void)
1290{
1291 int m;
1292 bool result;
1293
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001294 static const struct menu_item items[] = {
1295 { ID2P(LANG_SCROLL_BAR), scroll_bar },
1296 { ID2P(LANG_STATUS_BAR), status_bar },
Jens Arnold1f0908d2004-10-09 20:54:15 +00001297#if CONFIG_KEYPAD == RECORDER_PAD
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001298 { ID2P(LANG_BUTTON_BAR), button_bar },
Jens Arnold1f0908d2004-10-09 20:54:15 +00001299#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001300 { ID2P(LANG_VOLUME_DISPLAY), volume_type },
Jens Arnold9d42e2b2005-01-30 13:48:44 +00001301 { ID2P(LANG_BATTERY_DISPLAY), battery_display },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001302 };
1303
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001304 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1305 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001306 result = menu_run(m);
1307 menu_exit(m);
1308 return result;
1309}
1310#endif
Robert Hak65002e82002-12-12 16:56:19 +00001311
1312
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001313static bool display_settings_menu(void)
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001314{
1315 int m;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001316 bool result;
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001317
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001318 static const struct menu_item items[] = {
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +00001319#ifdef HAVE_LCD_BITMAP
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001320 { ID2P(LANG_CUSTOM_FONT), font_browse },
Linus Nielsen Feltzingbb572c42002-09-27 09:31:31 +00001321#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001322 { ID2P(LANG_WHILE_PLAYING), custom_wps_browse },
1323 { ID2P(LANG_LCD_MENU), lcd_settings_menu },
Christian Gmeiner7c1879b2005-04-15 12:08:49 +00001324#ifdef HAVE_REMOTE_LCD
1325 { ID2P(LANG_LCD_REMOTE_MENU), lcd_remote_settings_menu },
1326#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001327 { ID2P(LANG_SCROLL_MENU), scroll_settings_menu },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001328#ifdef HAVE_LCD_BITMAP
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001329 { ID2P(LANG_BARS_MENU), bars_settings_menu },
1330 { ID2P(LANG_PM_MENU), peak_meter_menu },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001331#endif
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001332 };
Björn Stenbergfe375a02004-01-14 14:42:31 +00001333
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001334 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1335 NULL, NULL, NULL);
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001336 result = menu_run(m);
1337 menu_exit(m);
1338 return result;
1339}
1340
Björn Stenbergfe375a02004-01-14 14:42:31 +00001341
1342static bool firmware_browse(void)
1343{
1344 return rockbox_browse(ROCKBOX_DIR, SHOW_MOD);
1345}
1346
1347static bool battery_settings_menu(void)
1348{
1349 int m;
1350 bool result;
1351
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001352 static const struct menu_item items[] = {
Björn Stenbergfe375a02004-01-14 14:42:31 +00001353#ifndef SIMULATOR
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001354 { ID2P(LANG_BATTERY_CAPACITY), battery_capacity },
Jens Arnold91846a12005-01-30 16:25:46 +00001355#if BATTERY_TYPES_COUNT > 1
1356 { ID2P(LANG_BATTERY_TYPE), battery_type },
1357#endif
Jörg Hohensohn00898c62004-06-14 07:23:48 +00001358#else
1359#ifndef HAVE_CHARGE_CTRL
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001360 { "Dummy", NULL }, /* to have an entry at all, in the simulator */
Jörg Hohensohn00898c62004-06-14 07:23:48 +00001361#endif
Björn Stenbergfe375a02004-01-14 14:42:31 +00001362#endif
1363 };
1364
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001365 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1366 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001367 result = menu_run(m);
1368 menu_exit(m);
1369 return result;
1370}
1371
Jens Arnolddd937dc2004-10-09 22:04:47 +00001372#ifndef HAVE_MMC
Björn Stenbergfe375a02004-01-14 14:42:31 +00001373static bool disk_settings_menu(void)
1374{
1375 int m;
1376 bool result;
1377
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001378 static const struct menu_item items[] = {
1379 { ID2P(LANG_SPINDOWN), spindown },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001380#ifdef HAVE_ATA_POWER_OFF
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001381 { ID2P(LANG_POWEROFF), poweroff },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001382#endif
1383 };
1384
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001385 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1386 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001387 result = menu_run(m);
1388 menu_exit(m);
1389 return result;
1390}
Jens Arnolddd937dc2004-10-09 22:04:47 +00001391#endif /* !HAVE_MMC */
Björn Stenbergfe375a02004-01-14 14:42:31 +00001392
Jörg Hohensohn24c7c042004-09-10 10:51:54 +00001393#ifdef HAVE_RTC
Björn Stenbergfe375a02004-01-14 14:42:31 +00001394static bool time_settings_menu(void)
1395{
1396 int m;
1397 bool result;
1398
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001399 static const struct menu_item items[] = {
1400 { ID2P(LANG_TIME), timedate_set },
1401 { ID2P(LANG_TIMEFORMAT), timeformat_set },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001402 };
1403
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001404 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1405 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001406 result = menu_run(m);
1407 menu_exit(m);
1408 return result;
1409}
1410#endif
1411
1412static bool manage_settings_menu(void)
1413{
1414 int m;
1415 bool result;
1416
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001417 static const struct menu_item items[] = {
1418 { ID2P(LANG_CUSTOM_CFG), custom_cfg_browse },
1419 { ID2P(LANG_FIRMWARE), firmware_browse },
1420 { ID2P(LANG_RESET), reset_settings },
1421 { ID2P(LANG_SAVE_SETTINGS), settings_save_config },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001422 };
1423
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001424 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1425 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001426 result = menu_run(m);
1427 menu_exit(m);
1428 return result;
1429}
1430
1431static bool limits_settings_menu(void)
1432{
1433 int m;
1434 bool result;
1435
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001436 static const struct menu_item items[] = {
1437 { ID2P(LANG_MAX_FILES_IN_DIR), max_files_in_dir },
1438 { ID2P(LANG_MAX_FILES_IN_PLAYLIST), max_files_in_playlist },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001439 };
1440
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001441 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1442 NULL, NULL, NULL);
Björn Stenbergfe375a02004-01-14 14:42:31 +00001443 result = menu_run(m);
1444 menu_exit(m);
1445 return result;
1446}
1447
1448
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001449static bool system_settings_menu(void)
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001450{
1451 int m;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001452 bool result;
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001453
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001454 static const struct menu_item items[] = {
1455 { ID2P(LANG_BATTERY_MENU), battery_settings_menu },
Jens Arnolddd937dc2004-10-09 22:04:47 +00001456#ifndef HAVE_MMC
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001457 { ID2P(LANG_DISK_MENU), disk_settings_menu },
Jens Arnolddd937dc2004-10-09 22:04:47 +00001458#endif
Björn Stenbergfe375a02004-01-14 14:42:31 +00001459#ifdef HAVE_RTC
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001460 { ID2P(LANG_TIME_MENU), time_settings_menu },
Björn Stenbergfe375a02004-01-14 14:42:31 +00001461#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001462 { ID2P(LANG_POWEROFF_IDLE), poweroff_idle_timer },
1463 { ID2P(LANG_SLEEP_TIMER), sleeptimer_screen },
Björn Stenberga73cc6a2004-01-15 08:25:42 +00001464#ifdef HAVE_ALARM_MOD
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001465 { ID2P(LANG_ALARM_MOD_ALARM_MENU), alarm_screen },
Björn Stenberga73cc6a2004-01-15 08:25:42 +00001466#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001467 { ID2P(LANG_LIMITS_MENU), limits_settings_menu },
Jörg Hohensohn593cc002004-09-28 22:13:26 +00001468#if CONFIG_HWCODEC == MAS3507D
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001469 { ID2P(LANG_LINE_IN), line_in },
Linus Nielsen Feltzingc22b4112003-11-03 23:36:36 +00001470#endif
Jens Arnoldccfa4cd2004-10-10 01:25:32 +00001471#ifdef HAVE_CHARGING
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001472 { ID2P(LANG_CAR_ADAPTER_MODE), car_adapter_mode },
Jens Arnoldccfa4cd2004-10-10 01:25:32 +00001473#endif
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001474 { ID2P(LANG_MANAGE_MENU), manage_settings_menu },
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001475 };
Björn Stenbergfe375a02004-01-14 14:42:31 +00001476
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001477 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1478 NULL, NULL, NULL);
Eric Linenbergc5b645b2002-09-05 04:42:12 +00001479 result = menu_run(m);
1480 menu_exit(m);
1481 return result;
1482}
Björn Stenberg94afb542002-09-07 12:28:46 +00001483
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001484bool settings_menu(void)
Björn Stenberg94afb542002-09-07 12:28:46 +00001485{
1486 int m;
Björn Stenbergb1b8bd42002-09-24 17:22:12 +00001487 bool result;
Björn Stenberg94afb542002-09-07 12:28:46 +00001488
Jörg Hohensohnb1403ee2004-07-23 23:01:20 +00001489 static const struct menu_item items[] = {
1490 { ID2P(LANG_PLAYBACK), playback_settings_menu },
1491 { ID2P(LANG_FILE), fileview_settings_menu },
1492 { ID2P(LANG_DISPLAY), display_settings_menu },
1493 { ID2P(LANG_SYSTEM), system_settings_menu },
1494 { ID2P(LANG_BOOKMARK_SETTINGS),bookmark_settings_menu },
1495 { ID2P(LANG_LANGUAGE), language_browse },
1496 { ID2P(LANG_VOICE), voice_menu },
Björn Stenberg94afb542002-09-07 12:28:46 +00001497 };
1498
Linus Nielsen Feltzing77936e62004-03-16 13:44:56 +00001499 m=menu_init( items, sizeof(items) / sizeof(*items), NULL,
1500 NULL, NULL, NULL);
Björn Stenberg94afb542002-09-07 12:28:46 +00001501 result = menu_run(m);
1502 menu_exit(m);
1503 return result;
1504}