source: trunk/core/gui.c @ 1723

Revision 1723, 121.0 KB checked in by reyalp, 2 years ago (diff)

a800 100a port from mland, patch by waterwings in http://chdk.setepontos.com/index.php?topic=650.msg81174#msg81174

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