summaryrefslogtreecommitdiffstats
path: root/pywrap
diff options
context:
space:
mode:
authorVasilii Chernov <vchernov@inr.ru>2016-02-17 11:01:22 +0100
committerVasilii Chernov <vchernov@inr.ru>2016-02-17 11:01:22 +0100
commit3269dce32883e14b45cc490a0cc0037b4c808a68 (patch)
treead4a551ac5ccfb8ed74d01095c7dad00c532c84c /pywrap
parented9d8f285f4d81e1ce8bb5e7a5b9e471a73c1590 (diff)
downloadpcitool-3269dce32883e14b45cc490a0cc0037b4c808a68.tar.gz
pcitool-3269dce32883e14b45cc490a0cc0037b4c808a68.tar.bz2
pcitool-3269dce32883e14b45cc490a0cc0037b4c808a68.tar.xz
pcitool-3269dce32883e14b45cc490a0cc0037b4c808a68.zip
1. Add cmake BUILD_PYTHON_MODULES option.
2. Rename log options getting functions. 3. py: - pcilib_init_py() - extract pcilib_py_add_script_dir() - pcilib_py_init_script() - extract view-specialized code to pcilib_py_get_transform_script_properties() 3. pcilib_open(): - move pcilib_init_py() to previous position. - add extract pcilib_py_add_script_dir() 4. pcilib_script_s - change hash key. Now it is (const char*) and contains script file name with extension 5. pcipywrap: - Add pcipywrap.h to remove swig generated file complile warnings - remove -includeall swig flag to prevent crash in multi-thread scripts - change set python expetion mechanic
Diffstat (limited to 'pywrap')
-rw-r--r--pywrap/CMakeLists.txt5
-rw-r--r--pywrap/pcipywrap.c135
-rw-r--r--pywrap/pcipywrap.i4
3 files changed, 53 insertions, 91 deletions
diff --git a/pywrap/CMakeLists.txt b/pywrap/CMakeLists.txt
index e5f7ea7..d4d75d1 100644
--- a/pywrap/CMakeLists.txt
+++ b/pywrap/CMakeLists.txt
@@ -8,14 +8,13 @@ include_directories(
${UTHASH_INCLUDE_DIRS}
)
+set(HEADERS pcipywrap.h)
+
#Creating python wrapping
INCLUDE(${SWIG_USE_FILE})
-
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
-
SET(CMAKE_SWIG_FLAGS "")
-SET_SOURCE_FILES_PROPERTIES(pcipywrap.i PROPERTIES SWIG_FLAGS "-includeall")
SWIG_ADD_MODULE(pcipywrap python pcipywrap.i pcipywrap.c)
SWIG_LINK_LIBRARIES(pcipywrap ${PYTHON_LIBRARIES} pcilib)
diff --git a/pywrap/pcipywrap.c b/pywrap/pcipywrap.c
index 40dbdfc..639fa15 100644
--- a/pywrap/pcipywrap.c
+++ b/pywrap/pcipywrap.c
@@ -1,6 +1,4 @@
-#include "pci.h"
-#include "error.h"
-#include <Python.h>
+#include "pcipywrap.h"
/*!
* \brief Global pointer to pcilib_t context.
@@ -63,25 +61,11 @@ void pcilib_print_error_to_py(void *arg, const char *file, int line,
{
if(!full_log)
full_log = make_str("");
-
- if(strlen(buf_wrapped_message) >= 2 &&
- buf_wrapped_message[0] == '#' &&
- buf_wrapped_message[1] == 'E')
- {
- char* wrapped_exeption = make_str("%sprogramm error log:\n%s", &(buf_wrapped_message[2]), full_log);
- free(full_log);
- full_log = NULL;
- PyErr_SetString(PyExc_Exception, wrapped_exeption);
- free(wrapped_exeption);
- }
- else
- {
- //copy received message to log
- char* buf = full_log;
- full_log = make_str("%s%s", buf, buf_wrapped_message);
- free(buf);
- }
+ //copy received message to log
+ char* buf = full_log;
+ full_log = make_str("%s%s", buf, buf_wrapped_message);
+ free(buf);
}
else
printf(buf_wrapped_message);
@@ -90,17 +74,35 @@ void pcilib_print_error_to_py(void *arg, const char *file, int line,
free(buf_raw_msg);
}
-/*!
- * \brief Redirect pcilib standart log stream to exeption text.
- * Logger will accumulate errors untill get message, starts with "#E".
- * After that, logger will write last error, and all accumulated errors
- * to Python exeption text
- */
+void set_python_exception(const char* msg, ...)
+{
+ va_list vl;
+ va_start(vl, msg);
+ char *buf = vmake_str(msg, vl);
+
+ char* wrapped_exeption;
+ if(full_log)
+ wrapped_exeption = make_str("%s\nprogramm error log:\n%s", buf, full_log);
+ else
+ wrapped_exeption = buf;
+
+ free(full_log);
+ full_log = NULL;
+
+ PyErr_SetString(PyExc_Exception, wrapped_exeption);
+
+ free(buf);
+ if(full_log)
+ free(wrapped_exeption);
+ va_end(vl);
+}
+
+
void __redirect_logs_to_exeption()
{
- pcilib_set_logger(pcilib_get_logger_min_prio(),
+ pcilib_set_logger(pcilib_get_log_level(),
pcilib_print_error_to_py,
- pcilib_get_logger_argument());
+ pcilib_get_logger_context());
}
/*!
@@ -112,27 +114,18 @@ void close_pcilib_instance(void *ctx)
pcilib_close(ctx);
}
-/*!
- * \brief Wraps for pcilib_open function.
- * \param[in] fpga_device path to the device file [/dev/fpga0]
- * \param[in] model specifies the model of hardware, autodetected if NULL is passed
- * \return Pointer to pcilib_t, created by pcilib_open; NULL with exeption text, if failed.
- */
PyObject* create_pcilib_instance(const char *fpga_device, const char *model)
{
//opening device
pcilib_t* ctx = pcilib_open(fpga_device, model);
if(!ctx)
{
- pcilib_error("#E Failed pcilib_open(%s, %s)", fpga_device, model);
+ set_python_exception("Failed pcilib_open(%s, %s)", fpga_device, model);
return NULL;
}
return PyCObject_FromVoidPtr((void*)ctx, close_pcilib_instance);
}
-/*!
- * \brief Closes current pciliv instance, if its open.
- */
void close_curr_pcilib_instance()
{
if(__ctx)
@@ -142,25 +135,16 @@ void close_curr_pcilib_instance()
}
}
-/*!
- * \brief Returns current opened pcilib_t instatnce
- * \return Pointer to pcilib_t, serialized to bytearray
- */
PyObject* get_curr_pcilib_instance()
{
return PyByteArray_FromStringAndSize((const char*)&__ctx, sizeof(pcilib_t*));
}
-/*!
- * \brief Sets pcilib context to wraper.
- * \param[in] addr Pointer to pcilib_t, serialized to PyCObject
- * \return 1, serialized to PyObject or NULL with exeption text, if failed.
- */
PyObject* set_pcilib(PyObject* addr)
{
if(!PyCObject_Check(addr))
{
- pcilib_error("#E Incorrect addr type. Only PyCObject is allowed");
+ set_python_exception("Incorrect addr type. Only PyCObject is allowed");
return NULL;
}
@@ -169,18 +153,11 @@ PyObject* set_pcilib(PyObject* addr)
return PyInt_FromLong((long)1);
}
-
-/*!
- * \brief Reads register value. Wrap for pcilib_read_register function.
- * \param[in] regname the name of the register
- * \param[in] bank should specify the bank name if register with the same name may occur in multiple banks, NULL otherwise
- * \return register value, can be integer or float type; NULL with exeption text, if failed.
- */
PyObject* read_register(const char *regname, const char *bank)
{
if(!__ctx)
{
- pcilib_error("#E pcilib_t handler not initialized");
+ set_python_exception("pcilib_t handler not initialized");
return NULL;
}
@@ -192,27 +169,20 @@ PyObject* read_register(const char *regname, const char *bank)
err = pcilib_read_register(__ctx, bank, regname, &reg_value);
if(err)
{
- pcilib_error("#E Failed pcilib_read_register");
+ set_python_exception("Failed pcilib_read_register");
return NULL;
}
err = pcilib_set_value_from_register_value(__ctx, &val, reg_value);
if(err)
{
- pcilib_error("#E Failed pcilib_set_value_from_register_value");
+ set_python_exception("Failed pcilib_set_value_from_register_value");
return NULL;
}
return pcilib_get_value_as_pyobject(__ctx, &val, NULL);
}
-/*!
- * \brief Writes value to register. Wrap for pcilib_write_register function.
- * \param[in] val Register value, that needs to be set. Can be int, float or string.
- * \param[in] regname the name of the register
- * \param[in] bank should specify the bank name if register with the same name may occur in multiple banks, NULL otherwise
- * \return 1, serialized to PyObject or NULL with exeption text, if failed.
- */
PyObject* write_register(PyObject* val, const char *regname, const char *bank)
{
if(!__ctx)
@@ -231,7 +201,7 @@ PyObject* write_register(PyObject* val, const char *regname, const char *bank)
if(err)
{
- pcilib_error("#E Failed pcilib_set_value_from_pyobject");
+ set_python_exception("Failed pcilib_set_value_from_pyobject");
return NULL;
}
@@ -239,7 +209,7 @@ PyObject* write_register(PyObject* val, const char *regname, const char *bank)
reg_value = pcilib_get_value_as_register_value(__ctx, &val_internal, &err);
if(err)
{
- pcilib_error("#E Failed pcilib_set_value_from_pyobject, (error %i)", err);
+ set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err);
return NULL;
}
@@ -247,23 +217,18 @@ PyObject* write_register(PyObject* val, const char *regname, const char *bank)
if(err)
{
- pcilib_error("#E Failed pcilib_set_value_from_pyobject, (error %i)", err);
+ set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err);
return NULL;
}
return PyInt_FromLong((long)1);
}
-/*!
- * \brief Reads propety value. Wrap for pcilib_get_property function.
- * \param[in] prop property name (full name including path)
- * \return property value, can be integer or float type; NULL with exeption text, if failed.
- */
PyObject* get_property(const char *prop)
{
if(!__ctx)
{
- pcilib_error("#E pcilib_t handler not initialized");
+ set_python_exception("pcilib_t handler not initialized");
return NULL;
}
@@ -274,26 +239,20 @@ PyObject* get_property(const char *prop)
if(err)
{
- pcilib_error("#E Failed pcilib_get_property, (error %i)", err);
+ set_python_exception("Failed pcilib_get_property, (error %i)", err);
return NULL;
}
return pcilib_get_value_as_pyobject(__ctx, &val, NULL);
}
-/*!
- * \brief Writes value to property. Wrap for pcilib_set_property function.
- * \param[in] prop property name (full name including path)
- * \param[in] val Property value, that needs to be set. Can be int, float or string.
- * \return 1, serialized to PyObject or NULL with exeption text, if failed.
- */
PyObject* set_property(PyObject* val, const char *prop)
{
int err;
if(!__ctx)
{
- pcilib_error("#E pcilib_t handler not initialized");
+ set_python_exception("pcilib_t handler not initialized");
return NULL;
}
@@ -301,14 +260,14 @@ PyObject* set_property(PyObject* val, const char *prop)
err = pcilib_set_value_from_pyobject(__ctx, &val_internal, val);
if(err)
{
- pcilib_error("#E pcilib_set_value_from_pyobject, (error %i)", err);
+ set_python_exception("pcilib_set_value_from_pyobject, (error %i)", err);
return NULL;
}
err = pcilib_set_property(__ctx, prop, &val_internal);
if(err)
{
- pcilib_error("#E pcilib_set_property, (error %i)", err);
+ set_python_exception("pcilib_set_property, (error %i)", err);
return NULL;
}
@@ -536,7 +495,7 @@ PyObject* get_registers_list(const char *bank)
{
if(!__ctx)
{
- pcilib_error("#E pcilib_t handler not initialized");
+ set_python_exception("pcilib_t handler not initialized");
return NULL;
}
@@ -559,7 +518,7 @@ PyObject* get_register_info(const char* reg,const char *bank)
{
if(!__ctx)
{
- pcilib_error("#E pcilib_t handler not initialized");
+ set_python_exception("pcilib_t handler not initialized");
return NULL;
}
@@ -581,7 +540,7 @@ PyObject* get_property_list(const char* branch)
{
if(!__ctx)
{
- pcilib_error("#E pcilib_t handler not initialized");
+ set_python_exception("pcilib_t handler not initialized");
return NULL;
}
diff --git a/pywrap/pcipywrap.i b/pywrap/pcipywrap.i
index 86b6f36..952e145 100644
--- a/pywrap/pcipywrap.i
+++ b/pywrap/pcipywrap.i
@@ -1,5 +1,9 @@
%module pcipywrap
+%{
+#include "pcipywrap.h"
+%}
+
extern void __redirect_logs_to_exeption();
extern PyObject* create_pcilib_instance(const char *fpga_device, const char *model = NULL);