6
* \brief Wraping for vsnprintf function, that saves string to char*
7
* \return saved from vsnprintf string
9
char* vmake_str(const char* msg, va_list vl)
17
sz = vsnprintf(NULL, 0, msg, vl);
18
buf = (char *)malloc(sz + 1);
25
vsnprintf(buf, sz+1, msg, vl_copy);
33
* \brief Wraping for vsnprintf function, that saves string to char*
34
* \return saved from vsnprintf string
36
char* make_str(const char* msg, ...)
40
char *buf = vmake_str(msg, vl);
46
* \brief Version of pcilib_logger_t, that saves error text to Python exeption
48
void pcilib_print_error_to_py(void *arg, const char *file, int line,
49
pcilib_log_priority_t prio, const char *msg,
51
//wrap error message with file and line number
52
char* buf_raw_msg = vmake_str(msg, va);
53
char* buf_wrapped_message = make_str("%s [%s:%d]\n", buf_raw_msg, file, line);
55
if(prio == PCILIB_LOG_ERROR)
58
full_log = make_str("");
60
//copy received message to log
62
full_log = make_str("%s%s", buf, buf_wrapped_message);
66
printf("%s", buf_wrapped_message);
68
free(buf_wrapped_message);
72
void set_python_exception(const char* msg, ...)
76
char *buf = vmake_str(msg, vl);
78
char* wrapped_exeption;
80
wrapped_exeption = make_str("%s\nprogramm error log:\n%s", buf, full_log);
82
wrapped_exeption = buf;
87
PyErr_SetString(PyExc_Exception, wrapped_exeption);
91
free(wrapped_exeption);
96
void __redirect_logs_to_exeption()
98
pcilib_set_logger(pcilib_get_log_level(),
99
pcilib_print_error_to_py,
100
pcilib_get_logger_context());
104
* \brief Wrap for PyDict_SetItem, with decrease reference counting after set.
106
void pcilib_pydict_set_item(PyObject* dict, PyObject* name, PyObject* value)
116
* \brief Wrap for PyList_Append, with decrease reference counting after append.
118
void pcilib_pylist_append(PyObject* list, PyObject* value)
120
PyList_Append(list, value);
124
void add_pcilib_value_to_dict(pcilib_t* ctx, PyObject* dict, pcilib_value_t* val, const char *name)
126
PyObject *py_val = (PyObject*)pcilib_get_value_as_pyobject(ctx, val, NULL);
129
pcilib_pydict_set_item(dict,
130
PyString_FromString(name),
133
pcilib_pydict_set_item(dict,
134
PyString_FromString("defvalue"),
135
PyString_FromString("invalid"));
138
PyObject * pcilib_convert_property_info_to_pyobject(pcilib_t* ctx, pcilib_property_info_t listItem)
140
PyObject* pylistItem = PyDict_New();
143
pcilib_pydict_set_item(pylistItem,
144
PyString_FromString("name"),
145
PyString_FromString(listItem.name));
147
if(listItem.description)
148
pcilib_pydict_set_item(pylistItem,
149
PyString_FromString("description"),
150
PyString_FromString(listItem.description));
153
pcilib_pydict_set_item(pylistItem,
154
PyString_FromString("path"),
155
PyString_FromString(listItem.path));
158
const char* type = "invalid";
159
switch(listItem.type)
161
case PCILIB_TYPE_INVALID:
164
case PCILIB_TYPE_STRING:
167
case PCILIB_TYPE_DOUBLE:
170
case PCILIB_TYPE_LONG :
176
pcilib_pydict_set_item(pylistItem,
177
PyString_FromString("type"),
178
PyString_FromString(type));
182
PyObject* modes = PyList_New(0);
184
if((listItem.mode & PCILIB_ACCESS_R ) == PCILIB_REGISTER_R)
185
pcilib_pylist_append(modes, PyString_FromString("R"));
186
if((listItem.mode & PCILIB_ACCESS_W ) == PCILIB_REGISTER_W)
187
pcilib_pylist_append(modes, PyString_FromString("W"));
188
if((listItem.mode & PCILIB_ACCESS_RW ) == PCILIB_REGISTER_RW)
189
pcilib_pylist_append(modes, PyString_FromString("RW"));
190
if((listItem.mode & PCILIB_REGISTER_INCONSISTENT) == PCILIB_REGISTER_INCONSISTENT)
191
pcilib_pylist_append(modes, PyString_FromString("NO_CHK"));
193
pcilib_pydict_set_item(pylistItem,
194
PyString_FromString("mode"),
198
PyObject* flags = PyList_New(0);
200
if((listItem.flags & PCILIB_LIST_FLAG_CHILDS ) == PCILIB_LIST_FLAG_CHILDS)
201
pcilib_pylist_append(flags, PyString_FromString("childs"));
203
pcilib_pydict_set_item(pylistItem,
204
PyString_FromString("flags"),
208
pcilib_pydict_set_item(pylistItem,
209
PyString_FromString("unit"),
210
PyString_FromString(listItem.unit));
215
PyObject * pcilib_convert_register_info_to_pyobject(pcilib_t* ctx, pcilib_register_info_t listItem)
217
PyObject* pylistItem = PyDict_New();
220
pcilib_pydict_set_item(pylistItem,
221
PyString_FromString("name"),
222
PyString_FromString(listItem.name));
224
if(listItem.description)
225
pcilib_pydict_set_item(pylistItem,
226
PyString_FromString("description"),
227
PyString_FromString(listItem.description));
230
pcilib_pydict_set_item(pylistItem,
231
PyString_FromString("bank"),
232
PyString_FromString(listItem.bank));
235
PyObject* modes = PyList_New(0);
237
if((listItem.mode & PCILIB_REGISTER_R) == PCILIB_REGISTER_R)
238
pcilib_pylist_append(modes, PyString_FromString("R"));
239
if((listItem.mode & PCILIB_REGISTER_W) == PCILIB_REGISTER_W)
240
pcilib_pylist_append(modes, PyString_FromString("W"));
241
if((listItem.mode & PCILIB_REGISTER_RW) == PCILIB_REGISTER_RW)
242
pcilib_pylist_append(modes, PyString_FromString("RW"));
243
if((listItem.mode & PCILIB_REGISTER_W1C) == PCILIB_REGISTER_W1C)
244
pcilib_pylist_append(modes, PyString_FromString("W1C"));
245
if((listItem.mode & PCILIB_REGISTER_RW1C) == PCILIB_REGISTER_RW1C)
246
pcilib_pylist_append(modes, PyString_FromString("RW1C"));
247
if((listItem.mode & PCILIB_REGISTER_W1I) == PCILIB_REGISTER_W1I)
248
pcilib_pylist_append(modes, PyString_FromString("W1I"));
249
if((listItem.mode & PCILIB_REGISTER_RW1I) == PCILIB_REGISTER_RW1I)
250
pcilib_pylist_append(modes, PyString_FromString("RW1I"));
251
if((listItem.mode & PCILIB_REGISTER_INCONSISTENT) == PCILIB_REGISTER_INCONSISTENT)
252
pcilib_pylist_append(modes, PyString_FromString("NO_CHK"));
254
pcilib_pydict_set_item(pylistItem,
255
PyString_FromString("mode"),
258
pcilib_value_t defval = {0};
259
pcilib_set_value_from_register_value(ctx, &defval, listItem.defvalue);
260
add_pcilib_value_to_dict(ctx, pylistItem, &defval, "defvalue");
264
pcilib_value_t minval = {0};
265
pcilib_set_value_from_register_value(ctx, &minval, listItem.range->min);
267
pcilib_value_t maxval = {0};
268
pcilib_set_value_from_register_value(ctx, &maxval, listItem.range->max);
270
PyObject* range = PyDict_New();
271
add_pcilib_value_to_dict(ctx, range, &minval, "min");
272
add_pcilib_value_to_dict(ctx, range, &maxval, "max");
273
pcilib_pydict_set_item(pylistItem,
274
PyString_FromString("range"),
280
PyObject* values = PyList_New(0);
282
for (int j = 0; listItem.values[j].name; j++)
284
PyObject* valuesItem = PyDict_New();
286
pcilib_value_t val = {0};
287
pcilib_set_value_from_register_value(ctx, &val, listItem.values[j].value);
289
pcilib_value_t min = {0};
290
pcilib_set_value_from_register_value(ctx, &min, listItem.values[j].min);
292
pcilib_value_t max = {0};
293
pcilib_set_value_from_register_value(ctx, &max, listItem.values[j].max);
295
add_pcilib_value_to_dict(ctx, valuesItem, &val, "value");
296
add_pcilib_value_to_dict(ctx, valuesItem, &min, "min");
297
add_pcilib_value_to_dict(ctx, valuesItem, &max, "max");
299
if(listItem.values[j].name)
300
pcilib_pydict_set_item(valuesItem,
301
PyString_FromString("name"),
302
PyString_FromString(listItem.values[j].name));
304
if(listItem.values[j].description)
305
pcilib_pydict_set_item(valuesItem,
306
PyString_FromString("name"),
307
PyString_FromString(listItem.values[j].description));
309
pcilib_pylist_append(values, valuesItem);
312
pcilib_pydict_set_item(pylistItem,
313
PyString_FromString("values"),
320
Pcipywrap *new_Pcipywrap(const char* fpga_device, const char* model)
323
pcilib_t* ctx = pcilib_open(fpga_device, model);
326
set_python_exception("Failed pcilib_open(%s, %s)", fpga_device, model);
330
self = (Pcipywrap *) malloc(sizeof(Pcipywrap));
336
Pcipywrap *create_Pcipywrap(PyObject* ctx)
338
if(!PyCObject_Check(ctx))
340
set_python_exception("Incorrect ctx type. Only PyCObject is allowed");
345
self = (Pcipywrap *) malloc(sizeof(Pcipywrap));
347
self->ctx = PyCObject_AsVoidPtr(ctx);
351
void delete_Pcipywrap(Pcipywrap *self) {
353
pcilib_close(self->ctx);
358
PyObject* Pcipywrap_read_register(Pcipywrap *self, const char *regname, const char *bank)
360
pcilib_value_t val = {0};
361
pcilib_register_value_t reg_value;
365
err = pcilib_read_register(self->ctx, bank, regname, ®_value);
368
set_python_exception("Failed pcilib_read_register");
372
err = pcilib_set_value_from_register_value(self->ctx, &val, reg_value);
375
set_python_exception("Failed pcilib_set_value_from_register_value");
379
return pcilib_get_value_as_pyobject(self->ctx, &val, NULL);
382
PyObject* Pcipywrap_write_register(Pcipywrap *self, PyObject* val, const char *regname, const char *bank)
384
pcilib_value_t val_internal = {0};
385
pcilib_register_value_t reg_value;
389
err = pcilib_set_value_from_pyobject(self->ctx, &val_internal, val);
393
set_python_exception("Failed pcilib_set_value_from_pyobject");
398
reg_value = pcilib_get_value_as_register_value(self->ctx, &val_internal, &err);
401
set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err);
405
err = pcilib_write_register(self->ctx, bank, regname, reg_value);
409
set_python_exception("Failed pcilib_set_value_from_pyobject, (error %i)", err);
413
return PyInt_FromLong((long)1);
416
PyObject* Pcipywrap_get_property(Pcipywrap *self, const char *prop)
419
pcilib_value_t val = {0};
421
err = pcilib_get_property(self->ctx, prop, &val);
425
set_python_exception("Failed pcilib_get_property, (error %i)", err);
429
return pcilib_get_value_as_pyobject(self->ctx, &val, NULL);
432
PyObject* Pcipywrap_set_property(Pcipywrap *self, PyObject* val, const char *prop)
436
pcilib_value_t val_internal = {0};
437
err = pcilib_set_value_from_pyobject(self->ctx, &val_internal, val);
440
set_python_exception("pcilib_set_value_from_pyobject, (error %i)", err);
444
err = pcilib_set_property(self->ctx, prop, &val_internal);
447
set_python_exception("pcilib_set_property, (error %i)", err);
451
return PyInt_FromLong((long)1);
454
PyObject* Pcipywrap_get_registers_list(Pcipywrap *self, const char *bank)
456
pcilib_register_info_t *list = pcilib_get_register_list(self->ctx, bank, PCILIB_LIST_FLAGS_DEFAULT);
458
PyObject* pyList = PyList_New(0);
459
for(int i = 0; i < ((pcilib_t*)self->ctx)->num_reg; i++)
461
//serialize item attributes
462
PyObject* pylistItem = pcilib_convert_register_info_to_pyobject(self->ctx, list[i]);
463
pcilib_pylist_append(pyList, pylistItem);
466
pcilib_free_register_info(self->ctx, list);
471
PyObject* Pcipywrap_get_register_info(Pcipywrap *self, const char* reg,const char *bank)
473
pcilib_register_info_t *info = pcilib_get_register_info(self->ctx, bank, reg, PCILIB_LIST_FLAGS_DEFAULT);
480
PyObject* py_info = pcilib_convert_register_info_to_pyobject(self->ctx, info[0]);
482
pcilib_free_register_info(self->ctx, info);
487
PyObject* Pcipywrap_get_property_list(Pcipywrap *self, const char* branch)
489
pcilib_property_info_t *list = pcilib_get_property_list(self->ctx, branch, PCILIB_LIST_FLAGS_DEFAULT);
491
PyObject* pyList = PyList_New(0);
493
for(int i = 0; list[i].path; i++)
495
//serialize item attributes
496
PyObject* pylistItem = pcilib_convert_property_info_to_pyobject(self->ctx, list[i]);
497
pcilib_pylist_append(pyList, pylistItem);
500
pcilib_free_property_info(self->ctx, list);