source: branches/reyalp-flt/core/gui.c @ 1474

Revision 1474, 120.8 KB checked in by reyalp, 18 months ago (diff)

update from tsv 6

  • Property svn:eol-style set to native
Line 
1#include "stdlib.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "conf.h"
6#include "camera.h"
7#include "font.h"
8#include "lang.h"
9#include "gui.h"
10#include "gui_lang.h"
11#include "gui_draw.h"
12#include "gui_menu.h"
13#include "gui_palette.h"
14#include "gui_mbox.h"
15#include "gui_mpopup.h"
16#ifdef OPT_GAME_REVERSI
17#include "gui_reversi.h"
18#endif
19#ifdef OPT_GAME_SOKOBAN
20#include "gui_sokoban.h"
21#endif
22#ifdef OPT_GAME_CONNECT4
23#include "gui_4wins.h"
24#endif
25#ifdef OPT_GAME_MASTERMIND
26#include "gui_mastermind.h"
27#endif
28#include "console.h"
29#ifdef OPT_DEBUGGING
30#include "gui_debug.h"
31#include "gui_bench.h"
32#endif
33#include "gui_fselect.h"
34#include "gui_batt.h"
35#include "gui_usb.h"
36#include "gui_space.h"
37#include "gui_osd.h"
38#ifdef OPT_TEXTREADER
39        #include "gui_read.h"
40#endif
41#ifdef OPT_CALENDAR
42        #include "gui_calendar.h"
43#endif
44#include "gui_grid.h"
45#include "histogram.h"
46#include "motion_detector.h"
47#include "raw.h"
48#ifdef OPT_CURVES
49        #include "curves.h"
50#endif
51#ifdef OPT_EDGEOVERLAY
52        #include "modules.h"
53#endif
54#ifdef OPT_SCRIPTING
55    #include "script.h"
56    int script_params_has_changed=0;
57#endif
58#include "module_load.h"
59
60//-------------------------------------------------------------------
61
62#define OPTIONS_AUTOSAVE
63#define SPLASH_TIME               20
64
65//shortcuts
66//------------------------------------------------------------------
67// #define KEY_NONE (KEY_DUMMY+1)
68
69#if defined(CAMERA_a580) // Cam has not erase button AND Half press shoot button + Left sets AFL, + Up sets AEL!
70    //Alt mode
71    #define SHORTCUT_TOGGLE_RAW          KEY_DISPLAY
72    #define SHORTCUT_MF_TOGGLE           KEY_UP
73    //Half press shoot button
74    #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
75    #define SHORTCUT_TOGGLE_ZEBRA        KEY_MENU
76    #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
77    #define SHORTCUT_DISABLE_OVERRIDES   KEY_DISPLAY
78    //Alt mode & Manual mode   
79    #define SHORTCUT_SET_INFINITY        KEY_DISPLAY
80    #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
81    // For models without ZOOM_LEVER  (#if !CAM_HAS_ZOOM_LEVER)
82    // SHORTCUT_SET_INFINITY is not used
83    // KEY_DISPLAY is used for gui_subj_dist_override_koef_enum;
84    // KEY_LEFT/KEY_RIGHT is used for gui_subj_dist_override_value_enum (because of no separate ZOOM_IN/OUT)
85
86#elif !CAM_HAS_ERASE_BUTTON
87//Alt mode
88 #define SHORTCUT_TOGGLE_RAW          KEY_DISPLAY
89 #define SHORTCUT_MF_TOGGLE           KEY_UP
90//Half press shoot button
91 #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
92 #define SHORTCUT_TOGGLE_ZEBRA        KEY_MENU
93 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
94 #define SHORTCUT_DISABLE_OVERRIDES   KEY_LEFT
95//Alt mode & Manual mode
96 #define SHORTCUT_SET_INFINITY        KEY_DISPLAY
97 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
98 // For models without ZOOM_LEVER  (#if !CAM_HAS_ZOOM_LEVER)
99 // SHORTCUT_SET_INFINITY is not used
100 // KEY_DISPLAY is used for gui_subj_dist_override_koef_enum;
101 // KEY_LEFT/KEY_RIGHT is used for gui_subj_dist_override_value_enum (because of no separate ZOOM_IN/OUT)
102
103#elif defined(CAMERA_g7) || defined(CAMERA_sx10) || defined(CAMERA_sx1) || defined(CAMERA_sx120is) || defined(CAMERA_sx20) || defined(CAMERA_sx30) || defined(CAMERA_sx40hs)
104//Alt mode
105 #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
106//Half press shoot button
107 #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
108 #define SHORTCUT_TOGGLE_ZEBRA        KEY_LEFT
109 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
110 #define SHORTCUT_DISABLE_OVERRIDES   KEY_UP
111//Alt mode & Manual mode
112 #define SHORTCUT_SET_INFINITY        KEY_UP
113 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
114
115#elif defined(CAMERA_sx100is) ||defined(CAMERA_sx110is)
116//Alt mode
117 #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
118//Half press shoot button
119 #define SHORTCUT_TOGGLE_HISTO        KEY_UP
120 #define SHORTCUT_TOGGLE_ZEBRA        KEY_DOWN
121 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
122 #define SHORTCUT_DISABLE_OVERRIDES   KEY_LEFT
123//Alt mode & Manual mode
124 #define SHORTCUT_SET_INFINITY        KEY_UP
125 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
126
127 #else
128
129//Alt mode
130 #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
131//Half press shoot button
132 #define SHORTCUT_TOGGLE_HISTO        KEY_UP
133 #define SHORTCUT_TOGGLE_ZEBRA        KEY_LEFT
134 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
135 #define SHORTCUT_DISABLE_OVERRIDES   KEY_DOWN
136//Alt mode & Manual mode
137 #define SHORTCUT_SET_INFINITY        KEY_UP
138 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
139 #ifndef CAM_HAS_MANUAL_FOCUS
140 #define SHORTCUT_MF_TOGGLE           KEY_DISPLAY
141 #endif
142#endif
143
144
145// forward declarations
146//-------------------------------------------------------------------
147extern void dump_memory();
148// both from platform/generic/shooting.c
149extern const char* tv_override[];
150extern const int tv_override_amount;
151extern const int tv_override_zero_shift;
152
153static void gui_draw_osd();
154
155static void gui_draw_splash(char* logo, int logo_size);
156
157void user_menu_save();
158void user_menu_restore();
159// Menu procs
160//-------------------------------------------------------------------
161static void gui_show_build_info(int arg);
162static void gui_show_memory_info(int arg);
163static void gui_draw_palette(int arg);
164static void gui_draw_reversi(int arg);
165static void gui_draw_sokoban(int arg);
166static void gui_draw_4wins(int arg);
167static void gui_draw_mastermind(int arg);
168#ifdef OPT_DEBUGGING
169        static void gui_draw_debug(int arg);
170        static void gui_draw_bench(int arg);
171    void gui_compare_props(int arg);
172    static void gui_menuproc_break_card(int arg);
173        static void gui_debug_shortcut(void);
174        static void save_romlog(int arg);
175        static void gui_draw_modinspector(int arg);
176#endif
177static void gui_draw_fselect(int arg);
178static void gui_draw_osd_le(int arg);
179#ifdef OPT_TEXTREADER
180static void gui_draw_read(int arg);
181static void gui_draw_read_last(int arg);
182#endif
183static void gui_draw_load_menu_rbf(int arg);
184static void gui_draw_load_symbol_rbf(int arg);          //AKA
185#ifdef OPT_TEXTREADER
186        static void gui_draw_load_rbf(int arg);
187#endif
188#ifdef OPT_CALENDAR
189static void gui_draw_calendar(int arg);
190#endif
191static void gui_draw_load_lang(int arg);
192static void gui_menuproc_mkbootdisk(int arg);
193#ifndef OPTIONS_AUTOSAVE
194static void gui_menuproc_save(int arg);
195#endif
196static void gui_menuproc_reset(int arg);
197static void gui_grid_lines_load(int arg);
198static void gui_raw_develop(int arg);
199static void gui_menuproc_swap_partitions(int arg);
200static void gui_menuproc_reset_files(int arg);
201#ifdef OPT_CURVES
202        static void gui_load_curve_selected(const char *fn);
203        static void gui_load_curve(int arg);
204#endif
205static const char* gui_histo_mode_enum(int change, int arg);
206static const char* gui_histo_layout_enum(int change, int arg);
207static const char* gui_font_enum(int change, int arg);
208
209#if CAM_ADJUSTABLE_ALT_BUTTON
210static const char* gui_alt_mode_button_enum(int change, int arg);
211#endif
212static const char* gui_alt_power_enum(int change, int arg);
213static const char* gui_video_bitrate_enum(int change, int arg);
214static const char* gui_av_override_enum(int change, int arg);
215#if ZOOM_OVERRIDE
216static const char* gui_zoom_override_enum(int change, int arg);
217#endif
218static const char* gui_tv_override_koef_enum(int change, int arg);
219static const char* gui_tv_override_value_enum(int change, int arg);
220static const char* gui_tv_enum_type_enum(int change, int arg);
221static const char* gui_subj_dist_override_value_enum(int change, int arg);
222static const char* gui_subj_dist_override_koef_enum(int change, int arg);
223/*
224static const char* gui_tv_exposure_order_enum(int change, int arg);
225static const char* gui_av_exposure_order_enum(int change, int arg);
226static const char* gui_iso_exposure_order_enum(int change, int arg);
227*/
228const char* gui_user_menu_show_enum(int change, int arg);
229static const char* gui_bad_pixel_enum(int change, int arg);
230static const char* gui_video_af_key_enum(int change, int arg);
231#ifdef OPT_CURVES
232        static const char* gui_conf_curve_enum(int change, int arg);
233#endif
234
235#ifdef OPT_EDGEOVERLAY
236static void gui_menuproc_edge_save(int arg);
237static void gui_menuproc_edge_load(int arg);
238#endif
239
240#ifdef OPT_SCRIPTING
241static void gui_load_script(int arg);
242static void gui_load_script_default(int arg);
243static const char* gui_script_param_set_enum(int change, int arg);
244#endif
245
246void rinit();
247
248// Menu callbacks
249//-------------------------------------------------------------------
250static void cb_step_25();
251static void cb_perc();
252static void cb_volts();
253static void cb_space_perc();
254static void cb_space_mb();
255static void cb_battery_menu_change(unsigned int item);
256static void cb_zebra_restore_screen();
257static void cb_zebra_restore_osd();
258#if DNG_SUPPORT
259static void cb_change_dng();
260void gui_menuproc_badpixel_create(int arg);
261#endif
262#if defined (DNG_EXT_FROM)
263static void cb_change_dng_usb_ext();
264#endif
265
266// for memory info, duplicated from lowlevel
267extern const char _start,_end;
268
269#ifdef OPT_DEBUGGING
270static int debug_tasklist_start;
271static int debug_display_direction=1;
272#endif
273// Menu definition
274//-------------------------------------------------------------------
275static CMenuItem remote_submenu_items[] = {
276    MENU_ITEM(0x71,LANG_MENU_REMOTE_ENABLE,            MENUITEM_BOOL,                    &conf.remote_enable, 0),
277    MENU_ITEM(0x0,LANG_MENU_SYNCHABLE_REMOTE,          MENUITEM_SEPARATOR, 0, 0 ),
278    MENU_ITEM(0x71,LANG_MENU_SYNCHABLE_REMOTE_ENABLE,  MENUITEM_BOOL,                    &conf.ricoh_ca1_mode, 0),
279    MENU_ITEM(0x5c,LANG_MENU_SYNCH_ENABLE,             MENUITEM_BOOL,                    &conf.synch_enable, 0),
280    MENU_ITEM(0x5c,LANG_MENU_SYNCH_DELAY_ENABLE,       MENUITEM_BOOL,                    &conf.synch_delay_enable, 0),
281    MENU_ITEM(0x5c,LANG_MENU_SYNCH_DELAY_VALUE,        MENUITEM_INT|MENUITEM_F_UNSIGNED, &conf.synch_delay_value, 0),
282    MENU_ITEM(0x5c,LANG_MENU_SYNCH_DELAY_COARSE_VALUE, MENUITEM_INT|MENUITEM_F_UNSIGNED, &conf.synch_delay_coarse_value, 0),
283    MENU_ITEM(0x5c,LANG_MENU_REMOTE_ZOOM_ENABLE,       MENUITEM_BOOL,                    &conf.remote_zoom_enable, 0),
284    MENU_ITEM(0x5f,LANG_MENU_REMOTE_ZOOM_TIMEOUT,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.zoom_timeout, MENU_MINMAX(2,10)),
285    MENU_ITEM(0x51,LANG_MENU_BACK,                     MENUITEM_UP, 0, 0),
286    {0}
287};
288static CMenu remote_submenu = {0x86,LANG_MENU_REMOTE_PARAM_TITLE, NULL, remote_submenu_items };
289
290
291#ifdef OPT_SCRIPTING
292static const char* gui_script_autostart_modes[]={ "Off", "On", "Once"};
293static CMenuItem script_submenu_items_top[] = {
294    MENU_ITEM(0x35,LANG_MENU_SCRIPT_LOAD,             MENUITEM_PROC,                      gui_load_script, 0 ),
295    MENU_ITEM(0x5f,LANG_MENU_SCRIPT_DELAY,            MENUITEM_INT|MENUITEM_F_UNSIGNED,   &conf.script_shoot_delay, 0 ),
296        // remote autostart
297        MENU_ENUM2(0x5f,LANG_MENU_SCRIPT_AUTOSTART,               &conf.script_startup, gui_script_autostart_modes ),
298
299#if CAM_REMOTE
300    MENU_ITEM(0x86,LANG_MENU_REMOTE_PARAM,            MENUITEM_SUBMENU,   &remote_submenu, 0 ),
301        //MENU_ITEM(0x71,LANG_MENU_SCRIPT_REMOTE_ENABLE,        MENUITEM_BOOL,                                          &conf.remote_enable, 0),
302#endif
303    MENU_ITEM(0x5d,LANG_MENU_SCRIPT_DEFAULT_VAL,     MENUITEM_PROC,                      gui_load_script_default, 0 ),
304    MENU_ITEM(0x5e,LANG_MENU_SCRIPT_PARAM_SET,     MENUITEM_ENUM,                         gui_script_param_set_enum, 0 ),
305    MENU_ITEM(0x5c,LANG_MENU_SCRIPT_PARAM_SAVE,             MENUITEM_BOOL,                    &conf.script_param_save, 0 ),
306    MENU_ITEM(0x0,(int)script_title,                 MENUITEM_SEPARATOR, 0, 0 ),
307//    MENU_ITEM(0x0,LANG_MENU_SCRIPT_CURRENT,          MENUITEM_SEPARATOR, 0, 0 ),
308//    MENU_ITEM(0x0,(int)script_title,                 MENUITEM_TEXT, 0, 0 ),
309//    MENU_ITEM(0x0,LANG_MENU_SCRIPT_PARAMS,           MENUITEM_SEPARATOR, 0, 0)
310};
311
312static CMenuItem script_submenu_items_bottom[] = {
313    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
314    {0}
315};
316
317static CMenuItem script_submenu_items[sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0])+SCRIPT_NUM_PARAMS+
318                               sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0])];
319static CMenu script_submenu = {0x27,LANG_MENU_SCRIPT_TITLE, NULL, script_submenu_items };
320#endif
321
322static CMenuItem games_submenu_items[] = {
323#ifdef OPT_GAME_REVERSI
324    MENU_ITEM(0x38,LANG_MENU_GAMES_REVERSI,           MENUITEM_PROC,  gui_draw_reversi, 0 ),
325#endif
326#ifdef OPT_GAME_SOKOBAN
327    MENU_ITEM(0x38,LANG_MENU_GAMES_SOKOBAN,           MENUITEM_PROC,  gui_draw_sokoban, 0 ),
328#endif
329#ifdef OPT_GAME_CONNECT4
330    MENU_ITEM(0x38,LANG_MENU_GAMES_CONNECT4,             MENUITEM_PROC,  gui_draw_4wins, 0 ),
331#endif
332#ifdef OPT_GAME_MASTERMIND
333    MENU_ITEM(0x38,LANG_MENU_GAMES_MASTERMIND,           MENUITEM_PROC,  gui_draw_mastermind, 0 ),
334#endif
335    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
336    {0}
337};
338static CMenu games_submenu = {0x38,LANG_MENU_GAMES_TITLE, NULL, games_submenu_items };
339
340static const char* gui_autoiso_shutter_modes[] = { "Auto", "1/8s", "1/15s", "1/30s", "1/60s", "1/125s", "1/250s", "1/500s", "1/1000s"};
341static CMenuItem autoiso_submenu_items[] = {
342    MENU_ITEM(0x5c,LANG_MENU_AUTOISO_ENABLED,          MENUITEM_BOOL,   &conf.autoiso_enable, 0),
343    MENU_ENUM2(0x5f,LANG_MENU_AUTOISO_MIN_SHUTTER,  &conf.autoiso_shutter, gui_autoiso_shutter_modes ),
344    MENU_ITEM(0x5f,LANG_MENU_AUTOISO_USER_FACTOR,   MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_user_factor, MENU_MINMAX(1, 8) ),
345#if CAM_HAS_IS
346    MENU_ITEM(0x5f,LANG_MENU_AUTOISO_IS_FACTOR,       MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_is_factor, MENU_MINMAX(1, 8) ),
347#endif
348    MENU_ITEM(0x5f,LANG_MENU_AUTOISO_MAX_ISO_HI,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_max_iso_hi, MENU_MINMAX(20, 160) ),
349    MENU_ITEM(0x5f,LANG_MENU_AUTOISO_MAX_ISO_AUTO, MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_max_iso_auto, MENU_MINMAX(10, 80) ),
350    MENU_ITEM(0x5f,LANG_MENU_AUTOISO_MIN_ISO,           MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_min_iso, MENU_MINMAX(1, 20) ),
351    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
352    {0}
353};
354static CMenu autoiso_submenu = {0x2d,LANG_MENU_AUTOISO_TITLE, NULL, autoiso_submenu_items };
355
356
357#ifdef OPT_TEXTREADER
358static const char* gui_reader_codepage_cps[] = { "Win1251", "DOS"};
359static CMenuItem reader_submenu_items[] = {
360    MENU_ITEM(0x35,LANG_MENU_READ_OPEN_NEW,           MENUITEM_PROC,    gui_draw_read, 0 ),
361    MENU_ITEM(0x35,LANG_MENU_READ_OPEN_LAST,          MENUITEM_PROC,    gui_draw_read_last, 0 ),
362    MENU_ITEM(0x35,LANG_MENU_READ_SELECT_FONT,        MENUITEM_PROC,    gui_draw_load_rbf, 0 ),
363    MENU_ENUM2(0x5f,LANG_MENU_READ_CODEPAGE,          &conf.reader_codepage, gui_reader_codepage_cps ),
364    MENU_ITEM(0x5c,LANG_MENU_READ_WORD_WRAP,          MENUITEM_BOOL,    &conf.reader_wrap_by_words, 0 ),
365    MENU_ITEM(0x5c,LANG_MENU_READ_AUTOSCROLL,         MENUITEM_BOOL,    &conf.reader_autoscroll, 0 ),
366    MENU_ITEM(0x5f,LANG_MENU_READ_AUTOSCROLL_DELAY,   MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.reader_autoscroll_delay, MENU_MINMAX(0, 60) ),
367    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
368    {0}
369};
370static CMenu reader_submenu = {0x37,LANG_MENU_READ_TITLE, NULL, reader_submenu_items };
371#endif
372
373#ifdef OPT_DEBUGGING
374static const char* gui_debug_shortcut_modes[] = { "None", "DmpRAM", "Page", "CmpProps"};
375static const char* gui_debug_display_modes[] = { "None", "Props", "Params", "Tasks"};
376static CMenuItem debug_submenu_items[] = {
377    MENU_ENUM2(0x5c,LANG_MENU_DEBUG_DISPLAY,          &conf.debug_display, gui_debug_display_modes ),
378    MENU_ITEM(0x2a,LANG_MENU_DEBUG_PROPCASE_PAGE,     MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &conf.debug_propcase_page, MENU_MINMAX(0, 128) ),
379    MENU_ITEM(0x2a,LANG_MENU_DEBUG_TASKLIST_START,    MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &debug_tasklist_start, MENU_MINMAX(0, 63) ),
380    MENU_ITEM(0x5c,LANG_MENU_DEBUG_SHOW_MISC_VALS,    MENUITEM_BOOL,          &conf.debug_misc_vals_show, 0 ),
381    MENU_ITEM(0x2a,LANG_MENU_DEBUG_MEMORY_BROWSER,    MENUITEM_PROC,          gui_draw_debug, 0 ),
382    MENU_ITEM(0x2a,(int)"Module Inspector",                       MENUITEM_PROC,          gui_draw_modinspector, 0 ),
383    MENU_ITEM(0x2a,LANG_MENU_DEBUG_BENCHMARK,         MENUITEM_PROC,          gui_draw_bench, 0 ),
384    MENU_ENUM2(0x5c,LANG_MENU_DEBUG_SHORTCUT_ACTION,  &conf.debug_shortcut_action, gui_debug_shortcut_modes ),
385    MENU_ITEM(0x5c,LANG_MENU_RAW_TIMER,               MENUITEM_BOOL,          &conf.raw_timer, 0 ),
386#ifdef OPT_LUA
387    MENU_ITEM(0x5c,LANG_MENU_LUA_RESTART,             MENUITEM_BOOL,          &conf.debug_lua_restart_on_error, 0 ),
388#endif
389#if CAM_MULTIPART
390    MENU_ITEM(0x33,LANG_MENU_DEBUG_CREATE_MULTIPART , MENUITEM_PROC,          gui_menuproc_break_card, 0 ),
391#endif
392    MENU_ITEM(0x2a,LANG_SAVE_ROMLOG,                  MENUITEM_PROC,          save_romlog, 0 ),
393    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
394    {0}
395};
396static CMenu debug_submenu = {0x2a,LANG_MENU_DEBUG_TITLE, NULL, debug_submenu_items };
397#endif
398
399
400static CMenuItem misc_submenu_items[] = {
401    MENU_ITEM(0x35,LANG_MENU_MISC_FILE_BROWSER,       MENUITEM_PROC,    gui_draw_fselect, 0 ),
402#ifdef OPT_CALENDAR
403    MENU_ITEM(0x36,LANG_MENU_MISC_CALENDAR,           MENUITEM_PROC,    gui_draw_calendar, 0 ),
404#endif
405#ifdef OPT_TEXTREADER
406    MENU_ITEM(0x37,LANG_MENU_MISC_TEXT_READER,        MENUITEM_SUBMENU, &reader_submenu, 0 ),
407#endif
408#if defined (OPT_GAME_REVERSI) || (OPT_GAME_SOKOBAN || (OPT_GAME_CONNECT4) || OPT_GAME_MASTERMIND)
409    MENU_ITEM(0x38,LANG_MENU_MISC_GAMES,              MENUITEM_SUBMENU, &games_submenu, 0 ),
410#endif
411#if CAM_SWIVEL_SCREEN
412    MENU_ITEM(0x28,LANG_MENU_MISC_FLASHLIGHT,         MENUITEM_BOOL,    &conf.flashlight, 0 ),
413#endif
414    MENU_ITEM(0x5c,LANG_MENU_MISC_SHOW_SPLASH,        MENUITEM_BOOL,    &conf.splash_show, 0 ),
415    MENU_ITEM(0x5c,LANG_MENU_MISC_START_SOUND,        MENUITEM_BOOL,    &conf.start_sound, 0 ),
416#if CAM_USE_ZOOM_FOR_MF
417    MENU_ITEM(0x59,LANG_MENU_MISC_ZOOM_FOR_MF,        MENUITEM_BOOL,    &conf.use_zoom_mf, 0 ),
418#endif
419#if CAM_ADJUSTABLE_ALT_BUTTON
420    MENU_ITEM(0x22,LANG_MENU_MISC_ALT_BUTTON,         MENUITEM_ENUM,    gui_alt_mode_button_enum, 0 ),
421#endif
422    MENU_ITEM(0x5d,LANG_MENU_MISC_DISABLE_LCD_OFF,    MENUITEM_ENUM,    gui_alt_power_enum, 0 ),
423    MENU_ITEM(0x65,LANG_MENU_MISC_PALETTE,            MENUITEM_PROC,    gui_draw_palette, 0 ),
424    MENU_ITEM(0x80,LANG_MENU_MISC_BUILD_INFO,         MENUITEM_PROC,    gui_show_build_info, 0 ),
425    MENU_ITEM(0x80,LANG_MENU_MISC_MEMORY_INFO,        MENUITEM_PROC,    gui_show_memory_info, 0 ),
426    MENU_ITEM(0x33,LANG_MENU_DEBUG_MAKE_BOOTABLE,     MENUITEM_PROC,    gui_menuproc_mkbootdisk, 0 ),
427#if CAM_MULTIPART
428    MENU_ITEM(0x33,LANG_MENU_DEBUG_SWAP_PART,         MENUITEM_PROC,            gui_menuproc_swap_partitions, 0 ),
429#endif
430    MENU_ITEM(0x2b,LANG_MENU_MAIN_RESET_OPTIONS,      MENUITEM_PROC,      gui_menuproc_reset, 0 ),
431#ifdef OPT_DEBUGGING
432    MENU_ITEM(0x2a,LANG_MENU_MAIN_DEBUG,              MENUITEM_SUBMENU,   &debug_submenu, 0 ),
433#endif
434    MENU_ITEM(0x86,LANG_MENU_REMOTE_PARAM,            MENUITEM_SUBMENU,   &remote_submenu, 0 ),
435#if defined (DNG_EXT_FROM)
436    MENU_ITEM(0x71,LANG_MENU_DNG_VIA_USB,             MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_usb_ext , (int)cb_change_dng_usb_ext ),
437#endif
438    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
439    {0},
440};
441static CMenu misc_submenu = {0x29,LANG_MENU_MISC_TITLE, NULL, misc_submenu_items };
442
443static int voltage_step;
444static CMenuItem battery_submenu_items[] = {
445    MENU_ITEM(0x66,LANG_MENU_BATT_VOLT_MAX,           MENUITEM_INT|MENUITEM_ARG_ADDR_INC,     &conf.batt_volts_max,   (int)&voltage_step ),
446    MENU_ITEM(0x67,LANG_MENU_BATT_VOLT_MIN,           MENUITEM_INT|MENUITEM_ARG_ADDR_INC,     &conf.batt_volts_min,   (int)&voltage_step ),
447    MENU_ITEM(0x68,LANG_MENU_BATT_STEP_25,            MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_step_25,     (int)cb_step_25 ),
448    MENU_ITEM(0x0,(int)"",                            MENUITEM_SEPARATOR, 0, 0 ),
449    MENU_ITEM(0x73,LANG_MENU_BATT_SHOW_PERCENT,       MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_perc_show,   (int)cb_perc ),
450    MENU_ITEM(0x73,LANG_MENU_BATT_SHOW_VOLTS,         MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_volts_show,  (int)cb_volts ),
451    MENU_ITEM(0x32,LANG_MENU_BATT_SHOW_ICON,          MENUITEM_BOOL,                          &conf.batt_icon_show, 0 ),
452    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
453    {0}
454};
455static CMenu battery_submenu = {0x32,LANG_MENU_BATT_TITLE, cb_battery_menu_change, battery_submenu_items };
456
457static const char* gui_space_bar_modes[] = { "Don't", "Horizontal", "Vertical"};
458static const char* gui_space_bar_size_modes[] = { "1/4", "1/2", "1"};
459static const char* gui_space_bar_width_modes[] = { "1", "2", "3","4","5","6","7","8","9","10"};
460static const char* gui_space_warn_type_modes[] = { "Percent", "MB", "Don't"};
461static CMenuItem space_submenu_items[] = {
462    MENU_ITEM(0x5c,LANG_MENU_SPACE_SHOW_ICON,         MENUITEM_BOOL,                          &conf.space_icon_show, 0 ),
463    MENU_ENUM2(0x69,LANG_MENU_SPACE_SHOW_BAR,     &conf.space_bar_show, gui_space_bar_modes ),
464    MENU_ENUM2(0x6a,LANG_MENU_SPACE_BAR_SIZE,     &conf.space_bar_size, gui_space_bar_size_modes ),
465    MENU_ENUM2(0x6b,LANG_MENU_SPACE_BAR_WIDTH,    &conf.space_bar_width, gui_space_bar_width_modes ),
466    MENU_ITEM(0x5c,LANG_MENU_SPACE_SHOW_PERCENT,      MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.space_perc_show,   (int)cb_space_perc ),
467    MENU_ITEM(0x5c,LANG_MENU_SPACE_SHOW_MB,           MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.space_mb_show,  (int)cb_space_mb ),
468    MENU_ENUM2(0x5f,LANG_MENU_SPACE_WARN_TYPE,    &conf.space_warn_type, gui_space_warn_type_modes ),
469    MENU_ITEM(0x58,LANG_MENU_SPACE_WARN_PERCENT,     MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &conf.space_perc_warn, MENU_MINMAX(1, 99) ),
470    MENU_ITEM(0x58,LANG_MENU_SPACE_WARN_MB,     MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &conf.space_mb_warn, MENU_MINMAX(1, 4000) ),
471    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
472    {0}
473};
474static CMenu space_submenu = {0x33,LANG_MENU_OSD_SPACE_PARAMS_TITLE, NULL, space_submenu_items};
475
476static const char* gui_dof_show_value_modes[] = { "Don't", "Separate", "In Misc" };
477static CMenuItem dof_submenu_items[] = {
478          MENU_ENUM2(0x5f,LANG_MENU_OSD_SHOW_DOF_CALC,           &conf.show_dof, gui_dof_show_value_modes ),
479          MENU_ITEM(0x5c,LANG_MENU_DOF_SUBJ_DIST_AS_NEAR_LIMIT,  MENUITEM_BOOL,      &conf.dof_subj_dist_as_near_limit, 0),
480          MENU_ITEM(0x5c,LANG_MENU_DOF_USE_EXIF_SUBJ_DIST,       MENUITEM_BOOL,      &conf.dof_use_exif_subj_dist, 0),
481          MENU_ITEM(0x5c,LANG_MENU_DOF_SUBJ_DIST_IN_MISC,        MENUITEM_BOOL,      &conf.dof_subj_dist_in_misc, 0),
482          MENU_ITEM(0x5c,LANG_MENU_DOF_NEAR_LIMIT_IN_MISC,       MENUITEM_BOOL,      &conf.dof_near_limit_in_misc, 0),
483      MENU_ITEM(0x5c,LANG_MENU_DOF_FAR_LIMIT_IN_MISC,        MENUITEM_BOOL,                      &conf.dof_far_limit_in_misc, 0),
484      MENU_ITEM(0x5c,LANG_MENU_DOF_HYPERFOCAL_IN_MISC,       MENUITEM_BOOL,      &conf.dof_hyperfocal_in_misc, 0),
485      MENU_ITEM(0x5c,LANG_MENU_DOF_DEPTH_LIMIT_IN_MISC,      MENUITEM_BOOL,      &conf.dof_depth_in_misc, 0),
486#if !CAM_DRYOS
487      MENU_ITEM(0x5c,LANG_MENU_DOF_DIST_FROM_LENS,           MENUITEM_BOOL,      &conf.dof_dist_from_lens, 0),
488#endif
489          MENU_ITEM(0x51,LANG_MENU_BACK,                           MENUITEM_UP, 0, 0 ),
490    {0}
491};
492static CMenu dof_submenu = {0x31,LANG_MENU_DOF_TITLE, /*cb_dof_menu_change*/ NULL, dof_submenu_items };
493
494static const char* gui_zoom_value_modes[] = { "X", "FL", "EFL" };
495static const char* gui_show_values_modes[] = { "Don't", "Always", "Shoot" };
496static CMenuItem values_submenu_items[] = {
497          MENU_ENUM2(0x5f,LANG_MENU_OSD_SHOW_MISC_VALUES,          &conf.show_values, gui_show_values_modes ),
498         // MENU_ITEM(0x43,LANG_MENU_VALUES_SHOW_IN_REVIEW,   MENUITEM_BOOL,      &conf.values_show_in_review, 0 ),
499          MENU_ITEM(0x5c,LANG_MENU_SHOW_VALUES_IN_VIDEO,           MENUITEM_BOOL,      &conf.show_values_in_video, 0 ),
500          MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_ZOOM,               MENUITEM_BOOL,      &conf.values_show_zoom, 0 ),
501          MENU_ENUM2(0x5f,LANG_MENU_OSD_ZOOM_VALUE,                &conf.zoom_value, gui_zoom_value_modes ),
502          MENU_ITEM(0x60,LANG_MENU_OSD_ZOOM_SCALE,                 MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zoom_scale,   MENU_MINMAX(0, 1000) ),
503      MENU_ITEM(0x62,LANG_MENU_VALUES_SHOW_REAL_APERTURE,      MENUITEM_BOOL,      &conf.values_show_real_aperture, 0 ),
504      MENU_ITEM(0x74,LANG_MENU_VALUES_SHOW_REAL_ISO,           MENUITEM_BOOL,      &conf.values_show_real_iso, 0 ),
505      MENU_ITEM(0x74,LANG_MENU_VALUES_SHOW_MARKET_ISO,         MENUITEM_BOOL,      &conf.values_show_market_iso, 0 ),
506          MENU_ITEM(0x2d,LANG_MENU_SHOW_ISO_ONLY_IN_AUTOISO_MODE,  MENUITEM_BOOL,            &conf.values_show_iso_only_in_autoiso_mode, 0 ),
507      MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_EV_SETED,                     MENUITEM_BOOL,      &conf.values_show_ev_seted, 0 ),
508      MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_EV_MEASURED,        MENUITEM_BOOL,            &conf.values_show_ev_measured, 0 ),
509      MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_BV_SETED,                     MENUITEM_BOOL,      &conf.values_show_bv_seted, 0 ),
510      MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_BV_MEASURED,          MENUITEM_BOOL,      &conf.values_show_bv_measured, 0 ),
511      MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_OVEREXPOSURE,             MENUITEM_BOOL,      &conf.values_show_overexposure, 0 ),
512      MENU_ITEM(0x5c,LANG_MENU_SHOW_CANON_OVEREXPOSURE,      MENUITEM_BOOL,      &conf.values_show_canon_overexposure, 0 ),
513      MENU_ITEM(0x5c,LANG_MENU_VALUES_SHOW_LUMINANCE,        MENUITEM_BOOL,      &conf.values_show_luminance, 0 ),
514          MENU_ITEM(0x51,LANG_MENU_BACK,                           MENUITEM_UP, 0, 0 ),
515    {0}
516};
517static CMenu values_submenu = {0x28,LANG_MENU_OSD_VALUES_TITLE, /*cb_values_menu_change*/ NULL, values_submenu_items };
518
519static const char* gui_show_clock_modes[]={ "Don't", "Normal", "Seconds"};
520static const char* gui_clock_format_modes[] = { "24h", "12h"};
521static const char* gui_clock_indicator_modes[] = { "PM", "P", "."};
522static const char* gui_clock_halfpress_modes[] = { "Full", "Seconds", "Don't"};
523static CMenuItem clock_submenu_items[] = {
524    MENU_ENUM2(0x5f,LANG_MENU_OSD_SHOW_CLOCK,           &conf.show_clock, gui_show_clock_modes ),
525    MENU_ENUM2(0x6d,LANG_MENU_OSD_CLOCK_FORMAT,         &conf.clock_format, gui_clock_format_modes ),
526    MENU_ENUM2(0x6c,LANG_MENU_OSD_CLOCK_INDICATOR,      &conf.clock_indicator, gui_clock_indicator_modes ),
527    MENU_ENUM2(0x6e,LANG_MENU_OSD_CLOCK_HALFPRESS,      &conf.clock_halfpress, gui_clock_halfpress_modes ),
528    MENU_ITEM(0x51,LANG_MENU_BACK, MENUITEM_UP, 0, 0 ),
529    {0}
530};
531static CMenu clock_submenu = {0x34,LANG_MENU_OSD_CLOCK_PARAMS_TITLE, NULL, clock_submenu_items };
532
533
534static const char* gui_show_movie_time_modes[] = { "Don't", "hh:mm:ss", "KB/s","both"};
535#if !CAM_VIDEO_QUALITY_ONLY
536    static const char* gui_video_mode_modes[] = { "Bitrate", "Quality"};
537#else
538    static const char* gui_video_mode_modes[] = { "Default", "Quality"};
539#endif
540static CMenuItem video_submenu_items[] = {
541#if CAM_CHDK_HAS_EXT_VIDEO_MENU
542        MENU_ENUM2(0x23,LANG_MENU_VIDEO_MODE,             &conf.video_mode, gui_video_mode_modes ),
543#if !CAM_VIDEO_QUALITY_ONLY
544      MENU_ITEM(0x5e,LANG_MENU_VIDEO_BITRATE,           MENUITEM_ENUM,    gui_video_bitrate_enum, 0 ),
545#endif
546    MENU_ITEM(0x60,LANG_MENU_VIDEO_QUALITY,           MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.video_quality, MENU_MINMAX(1, 99) ),
547    MENU_ITEM(0x5c,LANG_MENU_CLEAR_VIDEO_VALUES,    MENUITEM_BOOL,    &conf.clear_video, 0 ),
548#endif
549#if CAM_VIDEO_CONTROL
550    MENU_ITEM(0x5c,LANG_MENU_FAST_SWITCH_VIDEO,   MENUITEM_BOOL,  &conf.fast_movie_control, 0 ),
551#endif
552#if CAM_CHDK_HAS_EXT_VIDEO_MENU
553    MENU_ITEM(0x5c,LANG_MENU_FAST_SWITCH_QUALITY_VIDEO,   MENUITEM_BOOL,  &conf.fast_movie_quality_control, 0 ),
554#endif
555#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
556    MENU_ITEM(0x5c,LANG_MENU_OPTICAL_ZOOM_IN_VIDEO,   MENUITEM_BOOL,  &conf.unlock_optical_zoom_for_video, 0 ),
557#endif
558#if CAM_CAN_MUTE_MICROPHONE
559    MENU_ITEM(0x83,LANG_MENU_MUTE_ON_ZOOM,   MENUITEM_BOOL,  &conf.mute_on_zoom, 0 ),
560#endif
561#if CAM_AF_SCAN_DURING_VIDEO_RECORD
562    MENU_ITEM(0x82,LANG_MENU_VIDEO_AF_KEY,   MENUITEM_ENUM,    gui_video_af_key_enum, 0 ),
563#endif
564    MENU_ENUM2(0x5c,LANG_MENU_OSD_SHOW_VIDEO_TIME,         &conf.show_movie_time, gui_show_movie_time_modes ),
565    MENU_ITEM(0x60,LANG_MENU_OSD_SHOW_VIDEO_REFRESH,             MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.show_movie_refresh,   MENU_MINMAX(1, 20) ),
566    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
567    {0}
568};
569static CMenu video_submenu = {0x23,LANG_MENU_VIDEO_PARAM_TITLE, NULL, video_submenu_items };
570
571static const char* gui_bracket_values_modes[] = { "Off", "1/3 Ev","2/3 Ev", "1 Ev", "1 1/3Ev", "1 2/3Ev", "2 Ev", "2 1/3Ev", "2 2/3Ev", "3 Ev", "3 1/3Ev", "3 2/3Ev", "4 Ev"};
572static const char* gui_override_koef_modes[] = { "Off", "1", "10", "100", "1000" };
573static const char* gui_bracket_type_modes[] = { "+/-", "-","+"};
574static CMenuItem bracketing_in_continuous_submenu_items[] = {
575          MENU_ENUM2(0x63,LANG_MENU_TV_BRACKET_VALUE,            &conf.tv_bracket_value, gui_bracket_values_modes ),
576#if CAM_HAS_IRIS_DIAPHRAGM
577          MENU_ENUM2(0x62,LANG_MENU_AV_BRACKET_VALUE,            &conf.av_bracket_value, gui_bracket_values_modes ),
578#endif
579#if CAM_CAN_SD_OVERRIDE
580          MENU_ITEM(0x5e,LANG_MENU_SUBJ_DIST_BRACKET_VALUE,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.subj_dist_bracket_value, MENU_MINMAX(0, 100) ),
581          MENU_ENUM2(0x5f,LANG_MENU_SUBJ_DIST_BRACKET_KOEF,      &conf.subj_dist_bracket_koef, gui_override_koef_modes ),
582#endif
583          MENU_ITEM(0x74,LANG_MENU_ISO_BRACKET_VALUE,            MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.iso_bracket_value, MENU_MINMAX(0, 100) ),
584          MENU_ENUM2a(0x5f,LANG_MENU_ISO_BRACKET_KOEF,           &conf.iso_bracket_koef, gui_override_koef_modes, 4 ),
585          MENU_ENUM2(0x60,LANG_MENU_BRACKET_TYPE,                &conf.bracket_type, gui_bracket_type_modes ),
586          MENU_ITEM(0x5b,LANG_MENU_CLEAR_BRACKET_VALUES,        MENUITEM_BOOL,        &conf.clear_bracket, 0 ),
587     MENU_ITEM(0x5c,LANG_MENU_BRACKETING_ADD_RAW_SUFFIX,                MENUITEM_BOOL,      &conf.bracketing_add_raw_suffix, 0 ),
588      MENU_ITEM(0x51,LANG_MENU_BACK,                         MENUITEM_UP, 0, 0 ),
589      {0}
590};
591static CMenu bracketing_in_continuous_submenu = {0x2c,LANG_MENU_BRACKET_IN_CONTINUOUS_TITLE, NULL, bracketing_in_continuous_submenu_items };
592
593
594/*
595static CMenuItem exposure_submenu_items[] = {
596          MENU_ITEM(0x59,LANG_MENU_RECALC_EXPOSURE,         MENUITEM_BOOL,    &conf.recalc_exposure, 0),
597          MENU_ITEM(0x63,LANG_MENU_TV_EXPOSURE_ORDER,       MENUITEM_ENUM,    gui_tv_exposure_order_enum, 0),
598          MENU_ITEM(0x62,LANG_MENU_AV_EXPOSURE_ORDER,       MENUITEM_ENUM,    gui_av_exposure_order_enum, 0),
599          MENU_ITEM(0x74,LANG_MENU_ISO_EXPOSURE_ORDER,     MENUITEM_ENUM,    gui_iso_exposure_order_enum, 0),
600          MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
601      {0}
602};
603static CMenu exposure_submenu = {0x2a,LANG_MENU_EXPOSURE_TITLE, NULL, exposure_submenu_items };
604*/
605
606// "Extra Photo Operations" Menu
607static const char* gui_override_disable_modes[] = { "Off", "On", "Disabled"};
608static const char* gui_nd_filter_state_modes[] = { "Off", "In", "Out" };
609static const char* gui_fast_ev_step_modes[] = {"1/6 Ev","1/3 Ev","1/2 Ev", "2/3 Ev","5/6 Ev","1 Ev","1 1/6 Ev","1 1/3 Ev","1 1/2 Ev", "1 2/3 Ev","1 5/6 Ev","2 Ev","2 1/6 Ev","2 1/3 Ev","2 1/2 Ev", "2 2/3 Ev","2 5/6 Ev","3 Ev","3 1/6 Ev","3 1/3 Ev","3 1/2 Ev", "3 2/3 Ev","3 5/6 Ev","4 Ev"};
610static const char* gui_fast_image_quality_modes[] = { "sup.fine", "fine", "normal", "off" };
611static CMenuItem operation_submenu_items[] = {
612      MENU_ENUM2(0x5f,LANG_MENU_OVERRIDE_DISABLE,    &conf.override_disable, gui_override_disable_modes ),
613      MENU_ITEM(0x5c,LANG_MENU_OVERRIDE_DISABLE_ALL,     MENUITEM_BOOL,    &conf.override_disable_all, 0 ),
614          MENU_ITEM(0x61,LANG_MENU_OVERRIDE_TV_VALUE,        MENUITEM_ENUM,    gui_tv_override_value_enum, 0 ),
615          MENU_ITEM(0x5f,LANG_MENU_OVERRIDE_TV_KOEF,         MENUITEM_ENUM,    gui_tv_override_koef_enum, 0 ),
616          MENU_ITEM(0x59,LANG_MENU_TV_ENUM_TYPE,             MENUITEM_ENUM,    gui_tv_enum_type_enum, 0 ),
617#if CAM_HAS_IRIS_DIAPHRAGM
618          MENU_ITEM(0x62,LANG_MENU_OVERRIDE_AV_VALUE,        MENUITEM_ENUM,    gui_av_override_enum, 0 ),
619#endif
620#if CAM_HAS_ND_FILTER
621      MENU_ENUM2(0x5f,LANG_MENU_OVERRIDE_ND_FILTER,      &conf.nd_filter_state, gui_nd_filter_state_modes ),
622#endif
623#if CAM_CAN_SD_OVERRIDE
624      MENU_ITEM(0x5e,LANG_MENU_OVERRIDE_SUBJ_DIST_VALUE, MENUITEM_ENUM,    gui_subj_dist_override_value_enum, 0 ),
625          MENU_ITEM(0x5f,LANG_MENU_OVERRIDE_SUBJ_DIST_KOEF,  MENUITEM_ENUM,    gui_subj_dist_override_koef_enum, 0 ),
626#endif
627          MENU_ITEM(0x74,LANG_MENU_OVERRIDE_ISO_VALUE,     MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.iso_override_value, MENU_MINMAX(0, 800) ),
628          MENU_ENUM2a(0x5f,LANG_MENU_OVERRIDE_ISO_KOEF,       &conf.iso_override_koef, gui_override_koef_modes, 4 ),
629#if ZOOM_OVERRIDE
630    MENU_ITEM(0x5c,LANG_MENU_OVERRIDE_ZOOM,         MENUITEM_BOOL,    &conf.zoom_override, 0 ),
631    MENU_ITEM(0x5f,LANG_MENU_OVERRIDE_ZOOM_VALUE,         MENUITEM_ENUM,    gui_zoom_override_enum, 0 ),
632
633          MENU_ITEM(0x5c,LANG_MENU_CLEAR_ZOOM_OVERRIDE_VALUES,    MENUITEM_BOOL,    &conf.clear_zoom_override, 0 ),
634#endif
635          MENU_ITEM(0x2c,LANG_MENU_BRACKET_IN_CONTINUOUS,          MENUITEM_SUBMENU, &bracketing_in_continuous_submenu, 0 ),
636          MENU_ITEM(0x2d,LANG_MENU_AUTOISO,                  MENUITEM_SUBMENU, &autoiso_submenu, 0 ),
637      //{LANG_MENU_EXPOSURE,               MENUITEM_SUBMENU, &exposure_submenu, 0 ),
638          MENU_ITEM(0x5b,LANG_MENU_CLEAR_OVERRIDE_VALUES,    MENUITEM_BOOL,    &conf.clear_override, 0 ),
639
640      MENU_ITEM(0x5c,LANG_MENU_MISC_FAST_EV,         MENUITEM_BOOL,    &conf.fast_ev, 0 ),
641      MENU_ENUM2(0x5f,LANG_MENU_MISC_FAST_EV_STEP,   &conf.fast_ev_step, gui_fast_ev_step_modes ),
642#if CAM_REAR_CURTAIN
643      MENU_ITEM(0x5c, LANG_MENU_REAR_CURTAIN, MENUITEM_BOOL, &conf.flash_sync_curtain, 0 ),
644#endif
645          MENU_ITEM(0x5c, LANG_MENU_FLASH_MANUAL_OVERRIDE, MENUITEM_BOOL,   &conf.flash_manual_override, 0 ),
646    MENU_ITEM(0x5f, LANG_MENU_FLASH_VIDEO_OVERRIDE_POWER,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.flash_video_override_power, MENU_MINMAX(0, 2) ),
647#if CAM_HAS_VIDEO_BUTTON
648    MENU_ITEM(0x5c, LANG_MENU_FLASH_VIDEO_OVERRIDE, MENUITEM_BOOL,   &conf.flash_video_override, 0 ),
649#endif
650#if CAM_QUALITY_OVERRIDE
651    MENU_ENUM2(0x5c,LANG_MENU_MISC_IMAGE_QUALITY,   &conf.fast_image_quality, gui_fast_image_quality_modes ),
652#endif
653    MENU_ITEM(0x51,LANG_MENU_BACK,                     MENUITEM_UP, 0, 0 ),
654    {0}
655};
656static CMenu operation_submenu = {0x21,LANG_MENU_OPERATION_PARAM_TITLE, NULL, operation_submenu_items };
657
658#ifdef OPT_EDGEOVERLAY
659static const char* gui_edge_pano_modes[] = { "Off", "Right", "Down", "Left", "Up", "Free"};
660static CMenuItem edge_overlay_submenu_items[] = {
661    MENU_ITEM(0x5c,LANG_MENU_EDGE_OVERLAY_ENABLE,     MENUITEM_BOOL,          &conf.edge_overlay_enable, 0 ),
662    MENU_ITEM(0x5c,LANG_MENU_EDGE_FILTER,     MENUITEM_BOOL,          &conf.edge_overlay_filter, 0 ),
663    MENU_ENUM2(0x5f,LANG_MENU_EDGE_PANO,    &conf.edge_overlay_pano, gui_edge_pano_modes ),
664    MENU_ITEM(0x5e,LANG_MENU_EDGE_PANO_OVERLAP,   MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.edge_overlay_pano_overlap, MENU_MINMAX(0, 100) ),
665    MENU_ITEM(0x5c,LANG_MENU_EDGE_SHOW,     MENUITEM_BOOL,          &conf.edge_overlay_show, 0 ),
666    MENU_ITEM(0x5e,LANG_MENU_EDGE_OVERLAY_TRESH,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.edge_overlay_thresh, MENU_MINMAX(0, 255) ),
667    MENU_ITEM(0x65,LANG_MENU_EDGE_OVERLAY_COLOR,      MENUITEM_COLOR_FG,      &conf.edge_overlay_color, 0 ),
668    MENU_ITEM(0x5c,LANG_MENU_EDGE_PLAY,                 MENUITEM_BOOL,          &conf.edge_overlay_play, 0 ), //does not work on cams like s-series, which dont have a real "hardware" play/rec switch, need a workaround, probably another button
669    MENU_ITEM(0x33,LANG_MENU_EDGE_SAVE,                 MENUITEM_PROC,          gui_menuproc_edge_save, 0 ),
670    MENU_ITEM(0x5c,LANG_MENU_EDGE_ZOOM,     MENUITEM_BOOL,          &conf.edge_overlay_zoom, 0 ),
671    MENU_ITEM(0x33,LANG_MENU_EDGE_LOAD,                 MENUITEM_PROC,          gui_menuproc_edge_load, 0 ),
672    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
673    {0}
674};
675static CMenu edge_overlay_submenu = {0x7f,LANG_MENU_EDGE_OVERLAY_TITLE, NULL, edge_overlay_submenu_items };
676#endif
677
678static CMenuItem grid_submenu_items[] = {
679    MENU_ITEM(0x2f,LANG_MENU_SHOW_GRID,               MENUITEM_BOOL,            &conf.show_grid_lines, 0 ),
680    MENU_ITEM(0x35,LANG_MENU_GRID_LOAD,               MENUITEM_PROC,            gui_grid_lines_load, 0 ),
681    MENU_ITEM(0x0,LANG_MENU_GRID_CURRENT,            MENUITEM_SEPARATOR, 0, 0 ),
682    MENU_ITEM(0x0,(int)grid_title,                   MENUITEM_TEXT, 0, 0 ),
683    MENU_ITEM(0x0,(int)"",                           MENUITEM_SEPARATOR, 0, 0 ),
684    MENU_ITEM(0x5c,LANG_MENU_GRID_FORCE_COLOR,        MENUITEM_BOOL,          &conf.grid_force_color, 0 ),
685    MENU_ITEM(0x65,LANG_MENU_GRID_COLOR_LINE,         MENUITEM_COLOR_FG,      &conf.grid_color, 0 ),
686    MENU_ITEM(0x65,LANG_MENU_GRID_COLOR_FILL,         MENUITEM_COLOR_BG,      &conf.grid_color, 0 ),
687    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
688    {0}
689};
690static CMenu grid_submenu = {0x2f,LANG_MENU_GRID_TITLE, NULL, grid_submenu_items };
691
692static CMenuItem visual_submenu_items[] = {
693    MENU_ITEM(0x35,LANG_MENU_VIS_LANG,                MENUITEM_PROC,      gui_draw_load_lang, 0 ),
694    MENU_ITEM(0x5f,LANG_MENU_VIS_OSD_FONT,            MENUITEM_ENUM,      gui_font_enum, 0 ),
695    MENU_ITEM(0x35,LANG_MENU_VIS_MENU_FONT,           MENUITEM_PROC,      gui_draw_load_menu_rbf, 0 ),
696    MENU_ITEM(0x35,LANG_MENU_VIS_MENU_SYMBOL_FONT,    MENUITEM_PROC,      gui_draw_load_symbol_rbf, 0 ),
697    MENU_ITEM(0x80,LANG_MENU_RESET_FILES                 ,         MENUITEM_PROC,          gui_menuproc_reset_files, 0 ),
698    MENU_ITEM(0x0,LANG_MENU_VIS_COLORS,              MENUITEM_SEPARATOR, 0, 0 ),
699    MENU_ITEM(0x65,LANG_MENU_VIS_OSD_TEXT,            MENUITEM_COLOR_FG,  &conf.osd_color, 0 ),
700    MENU_ITEM(0x65,LANG_MENU_VIS_OSD_BKG,             MENUITEM_COLOR_BG,  &conf.osd_color, 0 ),
701    MENU_ITEM(0x65,LANG_MENU_VIS_OSD_WARNING,         MENUITEM_COLOR_FG,  &conf.osd_color_warn, 0 ),
702    MENU_ITEM(0x65,LANG_MENU_VIS_OSD_WARNING_BKG,     MENUITEM_COLOR_BG,  &conf.osd_color_warn, 0 ),
703    MENU_ITEM(0x65,LANG_MENU_VIS_HISTO,               MENUITEM_COLOR_FG,  &conf.histo_color, 0 ),
704    MENU_ITEM(0x65,LANG_MENU_VIS_HISTO_BKG,           MENUITEM_COLOR_BG,  &conf.histo_color, 0 ),
705    MENU_ITEM(0x65,LANG_MENU_VIS_HISTO_BORDER,        MENUITEM_COLOR_FG,  &conf.histo_color2, 0 ),
706    MENU_ITEM(0x65,LANG_MENU_VIS_HISTO_MARKERS,       MENUITEM_COLOR_BG,  &conf.histo_color2, 0 ),
707    MENU_ITEM(0x65,LANG_MENU_VIS_ZEBRA_UNDER,         MENUITEM_COLOR_BG,  &conf.zebra_color, 0 ),
708    MENU_ITEM(0x65,LANG_MENU_VIS_ZEBRA_OVER,          MENUITEM_COLOR_FG,  &conf.zebra_color, 0 ),
709    MENU_ITEM(0x65,LANG_MENU_VIS_BATT_ICON,           MENUITEM_COLOR_FG,  &conf.batt_icon_color, 0 ),
710    MENU_ITEM(0x65,LANG_MENU_VIS_SPACE_ICON,          MENUITEM_COLOR_FG,  &conf.space_color, 0 ),
711    MENU_ITEM(0x65,LANG_MENU_VIS_SPACE_ICON_BKG,      MENUITEM_COLOR_BG,  &conf.space_color, 0 ),
712    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_TEXT,           MENUITEM_COLOR_FG,  &conf.menu_color, 0 ),
713    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_BKG,            MENUITEM_COLOR_BG,  &conf.menu_color, 0 ),
714    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_TITLE_TEXT,     MENUITEM_COLOR_FG,  &conf.menu_title_color, 0 ),
715    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_TITLE_BKG,      MENUITEM_COLOR_BG,  &conf.menu_title_color, 0 ),
716    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_CURSOR_TEXT,    MENUITEM_COLOR_FG,  &conf.menu_cursor_color, 0 ),
717    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_CURSOR_BKG,     MENUITEM_COLOR_BG,  &conf.menu_cursor_color, 0 ),
718    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_SYMBOL_TEXT,    MENUITEM_COLOR_FG,  &conf.menu_symbol_color, 0 ),
719    MENU_ITEM(0x65,LANG_MENU_VIS_MENU_SYMBOL_BKG,     MENUITEM_COLOR_BG,  &conf.menu_symbol_color, 0 ),
720    MENU_ITEM(0x65,LANG_MENU_VIS_READER_TEXT,         MENUITEM_COLOR_FG,  &conf.reader_color, 0 ),
721    MENU_ITEM(0x65,LANG_MENU_VIS_READER_BKG,          MENUITEM_COLOR_BG,  &conf.reader_color, 0 ),
722    MENU_ITEM(0x65,LANG_MENU_VIS_OSD_OVERRIDE,         MENUITEM_COLOR_FG,  &conf.osd_color_override, 0 ),
723    MENU_ITEM(0x65,LANG_MENU_VIS_OSD_OVERRIDE_BKG,     MENUITEM_COLOR_BG,  &conf.osd_color_override, 0 ),
724    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
725    {0}
726};
727static CMenu visual_submenu = {0x28,LANG_MENU_VIS_TITLE, NULL, visual_submenu_items };
728
729/*
730 * 1 extra entry for the "Main menu" and 1 for null when the menu is full with user selections
731 * Compiler will zero init remaining portion of array so no there is no hidden relationship between
732 * this structure and the value of USER_MENU_ITEMS. The value of USER_MENU_ITEMS can be anything you
733 * wish and everything automagically works.
734*/
735
736static CMenuItem user_submenu_items[USER_MENU_ITEMS + 2] = {
737        MENU_ITEM(0x20,LANG_MENU_MAIN_TITLE,     MENUITEM_PROC,  rinit, 0 )
738};
739
740static CMenu user_submenu = {0x2e,LANG_MENU_USER_MENU, NULL, user_submenu_items };
741
742static CMenuItem raw_state_submenu_items[] = {
743    MENU_ITEM(0x5c,LANG_MENU_OSD_SHOW_RAW_STATE,      MENUITEM_BOOL,      &conf.show_raw_state, 0 ),
744    MENU_ITEM(0x5c,LANG_MENU_OSD_SHOW_REMAINING_RAW,  MENUITEM_BOOL,      &conf.show_remaining_raw, 0 ),
745    MENU_ITEM(0x60,LANG_MENU_OSD_RAW_TRESHOLD,        MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.remaining_raw_treshold,   MENU_MINMAX(0, 200) ),
746    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
747    {0}
748};
749
750static CMenu raw_state_submenu = {0x24,LANG_MENU_OSD_RAW_STATE_PARAMS_TITLE, NULL, raw_state_submenu_items };
751
752#ifdef  CAM_TOUCHSCREEN_UI
753static const char* gui_touchscreen_disable_modes[]={ "Enable", "Disable" };
754static CMenuItem touchscreen_submenu_items[] = {
755    MENU_ENUM2(0x5f,LANG_MENU_TS_VIDEO_AE_DISABLE,      &conf.touchscreen_disable_video_controls,    gui_touchscreen_disable_modes ),
756    MENU_ENUM2(0x5f,LANG_MENU_TS_ALT_SHORTCUTS_DISABLE, &conf.touchscreen_disable_shortcut_controls, gui_touchscreen_disable_modes ),
757    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
758    {0}
759};
760static CMenu touchscreen_submenu = {0x28,LANG_MENU_TOUCHSCREEN_VALUES, /*cb_values_menu_change*/ NULL, touchscreen_submenu_items };
761#endif
762
763static const char* gui_temp_mode_modes[] = { "Off", "Optical", "CCD", "Battery", "all" };
764static const char* gui_hide_osd_modes[] = { "Don't", "In Playback", "On Disp Press", "Both"};
765static const char* gui_show_usb_info_modes[] = { "Off", "Icon", "Text"};
766static CMenuItem osd_submenu_items[] = {
767    MENU_ITEM(0x5c,LANG_MENU_OSD_SHOW,                MENUITEM_BOOL,      &conf.show_osd, 0 ),
768    MENU_ENUM2(0x5c,LANG_MENU_OSD_HIDE_PLAYBACK,      &conf.hide_osd, gui_hide_osd_modes ),
769    MENU_ITEM(0x81,LANG_MENU_VIS_MENU_CENTER,         MENUITEM_BOOL,        &conf.menu_center, 0 ),
770    MENU_ITEM(0x81,LANG_MENU_SELECT_FIRST_ENTRY,         MENUITEM_BOOL,     &conf.menu_select_first_entry, 0 ),
771    MENU_ITEM(0x64,LANG_MENU_VIS_SYMBOL,             MENUITEM_BOOL,         &conf.menu_symbol_enable, 0 ),
772    MENU_ITEM(0x2e,LANG_MENU_USER_MENU,                         MENUITEM_SUBMENU,   &user_submenu, 0 ),
773    MENU_ITEM(0x5f,LANG_MENU_USER_MENU_ENABLE,          MENUITEM_ENUM,      gui_user_menu_show_enum, 0 ),
774    MENU_ITEM(0x5c,LANG_MENU_USER_MENU_AS_ROOT,       MENUITEM_BOOL,      &conf.user_menu_as_root, 0 ),
775    MENU_ITEM(0x5f,LANG_MENU_OSD_SHOW_STATES,         MENUITEM_BOOL,      &conf.show_state, 0 ),
776    MENU_ENUM2(0x5f,LANG_MENU_OSD_SHOW_TEMP,         &conf.show_temp, gui_temp_mode_modes ),
777    MENU_ITEM(0x59,LANG_MENU_OSD_TEMP_FAHRENHEIT,      MENUITEM_BOOL,      &conf.temperature_unit, 0 ),
778    MENU_ENUM2(0x71,LANG_MENU_USB_SHOW_INFO,         &conf.usb_info_enable, gui_show_usb_info_modes ),
779    MENU_ITEM(0x72,LANG_MENU_OSD_LAYOUT_EDITOR,       MENUITEM_PROC,      gui_draw_osd_le, 0 ),
780    MENU_ITEM(0x2f,LANG_MENU_OSD_GRID_PARAMS,         MENUITEM_SUBMENU,   &grid_submenu, 0 ),
781    MENU_ITEM(0x22,LANG_MENU_OSD_VALUES,                MENUITEM_SUBMENU,   &values_submenu, 0 ),
782    MENU_ITEM(0x31,LANG_MENU_OSD_DOF_CALC,            MENUITEM_SUBMENU,   &dof_submenu, 0 ),
783    MENU_ITEM(0x24,LANG_MENU_OSD_RAW_STATE_PARAMS,    MENUITEM_SUBMENU,   &raw_state_submenu, 0 ),
784    MENU_ITEM(0x32,LANG_MENU_OSD_BATT_PARAMS,         MENUITEM_SUBMENU,   &battery_submenu, 0 ),
785    MENU_ITEM(0x33,LANG_MENU_OSD_SPACE_PARAMS,        MENUITEM_SUBMENU,   &space_submenu, 0 ),
786    MENU_ITEM(0x34,LANG_MENU_OSD_CLOCK_PARAMS,          MENUITEM_SUBMENU,   &clock_submenu, 0 ),
787    MENU_ITEM(0x59,LANG_MENU_OSD_SHOW_IN_REVIEW,      MENUITEM_BOOL,      &conf.show_osd_in_review, 0 ),
788#ifndef OPTIONS_AUTOSAVE
789    MENU_ITEM(0x5c,LANG_MENU_MAIN_SAVE_OPTIONS,       MENUITEM_PROC,      gui_menuproc_save, 0 ),
790#endif
791#ifdef  CAM_TOUCHSCREEN_UI
792    MENU_ITEM(0x22,LANG_MENU_TOUCHSCREEN_VALUES,         MENUITEM_SUBMENU,   &touchscreen_submenu, 0 ),
793#endif
794    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
795    {0}
796};
797
798static CMenu osd_submenu = {0x22,LANG_MENU_OSD_TITLE, NULL, osd_submenu_items };
799
800static const char* gui_histo_show_modes[] = { "Don't", "Always", "Shoot" };
801static CMenuItem histo_submenu_items[] = {
802    MENU_ENUM2(0x5f,LANG_MENU_HISTO_SHOW,             &conf.show_histo, gui_histo_show_modes ),
803    MENU_ITEM(0x6f,LANG_MENU_HISTO_LAYOUT,            MENUITEM_ENUM,      gui_histo_layout_enum, 0 ),
804    MENU_ITEM(0x5f,LANG_MENU_HISTO_MODE,              MENUITEM_ENUM,      gui_histo_mode_enum, 0 ),
805    MENU_ITEM(0x5c,LANG_MENU_HISTO_EXP,               MENUITEM_BOOL,       &conf.show_overexp, 0 ),
806    MENU_ITEM(0x70,LANG_MENU_HISTO_IGNORE_PEAKS,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.histo_ignore_boundary,   MENU_MINMAX(0, 32) ),
807    MENU_ITEM(0x5c,LANG_MENU_HISTO_MAGNIFY,           MENUITEM_BOOL,       &conf.histo_auto_ajust, 0 ),
808    MENU_ITEM(0x5c,LANG_MENU_HISTO_SHOW_EV_GRID,      MENUITEM_BOOL,       &conf.histo_show_ev_grid, 0 ),
809    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
810    {0}
811};
812static CMenu histo_submenu = {0x25,LANG_MENU_HISTO_TITLE, NULL, histo_submenu_items };
813
814static CMenuItem raw_exceptions_submenu_items[] = {
815    #if defined CAM_HAS_VIDEO_BUTTON
816     MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_VIDEO,                MENUITEM_BOOL,      &conf.save_raw_in_video, 0 ),
817    #endif
818    #if defined(CAMERA_s3is)
819        MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_SPORTS,                MENUITEM_BOOL,      &conf.save_raw_in_sports, 0 ),
820    #endif
821    MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_BURST,                MENUITEM_BOOL,      &conf.save_raw_in_burst, 0 ),
822    MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_TIMER,                MENUITEM_BOOL,      &conf.save_raw_in_timer, 0 ),
823    MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_EDGEOVERLAY,          MENUITEM_BOOL,      &conf.save_raw_in_edgeoverlay, 0 ),
824    MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_AUTO,                 MENUITEM_BOOL,      &conf.save_raw_in_auto, 0 ),
825                #if CAM_BRACKETING
826        MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_EV_BRACKETING,                MENUITEM_BOOL,      &conf.save_raw_in_ev_bracketing, 0 ),
827                #endif
828    MENU_ITEM(0x5c,LANG_MENU_RAW_WARN,                MENUITEM_BOOL,      &conf.raw_exceptions_warn, 0 ),
829    MENU_ITEM(0x51,LANG_MENU_BACK,                           MENUITEM_UP, 0, 0 ),
830    {0}
831};
832static CMenu raw_exceptions_submenu = {0x59,LANG_MENU_OSD_RAW_EXCEPTIONS_PARAMS_TITLE, NULL, raw_exceptions_submenu_items };
833
834
835static const char* gui_raw_nr_modes[] = { "Auto", "Off", "On"};
836static CMenuItem raw_submenu_items[] = {
837    MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE,                MENUITEM_BOOL,      &conf.save_raw, 0 ),
838    MENU_ITEM(0x59,LANG_MENU_OSD_RAW_EXCEPTIONS_PARAMS,         MENUITEM_SUBMENU,   &raw_exceptions_submenu, 0 ),
839    MENU_ENUM2(0x5f,LANG_MENU_RAW_NOISE_REDUCTION,    &conf.raw_nr, gui_raw_nr_modes ),
840    MENU_ITEM(0x5c,LANG_MENU_RAW_FIRST_ONLY,          MENUITEM_BOOL,      &conf.raw_save_first_only, 0 ),
841    MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_DIR,         MENUITEM_BOOL,      &conf.raw_in_dir, 0 ),
842    MENU_ENUM2a(0x5f,LANG_MENU_RAW_PREFIX,            &conf.raw_prefix, img_prefixes, NUM_IMG_PREFIXES ),
843    MENU_ENUM2a(0x5f,LANG_MENU_RAW_EXTENSION,         &conf.raw_ext, img_exts, NUM_IMG_EXTS ),
844    MENU_ENUM2a(0x5f,LANG_MENU_SUB_PREFIX,            &conf.sub_batch_prefix, img_prefixes, NUM_IMG_PREFIXES ),
845    MENU_ENUM2a(0x5f,LANG_MENU_SUB_EXTENSION,         &conf.sub_batch_ext, img_exts, NUM_IMG_EXTS ),
846//  MENU_ITEM(0x60,LANG_MENU_SUB_IN_DARK_VALUE,       MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.sub_in_dark_value, MENU_MINMAX(0, 1023) ),
847//  MENU_ITEM(0x60,LANG_MENU_SUB_OUT_DARK_VALUE,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.sub_out_dark_value, MENU_MINMAX(0, 1023) ),
848    MENU_ITEM(0x2a,LANG_MENU_RAW_DEVELOP,             MENUITEM_PROC,      gui_raw_develop, 0 ),
849    MENU_ITEM(0x5c,LANG_MENU_BAD_PIXEL_REMOVAL,       MENUITEM_ENUM,      gui_bad_pixel_enum, 0 ),
850#if DNG_SUPPORT
851    MENU_ITEM(0x5c,LANG_MENU_DNG_FORMAT,              MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_raw , (int)cb_change_dng ),
852    MENU_ITEM(0x5c,LANG_MENU_RAW_DNG_EXT,             MENUITEM_BOOL,      &conf.raw_dng_ext, 0 ),
853    MENU_ITEM(0x2a,LANG_MENU_BADPIXEL_CREATE,         MENUITEM_PROC,      gui_menuproc_badpixel_create, 0 ),
854#endif
855    MENU_ITEM(0x5c,LANG_MENU_RAW_CACHED,              MENUITEM_BOOL,      &conf.raw_cache, 0 ),
856    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
857    {0}
858};
859static CMenu raw_submenu = {0x24,LANG_MENU_RAW_TITLE, NULL, raw_submenu_items };
860
861
862static const char* gui_zebra_mode_modes[] = { "Blink 1", "Blink 2", "Blink 3", "Solid", "Zebra 1", "Zebra 2" };
863static const char* gui_zebra_draw_osd_modes[] = { "Nothing", "Histo", "OSD" };
864static CMenuItem zebra_submenu_items[] = {
865    MENU_ITEM(0x5c,LANG_MENU_ZEBRA_DRAW,              MENUITEM_BOOL,                            &conf.zebra_draw, 0 ),
866    MENU_ENUM2(0x5f,LANG_MENU_ZEBRA_MODE,             &conf.zebra_mode, gui_zebra_mode_modes ),
867    MENU_ITEM(0x58,LANG_MENU_ZEBRA_UNDER,             MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zebra_under,   MENU_MINMAX(0, 32) ),
868    MENU_ITEM(0x57,LANG_MENU_ZEBRA_OVER,              MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zebra_over,    MENU_MINMAX(0, 32) ),
869    MENU_ITEM(0x28,LANG_MENU_ZEBRA_RESTORE_SCREEN,    MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,      &conf.zebra_restore_screen,     (int)cb_zebra_restore_screen ),
870    MENU_ITEM(0x5c,LANG_MENU_ZEBRA_RESTORE_OSD,       MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,      &conf.zebra_restore_osd,        (int)cb_zebra_restore_osd ),
871    MENU_ENUM2(0x5f,LANG_MENU_ZEBRA_DRAW_OVER,        &conf.zebra_draw_osd, gui_zebra_draw_osd_modes ),
872    MENU_ITEM(0x5c,LANG_MENU_ZEBRA_MULTICHANNEL,      MENUITEM_BOOL,                            &conf.zebra_multichannel, 0 ),
873    MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ),
874    {0}
875};
876static CMenu zebra_submenu = {0x26,LANG_MENU_ZEBRA_TITLE, NULL, zebra_submenu_items };
877
878#ifdef OPT_CURVES
879static CMenuItem curve_submenu_items[] = {
880    MENU_ITEM(0x5f,LANG_MENU_CURVE_ENABLE,        MENUITEM_ENUM,      gui_conf_curve_enum, 0 ),
881    MENU_ITEM(0x35,LANG_MENU_CURVE_LOAD,          MENUITEM_PROC,      gui_load_curve, 0 ),
882    MENU_ITEM(0x51,LANG_MENU_BACK,                MENUITEM_UP, 0, 0 ),
883    {0}
884};
885static CMenu curve_submenu = {0x85,LANG_MENU_CURVE_PARAM_TITLE, NULL, curve_submenu_items };
886#endif
887
888static CMenuItem root_menu_items[] = {
889    MENU_ITEM(0x21,LANG_MENU_OPERATION_PARAM,         MENUITEM_SUBMENU,   &operation_submenu, 0 ),
890    MENU_ITEM(0x23,LANG_MENU_VIDEO_PARAM,             MENUITEM_SUBMENU,   &video_submenu, 0 ),
891    MENU_ITEM(0x24,LANG_MENU_MAIN_RAW_PARAM,          MENUITEM_SUBMENU,   &raw_submenu, 0 ),
892#ifdef OPT_EDGEOVERLAY
893    MENU_ITEM(0x7f,LANG_MENU_EDGE_OVERLAY,         MENUITEM_SUBMENU,   &edge_overlay_submenu, 0 ),
894#endif
895#ifdef OPT_CURVES
896    MENU_ITEM(0x85,LANG_MENU_CURVE_PARAM,             MENUITEM_SUBMENU,   &curve_submenu, 0 ),
897#endif
898    MENU_ITEM(0x25,LANG_MENU_MAIN_HISTO_PARAM,        MENUITEM_SUBMENU,   &histo_submenu, 0 ),
899    MENU_ITEM(0x26,LANG_MENU_MAIN_ZEBRA_PARAM,        MENUITEM_SUBMENU,   &zebra_submenu, 0 ),
900    MENU_ITEM(0x22,LANG_MENU_MAIN_OSD_PARAM,          MENUITEM_SUBMENU,   &osd_submenu, 0 ),
901    MENU_ITEM(0x28,LANG_MENU_MAIN_VISUAL_PARAM,       MENUITEM_SUBMENU,   &visual_submenu, 0 ),
902#ifdef OPT_SCRIPTING
903    MENU_ITEM(0x27,LANG_MENU_MAIN_SCRIPT_PARAM,       MENUITEM_SUBMENU,   &script_submenu, 0 ),
904#endif
905    MENU_ITEM(0x29,LANG_MENU_MAIN_MISC,               MENUITEM_SUBMENU,   &misc_submenu, 0 ),
906#ifndef OPTIONS_AUTOSAVE
907    MENU_ITEM(0x33,LANG_MENU_MAIN_SAVE_OPTIONS,       MENUITEM_PROC,      gui_menuproc_save, 0 ),
908#endif
909    {0}
910};
911
912static CMenu root_menu = {0x20,LANG_MENU_MAIN_TITLE, NULL, root_menu_items };
913
914static int gui_user_menu_flag;
915
916void rinit(){
917        // Erase screen if switching from user menu to main menu
918        // in case the user menu is larger than the main menu
919        // otherwise it leaves remnants of the user menu above and below
920        // the main menu.
921    draw_restore();
922        gui_menu_init(&root_menu);
923}
924
925//-------------------------------------------------------------------
926void
927mod_user_menu(CMenuItem curr_menu_item, int* cur_memnu_item_indx, int mod) {
928int i;
929CMenuItem tmp_menu_item;
930        switch(mod) {
931
932                case 0:
933                        /*
934                         * Delete user menu entry by sliding all the lower valid/existing entries up.
935                         */
936
937                        if (*cur_memnu_item_indx == 0) /* don't allow deleting "user menu" */
938                                break;
939                        for(i = *cur_memnu_item_indx; user_submenu_items[i].text; i++) {
940                                user_submenu_items[i] = user_submenu_items[i+1];
941                        }
942
943                        /*
944                         * there were no valid entries below this one, so
945                         * the index pointer must be decremented.
946                         */
947                        if(!user_submenu_items[*cur_memnu_item_indx].text)
948                                *cur_memnu_item_indx -= 1;
949
950                        break;
951
952                case 1:
953                        /*
954                         * Insert new Item at end of existing entries
955                         */
956                        for(i = 1; i < USER_MENU_ITEMS + 1; i++) {
957                                if(!user_submenu_items[i].text) {
958                                        user_submenu_items[i] = curr_menu_item;
959                                        break;
960                                }
961                        }
962                        break;
963
964                case 2:
965                        /*
966                         * Move entry up
967                         */
968
969                        if((*cur_memnu_item_indx > 1)) {
970                                tmp_menu_item = user_submenu_items[*cur_memnu_item_indx -1];
971                                user_submenu_items[*cur_memnu_item_indx -1] = user_submenu_items[*cur_memnu_item_indx];
972                                user_submenu_items[*cur_memnu_item_indx] = tmp_menu_item;
973                                *cur_memnu_item_indx -=1;
974                        }
975                        break;
976
977                case 3:
978                        /*
979                         * Move entry down below next entry if next entry is not empty
980                         */
981                        if (*cur_memnu_item_indx == 0) /* don't allow moving "user menu" */
982                                break;
983                        if((*cur_memnu_item_indx < (USER_MENU_ITEMS)) && (user_submenu_items[*cur_memnu_item_indx +1].text)) {
984                                tmp_menu_item = user_submenu_items[*cur_memnu_item_indx +1];
985                                user_submenu_items[*cur_memnu_item_indx + 1] = user_submenu_items[*cur_memnu_item_indx];
986                                user_submenu_items[*cur_memnu_item_indx] = tmp_menu_item;
987                                *cur_memnu_item_indx +=1;
988                        }
989                        break;
990
991        }
992}
993
994//-------------------------------------------------------------------
995void cb_step_25() {
996    voltage_step = (conf.batt_step_25)?25:1;
997}
998
999void cb_perc() {
1000    conf.batt_volts_show=0;
1001}
1002
1003void cb_volts() {
1004    conf.batt_perc_show=0;
1005}
1006
1007void cb_space_perc() {
1008    conf.space_mb_show=0;
1009}
1010
1011void cb_space_mb() {
1012    conf.space_perc_show=0;
1013}
1014
1015void cb_battery_menu_change(unsigned int item) {
1016    switch (item) {
1017        case 0: //Voltage MAX
1018            if (conf.batt_volts_max<conf.batt_volts_min+25) {
1019                conf.batt_volts_min = conf.batt_volts_max-25;
1020            }
1021            break;
1022        case 1: //Voltage MIN
1023            if (conf.batt_volts_min>conf.batt_volts_max-25) {
1024                conf.batt_volts_max = conf.batt_volts_min+25;
1025            }
1026            break;
1027        default:
1028            break;
1029    }
1030}
1031
1032void cb_zebra_restore_screen() {
1033    if (!conf.zebra_restore_screen)
1034        conf.zebra_restore_osd = 0;
1035}
1036
1037void cb_zebra_restore_osd() {
1038    if (conf.zebra_restore_osd)
1039        conf.zebra_restore_screen = 1;
1040}
1041
1042#if DNG_SUPPORT
1043void cb_change_dng(){
1044 int old=conf.dng_raw;
1045 conf_change_dng();
1046 if ((old==1) && (conf.dng_raw==0)) gui_mbox_init(LANG_ERROR, LANG_CANNOT_OPEN_BADPIXEL_FILE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1047}
1048
1049void gui_menuproc_badpixel_create(int arg) {
1050    create_badpixel_bin();
1051}
1052#endif
1053
1054#if defined (DNG_EXT_FROM)
1055void cb_change_dng_usb_ext(){
1056 if (conf.dng_usb_ext) change_ext_to_dng(); else change_ext_to_default();
1057}
1058#endif
1059
1060/*
1061common code for "enum" menu items that just take a list of string values and don't require any special setters
1062would be better to have another menu item type that does this by default
1063save memory by eliminating dupe code
1064*/
1065static void gui_enum_value_change(int *value, int change, unsigned num_items) {
1066    *value+=change;
1067    if (*value<0)
1068        *value = num_items-1;
1069    else if (*value>=num_items)
1070        *value = 0;
1071}
1072static const char* gui_change_simple_enum(int* value, int change, const char** items, unsigned num_items) {
1073        gui_enum_value_change(value, change, num_items);
1074    return items[*value];
1075}
1076const char* gui_change_enum2(const CMenuItem *menu_item, int change)
1077{
1078    const char** items = (const char**)menu_item->arg;
1079        gui_enum_value_change(menu_item->value, change, menu_item->opt_len);
1080    return items[*menu_item->value];
1081}
1082
1083//-------------------------------------------------------------------
1084#ifdef OPT_CURVES
1085const char* gui_conf_curve_enum(int change, int arg) {
1086    static const char* modes[]={ "None", "Custom", "+1EV", "+2EV", "Auto DR" };
1087
1088    gui_enum_value_change(&conf.curve_enable,change,sizeof(modes)/sizeof(modes[0]));
1089
1090        if(change && curve_init_mode)
1091                curve_init_mode();
1092    return modes[conf.curve_enable];
1093}
1094#endif
1095
1096#ifdef OPT_SCRIPTING
1097//-------------------------------------------------------------------
1098const char* gui_script_param_set_enum(int change, int arg) {
1099    static const char* modes[]={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
1100
1101    if (change != 0) {
1102        if (conf.script_param_save) {
1103            save_params_values(0);
1104        }
1105                gui_enum_value_change(&conf.script_param_set,change,sizeof(modes)/sizeof(modes[0]));
1106
1107        if (!load_params_values(conf.script_file, 1, 0))
1108            script_load(conf.script_file, 0);
1109        gui_update_script_submenu();
1110    }
1111
1112    return modes[conf.script_param_set];
1113}
1114
1115//-------------------------------------------------------------------
1116void gui_update_script_submenu() {
1117    register int p=0, i;
1118
1119    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) {
1120        script_submenu_items[p]=script_submenu_items_top[i];
1121    }
1122    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) {
1123        if (script_param_order[i]) {
1124            script_submenu_items[p].symbol=0x0;
1125            script_submenu_items[p].text=(int)script_params[script_param_order[i]-1];
1126            script_submenu_items[p].type=MENUITEM_INT;
1127            script_submenu_items[p].value=&conf.script_vars[script_param_order[i]-1];
1128            ++p;
1129        }
1130    }
1131    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) {
1132        script_submenu_items[p]=script_submenu_items_bottom[i];
1133    }
1134}
1135
1136//-------------------------------------------------------------------
1137static void gui_load_script_selected(const char *fn) {
1138    if (fn)
1139        script_load(fn, 1);
1140}
1141
1142void gui_load_script(int arg) {
1143    module_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, conf.script_file, "A/CHDK/SCRIPTS", gui_load_script_selected);
1144}
1145
1146void gui_load_script_default(int arg) {
1147    script_load(conf.script_file, 0);
1148    if (conf.script_param_save) {
1149        save_params_values(1);
1150    }
1151}
1152#endif
1153
1154//-------------------------------------------------------------------
1155const char* gui_override_disable_enum(int change, int arg) {
1156        return gui_change_simple_enum(&conf.override_disable,change,gui_override_disable_modes,sizeof(gui_override_disable_modes)/sizeof(gui_override_disable_modes[0]));
1157}
1158
1159//-------------------------------------------------------------------
1160const char* gui_histo_mode_enum(int change, int arg) {
1161    static const char* modes[]={ "Linear", "Log" };
1162
1163        gui_enum_value_change(&conf.histo_mode,change,sizeof(modes)/sizeof(modes[0]));
1164
1165    histogram_set_mode(conf.histo_mode);
1166
1167    return modes[conf.histo_mode];
1168}
1169
1170//-------------------------------------------------------------------
1171const char* gui_histo_layout_enum(int change, int arg) {
1172    static const char* modes[]={ "RGB", "Y", "RGB Y",  "R G B", "RGB all", "Y all", "Blend", "Blend Y"};
1173
1174        gui_enum_value_change(&conf.histo_layout,change,sizeof(modes)/sizeof(modes[0]));
1175
1176    if (conf.histo_layout==OSD_HISTO_LAYOUT_Y || conf.histo_layout==OSD_HISTO_LAYOUT_Y_argb) {
1177        histogram_set_main(HISTO_Y);
1178    } else {
1179        histogram_set_main(HISTO_RGB);
1180    }
1181
1182    return modes[conf.histo_layout];
1183}
1184
1185//-------------------------------------------------------------------
1186const char* gui_font_enum(int change, int arg) {
1187    static const char* fonts[]={ "Win1250", "Win1251", "Win1252", "Win1253", "Win1254", "Win1257"};
1188
1189        gui_enum_value_change(&conf.font_cp,change,sizeof(fonts)/sizeof(fonts[0]));
1190
1191    if (change != 0) {
1192        font_set(conf.font_cp);
1193        if (!rbf_load(conf.menu_rbf_file))
1194            rbf_load_from_8x16(current_font);
1195        rbf_set_codepage(FONT_CP_WIN);
1196        gui_menu_init(NULL);
1197    }
1198
1199    return fonts[conf.font_cp];
1200}
1201
1202//-------------------------------------------------------------------
1203#ifdef  CAM_TOUCHSCREEN_UI
1204
1205const char* gui_on_off_enum(int change, int *conf_val)
1206{
1207    static const char* modes[]={ "Off", "On"};
1208        return gui_change_simple_enum(conf_val,change,modes,sizeof(modes)/sizeof(modes[0]));
1209}
1210
1211#endif
1212
1213//-------------------------------------------------------------------
1214const char* gui_nd_filter_state_enum(int change, int arg) {
1215        return gui_change_simple_enum(&conf.nd_filter_state,change,gui_nd_filter_state_modes,sizeof(gui_nd_filter_state_modes)/sizeof(gui_nd_filter_state_modes[0]));
1216}
1217
1218const char* gui_histo_show_enum(int change, int arg) {
1219        return gui_change_simple_enum(&conf.show_histo,change,gui_histo_show_modes,sizeof(gui_histo_show_modes)/sizeof(gui_histo_show_modes[0]));
1220}
1221
1222//-------------------------------------------------------------------
1223#if CAM_ADJUSTABLE_ALT_BUTTON
1224const char* gui_alt_mode_button_enum(int change, int arg) {
1225#if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_s5is)
1226    static const char* names[]={ "Shrtcut", "Flash", "Timer", "ISO", "Video" };
1227    static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_TIMER, KEY_ISO, KEY_VIDEO };
1228#elif defined(CAMERA_g7) || defined(CAMERA_g9)
1229    static const char* names[]={ "Print", "FE"};
1230    static const int keys[]={ KEY_PRINT, KEY_MICROPHONE };
1231#elif defined(CAMERA_g10) || defined(CAMERA_g12) 
1232    static const char* names[]={ "Print", "Disp",  "AE Lock", "Jump" };
1233    static const int keys[]={ KEY_PRINT, KEY_DISPLAY, KEY_AE_LOCK, KEY_METERING};
1234#elif defined(CAMERA_g11)
1235    static const char* names[]={ "Print", "Disp",  "AE Lock", "Jump" };
1236    static const int keys[]={ KEY_PRINT, KEY_DISPLAY, KEY_MICROPHONE, KEY_METERING};   
1237#elif defined(CAMERA_ixus65_sd630)
1238    static const char* names[]={ "Print", "Disp"};
1239    static const int keys[]={ KEY_PRINT, KEY_DISPLAY };
1240#elif defined(CAMERA_a650)
1241    static const char* names[]={ "Print", "ISO"};
1242    static const int keys[]={ KEY_PRINT, KEY_ISO };
1243#elif defined(CAMERA_sx100is) || defined(CAMERA_sx110is)
1244    static const char* names[]={ "Print", "Face"};
1245    static const int keys[]={ KEY_PRINT, KEY_FACE };
1246#elif defined(CAMERA_sx10) || defined(CAMERA_sx1) || defined(CAMERA_sx20) || defined(CAMERA_sx30) || defined(CAMERA_sx40hs)
1247    static const char* names[]={ "Shrtcut", "Flash", "Video"};
1248    static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_VIDEO };
1249#elif defined(CAMERA_a570) || defined(CAMERA_a580) || defined(CAMERA_a590) || defined(CAMERA_a720)
1250    static const char* names[]={ "Print", "Display"};
1251    static const int keys[] = {KEY_PRINT, KEY_DISPLAY};
1252#elif defined(CAMERA_sx220hs) || defined(CAMERA_sx230hs)
1253    static const char* names[]={ "Disp+Set", "Display", "Playback", "Video"};
1254    static const int keys[] = {KEY_PRINT, KEY_DISPLAY, KEY_PLAYBACK, KEY_VIDEO};
1255#elif defined(CAMERA_ixus220_elph300hs)
1256    static const char* names[]={ "Video", "Display", "Playback", "Video"};
1257    static const int keys[] = {KEY_PRINT, KEY_DISPLAY, KEY_PLAYBACK, KEY_VIDEO};
1258#else
1259    #error camera alt-buttons not defined
1260#endif
1261    int i;
1262
1263    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
1264        if (conf.alt_mode_button==keys[i]) {
1265            break;
1266        }
1267    }
1268
1269    i+=change;
1270    if (i<0)
1271        i=(sizeof(names)/sizeof(names[0]))-1;
1272    else if (i>=(sizeof(names)/sizeof(names[0])))
1273        i=0;
1274
1275    conf.alt_mode_button = keys[i];
1276    kbd_set_alt_mode_key_mask(conf.alt_mode_button);
1277    return names[i];
1278}
1279#endif
1280
1281//-------------------------------------------------------------------
1282const char* gui_alt_power_enum(int change, int arg) {
1283// Script option is retained even if scripting is disabled, otherwise conf values will change
1284// Equivalent to ALT
1285    static const char* modes[]={ "Never", "Alt", "Script", "Always" };
1286        gui_enum_value_change(&conf.alt_prevent_shutdown,change,sizeof(modes)/sizeof(modes[0]));
1287
1288        conf_update_prevent_shutdown();
1289
1290    return modes[conf.alt_prevent_shutdown];
1291}
1292
1293//-------------------------------------------------------------------
1294const char* gui_video_bitrate_enum(int change, int arg) {
1295        gui_enum_value_change(&conf.video_bitrate,change,VIDEO_BITRATE_STEPS);
1296
1297    shooting_video_bitrate_change(conf.video_bitrate);
1298
1299    return video_bitrate_strings[conf.video_bitrate];
1300}
1301
1302
1303//-------------------------------------------------------------------
1304const char* gui_tv_override_koef_enum(int change, int arg) {
1305    static const char* modes[]={"Off", "1/100K", "1/10000", "1/1000","1/100","1/10", "1","10","100"};
1306
1307    conf.tv_override_koef+=change;
1308   if (conf.tv_enum_type) {
1309     if (conf.tv_override_koef<0)  conf.tv_override_koef=6;
1310     else if (conf.tv_override_koef>6) conf.tv_override_koef=0;
1311     else if (conf.tv_override_koef==1)  conf.tv_override_koef=6;
1312     else if (conf.tv_override_koef==5)  conf.tv_override_koef=0;
1313     else if (conf.tv_override_koef!=0 && conf.tv_override_koef!=6) conf.tv_override_koef=6;
1314     }
1315   else {
1316    if (conf.tv_override_koef<0)
1317        conf.tv_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1318    else if (conf.tv_override_koef>=(sizeof(modes)/sizeof(modes[0])))
1319        conf.tv_override_koef=0;
1320    }
1321
1322    return modes[conf.tv_override_koef];
1323}
1324
1325const char* gui_tv_override_value_enum(int change, int arg) {
1326        /*
1327    static const char* modes[]={
1328    // add very long time exposures as approximately powers of 2, adding 15 exposures
1329    "2048","1625","1290","1024","812","645","512","406","322","256","203","161","128","101","80",
1330                "64","50.8", "40.3", "32", "25.4","20","16", "12.7", "10","8", "6.3","5","4","3.2", "2.5","2", "1.6", "1.3", "1", "0.8", "0.6", "0.5", "0.4", "0.3", "1/4", "1/5", "1/6", "1/8", "1/10", "1/13", "1/15", "1/20", "1/25", "1/30", "1/40", "1/50", "1/60", "1/80", "1/100", "1/125", "1/160", "1/200", "1/250", "1/320", "1/400", "1/500", "1/640","1/800", "1/1000", "1/1250", "1/1600","1/2000","1/2500","1/3200","1/4000", "1/5000", "1/6400", "1/8000", "1/10000", "1/12500", "1/16000", "1/20000", "1/25000", "1/32000", "1/40000", "1/50000", "1/64000","1/80000", "1/100k"};
1331                */
1332    static char buf[4];
1333
1334        // XXX This array above is redundant with platform/generic/shooting.c, this should be avoided!
1335    conf.tv_override_value+=change;
1336    if (conf.tv_enum_type) {
1337       if (conf.tv_override_value<0) {
1338          conf.tv_override_value=tv_override_amount-1;
1339        }
1340       else if ((unsigned)conf.tv_override_value>=(tv_override_amount))
1341         conf.tv_override_value=0;
1342       return tv_override[conf.tv_override_value];
1343     }
1344     else
1345      {
1346       if (conf.tv_override_value<0) {
1347          conf.tv_override_value=100;
1348        }
1349       else if (conf.tv_override_value>100)  conf.tv_override_value=0;
1350       sprintf(buf, "%d",  conf.tv_override_value);
1351       return buf;
1352      }
1353}
1354
1355const char* gui_tv_enum_type_enum(int change, int arg) {
1356    static const char* modes[]={"Factor", "Ev Step"};
1357
1358    gui_enum_value_change(&conf.tv_enum_type,change,sizeof(modes)/sizeof(modes[0]));
1359    if (change) {
1360        conf.tv_override_koef=6;
1361        if (conf.tv_enum_type)
1362            conf.tv_override_value=tv_override_zero_shift;
1363        else conf.tv_override_value=1;
1364    }
1365    return modes[conf.tv_enum_type];
1366}
1367
1368const char* gui_subj_dist_override_value_enum(int change, int arg) {
1369        static const int koef[] = {0, 1,10,100,1000};
1370    static char buf[8];
1371    conf.subj_dist_override_value+=(change*koef[conf.subj_dist_override_koef]);
1372    if (conf.subj_dist_override_value<0)
1373        conf.subj_dist_override_value=MAX_DIST;
1374    else if (conf.subj_dist_override_value>MAX_DIST)
1375        conf.subj_dist_override_value=0;
1376    sprintf(buf, "%d", (int)conf.subj_dist_override_value);
1377    return buf;
1378}
1379
1380
1381const char* gui_subj_dist_override_koef_enum(int change, int arg) {
1382        return gui_change_simple_enum(&conf.subj_dist_override_koef,change,gui_override_koef_modes,sizeof(gui_override_koef_modes)/sizeof(gui_override_koef_modes[0]));
1383}
1384
1385/*
1386const char* gui_tv_exposure_order_enum(int change, int arg) {
1387    static const char* modes[]={ "Off", "1","2", "3"};
1388
1389    conf.tv_exposure_order+=change;
1390    if (conf.tv_exposure_order<0)
1391        conf.tv_exposure_order=0;
1392    else if (conf.tv_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1393        conf.tv_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1394    if((conf.tv_exposure_order>0) && (conf.av_exposure_order==conf.tv_exposure_order))
1395     {
1396       conf.av_exposure_order=0;
1397     }
1398    if((conf.tv_exposure_order>0) && (conf.iso_exposure_order==conf.tv_exposure_order))
1399     {
1400       conf.iso_exposure_order=0;
1401     }
1402
1403    return modes[conf.tv_exposure_order];
1404}
1405
1406const char* gui_av_exposure_order_enum(int change, int arg) {
1407    static const char* modes[]={ "Off", "1","2", "3"};
1408
1409    conf.av_exposure_order+=change;
1410    if (conf.av_exposure_order<0)
1411        conf.av_exposure_order=0;
1412    else if (conf.av_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1413        conf.av_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1414    if((conf.av_exposure_order>0) && (conf.tv_exposure_order==conf.av_exposure_order))
1415     {
1416       conf.tv_exposure_order=0;
1417     }
1418    if((conf.av_exposure_order>0) && (conf.iso_exposure_order==conf.av_exposure_order))
1419     {
1420       conf.iso_exposure_order=0;
1421     }
1422    return modes[conf.av_exposure_order];
1423}
1424
1425const char* gui_iso_exposure_order_enum(int change, int arg) {
1426    static const char* modes[]={ "Off", "1","2", "3"};
1427
1428    conf.iso_exposure_order+=change;
1429    if (conf.iso_exposure_order<0)
1430        conf.iso_exposure_order=0;
1431    else if (conf.iso_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1432        conf.iso_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1433    if((conf.iso_exposure_order>0) && (conf.tv_exposure_order==conf.iso_exposure_order))
1434     {
1435       conf.tv_exposure_order=0;
1436     }
1437    if((conf.iso_exposure_order>0) && (conf.av_exposure_order==conf.iso_exposure_order))
1438     {
1439       conf.av_exposure_order=0;
1440     }
1441
1442    return modes[conf.iso_exposure_order];
1443}
1444*/
1445const char* gui_av_override_enum(int change, int arg) {
1446    static char buf[8];
1447    short prop_id;
1448    conf.av_override_value+=change;
1449    if (conf.av_override_value<0) conf.av_override_value=shooting_get_aperture_sizes_table_size()+6;
1450    else if (conf.av_override_value>shooting_get_aperture_sizes_table_size()+6) conf.av_override_value=0;
1451    if (conf.av_override_value == 0)  return "Off";
1452    else {
1453     short prop_id=shooting_get_aperture_from_av96(shooting_get_av96_override_value());
1454         sprintf(buf, "%d.%02d", (int)prop_id/100, (int)prop_id%100 );
1455         return buf;
1456        }
1457}
1458
1459#if ZOOM_OVERRIDE
1460const char* gui_zoom_override_enum(int change, int arg) {
1461    static char buf[3];
1462    conf.zoom_override_value+=change;
1463    if (conf.zoom_override_value<0) conf.zoom_override_value=zoom_points-1;
1464    else if (conf.zoom_override_value>zoom_points-1) conf.zoom_override_value=0;
1465                sprintf(buf,"%i",conf.zoom_override_value);
1466                return buf;
1467}
1468#endif
1469
1470const char* gui_user_menu_show_enum(int change, int arg) {
1471    static const char* modes[]={ "Off", "On","On Direct", "Edit" };
1472
1473        if (conf.user_menu_enable == 3) user_menu_save();
1474        return gui_change_simple_enum(&conf.user_menu_enable,change,modes,sizeof(modes)/sizeof(modes[0]));
1475}
1476
1477const char* gui_video_af_key_enum(int change, int arg){
1478#if CAMERA_g12
1479    static const char* names[]={ "", "Shutter", "Set", "AE Lock"};
1480    static const int keys[]={0, KEY_SHOOT_HALF, KEY_SET, KEY_AE_LOCK };
1481#else
1482    static const char* names[]={ "", "Shutter", "Set"};
1483    static const int keys[]={0, KEY_SHOOT_HALF, KEY_SET };
1484#endif
1485    int i;
1486
1487    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
1488        if (conf.video_af_key==keys[i]) {
1489            break;
1490        }
1491    }
1492
1493    i+=change;
1494    if (i<0)
1495        i=(sizeof(names)/sizeof(names[0]))-1;
1496    else if (i>=(sizeof(names)/sizeof(names[0])))
1497        i=0;
1498
1499    conf.video_af_key = keys[i];
1500    return names[i];
1501}
1502
1503const char* gui_bad_pixel_enum(int change, int arg) {
1504    int modes[]={LANG_MENU_BAD_PIXEL_OFF, LANG_MENU_BAD_PIXEL_INTERPOLATION, LANG_MENU_BAD_PIXEL_RAW_CONVERTER};
1505        return lang_str((int)gui_change_simple_enum(&conf.bad_pixel_removal,change,(const char **)modes,sizeof(modes)/sizeof(modes[0])));
1506}
1507
1508//-------------------------------------------------------------------
1509
1510void raw_fselect_cb(const char * filename){
1511 struct stat st;
1512 if (!filename) return;
1513 stat((char*)filename,&st);
1514 if (st.st_size!=hook_raw_size()) return;
1515 gui_mbox_init((int)"", LANG_RAW_DEVELOP_MESSAGE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1516 raw_prepare_develop((char*)filename);
1517}
1518
1519//-------------------------------------------------------------------
1520void gui_raw_develop(int arg){
1521 int m=mode_get();
1522 module_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", "A", raw_fselect_cb);
1523}
1524
1525//-------------------------------------------------------------------
1526
1527static void gui_menuproc_reset_files(int arg){
1528conf.lang_file[0] = 0;
1529conf.menu_symbol_rbf_file[0] = 0;
1530conf.menu_rbf_file[0] = 0;
1531conf_save();
1532gui_mbox_init(LANG_INFORMATION, LANG_MENU_RESTART_CAMERA, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1533
1534}
1535
1536//-------------------------------------------------------------------
1537#ifdef OPT_DEBUGGING
1538#define TASKLIST_MAX_LINES 12 // probably as much as will fit on screen
1539#define TASKLIST_NUM_TASKS 64 // should be enough ?
1540static void gui_debug_draw_tasklist(void) {
1541#ifndef CAM_DRYOS
1542    int tasklist[TASKLIST_NUM_TASKS]; // max number of tasks we will look at
1543    char buf[40]; // a single line of the list
1544    int n_tasks,n_show_tasks,show_start;
1545    const char *name;
1546    int i;
1547    n_tasks = task_id_list_get(tasklist,sizeof(tasklist)/sizeof(tasklist[0]));
1548    show_start = debug_tasklist_start;
1549    n_show_tasks = n_tasks - show_start;
1550    // auto adjust to show the last N tasks
1551    if(n_show_tasks < TASKLIST_MAX_LINES) {
1552        show_start = n_tasks - TASKLIST_MAX_LINES;
1553        if(show_start<0)
1554            show_start = 0;
1555         n_show_tasks = n_tasks - show_start;
1556    }
1557    else if( n_show_tasks > TASKLIST_MAX_LINES ) {
1558        n_show_tasks = TASKLIST_MAX_LINES;
1559    }
1560    sprintf(buf,"%d-%d of %d tasks %c",show_start,show_start+n_show_tasks,n_tasks,debug_display_direction > 0?'+':'-');
1561    draw_string(64,0,buf, conf.osd_color);
1562    for( i = 0;  i < n_show_tasks; i++ ) {
1563        // TODO get full task info
1564        name = task_name(tasklist[show_start+i]);
1565        if ( !name || !*name ) {
1566            name = "(unknown)";
1567        }
1568        sprintf(buf,"%10s %8X",name,tasklist[show_start+i]);
1569        draw_string(64,16+16*i,buf, conf.osd_color);
1570    }
1571#endif //CAM_DRYOS
1572}
1573
1574#define DEBUG_DISPLAY_NONE 0
1575#define DEBUG_DISPLAY_PROPS 1
1576#define DEBUG_DISPLAY_PARAMS 2
1577#define DEBUG_DISPLAY_TASKS 3
1578
1579static void gui_debug_shortcut(void) {
1580    static int lastcall = -1;
1581    int t=get_tick_count();
1582    if ( lastcall != -1) {
1583        if (t-lastcall <= 400)
1584            debug_display_direction = -debug_display_direction;
1585    }
1586    lastcall=t;
1587    switch(conf.debug_shortcut_action) {
1588        case 1:
1589            dump_memory();
1590        break;
1591        case 2:
1592            if(conf.debug_display == DEBUG_DISPLAY_TASKS) {
1593                debug_tasklist_start += debug_display_direction*(TASKLIST_MAX_LINES-2); // a little intentional overlap
1594                if(debug_tasklist_start >= TASKLIST_NUM_TASKS || debug_tasklist_start < 0)
1595                    debug_tasklist_start = 0;
1596            }
1597            else if (conf.debug_display == DEBUG_DISPLAY_PROPS || conf.debug_display == DEBUG_DISPLAY_PARAMS) {
1598                conf.debug_propcase_page += debug_display_direction*1;
1599                if(conf.debug_propcase_page > 128 || conf.debug_propcase_page < 0)
1600                    conf.debug_propcase_page = 0;
1601            }
1602        break;
1603        case 3:
1604            gui_compare_props(1);
1605        break;
1606    }
1607}
1608
1609//-------------------------------------------------------------------
1610#endif
1611
1612#if CAM_MULTIPART
1613void card_break_proc(unsigned int btn){
1614 if (btn==MBOX_BTN_YES) create_partitions();
1615}
1616
1617
1618#ifdef OPT_DEBUGGING
1619static void gui_menuproc_break_card(int arg){
1620 gui_mbox_init(LANG_WARNING, LANG_PARTITIONS_CREATE_WARNING, MBOX_BTN_YES_NO|MBOX_DEF_BTN2|MBOX_TEXT_CENTER, card_break_proc);
1621}
1622#endif
1623
1624static void gui_menuproc_swap_partitions(int arg){
1625 if (get_part_count()<2) gui_mbox_init(LANG_ERROR, LANG_ONLY_ONE_PARTITION, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1626 else
1627        {
1628                swap_partitions();
1629                gui_mbox_init(LANG_INFORMATION, LANG_SOKOBAN_MSG_FINISH_TITLE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1630        }
1631}
1632#endif
1633
1634//-------------------------------------------------------------------
1635static volatile gui_mode_t gui_mode;    // current gui mode. if <GUI_MODE_LASTIDX - idx in guiHandlers (core modes), otherwise pointer to gui_handler object (module modes)
1636
1637static volatile int gui_restore;
1638static volatile int gui_in_redraw;
1639static int gui_splash, gui_splash_mode;
1640static char osd_buf[32];
1641#ifdef OPTIONS_AUTOSAVE
1642static Conf old_conf;
1643#endif
1644
1645extern gui_handler guiHandlers[];
1646
1647//-------------------------------------------------------------------
1648void gui_init()
1649{
1650    gui_set_mode(GUI_MODE_NONE);
1651    gui_restore = 0;
1652    gui_in_redraw = 0;
1653    if (conf.start_sound>0)
1654    {
1655        play_sound(4);
1656    }
1657    gui_splash = (conf.splash_show)?SPLASH_TIME:0;
1658    user_menu_restore();
1659    gui_lang_init();
1660    draw_init();
1661
1662    exposition_thresh = screen_size/500;
1663    voltage_step = (conf.batt_step_25)?25:1;
1664    load_bad_pixels_list("A/CHDK/badpixel");
1665    load_bad_pixels_list("A/CHDK/badpixel.txt");
1666#ifdef OPT_CURVES
1667        // initialize curves, loading files if required by current mode
1668        //curve_init_mode();    // @tsv it will be initialize on first load
1669#endif
1670#if ZOOM_OVERRIDE
1671// reyalp - need to do this in capt_seq
1672//              if (conf.zoom_override) shooting_set_zoom(conf.zoom_override_value);
1673#endif
1674}
1675
1676//-------------------------------------------------------------------
1677#ifdef OPT_CURVES
1678static void gui_load_curve_selected(const char *fn) {
1679        if (fn) {
1680                // TODO we could sanity check here, but curve_set_type should fail gracefullish
1681                strcpy(conf.curve_file,fn);
1682                if(conf.curve_enable == 1 && curve_init_mode)
1683                        curve_init_mode();
1684        }
1685}
1686
1687//-------------------------------------------------------------------
1688void gui_load_curve(int arg) {
1689    module_fselect_init(LANG_STR_SELECT_CURVE_FILE, conf.curve_file, CURVE_DIR, gui_load_curve_selected);
1690}
1691
1692#endif
1693
1694
1695// Small hack: use understandable name to reused data member
1696#define binded_gui_mode_ptr kbd_process
1697
1698//-------------------------------------------------------------------
1699gui_mode_t gui_get_mode() {
1700    if ( gui_mode >= GUI_MODE_COUNT )
1701        {
1702                int mode;
1703                for (mode=0;mode<GUI_MODE_COUNT;mode++)
1704                {
1705                        if ( (guiHandlers[mode].flags & GUI_MODE_FLAG_ALIAS) &&
1706                                        guiHandlers[mode].binded_gui_mode_ptr == (void*)gui_mode )
1707                                return mode;
1708                }
1709        }
1710    return gui_mode;
1711}
1712
1713//-------------------------------------------------------------------
1714void gui_set_mode(gui_mode_t mode)
1715{
1716        if ( gui_mode == mode )
1717                return;
1718
1719        if (  mode < GUI_MODE_COUNT &&
1720                  (guiHandlers[mode].flags & GUI_MODE_FLAG_ALIAS) )
1721        {
1722                mode = (unsigned int)guiHandlers[mode].binded_gui_mode_ptr;
1723        }
1724
1725        // Sanity check for case module pointer - is this really gui_handler
1726    if ( mode >= GUI_MODE_COUNT && ((gui_handler*)mode)->magicnum != GUI_MODE_MAGICNUM ) {
1727                // If sanity failed (module is unload) - set to default mode
1728        gui_mode = GUI_MODE_NONE;
1729                draw_restore();
1730                return;
1731        }
1732       
1733#ifdef CAM_TOUCHSCREEN_UI
1734    if (((gui_mode == 0) != (mode == 0)) ||                         // Change from GUI_MODE_NONE to any other or vice-versa
1735        ((gui_mode > GUI_MODE_MENU) != (mode > GUI_MODE_MENU)))     // Switch in & out of menu mode
1736        redraw_buttons = 1;
1737#endif
1738    gui_mode = mode;
1739}
1740
1741//-------------------------------------------------------------------
1742// PURPOSE: bind module struct to
1743// RETUN: 0 - fail, 1 - ok
1744int gui_bind_mode(int core_mode, gui_handler* handler) {
1745
1746        // sanity checks
1747    if ( core_mode >= GUI_MODE_COUNT ||
1748                (guiHandlers[core_mode].flags & GUI_MODE_FLAG_ALIAS)==0
1749           )
1750                return 0;
1751
1752        if ( handler && handler->magicnum != GUI_MODE_MAGICNUM )
1753                return 0;
1754
1755        // check is this module is already binded (loaded with different name)
1756        gui_handler* bind_gui_handler = (gui_handler*)guiHandlers[core_mode].binded_gui_mode_ptr;
1757        if ( bind_gui_handler && bind_gui_handler->magicnum == GUI_MODE_MAGICNUM )
1758                return 0;
1759
1760        guiHandlers[core_mode].binded_gui_mode_ptr = (void*)handler;
1761        return 1;
1762}
1763
1764#undef binded_gui_mode_ptr
1765
1766
1767//-------------------------------------------------------------------
1768void gui_force_restore() {
1769    gui_restore = gui_in_redraw;
1770}
1771
1772static void gui_handle_splash(void) {
1773        static char *logo = NULL;
1774    static int logo_size;
1775    if (gui_splash) {
1776                static int need_logo=1; // don't use logo ptr, since we don't want to keep re-trying
1777                if(need_logo) {
1778                const char *logo_name="A/CHDK/DATA/logo.dat";
1779            FILE *fd;
1780            struct stat st;
1781                        need_logo=0;
1782            if (stat(logo_name,&st) == 0) {
1783                                logo_size=st.st_size;
1784                                logo=malloc(logo_size);
1785                                if(logo) {
1786                                        fd = fopen(logo_name, "rb");
1787                                        if(fd){
1788                                                fread(logo,1,logo_size,fd);
1789                                                fclose(fd);
1790                                        }
1791                                        else {
1792                                                free(logo);
1793                                                logo=NULL;
1794                                        }
1795                }
1796                        }
1797                }
1798        if (gui_splash>(SPLASH_TIME-4)) {
1799            gui_draw_splash(logo,logo_size);
1800           //   conf.show_osd = 0;
1801        } else if (gui_splash==1 && (mode_get()&MODE_MASK) == gui_splash_mode && (gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT)) {
1802            draw_restore();
1803           // conf.show_osd = 1; //had to uncomment in order to fix a bug with disappearing osd...
1804        }
1805        --gui_splash;
1806                if(!gui_splash) {
1807                        free(logo);
1808                }
1809    }
1810}
1811
1812//-------------------------------------------------------------------
1813#ifdef OPTIONS_AUTOSAVE
1814
1815static void conf_store_old_settings() {
1816    old_conf=conf;
1817}
1818
1819static int conf_save_new_settings_if_changed() {
1820    if (memcmp(&old_conf, &conf, sizeof(Conf)) != 0) {
1821                user_menu_save();
1822        conf_save();
1823        conf_store_old_settings();
1824        return 1;
1825    }
1826    return 0;
1827}
1828
1829#endif
1830
1831//-------------------------------------------------------------------
1832void gui_chdk_draw()
1833{
1834    static int show_md_grid=0;
1835
1836    gui_draw_osd();
1837
1838#ifdef CAM_DISP_ALT_TEXT
1839    draw_txt_string(20, 14, "<ALT>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1840#endif
1841
1842#ifdef OPT_SCRIPTING
1843    if ((mode_get()&MODE_MASK) == MODE_REC)
1844    {
1845        draw_txt_string(0, 14, script_title, MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1846        if (state_kbd_script_run) show_md_grid=5;
1847        if (show_md_grid)
1848        {
1849            --show_md_grid;
1850            md_draw_grid();
1851        }
1852    }
1853#endif
1854
1855    console_draw();
1856}
1857
1858//-------------------------------------------------------------------
1859// Handler for Menu button press default - enter Menu mode
1860void gui_default_kbd_process_menu_btn()
1861{
1862    gui_set_mode(GUI_MODE_MENU);
1863    draw_restore();
1864}
1865
1866// Change SD override factor, direction = 1 to increase, -1 to decrease
1867// Only applies if camera has a Zoom lever
1868#if CAM_HAS_ZOOM_LEVER
1869static void sd_override_koef(int direction)
1870{
1871    gui_subj_dist_override_koef_enum(direction,0);
1872#if !CAM_HAS_MANUAL_FOCUS
1873    if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
1874#endif
1875    shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1876}
1877#endif
1878
1879// Change SD override by factor amount, direction = 1 to increase (zoom in), -1 to decrease (zoom out)
1880static void sd_override(int direction)
1881{
1882    gui_subj_dist_override_value_enum(direction,0);
1883    shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
1884}
1885
1886// Main button processing for CHDK Alt mode (not in MENU mode)
1887// This needs to be cleaned up, re-organised and commented !!!!
1888void gui_chdk_kbd_process()
1889{
1890#if !CAM_HAS_ERASE_BUTTON && CAM_CAN_SD_OVERRIDE        // ALT RAW toggle kbd processing if camera has SD override but no erase button
1891    if (kbd_is_key_clicked(SHORTCUT_TOGGLE_RAW))
1892    {
1893        if (conf.debug_shortcut_action > 0)
1894        {
1895#ifdef OPT_DEBUGGING
1896            gui_debug_shortcut();
1897#endif
1898        }
1899        // Check in manual focus mode
1900        else if (!shooting_get_common_focus_mode())
1901        {
1902            // Not manual focus mode so just update RAW save setting
1903            conf.save_raw = !conf.save_raw;
1904            draw_restore();
1905        }
1906        else
1907        {
1908            // In manual focus mode so update shooting distance
1909#if CAM_HAS_ZOOM_LEVER
1910            conf.subj_dist_override_value=MAX_DIST;
1911            shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1912#else
1913            if (conf.subj_dist_override_koef==4)
1914                gui_subj_dist_override_koef_enum(-3,0);
1915            else
1916                gui_subj_dist_override_koef_enum(1,0);
1917#endif
1918        }
1919    }
1920#else                                                   // ALT RAW toggle kbd processing if can't SD override or has erase button
1921    if (kbd_is_key_clicked(SHORTCUT_TOGGLE_RAW))
1922    {
1923        if (conf.debug_shortcut_action > 0)
1924        {
1925#ifdef OPT_DEBUGGING
1926            gui_debug_shortcut();
1927#endif
1928        }
1929        else
1930        {
1931            // Change RAW save state
1932            conf.save_raw = !conf.save_raw;
1933            draw_restore();
1934        }
1935    }
1936#endif
1937#ifdef OPT_SCRIPTING                                    // ALT Set button processing if scripting enabled - open script menu
1938    else if (kbd_is_key_clicked(KEY_SET))
1939    {
1940        gui_menu_init(&script_submenu);
1941        gui_default_kbd_process_menu_btn();
1942    }
1943#endif
1944#if CAM_CAN_SD_OVERRIDE                                 // ALT button processing if camera has SD override
1945    else
1946    {
1947#if !CAM_HAS_MANUAL_FOCUS
1948        if (kbd_is_key_clicked(SHORTCUT_MF_TOGGLE))     // Camera does not have manual focus
1949        {
1950            if (conf.subj_dist_override_koef>0)
1951                conf.subj_dist_override_koef=0;
1952            else conf.subj_dist_override_koef=1;
1953            draw_restore();
1954        }
1955        else
1956#endif
1957        if (shooting_get_common_focus_mode())           // Check in manual focus mode
1958        {
1959#if CAM_HAS_ZOOM_LEVER                                  // Camera has zoom lever, use left & right to change factor,up to set infinity
1960            if (kbd_is_key_clicked(KEY_RIGHT))
1961            {
1962                sd_override_koef(1);
1963            }
1964            else if (kbd_is_key_clicked(KEY_LEFT))
1965            {
1966                sd_override_koef(-1);
1967            }
1968            else if (kbd_is_key_clicked(SHORTCUT_SET_INFINITY))
1969            {
1970                conf.subj_dist_override_value=MAX_DIST;
1971                shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1972            }
1973            else
1974#endif
1975            if (kbd_is_key_clicked(SHORTCUT_SET_HYPERFOCAL))    // Set hyperfocal distance if down pressed
1976            {
1977                int m=mode_get()&MODE_SHOOTING_MASK;
1978                if ((m==MODE_M) || (m==MODE_AV))
1979                     conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance_f(shooting_get_aperture_from_av96(shooting_get_user_av96()),get_focal_length(lens_get_zoom_point()));
1980                else conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance();
1981                shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1982            }
1983            else
1984            {
1985                switch (kbd_get_autoclicked_key())
1986                {
1987#if CAM_HAS_ZOOM_LEVER
1988                case KEY_ZOOM_IN:
1989#else
1990                case KEY_RIGHT:
1991#endif
1992                    sd_override(1);
1993                    break;
1994#if CAM_HAS_ZOOM_LEVER
1995                case KEY_ZOOM_OUT:
1996#else
1997                case KEY_LEFT:
1998#endif
1999                    sd_override(-1);
2000                    break;
2001                }
2002            }
2003        }
2004    }
2005#endif
2006}
2007
2008//-------------------------------------------------------------------
2009// Handler for Menu button press in CHDK Alt mode (not in Menu mode)
2010// Enter main menu or user menu based on configuration
2011void gui_chdk_kbd_process_menu_btn()
2012{
2013    if (conf.user_menu_as_root && (conf.user_menu_enable != 0)) {
2014        if (kbd_is_key_pressed(KEY_SHOOT_HALF))
2015            gui_menu_init(&root_menu);
2016        else
2017            gui_menu_init(&user_submenu);
2018    }
2019    else {
2020        if ((conf.user_menu_enable != 0) && kbd_is_key_pressed(KEY_SHOOT_HALF))
2021            gui_menu_init(&user_submenu);
2022        else
2023            gui_menu_init(&root_menu);
2024    }
2025    gui_default_kbd_process_menu_btn();
2026}
2027
2028// Menu button handled for Menu mode
2029void gui_menu_kbd_process_menu_btn()
2030{
2031#ifdef OPTIONS_AUTOSAVE
2032    conf_save_new_settings_if_changed();
2033#endif
2034    if (gui_user_menu_flag)
2035    {
2036        gui_set_mode(GUI_MODE_MENU);
2037        gui_user_menu_flag = 0;
2038        gui_menu_init(&root_menu);
2039    }
2040    else
2041        gui_set_mode(GUI_MODE_ALT);
2042    draw_restore();
2043}
2044
2045//-------------------------------------------------------------------
2046// GUI handler table (entries must be in the same order and have the same number of entries as Gui_Mode enum)
2047gui_handler guiHandlers[GUI_MODE_COUNT] =
2048{
2049    /*GUI_MODE_NONE*/           { gui_draw_osd,         0,                          0,                                                          0,                                                                      GUI_MODE_MAGICNUM },
2050    /*GUI_MODE_ALT*/            { gui_chdk_draw,        gui_chdk_kbd_process,       gui_chdk_kbd_process_menu_btn,      0,                                                                      GUI_MODE_MAGICNUM },           
2051    /*GUI_MODE_MENU*/           { gui_menu_draw,        gui_menu_kbd_process,       gui_menu_kbd_process_menu_btn,      0,                                                                      GUI_MODE_MAGICNUM },
2052    /*GUI_MODE_ALIAS_PALETTE*/  { 0,                                    0,                                              0,                                                              GUI_MODE_FLAG_ALIAS,                            GUI_MODE_MAGICNUM },
2053    /*GUI_MODE_MBOX*/           { gui_mbox_draw,        gui_mbox_kbd_process,       0,                                                          GUI_MODE_FLAG_NORESTORE_ON_SWITCH,      GUI_MODE_MAGICNUM },
2054    /*GUI_MODE_ALIAS_FSELECT*/  { 0,                                    0,                                              0,                                                              GUI_MODE_FLAG_ALIAS,                            GUI_MODE_MAGICNUM },
2055    /*GUI_MODE_OSD*/            { gui_osd_draw,         gui_osd_kbd_process,        gui_default_kbd_process_menu_btn, 0,                                                                 GUI_MODE_MAGICNUM },           // THIS IS OSD LAYOUT EDITOR
2056    /*GUI_MODE_ALIAS_MPOPUP*/   { 0,                                    0,                                              0,                                                              GUI_MODE_FLAG_ALIAS,                            GUI_MODE_MAGICNUM },
2057};
2058
2059
2060//-------------------------------------------------------------------
2061// Main GUI redraw function, perform common initialisation then calls the redraw handler for the mode
2062void gui_redraw()
2063{
2064    static gui_mode_t gui_mode_prev_tick = GUI_MODE_NONE;
2065    gui_mode_t gui_mode_old;
2066
2067    static int flag_gui_enforce_redraw = 0;
2068
2069#ifdef CAM_DETECT_SCREEN_ERASE
2070    if (!draw_test_guard() && gui_mode)     // Attempt to detect screen erase in <Alt> mode, redraw if needed
2071    {
2072        draw_set_guard();
2073
2074                flag_gui_enforce_redraw |= GUI_REDRAWFLAG_ERASEGUARD;
2075        //gui_menu_force_redraw();
2076        //gui_fselect_force_redraw();   //@tsv
2077#ifdef CAM_TOUCHSCREEN_UI
2078        extern int redraw_buttons;
2079        redraw_buttons = 1;
2080#endif
2081    }
2082#endif
2083
2084        gui_handle_splash();
2085
2086    gui_in_redraw = 1;
2087    gui_mode_old = gui_mode;
2088
2089#ifdef CAM_TOUCHSCREEN_UI
2090    extern void virtual_buttons();
2091    virtual_buttons();
2092#endif
2093
2094    // Call redraw handler
2095        gui_handler* cur_gui_handler = (gui_mode<GUI_MODE_COUNT)? (&guiHandlers[gui_mode]) : (gui_handler*)gui_mode;
2096    if (cur_gui_handler->redraw) cur_gui_handler->redraw(flag_gui_enforce_redraw);
2097        flag_gui_enforce_redraw=0;
2098
2099    // Forced redraw if needed
2100    gui_in_redraw = 0;
2101        cur_gui_handler = (gui_mode<GUI_MODE_COUNT)? (&guiHandlers[gui_mode]) : (gui_handler*)gui_mode;
2102    if ((gui_mode_old != gui_mode
2103                        && (gui_mode_old != GUI_MODE_NONE && gui_mode_old != GUI_MODE_ALT)
2104                        && !(cur_gui_handler->flags & GUI_MODE_FLAG_NORESTORE_ON_SWITCH))
2105            || gui_restore )
2106        {
2107
2108        if (gui_restore)
2109                        flag_gui_enforce_redraw |= GUI_REDRAWFLAG_DRAW_RESTORED;
2110        gui_restore = 0;
2111
2112        if ( !( cur_gui_handler->flags & GUI_MODE_FLAG_NODRAWRESTORE) )
2113            draw_restore();
2114    }
2115
2116        if ( gui_mode_prev_tick != gui_mode ) {
2117                flag_gui_enforce_redraw |= GUI_REDRAWFLAG_MODE_WAS_CHANGED;
2118                gui_mode_prev_tick = gui_mode;
2119        }
2120}
2121
2122//-------------------------------------------------------------------
2123// Main kbd processing for GUI modes
2124void gui_kbd_process()
2125{
2126        gui_handler* cur_gui_handler = (gui_mode<GUI_MODE_COUNT)? (&guiHandlers[gui_mode]) : (gui_handler*)gui_mode;   
2127
2128    // Call menu button handler if menu button pressed
2129    if (kbd_is_key_clicked(KEY_MENU))
2130    {
2131        if (cur_gui_handler->kbd_process_menu_btn) cur_gui_handler->kbd_process_menu_btn();
2132        return;
2133    }
2134
2135    // Call mode handler for other buttons
2136    if (cur_gui_handler->kbd_process) cur_gui_handler->kbd_process();
2137}
2138
2139//-------------------------------------------------------------------
2140void gui_kbd_enter()
2141{
2142    // XXX set custom palette
2143#ifdef OPTIONS_AUTOSAVE
2144    conf_store_old_settings();
2145#endif
2146    gui_set_mode(GUI_MODE_ALT);
2147
2148        conf_update_prevent_shutdown();
2149
2150    vid_turn_off_updates();
2151
2152    // If user menu set to start automatically when <ALT> mode entered
2153    // then enter user menu mode, unless a script was paused by exiting
2154    // <ALT> mode when the script was running.
2155        gui_user_menu_flag = 0;
2156        if ((conf.user_menu_enable == 2) && !state_kbd_script_run) {
2157                gui_menu_init(&user_submenu);
2158                gui_set_mode(GUI_MODE_MENU);
2159                draw_restore();
2160                gui_user_menu_flag = 1;
2161        }
2162
2163}
2164
2165//-------------------------------------------------------------------
2166void gui_kbd_leave()
2167{
2168    // XXX restore palette
2169#ifdef OPTIONS_AUTOSAVE
2170    conf_save_new_settings_if_changed();
2171#endif
2172#ifdef OPT_UBASIC
2173    ubasic_error = UBASIC_E_NONE;
2174#endif
2175    draw_restore();
2176    rbf_set_codepage(FONT_CP_WIN);
2177    vid_turn_on_updates();
2178    gui_set_mode(GUI_MODE_NONE);
2179
2180        // Unload all modules which are marked as safe to unload
2181        module_async_unload_allrunned(0);
2182
2183        conf_update_prevent_shutdown();
2184}
2185//-------------------------------------------------------------------
2186
2187void other_kbd_process(){
2188 int key;
2189#if CAM_AF_SCAN_DURING_VIDEO_RECORD
2190
2191 if (movie_status==VIDEO_RECORD_IN_PROGRESS) {
2192  if (kbd_is_key_clicked(conf.video_af_key)) MakeAFScan();
2193 }
2194
2195#endif
2196
2197#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
2198 // return from digital to optical zoom in video
2199#if CAM_HAS_ZOOM_LEVER
2200   key=KEY_ZOOM_OUT;
2201#else
2202   key=KEY_DOWN;
2203#endif
2204    if (conf.unlock_optical_zoom_for_video && (movie_status==VIDEO_RECORD_IN_PROGRESS) &&  kbd_is_key_clicked(key)){
2205     short x;
2206     get_property_case(PROPCASE_DIGITAL_ZOOM_STATE, &x, sizeof(x));
2207     if (x) {
2208      get_property_case(PROPCASE_DIGITAL_ZOOM_POSITION, &x, sizeof(x));
2209#if defined (CAMERA_s90) || defined (CAMERA_s95) || defined (CAMERA_g12) || defined (CAMERA_a3000)
2210          if (x==0) zoom_status=ZOOM_OPTICAL_MAX; //ERR99: No zoom back from digital to optical zoom possible if set to medium
2211#else
2212          if (x==0) zoom_status=ZOOM_OPTICAL_MEDIUM;
2213#endif
2214
2215     }
2216    }
2217#endif
2218
2219#if CAM_EV_IN_VIDEO
2220    if ((movie_status==VIDEO_RECORD_IN_PROGRESS) && !kbd_is_key_pressed(KEY_SHOOT_HALF)){
2221#if CAM_HAS_ERASE_BUTTON
2222        if (kbd_is_key_clicked(KEY_ERASE)){
2223#else
2224#if !defined (CAMERA_a480)
2225        if (kbd_is_key_clicked(KEY_DISPLAY)){
2226#else
2227        if (kbd_is_key_clicked(KEY_MENU)){
2228#endif
2229#endif
2230            set_ev_video_avail(!get_ev_video_avail());
2231#ifdef CAM_TOUCHSCREEN_UI
2232            redraw_buttons = 1;
2233#endif
2234        }
2235        if (get_ev_video_avail()) {
2236            if (kbd_is_key_clicked(KEY_LEFT)) {
2237                set_ev_video(get_ev_video()-1);
2238            }
2239            if (kbd_is_key_clicked(KEY_RIGHT)){
2240                set_ev_video(get_ev_video()+1);
2241            }
2242        }
2243    }
2244#endif
2245}
2246
2247void gui_draw_debug_vals_osd() {
2248#ifdef OPT_DEBUGGING
2249
2250#if defined(OPT_EXMEM_TESTING)
2251    // Only do memory corruption testing if not recording video
2252    if (!MODE_IS_VIDEO(mode_get()))
2253    {
2254            // If defined the exmem memory is allocated; but not used for CHDK.
2255            // It is filled with a guard value (see wrappers.c) which is checked here
2256        // Any corruption is reported, otherwise 'OK' is displayed on screen (along with the exmem memory start address).
2257            extern void *exmem_start, *exmem_end;
2258            // check exmem allocated memory for corruption
2259            unsigned long* p = (unsigned long*)exmem_start;
2260            unsigned long *f = 0, *l = 0;
2261            long cnt = 0;
2262            while (p < (unsigned long*)exmem_end)
2263            {
2264                    if (p[0] != 0xDEADBEEF)
2265                    {
2266                            l = p;
2267                            if (f == 0) f = p;
2268                            cnt++;
2269                    }
2270                    p++;
2271            }
2272            if (cnt != 0)
2273            {
2274                    sprintf(osd_buf, "s:%8x e:%8x", exmem_start, exmem_end);
2275                    draw_txt_string(2, 12, osd_buf, conf.osd_color);
2276                    sprintf(osd_buf, "f:%8x l:%8x c:%d", f, l, cnt);
2277            }
2278            else
2279            {
2280                    sprintf(osd_buf, "OK 0x%x", exmem_start);
2281            }
2282            draw_txt_string(2, 13, osd_buf, conf.osd_color);
2283            // end of check     
2284    }
2285#endif
2286
2287    // DEBUG: "Show misc. values"
2288    // change ROW to fit values on screen in draw_txt_string(COLUMN, ROW, ...)
2289    // uncomment gui_draw_debug_vals_osd() below if you want debug values always on top
2290    if (conf.debug_misc_vals_show) {
2291        // show value of Memory Address selected with Memory Browser
2292        sprintf(osd_buf, "MEM: %#8x", (void*) (*(int*)conf.mem_view_addr_init));    // show value in Hexadecimal integer
2293        //sprintf(osd_buf, "MEM: %8u", (void*) (*(int*)conf.mem_view_addr_init));    // show value in Decimal integer
2294        draw_txt_string(28,  9, osd_buf, conf.osd_color);
2295
2296        // show Autofocus status (if AF is working)
2297        extern volatile long focus_busy;
2298        sprintf(osd_buf, "FB:  %8u", focus_busy);
2299        draw_txt_string(28, 10, osd_buf, conf.osd_color);
2300
2301        // show Zoom status (if Lens is moving)
2302        extern volatile long zoom_busy;
2303        sprintf(osd_buf, "ZB:  %8u", zoom_busy);
2304        draw_txt_string(28, 11, osd_buf, conf.osd_color);
2305
2306        // show USB-Power status to debug remote / sync
2307        sprintf(osd_buf, "USB: %8u", get_usb_power(1));
2308        draw_txt_string(28, 12, osd_buf, conf.osd_color);
2309
2310        /*
2311        // some cameras missing zoom_status
2312        sprintf(osd_buf, "ZS:  %#8x", zoom_status);
2313        draw_txt_string(28, 13, osd_buf, conf.osd_color);
2314        */
2315
2316        /*
2317        sprintf(osd_buf, "VP:  %#8x", vid_get_viewport_fb_d());
2318        draw_txt_string(28, 14, osd_buf, conf.osd_color);
2319        */
2320
2321        /*
2322        // debug keymap, KEYS_MASKx, SD_READONLY_FLAG, USB_MASK
2323        extern long physw_status[3];
2324        sprintf(osd_buf, "PS1: %#8x", physw_status[0]);
2325        draw_txt_string(28, 10, osd_buf, conf.osd_color);
2326
2327        sprintf(osd_buf, "PS2: %#8x", physw_status[1]);
2328        draw_txt_string(28, 11, osd_buf, conf.osd_color);
2329
2330        sprintf(osd_buf, "PS3: %#8x", physw_status[2]);
2331        draw_txt_string(28, 12, osd_buf, conf.osd_color);
2332        */
2333
2334        /*
2335        long v=get_file_counter();
2336        sprintf(osd_buf, "1:%03d-%04d", (v>>18)&0x3FF, (v>>4)&0x3FFF);
2337        sprintf(osd_buf, "1:%d, %08X", xxxx, eeee);
2338        */
2339    }
2340    {
2341        static char sbuf[100];
2342        int r,i, p, len;
2343        if (conf.debug_display == DEBUG_DISPLAY_PROPS){
2344
2345            for (i=0;i<10;i++){
2346                r = 0;
2347                p = conf.debug_propcase_page*10+i;
2348                get_property_case(p, &r, 4);
2349                sprintf(sbuf, "%3d: %d              ", p, r);
2350                sbuf[20]=0;
2351                draw_string(64,16+16*i,sbuf, conf.osd_color);
2352            }
2353        }
2354
2355        if (conf.debug_display == DEBUG_DISPLAY_PARAMS){
2356            extern long* FlashParamsTable[];
2357            char s[30];
2358            int count;
2359
2360            for (i=0;i<10;i++){
2361                r = 0;
2362                p = conf.debug_propcase_page*10+i;
2363                if (p>=get_flash_params_count()) {
2364                    sprintf(sbuf, "%3d: This parameter does not exists", p);
2365                } else  {
2366                    len=FlashParamsTable[p][1]>>16;
2367                    if ((len==1)||(len==2)||(len==4)){
2368                        get_parameter_data(p, &r, len);
2369                        sprintf(sbuf, "%3d: %30d :%2d ", p, r,len);
2370                    }
2371                    else {
2372                        if (len>=sizeof(s)) count=sizeof(s)-1; else count=len;
2373                        get_parameter_data(p, &s, count);
2374                        s[count]=0;
2375                        sprintf(sbuf, "%3d: %30s :%2d ", p, s,len);
2376                    }
2377                }
2378                draw_string(16,16+16*i,sbuf, conf.osd_color);
2379            }
2380        }
2381    }
2382
2383    if(conf.debug_display == DEBUG_DISPLAY_TASKS) {
2384            gui_debug_draw_tasklist();
2385    }
2386#endif
2387}
2388//-------------------------------------------------------------------
2389//extern int xxxx, eeee;
2390//-------------------------------------------------------------------
2391void gui_draw_osd() {
2392    unsigned int m, /*n = 0,*/ mode_photo, mode_video;
2393    coord x;
2394#if CAM_SWIVEL_SCREEN
2395    static int flashlight = 0;
2396#endif
2397    static int pressed = 0;
2398    static int half_disp_press_old=0;
2399    int half_disp_press;
2400    int need_restore = 0;
2401    m = mode_get();
2402
2403// DEBUG: uncomment if you want debug values always on top
2404//gui_draw_debug_vals_osd();
2405
2406#if CAM_SWIVEL_SCREEN
2407    if (conf.flashlight && (m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED) && (gui_mode==GUI_MODE_NONE /* || gui_mode==GUI_MODE_ALT */)) {
2408        draw_filled_rect(0, 0, screen_width-1, screen_height-1, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE));
2409        flashlight = 1;
2410    }
2411    if (flashlight) {
2412        if ((!((m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED))) || (gui_mode!=GUI_MODE_NONE /* && gui_mode!=GUI_MODE_ALT */)) {
2413            flashlight = 0;
2414                        need_restore = 1;
2415        } else {
2416                        return;
2417                }
2418    }
2419#endif
2420
2421    if (kbd_is_key_pressed(KEY_SHOOT_HALF)) {
2422        if (kbd_is_key_pressed(SHORTCUT_TOGGLE_ZEBRA)) {
2423            if (!pressed) {
2424                conf.zebra_draw = !conf.zebra_draw;
2425                if (!conf.zebra_draw) {
2426                                        need_restore = 1;
2427                }
2428                pressed = 1;
2429            }
2430        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_HISTO)) {
2431            if (!pressed) {
2432                if (++conf.show_histo>SHOW_HALF) conf.show_histo=0;
2433                if (!conf.show_histo) {
2434                                        need_restore = 1;
2435                }
2436                pressed = 1;
2437            }
2438        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_OSD)) {
2439            if (!pressed) {
2440                conf.show_osd = !conf.show_osd;
2441                if (!conf.show_osd) {
2442                                        need_restore = 1;
2443                }
2444                pressed = 1;
2445            }
2446        } else if (kbd_is_key_pressed(SHORTCUT_DISABLE_OVERRIDES)) {
2447             if (!pressed) {
2448                 if (conf.override_disable < 2) conf.override_disable = !conf.override_disable;
2449                 if (!conf.show_osd) {
2450                                        need_restore = 1;
2451                 }
2452                 pressed = 1;
2453             }
2454        } else {
2455            pressed = 0;
2456        }
2457    } else {
2458        pressed = 0;
2459    }
2460
2461        // TODO some of the ifs below should probably use this
2462        mode_video = MODE_IS_VIDEO(m);
2463
2464    mode_photo = (m&MODE_MASK) == MODE_PLAY ||
2465                 !( mode_video ||
2466                                 (m&MODE_SHOOTING_MASK)==MODE_STITCH);
2467
2468    half_disp_press=mode_photo && kbd_is_key_pressed(KEY_SHOOT_HALF) && kbd_is_key_pressed(KEY_DISPLAY);
2469    if (half_disp_press && ! half_disp_press_old)
2470                need_restore = 1;
2471    half_disp_press_old=half_disp_press;
2472
2473        if (need_restore)
2474                draw_restore();
2475
2476    if (half_disp_press)
2477                return;
2478
2479        if (gui_osd_draw_zebra(conf.zebra_draw && gui_mode==GUI_MODE_NONE &&
2480                                                        kbd_is_key_pressed(KEY_SHOOT_HALF) && mode_photo &&
2481                                                        !state_kbd_script_run)) {// no zebra when script running, to save mem
2482                return; // if zebra drawn, we're done
2483        }
2484#if !CAM_SHOW_OSD_IN_SHOOT_MENU
2485      if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) && (canon_shoot_menu_active==0)))  return;
2486#else
2487      if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) /*&& (canon_shoot_menu_active==0)*/ ))  return;
2488#endif
2489
2490
2491    if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (
2492     (kbd_is_key_pressed(KEY_SHOOT_HALF) && ((conf.show_histo==SHOW_HALF)/* || (m&MODE_MASK) == MODE_PLAY*/)) ||
2493     ((conf.show_histo==SHOW_ALWAYS)  &&  !((m&MODE_MASK) == MODE_PLAY) && (recreview_hold==0))
2494    ) &&
2495    (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH)) {
2496        gui_osd_draw_histo();
2497    }
2498
2499    if ((m&MODE_MASK) == MODE_REC && (recreview_hold==0 || conf.show_osd_in_review) ) {
2500        if (conf.show_grid_lines) {
2501            gui_grid_draw_osd(1);
2502        }
2503        if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (((kbd_is_key_pressed(KEY_SHOOT_HALF) || (state_kbd_script_run) || (shooting_get_common_focus_mode())) && (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH )) || ((mode_video || movie_status > 1) && conf.show_values_in_video) )) {
2504
2505           if (conf.show_dof!=DOF_DONT_SHOW) gui_osd_calc_dof();
2506
2507           if (conf.show_dof==DOF_SHOW_IN_DOF) gui_osd_draw_dof();
2508
2509           if (conf.values_show_real_iso || conf.values_show_market_iso || conf.values_show_ev_seted || conf.values_show_ev_measured || conf.values_show_bv_measured || conf.values_show_bv_seted || conf.values_show_overexposure || conf.values_show_canon_overexposure || conf.values_show_luminance) gui_osd_calc_expo_param();
2510        }
2511        if (conf.show_state) gui_osd_draw_state();
2512        if (conf.save_raw && conf.show_raw_state && !mode_video && (!kbd_is_key_pressed(KEY_SHOOT_HALF))) gui_osd_draw_raw_info();
2513
2514            if ((conf.show_values==SHOW_ALWAYS && mode_photo) || ((mode_video || movie_status > 1)&& conf.show_values_in_video) || ((kbd_is_key_pressed(KEY_SHOOT_HALF) || (recreview_hold==1)) && (conf.show_values==SHOW_HALF)))
2515                   gui_osd_draw_values(1);
2516        else if  (shooting_get_common_focus_mode() && mode_photo && conf.show_values && !(conf.show_dof==DOF_SHOW_IN_DOF) )
2517           gui_osd_draw_values(2);
2518            else if  (conf.show_values==SHOW_HALF)
2519                   gui_osd_draw_values(0);
2520    }
2521
2522
2523    if ((recreview_hold==0) &&  (!kbd_is_key_pressed(KEY_SHOOT_HALF) &&  (  ((m&MODE_MASK) == MODE_REC) || (!((m&MODE_MASK) == MODE_REC) &&  !((conf.hide_osd == 1) || (conf.hide_osd == 3)) )) && !(((conf.hide_osd == 2) || (conf.hide_osd == 3))&& (shooting_get_prop(PROPCASE_DISPLAY_MODE) == 1))))   {
2524        gui_batt_draw_osd();
2525        gui_space_draw_osd();
2526        gui_usb_draw_osd();
2527        if (conf.fast_ev && !mode_video && (m&MODE_MASK) == MODE_REC ) gui_osd_draw_ev();
2528    }
2529
2530    if ((conf.show_clock) && (recreview_hold==0) &&  ((!kbd_is_key_pressed(KEY_SHOOT_HALF) &&  (  ((m&MODE_MASK) == MODE_REC) || (!((m&MODE_MASK) == MODE_REC) &&  !((conf.hide_osd == 1) || (conf.hide_osd == 3)) )) && !(((conf.hide_osd == 2) || (conf.hide_osd == 3))&& (shooting_get_prop(PROPCASE_DISPLAY_MODE) == 1)))|| (conf.clock_halfpress==0) )) {
2531        gui_osd_draw_clock(0,0,0);
2532    }
2533    else if ((conf.show_clock) && (recreview_hold==0) &&  kbd_is_key_pressed(KEY_SHOOT_HALF) && conf.clock_halfpress==1) {
2534        gui_osd_draw_seconds();
2535    }
2536
2537    if ((conf.show_temp>0) && (recreview_hold==0) &&  ((!kbd_is_key_pressed(KEY_SHOOT_HALF) &&  (  ((m&MODE_MASK) == MODE_REC) || (!((m&MODE_MASK) == MODE_REC) &&  !((conf.hide_osd == 1) || (conf.hide_osd == 3)) )) && !(((conf.hide_osd == 2) || (conf.hide_osd == 3))&& (shooting_get_prop(PROPCASE_DISPLAY_MODE) == 1)) )|| (conf.clock_halfpress==0) )) {
2538        gui_osd_draw_temp();
2539    }
2540    if (conf.show_movie_time > 0 && (mode_video || movie_status > 1)) {
2541        gui_osd_draw_movie_time_left();
2542    }
2543
2544#if CAM_DRAW_EXPOSITION
2545    if (gui_mode==GUI_MODE_NONE && kbd_is_key_pressed(KEY_SHOOT_HALF) && ((m&MODE_MASK)==MODE_REC) && ((m&MODE_SHOOTING_MASK))!=MODE_VIDEO_STD && (m&MODE_SHOOTING_MASK)!=MODE_VIDEO_COMPACT) {
2546     strcpy(osd_buf,shooting_get_tv_str());
2547     strcat(osd_buf,"\"  F");
2548     strcat(osd_buf,shooting_get_av_str());
2549     draw_txt_string(22-strlen(osd_buf)/2, 14, osd_buf, conf.osd_color);
2550    }
2551#endif
2552
2553#if CAM_EV_IN_VIDEO
2554    if (movie_status==VIDEO_RECORD_IN_PROGRESS) gui_osd_draw_ev_video(get_ev_video_avail());
2555#endif
2556
2557        gui_draw_debug_vals_osd();
2558
2559#ifdef OPT_UBASIC
2560    if (ubasic_error){
2561        const char *msg;
2562        if (ubasic_error >= UBASIC_E_ENDMARK) {
2563            msg = ubasic_errstrings[UBASIC_E_UNKNOWN_ERROR];
2564        } else {
2565            msg = ubasic_errstrings[ubasic_error];
2566        }
2567        sprintf(osd_buf, "uBASIC:%d %s ", ubasic_linenumber(), msg);
2568        draw_txt_string(0, 0, osd_buf, MAKE_COLOR(COLOR_RED, COLOR_YELLOW));
2569    }
2570#endif
2571}
2572
2573#ifndef OPTIONS_AUTOSAVE
2574//-------------------------------------------------------------------
2575void gui_menuproc_save(int arg)
2576{
2577    conf_save();
2578}
2579#endif
2580
2581//-------------------------------------------------------------------
2582static void gui_menuproc_reset_selected(unsigned int btn) {
2583    if (btn==MBOX_BTN_YES)
2584        conf_load_defaults();
2585}
2586
2587void gui_menuproc_reset(int arg)
2588{
2589    gui_mbox_init(LANG_MSG_RESET_OPTIONS_TITLE,
2590                  LANG_MSG_RESET_OPTIONS_TEXT,
2591                  MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER|MBOX_BTN_YES_NO|MBOX_DEF_BTN2, gui_menuproc_reset_selected);
2592}
2593
2594//-------------------------------------------------------------------
2595void gui_draw_palette(int arg) {
2596    module_palette_run(PALETTE_MODE_DEFAULT, 0x00, NULL);
2597}
2598
2599//-------------------------------------------------------------------
2600void gui_show_build_info(int arg) {
2601    static char buf[192];
2602    static char comp[64];
2603
2604#ifdef __GNUC__
2605# ifndef __GNUC_PATCHLEVEL__
2606# define __GNUC_PATCHLEVEL 0
2607# endif
2608    sprintf(comp, "GCC %d.%d.%d", __GNUC__ ,__GNUC_MINOR__,__GNUC_PATCHLEVEL__ );
2609#else
2610    sprintf(comp, "UNKNOWN" );
2611#endif
2612    sprintf(buf, lang_str(LANG_MSG_BUILD_INFO_TEXT), HDK_VERSION, BUILD_NUMBER, __DATE__, __TIME__, PLATFORM, PLATFORMSUB, comp);
2613gui_mbox_init(LANG_MSG_BUILD_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_LEFT, NULL);
2614}
2615
2616//-------------------------------------------------------------------
2617void gui_show_memory_info(int arg) {
2618    static char buf[96];    // buffer size was 64, size increased for none english language
2619
2620    sprintf(buf, lang_str(LANG_MSG_MEMORY_INFO_TEXT), core_get_free_memory(), MEMISOSIZE, &_start, &_end);
2621    gui_mbox_init(LANG_MSG_MEMORY_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2622}
2623
2624//-------------------------------------------------------------------
2625#ifdef OPT_GAME_REVERSI
2626void gui_draw_reversi(int arg) {
2627    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2628        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2629                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2630        return;
2631    }
2632
2633    module_run("reversi.flt", 0, 0,0, UNLOAD_IF_ERR);
2634}
2635#endif
2636
2637//-------------------------------------------------------------------
2638#ifdef OPT_GAME_SOKOBAN
2639void gui_draw_sokoban(int arg) {
2640    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2641        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2642                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2643        return;
2644    }
2645
2646    module_run("sokoban.flt", 0, 0,0, UNLOAD_IF_ERR);
2647}
2648#endif
2649//-------------------------------------------------------------------
2650#ifdef OPT_GAME_CONNECT4
2651void gui_draw_4wins(int arg) {
2652    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2653        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2654                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2655        return;
2656    }
2657
2658    module_run("4wins.flt", 0, 0,0, UNLOAD_IF_ERR);
2659}
2660#endif
2661//-------------------------------------------------------------------
2662#ifdef OPT_GAME_MASTERMIND
2663void gui_draw_mastermind(int arg) {
2664    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2665        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2666                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2667        return;
2668    }
2669    module_run("mastmind.flt", 0, 0,0, UNLOAD_IF_ERR);
2670}
2671#endif
2672//-------------------------------------------------------------------
2673#ifdef OPT_DEBUGGING
2674void gui_draw_debug(int arg) {
2675//    gui_debug_init(0x2510);
2676//    gui_debug_init(0x127E0);
2677//    gui_debug_init(0x7F5B8);
2678//    gui_debug_init(malloc(16));
2679//    gui_debug_init((void*)conf.mem_view_addr_init);
2680
2681        unsigned int argv[] ={ (unsigned int)conf.mem_view_addr_init };
2682    module_run("memview.flt", 0, 1,argv, UNLOAD_IF_ERR);
2683}
2684
2685void gui_draw_modinspector(int arg) {
2686    module_run("modinsp.flt", 0, 0,0, UNLOAD_IF_ERR);
2687}
2688
2689//-------------------------------------------------------------------
2690void gui_draw_bench(int arg) {
2691    module_run("benchm.flt", 0, 0,0, UNLOAD_IF_ERR);
2692}
2693#endif
2694//-------------------------------------------------------------------
2695
2696void gui_draw_splash(char* logo, int logo_size) {
2697    coord w, h, x, y;
2698    static const char *text[] = {
2699        "CHDK Firmware '" HDK_VERSION " " BUILD_NUMBER "'" ,
2700        "Build: " __DATE__ " " __TIME__ ,
2701        "Camera: " PLATFORM " - " PLATFORMSUB };
2702    int i, l;
2703    color cl = MAKE_COLOR(COLOR_RED, COLOR_WHITE);
2704
2705    gui_splash_mode = (mode_get()&MODE_MASK);
2706
2707    h=sizeof(text)/sizeof(text[0])*FONT_HEIGHT+8;
2708    w=0;
2709    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
2710        l=strlen(text[i]);
2711        if (l>w) w=l;
2712    }
2713    w=w*FONT_WIDTH+10;
2714
2715    x = (screen_width-w)>>1; y = ((screen_height-h)>>1) + 20;
2716    draw_filled_round_rect(x, y, x+w, y+h, MAKE_COLOR(COLOR_RED, COLOR_RED));
2717    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
2718        draw_string(x+((w-strlen(text[i])*FONT_WIDTH)>>1), y+i*FONT_HEIGHT+4, text[i], cl);
2719    }
2720    if(logo){
2721      int pos;
2722      int mx=0;
2723      int my=0;
2724      int offset_x = (screen_width-150)>>1;
2725      int offset_y = ((screen_height-84)>>1) - 42;
2726      const color color_lookup[8] = {COLOR_BLACK,
2727                                                                        COLOR_SPLASH_RED/*0x2E redish*/,
2728                                                                        COLOR_RED,
2729                                                                        COLOR_GREY /*0x3D*/,
2730                                                                        COLOR_SPLASH_GREY /*0x1F*/,
2731                                                                        COLOR_SPLASH_PINK /*0x21 pinkish*/,
2732                                                                        COLOR_TRANSPARENT /*0x00*/,
2733                                                                        COLOR_WHITE /*0x11*/};
2734      for(pos=0; pos<logo_size; pos++){
2735          char data = logo[pos];
2736          color c = color_lookup[(data>>5) & 0x07];
2737          for(i=0; i<(data&0x1F)+1; i++){
2738              if (c!=0x00){
2739                  draw_pixel(offset_x+mx,offset_y+my,c);
2740              }
2741              if (mx==149){
2742                  mx=0;
2743                  my++;
2744              }else{
2745                  mx++;
2746              }
2747          }
2748      }
2749    }
2750}
2751
2752//-------------------------------------------------------------------
2753void gui_draw_fselect(int arg) {
2754    module_fselect_init(LANG_STR_FILE_BROWSER, "A", "A", NULL);
2755}
2756
2757//-------------------------------------------------------------------
2758static void gui_grid_lines_load_selected(const char *fn) {
2759    if (fn)
2760        grid_lines_load(fn);
2761}
2762void gui_grid_lines_load(int arg) {
2763    module_fselect_init(LANG_STR_SELECT_GRID_FILE, conf.grid_lines_file, "A/CHDK/GRIDS", gui_grid_lines_load_selected);
2764}
2765
2766//-------------------------------------------------------------------
2767void gui_draw_osd_le(int arg) {
2768    gui_set_mode(GUI_MODE_OSD);
2769    gui_osd_init();
2770}
2771
2772//-------------------------------------------------------------------
2773#ifdef OPT_TEXTREADER
2774static void gui_draw_read_selected(const char *fn) {
2775    if (fn) {
2776        if (!rbf_load(conf.reader_rbf_file))
2777            rbf_load_from_8x16(current_font);
2778        rbf_set_codepage(conf.reader_codepage);
2779
2780                unsigned int argv[] ={ (unsigned int)fn };
2781                module_run("txtread.flt", 0, sizeof(argv)/sizeof(argv[0]), argv, UNLOAD_IF_ERR);
2782    }
2783}
2784
2785void gui_draw_read(int arg) {
2786    module_fselect_init_w_mode(LANG_STR_SELECT_TEXT_FILE, conf.reader_file, "A/CHDK/BOOKS", gui_draw_read_selected, 1);
2787    void gui_fselect_set_key_redraw(int n);
2788    //gui_fselect_set_key_redraw(1);    @tsv
2789}
2790
2791void gui_draw_read_last(int arg) {
2792    struct stat st;
2793    if (stat(conf.reader_file,&st) == 0) {
2794        gui_draw_read_selected(conf.reader_file);
2795    } else {
2796        gui_draw_read(arg);
2797    }
2798}
2799#endif
2800
2801//-------------------------------------------------------------------
2802void gui_menuproc_mkbootdisk(int arg) {
2803    mark_filesystem_bootable();
2804    gui_mbox_init(LANG_INFORMATION, LANG_CONSOLE_TEXT_FINISHED, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
2805}
2806
2807#ifdef OPT_EDGEOVERLAY
2808static void gui_load_edge_selected( const char* fn ) {
2809    if( fn && module_edgeovr_load())
2810                load_edge_overlay(fn);
2811}
2812
2813void gui_menuproc_edge_save(int arg) {
2814        if ( module_edgeovr_load() )
2815        save_edge_overlay();
2816}
2817
2818void gui_menuproc_edge_load(int arg) {
2819    module_fselect_init(LANG_MENU_EDGE_LOAD, EDGE_SAVE_DIR, EDGE_SAVE_DIR, gui_load_edge_selected);
2820}
2821#endif
2822
2823//-------------------------------------------------------------------
2824#ifdef OPT_CALENDAR
2825void gui_draw_calendar(int arg) {
2826        module_run("calend.flt", 0, 0,0, UNLOAD_IF_ERR);
2827}
2828#endif
2829//-------------------------------------------------------------------
2830#ifdef OPT_TEXTREADER
2831static void gui_draw_rbf_selected(const char *fn) {
2832    if (fn) {
2833        strcpy(conf.reader_rbf_file, fn);
2834    }
2835}
2836void gui_draw_load_rbf(int arg) {
2837    module_fselect_init(LANG_STR_SELECT_FONT_FILE, conf.reader_rbf_file, "A/CHDK/FONTS", gui_draw_rbf_selected);
2838}
2839#endif
2840//-------------------------------------------------------------------
2841static void gui_draw_menu_rbf_selected(const char *fn) {
2842    if (fn) {
2843        strcpy(conf.menu_rbf_file, fn);
2844        if (!rbf_load(conf.menu_rbf_file))
2845            rbf_load_from_8x16(current_font);
2846        rbf_set_codepage(FONT_CP_WIN);
2847        gui_menu_init(NULL);
2848    }
2849}
2850void gui_draw_load_menu_rbf(int arg) {
2851    module_fselect_init(LANG_STR_SELECT_FONT_FILE, conf.menu_rbf_file, "A/CHDK/FONTS", gui_draw_menu_rbf_selected);
2852}
2853
2854//-------------------------------------------------------------------
2855static void gui_draw_symbol_rbf_selected(const char *fn) {
2856    if (fn) {
2857        strcpy(conf.menu_symbol_rbf_file, fn);
2858        if(!rbf_load_symbol(conf.menu_symbol_rbf_file)) conf.menu_symbol_enable=0;              //AKA
2859        gui_menu_init(NULL);
2860    }
2861}
2862void gui_draw_load_symbol_rbf(int arg) {
2863    module_fselect_init(LANG_STR_SELECT_SYMBOL_FILE, conf.menu_symbol_rbf_file, "A/CHDK/SYMBOLS", gui_draw_symbol_rbf_selected);
2864}
2865
2866//-------------------------------------------------------------------
2867static void gui_draw_lang_selected(const char *fn) {
2868    if (fn) {
2869        strcpy(conf.lang_file, fn);
2870        lang_load_from_file(conf.lang_file);
2871        gui_menu_init(NULL);
2872    }
2873}
2874void gui_draw_load_lang(int arg) {
2875    module_fselect_init(LANG_STR_SELECT_LANG_FILE, conf.lang_file, "A/CHDK/LANG", gui_draw_lang_selected);
2876}
2877
2878int find_mnu(CMenu *curr_menu, int mnu, int count)
2879{
2880        int gui_menu_curr_item;
2881
2882        gui_menu_curr_item = 0;
2883        while(curr_menu->menu[gui_menu_curr_item].text) {
2884                if (curr_menu->menu[gui_menu_curr_item].text == mnu){
2885                        user_submenu_items[count] = curr_menu->menu[gui_menu_curr_item];
2886                        return 1;
2887                }
2888                if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) == MENUITEM_SUBMENU)
2889                        if (curr_menu->menu[gui_menu_curr_item].text != LANG_MENU_USER_MENU)
2890                                if (find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), mnu, count)) return 1;
2891                gui_menu_curr_item++;
2892        }
2893        return 0;
2894}
2895
2896void user_menu_save() {
2897    int x;
2898        for (x=0; x<USER_MENU_ITEMS; x++) {
2899                /*
2900                 * First entry in user_submenu_items is reserved for the "Main Menu"
2901                 * conf.user_menu_vars only traks/saves the real user entries.
2902                 */
2903                conf.user_menu_vars[x] = user_submenu_items[x+1].text;
2904        }
2905}
2906
2907void user_menu_restore() {
2908     int x;
2909        for (x=0; x<USER_MENU_ITEMS; x++) {
2910                /*
2911                 * First entry in user_submenu_items is reserved for the "Main Menu"
2912                 * conf.user_menu_vars only traks/saves the real user entries.
2913                 */
2914                find_mnu(&root_menu, conf.user_menu_vars[x], x+1);
2915        }
2916}
2917
2918#ifdef OPT_DEBUGGING
2919
2920void gui_compare_props(int arg)
2921{
2922        #define NUM_PROPS 512
2923        // never freed, but not allocated unless prop compare is used once
2924        static int *props = NULL;
2925        char buf[64];
2926        int i;
2927        int p;
2928        int c;
2929
2930        if( props )
2931        { // we have previous data set! do a comparison
2932                c = 0;
2933                for( i = 0; i < NUM_PROPS; ++i )
2934                {
2935                        p = shooting_get_prop(i);
2936                        if( props[i] != p )
2937                        {
2938                                ++c;
2939                                sprintf(buf,"%4d is %8d was %8d",i,p,props[i]);
2940                                draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
2941                        }
2942                        props[i] = p;
2943                        if( c == 12 )
2944                        {
2945                                ++c;
2946                                sprintf(buf,"%s","Waiting 15 Seconds");
2947                                draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
2948                                msleep(15000);
2949                                c = 0;
2950                        }
2951                }
2952                ++c;
2953                sprintf(buf,"%s","Press <ALT> to leave");
2954                draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
2955        }
2956        else
2957        {
2958        // no previous data was set so we save the data initially
2959                props = (int *)malloc(NUM_PROPS*sizeof(int));
2960                if(props) {
2961                        for( i = 0; i < NUM_PROPS; ++i )
2962                        {
2963                                props[i] = shooting_get_prop(i);
2964                        }
2965                }
2966        }
2967}
2968
2969// Save camera romlog to A/ROMLOG.LOG file
2970void save_romlog(int arg)
2971{
2972    extern unsigned _ExecuteEventProcedure(const char *name,...);
2973
2974    struct stat st;
2975    if (stat("A/ROMLOG.LOG",&st)    == 0) remove("A/ROMLOG.LOG");
2976    if (stat("A/RomLogErr.txt",&st) == 0) remove("A/RomLogErr.txt");
2977
2978    unsigned args[3];
2979    args[0] = (unsigned)"SystemEventInit";
2980    if (call_func_ptr(_ExecuteEventProcedure,args,1) == -1)
2981    {
2982        args[0] = (unsigned)"System.Create";
2983        if (call_func_ptr(_ExecuteEventProcedure,args,1) == -1)
2984        {
2985            gui_mbox_init(LANG_ERROR, LANG_SAVE_ROMLOG_INIT_ERROR, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
2986            return;
2987        }
2988    }
2989
2990    args[0] = (unsigned)"GetLogToFile";
2991    args[1] = (unsigned)"A/ROMLOG.LOG";
2992    args[2] = 1;
2993    if (call_func_ptr(_ExecuteEventProcedure,args,3) == -1)
2994    {
2995        gui_mbox_init(LANG_ERROR, LANG_SAVE_ROMLOG_FAIL, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
2996    }
2997    else
2998    {
2999        gui_mbox_init(LANG_INFORMATION, LANG_SAVE_ROMLOG_OK, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
3000    }
3001}
3002
3003#endif
Note: See TracBrowser for help on using the repository browser.