summaryrefslogtreecommitdiffstats
path: root/pywrap
diff options
context:
space:
mode:
authorVasilii Chernov <vchernov@inr.ru>2016-02-12 14:43:20 +0100
committerVasilii Chernov <vchernov@inr.ru>2016-02-12 14:43:20 +0100
commit55eab7196d0104c71e40136b3b22e9501d234e17 (patch)
treeb0fbfd40812e39cde3e5ef7a5ebddfc384102c24 /pywrap
parentd7fc669bf0dbe37f46d2efec4940feb8504017c2 (diff)
downloadpcitool-55eab7196d0104c71e40136b3b22e9501d234e17.tar.gz
pcitool-55eab7196d0104c71e40136b3b22e9501d234e17.tar.bz2
pcitool-55eab7196d0104c71e40136b3b22e9501d234e17.tar.xz
pcitool-55eab7196d0104c71e40136b3b22e9501d234e17.zip
1. Cmakelists - move copy xml folder command to root file
2. - Move set python paths code to python module init funtction - pci.c move python module init block code after checking model to get paths before it runs. - Fix set python path code to work with PYTHONPATH - Update pci run script to work with PYTHONPATH - Fix python finalize code 3. Change pcilib_script_s interacting method. Now it stores in hash. 4. Change names of some fucntions to more unified ones 5. Remove old unused function pcilib_xml_create_script_or_transform_view 6. cli - disable reading register after set if write_verification flag is off 7. Remove uninformative error messages fro Python wrap. 8. - Server.py - add read/write property/register command handling - Add help message - Correcting paths
Diffstat (limited to 'pywrap')
-rw-r--r--pywrap/pcipywrap.c50
-rw-r--r--pywrap/pcipywrap.i10
-rw-r--r--pywrap/server.py230
3 files changed, 233 insertions, 57 deletions
diff --git a/pywrap/pcipywrap.c b/pywrap/pcipywrap.c
index c5164a8..fc0add1 100644
--- a/pywrap/pcipywrap.c
+++ b/pywrap/pcipywrap.c
@@ -4,7 +4,7 @@
/*!
* \brief Global pointer to pcilib_t context.
- * Used by setPcilib and read_register.
+ * Used by set_pcilib and read_register.
*/
pcilib_t* __ctx = 0;
@@ -68,6 +68,7 @@ void pcilib_print_error_to_py(void *arg, const char *file, int line,
*/
void init_pcipywrap_module()
{
+ printf("init_pcipywrap_module\n");
pcilib_set_logger(pcilib_get_logger_min_prio(),
pcilib_print_error_to_py,
pcilib_get_logger_argument());
@@ -79,7 +80,7 @@ void init_pcipywrap_module()
* \param[in] model specifies the model of hardware, autodetected if NULL is passed
* \return Pointer to pcilib_t, created by pcilib_open, serialized to bytearray; NULL with exeption text, if failed.
*/
-PyObject* createPcilibInstance(const char *fpga_device, const char *model)
+PyObject* create_pcilib_instance(const char *fpga_device, const char *model)
{
//opening device
pcilib_t* ctx = pcilib_open(fpga_device, model);
@@ -93,7 +94,7 @@ PyObject* createPcilibInstance(const char *fpga_device, const char *model)
/*!
* \brief Closes current pciliv instance, if its open.
*/
-void closeCurrentPcilibInstance()
+void close_curr_pcilib_instance()
{
if(__ctx)
{
@@ -106,7 +107,7 @@ void closeCurrentPcilibInstance()
* \brief Returns current opened pcilib_t instatnce
* \return Pointer to pcilib_t, serialized to bytearray
*/
-PyObject* getCurrentPcilibInstance()
+PyObject* get_curr_pcilib_instance()
{
return PyByteArray_FromStringAndSize((const char*)&__ctx, sizeof(pcilib_t*));
}
@@ -116,7 +117,7 @@ PyObject* getCurrentPcilibInstance()
* \param[in] addr Pointer to pcilib_t, serialized to bytearray
* \return 1, serialized to PyObject or NULL with exeption text, if failed.
*/
-PyObject* setPcilib(PyObject* addr)
+PyObject* set_pcilib(PyObject* addr)
{
if(!PyByteArray_Check(addr))
{
@@ -156,19 +157,13 @@ PyObject* read_register(const char *regname, const char *bank)
err = pcilib_read_register(__ctx, bank, regname, &reg_value);
if(err)
- {
- pcilib_error("Failed: pcilib_read_register (%i)", err);
return NULL;
- }
err = pcilib_set_value_from_register_value(__ctx, &val, reg_value);
if(err)
- {
- pcilib_error("Failed: pcilib_set_value_from_register_value (%i)", err);
return NULL;
- }
- return pcilib_convert_val_to_pyobject(__ctx, &val);
+ return pcilib_get_value_as_pyobject(__ctx, &val);
}
/*!
@@ -190,26 +185,17 @@ PyObject* write_register(PyObject* val, const char *regname, const char *bank)
pcilib_register_value_t reg_value;
int err;
- err = pcilib_convert_pyobject_to_val(__ctx, val, &val_internal);
+ err = pcilib_set_value_from_pyobject(__ctx, val, &val_internal);
if(err)
- {
- pcilib_error("Failed pcilib_convert_pyobject_to_val (%i)", err);
return NULL;
- }
reg_value = pcilib_get_value_as_register_value(__ctx, &val_internal, &err);
if(err)
- {
- pcilib_error("Failed: pcilib_get_value_as_register_value (%i)", err);
return NULL;
- }
err = pcilib_write_register(__ctx, bank, regname, reg_value);
if(err)
- {
- pcilib_error("Failed: pcilib_write_register (%i)", err);
return NULL;
- }
return PyInt_FromLong((long)1);
}
@@ -232,12 +218,9 @@ PyObject* get_property(const char *prop)
err = pcilib_get_property(__ctx, prop, &val);
if(err)
- {
- pcilib_error("Failed pcilib_get_property (%i)", err);
- return NULL;
- }
+ return NULL;
- return pcilib_convert_val_to_pyobject(__ctx, &val);
+ return pcilib_get_value_as_pyobject(__ctx, &val);
}
/*!
@@ -246,7 +229,7 @@ PyObject* get_property(const char *prop)
* \param[in] val Property value, that needs to be set. Can be int, float or string.
* \return 1, serialized to PyObject or NULL with exeption text, if failed.
*/
-PyObject* set_property(const char *prop, PyObject* val)
+PyObject* set_property(PyObject* val, const char *prop)
{
int err;
@@ -257,27 +240,21 @@ PyObject* set_property(const char *prop, PyObject* val)
}
pcilib_value_t val_internal = {0};
- err = pcilib_convert_pyobject_to_val(__ctx, val, &val_internal);
+ err = pcilib_set_value_from_pyobject(__ctx, val, &val_internal);
if(err)
- {
- pcilib_error("Failed pcilib_convert_pyobject_to_val (%i)", err);
return NULL;
- }
err = pcilib_set_property(__ctx, prop, &val_internal);
if(err)
- {
- pcilib_error("Failed pcilib_get_property (%i)", err);
return NULL;
- }
return PyInt_FromLong((long)1);
}
void add_pcilib_value_to_dict(PyObject* dict, pcilib_value_t* val, const char *name)
{
- PyObject *py_val = (PyObject*)pcilib_convert_val_to_pyobject(__ctx, val);
+ PyObject *py_val = (PyObject*)pcilib_get_value_as_pyobject(__ctx, val);
if(py_val)
PyDict_SetItem(dict,
@@ -506,7 +483,6 @@ PyObject* get_register_info(const char* reg,const char *bank)
if(!info)
{
- pcilib_error("Failed pcilib_get_register_info");
return NULL;
}
diff --git a/pywrap/pcipywrap.i b/pywrap/pcipywrap.i
index 3ff23a9..95045f3 100644
--- a/pywrap/pcipywrap.i
+++ b/pywrap/pcipywrap.i
@@ -4,16 +4,16 @@
init_pcipywrap_module();
%}
-extern PyObject* createPcilibInstance(const char *fpga_device, const char *model = NULL);
-extern PyObject* setPcilib(PyObject* addr);
-extern void closeCurrentPcilibInstance();
-extern PyObject* getCurrentPcilibInstance();
+extern PyObject* create_pcilib_instance(const char *fpga_device, const char *model = NULL);
+extern PyObject* set_pcilib(PyObject* addr);
+extern void close_curr_pcilib_instance();
+extern PyObject* get_curr_pcilib_instance();
extern PyObject* read_register(const char *regname, const char *bank = NULL);
extern PyObject* write_register(PyObject* val, const char *regname, const char *bank = NULL);
extern PyObject* get_property(const char *prop);
-extern PyObject* set_property(const char *prop, PyObject* val);
+extern PyObject* set_property(PyObject* val, const char *prop);
extern PyObject* get_registers_list(const char *bank = NULL);
extern PyObject* get_register_info(const char* reg,const char *bank = NULL);
diff --git a/pywrap/server.py b/pywrap/server.py
index d308867..0da6bc8 100644
--- a/pywrap/server.py
+++ b/pywrap/server.py
@@ -1,8 +1,10 @@
import time
-import os #delete later
+import os
import pcipywrap
import json
import BaseHTTPServer
+import sys
+import getopt
class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
@@ -70,8 +72,8 @@ class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
out['registers'] = registers
s.wrapMessageAndSend(out, data)
- elif(command == 'get_register_info'):
- #check required arguments
+ elif(command == 'get_register_info'):
+ #check required arguments
if not 'reg' in data:
s.error('message doesnt contains "reg" field, '
'which is required for "get_register_info" command', data)
@@ -81,7 +83,7 @@ class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
reg = str(data.get('reg', None))
bank = data.get('bank', None)
if not bank is None:
- bank = str(bank)
+ bank = str(bank)
register = dict()
try:
@@ -120,6 +122,125 @@ class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
out['status'] = 'ok'
out['properties'] = properties
s.wrapMessageAndSend(out, data)
+
+ elif(command == 'read_register'):
+ #check required arguments
+ if not 'reg' in data:
+ s.error('message doesnt contains "reg" field, '
+ 'which is required for "read_register" command', data)
+ return
+
+ #parse command arguments and convert them to string
+ reg = str(data.get('reg', None))
+ bank = data.get('bank', None)
+ if not bank is None:
+ bank = str(bank)
+
+ value = 0
+ try:
+ value = pcipywrap.read_register(reg, bank)
+ except Exception as e:
+ s.error(str(e), data)
+ return
+
+ #Success! Create and send reply
+ s.send_response(200)
+ s.send_header('content-type', 'application/json')
+ s.end_headers()
+ out = dict()
+ out['status'] = 'ok'
+ out['value'] = value
+ s.wrapMessageAndSend(out, data)
+
+ elif(command == 'write_register'):
+ #check required arguments
+ if not 'reg' in data:
+ s.error('message doesnt contains "reg" field, '
+ 'which is required for "write_register" command', data)
+ return
+
+ if not 'value' in data:
+ s.error('message doesnt contains "value" field, '
+ 'which is required for "write_register" command', data)
+ return
+
+ #parse command arguments and convert them to string
+ reg = str(data.get('reg', None))
+ value = str(data.get('value', None))
+ bank = data.get('bank', None)
+ if not bank is None:
+ bank = str(bank)
+
+ try:
+ pcipywrap.write_register(value, reg, bank)
+ except Exception as e:
+ s.error(str(e), data)
+ return
+
+ #Success! Create and send reply
+ s.send_response(200)
+ s.send_header('content-type', 'application/json')
+ s.end_headers()
+ out = dict()
+ out['status'] = 'ok'
+ s.wrapMessageAndSend(out, data)
+
+ elif(command == 'get_property'):
+ #check required arguments
+ if not 'prop' in data:
+ s.error('message doesnt contains "prop" field, '
+ 'which is required for "get_property" command', data)
+ return
+
+ #parse command arguments and convert them to string
+ prop = str(data.get('prop', None))
+
+ value = 0
+ try:
+ value = pcipywrap.get_property(prop)
+ except Exception as e:
+ s.error(str(e), data)
+ return
+
+ #Success! Create and send reply
+ s.send_response(200)
+ s.send_header('content-type', 'application/json')
+ s.end_headers()
+ out = dict()
+ out['status'] = 'ok'
+ out['value'] = value
+ s.wrapMessageAndSend(out, data)
+
+ elif(command == 'set_property'):
+ #check required arguments
+ if not 'prop' in data:
+ s.error('message doesnt contains "prop" field, '
+ 'which is required for "set_property" command', data)
+ return
+
+ if not 'value' in data:
+ s.error('message doesnt contains "value" field, '
+ 'which is required for "set_property" command', data)
+ return
+
+ #parse command arguments and convert them to string
+ prop = str(data.get('prop', None))
+ value = str(data.get('value', None))
+
+ try:
+ pcipywrap.set_property(value, prop)
+ except Exception as e:
+ s.error(str(e), data)
+ return
+
+ #Success! Create and send reply
+ s.send_response(200)
+ s.send_header('content-type', 'application/json')
+ s.end_headers()
+ out = dict()
+ out['status'] = 'ok'
+ s.wrapMessageAndSend(out, data)
+
else:
s.error('command "' + command + '" undefined', data)
@@ -134,19 +255,78 @@ class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
"""open device context """
def openPcilibInstance(s, device, model):
- pcipywrap.closeCurrentPcilibInstance()
+ pcipywrap.close_curr_pcilib_instance()
- lib = pcipywrap.createPcilibInstance(device, model)
- pcipywrap.setPcilib(lib)
+ lib = pcipywrap.create_pcilib_instance(device, model)
+ pcipywrap.set_pcilib(lib)
"""Send help message"""
def help(s, received_message = None):
s.send_response(200)
s.send_header('content-type', 'application/json')
s.end_headers()
- out = {'status': 'ok', 'help' : 'under construction'}
+ usage = str('Usage:\n'
+ ' Server receive commands via http GET with json packet.\n'
+ ' content-type should have value "application/json"\n'
+ ' Server could handle only commands. to set command, you\n'
+ ' should specify field "command" in packet with command name\n'
+ ' List of commands:\n'
+ '\n'
+ ' command: help - Get help. This will return usage\n'
+ '\n'
+
+ ' command: open - Opens context of device. It will be reopened if already open.\n'
+ ' required fields\n'
+ ' device: - path to the device file [/dev/fpga0]\n'
+ ' optional fields\n'
+ ' model: - specifies the model of hardware, autodetected if doesnt exists\n'
+ '\n'
+
+ ' command: get_registers_list - Returns the list of registers provided by the hardware model.\n'
+ ' optional fields\n'
+ ' bank: - if set, only register within the specified bank will be returned\n'
+ '\n'
+
+ ' command: get_register_info - Returns the information about the specified register.\n'
+ ' required fields\n'
+ ' reg: - the name of the register\n'
+ ' optional fields\n'
+ ' bank: - if set, only register within the specified bank will be returned\n'
+ '\n'
+
+ ' command: get_property_info - Returns the list of properties available under the specified path.\n'
+ ' optional fields\n'
+ ' branch: - Path. If not set, will return the top-level properties\n'
+ '\n'
+
+ ' command: read_register - Reads the specified register.\n'
+ ' required fields\n'
+ ' reg: - the name of the register\n'
+ ' optional fields\n'
+ ' bank: - if set, only register within the specified bank will be processed\n'
+ '\n'
+
+ ' command: write_register - Writes to specified register.\n'
+ ' required fields\n'
+ ' reg: - the name of the register\n'
+ ' value: - the register value to write. Should be int, float or string (with number)\n'
+ ' optional fields\n'
+ ' bank: - if set, only register within the specified bank will be processed\n'
+ '\n'
+
+ ' command: get_property - Reads / computes the property value.\n'
+ ' required fields\n'
+ ' prop: - full name including path\n'
+ '\n'
+
+ ' command: set_property - Writes the property value or executes the code associated with property.\n'
+ ' required fields\n'
+ ' prop: - full name including path\n'
+ ' value: - the property value to write. Should be int, float or string (with number)\n'
+ '\n')
+ out = {'status': 'ok', 'usage' : usage}
s.wrapMessageAndSend(out, received_message)
-
+
"""Send error message with text description"""
def error(s, info, received_message = None):
s.send_response(400)
@@ -164,14 +344,34 @@ class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
message['received_message'] = received_message
s.wfile.write(json.dumps(message))
-HOST_NAME = '' # !!!REMEMBER TO CHANGE THIS!!!
-PORT_NUMBER = 12412 # Maybe set this to 9000.
if __name__ == '__main__':
- #initialize variables test (to remove)
- os.environ["APP_PATH"] = '/home/vchernov/1215N/pcitool'
- os.environ["PCILIB_MODEL_DIR"] = os.environ["APP_PATH"] + "/xml"
- os.environ["LD_LIBRARY_PATH"] = os.environ["APP_PATH"] + "/pcilib"
+
+ HOST_NAME = '' # !!!REMEMBER TO CHANGE THIS!!!
+ PORT_NUMBER = 12412 # Maybe set this to 9000.
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "", [])
+ #opts, args = getopt.getopt(sys.argv[1:], "hop:v", ["help", "output="])
+ #print opts, args
+ except getopt.GetoptError as err:
+ # print help information and exit:
+ print str(err) # will print something like "option -a not recognized"
+ #usage()
+ sys.exit(2)
+
+ #Set enviroment variables, if it not setted already
+ if not 'APP_PATH' in os.environ:
+ APP_PATH = ''
+ file_dir = os.path.dirname(os.path.abspath(__file__))
+ APP_PATH = str(os.path.abspath(file_dir + '/../..'))
+ os.environ["APP_PATH"] = APP_PATH
+
+ if not 'PCILIB_MODEL_DIR' in os.environ:
+ os.environ['PCILIB_MODEL_DIR'] = os.environ["APP_PATH"] + "/xml"
+
+ if not 'LD_LIBRARY_PATH' in os.environ:
+ os.environ['LD_LIBRARY_PATH'] = os.environ["APP_PATH"] + "/pcilib"
pcilib_server = BaseHTTPServer.HTTPServer
httpd = pcilib_server((HOST_NAME, PORT_NUMBER), PcilibServerHandler)