summaryrefslogtreecommitdiffstats
path: root/pywrap/pcipywrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'pywrap/pcipywrap.c')
-rw-r--r--pywrap/pcipywrap.c327
1 files changed, 122 insertions, 205 deletions
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;
-}