From e10e102b8b0ff3bf35f16b5276d56059d242e1fd Mon Sep 17 00:00:00 2001
From: Vasilii Chernov <vchernov@inr.ru>
Date: Mon, 8 Feb 2016 11:55:33 +0100
Subject: Add support for setting register value to script transfrom. Add
 set_property and get_property functions to pcipywrap. Cleaning cmakelists
 from unused dependencies

---
 views/script.c | 91 ++++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 70 insertions(+), 21 deletions(-)

(limited to 'views/script.c')

diff --git a/views/script.c b/views/script.c
index 50b31b5..3d018e9 100644
--- a/views/script.c
+++ b/views/script.c
@@ -4,17 +4,15 @@
 #include <stdlib.h>
 
 #include "pci.h"
+#include "pcipywrap.h"
 #include "error.h"
 
 #include "model.h"
 #include "script.h"
 
-static int pcilib_script_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t regval, pcilib_value_t *val) {
-	
+static int pcilib_script_view_module_init(pcilib_t *ctx, pcilib_script_view_description_t *v)
+{
 	int err;
-
-    const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
-    pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(model_info->views[view_ctx->view]);
 	
 	//Initialize python script, if it has not initialized already.
 	if(!v->py_script_module)
@@ -103,6 +101,19 @@ static int pcilib_script_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ct
                                NULL);
 	}
 	
+	return 0;
+}
+
+static int pcilib_script_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t regval, pcilib_value_t *val) {
+	
+	int err;
+
+    const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
+    pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(model_info->views[view_ctx->view]);
+	
+	err = pcilib_script_view_module_init(ctx, v);
+	if(err)
+		return err;
 	
 	PyObject *ret = PyObject_CallMethod(v->py_script_module, "read_from_register", "()");
 	if (!ret) 
@@ -112,30 +123,68 @@ static int pcilib_script_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ct
 	   return PCILIB_ERROR_FAILED;
 	}
 	
-	if(PyInt_Check(ret))
+	err = pcilib_convert_pyobject_to_val(ctx, ret, val);
+	
+	if(err)
 	{
-		err = pcilib_set_value_from_int(ctx, val, PyInt_AsLong(ret));
+		pcilib_error("Failed to convert python script return value to internal type: %i", err);
+		return err;
 	}
-	else
-		if(PyFloat_Check(ret))
-			err = pcilib_set_value_from_float(ctx, val, PyFloat_AsDouble(ret));
-		else
-			if(PyString_Check(ret))
-				err = pcilib_set_value_from_static_string(ctx, val, PyString_AsString(ret));
-				else
-				{
-					pcilib_error("Invalid return type in read_from_register() method. Return type should be int, float or string.");
-					return PCILIB_ERROR_NOTSUPPORTED;
-				}
+    return 0;
+}
+
+static int pcilib_script_view_write(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t *regval, pcilib_value_t *val) {
+	
+	int err;
+
+    const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
+    pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(model_info->views[view_ctx->view]);
+	
+	err = pcilib_script_view_module_init(ctx, v);
 	if(err)
+		return err;
+		
+	PyObject *input = pcilib_convert_val_to_pyobject(ctx, val, printf);
+	if(!input)
 	{
-		pcilib_error("Failed to convert python script return value to internal type: %i", err);
+	   printf("Failed to convert input value to Python object");
+	   PyErr_Print();
+	   return PCILIB_ERROR_FAILED;
+	}
+	
+	PyObject *ret = PyObject_CallMethodObjArgs(v->py_script_module,
+											   PyUnicode_FromString("write_to_register"),
+											   input,
+											   NULL);
+	if (!ret) 
+	{
+	   printf("Python script error: ");
+	   PyErr_Print();
+	   return PCILIB_ERROR_FAILED;
+	}
+	
+	//convert output value back to pcilib_value_t
+	//no need because it wont be used later, and the script return could be none
+	/*
+	err = pcilib_convert_pyobject_to_val(ctx, ret, val);
+	if(err)
+	{
+		pcilib_error("failed to convert script write_to_register function return value to internal type: %i", err);
 		return err;
 	}
+	
+	uint64_t output = pcilib_get_value_as_register_value(ctx, val, &err);
+	if(err)
+	{
+		pcilib_error("failed to convert value to register value (%i)", err);
+		return err;
+	}
+	regval[0] = output;
+	*/
+
     return 0;
 }
 
- 
 void pcilib_script_view_free_description (pcilib_t *ctx, pcilib_view_description_t *view)
 {
 	pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(view);
@@ -154,4 +203,4 @@ void pcilib_script_view_free_description (pcilib_t *ctx, pcilib_view_description
 }
 
 const pcilib_view_api_description_t pcilib_script_view_api =
-  { PCILIB_VERSION, sizeof(pcilib_script_view_description_t), NULL, NULL, pcilib_script_view_free_description, pcilib_script_view_read, NULL};
+  { PCILIB_VERSION, sizeof(pcilib_script_view_description_t), NULL, NULL, pcilib_script_view_free_description, pcilib_script_view_read, pcilib_script_view_write};
-- 
cgit v1.2.3