static MENU_UPDATE_FUNC(script_print) { if (!script_preview_flag || !entry->selected) { MENU_SET_NAME("Show script"); MENU_SET_VALUE(""); script_preview_flag = 0; return; } static int prev_script = -1; if (prev_script != script_selected) { int size; char* p = get_script_path(script_selected); char* f = (char*)read_entire_file(p, &size); if (f) { script_copy_window(script_preview, sizeof(script_preview), f, 0, 0, 20, 60); fio_free(f); } else { snprintf(script_preview, sizeof(script_preview), "Could not read '%s'", p); } } prev_script = script_selected; bmp_fill(40, 0, 0, 720, 430); int fnt = FONT(FONT_MED, COLOR_WHITE, 40); big_bmp_printf(fnt, 10, 10, "%s", script_preview); info->custom_drawing = CUSTOM_DRAW_THIS_MENU; }
static void script_parse_header(int script_index) { script_selected = script_index; // side effect (!) // clear params submenu (hide all unused stuff) script_reset_params(); // try to read the script static char _buf[1024+128]; char* buf = UNCACHEABLE(_buf)+64; char* fn = get_script_path(script_selected); int r = read_file(fn, buf, 1024); if (r < 0) { snprintf(script_titles[script_index], SCRIPT_TITLE_SIZE, "Error"); return; } buf[r+1] = 0; // get some default title guess_script_title_from_first_line(buf, script_titles[script_index], SCRIPT_TITLE_SIZE); // parse CHDK script header script_scan(fn, buf); // update submenu script_update_menu(); }
/* ================================================================== */ static int make_script_path(char *path, struct LuaSDL_StartInfo *info, char *app) { if (get_script_path(info, app) || strlen(info->dir_app) + strlen(info->appname) >= MAX_PATH) { fprintf(stderr, "Error: absolute script path too long.\n"); fflush(stderr); return 1; } strcpy(path, info->dir_app); strcat(path, info->appname); return 0; }
static void run_script(const char *script) { extern int ml_started; while (!ml_started) msleep(100); // for startup scripts script_state = SCRIPT_RUNNING; msleep(500); console_clear(); console_show(); console_set_help_text("SET: show/hide"); console_set_status_text("Script running..."); int exit_code = tcc_compile_and_run(get_script_path(script_selected)); if (exit_code == 0) { console_puts( "Script finished.\n"); } else { console_printf( "Script error: %d.\n", exit_code); msleep(500); gui_stop_menu(); msleep(500); console_show(); } // restore some settings to normal, if script changed them //~ script_cleanup_af(); bmp_draw_to_idle(0); canon_gui_enable_front_buffer(0); beep(); script_state = SCRIPT_JUST_FINISHED; console_set_status_text("Script finished. "); msleep(500); redraw(); msleep(500); for (int i = 0; i < 100; i++) { msleep(100); if (gui_menu_shown()) break; if (get_halfshutter_pressed()) break; } console_hide(); script_state = SCRIPT_IDLE; console_set_status_text(""); }
//! Calls model's method with given arguments int py_call_method(const char *app, const char *model, const char *method, PyObject *args, PyObject **ret) { /*! * Calls model's method with given arguments. * * @app Application name * @model Model * @method Method * @args Arguments in tuple * @ret Value returned by method. * @return 0 on success, 1 on IO errors (missing file, etc.), 2 on script error, 3 method is missing. */ PyObject *pCode, *pModule, *pDict, *pFunc; PyObject *pkArgs; PyMethodDef *meth; char *script_path = get_script_path(app, model); char *code = load_file(script_path, NULL); free(script_path); if (!code) { return 1; } pModule = PyImport_AddModule("__builtin__"); pDict = PyModule_GetDict(pModule); for (meth = methods; meth->ml_name; meth++) { pCode = PyCFunction_New(meth, NULL); PyDict_SetItemString(pDict, meth->ml_name, pCode); } pCode = Py_CompileString(code, "<script.py>", Py_file_input); free(code); if (!pCode) { return 2; } pModule = PyImport_ExecCodeModule("csl", pCode); Py_DECREF(pCode); if (!pModule || !PyModule_Check(pModule)) { return 2; } pDict = PyModule_GetDict(pModule); if (!pDict) { Py_DECREF(pModule); return 2; } pFunc = PyDict_GetItemString(pDict, method); if (!pFunc || !PyCallable_Check(pFunc)) { Py_DECREF(pModule); return 3; } if (!PyTuple_Check(args)) { PyErr_SetString(PyExc_TypeError, "Arguments must be passed as tuple."); return 2; } pkArgs = PyDict_New(); *ret = PyObject_Call(pFunc, args, pkArgs); if (!*ret) { Py_DECREF(pModule); return 2; } Py_DECREF(pModule); return 0; }