//------------------------------------------------------------------- static int gui_console_kbd_process() { switch (kbd_get_clicked_key() | get_jogdial_direction()) { case JOGDIAL_LEFT: case KEY_UP: if (console_scroll < (MAX_CONSOLE_HISTORY-MAX_CONSOLE_DISP_LINES)) { console_scroll++; console_redraw_flag = 1; } break; case JOGDIAL_RIGHT: case KEY_DOWN: if (console_scroll > 0) { console_scroll--; console_redraw_flag = 1; } break; case KEY_SET: gui_set_mode(gui_console_mode_old); break; } return 0; }
//------------------------------------------------------------------- int gui_read_kbd_process() { switch (kbd_get_autoclicked_key() | get_jogdial_direction()) { case JOGDIAL_LEFT: case KEY_ZOOM_OUT: case KEY_UP: case KEY_LEFT: if (conf.reader_pos>0) { conf.reader_pos -= 45*15; if (conf.reader_pos<0) conf.reader_pos=0; read_to_draw = 1; } break; case JOGDIAL_RIGHT: case KEY_ZOOM_IN: case KEY_DOWN: case KEY_RIGHT: case KEY_SHOOT_HALF: if ((conf.reader_pos+read_on_screen)<read_file_size) { conf.reader_pos += read_on_screen; read_to_draw = 1; } break; case KEY_SET: break; case KEY_DISPLAY: pause = !pause; gui_read_draw_scroll_indicator(); last_time = get_tick_count(); break; case KEY_MENU: gui_read_kbd_leave(); break; } return 0; }
/* saves & updates key state, runs main CHDK kbd task code in kbd_process, returns kbd_process value */ long kbd_update_key_state(void) { kbd_prev_state[0] = kbd_new_state[0]; kbd_prev_state[1] = kbd_new_state[1]; kbd_prev_state[2] = kbd_new_state[2]; #ifdef CAM_TOUCHSCREEN_UI kbd_prev_state[3] = kbd_new_state[3]; #endif // note assumed kbd_pwr_on has been called if needed kbd_fetch_data(kbd_new_state); #ifdef CAM_HAS_GPS if (gps_key_trap > 0) // check if gps code is waiting for a specific key press to cancel shutdown { if (kbd_get_pressed_key() == gps_key_trap) { kbd_key_release(gps_key_trap); kbd_key_press(0); gps_key_trap = -1; // signal the gps task that the specified button was pressed msleep(1000); // pause to allow button release so Canon f/w does not see the press } } #endif long status = kbd_process(); if (status == 0){ // leave it alone... physw_status[0] = kbd_new_state[0]; physw_status[1] = kbd_new_state[1]; physw_status[2] = kbd_new_state[2]; #ifdef CAM_HAS_JOGDIAL jogdial_control(0); #endif } else { // override keys // TODO doesn't handle inverted logic yet physw_status[0] = (kbd_new_state[0] & (~KEYS_MASK0)) | (kbd_mod_state[0] & KEYS_MASK0); physw_status[1] = (kbd_new_state[1] & (~KEYS_MASK1)) | (kbd_mod_state[1] & KEYS_MASK1); physw_status[2] = (kbd_new_state[2] & (~KEYS_MASK2)) | (kbd_mod_state[2] & KEYS_MASK2); #ifdef CAM_HAS_JOGDIAL if ((jogdial_stopped==0) && !camera_info.state.state_kbd_script_run) { jogdial_control(1); get_jogdial_direction(); } else if (jogdial_stopped && camera_info.state.state_kbd_script_run) { jogdial_control(0); } #endif } return status; }
//------------------------------------------------------------------- // Process up/down/left/right/jogdial shortcuts when control options enabled static int kbd_use_up_down_left_right_as_fast_switch() { static long key_pressed = 0; int ev_video = 0; int jogdial; #if CAM_EV_IN_VIDEO ev_video = get_ev_video_avail(); #endif // One of the control options must be enabled or don't do anything if (!conf.fast_ev && !conf.fast_movie_control && !conf.fast_movie_quality_control) return 0; // Clear state variable is neither UP or DOWN is pressed if (!kbd_is_key_pressed(KEY_UP) && !kbd_is_key_pressed(KEY_DOWN)) key_pressed = 0; // Must be in record mode and not have either Canon menu open if ( (canon_menu_active!=(int)&canon_menu_active-4) || canon_shoot_menu_active!=0 || !camera_info.state.mode_rec) return 0; // Adjust exposure if 'Enable Fast EV switch?' option is set if (conf.fast_ev && (key_pressed == 0) && (camera_info.state.mode_shooting != MODE_M)) { #if !CAM_HAS_JOGDIAL if (kbd_is_key_pressed(KEY_UP)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()+(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()+(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); key_pressed = KEY_UP; return 1; } if (kbd_is_key_pressed(KEY_DOWN)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()-(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()-(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); key_pressed = KEY_DOWN; return 1; } #else jogdial=get_jogdial_direction(); if (camera_info.state.is_shutter_half_press && (jogdial==JOGDIAL_RIGHT)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()+(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()+(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); } if (camera_info.state.is_shutter_half_press && (jogdial==JOGDIAL_LEFT)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()-(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()-(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); } #endif } // Adjust video quality/bitrate if 'Video Quality Control?' option is set if (conf.fast_movie_quality_control && key_pressed == 0 && is_video_recording()) { if (kbd_is_key_pressed(KEY_UP)) { if (conf.video_mode==0) { #if !CAM_VIDEO_QUALITY_ONLY gui_video_bitrate_enum(1,0); movie_reset = 1; #endif } else if (conf.video_mode==1) { conf.video_quality+=1; if (conf.video_quality>VIDEO_MAX_QUALITY) conf.video_quality=VIDEO_MAX_QUALITY; movie_reset = 1; } key_pressed = KEY_UP; return 1; } if (kbd_is_key_pressed(KEY_DOWN)) { if (conf.video_mode==0) { #if !CAM_VIDEO_QUALITY_ONLY conf.video_bitrate-=1; if (conf.video_bitrate<0) conf.video_bitrate=0; shooting_video_bitrate_change(conf.video_bitrate); movie_reset = 1; #endif } else if (conf.video_mode==1) { conf.video_quality-=1; if (conf.video_quality<1) conf.video_quality=1; movie_reset = 1; } key_pressed = KEY_DOWN; return 1; } } #if CAM_VIDEO_CONTROL // Pause / unpause video if 'Fast Movie Control' option is set if (conf.fast_movie_control && key_pressed == 0 && !ev_video #ifndef CAM_HAS_VIDEO_BUTTON && (camera_info.state.mode_video || is_video_recording()) #endif ) { if (kbd_is_key_pressed(KEY_LEFT) && is_video_recording()) { movie_status = VIDEO_RECORD_STOPPED; key_pressed = KEY_LEFT; return 1; } // reyalp - HACK for cams that can do video in any mode // note that this means this will probably run whenever you press right // BUG this doesn't know whether recording was stopped or paused. if (kbd_is_key_pressed(KEY_RIGHT) && (movie_status == VIDEO_RECORD_STOPPED)) { movie_status = VIDEO_RECORD_IN_PROGRESS; movie_reset = 1; key_pressed = KEY_RIGHT; return 1; } } #endif return key_pressed; }
long kbd_use_up_down_left_right_as_fast_switch() { static long key_pressed = 0; // ??? static masking a global int m=mode_get(); int mode_video = MODE_IS_VIDEO(m) || (movie_status > 1); int ev_video=0; int jogdial; #if CAM_EV_IN_VIDEO ev_video=get_ev_video_avail(); #endif if (!(kbd_is_key_pressed(KEY_UP)) && !(kbd_is_key_pressed(KEY_DOWN))) key_pressed = 0; if (canon_shoot_menu_active!=0 || (m&MODE_MASK) != MODE_REC) return 0; #if !CAM_HAS_JOGDIAL if (kbd_is_key_pressed(KEY_UP) && ((m&MODE_SHOOTING_MASK) != MODE_M) && !mode_video) { if (conf.fast_ev && key_pressed == 0) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_prop(PROPCASE_EV_CORRECTION_1)+(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_prop(PROPCASE_EV_CORRECTION_2)+(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); key_pressed = KEY_UP; return 1; } } if (kbd_is_key_pressed(KEY_DOWN) && ((m&MODE_SHOOTING_MASK) != MODE_M) && !mode_video) { if (conf.fast_ev && key_pressed == 0) { kbd_key_release_all(); shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_prop(PROPCASE_EV_CORRECTION_1)-(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_prop(PROPCASE_EV_CORRECTION_2)-(conf.fast_ev_step+1)*16); key_pressed = KEY_DOWN; EnterToCompensationEVF(); return 1; } } #else jogdial=get_jogdial_direction(); if (conf.fast_ev &&kbd_is_key_pressed(KEY_SHOOT_HALF) && (jogdial==JOGDIAL_RIGHT) && ((m&MODE_SHOOTING_MASK) != MODE_M) && !mode_video) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_prop(PROPCASE_EV_CORRECTION_1)+(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_prop(PROPCASE_EV_CORRECTION_2)+(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); } if (conf.fast_ev &&kbd_is_key_pressed(KEY_SHOOT_HALF) && (jogdial==JOGDIAL_LEFT) && ((m&MODE_SHOOTING_MASK) != MODE_M) && !mode_video) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_prop(PROPCASE_EV_CORRECTION_1)-(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_prop(PROPCASE_EV_CORRECTION_2)-(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); } #endif if (kbd_is_key_pressed(KEY_UP) && mode_video && movie_status == 4 ) { if (conf.fast_movie_quality_control && key_pressed == 0) { if (conf.video_mode==0) { #if !CAM_VIDEO_QUALITY_ONLY conf.video_bitrate+=1; if (conf.video_bitrate>=VIDEO_BITRATE_STEPS) conf.video_bitrate=VIDEO_BITRATE_STEPS-1; shooting_video_bitrate_change(conf.video_bitrate); movie_reset = 1; #endif } else if (conf.video_mode==1) { conf.video_quality+=1; if (conf.video_quality>VIDEO_MAX_QUALITY) conf.video_quality=VIDEO_MAX_QUALITY; movie_reset = 1; } key_pressed = KEY_UP; return 1; } } if (kbd_is_key_pressed(KEY_DOWN) && mode_video && movie_status == 4) { if (conf.fast_movie_quality_control && key_pressed == 0) { if (conf.video_mode==0) { #if !CAM_VIDEO_QUALITY_ONLY conf.video_bitrate-=1; if (conf.video_bitrate<0) conf.video_bitrate=0; shooting_video_bitrate_change(conf.video_bitrate); movie_reset = 1; #endif } else if (conf.video_mode==1) { conf.video_quality-=1; if (conf.video_quality<1) conf.video_quality=1; movie_reset = 1; } key_pressed = KEY_DOWN; return 1; } } if (kbd_is_key_pressed(KEY_LEFT) && mode_video && (movie_status == 4) && !ev_video) { if (conf.fast_movie_control && key_pressed == 0) { movie_status = VIDEO_RECORD_STOPPED; key_pressed = KEY_LEFT; return 1; } } // reyalp - HACK for cams that can do video in any mode // note that this means this will probably run whenever you press right if (kbd_is_key_pressed(KEY_RIGHT) && #ifndef CAM_HAS_VIDEO_BUTTON mode_video && #endif (movie_status == 1) && !ev_video) { // BUG this doesn't know whether recording was stopped or paused. if (conf.fast_movie_control && key_pressed == 0) { movie_status = VIDEO_RECORD_IN_PROGRESS; movie_reset = 1; key_pressed = KEY_RIGHT; return 1; } } return 0; }
//------------------------------------------------------------------- // Process button presses when in GUI_MODE_MENU mode int gui_menu_kbd_process() { switch (kbd_get_autoclicked_key() | get_jogdial_direction()) { case KEY_ERASE: case KEY_SHOOT_HALF: if (!increment_factor()) int_incr = 1; gui_menu_redraw=1; break; case JOGDIAL_LEFT: case KEY_UP: gui_menu_updown(-1); break; case JOGDIAL_RIGHT: case KEY_DOWN: gui_menu_updown(1); break; case FRONTDIAL_LEFT: case KEY_LEFT: if (gui_menu_curr_item >= 0) { switch (curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) { case MENUITEM_INT: update_int_value(&curr_menu->menu[gui_menu_curr_item],-1); break; case MENUITEM_BOOL: update_bool_value(&curr_menu->menu[gui_menu_curr_item]); break; case MENUITEM_ENUM: case MENUITEM_ENUM2: update_enum_value(&curr_menu->menu[gui_menu_curr_item],-1); break; case MENUITEM_UP: gui_menu_back(); break; case MENUITEM_STATE_VAL_PAIR: { CMenuItem *c = (CMenuItem*)(curr_menu->menu[gui_menu_curr_item].value); if (*(c[1].value) == 0) update_bool_value(&c[1]); switch (c[0].type & MENUITEM_MASK) { case MENUITEM_INT: update_int_value(&c[0],-1); break; case MENUITEM_ENUM: case MENUITEM_ENUM2: update_enum_value(&c[0],-1); break; } } break; } } else { gui_menu_back(); } break; case FRONTDIAL_RIGHT: case KEY_RIGHT: if (gui_menu_curr_item >= 0) { switch (curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK){ case MENUITEM_INT: update_int_value(&curr_menu->menu[gui_menu_curr_item],1); break; case MENUITEM_BOOL: update_bool_value(&curr_menu->menu[gui_menu_curr_item]); break; case MENUITEM_ENUM: case MENUITEM_ENUM2: update_enum_value(&curr_menu->menu[gui_menu_curr_item],1); break; case MENUITEM_SUBMENU_PROC: select_proc(); break; case MENUITEM_SUBMENU: select_sub_menu(); break; case MENUITEM_STATE_VAL_PAIR: { CMenuItem *c = (CMenuItem*)(curr_menu->menu[gui_menu_curr_item].value); if (*(c[1].value) == 0) update_bool_value(&c[1]); switch (c[0].type & MENUITEM_MASK) { case MENUITEM_INT: update_int_value(&c[0],1); break; case MENUITEM_ENUM: case MENUITEM_ENUM2: update_enum_value(&c[0],1); break; } } break; } } break; case KEY_SET: if (gui_menu_curr_item >= 0) { switch (curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK){ case MENUITEM_INT: if (camera_info.state.is_shutter_half_press) { *(curr_menu->menu[gui_menu_curr_item].value) = 0; gui_menu_redraw=1; } break; case MENUITEM_BOOL: update_bool_value(&curr_menu->menu[gui_menu_curr_item]); break; case MENUITEM_SUBMENU_PROC: case MENUITEM_PROC: select_proc(); break; case MENUITEM_SUBMENU: select_sub_menu(); break; case MENUITEM_UP: gui_menu_back(); break; case MENUITEM_COLOR_FG: case MENUITEM_COLOR_BG: item_color=((unsigned char*)(curr_menu->menu[gui_menu_curr_item].value)) + (((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK)==MENUITEM_COLOR_BG)?1:0); libpalette->show_palette(PALETTE_MODE_SELECT, FG_COLOR(*item_color), gui_menu_color_selected); gui_menu_redraw=2; break; case MENUITEM_ENUM: case MENUITEM_ENUM2: update_enum_value(&curr_menu->menu[gui_menu_curr_item],1); gui_menu_redraw=1; break; case MENUITEM_STATE_VAL_PAIR: { CMenuItem *c = (CMenuItem*)(curr_menu->menu[gui_menu_curr_item].value); if ((c[1].type & MENUITEM_MASK) == MENUITEM_ENUM) update_enum_value(&c[1],1); else update_bool_value(&c[1]); } break; } } break; case KEY_ZOOM_IN: if (decrement_factor()) gui_menu_redraw = 1; break; case KEY_ZOOM_OUT: if (increment_factor()) gui_menu_redraw = 1; break; case KEY_DISPLAY: if (camera_info.cam_has_zoom_lever) { gui_menu_back(); } else { // For cams without zoom lever, DISP adjusts increment factor if (!increment_factor()) int_incr = 1; gui_menu_redraw=1; } break; } return 0; }