10
11
#include "script.h"
12
static int pcilib_script_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t regval, pcilib_value_t *val) {
13
static int pcilib_script_view_module_init(pcilib_t *ctx, pcilib_script_view_description_t *v)
16
const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
17
pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(model_info->views[view_ctx->view]);
19
17
//Initialize python script, if it has not initialized already.
20
18
if(!v->py_script_module)
107
static int pcilib_script_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t regval, pcilib_value_t *val) {
111
const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
112
pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(model_info->views[view_ctx->view]);
114
err = pcilib_script_view_module_init(ctx, v);
107
118
PyObject *ret = PyObject_CallMethod(v->py_script_module, "read_from_register", "()");
112
123
return PCILIB_ERROR_FAILED;
117
err = pcilib_set_value_from_int(ctx, val, PyInt_AsLong(ret));
120
if(PyFloat_Check(ret))
121
err = pcilib_set_value_from_float(ctx, val, PyFloat_AsDouble(ret));
123
if(PyString_Check(ret))
124
err = pcilib_set_value_from_static_string(ctx, val, PyString_AsString(ret));
127
pcilib_error("Invalid return type in read_from_register() method. Return type should be int, float or string.");
128
return PCILIB_ERROR_NOTSUPPORTED;
126
err = pcilib_convert_pyobject_to_val(ctx, ret, val);
132
130
pcilib_error("Failed to convert python script return value to internal type: %i", err);
136
static int pcilib_script_view_write(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t *regval, pcilib_value_t *val) {
140
const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
141
pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(model_info->views[view_ctx->view]);
143
err = pcilib_script_view_module_init(ctx, v);
147
PyObject *input = pcilib_convert_val_to_pyobject(ctx, val, printf);
150
printf("Failed to convert input value to Python object");
152
return PCILIB_ERROR_FAILED;
155
PyObject *ret = PyObject_CallMethodObjArgs(v->py_script_module,
156
PyUnicode_FromString("write_to_register"),
161
printf("Python script error: ");
163
return PCILIB_ERROR_FAILED;
166
//convert output value back to pcilib_value_t
167
//no need because it wont be used later, and the script return could be none
169
err = pcilib_convert_pyobject_to_val(ctx, ret, val);
172
pcilib_error("failed to convert script write_to_register function return value to internal type: %i", err);
176
uint64_t output = pcilib_get_value_as_register_value(ctx, val, &err);
179
pcilib_error("failed to convert value to register value (%i)", err);
139
188
void pcilib_script_view_free_description (pcilib_t *ctx, pcilib_view_description_t *view)
141
190
pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(view);
156
205
const pcilib_view_api_description_t pcilib_script_view_api =
157
{ PCILIB_VERSION, sizeof(pcilib_script_view_description_t), NULL, NULL, pcilib_script_view_free_description, pcilib_script_view_read, NULL};
206
{ PCILIB_VERSION, sizeof(pcilib_script_view_description_t), NULL, NULL, pcilib_script_view_free_description, pcilib_script_view_read, pcilib_script_view_write};