189
195
pcilib_debug(VIEWS, "Evaluating a Python string \'%s\' to %lf=\'%s\'", codestr, PyFloat_AsDouble(obj), code);
190
196
return pcilib_set_value_from_float(ctx, value, PyFloat_AsDouble(obj));
200
int pcilib_init_py_script(pcilib_t *ctx, char* module_name, pcilib_script_t **module, pcilib_access_mode_t *mode)
204
//Initialize python script, if it has not initialized already.
207
pcilib_error("Invalid script name specified in XML property (NULL)");
208
return PCILIB_ERROR_INVALID_DATA;
211
//create path string to scripts
212
char* model_dir = getenv("PCILIB_MODEL_DIR");
213
char* model_path = malloc(strlen(model_dir) + strlen(ctx->model) + 2);
214
if (!model_path) return PCILIB_ERROR_MEMORY;
215
sprintf(model_path, "%s/%s", model_dir, ctx->model);
217
//set model path to python
218
PySys_SetPath(model_path);
222
//create path string to pcipywrap library
223
char* app_dir = getenv("APP_PATH");
224
char* pcipywrap_path;
227
pcipywrap_path = malloc(strlen(app_dir) + strlen("/pcilib"));
228
if (!pcipywrap_path) return PCILIB_ERROR_MEMORY;
229
sprintf(pcipywrap_path, "%s/%s", "/pcilib", ctx->model);
233
pcipywrap_path = malloc(strlen("./pcilib"));
234
if (!pcipywrap_path) return PCILIB_ERROR_MEMORY;
235
sprintf(pcipywrap_path, "%s", "./pcilib");
239
//set pcipywrap library path to python
240
PyObject* path = PySys_GetObject("path");
241
if(PyList_Append(path, PyString_FromString(pcipywrap_path)) == -1)
243
pcilib_error("Cant set pcipywrap library path to python.");
244
return PCILIB_ERROR_FAILED;
246
free(pcipywrap_path);
247
pcipywrap_path = NULL;
250
//extract module name from script name
251
char* py_module_name = strtok(module_name, ".");
255
pcilib_error("Invalid script name specified in XML property (%s)."
256
" Seems like name doesnt contains extension", module_name);
257
return PCILIB_ERROR_INVALID_DATA;
260
//import python script
261
PyObject* py_script_module = PyImport_ImportModule(py_module_name);
263
if(!py_script_module)
265
printf("Error in import python module: ");
267
return PCILIB_ERROR_INVALID_DATA;
271
//Initializing pcipywrap module if script use it
272
PyObject* dict = PyModule_GetDict(py_script_module);
273
if(PyDict_Contains(dict, PyString_FromString("pcipywrap")))
275
PyObject* pcipywrap_module = PyDict_GetItemString(dict, "pcipywrap");
276
if(!pcipywrap_module)
278
pcilib_error("Cant extract pcipywrap module from script dictionary");
279
return PCILIB_ERROR_FAILED;
282
//setting pcilib_t instance
283
PyObject_CallMethodObjArgs(pcipywrap_module,
284
PyUnicode_FromString("setPcilib"),
285
PyByteArray_FromStringAndSize((const char*)&ctx, sizeof(pcilib_t*)),
289
//Success. Create struct and initialize values
290
module[0] = (pcilib_script_t*)malloc(sizeof(pcilib_script_t));
291
module[0]->py_script_module = py_script_module;
292
module[0]->script_name = module_name;
293
module[0]->dict = dict;
295
//Setting correct mode
297
if(PyDict_Contains(dict, PyString_FromString("read_from_register")))
298
mode[0] |= PCILIB_ACCESS_R;
299
if(PyDict_Contains(dict, PyString_FromString("write_to_register")))
300
mode[0] |= PCILIB_ACCESS_W;
305
int pcilib_free_py_script(pcilib_script_t *module)
309
if(module->script_name)
311
free(module->script_name);
312
module->script_name = NULL;
315
if(module->py_script_module)
317
//PyObject_Free(module->py_script_module);
318
module->py_script_module = NULL;
323
int pcilib_script_read(pcilib_t *ctx, pcilib_script_t *module, pcilib_value_t *val)
328
PyObject *ret = PyObject_CallMethod(module->py_script_module, "read_from_register", "()");
331
printf("Python script error: ");
333
return PCILIB_ERROR_FAILED;
336
err = pcilib_convert_pyobject_to_val(ctx, ret, val);
340
pcilib_error("Failed to convert python script return value to internal type: %i", err);
346
int pcilib_script_write(pcilib_t *ctx, pcilib_script_t *module, pcilib_value_t *val)
350
PyObject *input = pcilib_convert_val_to_pyobject(ctx, val, printf);
353
printf("Failed to convert input value to Python object");
355
return PCILIB_ERROR_FAILED;
358
PyObject *ret = PyObject_CallMethodObjArgs(module->py_script_module,
359
PyUnicode_FromString("write_to_register"),
364
printf("Python script error: ");
366
return PCILIB_ERROR_FAILED;