summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVasilii Chernov <vchernov@inr.ru>2016-03-02 10:26:13 +0100
committerVasilii Chernov <vchernov@inr.ru>2016-03-02 10:26:13 +0100
commit8719b84a95805d109e21c20f05a0164315e1b38a (patch)
tree2cfbb6ce8af7e9a4acd9e2e085bef8a212bc1701
parent8eca0564a1dd6aac125086a244687b4813a1fd86 (diff)
downloadpcitool-8719b84a95805d109e21c20f05a0164315e1b38a.tar.gz
pcitool-8719b84a95805d109e21c20f05a0164315e1b38a.tar.bz2
pcitool-8719b84a95805d109e21c20f05a0164315e1b38a.tar.xz
pcitool-8719b84a95805d109e21c20f05a0164315e1b38a.zip
Move scripts handing code from py.c to Python wrap
-rw-r--r--pcilib/py.c313
-rw-r--r--pcilib/py.h58
-rw-r--r--pyserver/api_server.py8
-rw-r--r--pywrap/CMakeLists.txt4
-rw-r--r--pywrap/pcilib.py38
-rw-r--r--pywrap/pcipywrap.c327
-rw-r--r--pywrap/pcipywrap.h79
-rw-r--r--pywrap/pcipywrap.i3
-rw-r--r--pywrap/test_pcilib.py (renamed from pywrap/test_pcipywrap.py)10
-rw-r--r--xml/scripts/test_script.py2
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')