1
#define _PCILIB_VIEW_TRANSFORM_C
13
static int pcilib_script_view_module_init(pcilib_t *ctx, pcilib_script_view_description_t *v)
17
//Initialize python script, if it has not initialized already.
18
if(!v->py_script_module)
22
pcilib_error("Invalid script name specified in XML property (NULL)");
23
return PCILIB_ERROR_INVALID_DATA;
26
//create path string to scripts
27
char* model_dir = getenv("PCILIB_MODEL_DIR");
28
char* model_path = malloc(strlen(model_dir) + strlen(ctx->model) + 2);
29
if (!model_path) return PCILIB_ERROR_MEMORY;
30
sprintf(model_path, "%s/%s", model_dir, ctx->model);
32
//set model path to python
33
PySys_SetPath(model_path);
37
//create path string to pcipywrap library
38
char* app_dir = getenv("APP_PATH");
42
pcipywrap_path = malloc(strlen(app_dir) + strlen("/pcilib"));
43
if (!pcipywrap_path) return PCILIB_ERROR_MEMORY;
44
sprintf(pcipywrap_path, "%s/%s", "/pcilib", ctx->model);
48
pcipywrap_path = malloc(strlen("./pcilib"));
49
if (!pcipywrap_path) return PCILIB_ERROR_MEMORY;
50
sprintf(pcipywrap_path, "%s", "./pcilib");
54
//set pcipywrap library path to python
55
PyObject* path = PySys_GetObject("path");
56
if(PyList_Append(path, PyString_FromString(pcipywrap_path)) == -1)
58
pcilib_error("Cant set pcipywrap library path to python.");
59
return PCILIB_ERROR_FAILED;
62
pcipywrap_path = NULL;
65
//extract module name from script name
66
char* py_module_name = strtok(v->script_name, ".");
70
pcilib_error("Invalid script name specified in XML property (%s)."
71
" Seems like name doesnt contains extension", v->script_name);
72
return PCILIB_ERROR_INVALID_DATA;
75
//import python script
76
v->py_script_module = PyImport_ImportModule(py_module_name);
78
if(!v->py_script_module)
80
printf("Error in import python module: ");
82
return PCILIB_ERROR_INVALID_DATA;
86
//Initializing pcipywrap module if script use it
87
PyObject* dict = PyModule_GetDict(v->py_script_module);
88
if(PyDict_Contains(dict, PyString_FromString("pcipywrap")))
90
PyObject* pcipywrap_module = PyDict_GetItemString(dict, "pcipywrap");
93
pcilib_error("Cant extract pcipywrap module from script dictionary");
94
return PCILIB_ERROR_FAILED;
97
//setting pcilib_t instance
98
PyObject_CallMethodObjArgs(pcipywrap_module,
99
PyUnicode_FromString("__setPcilib"),
100
PyByteArray_FromStringAndSize((const char*)&ctx, sizeof(pcilib_t*)),
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);
118
PyObject *ret = PyObject_CallMethod(v->py_script_module, "read_from_register", "()");
121
printf("Python script error: ");
123
return PCILIB_ERROR_FAILED;
126
err = pcilib_convert_pyobject_to_val(ctx, ret, val);
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);
188
void pcilib_script_view_free_description (pcilib_t *ctx, pcilib_view_description_t *view)
190
pcilib_script_view_description_t *v = (pcilib_script_view_description_t*)(view);
194
free(v->script_name);
195
v->script_name = NULL;
198
if(v->py_script_module)
200
PyObject_Free(v->py_script_module);
201
v->py_script_module = NULL;
205
const pcilib_view_api_description_t pcilib_script_view_api =
206
{ PCILIB_VERSION, sizeof(pcilib_script_view_description_t), NULL, NULL, pcilib_script_view_free_description, pcilib_script_view_read, pcilib_script_view_write};