summaryrefslogtreecommitdiffstats
path: root/pywrap/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'pywrap/server.py')
-rw-r--r--pywrap/server.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/pywrap/server.py b/pywrap/server.py
new file mode 100644
index 0000000..d308867
--- /dev/null
+++ b/pywrap/server.py
@@ -0,0 +1,184 @@
+import time
+import os #delete later
+import pcipywrap
+import json
+import BaseHTTPServer
+
+class PcilibServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
+
+ def do_HEAD(s):
+ s.send_response(200)
+ s.send_header('content-type', 'application/json')
+ s.end_headers()
+
+ def do_GET(s):
+ length = int(s.headers['Content-Length'])
+
+ #deserialize input data
+ data = json.loads(s.rfile.read(length).decode('utf-8'))
+
+ if 'command' in data:
+ command = data['command']
+ if(command == 'help'):
+ s.help(data)
+
+ elif(command == 'open'):
+ #check required arguments
+ if not 'device' in data:
+ s.error('message doesnt contains "device" field, '
+ 'which is required for "open" command', data)
+ return
+ #parse command arguments and convert them to string
+ device = str(data.get('device', None))
+ model = data.get('model', None)
+ if not model is None:
+ model = str(model)
+
+ try:
+ s.openPcilibInstance(device, model)
+ 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_registers_list'):
+ #parse command arguments and convert them to string
+ bank = data.get('bank', None)
+ if not bank is None:
+ bank = str(bank)
+
+ registers = dict()
+ try:
+ registers = pcipywrap.get_registers_list(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['registers'] = registers
+ s.wrapMessageAndSend(out, data)
+
+ 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)
+ 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)
+
+ register = dict()
+ try:
+ register = pcipywrap.get_register_info(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['register'] = register
+ s.wrapMessageAndSend(out, data)
+
+ elif(command == 'get_property_info'):
+ #parse command arguments and convert them to string
+ branch = data.get('branch', None)
+ if not branch is None:
+ branch = str(bank)
+
+ properties = dict()
+ try:
+ properties = pcipywrap.get_property_info(branch)
+ 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['properties'] = properties
+ s.wrapMessageAndSend(out, data)
+
+ else:
+ s.error('command "' + command + '" undefined', data)
+ return
+ else:
+ s.error('message doesnt contains "command" field, which is required', data)
+ return
+
+
+ #print str(s.headers['content-type'])
+ #print post_data['some']
+
+ """open device context """
+ def openPcilibInstance(s, device, model):
+ pcipywrap.closeCurrentPcilibInstance()
+
+ lib = pcipywrap.createPcilibInstance(device, model)
+ pcipywrap.setPcilib(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'}
+ s.wrapMessageAndSend(out, received_message)
+
+ """Send error message with text description"""
+ def error(s, info, received_message = None):
+ s.send_response(400)
+ s.send_header('content-type', 'application/json')
+ s.end_headers()
+ out = dict()
+
+ out['status'] = 'error'
+ out['description'] = info
+ out['note'] = 'send {"command" : "help"} to get help'
+ s.wrapMessageAndSend(out, received_message)
+
+ def wrapMessageAndSend(s, message, received_message = None):
+ if not received_message is None:
+ 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"
+
+ pcilib_server = BaseHTTPServer.HTTPServer
+ httpd = pcilib_server((HOST_NAME, PORT_NUMBER), PcilibServerHandler)
+ print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
+ try:
+ httpd.serve_forever()
+ except KeyboardInterrupt:
+ pass
+ httpd.server_close()
+ print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)