From 3269dce32883e14b45cc490a0cc0037b4c808a68 Mon Sep 17 00:00:00 2001
From: Vasilii Chernov <vchernov@inr.ru>
Date: Wed, 17 Feb 2016 11:01:22 +0100
Subject: 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

---
 pywrap/CMakeLists.txt |   5 +-
 pywrap/pcipywrap.c    | 135 ++++++++++++++++++--------------------------------
 pywrap/pcipywrap.i    |   4 ++
 3 files changed, 53 insertions(+), 91 deletions(-)

(limited to 'pywrap')

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);
-- 
cgit v1.2.3