void lua_script_error_ptp(int runtime, const char *err) { if(runtime) { ptp_script_write_error_msg(PTP_CHDK_S_ERRTYPE_RUN, err); script_end(); } else { ptp_script_write_error_msg(PTP_CHDK_S_ERRTYPE_COMPILE, err); lua_script_reset(); } }
static int lua_script_start( char const* script ) { L = lua_open(); luaL_openlibs( L ); register_lua_funcs( L ); Lt = lua_newthread( L ); lua_setfield( L, LUA_REGISTRYINDEX, "Lt" ); if( luaL_loadstring( Lt, script ) != 0 ) { script_console_add_line( lua_tostring( Lt, -1 ) ); lua_script_reset( L ); return 0; } lua_sethook(Lt, lua_count_hook, LUA_MASKCOUNT, 1000 ); return 1; }
void script_end() { script_print_screen_end(); if( L ) { lua_script_reset( L ); } else { ubasic_end(); } md_close_motion_detector(); shot_histogram_set(0); if (conf.alt_prevent_shutdown != ALT_PREVENT_SHUTDOWN_NO) { disable_shutdown(); } kbd_key_release_all(); state_kbd_script_run = 0; vid_bitmap_refresh(); }
void lua_script_error(lua_State *Lt,int runtime) { const char *err = lua_tostring( Lt, -1 ); script_console_add_line( err ); if(lua_script_is_ptp) { #ifdef CAM_CHDK_PTP lua_script_error_ptp(runtime,err); #endif } else { if(runtime) { if(conf.debug_lua_restart_on_error) { lua_script_reset(); script_start_gui(0); } else { script_wait_and_end(); } } else { script_print_screen_end(); script_wait_and_end(); } } }
void process_script() { long t; int Lres; // process stack operations if (kbd_int_stack_ptr){ switch (KBD_STACK_PREV(1)){ case SCRIPT_MOTION_DETECTOR: if(md_detect_motion()==0){ kbd_int_stack_ptr-=1; if (L) { // We need to recover the motion detector's // result from ubasic variable 0 and push // it onto the thread's stack. -- AUJ lua_pushnumber( Lt, ubasic_get_variable(0) ); } } return; case SCRIPT_PRESS: kbd_key_press(KBD_STACK_PREV(2)); kbd_int_stack_ptr-=2; // pop op. return; case SCRIPT_RELEASE: kbd_key_release(KBD_STACK_PREV(2)); kbd_int_stack_ptr-=2; // pop op. return; case SCRIPT_SLEEP: t = get_tick_count(); // FIXME take care if overflow occurs if (delay_target_ticks == 0){ /* setup timer */ delay_target_ticks = t+KBD_STACK_PREV(2); } else { if (delay_target_ticks <= t){ delay_target_ticks = 0; kbd_int_stack_ptr-=2; // pop sleep op. } } return; case SCRIPT_PR_WAIT_SAVE: state_shooting_progress = SHOOTING_PROGRESS_NONE; state_expos_recalculated = 0; histogram_stop(); kbd_int_stack_ptr-=1; // pop op. return; case SCRIPT_WAIT_SAVE:{ if (state_shooting_progress == SHOOTING_PROGRESS_DONE) kbd_int_stack_ptr-=1; // pop op. return; } case SCRIPT_WAIT_FLASH:{ if (shooting_is_flash_ready()) kbd_int_stack_ptr-=1; // pop op. return; } case SCRIPT_WAIT_EXPHIST:{ if (state_expos_recalculated) { kbd_int_stack_ptr-=1; // pop op. state_expos_under = under_exposed; state_expos_over = over_exposed; } return; } case SCRIPT_PR_WAIT_EXPHIST: { if (shooting_in_progress() || mvideo) { state_expos_recalculated = 0; histogram_restart(); kbd_int_stack_ptr-=1; // pop op. } return; } case SCRIPT_WAIT_CLICK: { t = get_tick_count(); if (delay_target_ticks == 0){ /* setup timer */ delay_target_ticks = t+((KBD_STACK_PREV(2))?KBD_STACK_PREV(2):86400000); } else { kbd_last_clicked = kbd_get_clicked_key(); if (kbd_last_clicked || delay_target_ticks <= t) { if (!kbd_last_clicked) kbd_last_clicked=0xFFFF; delay_target_ticks = 0; kbd_int_stack_ptr-=2; // pop op. } } return; } default: /*finished();*/ script_end(); } } if (state_kbd_script_run != 3) { if( L ) { int top; if (state_lua_kbd_first_call_to_resume) { state_lua_kbd_first_call_to_resume = 0; top = 0; } else { top = lua_gettop(Lt); } Lres = lua_resume( Lt, top ); if (Lres != LUA_YIELD && Lres != 0) { script_console_add_line( lua_tostring( Lt, -1 ) ); if(conf.debug_lua_restart_on_error){ lua_script_reset( L ); script_start(0); } else { wait_and_end(); } return; } if (Lres != LUA_YIELD) { script_console_add_line(lang_str(LANG_CONSOLE_TEXT_FINISHED)); script_end(); } } else { ubasic_run(); if (ubasic_finished()) { script_console_add_line(lang_str(LANG_CONSOLE_TEXT_FINISHED)); script_end(); } } } }