summaryrefslogtreecommitdiffstats
path: root/pywrap/server.py
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/server.py
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/server.py')
-rw-r--r--pywrap/server.py230
1 files changed, 215 insertions, 15 deletions
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)