diff options
-rw-r--r-- | pcilib/py.c | 313 | ||||
-rw-r--r-- | pcilib/py.h | 58 | ||||
-rw-r--r-- | pyserver/api_server.py | 8 | ||||
-rw-r--r-- | pywrap/CMakeLists.txt | 4 | ||||
-rw-r--r-- | pywrap/pcilib.py | 38 | ||||
-rw-r--r-- | pywrap/pcipywrap.c | 327 | ||||
-rw-r--r-- | pywrap/pcipywrap.h | 79 | ||||
-rw-r--r-- | pywrap/pcipywrap.i | 3 | ||||
-rw-r--r-- | pywrap/test_pcilib.py (renamed from pywrap/test_pcipywrap.py) | 10 | ||||
-rw-r--r-- | xml/scripts/test_script.py | 2 |
10 files changed, 260 insertions, 582 deletions
diff --git a/pcilib/py.c b/pcilib/py.c index 934c11f..699cd59 100644 --- a/pcilib/py.c +++ b/pcilib/py.c @@ -89,6 +89,8 @@ void pcilib_log_python_error(const char *file, int line, pcilib_log_flags_t flag #endif /* HAVE_PYTHON */ } + + int pcilib_init_py(pcilib_t *ctx) { #ifdef HAVE_PYTHON ctx->py = (pcilib_py_t*)malloc(sizeof(pcilib_py_t)); @@ -117,13 +119,13 @@ int pcilib_init_py(pcilib_t *ctx) { return PCILIB_ERROR_FAILED; } - PyObject *pywrap = PyImport_ImportModule("pcipywrap"); + PyObject *pywrap = PyImport_ImportModule("pcilib"); if (!pywrap) { pcilib_python_error("Error importing pcilib python wrapper"); return PCILIB_ERROR_FAILED; } - PyObject *mod_name = PyString_FromString("Pcipywrap"); + PyObject *mod_name = PyString_FromString("Pcilib"); PyObject *pyctx = PyCObject_FromVoidPtr(ctx, NULL); ctx->py->pcilib_pywrap = PyObject_CallMethodObjArgs(pywrap, mod_name, pyctx, NULL); Py_XDECREF(pyctx); @@ -141,6 +143,8 @@ int pcilib_init_py(pcilib_t *ctx) { int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) { #ifdef HAVE_PYTHON int err = 0; + PyObject *pypath, *pynewdir; + PyObject *pydict, *pystr, *pyret = NULL; char *script_dir; const char *model_dir = getenv("PCILIB_MODEL_DIR"); @@ -156,59 +160,83 @@ int pcilib_py_add_script_dir(pcilib_t *ctx, const char *dir) { sprintf(script_dir, "%s/%s", model_dir, dir); } - err = pcilib_py_ctx_add_script_dir(ctx->py, script_dir); - if(err) return err; -#endif /* HAVE_PYTHON */ - - return 0; -} - -void pcilib_py_free_hash(pcilib_py_t *ctx_py) { - if (ctx_py->script_hash) { - pcilib_script_t *script, *script_tmp; - - HASH_ITER(hh, ctx_py->script_hash, script, script_tmp) { - Py_DECREF(script->module); - HASH_DEL(ctx_py->script_hash, script); - free(script); - } - ctx_py->script_hash = NULL; + pypath = PySys_GetObject("path"); + if (!pypath) { + pcilib_python_error("Can't get python path"); + return PCILIB_ERROR_FAILED; } -} -void pcilib_free_py_ctx(pcilib_py_t *ctx_py) { -#ifdef HAVE_PYTHON - int finalyze = 0; + pynewdir = PyString_FromString(script_dir); + if (!pynewdir) { + pcilib_python_error("Can't create python string"); + return PCILIB_ERROR_MEMORY; + } + + // Checking if the directory already in the path + pydict = PyDict_New(); + if (pydict) { + pystr = PyString_FromString("cur"); + if (pystr) { + PyDict_SetItem(pydict, pystr, pynewdir); + Py_DECREF(pystr); + } - if (ctx_py) { - if (ctx_py->finalyze) finalyze = 1; + pystr = PyString_FromString("path"); + if (pystr) { + PyDict_SetItem(pydict, pystr, pypath); + Py_DECREF(pystr); + } - pcilib_py_free_hash(ctx_py); + pyret = PyRun_String("cur in path", Py_eval_input, ctx->py->global_dict, pydict); + Py_DECREF(pydict); + } - if (ctx_py->pcilib_pywrap) - Py_DECREF(ctx_py->pcilib_pywrap); + if ((pyret == Py_False)&&(PyList_Append(pypath, pynewdir) == -1)) + err = PCILIB_ERROR_FAILED; - free(ctx_py); - } + if (pyret) Py_DECREF(pyret); + Py_DECREF(pynewdir); - if (finalyze) - Py_Finalize(); + if (err) { + pcilib_python_error("Can't add directory (%s) to python path", script_dir); + return err; + } #endif /* HAVE_PYTHON */ -} + return 0; +} void pcilib_free_py(pcilib_t *ctx) { #ifdef HAVE_PYTHON - pcilib_free_py_ctx(ctx->py); - ctx->py = NULL; + int finalyze = 0; + + if (ctx->py) { + if (ctx->py->finalyze) finalyze = 1; + + if (ctx->py->script_hash) { + pcilib_script_t *script, *script_tmp; + + HASH_ITER(hh, ctx->py->script_hash, script, script_tmp) { + Py_DECREF(script->module); + HASH_DEL(ctx->py->script_hash, script); + free(script); + } + ctx->py->script_hash = NULL; + } + + if (ctx->py->pcilib_pywrap) + Py_DECREF(ctx->py->pcilib_pywrap); + + free(ctx->py); + ctx->py = NULL; + } + + if (finalyze) + Py_Finalize(); #endif /* HAVE_PYTHON */ } int pcilib_py_load_script(pcilib_t *ctx, const char *script_name) { - return pcilib_py_ctx_load_script(ctx->py, script_name); -} - -int pcilib_py_ctx_load_script(pcilib_py_t *ctx_py, const char *script_name) { #ifdef HAVE_PYTHON PyObject* pymodule; pcilib_script_t *module = NULL; @@ -224,7 +252,7 @@ int pcilib_py_ctx_load_script(pcilib_py_t *ctx_py, const char *script_name) { } *py = 0; - HASH_FIND_STR(ctx_py->script_hash, script_name, module); + HASH_FIND_STR(ctx->py->script_hash, script_name, module); if (module) return 0; pymodule = PyImport_ImportModule(module_name); @@ -238,7 +266,7 @@ int pcilib_py_ctx_load_script(pcilib_py_t *ctx_py, const char *script_name) { module->module = pymodule; module->name = script_name; - HASH_ADD_STR(ctx_py->script_hash, name, module); + HASH_ADD_KEYPTR(hh, ctx->py->script_hash, module->name, strlen(module->name), module); #endif /* HAVE_PYTHON */ return 0; } @@ -499,218 +527,51 @@ int pcilib_py_eval_string(pcilib_t *ctx, const char *codestr, pcilib_value_t *va int pcilib_py_eval_func(pcilib_t *ctx, const char *script_name, const char *func_name, pcilib_value_t *val) { #ifdef HAVE_PYTHON int err = 0; - PyObject *pyval = NULL; - - if (val) { - pyval = pcilib_get_value_as_pyobject(ctx, val, &err); - if (err) return err; - } - - PyObject* pyret = pcilib_py_ctx_eval_func(ctx->py, script_name, - func_name, pyval, &err); - if (err) return err; - - if ((val)&&(pyret != Py_None)) - err = pcilib_set_value_from_pyobject(ctx, val, pyret); - - Py_DECREF(pyret); - - return err; -#else /* HAVE_PYTHON */ - pcilib_error("Python is not supported"); - return PCILIB_ERROR_NOTSUPPORTED; -#endif /* HAVE_PYTHON */ -} - -pcilib_py_object* pcilib_py_ctx_eval_func(pcilib_py_t *ctx_py, - const char *script_name, - const char *func_name, - pcilib_py_object *pyval, - int *err) { -#ifdef HAVE_PYTHON PyObject *pyfunc; - PyObject *pyret; + PyObject *pyval = NULL, *pyret; pcilib_script_t *module = NULL; - HASH_FIND_STR(ctx_py->script_hash, script_name, module); + HASH_FIND_STR(ctx->py->script_hash, script_name, module); if (!module) { pcilib_error("Script (%s) is not loaded", script_name); - if(err) *err = PCILIB_ERROR_NOTFOUND; - return NULL; + return PCILIB_ERROR_NOTFOUND; } - + + if (val) { + pyval = pcilib_get_value_as_pyobject(ctx, val, &err); + if (err) return err; + } + PyGILState_STATE gstate = PyGILState_Ensure(); pyfunc = PyUnicode_FromString(func_name); if (!pyfunc) { if (pyval) Py_DECREF(pyval); PyGILState_Release(gstate); - if(err) *err = PCILIB_ERROR_MEMORY; - return NULL; + return PCILIB_ERROR_MEMORY; } - pyret = PyObject_CallMethodObjArgs(module->module, - pyfunc, - ctx_py->pcilib_pywrap, - pyval, - NULL); + pyret = PyObject_CallMethodObjArgs(module->module, pyfunc, ctx->py->pcilib_pywrap, pyval, NULL); Py_DECREF(pyfunc); Py_DECREF(pyval); - + if (!pyret) { PyGILState_Release(gstate); - pcilib_python_error("Error executing function (%s) of python " - "script (%s)", func_name, script_name); - if(err) *err = PCILIB_ERROR_FAILED; - return NULL; - } - PyGILState_Release(gstate); - - return pyret; - -#else /* HAVE_PYTHON */ - pcilib_error("Python is not supported"); - if(err) *err = PCILIB_ERROR_NOTSUPPORTED; - return NULL; -#endif /* HAVE_PYTHON */ -} - -int pcilib_py_ctx_add_script_dir(pcilib_py_t *ctx_py, const char *dir) { -#ifdef HAVE_PYTHON - int err = 0; - PyObject *pypath, *pynewdir; - PyObject *pydict, *pystr, *pyret = NULL; - - //const char *model_dir = getenv("PCILIB_MODEL_DIR"); - //if (!model_dir) model_dir = PCILIB_MODEL_DIR; - - pypath = PySys_GetObject("path"); - if (!pypath) { - pcilib_python_error("Can't get python path"); + pcilib_python_error("Error executing function (%s) of python script (%s)", func_name, script_name); return PCILIB_ERROR_FAILED; } - pynewdir = PyString_FromString(dir); - if (!pynewdir) { - pcilib_python_error("Can't create python string"); - return PCILIB_ERROR_MEMORY; - } - - // Checking if the directory already in the path - pydict = PyDict_New(); - if (pydict) { - pystr = PyString_FromString("cur"); - if (pystr) { - PyDict_SetItem(pydict, pystr, pynewdir); - Py_DECREF(pystr); - } else { - pcilib_python_error("Can't create python string"); - return PCILIB_ERROR_MEMORY; - } - - pystr = PyString_FromString("path"); - if (pystr) { - PyDict_SetItem(pydict, pystr, pypath); - Py_DECREF(pystr); - } else { - pcilib_python_error("Can't create python string"); - return PCILIB_ERROR_MEMORY; - } - - pyret = PyRun_String("cur in path", Py_eval_input, ctx_py->global_dict, pydict); - Py_DECREF(pydict); - - } else { - pcilib_python_error("Can't create python dict"); - return PCILIB_ERROR_MEMORY; - } - - if ((pyret == Py_False)&&(PyList_Append(pypath, pynewdir) == -1)) - err = PCILIB_ERROR_FAILED; + if ((val)&&(pyret != Py_None)) + err = pcilib_set_value_from_pyobject(ctx, val, pyret); - if (pyret) Py_DECREF(pyret); - Py_DECREF(pynewdir); + Py_DECREF(pyret); + PyGILState_Release(gstate); - if (err) { - pcilib_python_error("Can't add directory (%s) to python path", dir); - return err; - } - return 0; + return err; #else /* HAVE_PYTHON */ pcilib_error("Python is not supported"); return PCILIB_ERROR_NOTSUPPORTED; #endif /* HAVE_PYTHON */ } - -pcilib_py_t* pcilib_init_py_ctx(pcilib_py_t* in, int *err) { - pcilib_py_t* out = (pcilib_py_t*)malloc(sizeof(pcilib_py_t)); - if (!out) { - if(err) *err = PCILIB_ERROR_MEMORY; - return NULL; - } - - out->finalyze = 0; - out->main_module = in->main_module; - out->global_dict = in->global_dict; - out->pcilib_pywrap = in->pcilib_pywrap; - out->script_hash = NULL; - - if(err) *err = 0; - return out; -} - -/*! - * \brief Wrap for PyDict_SetItem, with decrease reference counting after set. - */ -void pcilib_pydict_set_item(pcilib_py_object* dict, pcilib_py_object* name, pcilib_py_object* value) -{ - PyDict_SetItem(dict, - name, - value); - Py_XDECREF(name); - Py_XDECREF(value); -} - -/*! - * \brief Wrap for PyList_Append, with decrease reference counting after append. - */ -void pcilib_pylist_append(pcilib_py_object* list, pcilib_py_object* value) -{ - PyList_Append(list, value); - Py_XDECREF(value); -} - -pcilib_py_object *pcilib_py_ctx_get_scripts_info(pcilib_py_t *ctx_py) { - - PyObject* pyList = PyList_New(0); - - if (ctx_py->script_hash) { - pcilib_script_t *script, *script_tmp; - - HASH_ITER(hh, ctx_py->script_hash, script, script_tmp) { - - PyObject* pylistItem = PyDict_New(); - pcilib_pydict_set_item(pylistItem, - PyString_FromString("name"), - PyString_FromString(script->name)); - - PyObject* dict = PyModule_GetDict(script->module); - if (dict) { - PyObject* pystr = PyString_FromString("description"); - if (pystr) { - if (PyDict_Contains(dict, pystr)) { - PyDict_SetItem(pylistItem, - pystr, - PyDict_GetItem(dict, pystr)); - } - Py_DECREF(pystr); - } - } - pcilib_pylist_append(pyList, pylistItem); - - } - } - return pyList; -} diff --git a/pcilib/py.h b/pcilib/py.h index 62ce7db..c372a09 100644 --- a/pcilib/py.h +++ b/pcilib/py.h @@ -118,64 +118,6 @@ int pcilib_py_eval_string(pcilib_t *ctx, const char *codestr, pcilib_value_t *va */ int pcilib_py_eval_func(pcilib_t *ctx, const char *script, const char *func, pcilib_value_t *val); - -/** Clone pcilib_py_t content without scripts hash - * @param[in] in - pcilib_py_t content to clone - * @param[out] err - error - * @return - NULL or cloned pcilib_py_t content pointer on success - */ -pcilib_py_t* pcilib_init_py_ctx(pcilib_py_t* in, int *err); - -/** - * @brief pcilib_t independent variant pcilib_free_py - * @param ctx_py[in,out] - pcilib_py_t context - */ -void pcilib_free_py_ctx(pcilib_py_t *ctx_py); - -/** pcilib_t independent variant of pcilib_py_eval_func() - * @param ctx_py[in,out] - pcilib_py_t context - * @param name[in] - script name - * @param name[in] - function name - * @param pyval[in] - input value (will be decref in this fucntion) - * @param err[out] - error - * @return value returned by python function - */ -pcilib_py_object* pcilib_py_ctx_eval_func(pcilib_py_t *ctx_py, - const char *name, - const char *func_name, - pcilib_py_object *pyval, - int *err); - -/** - * @brief pcilib_t independent variant of pcilib_py_add_script_dir - * @param ctx_py[in,out] - pcilib_py_t context - * @param[in] location - NULL or path to additional scripts - * @return - */ -int pcilib_py_ctx_add_script_dir(pcilib_py_t *ctx_py, const char *location); - -/** - * @brief pcilib_t independent variant of pcilib_py_load_script - * @param ctx_py[in,out] - pcilib_py_t context - * @param[in] name - script name, the passed variable is referenced and, hence, should have static duration - * @return - */ -int pcilib_py_ctx_load_script(pcilib_py_t *ctx_py, const char *name); - -/** - * @brief Returns information about scripts aviable in model - * @param ctx_py[in,out] - pcilib_py_t context - * @return List with information about scripts - */ -pcilib_py_object *pcilib_py_ctx_get_scripts_info(pcilib_py_t *ctx_py); - -/** Wrap for PyDict_SetItem, with decrease reference counting after set. - */ -void pcilib_pydict_set_item(pcilib_py_object* dict, pcilib_py_object* name, pcilib_py_object* value); - -/** Wrap for PyList_Append, with decrease reference counting after append. - */ -void pcilib_pylist_append(pcilib_py_object* list, pcilib_py_object* value); #ifdef __cplusplus } #endif diff --git a/pyserver/api_server.py b/pyserver/api_server.py index 18ee1f8..c170a19 100644 --- a/pyserver/api_server.py +++ b/pyserver/api_server.py @@ -1,7 +1,7 @@ import os import sys -import pcipywrap +import pcilib import time import json @@ -471,7 +471,7 @@ class PcilibServerHandler(BaseHTTPRequestHandler): ' command: run_script - Run specified script\n' ' required fields\n' - ' script_name: - script name (with extension)\n' + ' script_name: - script name (without extension)\n' ' value: - input value in json format\n' '\n' @@ -503,9 +503,9 @@ class PcilibServerHandler(BaseHTTPRequestHandler): class ApiServer(MultiThreadedHTTPServer): def __init__(self, device='/dev/fpga0', model=None, adress=('0.0.0.0', 9000)): #redirect logs to exeption - pcipywrap.redirect_logs_to_exeption() + pcilib.redirect_logs_to_exeption() #pass Pcipywrap to to server handler - self.lib = pcipywrap.Pcipywrap(device, model) + self.lib = pcilib.Pcilib(device, model) def handler(*args): PcilibServerHandler(self.lib, *args) MultiThreadedHTTPServer.__init__(self, adress, handler) diff --git a/pywrap/CMakeLists.txt b/pywrap/CMakeLists.txt index 8f14e4f..4cc51da 100644 --- a/pywrap/CMakeLists.txt +++ b/pywrap/CMakeLists.txt @@ -19,7 +19,9 @@ swig_link_libraries(pcipywrap ${PYTHON_LIBRARIES} pcilib) install(TARGETS ${SWIG_MODULE_pcipywrap_REAL_NAME} DESTINATION ${PYTHON_INSTALL_DIR}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pcipywrap.py DESTINATION ${PYTHON_INSTALL_DIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pcilib.py DESTINATION ${PYTHON_INSTALL_DIR}) if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) - file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test_pcipywrap.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/pcilib.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test_pcilib.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) endif(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) diff --git a/pywrap/pcilib.py b/pywrap/pcilib.py new file mode 100644 index 0000000..7696524 --- /dev/null +++ b/pywrap/pcilib.py @@ -0,0 +1,38 @@ +from pcipywrap import * +import os +import sys + +class Pcilib(Pcipywrap): + def __init__(s, *args): + Pcipywrap.__init__(s, *args) + + #load scripts + scripts_dir = os.environ.get('PCILIB_SCRIPTS_DIR') + if scripts_dir: + scripts_dir_abs = os.path.abspath(scripts_dir) + if not scripts_dir_abs in sys.path: + sys.path.append(scripts_dir_abs) + + s.__scipts = dict() + for script in os.listdir(scripts_dir_abs): + if script.endswith('.py'): + script_module = os.path.splitext(script)[0] + __import__(script_module) + s.__scipts[script_module] = sys.modules[script_module] + + + def get_scripts_list(s): + scripts = [] + for script in s.__scipts: + curr_script = dict() + curr_script['name'] = script + if 'description' in dir(s.__scipts[script]): + curr_script['description'] = s.__scipts[script].description + scripts.append(curr_script) + return scripts + + + def run_script(s, name, input_value): + if not name in s.__scipts: + raise Exception('Script ' + name +' has not loaded') + return s.__scipts[name].run(s, input_value) diff --git a/pywrap/pcipywrap.c b/pywrap/pcipywrap.c index 9113d40..0f6729e 100644 --- a/pywrap/pcipywrap.c +++ b/pywrap/pcipywrap.c @@ -1,9 +1,6 @@ #include "pcipywrap.h" #include "locking.h" -#include <dirent.h> -#include <strings.h> - char* full_log = NULL; /*! @@ -104,6 +101,27 @@ void redirect_logs_to_exeption() pcilib_get_logger_context()); } +/*! + * \brief Wrap for PyDict_SetItem, with decrease reference counting after set. + */ +void pcilib_pydict_set_item(PyObject* dict, PyObject* name, PyObject* value) +{ + PyDict_SetItem(dict, + name, + value); + Py_XDECREF(name); + Py_XDECREF(value); +} + +/*! + * \brief Wrap for PyList_Append, with decrease reference counting after append. + */ +void pcilib_pylist_append(PyObject* list, PyObject* value) +{ + PyList_Append(list, value); + Py_XDECREF(value); +} + void add_pcilib_value_to_dict(pcilib_t* ctx, PyObject* dict, pcilib_value_t* val, const char *name) { PyObject *py_val = (PyObject*)pcilib_get_value_as_pyobject(ctx, val, NULL); @@ -197,198 +215,126 @@ PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_proper PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_register_info_t listItem) { - PyObject* pylistItem = PyDict_New(); - - if(listItem.name) - pcilib_pydict_set_item(pylistItem, - PyString_FromString("name"), - PyString_FromString(listItem.name)); - - if(listItem.description) - pcilib_pydict_set_item(pylistItem, - PyString_FromString("description"), - PyString_FromString(listItem.description)); - - if(listItem.bank) - pcilib_pydict_set_item(pylistItem, - PyString_FromString("bank"), - PyString_FromString(listItem.bank)); - - - //serialize modes - PyObject* modes = PyList_New(0); - - if((listItem.mode & PCILIB_REGISTER_R) == PCILIB_REGISTER_R) - pcilib_pylist_append(modes, PyString_FromString("R")); - if((listItem.mode & PCILIB_REGISTER_W) == PCILIB_REGISTER_W) - pcilib_pylist_append(modes, PyString_FromString("W")); - if((listItem.mode & PCILIB_REGISTER_RW) == PCILIB_REGISTER_RW) - pcilib_pylist_append(modes, PyString_FromString("RW")); - if((listItem.mode & PCILIB_REGISTER_W1C) == PCILIB_REGISTER_W1C) - pcilib_pylist_append(modes, PyString_FromString("W1C")); - if((listItem.mode & PCILIB_REGISTER_RW1C) == PCILIB_REGISTER_RW1C) - pcilib_pylist_append(modes, PyString_FromString("RW1C")); - if((listItem.mode & PCILIB_REGISTER_W1I) == PCILIB_REGISTER_W1I) - pcilib_pylist_append(modes, PyString_FromString("W1I")); - if((listItem.mode & PCILIB_REGISTER_RW1I) == PCILIB_REGISTER_RW1I) - pcilib_pylist_append(modes, PyString_FromString("RW1I")); - if((listItem.mode & PCILIB_REGISTER_INCONSISTENT) == PCILIB_REGISTER_INCONSISTENT) - pcilib_pylist_append(modes, PyString_FromString("NO_CHK")); - - pcilib_pydict_set_item(pylistItem, - PyString_FromString("mode"), - modes); - - pcilib_value_t defval = {0}; - pcilib_set_value_from_register_value(ctx, &defval, listItem.defvalue); - add_pcilib_value_to_dict(ctx, pylistItem, &defval, "defvalue"); - - if(listItem.range) - { - pcilib_value_t minval = {0}; - pcilib_set_value_from_register_value(ctx, &minval, listItem.range->min); - - pcilib_value_t maxval = {0}; - pcilib_set_value_from_register_value(ctx, &maxval, listItem.range->max); - - PyObject* range = PyDict_New(); - add_pcilib_value_to_dict(ctx, range, &minval, "min"); - add_pcilib_value_to_dict(ctx, range, &maxval, "max"); - pcilib_pydict_set_item(pylistItem, - PyString_FromString("range"), - range); - } + PyObject* pylistItem = PyDict_New(); - if(listItem.values) - { + if(listItem.name) + pcilib_pydict_set_item(pylistItem, + PyString_FromString("name"), + PyString_FromString(listItem.name)); - PyObject* values = PyList_New(0); + if(listItem.description) + pcilib_pydict_set_item(pylistItem, + PyString_FromString("description"), + PyString_FromString(listItem.description)); - for (int j = 0; listItem.values[j].name; j++) - { - PyObject* valuesItem = PyDict_New(); + if(listItem.bank) + pcilib_pydict_set_item(pylistItem, + PyString_FromString("bank"), + PyString_FromString(listItem.bank)); - pcilib_value_t val = {0}; - pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value); - pcilib_value_t min = {0}; - pcilib_set_value_from_register_value(ctx, &min, listItem.values[j].min); + //serialize modes + PyObject* modes = PyList_New(0); - pcilib_value_t max = {0}; - pcilib_set_value_from_register_value(ctx, &max, listItem.values[j].max); + if((listItem.mode & PCILIB_REGISTER_R) == PCILIB_REGISTER_R) + pcilib_pylist_append(modes, PyString_FromString("R")); + if((listItem.mode & PCILIB_REGISTER_W) == PCILIB_REGISTER_W) + pcilib_pylist_append(modes, PyString_FromString("W")); + if((listItem.mode & PCILIB_REGISTER_RW) == PCILIB_REGISTER_RW) + pcilib_pylist_append(modes, PyString_FromString("RW")); + if((listItem.mode & PCILIB_REGISTER_W1C) == PCILIB_REGISTER_W1C) + pcilib_pylist_append(modes, PyString_FromString("W1C")); + if((listItem.mode & PCILIB_REGISTER_RW1C) == PCILIB_REGISTER_RW1C) + pcilib_pylist_append(modes, PyString_FromString("RW1C")); + if((listItem.mode & PCILIB_REGISTER_W1I) == PCILIB_REGISTER_W1I) + pcilib_pylist_append(modes, PyString_FromString("W1I")); + if((listItem.mode & PCILIB_REGISTER_RW1I) == PCILIB_REGISTER_RW1I) + pcilib_pylist_append(modes, PyString_FromString("RW1I")); + if((listItem.mode & PCILIB_REGISTER_INCONSISTENT) == PCILIB_REGISTER_INCONSISTENT) + pcilib_pylist_append(modes, PyString_FromString("NO_CHK")); - add_pcilib_value_to_dict(ctx, valuesItem, &val, "value"); - add_pcilib_value_to_dict(ctx, valuesItem, &min, "min"); - add_pcilib_value_to_dict(ctx, valuesItem, &max, "max"); + pcilib_pydict_set_item(pylistItem, + PyString_FromString("mode"), + modes); - if(listItem.values[j].name) - pcilib_pydict_set_item(valuesItem, - PyString_FromString("name"), - PyString_FromString(listItem.values[j].name)); - if(listItem.values[j].description) - { - pcilib_pydict_set_item(valuesItem, - PyString_FromString("description"), - PyString_FromString(listItem.values[j].description)); + pcilib_value_t defval = {0}; + pcilib_set_value_from_register_value(ctx, &defval, listItem.defvalue); + add_pcilib_value_to_dict(ctx, pylistItem, &defval, "defvalue"); - } - pcilib_pylist_append(values, valuesItem); - } + if(listItem.range) + { + pcilib_value_t minval = {0}; + pcilib_set_value_from_register_value(ctx, &minval, listItem.range->min); - pcilib_pydict_set_item(pylistItem, - PyString_FromString("values"), - values); - } + pcilib_value_t maxval = {0}; + pcilib_set_value_from_register_value(ctx, &maxval, listItem.range->max); - return pylistItem; -} + PyObject* range = PyDict_New(); + add_pcilib_value_to_dict(ctx, range, &minval, "min"); + add_pcilib_value_to_dict(ctx, range, &maxval, "max"); + pcilib_pydict_set_item(pylistItem, + PyString_FromString("range"), + range); + } + + if(listItem.values) + { + + PyObject* values = PyList_New(0); + + for (int j = 0; listItem.values[j].name; j++) + { + PyObject* valuesItem = PyDict_New(); + + pcilib_value_t val = {0}; + pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value); + + pcilib_value_t min = {0}; + pcilib_set_value_from_register_value(ctx, &min, listItem.values[j].min); + + pcilib_value_t max = {0}; + pcilib_set_value_from_register_value(ctx, &max, listItem.values[j].max); + + add_pcilib_value_to_dict(ctx, valuesItem, &val, "value"); + add_pcilib_value_to_dict(ctx, valuesItem, &min, "min"); + add_pcilib_value_to_dict(ctx, valuesItem, &max, "max"); + + if(listItem.values[j].name) + pcilib_pydict_set_item(valuesItem, + PyString_FromString("name"), + PyString_FromString(listItem.values[j].name)); + if(listItem.values[j].description) + { + pcilib_pydict_set_item(valuesItem, + PyString_FromString("description"), + PyString_FromString(listItem.values[j].description)); + + } + pcilib_pylist_append(values, valuesItem); + } + + pcilib_pydict_set_item(pylistItem, + PyString_FromString("values"), + values); + } + + return pylistItem; +} Pcipywrap *new_Pcipywrap(const char* fpga_device, const char* model) { //opening device pcilib_t* ctx = pcilib_open(fpga_device, model); - if(!ctx) { + if(!ctx) + { set_python_exception("Failed pcilib_open(%s, %s)", fpga_device, model); return NULL; } - Pcipywrap *self; self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); - if(!self) { - pcilib_close(ctx); - return (Pcipywrap *)PyExc_MemoryError; - } self->shared = 0; self->ctx = ctx; - self->py = NULL; - self->names = NULL; - self->names_size = 0; - - - //processing pcilib scrips - const char *scripts_dir = getenv("PCILIB_SCRIPTS_DIR"); - if(scripts_dir) { - int err = 0; - - self->py = pcilib_init_py_ctx(ctx->py, &err); - if(err) { - delete_Pcipywrap(self); - set_python_exception("Failed pcilib_py_s_clone (%i)", err); - return NULL; - } - - //add scripts directory to Python path - err = pcilib_py_ctx_add_script_dir(self->py, scripts_dir); - if(err) { - delete_Pcipywrap(self); - set_python_exception("Failed pcilib_py_add_dir (%i)", err); - return NULL; - } - - //load scripts in PCILIB_SCRIPTS_DIR - self->names = malloc(++(self->names_size) * sizeof(char*)); - self->names[self->names_size - 1] = NULL; - - DIR *dir; - struct dirent *script_path; - dir = opendir(scripts_dir); - if (dir) { - while ((script_path = readdir(dir)) != NULL) { - - char *py = strrchr(script_path->d_name, '.'); - if ((!py)||(strcasecmp(py, ".py"))) { - continue; - } - - char *name = malloc(strlen(script_path->d_name)); - if(!name) { - delete_Pcipywrap(self); - return (Pcipywrap *)PyExc_MemoryError; - } - - strcpy(name, script_path->d_name); - - err = pcilib_py_ctx_load_script(self->py, name); - - if(err) { - delete_Pcipywrap(self); - set_python_exception("pcilib_py_ctx_load_script (%i)", err); - return NULL; - } - - self->names = realloc(self->names, ++(self->names_size)); - if(!self->names) { - delete_Pcipywrap(self); - return (Pcipywrap *)PyExc_MemoryError; - } - self->names[self->names_size - 1] = NULL; - self->names[self->names_size - 2] = name; - } - closedir(dir); - } - } - return self; } @@ -404,27 +350,14 @@ Pcipywrap *create_Pcipywrap(PyObject* ctx) self = (Pcipywrap *) malloc(sizeof(Pcipywrap)); self->shared = 1; self->ctx = PyCObject_AsVoidPtr(ctx); - self->py = NULL; - self->names = NULL; - self->names_size = 0; return self; } void delete_Pcipywrap(Pcipywrap *self) { - if(!self->shared) - pcilib_close(self->ctx); - - pcilib_free_py_ctx(self->py); - - if(self->names) { - for(int i = 0; self->names[i]; i++) - free(self->names[i]); - free(self->names); - self->names = NULL; - self->names_size = 0; - } - - free(self); + if(!self->shared) + pcilib_close(self->ctx); + + free(self); } PyObject* Pcipywrap_read_register(Pcipywrap *self, const char *regname, const char *bank) @@ -531,7 +464,7 @@ PyObject* Pcipywrap_get_registers_list(Pcipywrap *self, const char *bank) set_python_exception("pcilib_get_register_list return NULL"); return NULL; } - + PyObject* pyList = PyList_New(0); for(int i = 0; list[i].name; i++) { @@ -676,20 +609,4 @@ PyObject* Pcipywrap_unlock(Pcipywrap *self, const char *lock_id) return PyInt_FromLong((long)1); } -PyObject* Pcipywrap_get_scripts_list(Pcipywrap *self) -{ - return pcilib_py_ctx_get_scripts_info(self->py); -} -PyObject* Pcipywrap_run_script(Pcipywrap *self, const char* script_name, PyObject* value) -{ - int err = 0; - PyObject* value_out = pcilib_py_ctx_eval_func(self->py, script_name, "run", value, &err); - - if(err) { - set_python_exception("Failed pcilib_py_ctx_eval_func (%i)", err); - return NULL; - } - - return value_out; -} diff --git a/pywrap/pcipywrap.h b/pywrap/pcipywrap.h index fa7e4f4..0258f04 100644 --- a/pywrap/pcipywrap.h +++ b/pywrap/pcipywrap.h @@ -5,23 +5,11 @@ #include "error.h" #include <Python.h> -#include "config.h" -#include "py.h" - -#include "pci.h" -#include "pcilib.h" - - typedef struct { - char** names; - int names_size; - void* ctx; - struct pcilib_py_s *py; int shared; } Pcipywrap; - /*! * \brief Redirect pcilib standart log stream to exeption text. * Logger will accumulate errors untill get message, starts with "#E". @@ -73,55 +61,18 @@ PyObject* Pcipywrap_get_property(Pcipywrap *self, const char *prop); * \return 1, serialized to PyObject or NULL with exeption text, if failed. */ PyObject* Pcipywrap_set_property(Pcipywrap *self, PyObject* val, const char *prop); - - -/*! - * \brief Wrap for pcilib_get_register_list function. - * \param bank [in] bank - if set, only register within the specified bank will be returned - * \return list of registers, serialized to Python object - */ PyObject* Pcipywrap_get_registers_list(Pcipywrap *self, const char *bank); - -/*! - * \brief Returns the information about the specified register. Wrap for pcilib_get_register_info - * \param[in] reg the name of the register - * \param[in] bank indicates the bank where to look for register, autodetected if NULL is passed - * \return information about the specified register, serialized to Python object - */ PyObject* Pcipywrap_get_register_info(Pcipywrap *self, const char* reg,const char *bank); - -/*! - * \brief Returns the list of properties available under the specified path. Wrap for pcilib_get_property_list - * \param[in] branch path or NULL to return the top-level properties - * \return the list of the properties, serialized to Python object - */ PyObject* Pcipywrap_get_property_list(Pcipywrap *self, const char* branch); -/*! - * \brief Reads data from DMA until timeout is hit, a full DMA packet is read, or the specified number of bytes are read. - * Wrap for pcilib_read_dma. - * \param dma ID of DMA engine - * \param size specifies how many bytes should be read - * \return DMA data, serialierd to Python bytearray - * \warning This function has not been tested. - * \todo Test this fucntion - */ PyObject* Pcipywrap_read_dma(Pcipywrap *self, unsigned char dma, size_t size); -/*! - * \brief Wrap for pcilib_lock_global - * \return 1, serialized to PyObject or NULL with exeption text, if failed. - */ PyObject* Pcipywrap_lock_global(Pcipywrap *self); - -/*! - * \brief Wrap for pcilib_unlock_global - */ void Pcipywrap_unlock_global(Pcipywrap *self); /*! * \brief Wrap for pcilib_lock - * \param[in] lock_id lock identificator + * \param lock_id lock identificator * \warning This function should be called only under Python standart threading lock. * Otherwise it will stuck with more than 1 threads. See /xml/test/test_prop_mt.py * for example. @@ -129,35 +80,7 @@ void Pcipywrap_unlock_global(Pcipywrap *self); */ PyObject* Pcipywrap_lock(Pcipywrap *self, const char *lock_id); -/*! - * \brief This function will try to take a lock for the mutex pointed by - * lockfunction to acquire a lock, but that returns immediatly if the lock can't be - * acquired on first try. Wrap for pcilib_try_lock. - * \param[in] lock_id lock id - * \return 1, serialized to PyObject or NULL with exeption text, if failed. - */ PyObject* Pcipywrap_try_lock(Pcipywrap *self, const char *lock_id); - -/*! - * \brief This function unlocks the lock with specified id. Wrap for pcilib_unlock. - * \param[in] lock_id lock id - * \return 1, serialized to PyObject or NULL with exeption text, if failed. - */ PyObject* Pcipywrap_unlock(Pcipywrap *self, const char *lock_id); -/*! - * \brief Returns list with information about aviable scripts - * \return list with information about scripts, aviable in model - */ -PyObject* Pcipywrap_get_scripts_list(Pcipywrap *self); - -/*! - * \brief Runs script with specified name - * \param script_name script name (with extension); name could be found by - * Pcipywrap_get_scripts_list fucntion - * \param[in] value input value - * \return value returned by script - */ -PyObject* Pcipywrap_run_script(Pcipywrap *self, const char* script_name, PyObject* value); - #endif /* PCIPYWRAP_H */ diff --git a/pywrap/pcipywrap.i b/pywrap/pcipywrap.i index 697820d..7749a67 100644 --- a/pywrap/pcipywrap.i +++ b/pywrap/pcipywrap.i @@ -29,8 +29,5 @@ typedef struct { PyObject* lock(const char *lock_id); PyObject* try_lock(const char *lock_id); PyObject* unlock(const char *lock_id); - - PyObject* get_scripts_list(); - PyObject* run_script(const char* script_name, PyObject* value); } } Pcipywrap; diff --git a/pywrap/test_pcipywrap.py b/pywrap/test_pcilib.py index 809a81a..69540ec 100644 --- a/pywrap/test_pcipywrap.py +++ b/pywrap/test_pcilib.py @@ -1,5 +1,5 @@ import threading -import pcipywrap +import pcilib import random import os import json @@ -7,7 +7,7 @@ import requests import time from optparse import OptionParser, OptionGroup -class test_pcipywrap(): +class test_pcilib(): def __init__(self, device, model, @@ -35,7 +35,7 @@ class test_pcipywrap(): #create pcilib_instance self.device = device self.model = model - self.pcilib = pcipywrap.Pcipywrap(device, model) + self.pcilib = pcilib.Pcilib(device, model) self.num_threads = num_threads self.write_percentage = write_percentage self.register = register @@ -83,7 +83,7 @@ class test_pcipywrap(): try: while(1): val = random.randint(0, 8096) - self.pcilib = pcipywrap.Pcipywrap(self.device, self.model) + self.pcilib = pcilib.Pcilib(self.device, self.model) print self.pcilib.get_property_list(self.branch) print self.pcilib.get_register_info(self.register) print self.pcilib.get_registers_list(); @@ -232,7 +232,7 @@ if __name__ == '__main__': opts = parser.parse_args()[0] #create pcilib test instance - lib = test_pcipywrap(opts.device, + lib = test_pcilib(opts.device, opts.model, num_threads = opts.threads, write_percentage = opts.write_percentage, diff --git a/xml/scripts/test_script.py b/xml/scripts/test_script.py index 5363a94..46a5b25 100644 --- a/xml/scripts/test_script.py +++ b/xml/scripts/test_script.py @@ -1,4 +1,2 @@ -description='this is a test script' - def run(ctx, inpt): return bytearray('111') |